diff options
author | Glenn Morris <rgm@gnu.org> | 2007-09-06 04:25:08 +0000 |
---|---|---|
committer | Glenn Morris <rgm@gnu.org> | 2007-09-06 04:25:08 +0000 |
commit | b8d4c8d0e9326f8ed2d1f6fc0a38fb89ec29ed27 (patch) | |
tree | 35344b3af55b9a142f03e1a3600dd162fb8c55cc | |
parent | f69340d750ef530bcc3497243ab3be3187f8ce6e (diff) | |
download | emacs-b8d4c8d0e9326f8ed2d1f6fc0a38fb89ec29ed27.tar.gz emacs-b8d4c8d0e9326f8ed2d1f6fc0a38fb89ec29ed27.tar.bz2 emacs-b8d4c8d0e9326f8ed2d1f6fc0a38fb89ec29ed27.zip |
Move here from ../../lispref
72 files changed, 83477 insertions, 0 deletions
diff --git a/doc/lispref/.arch-inventory b/doc/lispref/.arch-inventory new file mode 100644 index 00000000000..2f5e6b9eea0 --- /dev/null +++ b/doc/lispref/.arch-inventory @@ -0,0 +1,4 @@ +# Generated files +precious ^(config\.status|config\.cache)$ + +# arch-tag: dde817a2-94ff-4c6e-838c-bb5b33e7f0df diff --git a/doc/lispref/.gitignore b/doc/lispref/.gitignore new file mode 100644 index 00000000000..a149258f6dd --- /dev/null +++ b/doc/lispref/.gitignore @@ -0,0 +1,17 @@ +texput.log +elisp.?? +elisp.??? +configure +config.log +config.cache +config.status +Makefile +makefile +index.texi +elisp +elisp-? +elisp-?? +vol1.* +vol2.* +elisp1* +elisp2* diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog new file mode 100644 index 00000000000..490ef3623a5 --- /dev/null +++ b/doc/lispref/ChangeLog @@ -0,0 +1,6291 @@ +2007-09-06 Glenn Morris <rgm@gnu.org> + + * Move from lispref/ to doc/lispref/. Change all setfilename + commands to use ../../info. + * Makefile.in (infodir): Go up one more level. + (usermanualdir): Change from ../man to ../emacs. + (miscmanualdir): New. + (dist): Use new variable miscmanualdir. + * makefile.w32-in (infodir, texinputdir): Go up one more level. + (usermanualdir): Change from ../man to ../emacs. + +2007-08-29 Glenn Morris <rgm@gnu.org> + + * elisp.texi (EMACSVER): Increase to 23.0.50. + +2007-08-29 Dan Nicolaescu <dann@ics.uci.edu> + + * frames.texi (Basic Parameters): Add display-environment-variable + and term-environment-variable. + +2007-08-28 Juri Linkov <juri@jurta.org> + + * display.texi (Image Formats, Other Image Types): Add SVG. + +2007-08-28 Juri Linkov <juri@jurta.org> + + * display.texi (Images): Move formats-related text to new node + "Image Formats". + (Image Formats): New node. + +2007-08-25 Richard Stallman <rms@gnu.org> + + * display.texi (Images): Delete redundant @findex. + +2007-08-16 Richard Stallman <rms@gnu.org> + + * processes.texi (Asynchronous Processes): Clarify + doc of start-file-process. + +2007-08-08 Martin Rudalics <rudalics@gmx.at> + + * modes.texi (Example Major Modes): Fix typo. + +2007-08-08 Glenn Morris <rgm@gnu.org> + + * intro.texi (nil and t): Do not use `iff' in documentation. + + * tips.texi (Documentation Tips): Recommend against `iff'. + +2007-08-07 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Image Cache): Document image-refresh. + +2007-08-06 Martin Rudalics <rudalics@gmx.at> + + * windows.texi (Size of Window): Document window-full-width-p. + +2007-07-25 Glenn Morris <rgm@gnu.org> + + * gpl.texi (GPL): Replace license with GPLv3. + + * Relicense all FSF files to GPLv3 or later. + +2007-07-24 Michael Albinus <michael.albinus@gmx.de> + + * processes.texi (Synchronous Processes): Add + `process-file-shell-command', + (Asynchronous Processes): Mention restricted use of + `process-filter' and `process-sentinel' in + `start-file-process'. Add `start-file-process-shell-command'. + +2007-07-17 Michael Albinus <michael.albinus@gmx.de> + + * files.texi (Magic File Names): Introduce optional parameter + IDENTIFICATION for `file-remote-p'. + +2007-07-16 Richard Stallman <rms@gnu.org> + + * display.texi (Defining Faces): Fix previous change. + +2007-07-14 Richard Stallman <rms@gnu.org> + + * control.texi (Handling Errors): Document `debug' in handler list. + +2007-07-10 Richard Stallman <rms@gnu.org> + + * display.texi (Defining Faces): Explain C-M-x feature for defface. + +2007-07-09 Richard Stallman <rms@gnu.org> + + * files.texi (Magic File Names): Rewrite previous change. + +2007-07-08 Michael Albinus <michael.albinus@gmx.de> + + * files.texi (Magic File Names): Introduce optional parameter + CONNECTED for `file-remote-p'. + +2007-07-07 Michael Albinus <michael.albinus@gmx.de> + + * processes.texi (Asynchronous Processes): + * files.texi (Magic File Names): Add `start-file-process'. + +2007-06-27 Richard Stallman <rms@gnu.org> + + * files.texi (Format Conversion Piecemeal): Clarify + `after-insert-file-functions' calling convention. + +2007-06-27 Michael Albinus <michael.albinus@gmx.de> + + * files.texi (Magic File Names): Remove `dired-call-process'. Add + `process-file'. + +2007-06-27 Kenichi Handa <handa@m17n.org> + + * text.texi (Special Properties): Fix description about + `compostion' property. + +2007-06-26 Kenichi Handa <handa@m17n.org> + + * nonascii.texi (Default Coding Systems): Document about the + return value `undecided'. + +2007-06-25 David Kastrup <dak@gnu.org> + + * keymaps.texi (Active Keymaps): Document new POSITION argument of + `current-active-maps'. + +2007-06-24 Karl Berry <karl@gnu.org> + + * elisp.texi, vol1.texi, vol2.texi: new Back-Cover Text. + +2007-06-15 Juanma Barranquero <lekktu@gmail.com> + + * display.texi (Overlay Arrow): Doc fix. + +2007-06-14 Karl Berry <karl@tug.org> + + * anti.texi (Antinews): Typo. + +2007-06-14 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Image Cache): Document image-refresh. + +2007-06-12 Karl Berry <karl@gnu.org> + + * vol1.texi, vol2.texi, two-volume-cross-refs.txt: Update. + * two-volume.make: New file. + * .cvsignore: Ignore two-volume files. + +2007-06-12 Tom Tromey <tromey@redhat.com> + + * os.texi (Init File): Document user-emacs-directory. + +2007-06-03 Nick Roberts <nickrob@snap.net.nz> + + * commands.texi (Click Events): Describe width and height when + object is nil. + +2007-05-30 Nick Roberts <nickrob@snap.net.nz> + + * commands.texi (Click Events): Layout more logically. Describe + width and height. + (Drag Events, Motion Events): Update to new format for position. + +2007-06-02 Richard Stallman <rms@gnu.org> + + * frames.texi (Color Parameters): Add xref to (emacs)Standard Faces. + +2007-06-02 Chong Yidong <cyd@stupidchicken.com> + + * Version 22.1 released. + +2007-06-01 Stefan Monnier <monnier@iro.umontreal.ca> + + * text.texi (Special Properties): Correct meaning of fontified face. + +2007-05-30 Richard Stallman <rms@gnu.org> + + * text.texi (Special Properties): Add link to Adjusting Point. + +2007-05-12 Richard Stallman <rms@gnu.org> + + * text.texi (Margins): indent-to-left-margin is not the default. + (Mode-Specific Indent): For indent-line-function, the default + is indent-relative. + + * modes.texi (Example Major Modes): Explain last line of text-mode + is redundant. + +2007-05-10 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Scanning Keymaps): Update where-is-internal example. + + * help.texi (Keys in Documentation): Add reference to + Documentation Tips. + + * files.texi (Format Conversion): TO-FN gets three arguments. + + * modes.texi (Auto Major Mode): Document file-start-mode-alist. + +2007-05-10 Thien-Thi Nguyen <ttn@gnuvola.org> + + * elisp.texi (Top): Remove "Saving Properties" from detailed menu. + * files.texi (Format Conversion): Expand intro; add menu. + (Format Conversion Overview, Format Conversion Round-Trip) + (Format Conversion Piecemeal): New nodes/subsections. + * hooks.texi: Xref "Format Conversion" , not "Saving Properties". + * text.texi (Text Properties): Remove "Saving Properties" from menu. + (Saving Properties): Delete node/subsection. + +2007-05-07 Karl Berry <karl@gnu.org> + + * elisp.texi (EMACSVER): Back to 22. + +2007-05-06 Richard Stallman <rms@gnu.org> + + * processes.texi (Accepting Output): Revert most of previous change. + +2007-05-05 Richard Stallman <rms@gnu.org> + + * processes.texi (Accepting Output): accept-process-output + uses microseconds, not milliseconds. But that arg is obsolete. + +2007-05-04 Karl Berry <karl@tug.org> + + * elisp.texi (EMACSVER) [smallbook]: 22.1, not 22. + +2007-05-04 Eli Zaretskii <eliz@gnu.org> + + * tips.texi (Documentation Tips): Rearrange items to place the + more important ones first. Add an index entry for hyperlinks. + +2007-05-03 Karl Berry <karl@gnu.org> + + * elisp.texi (\urlcolor, \linkcolor) [smallbook]: \Black for printing. + (EMACSVER) [smallbook]: 22 for printed version. + + * control.texi (Signaling Errors) <signal>: texinfo.tex is fixed, + so restore anchor to normal position after defun. Found by Kevin Ryde. + +2007-04-26 Glenn Morris <rgm@gnu.org> + + * elisp.texi (EMACSVER): Increase to 22.1.50. + +2007-04-28 Karl Berry <karl@gnu.org> + + * elisp.texi: Improve line breaks on copyright page, + similar layout to emacs manual, 8.5x11 by default. + +2007-04-24 Richard Stallman <rms@gnu.org> + + * text.texi (Special Properties): Add xref to Overlay Properties. + + * display.texi (Overlay Properties): Add xref to Special Properties. + +2007-04-22 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Extended Menu Items): Move the info about + format with cached keyboard binding. + +2007-04-21 Richard Stallman <rms@gnu.org> + + * text.texi (Special Properties): Clarify previous change. + + * files.texi (File Name Expansion): Clarify previous change. + + * display.texi (Attribute Functions): Fix example for + face-attribute-relative-p. + +2007-04-19 Kenichi Handa <handa@m17n.org> + + * text.texi (Special Properties): Document composition property. + +2007-04-19 Glenn Morris <rgm@gnu.org> + + * files.texi (File Name Expansion): Mention "superroot". + +2007-04-15 Chong Yidong <cyd@stupidchicken.com> + + * frames.texi (Multiple Displays): Add note about "multi-monitor" + setups. + (Display Feature Testing): Note that display refers to all + physical monitors for multi-monitor setups. + +2007-04-14 Richard Stallman <rms@gnu.org> + + * lists.texi (Sets And Lists): Clarify `delete' examples. + Remove spurious xref to same node. + Clarify xref for add-to-list. + +2007-04-12 Nick Roberts <nickrob@snap.net.nz> + + * keymaps.texi (Format of Keymaps): Remove spurious ")" from + value of lisp-mode-map. + +2007-04-11 Karl Berry <karl@gnu.org> + + * anti.texi (Antinews): + * display.texi (Overlay Properties, Defining Images): + * processes.texi (Synchronous Processes, Sentinels): + * syntax.texi (Syntax Table Internals): + * searching.texi (Regexp Special): + * nonascii.texi (Default Coding Systems): + * text.texi (Special Properties): + * minibuf.texi (Basic Completion): Wording to improve breaks in + 8.5x11 format. + * elisp.texi (smallbook): New @set to more easily switch between + smallbook and 8.5x11. + +2007-04-11 Richard Stallman <rms@gnu.org> + + * text.texi (Lazy Properties): Minor fix. + +2007-04-08 Karl Berry <karl@gnu.org> + + * symbols.texi (Plists and Alists): Period after "vs" in index entries. + * macros.texi (Backquote): Downcase Backquote in index entries for + consistency. + +2007-04-08 Richard Stallman <rms@gnu.org> + + * text.texi (Adaptive Fill): Just describe default, + don't show it (since it contains non-ASCII chars). + +2007-04-07 Karl Berry <karl@gnu.org> + + * text.texi (Adaptive Fill) [@iftex]: Omit binary characters in + adaptive-fill-regexp's value, since they are not in the standard + TeX fonts. + +2007-04-07 Guanpeng Xu <herberteuler@hotmail.com> + + * display.texi (Defining Faces): Fix example. + +2007-04-07 Karl Berry <karl@gnu.org> + + * display.texi (Button Buffer Commands): Improve page break. + +2007-04-07 Richard Stallman <rms@gnu.org> + + * advice.texi (Activation of Advice): Remove redundant index entry. + + * backups.texi: Improve index entries. Remove redundant ones. + + * compile.texi (Byte Compilation): Improve index entry. + + * hash.texi (Creating Hash): Improve index entry. + + * symbols.texi (Definitions): Improve index entry. + + * edebug.texi: Improve index entries. Remove redundant/useless ones. + + * maps.texi (Standard Keymaps): Remove useless index entry. + + * help.texi (Documentation Basics): Remove redundant index entries. + + * customize.texi: Improve index entries. + Remove redundant/useless ones. + + * locals.texi (Standard Buffer-Local Variables): Clarify intro text. + + * streams.texi (Output Variables): Improve index entry. + + * abbrevs.texi (Abbrevs): Remove useless index entry. + + * macros.texi (Expansion): Remove useless index entry. + + * text.texi: Improve index entries. Remove redundant/useless ones. + (Text Properties, Examining Properties) + (Special Properties): Use "property category" instead of "category" + to refer to the `category' property. + + * positions.texi: Improve index entries. Remove useless one. + + * lists.texi: Improve index entries. Remove redundant/useless ones. + + * os.texi: Improve index entries. + (Timers): Fix previous change. + + * buffers.texi: Improve index entries. + (Modification Time): Get rid of term "obsolete buffer". + + * debugging.texi: Improve index entries. + (Test Coverage): Add xref to other test coverage ftr. + + * eval.texi: Improve index entry. Remove redundant ones. + + * numbers.texi: Improve index entries. Remove redundant/useless ones. + + * files.texi: Improve index entries. Remove redundant/useless ones. + + * objects.texi: Improve index entries. + + * processes.texi: Improve index entries. + + * modes.texi: Improve index entry. Remove redundant one. + + * nonascii.texi: Improve index entries. + + * internals.texi: Improve index entries. + + * syntax.texi: Improve index entries. + + * keymaps.texi (Active Keymaps): Improve index entries. + + * commands.texi: Improve index entries. Remove redundant/useless ones. + + * frames.texi: Improve index entries. Remove redundant/useless ones. + + * markers.texi: Improve index entries. Remove redundant ones. + + * tips.texi: Improve index entries. + + * loading.texi (Unloading): Improve index entry. + + * variables.texi: Improve index entries. Remove redundant one. + + * sequences.texi: Improve index entry. + + * display.texi: Improve index entries. Remove redundant ones. + + * windows.texi: Improve index entries. + + * searching.texi: Improve index entries. Remove redundant one. + + * strings.texi (Case Tables): Improve last change. + +2007-04-04 Chong Yidong <cyd@stupidchicken.com> + + * strings.texi (Case Tables): Document with-case-table and + ascii-case-table. + +2007-04-03 Karl Berry <karl@gnu.org> + + * processes.texi (Network): Reword to improve page break. + +2007-04-03 Eli Zaretskii <eliz@gnu.org> + + * functions.texi (Inline Functions): Describe more disadvantages + of defsubst, and make advice against it stronger. + +2007-04-02 Karl Berry <karl@gnu.org> + + * backups.texi (Backup Names): Avoid widow words. + * modes.texi (Example Major Modes): Align last comment. + +2007-04-01 Chong Yidong <cyd@stupidchicken.com> + + * keymaps.texi (Remapping Commands): Document new arg to + command-remapping. + +2007-04-01 Karl Berry <karl@gnu.org> + + * processes.texi (Low-Level Network): Typo. + * loading.texi (Hooks for Loading): Avoid double "the". + * keymaps.texi (Key Sequences): No double "and". + (Changing Key Bindings): Shorten to improve line break. + +2007-03-31 Glenn Morris <rgm@gnu.org> + + * os.texi (Timers): Fix description of run-at-time TIME formats. + +2007-03-31 Richard Stallman <rms@gnu.org> + + * display.texi (Invisible Text): Correct buffer-invisibility-spec + regarding ellipsis. + +2007-03-31 Eli Zaretskii <eliz@gnu.org> + + * intro.texi (nil and t): + * symbols.texi (Plists and Alists): + * variables.texi (Variable Aliases, Constant Variables): + * functions.texi (Defining Functions): + * advice.texi (Advising Primitives): + * debugging.texi (Syntax Errors, Compilation Errors): + * minibuf.texi (Minibuffer Windows): + * commands.texi (Adjusting Point): + * modes.texi (Syntactic Font Lock, Faces for Font Lock) + (Auto Major Mode, Major Mode Conventions): + * help.texi (Describing Characters): + * files.texi (Create/Delete Dirs, Information about Files) + (File Locks, Writing to Files, Reading from Files) + (Saving Buffers): + * windows.texi (Resizing Windows, Cyclic Window Ordering): + * frames.texi (Finding All Frames): + * positions.texi (Buffer End, Motion): + * markers.texi (The Region): + * text.texi (Deletion, Near Point): + * display.texi (Displaying Messages, Truncation): + * os.texi (Processor Run Time): + * tips.texi (Key Binding Conventions, Programming Tips) + (Warning Tips, Documentation Tips, Comment Tips): + * internals.texi (Memory Usage): Improve indexing. + + * variables.texi (Frame-Local Variables): + * functions.texi (Argument List): + * loading.texi (Library Search): + * streams.texi (Output Variables): + * keymaps.texi (Translation Keymaps, Searching Keymaps): + * searching.texi (Replacing Match, Search and Replace): + * processes.texi (Byte Packing, Decoding Output) + (Accepting Output, Network Servers, Shell Arguments): + * display.texi (Abstract Display, Image Cache, Scroll Bars): + * windows.texi (Window Point, Window Start): + * frames.texi (Management Parameters, Frame Parameters, Frame Titles): + * commands.texi (Reading Input, Keyboard Events): + * minibuf.texi (Reading File Names, Minibuffer Completion) + (Recursive Mini): + * positions.texi (List Motion): + * hash.texi (Hash Tables, Creating Hash, Defining Hash): + * numbers.texi (Arithmetic Operations, Math Functions) + (Predicates on Numbers, Comparison of Numbers): + (Numeric Conversions): + * locals.texi (Standard Buffer-Local Variables): + * maps.texi (Standard Keymaps): + * os.texi (User Identification, System Environment, Recording Input) + (X11 Keysyms): + * nonascii.texi (Non-ASCII Characters, Splitting Characters): + * backups.texi (Backups and Auto-Saving): + * customize.texi (Customization, Group Definitions) + (Variable Definitions): + * compile.texi (Byte Compilation): Improve index entries. + +2007-03-31 Karl Berry <karl@gnu.org> + + * macros.texi (Defining Macros): Avoid widow syllable. + +2007-03-31 Eli Zaretskii <eliz@gnu.org> + + * elisp.texi (Top): Postscript -> PostScript. + + * display.texi (Images, Postscript Images): Postscript -> PostScript. + +2007-03-31 Markus Triska <markus.triska@gmx.at> + + * internals.texi (Writing Emacs Primitives): Untabify `For'. + +2007-03-30 Karl Berry <karl@gnu.org> + + * lists.texi (List-related Predicates): Remove spurious @need. + (Setcdr): Use @smallexample to improve page break. + (Association Lists) <assoc>: Reword to improve page break. + + * strings.texi (String Conversion): Insert blank line to improve + page break. + + * numbers.texi (Random Numbers): Use @minus{}. + (Math Functions): Use @minus{}. + + * intro.texi (Acknowledgements): Avoid line breaks before middle + initials. + +2007-03-24 Eli Zaretskii <eliz@gnu.org> + + * errors.texi (Standard Errors): Add an index entry. + +2007-03-19 Richard Stallman <rms@gnu.org> + + * os.texi (Recording Input): recent-keys now gives 300 keys. + +2007-03-12 Glenn Morris <rgm@gnu.org> + + * os.texi: Replace "daylight savings" with "daylight saving" + throughout. + +2007-03-05 Richard Stallman <rms@gnu.org> + + * variables.texi (File Local Variables): Update + enable-local-variables values. + +2007-03-04 Richard Stallman <rms@gnu.org> + + * syntax.texi (Control Parsing): Minor clarification. + + * strings.texi (Formatting Strings): Clarify width, precision, flags. + + * sequences.texi (Sequence Functions): Move string-bytes away, + add xref. + + * nonascii.texi (Text Representations): Move string-bytes here. + + * modes.texi (Major Mode Conventions): Fundamental mode is exception. + + * minibuf.texi (Basic Completion): Minor clarification. + + * markers.texi (The Mark): Clarify existence vs activation of mark. + Other cleanup. + + * display.texi (Finding Overlays): Write better example. + + * compile.texi (Eval During Compile): Clarify putting macros + in eval-when-compile. + +2007-02-25 Vinicius Jose Latorre <viniciusjl@ig.com.br> + + * loading.texi (How Programs Do Loading): Fix anchor position at + load-read-function definition doc. (tiny change) + +2007-02-21 Kim F. Storm <storm@cua.dk> + + * strings.texi (Text Comparison): Mention that assoc-string + converts symbols to strings before testing. + +2007-02-17 Kim F. Storm <storm@cua.dk> + + * processes.texi (Bindat Spec): Vector types can have optional + element type. + (Bindat Examples): Fix example. Add vector with element type. + +2007-02-16 Andreas Schwab <schwab@suse.de> + + * strings.texi (Formatting Strings): Document '+' flag. + +2007-02-15 Juanma Barranquero <lekktu@gmail.com> + + * strings.texi (Modifying Strings): Clarify that `clear-string' + always converts the string to unibyte. + +2007-02-14 Kim F. Storm <storm@cua.dk> + + * display.texi (Glyphs): Add make-glyph-code, glyph-char, glyph-face. + Rewrite glyph code description to refer to these functions. + Remove details of encoding face number and char into integer code. + +2007-02-03 Alan Mackenzie <acm@muc.de> + + * loading.texi (Hooks for Loading): Make the description of + `eval-after-load' more detailed, and amend the description of + after-load-alist, in accordance with changes from 2006-05. + +2007-02-03 Chong Yidong <cyd@stupidchicken.com> + + * modes.texi (Defining Minor Modes): Document that a :require + keyword or similar may be required to make saved customization + variables work. + +2007-02-03 Eli Zaretskii <eliz@gnu.org> + + * elisp.texi (Top): Make the detailed menu headers compliant with + Texinfo guidelines and with what texnfo-upd.el expects. Add + comments to prevent people from inadvertently modifying the key + parts needed by `texinfo-multiple-files-update'. + +2007-02-02 Eli Zaretskii <eliz@gnu.org> + + * elisp.texi (Top): Update the top-level menus. + + * syntax.texi (Categories): Add index entries. + +2007-02-01 Juanma Barranquero <lekktu@gmail.com> + + * display.texi (Attribute Functions): Fix name and description of + the UNDERLINE arg of `set-face-underline-p'. + +2007-01-29 Eli Zaretskii <eliz@gnu.org> + + * elisp.texi (Top): Add "Standard Errors", "Standard Buffer-Local + Variables", and "Standard Keymaps" to the detailed menu. + + * variables.texi (Future Local Variables): Add index entry. + +2007-01-28 Richard Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Clarify the tip about macros + that define a function or a variable. + + * files.texi (File Attributes): UID and GID can be floats. + (Magic File Names): Explain why deferring all operations to + the standard handler does not work. + +2007-01-23 Martin Rudalics <rudalics@gmx.at> + + * backups.texi (Reverting): Use "buffer" instead of "file" + when talking about major and minor modes. + +2007-01-21 Richard Stallman <rms@gnu.org> + + * help.texi (Documentation): Add xref to Documentation Tips. + +2007-01-14 Juanma Barranquero <lekktu@gmail.com> + + * tips.texi (Coding Conventions): Fix typos. + +2007-01-05 Richard Stallman <rms@gnu.org> + + * modes.texi (Defining Minor Modes): Fix previous change. + +2007-01-03 Richard Stallman <rms@gnu.org> + + * customize.texi (Variable Definitions, Customization Types): + Don't use * in doc string for defcustom. + +2007-01-02 Richard Stallman <rms@gnu.org> + + * variables.texi (Variable Aliases): Clarify that aliases vars + always have the same value. + + * processes.texi (Bindat Spec): Fix Texinfo usage. + + * modes.texi (Defining Minor Modes): Explain effect of command + defined with define-global-minor-mode on new buffers. + +2006-12-30 Kim F. Storm <storm@cua.dk> + + * keymaps.texi (Tool Bar): Describe `grow-only' value of + `auto-resize-tool-bars'. + +2006-12-30 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Active Keymaps): Fix previous change. + +2006-12-30 Nick Roberts <nickrob@snap.net.nz> + + * keymaps.texi (Active Keymaps): Make xref to lookup-key. + +2006-12-30 Kim F. Storm <storm@cua.dk> + + * processes.texi (Bindat Spec): Clarify using field names in + length specifications. + +2006-12-29 Kim F. Storm <storm@cua.dk> + + * processes.texi (Bindat Spec): Explain eval forms and lengths better. + Add count and index variables for eval forms in repeat blocks. + +2006-12-24 Richard Stallman <rms@gnu.org> + + * customize.texi (Variable Definitions): Document + new name custom-add-frequent-value. + +2006-12-19 Kim F. Storm <storm@cua.dk> + + * commands.texi (Misc Events): User signals now result in sigusr1 + and sigusr2 events which are handled through special-event-map. + (Special Events): User signals and drag-n-drop are special. + +2006-12-17 Richard Stallman <rms@gnu.org> + + * loading.texi (Named Features): Explain subfeatures better. + + * customize.texi: Use "option" only for user options. + For the keyword values inside defcustom etc, say "keywords". + For :options value's elements, say "elements". + :group should not be omitted. + + * syntax.texi (Parsing Expressions): Split up node. + (Motion via Parsing, Position Parse, Parser State) + (Low-Level Parsing, Control Parsing): New subnodes. + (Parser State): Document syntax-ppss-toplevel-pos. + + * positions.texi (List Motion): Punctuation fix. + + * files.texi (File Name Completion): Document PREDICATE arg + to file-name-completion. + +2006-12-16 Eli Zaretskii <eliz@gnu.org> + + * internals.texi (Building Emacs, Writing Emacs Primitives): + Add index entries. + +2006-12-11 Richard Stallman <rms@gnu.org> + + * modes.texi (Font Lock Basics): Explain how nil for font-lock-defaults + affects face menu. Explain how to make it non-nil without enabling + any fontification. + +2006-12-10 Chong Yidong <cyd@stupidchicken.com> + + * modes.texi (Font Lock Basics): Document nil value of + font-lock-defaults. + +2006-12-10 Glenn Morris <rgm@gnu.org> + + * abbrevs.texi (Defining Abbrevs): Mention `define-abbrev' 'force + value for system-flag argument. Abbrev tables may not be empty + when major modes are loaded. + +2006-12-08 Juanma Barranquero <lekktu@gmail.com> + + * makefile.w32-in (maintainer-clean): Partially revert last + change; delete "elisp-?" and "elisp-??" instead of "elisp-*" + to protect elisp-covers.texi. + +2006-12-07 Juanma Barranquero <lekktu@gmail.com> + + * makefile.w32-in (maintainer-clean): Depend on `distclean'. + Don't remove elisp* info files; they are already deleted by the + `clean' and `distclean' targets, and they are in the $(infodir) + directory, not the current one. + +2006-12-04 Kim F. Storm <storm@cua.dk> + + * commands.texi (Misc Events): Update signal events. + (Event Examples): Add signal example. + +2006-11-29 Richard Stallman <rms@gnu.org> + + * frames.texi (Visibility of Frames): Explain visible windows + can be covered by others. Add xref for raise-frame. + +2006-11-28 Richard Stallman <rms@gnu.org> + + * searching.texi (Regexp Special): Update when ^ is special. + +2006-11-27 Eli Zaretskii <eliz@gnu.org> + + * customize.texi (Customization, Common Keywords) + (Group Definitions, Variable Definitions, Composite Types) + (Type Keywords, Customization Types): Add index entries for + various customization keywords. + +2006-11-23 Stefan Monnier <monnier@iro.umontreal.ca> + + * modes.texi (Multiline Font Lock): Rephrase some parts for clarity. + +2006-11-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * frames.texi (Window System Selections): Remove clipboard from + description of selection-coding-system. + +2006-11-06 Richard Stallman <rms@gnu.org> + + * lists.texi (List Variables): Document COMPARE-FN. + + * keymaps.texi: Avoid use of "binding" to mean a relation; + use it only to refer to the meaning associated with a key. + (Keymaps): Change menu node description. + + * elisp.texi (Top): Change menu node description. + + * display.texi (Managing Overlays): Document overlay-recenter. + +2006-10-29 Chong Yidong <cyd@stupidchicken.com> + + * Makefile.in: Use relative paths to avoid advertising filesystem + contents during compilation. + +2006-10-23 Kim F. Storm <storm@cua.dk> + + * commands.texi (Event Input Misc): Update unread-command-events. + +2006-10-23 Nick Roberts <nickrob@snap.net.nz> + + * lists.texi (Sets And Lists): Fix typos. + +2006-10-18 Juanma Barranquero <lekktu@gmail.com> + + * control.texi (Processing of Errors): Use @var for an argument, + not @code. + +2006-10-16 Richard Stallman <rms@gnu.org> + + * edebug.texi (Edebug Recursive Edit): Minor cleanup. + + * keymaps.texi (Format of Keymaps): Show all the keymap element + patterns that result from menu items. + (Key Lookup): Minor cleanups. + + * modes.texi (Precalculated Fontification): Don't say that + not setting font-lock-defaults avoids loading font-lock. + + * help.texi (Documentation): Move xref to Emacs Manual here. + (Documentation Basics): From here. + Also doc emacs-lisp-docstring-fill-column. + + * elisp.texi: Update version and ISBN. + + * commands.texi (Interactive Call): Clarify KEYS arg to + call-interactively is a vector. + (Command Loop Info): Delete anchor in this-command-keys. + Add anchor in this-command-keys-vector. + (Recursive Editing): Document how recursive-edit + handles the current buffer. + +2006-10-13 Chong Yidong <cyd@stupidchicken.com> + + * frames.texi (Frame Titles): %c and %l are ignored in + frame-title-format. + +2006-10-11 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Key Sequences): Clarify use of kbd. + +2006-10-10 Kim F. Storm <storm@cua.dk> + + * lists.texi (Sets And Lists): Add memql. + +2006-10-03 Richard Stallman <rms@gnu.org> + + * searching.texi (Char Classes): Document :multibyte: and :unibyte:. + Clarify :ascii: and :nonascii:. + +2006-09-29 Juri Linkov <juri@jurta.org> + + * modes.texi (%-Constructs): Reorder coding systems in the + documentation of %z to the real order displayed in the modeline. + +2006-09-25 Richard Stallman <rms@gnu.org> + + * os.texi (Timers): Describe timer-max-repeats. + +2006-09-25 Chong Yidong <cyd@stupidchicken.com> + + * os.texi (Timers): Mention with-local-quit. + +2006-09-24 Richard Stallman <rms@gnu.org> + + * searching.texi (Searching and Matching): Mention property search. + + * commands.texi (Command Loop Info): Explain how read-event affects + this-command-keys. + +2006-09-20 Richard Stallman <rms@gnu.org> + + * os.texi (Timers): Clarify about REPEAT when timer is delayed. + + * windows.texi (Window Start): Minor cleanups. + +2006-09-20 Kim F. Storm <storm@cua.dk> + + * windows.texi (Window Start): pos-visible-in-window-p allows + specifying t for position to mean "end of window". + Add window-line-height. + + * anti.texi (Antinews): Mention window-line-height. + +2006-09-19 David Kastrup <dak@gnu.org> + + * keymaps.texi (Searching Keymaps): Small clarification. + +2006-09-18 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Creating Keymaps): Explain that keymap prompt strings + cause keyboard menus. + (Menu Keymaps): Likewise. + (Defining Menus, Keyboard Menus): Clarify. + + * text.texi (Fields): Clarify explanation of constrain-to-field. + +2006-09-16 Eli Zaretskii <eliz@gnu.org> + + * variables.texi (Tips for Defining): Fix a typo. + +2006-09-15 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Remapping Commands, Searching Keymaps) + (Active Keymaps): Clean up previous change. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * gpl.texi: Replace "Library Public License" by "Lesser Public + License" throughout. + +2006-09-15 David Kastrup <dak@gnu.org> + + * keymaps.texi (Active Keymaps): Adapt description to use + `get-char-property' instead `get-text-property'. Explain how + mouse events change this. Explain the new optional argument of + `key-binding' and its mouse-dependent lookup. + (Searching Keymaps): Adapt description similarly. + (Remapping Commands): Explain the new optional argument of + `command-remapping'. + +2006-09-14 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Searching Keymaps): Clarification. + (Active Keymaps): Refer to Searching Keymaps instead of duplication. + +2006-09-13 Richard Stallman <rms@gnu.org> + + * objects.texi (Character Type): Node split. + Add xref to Describing Characters. + (Basic Char Syntax, General Escape Syntax) + (Ctl-Char Syntax, Meta-Char Syntax): New subnodes. + +2006-09-11 Richard Stallman <rms@gnu.org> + + * display.texi (Display Table Format): Wording clarification. + (Glyphs): Clarifications. + +2006-09-10 Chong Yidong <cyd@stupidchicken.com> + + * keymaps.texi (Active Keymaps): Mention that key-binding checks + local maps. + +2006-09-10 Kim F. Storm <storm@cua.dk> + + * display.texi (Forcing Redisplay): Document return value of + function redisplay. + +2006-09-09 Richard Stallman <rms@gnu.org> + + * windows.texi (Window Hooks): Explain limits of + window-scroll-functions. + + * display.texi (Fringe Indicators): Update for last change in + indicate-buffer-boundaries. + +2006-09-08 Richard Stallman <rms@gnu.org> + + * processes.texi (Bindat Spec): Suggest names ending in -bindat-spec. + +2006-09-06 Kim F. Storm <storm@cua.dk> + + * frames.texi (Display Feature Testing): display-mm-dimensions-alist. + + * windows.texi (Window Start): Update pos-visible-in-window-p. + +2006-09-04 Richard Stallman <rms@gnu.org> + + * processes.texi (Accepting Output): Explain SECONDS=0 for + accept-process-output. + + * os.texi (Idle Timers): Explain why timer functions should not + loop until (input-pending-p). + +2006-09-02 Eli Zaretskii <eliz@gnu.org> + + * makefile.w32-in (usermanualdir): New variable. + (elisp.dvi): Use it. + +2006-09-01 Eli Zaretskii <eliz@gnu.org> + + * buffers.texi (Buffer Modification): Fix last change. + +2006-09-01 Chong Yidong <cyd@stupidchicken.com> + + * buffers.texi (Buffer Modification): Document + buffer-chars-modified-tick. + +2006-08-31 Richard Stallman <rms@gnu.org> + + * modes.texi (Syntactic Font Lock): Mention specific faces once again. + +2006-08-31 Richard Bielawski <RBielawski@moneygram.com> (tiny change) + + * modes.texi (Syntactic Font Lock): + Mention font-lock-syntactic-face-function + instead of specific faces. + +2006-08-29 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Images): Add xrref to display-images-p. + +2006-08-28 Kenichi Handa <handa@m17n.org> + + * nonascii.texi (Lisp and Coding Systems): Fix description of + detect-coding-region. + +2006-08-27 Michael Olson <mwolson@gnu.org> + + * processes.texi (Transaction Queues): Remove stray quote + character. + +2006-08-25 Richard Stallman <rms@gnu.org> + + * os.texi (Idle Timers): run-with-idle-timer allows Lisp time value. + Add xref. + +2006-08-24 Chong Yidong <cyd@stupidchicken.com> + + * os.texi (Timers): Avoid waiting inside timers. + +2006-08-21 Lute Kamstra <lute@gnu.org> + + * Makefile.in: Use ../man/texinfo.tex to build elisp.dvi. + +2006-08-20 Richard Stallman <rms@gnu.org> + + * os.texi (Idle Timers): New node, split out from Timers. + Document current-idle-time. + * commands.texi (Reading One Event): Update xref. + * elisp.texi (Top): Update subnode menu. + +2006-08-16 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Extended Menu Items): Show format of cached + bindings in extended menu items. + + * customize.texi (Variable Definitions): Explain when the + standard value expression is evaluated. + +2006-08-15 Chong Yidong <cyd@stupidchicken.com> + + * commands.texi (Reading One Event): Explain idleness in + `read-event'. + +2006-08-12 Chong Yidong <cyd@stupidchicken.com> + + * text.texi (Near Point): Say "cursor" not "terminal cursor". + (Commands for Insertion): Removed split-line since it's not + relevant for Lisp programming. + (Yank Commands): Rewrite introduction. + (Undo): Clarify. + (Maintaining Undo): Clarify. Document undo-ask-before-discard. + (Filling): Remove redundant comment. Clarify return value of + current-justification. + (Margins): Minor clarifications. + (Adaptive Fill): Update default value of adaptive-fill-regexp. + (Sorting): Update definition of sort-lines. + (Columns): Clarify behavior of sort-columns. + (Indent Tabs): Link to Tab Stops in Emacs manual. + (Special Properties): Clarify. + (Clickable Text): Mention Buttons package. + +2006-08-12 Kevin Ryde <user42@zip.com.au> + + * os.texi (Time Parsing): Add %z to description of + format-time-string, as per docstring. Add cross reference to + glibc manual for strftime. + +2006-08-08 Richard Stallman <rms@gnu.org> + + * modes.texi: Clean up wording in previous change. + +2006-08-07 Chong Yidong <cyd@stupidchicken.com> + + * modes.texi (Hooks): Clarify. + (Major Mode Basics): Mention define-derived-mode explicitly. + (Major Mode Conventions): Rebinding RET is OK for some modes. + Mention change-major-mode-hook and after-change-major-mode-hook. + (Example Major Modes): Moved to end of Modes section. + (Mode Line Basics): Clarify. + (Mode Line Data): Mention help-echo and local-map in strings. + Explain reason for treatment of non-risky variables. + (Properties in Mode): Clarify. + (Faces for Font Lock): Add font-lock-negation-char-face. + +2006-08-04 Eli Zaretskii <eliz@gnu.org> + + * strings.texi (Formatting Strings): Warn against arbitrary + strings as first arg to `format'. + +2006-07-31 Thien-Thi Nguyen <ttn@gnu.org> + + * text.texi (Clickable Text): Mention `help-echo' text property. + Update intro, examples and associated explanations. + +2006-07-31 Richard Stallman <rms@gnu.org> + + * commands.texi: Update xrefs. + (Event Mod): New node, cut out from old Translating Input. + + * maps.texi: Update xrefs. + + * keymaps.texi (Translation Keymaps): New node. + Update xrefs from Translating Input to Translation Keymaps. + + * elisp.texi (Top): Update subnode menu. + + * display.texi (Face Functions): Fix explanations of FRAME=t or nil. + + * os.texi (System Interface): Fix menu descriptions of some nodes. + (Translating Input): Node deleted. + +2006-07-31 Nick Roberts <nickrob@snap.net.nz> + + * modes.texi (Minor Mode Conventions): Update xref for add-to-list. + + * lists.texi (Sets And Lists): Likewise. + +2006-07-30 Thien-Thi Nguyen <ttn@gnu.org> + + * text.texi (Fields): Mention POS + requirement when narrowing is in effect. + +2006-07-28 Richard Stallman <rms@gnu.org> + + * display.texi (Face Attributes): Simplify wording. + (Attribute Functions): Clarify meaning of new-frame default + attribute settings. + + * customize.texi (Common Keywords): Document how to use + :package-version in a package not in Emacs. + +2006-07-28 Kim F. Storm <storm@cua.dk> + + * commands.texi (Reading One Event): Fix last change. + +2006-07-26 Chong Yidong <cyd@stupidchicken.com> + + * commands.texi (Reading One Event): Document SECONDS argument for + read-event, read-char, and read-char-exclusive. + +2006-07-25 Stefan Monnier <monnier@iro.umontreal.ca> + + * modes.texi (Multiline Font Lock): Can't use jit-lock-defer-multiline + to ensure correct identification. + +2006-07-24 Richard Stallman <rms@gnu.org> + + * text.texi (Clickable Text): Clarify. + + * sequences.texi (Vector Functions): Delete duplicate xref. + + * objects.texi (Function Type): Clarify. + + * modes.texi (Keymaps and Minor Modes): List punct chars for minor + modes. + + * lists.texi (List Variables): New node. + Material moved from other nodes. + + * variables.texi (Setting Variables): add-to-list and + add-to-ordered-list moved to List Variables node. + +2006-07-23 Thien-Thi Nguyen <ttn@gnu.org> + + * text.texi (Links and Mouse-1): + For mouse-on-link-p, expand on arg POS. + +2006-07-21 Kim F. Storm <storm@cua.dk> + + * display.texi (Forcing Redisplay): Don't mention systems which + don't support sub-second timers for redisplay-preemption-period. + + * os.texi (Terminal Output): Clarify text vs graphical terminal. + +2006-07-21 Eli Zaretskii <eliz@gnu.org> + + * frames.texi (Input Focus): Document that focus-follows-mouse has + no effect on MS-Windows. + +2006-07-18 Richard Stallman <rms@gnu.org> + + * display.texi (Forcing Redisplay): Cleanups in previous change. + + * processes.texi (Low-Level Network): Make menu more convenient. + +2006-07-18 Kim F. Storm <storm@cua.dk> + + * display.texi (Forcing Redisplay): redisplay-preemption-period + only used on window systems. Add xref to Terminal Output. + + * os.texi (Terminal Output): baud-rate only controls preemption on + non-window systems. Add xref to Forcing Redisplay. + + * processes.texi (Low-Level Network): Rename node "Make Network" + to "Network Processes". + +2006-07-18 Karl Berry <karl@gnu.org> + + * variables.texi, functions.texi, customize.texi, loading.texi: + * edebug.texi, minibuf.texi: Fix page breaks through chapter 20. + +2006-07-17 Chong Yidong <cyd@stupidchicken.com> + + * commands.texi (Waiting): Document batch-mode sit-for behavior. + +2006-07-17 Richard Stallman <rms@gnu.org> + + * eval.texi, elisp.texi, text.texi: Use real doublequote inside menus. + Put period and comma inside quotes. + + * loading.texi, markers.texi: Use real doublequote inside menus. + + * windows.texi: Put point and comma inside quotes. + (Textual Scrolling): Use @samp for error message. + + * variables.texi, tips.texi, syntax.texi, symbols.texi: + * strings.texi, streams.texi, processes.texi, os.texi: + * objects.texi, numbers.texi, modes.texi, minibuf.texi: + * lists.texi, keymaps.texi, intro.texi, hash.texi, internals.texi: + * gpl.texi, functions.texi, files.texi, frames.texi, doclicense.texi: + * display.texi, control.texi, commands.texi, buffers.texi, anti.texi: + Put point and comma inside quotes. + + * control.texi (Processing of Errors): Add command-error-function. + + * variables.texi (File Local Variables): Clarify that + file local variables make buffer-local bindings. + + * modes.texi (Syntactic Font Lock): Give default for + font-lock-syntax-table. + +2006-07-17 Nick Roberts <nickrob@snap.net.nz> + + * text.texi (Special Properties): Clean up previous change. + +2006-07-16 Karl Berry <karl@gnu.org> + + * objects.texi, numbers.texi, strings.texi, lists.texi, hash.texi: + * control.texi: Fix bad page breaks through chapter 10 (control). + + * anti.texi (Antinews): Reorder face-attribute fns to avoid + underfull hbox. + +2006-07-15 Nick Roberts <nickrob@snap.net.nz> + + * text.texi (Special Properties): Describe fontified text property + in relation to a character (not text). + +2006-07-15 Kim F. Storm <storm@cua.dk> + + * maps.texi (Standard Keymaps): Add xref for minibuffer maps. + Add apropos-mode-map, custom-mode-map, esc-map, global-map, + grep-mode-map, help-map, help-mode-map, kmacro-map, and tool-bar-map. + + * anti.texi (Antinews): Mention redisplay function. + The kbd macro existed, but was not documented, before 22.x. + Function pos-visible-in-window-p is not new in 22.x, just enhanced. + +2006-07-14 Nick Roberts <nickrob@snap.net.nz> + + * display.texi (Displaying Messages): Add anchor. + + * frames.texi (Dialog Boxes): Use it. + +2006-07-12 Richard Stallman <rms@gnu.org> + + * objects.texi (Frame Type): Explain nature of frames better. + + * frames.texi (Frames): Explain nature of frames better. + +2006-07-12 Ken Manheimer <ken.manheimer@gmail.com> + + * tips.texi (Coding Conventions): Explain why use cl at compile time. + +2006-07-12 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * frames.texi (Window System Selections): Mention scrap support for Mac. + Default value of x-select-enable-clipboard is t on Mac. + + * os.texi (Getting Out): Suspending is not allowed on Mac, either. + +2006-07-11 Kim F. Storm <storm@cua.dk> + + * display.texi (Forcing Redisplay): Add `redisplay' function. + Don't mention (sit-for -1) -- use (redisplay t) instead. + + * commands.texi (Waiting): (sit-for -1) is no longer special. + (sit-for 0) is equivalent to (redisplay). + Iconifying/deiconifying no longer makes sit-for return. + +2006-07-10 Nick Roberts <nickrob@snap.net.nz> + + * display.texi (Buttons): Fix typo. + + * index.texi, elisp.texi (New Symbols): Comment node out. + +2006-07-09 Richard Stallman <rms@gnu.org> + + * display.texi (Truncation): Clean up previous change. + +2006-07-08 Richard Stallman <rms@gnu.org> + + * commands.texi (Interactive Call): Use 3 as prefix in example + for execute-extended-command. + + * display.texi (Attribute Functions): Move paragraph about + compatibility with Emacs < 21. + +2006-07-09 Kim F. Storm <storm@cua.dk> + + * display.texi (Refresh Screen): Clarify force-window-update. + (Truncation): "Normally" indicated by fringe arrows. + +2006-07-08 Eli Zaretskii <eliz@gnu.org> + + * windows.texi (Textual Scrolling, Resizing Windows): + * variables.texi (Constant Variables): + * text.texi (Buffer Contents, Deletion, Changing Properties) + (Property Search, Special Properties, Sticky Properties) + (Links and Mouse-1, Fields, Change Hooks): + * syntax.texi (Syntax Table Functions, Parsing Expressions) + (Categories): + * symbols.texi (Other Plists): + * streams.texi (Output Variables): + * processes.texi (Input to Processes, Query Before Exit): + * positions.texi (Word Motion, Text Lines, List Motion): + * os.texi (Init File, System Environment, Sound Output) + (Session Management): + * nonascii.texi (Text Representations, Character Sets) + (Chars and Bytes, Locales): + * modes.texi (Defining Minor Modes, Header Lines): + * minibuf.texi (Minibuffer Contents): + * markers.texi (Information from Markers): + * lists.texi (List Elements, Building Lists, Association Lists): + * keymaps.texi (Tool Bar): + * hash.texi (Creating Hash, Hash Access, Defining Hash, Other Hash): + * functions.texi (What Is a Function, Mapping Functions): + * frames.texi (Creating Frames, Parameter Access, Pointer Shape) + (Color Names, Text Terminal Colors, Display Feature Testing): + * files.texi (Visiting Functions, File Name Components) + (Unique File Names, Contents of Directories): + * display.texi (Forcing Redisplay, Displaying Messages) + (Temporary Displays, Font Selection, Auto Faces) + (Font Lookup, Fringe Indicators, Display Margins) + (Image Descriptors, Showing Images, Image Cache, Button Types) + (Making Buttons, Manipulating Buttons, Button Buffer Commands) + (Display Table Format, Glyphs): + * control.texi (Iteration): + * commands.texi (Command Loop Info, Adjusting Point): + * backups.texi (Making Backups, Auto-Saving): + Remove @tindex entries. + +2006-07-07 Kim F. Storm <storm@cua.dk> + + * display.texi (Fringe Cursors): Fix typo. + (Customizing Bitmaps): Fix define-fringe-bitmap entry. + (Overlay Arrow): Default is overlay-arrow fringe indicator. + +2006-07-05 Richard Stallman <rms@gnu.org> + + * text.texi (Buffer Contents): Add example of text props + in result of buffer-substring. + (Text Properties): Explain better about use of specific property names. + (Property Search): Some cleanups; reorder some functions. + + * keymaps.texi (Changing Key Bindings): Cleanup. + Add xref to Key Binding Conventions. + + * display.texi (Attribute Functions): Add examples for + face-attribute-relative-p. + + * tips.texi (Coding Conventions): Cleanup last change. + +2006-07-05 Karl Berry <karl@gnu.org> + + * elisp.texi: Use @fonttextsize 10pt, a la emacs.texi. + Remove @setchapternewpage odd. + Result is 1013 pages, down from 1100. + + * anti.texi, customize.texi, display.texi, internals.texi: + * minibuf.texi, modes.texi, tips.texi: + Fix overfull/underfull boxes. + +2006-07-05 Thien-Thi Nguyen <ttn@gnu.org> + + * edebug.texi (Instrumenting): + Add Edebug-specific findex for eval-buffer. + * loading.texi (Loading): + Replace eval-current-buffer with eval-buffer. + +2006-06-30 Nick Roberts <nickrob@snap.net.nz> + + * locals.texi (Standard Buffer-Local Variables): Update the list + of variables. + +2006-06-26 Nick Roberts <nickrob@snap.net.nz> + + * files.texi (File Name Completion): Point user to the node + "Reading File Names". + +2006-06-24 Eli Zaretskii <eliz@gnu.org> + + * files.texi (Contents of Directories): Document case-insensitive + behavior on respective filesystems. + + * objects.texi (Character Type): Document that Emacs signals an + error for unsupported Unicode characters specified as \uNNNN. + +2006-06-19 Richard Stallman <rms@gnu.org> + + * processes.texi (Bindat Spec): Clarify previous change. + +2006-06-16 Richard Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Better explain conventions + for definition constructs. + + * text.texi (Special Properties): String value of `read-only' + serves as the error message. + + * objects.texi (Character Type): Clarify prev. change. + (Non-ASCII in Strings): Mention \u and \U. + + * commands.texi (Using Interactive): Explain problem of + markers, etc., in command-history. + +2006-06-14 Kim F. Storm <storm@cua.dk> + + * commands.texi (Waiting): Negative arg to sit-for forces + redisplay even if input is pending. + + * display.texi (Forcing Redisplay): Use (sit-for -1) to force a + redisplay. Remove incorrect example of binding redisplay-dont-pause + around (sit-for 0). + +2006-06-13 Richard Stallman <rms@gnu.org> + + * display.texi (Forcing Redisplay): Clarify previous change. + +2006-06-13 Romain Francoise <romain@orebokech.com> + + * display.texi (Forcing Redisplay): Fix typo. + +2006-06-13 Kim F. Storm <storm@cua.dk> + + * display.texi (Forcing Redisplay): Add redisplay-preemption-period. + +2006-06-10 Luc Teirlinck <teirllm@auburn.edu> + + * tips.texi (Coding Conventions): Add `@end itemize'. + +2006-06-10 Richard Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Explain use of coding systems + to ensure one decoding for strings. + +2006-06-09 Aidan Kehoe <kehoea@parhasard.net> + + * objects.texi (Character Type): Describe the \uABCD and \U00ABCDEF + syntax. + +2006-06-07 Eli Zaretskii <eliz@gnu.org> + + * display.texi (Font Selection): Remove description of + clear-face-cache. + + * compile.texi (Eval During Compile): Fix a typo. Add index + entries for possible uses of eval-when-compile. + +2006-06-04 Thien-Thi Nguyen <ttn@gnu.org> + + * display.texi (Abstract Display): Fix typo. + +2006-06-03 Eli Zaretskii <eliz@gnu.org> + + * minibuf.texi (Minibuffer History) <history-add-new-input>: + Reword variable's description. + +2006-06-01 Richard Stallman <rms@gnu.org> + + * windows.texi (Splitting Windows): Clarify splitting nonselected + window. + +2006-05-31 Juri Linkov <juri@jurta.org> + + * minibuf.texi (Minibuffer History): Add history-add-new-input. + +2006-05-30 Richard Stallman <rms@gnu.org> + + * display.texi (Line Height): Fix errors in description of + default line height and line-height properyty. + + * nonascii.texi (Default Coding Systems): Further clarification. + +2006-05-29 Luc Teirlinck <teirllm@auburn.edu> + + * internals.texi (Pure Storage): Mention that an overflow in pure + space causes a memory leak. + (Garbage Collection): If there was an overflow in pure space, + `garbage-collect' returns nil. + +2006-05-30 Eli Zaretskii <eliz@gnu.org> + + * nonascii.texi (Default Coding Systems): Fix it some more. + +2006-05-29 Eli Zaretskii <eliz@gnu.org> + + * nonascii.texi (Default Coding Systems): Fix last change. + +2006-05-29 Kenichi Handa <handa@m17n.org> + + * nonascii.texi (find-operation-coding-system): Describe the new + argument format (FILENAME . BUFFER). + +2006-05-28 Richard Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Better explain reasons not to + advise other packages or use `eval-after-load'. + +2006-05-29 Kim F. Storm <storm@cua.dk> + + * processes.texi (Bindat Functions): Rename `pos' and `raw-data' to + `bindat-idx' and `bindat-raw' for clarity. + +2006-05-27 Thien-Thi Nguyen <ttn@gnu.org> + + * processes.texi (Bindat Spec): Expand on `repeat' handler. + + * display.texi (Display): Add "Abstract Display" to menu. + (Abstract Display, Abstract Display Functions) + (Abstract Display Example): New nodes. + * elisp.texi (Top): Add "Abstract Display" to menu. + +2006-05-27 Chong Yidong <cyd@stupidchicken.com> + + * keymaps.texi (Key Sequences): Link to input events definition. + (Format of Keymaps): Delete material duplicated in Keymap Basics. + + * files.texi (Changing Files): Document updated argument list for + copy-file. + +2006-05-27 Thien-Thi Nguyen <ttn@gnu.org> + + * processes.texi (Bindat Functions): Explain term "total length". + Use it in bindat-length and bindat-pack descriptions. + +2006-05-26 Eli Zaretskii <eliz@gnu.org> + + * tips.texi (Coding Conventions): Advise against using + eval-after-load in packages. Add an index entry. + +2006-05-25 Juri Linkov <juri@jurta.org> + + * minibuf.texi (Text from Minibuffer): Undocument keep-all. + + * modes.texi (%-Constructs): Add %e, %z, %Z. + +2006-05-25 Richard Stallman <rms@gnu.org> + + * elisp.texi (Top): Update subnode menu. + + * keymaps.texi (Keymap Basics): New node, split out of Key Sequences. + (Keymaps): Update menu. + +2006-05-25 Chong Yidong <cyd@stupidchicken.com> + + * keymaps.texi (Key Sequences): Some clarifications. + +2006-05-25 Thien-Thi Nguyen <ttn@gnu.org> + + * processes.texi (Bindat Functions): Say "unibyte string" + explicitly for bindat-unpack and bindat-pack descriptions. + (Bindat Examples): Don't call `string-make-unibyte' in example. + +2006-05-25 Chong Yidong <cyd@stupidchicken.com> + + * keymaps.texi (Key Sequences): Renamed from Keymap Terminology. + Explain string and vector representations of key sequences + + * keymaps.texi (Changing Key Bindings): + * commands.texi (Interactive Codes, Interactive Codes): + * help.texi (Describing Characters): Refer to it. + +2006-05-23 Luc Teirlinck <teirllm@auburn.edu> + + * frames.texi (Pointer Shape): @end table -> @end defvar. + +2006-05-22 Richard Stallman <rms@gnu.org> + + * elisp.texi (Top): Update subnode menus. + + * frames.texi (Pointer Shape): Node renamed from Pointer Shapes. + Contents rewritten; material from old Pointer Shape node moved here. + + * display.texi (Pointer Shape): Node deleted. + (Image Descriptors): Minor cleanup. + +2006-05-21 Richard Stallman <rms@gnu.org> + + * syntax.texi (Parsing Expressions): Update info on which STATE + elements are ignored. + +2006-05-19 Luc Teirlinck <teirllm@auburn.edu> + + * hooks.texi (Standard Hooks): Correct typo. + + * gpl.texi (GPL): ifinfo -> ifnottex. + +2006-05-19 Michael Ernst <mernst@alum.mit.edu> (tiny change) + + * searching.texi (Simple Match Data): Warn about match data being + set anew by every search. + +2006-05-17 Richard Stallman <rms@gnu.org> + + * minibuf.texi (Minibuffer History): Clarify. + + * searching.texi (Regexp Special): Clarify nested regexp warning. + +2006-05-16 Kim F. Storm <storm@cua.dk> + + * minibuf.texi (Minibuffer History): Update add-to-history. + +2006-05-15 Oliver Scholz <epameinondas@gmx.de> (tiny change) + + * nonascii.texi (Explicit Encoding): Fix + typo (encoding<->decoding). + +2006-05-14 Richard Stallman <rms@gnu.org> + + * buffers.texi (Creating Buffers): Cleanup. + + * files.texi (Visiting Functions): Rewrite in find-file-noselect. + +2006-05-13 Eli Zaretskii <eliz@gnu.org> + + * buffers.texi (Current Buffer): Document that with-temp-buffer + disables undo. + + * os.texi (Terminal-Specific): More accurate description of how + Emacs searches for the terminal-specific libraries. + +2006-05-12 Eli Zaretskii <eliz@gnu.org> + + * hooks.texi (Standard Hooks) [iftex]: Convert @xref's to + emacs-xtra to @inforef's. + + * text.texi (Undo): Document that undo is turned off in buffers + whose names begin with a space. + + * buffers.texi (Buffer Names): Add index entries for buffers whose + names begin with a space. + (Creating Buffers): Document that undo is turned off in buffers + whose names begin with a space. + + * files.texi (Visiting Functions, Reading from Files) + (Saving Buffers): Mention code and EOL conversions by file I/O + primitives and subroutines. + + * nonascii.texi (Lisp and Coding Systems): Document + coding-system-eol-type. Add index entries for eol conversion. + + * display.texi (Defining Faces): Mention `mac', and add an xref to + where window-system is described. + +2006-05-10 Richard Stallman <rms@gnu.org> + + * internals.texi (Writing Emacs Primitives): Clarify GCPRO rules. + +2006-05-10 Reiner Steib <Reiner.Steib@gmx.de> + + * variables.texi (File Local Variables): Recommend to quote lambda + expressions in safe-local-variable property. + +2006-05-09 Richard Stallman <rms@gnu.org> + + * variables.texi (File Local Variables): Document + safe-local-eval-forms and safe-local-eval-function. + +2006-05-07 Kim F. Storm <storm@cua.dk> + + * minibuf.texi (Minibuffer History): Remove keep-dups arg + from add-to-history. + +2006-05-07 Romain Francoise <romain@orebokech.com> + + * commands.texi (Event Input Misc): + * compile.texi (Eval During Compile): + * internals.texi (Buffer Internals): + * minibuf.texi (Initial Input): + * nonascii.texi (Scanning Charsets): + * numbers.texi (Comparison of Numbers): + * windows.texi (Textual Scrolling, Vertical Scrolling): + Fix various typos. + +2006-05-06 Eli Zaretskii <eliz@gnu.org> + + * hooks.texi (Standard Hooks): Replace inforef to emacs-xtra by + conditional xref's to either emacs or emacs-xtra, depending on + @iftex/@ifnottex. + + * minibuf.texi (Minibuffer History): Document add-to-history. + +2006-05-05 Eli Zaretskii <eliz@gnu.org> + + * internals.texi (Pure Storage): Mention the pure overflow message + at startup. + +2006-05-05 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> + + * keymaps.texi (Active Keymaps): Fix pseudo-Lisp syntax. + (Searching Keymaps): Fix pseudo-Lisp description of keymap + search. + +2006-05-01 Richard Stallman <rms@gnu.org> + + * intro.texi (nil and t): Clarify. + + * variables.texi (File Local Variables): Suggest using booleanp. + +2006-05-01 Juanma Barranquero <lekktu@gmail.com> + + * objects.texi (Type Predicates): Fix typos. + +2006-05-01 Stefan Monnier <monnier@iro.umontreal.ca> + + * intro.texi (nil and t): Add booleanp. + + * objects.texi (Type Predicates): Add links for booleanp and + string-or-null-p. + +2006-04-29 Richard Stallman <rms@gnu.org> + + * modes.texi (Multiline Font Lock): Rename from + Multi line Font Lock Elements. Much clarification. + (Font Lock Multiline, Region to Fontify): Much clarification. + +2006-04-29 Stefan Monnier <monnier@iro.umontreal.ca> + + * variables.texi (File Local Variables): Remove the special case t for + safe-local-variable. + +2006-04-26 Richard Stallman <rms@gnu.org> + + * syntax.texi (Parsing Expressions): Minor cleanup. + +2006-04-18 Richard Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Explain when the package's + prefix should appear later on (not at the start of the name). + + * searching.texi (String Search): Clarify effect of NOERROR. + + * modes.texi (Imenu): Clarify what special items do. + + * hooks.texi (Standard Hooks): Delete text about old hook names. + +2006-04-17 Romain Francoise <romain@orebokech.com> + + * variables.texi (Local Variables): Update the default value of + `max-specpdl-size'. + +2006-04-15 Michael Olson <mwolson@gnu.org> + + * processes.texi (Transaction Queues): Mention the new optional + `delay-question' argument for `tq-enqueue'. + +2006-04-13 Bill Wohler <wohler@newt.com> + + * customize.texi (Common Keywords): Use dotted notation for + :package-version value. Specify its values. Improve documentation + for customize-package-emacs-version-alist. + +2006-04-12 Bill Wohler <wohler@newt.com> + + * customize.texi (Common Keywords): Move description of + customize-package-emacs-version-alist to @defvar. + +2006-04-10 Bill Wohler <wohler@newt.com> + + * customize.texi (Common Keywords): Add :package-version. + +2006-04-10 Kim F. Storm <storm@cua.dk> + + * text.texi (Buffer Contents): Add NOPROPS arg to + filter-buffer-substring. + +2006-04-08 Kevin Ryde <user42@zip.com.au> + + * os.texi (Command-Line Arguments): Update xref to emacs manual + "Command Arguments" -> "Emacs Invocation", per change there. + +2006-04-08 Thien-Thi Nguyen <ttn@gnu.org> + + * display.texi (Other Display Specs): Arrange a @code{DOTTED-LIST} to + be on one line to help makeinfo not render two spaces after the dot. + +2006-04-07 Reiner Steib <Reiner.Steib@gmx.de> + + * strings.texi (Predicates for Strings): Add string-or-null-p. + +2006-03-28 Kim F. Storm <storm@cua.dk> + + * processes.texi (Accepting Output): Remove obsolete (and incorrect) + remarks about systems that don't support fractional seconds. + +2006-03-25 Karl Berry <karl@gnu.org> + + * elisp.texi: Use @copyright{} instead of (C), and do not indent + the year list. + +2006-03-21 Nick Roberts <nickrob@snap.net.nz> + + * display.texi (Fringe Indicators): Fix typos. + +2006-03-19 Luc Teirlinck <teirllm@auburn.edu> + + * tips.texi (Documentation Tips): One can now also write `program' + in front of a quoted symbol in a docstring to prevent making a + hyperlink. + +2006-03-19 Alan Mackenzie <acm@muc.de> + + * text.texi (Special Properties): Clarify `fontified' property. + +2006-03-16 Richard Stallman <rms@gnu.org> + + * display.texi (Defining Images): Minor cleanup. + +2006-03-16 Bill Wohler <wohler@newt.com> + + * display.texi (Defining Images): In image-load-path-for-library, + prefer user's images. + +2006-03-15 Stefan Monnier <monnier@iro.umontreal.ca> + + * modes.texi (Region to Fontify): Remove font-lock-lines-before. + +2006-03-15 Bill Wohler <wohler@newt.com> + + * display.texi (Defining Images): Fix example in + image-load-path-for-library by not recommending that one binds + image-load-path. Just defvar it to placate compiler and only use + it if previously defined. + +2006-03-14 Bill Wohler <wohler@newt.com> + + * display.texi (Defining Images): In image-load-path-for-library, + always return list of directories. Update example. + +2006-03-14 Alan Mackenzie <acm@muc.de> + + * modes.texi: New node, "Region to Fontify" (for Font Lock). + This describes font-lock-extend-region-function. + ("Other Font Lock Variables"): Move "font-lock-lines-before" to + the new node "Region to Fontify". + +2006-03-13 Richard Stallman <rms@gnu.org> + + * display.texi (Invisible Text): The impossible position is + now before the invisible text, not after. + (Defining Images): Clean up last change. + +2006-03-11 Bill Wohler <wohler@newt.com> + + * display.texi (Defining Images): Add image-load-path-for-library. + +2006-03-11 Luc Teirlinck <teirllm@auburn.edu> + + * text.texi (Adaptive Fill): Fix Texinfo usage. + + * strings.texi (Creating Strings): Fix Texinfo usage. + + * searching.texi (Regexp Special): Use @samp for regular + expressions that are not in Lisp syntax. + +2006-03-08 Luc Teirlinck <teirllm@auburn.edu> + + * searching.texi (Regexp Special): Put remark between parentheses + to avoid misreading. + +2006-03-07 Luc Teirlinck <teirllm@auburn.edu> + + * searching.texi (Syntax of Regexps): More accurately describe + which characters are special in which situations. + (Regexp Special): Recommend _not_ to quote `]' or `-' when they + are not special. Describe in detail when `[' and `]' are special. + (Regexp Backslash): Plenty of regexps with unbalanced square + brackets are valid, so reword that statement. + +2006-03-02 Kim F. Storm <storm@cua.dk> + + * keymaps.texi (Tool Bar): Add tool-bar-border. + +2006-02-28 Luc Teirlinck <teirllm@auburn.edu> + + * loading.texi (Load Suffixes): Rephrase last paragraph. Fix typos. + +2006-02-27 Luc Teirlinck <teirllm@auburn.edu> + + * elisp.texi (Top): Include "Load Suffixes" in the detailed menu. + + * files.texi (Locating Files): Suggest additional values for the + SUFFIXES arg of `locate-file'. Update pxref. + + * loading.texi (Loading): Include new node "Load Suffixes" in menu. + (How Programs Do Loading): Discuss the effects of Auto Compression + mode on `load'. + (Load Suffixes): New node. + (Library Search): Delete description of `load-suffixes'; it was + moved to "Load Suffixes". + (Autoload, Named Features): Mention `load-suffixes'. + +2006-02-21 Giorgos Keramidas <keramida@ceid.upatras.gr> (tiny change) + + * display.texi (Fringe Indicators, Fringe Cursors): Fix typos. + + * windows.texi (Window Tree): Fix typo. + +2006-02-20 Kim F. Storm <storm@cua.dk> + + * display.texi (Fringe Indicators): New section. + Move indicate-empty-lines, indicate-buffer-boundaries, and + default-indicate-buffer-boundaries here. + Add fringe-indicator-alist and default-fringes-indicator-alist. + Add list of logical fringe indicator symbols. + Update list of standard bitmap names. + (Fringe Cursors): New section. + Move overflow-newline-into-fringe here. + Add fringe-cursor-alist and default-fringes-cursor-alist. + Add list of fringe cursor symbols. + +2006-02-20 Juanma Barranquero <lekktu@gmail.com> + + * commands.texi (Using Interactive): Fix reference to node + "Minibuffers". + +2006-02-19 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (High-Level Completion): + Add xref to read-input-method-name. + + * files.texi (Relative File Names): Move file-relative-name here. + (File Name Expansion): From here. Minor clarifications. + + * commands.texi (Using Interactive): Add xrefs about reading input. + Clarify remarks about that moving point and mark. + Put string case before list case. + +2006-02-16 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> + + * display.texi (Other Display Specs, Image Descriptors): + Revert erroneous changes. The previous description of + image-descriptors as `(image . PROPS)' was correct. + +2006-02-14 Richard M. Stallman <rms@gnu.org> + + * variables.texi (File Local Variables): Clarifications. + +2006-02-14 Juanma Barranquero <lekktu@gmail.com> + + * variables.texi (File Local Variables): Use @code for a cons + cell, not @var. + +2006-02-13 Chong Yidong <cyd@stupidchicken.com> + + * variables.texi (File Local Variables): Document new file local + variable behavior. + +2006-02-10 Kim F. Storm <storm@cua.dk> + + * eval.texi (Function Indirection): Add NOERROR to indirect-function. + +2006-02-08 Juanma Barranquero <lekktu@gmail.com> + + * modes.texi (%-Constructs): Remove obsolete info about + `global-mode-string'. + +2006-02-07 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Prefix Command Arguments): Minor cleanup. + + * display.texi: "Graphical display", not window system. + + * functions.texi (What Is a Function): Fix xref. + + * keymaps.texi (Key Lookup): Clarify wrt commands vs other functions. + (Changing Key Bindings): Clarify when remapping is better than + substitute-key-definition. + +2006-02-02 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (Basic Completion): Completion alists are risky. + + * keymaps.texi (Active Keymaps): Clarifications. + (Searching Keymaps): New node. + (Keymaps): Update menu. + + * frames.texi (Layout Parameters): Minor clarification. + (Drag and Drop): New node. + (Frames): Update menu. + +2006-01-29 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Other Display Specs, Image Descriptors): + Image description is a list, not a cons cell. + +2006-01-28 Luc Teirlinck <teirllm@auburn.edu> + + * lists.texi (Cons Cells): Minor correction (the cdr of a dotted + list is not necessarily a list). + +2006-01-27 Eli Zaretskii <eliz@gnu.org> + + * frames.texi (Layout Parameters): border-width and + internal-border-width belong to the frame, not the window. + +2006-01-19 Richard M. Stallman <rms@gnu.org> + + * nonascii.texi (Translation of Characters): Search cmds use + translation-table-for-input. Automatically made local. + + * markers.texi (Overview of Markers): Count insertion type + as one of a marker's attributes. + + * keymaps.texi (Controlling Active Maps): New node, split out of + Active Keymaps. + (Keymaps): Menu updated. + (Active Keymaps): Give pseudocode to explain how the active + maps are searched. current-active-maps and key-binding moved here. + (Functions for Key Lookup): current-active-maps and key-binding moved. + Clarifications. + (Searching the Keymaps): New subnode. + + * elisp.texi (Top): Menu clarification. + + * display.texi (Other Display Specs): Delete duplicate entry for + just a string as display spec. Move text about recursive display + specs on such a string. + + * commands.texi (Key Sequence Input): Clarify. + Move num-nonmacro-input-events out. + (Reading One Event): num-nonmacro-input-events moved here. + +2006-01-14 Nick Roberts <nickrob@snap.net.nz> + + * advice.texi (Simple Advice): Update example to fit argument + change in previous-line. + +2006-01-05 Richard M. Stallman <rms@gnu.org> + + * markers.texi (The Mark): Fix in `mark'. + +2006-01-04 Richard M. Stallman <rms@gnu.org> + + * processes.texi (Misc Network, Make Network): Minor cleanups. + +2006-01-04 Kim F. Storm <storm@cua.dk> + + * processes.texi (Make Network): Add IPv6 addresses and handling. + (Network Feature Testing): Mention (:family ipv6). + (Misc Network): Add IPv6 formats to format-network-address. + +2005-12-30 Richard M. Stallman <rms@gnu.org> + + * text.texi (Changing Properties): + Don't use return value of set-text-properties. + +2005-12-29 Luc Teirlinck <teirllm@auburn.edu> + + * modes.texi (Mode Line Format): Correct typo in menu. + +2005-12-29 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Mode Line Top): New node. + (Mode Line Data): Some text moved to new node. + Explain the data structure more concretely. + (Mode Line Basics): Clarifications. + (Mode Line Variables): Clarify intro paragraph. + (%-Constructs): Clarify intro paragraph. + (Mode Line Format): Update menu. + +2005-12-28 Luc Teirlinck <teirllm@auburn.edu> + + * minibuf.texi (Basic Completion): Update lazy-completion-table + examples for removal of ARGS argument. + +2005-12-23 Richard M. Stallman <rms@gnu.org> + + * text.texi (Undo): Restore some explanation from the version + that was deleted. + +2005-12-23 Eli Zaretskii <eliz@gnu.org> + + * text.texi (Undo): Remove duplicate descriptions of `apply + funname' and `apply delta' elements of the undo list. + +2005-12-20 Richard M. Stallman <rms@gnu.org> + + * help.texi (Help Functions): Update documentation of `apropos'. + +2005-12-20 Luc Teirlinck <teirllm@auburn.edu> + + * customize.texi (Type Keywords): Delete xref to "Text help-echo", + because it is confusing. If the :help-echo keyword is a function, + it is not directly used as the :help-echo overlay property, as the + xref seems to suggest (it does not take the appropriate args). + +2005-12-19 Luc Teirlinck <teirllm@auburn.edu> + + * customize.texi (Common Keywords): Fix Texinfo usage. + (Group Definitions, Variable Definitions): Update for new + conventions for using `*' in docstrings. + + * tips.texi (Documentation Tips): Update for new conventions for + using `*' in docstrings. + +2005-12-16 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (Minibuffer Contents): Minor cleanup. + +2005-12-16 Juri Linkov <juri@jurta.org> + + * minibuf.texi (Minibuffer Contents): Add minibuffer-completion-contents. + +2005-12-14 Romain Francoise <romain@orebokech.com> + + * modes.texi (Customizing Keywords): Rename `append' to `how'. + Fix typo. + +2005-12-11 Juri Linkov <juri@jurta.org> + + * minibuf.texi (Completion Commands): Add mention of read-file-name + for filename completion keymaps. + (Reading File Names): Add mention of filename completion keymaps + for read-file-name and xref to `Completion Commands'. + +2005-12-10 Richard M. Stallman <rms@gnu.org> + + * customize.texi (Common Keywords): State caveats for use of :tag. + +2005-12-08 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (Intro to Minibuffers): Replace list of local maps + with xrefs and better explanation. + (Completion Commands): Add the filename completion maps. + + * objects.texi (Character Type): Clarify that \s is not space + if a dash follows. + +2005-12-05 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Resizing Windows): Delete preserve-before args. + +2005-12-05 Stefan Monnier <monnier@iro.umontreal.ca> + + * keymaps.texi (Format of Keymaps): Remove mention of a quirk + in full keymaps, since the quirk has been fixed. + +2005-12-03 Eli Zaretskii <eliz@gnu.org> + + * hooks.texi (Standard Hooks): Add index entries. Mention + `compilation-finish-functions'. + +2005-11-27 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Resizing Windows): Add adjust-window-trailing-edge. + +2005-11-21 Juri Linkov <juri@jurta.org> + + * customize.texi (Common Keywords): Update links types + custom-manual and url-link. Add link types emacs-library-link, + file-link, function-link, variable-link, custom-group-link. + +2005-11-20 Chong Yidong <cyd@stupidchicken.com> + + * display.texi: Revert 2005-11-20 change. + +2005-11-20 Thien-Thi Nguyen <ttn@gnu.org> + + * processes.texi (Bindat Functions): + Say "third" to refer to zero-based index "2". + +2005-11-18 Luc Teirlinck <teirllm@auburn.edu> + + * loading.texi (Library Search): Update the default value of + `load-suffixes'. + +2005-11-17 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Attribute Functions): Mention :ignore-defface. + +2005-11-16 Stefan Monnier <monnier@iro.umontreal.ca> + + * modes.texi (Minor Mode Conventions): Use custom-set-minor-mode. + (Minor Mode Conventions): Mention the use of a hook. + +2005-11-06 Richard M. Stallman <rms@gnu.org> + + * files.texi (Magic File Names): find-file-name-handler checks the + `operations' property of the handler. + +2005-11-03 Richard M. Stallman <rms@gnu.org> + + * variables.texi (Frame-Local Variables): Small clarification. + +2005-10-29 Chong Yidong <cyd@stupidchicken.com> + + * os.texi (Init File): Document ~/.emacs.d/init.el. + +2005-10-29 Richard M. Stallman <rms@gnu.org> + + * internals.texi (Garbage Collection): Document memory-full. + +2005-10-28 Bill Wohler <wohler@newt.com> + + * tips.texi (Documentation Tips): Help mode now creates hyperlinks + for URLs. + +2005-10-28 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (Completion Commands): Clean up prev change. + +2005-10-26 Kevin Ryde <user42@zip.com.au> + + * compile.texi (Eval During Compile): Explain recommended uses + of eval-when-compile and eval-and-compile. + +2005-10-27 Masatake YAMATO <jet@gyve.org> + + * minibuf.texi (Completion Commands): + Write about new optional argument for `display-completion-list'. + +2005-10-23 Richard M. Stallman <rms@gnu.org> + + * display.texi (Overlay Arrow): Clarify about local bindings of + overlay-arrow-position. + +2005-10-22 Eli Zaretskii <eliz@gnu.org> + + * internals.texi (Building Emacs): Fix last change. + +2005-10-22 Richard M. Stallman <rms@gnu.org> + + * internals.texi (Building Emacs): Document eval-at-startup. + +2005-10-21 Richard M. Stallman <rms@gnu.org> + + * loading.texi (Where Defined): load-history contains abs file names. + symbol-file returns abs file names. + +2005-10-19 Kim F. Storm <storm@cua.dk> + + * display.texi (Showing Images): Add max-image-size integer value. + +2005-10-18 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Showing Images): Document max-image-size. + +2005-10-17 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Quitting): Minor clarification. + + * processes.texi (Sentinels): Clarify about output and quitting. + (Filter Functions): Mention with-local-quit. + +2005-10-17 Juri Linkov <juri@jurta.org> + + * buffers.texi (Current Buffer): + * commands.texi (Event Input Misc): + * compile.texi (Eval During Compile, Compiler Errors): + * customize.texi (Group Definitions): + * display.texi (Progress, Defining Faces): + * files.texi (Writing to Files): + * modes.texi (Mode Hooks, Defining Minor Modes): + * streams.texi (Output Functions): + * syntax.texi (Syntax Table Functions): + * text.texi (Change Hooks): + Replace `...' with `@dots{}' in `@defmac' and `@defspec'. + + * commands.texi (Quitting): Replace arg `forms' with `body' in + `with-local-quit'. + + * positions.texi (Excursions): Replace arg `forms' with `body' in + `save-excursion'. + +2005-10-08 Kim F. Storm <storm@cua.dk> + + * windows.texi (Window Tree): Rename window-split-tree to window-tree. + Rename manual section accordingly. + +2005-10-04 Kim F. Storm <storm@cua.dk> + + * windows.texi (Window Split Tree): New section describing + new function window-split-tree function. + +2005-10-03 Nick Roberts <nickrob@snap.net.nz> + + * display.texi (Fringe Size/Pos): Simplify and add detail. + +2005-09-30 Romain Francoise <romain@orebokech.com> + + * minibuf.texi (High-Level Completion): Explain that the prompt + given to `read-buffer' should end with a colon and a space. + Update usage examples. + +2005-09-29 Juri Linkov <juri@jurta.org> + + * display.texi (Displaying Messages): Rename argument name + `string' to `format-string' in functions `message', `message-box', + `message-or-box'. + +2005-09-26 Chong Yidong <cyd@stupidchicken.com> + + * errors.texi (Standard Errors): Correct xrefs. + +2005-09-18 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Defining Images): Update documentation for + `image-load-path'. + +2005-09-17 Richard M. Stallman <rms@gnu.org> + + * display.texi (Defining Images): Clean up previous change. + +2005-09-16 Romain Francoise <romain@orebokech.com> + + * elisp.texi: Specify GFDL version 1.2. + + * doclicense.texi (GNU Free Documentation License): Update to + version 1.2. + +2005-09-15 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Defining Images): Document `image-load-path'. + +2005-09-15 Richard M. Stallman <rms@gnu.org> + + * objects.texi (Printed Representation): Minor cleanup. + (Box Diagrams): Minor fix. + (Cons Cell Type): Move (...) index item here. + (Box Diagrams): From here. + (Array Type): Minor fix. + (Type Predicates): Delete index "predicates". + (Hash Table Type): Clarify xref. + (Dotted Pair Notation): Minor fix. + +2005-09-10 Chong Yidong <cyd@stupidchicken.com> + + * files.texi (Saving Buffers): Fix typo. + +2005-09-08 Richard M. Stallman <rms@gnu.org> + + * tips.texi (Programming Tips): Correct the "default" prompt spec. + +2005-09-08 Chong Yidong <cyd@stupidchicken.com> + + * locals.texi (Standard Buffer-Local Variables): Don't include + mode variables for minor modes. + Fix xrefs for buffer-display-count, buffer-display-table, + buffer-offer-save, buffer-saved-size, cache-long-line-scans, + enable-multibyte-characters, fill-column, header-line-format, + left-fringe-width, left-margin, and right-fringe-width. + + * hooks.texi (Standard Hooks): All hooks should conform to the + standard naming convention now. + Fix xref for `echo-area-clear-hook'. + + * display.texi (Usual Display): Note that indicate-empty-lines and + tab-width are buffer-local. + + * files.texi (Saving Buffers): Add xref to `Killing Buffers'. + + * modes.texi (Mode Help): Note that major-mode is buffer-local. + + * nonascii.texi (Encoding and I/O): Note that + buffer-file-coding-system is buffer-local. + + * positions.texi (List Motion): Note that defun-prompt-regexp is + buffer-local. + + * text.texi (Auto Filling): Note that auto-fill-function is + buffer-local. + (Undo): Note that buffer-undo-list is buffer-local. + + * windows.texi (Buffers and Windows): Document + buffer-display-count. + +2005-09-06 Richard M. Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Sometimes it is ok to put the + package prefix elsewhere than at the start of the name. + +2005-09-03 Richard M. Stallman <rms@gnu.org> + + * tips.texi (Programming Tips): Add conventions for minibuffer + questions and prompts. + +2005-09-03 Joshua Varner <jlvarner@gmail.com> (tiny change) + + * intro.texi (nil and t): Minor cleanup. + Delete spurious mention of keyword symbols. + (Evaluation Notation): Add index entry. + (A Sample Function Description): Minor cleanup. + (A Sample Variable Description): Not all vars can be set. + +2005-09-03 Thien-Thi Nguyen <ttn@gnu.org> + + * text.texi (Buffer Contents): Use "\n" in examples' result strings. + + (Insertion): Document precise type of `insert-char' arg COUNT. + +2005-09-02 Stefan Monnier <monnier@iro.umontreal.ca> + + * modes.texi (Other Font Lock Variables): Sync the default of + font-lock-lines-before. + +2005-08-31 Michael Albinus <michael.albinus@gmx.de> + + * files.texi (Magic File Names): Add `make-auto-save-file-name'. + +2005-08-29 Richard M. Stallman <rms@gnu.org> + + * elisp.texi (Top): Update subnode menu. + + * searching.texi (Searching and Matching): Move node. + Rearrange contents and add overall explanation. + (Searching and Case): Move node. + (Searching and Matching): Update menu. + +2005-08-27 Eli Zaretskii <eliz@gnu.org> + + * os.texi (Startup Summary): Fix the description of the initial + startup message display. + +2005-08-25 Richard M. Stallman <rms@gnu.org> + + * searching.texi (Search and Replace): Add replace-regexp-in-string. + +2005-08-25 Emilio C. Lopes <eclig@gmx.net> + + * display.texi (Finding Overlays): Fix `find-overlay-prop' in + `next-overlay-change' example. + +2005-08-22 Juri Linkov <juri@jurta.org> + + * display.texi (Attribute Functions): Add set-face-inverse-video-p. + Fix invert-face. Fix args of face-background. + + * display.texi (Standard Faces): Delete node. + (Faces): Add xref to `(emacs)Standard Faces'. + (Displaying Faces): Fix xref to `Standard Faces'. + + * modes.texi (Mode Line Data): Fix xref to Standard Faces. + +2005-08-20 Alan Mackenzie <acm@muc.de> + + * buffers.texi (The Buffer List): Clarify the manipulation of the + buffer list. + +2005-08-14 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Auto Major Mode): interpreter-mode-alist key is not + a regexp. + +2005-08-11 Richard M. Stallman <rms@gnu.org> + + * elisp.texi (Top): Update subnode lists. + + * display.texi (Inverse Video): Node deleted. + + * tips.texi (Key Binding Conventions, Programming Tips, Warning Tips): + New nodes split out of Coding Conventions. + + * searching.texi (Regular Expressions): Document re-builder. + + * os.texi (Time Parsing): New node split out of Time Conversion. + + * processes.texi (Misc Network, Network Feature Testing) + (Network Options, Make Network): New nodes split out of + Low-Level Network. + +2005-08-09 Richard M. Stallman <rms@gnu.org> + + * frames.texi (Geometry): New node, split from Size and Position. + (Frame Parameters): Refer to Geometry. + + * buffers.texi (The Buffer List): Fix xrefs. + + * windows.texi (Splitting Windows): Fix xref. + + * frames.texi (Layout Parameters): Add xref. + + * display.texi (Line Height, Scroll Bars): Fix xrefs. + + * keymaps.texi (Menu Bar): Fix xref. + + * locals.texi (Standard Buffer-Local Variables): Fix xref. + + * modes.texi (%-Constructs): Fix xref. + + * frames.texi (Window Frame Parameters): Node split up. + (Basic Parameters, Position Parameters, Size Parameters) + (Layout Parameters, Buffer Parameters, Management Parameters) + (Cursor Parameters, Color Parameters): New subnodes. + +2005-08-09 Luc Teirlinck <teirllm@auburn.edu> + + * positions.texi (Screen Lines): Update xref for previous change + in minibuf.texi. + + * minibuf.texi (Intro to Minibuffers): Update pxref for previous + change in minibuf.texi. + +2005-08-09 Richard M. Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Minor cleanup. + + * modes.texi (Defining Minor Modes): Explain when init-value + can be non-nil. + + * elisp.texi (Top): Update submenu for Minibuffer. + + * minibuf.texi (Minibuffer Misc): Node split up. + (Minibuffer Commands, Minibuffer Windows, Minibuffer Contents) + (Recursive Mini): New nodes split out from Minibuffer Misc. + (Minibuffer Misc): Document max-mini-window-height. + + * hash.texi (Defining Hash): Delete stray paren in example. + + * display.texi (Echo Area Customization): Don't define + max-mini-window-height here; xref instead. + + * commands.texi (Event Input Misc): Update while-no-input. + + * advice.texi (Advising Functions): Explain when to use advice + and when to use a hook. + +2005-07-30 Eli Zaretskii <eliz@gnu.org> + + * makefile.w32-in (info): Don't run install-info. + ($(infodir)/dir): New target, produced by running install-info. + +2005-07-27 Luc Teirlinck <teirllm@auburn.edu> + + * modes.texi (Defining Minor Modes): The keyword for the initial + value is :init-value, not :initial-value. + +2005-07-23 Eli Zaretskii <eliz@gnu.org> + + * loading.texi (Autoload): Make the `doctor' example be consistent + with what's in current loaddefs.el. Describe the "fn" magic in + the usage portion of the doc string. + +2005-07-22 Richard M. Stallman <rms@gnu.org> + + * internals.texi (Garbage Collection): Clarify previous change. + +2005-07-21 Stefan Monnier <monnier@iro.umontreal.ca> + + * internals.texi (Garbage Collection): Add gc-cons-percentage. + +2005-07-18 Juri Linkov <juri@jurta.org> + + * commands.texi (Accessing Events): + * frames.texi (Text Terminal Colors, Resources): + * markers.texi (The Mark): + * modes.texi (Defining Minor Modes): + Delete duplicate duplicate words. + +2005-07-16 Richard M. Stallman <rms@gnu.org> + + * display.texi (Managing Overlays): Clarify make-overlay + args for insertion types. + +2005-07-13 Luc Teirlinck <teirllm@auburn.edu> + + * customize.texi (Variable Definitions): + Add `custom-initialize-safe-set' and `custom-initialize-safe-default'. + `standard-value' is a list too. + (Defining New Types): Use @key{RET} instead of @key{ret}. + +2005-07-13 Francis Litterio <franl@world.std.com> (tiny change) + + * os.texi (Translating Input): Fix typo. + +2005-07-08 Richard M. Stallman <rms@gnu.org> + + * README: Update edition number and size estimate. + + * elisp.texi (VERSION): Set to 2.9. + +2005-07-07 Richard M. Stallman <rms@gnu.org> + + * book-spine.texinfo: Update Emacs version. + + * display.texi (Inverse Video): Delete mode-line-inverse-video. + +2005-07-06 Richard M. Stallman <rms@gnu.org> + + * searching.texi (Regexp Search): Clarify what re-search-forward + does when the search fails. + +2005-07-05 Lute Kamstra <lute@gnu.org> + + * Update FSF's address in GPL notices. + + * doclicense.texi (GNU Free Documentation License): + * gpl.texi (GPL): + * tips.texi (Coding Conventions, Library Headers): + * vol1.texi: + * vol2.texi: Update FSF's address. + +2005-07-04 Richard M. Stallman <rms@gnu.org> + + * hooks.texi (Standard Hooks): Add occur-hook. + +2005-07-03 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi (The Echo Area): Correct menu. + +2005-07-03 Richard M. Stallman <rms@gnu.org> + + * elisp.texi (Top): Update subnode menu for Display. + + * display.texi (Displaying Messages): New node, with most + of what was in The Echo Area. + (Progress): Moved under The Echo Area. + (Logging Messages): New node with new text. + (Echo Area Customization): New node, the rest of what was + in The Echo Area. Document message-truncate-lines with @defvar. + (Display): Update menu. + + * windows.texi (Textual Scrolling): Doc 3 values for + scroll-preserve-screen-position. + + * text.texi (Special Properties): Change hook functions + should bind inhibit-modification-hooks around altering buffer text. + + * keymaps.texi (Key Binding Commands): Call binding BINDING + rather than DEFINITION. + +2005-06-29 Juanma Barranquero <lekktu@gmail.com> + + * variables.texi (Defining Variables): `user-variable-p' returns t + for aliases of user options, nil for alias loops. + +2005-06-28 Richard M. Stallman <rms@gnu.org> + + * keymaps.texi (Creating Keymaps): Put make-sparse-keymap before + make-keymap. + +2005-06-27 Luc Teirlinck <teirllm@auburn.edu> + + * variables.texi (Setting Variables): Correct and clarify + description of `add-to-ordered-list'. + +2005-06-26 Richard M. Stallman <rms@gnu.org> + + * display.texi (Faces): Minor cleanup. + +2005-06-25 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi (Faces): `facep' returns t for strings that are + face names. + +2005-06-25 Richard M. Stallman <rms@gnu.org> + + * objects.texi (Equality Predicates): Clarify meaning of equal. + + * windows.texi (Selecting Windows): save-selected-window + and with-selected-window save and restore the current buffer. + +2005-06-24 Richard M. Stallman <rms@gnu.org> + + * numbers.texi (Float Basics): Explain how to test for NaN, + and printing the sign of NaNs. + +2005-06-24 Eli Zaretskii <eliz@gnu.org> + + * makefile.w32-in (MAKEINFO): Use --force. + +2005-06-23 Richard M. Stallman <rms@gnu.org> + + * display.texi (Face Functions): Correct Texinfo usage. + +2005-06-23 Luc Teirlinck <teirllm@auburn.edu> + + * lists.texi (Rings): `ring-elements' now returns the elements of + RING in order. + +2005-06-23 Juanma Barranquero <lekktu@gmail.com> + + * markers.texi (The Mark): Texinfo usage fix. + +2005-06-23 Kim F. Storm <storm@cua.dk> + + * searching.texi (Entire Match Data): Remove evaporate option for + match-data. Do not mention evaporate option for set-match-data. + +2005-06-22 Glenn Morris <gmorris@ast.cam.ac.uk> + + * display.texi (Face Functions): Mention face aliases. + +2005-06-21 Richard M. Stallman <rms@gnu.org> + + * anti.texi (Antinews): Texinfo usage fix. + +2005-06-21 Karl Berry <karl@gnu.org> + + * elisp.texi: Use @copying. + + * elisp.texi: Put @summarycontents and @contents before the Top + node, instead of the end of the file, so that the contents appear + in the right place in the dvi/pdf output. + +2005-06-21 Juri Linkov <juri@jurta.org> + + * display.texi (Defining Faces): Add `customized-face'. + +2005-06-20 Kim F. Storm <storm@cua.dk> + + * variables.texi (Setting Variables): Any type of element can be + given order in add-to-ordered-list. Compare elements with eq. + + * lists.texi (Rearrangement): Sort predicate may just return non-nil. + +2005-06-20 Karl Berry <karl@gnu.org> + + * syntax.texi (Syntax Flags): Make last column very slightly wider + to avoid "generic comment" breaking on two lines and causing an + underfull box. + +2005-06-19 Luc Teirlinck <teirllm@auburn.edu> + + * lists.texi (Rings): Various minor clarifications and corrections. + +2005-06-18 Richard M. Stallman <rms@gnu.org> + + * functions.texi (Obsolete Functions): Simplify. + + * variables.texi (Variable Aliases): Simplify. + + * anti.texi, backups.texi, compile.texi, customization.texi: + * debugging.texi, display.texi, edebug.texi, errors.texi, frames.texi: + * functions.texi, help.texi, keymaps.texi, modes.texi, nonascii.texi: + * os.texi, processes.texi, searching.texi, strings.texi, text.texi: + * variables.texi: Fix formatting ugliness. + + * elisp.texi: Add links to Rings and Byte Packing. + Update version and copyright years. + + * minibuf.texi: Fix formatting ugliness. + (Completion Commands): Move keymap vars to the end + and vars completing-read binds to the top. + +2005-06-17 Luc Teirlinck <teirllm@auburn.edu> + + * processes.texi: Fix typos. + (Bindat Spec): Correct Texinfo error. + (Byte Packing): Fix ungrammatical sentence. + +2005-06-17 Thien-Thi Nguyen <ttn@gnu.org> + + * lists.texi (Rings): New node. + (Lists): Add it to menu. + + * processes.texi (Byte Packing): New node. + (Processes): Add it to menu. + +2005-06-17 Richard M. Stallman <rms@gnu.org> + + * syntax.texi (Parsing Expressions): Fix texinfo usage. + + * help.texi (Documentation Basics): Explain the xref to + Documentation Tips. + + * debugging.texi (Debugger Commands): Minor fix. + +2005-06-16 Luc Teirlinck <teirllm@auburn.edu> + + * edebug.texi (Instrumenting): Eliminate duplicate link. + (Specification List): Replace references to "below", referring to + a later node, with one @ref to that node. + + * os.texi (Timers): Timers should save and restore the match data + if they change it. + + * debugging.texi (Debugger Commands): Mention that the Lisp + debugger can not step through primitive functions. + +2005-06-16 Juanma Barranquero <lekktu@gmail.com> + + * functions.texi (Obsolete Functions): Update argument names of + `make-obsolete' and `define-obsolete-function-alias'. + + * variables.texi (Variable Aliases): Update argument names of + `defvaralias', `make-obsolete-variable' and + `define-obsolete-variable-alias'. + +2005-06-15 Kim F. Storm <storm@cua.dk> + + * searching.texi (Entire Match Data): Rephrase warnings about + evaporate arg to match-data and set-match-data. + +2005-06-14 Luc Teirlinck <teirllm@auburn.edu> + + * elisp.texi (Top): Update detailed menu. + + * edebug.texi (Edebug): Update menu. + (Instrumenting): Update xrefs. + (Edebug Execution Modes): Correct xref. + (Jumping): Clarify description of `h' command. + Eliminate redundant @ref. + (Breaks): New node. + (Breakpoints): Is now a subsubsection. + (Global Break Condition): Mention `C-x X X'. + (Edebug Views): Clarify `v' and `p'. Mention `C-x X w'. + (Trace Buffer): Clarify STRING arg of `edebug-tracing'. + (Edebug Display Update): Correct pxref. + (Edebug and Macros): New node. + (Instrumenting Macro Calls): Is now a subsubsection. + Neither arg of `def-edebug-spec' is evaluated. + (Instrumenting Macro Calls): Mention `edebug-eval-macro-args'. + (Specification Examples): Fix typo. + +2005-06-14 Lute Kamstra <lute@gnu.org> + + * debugging.texi (Function Debugging): Primitives can break on + entry too. + +2005-06-14 Kim F. Storm <storm@cua.dk> + + * variables.texi (Setting Variables): Add add-to-ordered-list. + +2005-06-13 Stefan Monnier <monnier@iro.umontreal.ca> + + * syntax.texi (Parsing Expressions): Document aux functions and vars of + syntax-ppss: syntax-ppss-flush-cache and syntax-begin-function. + +2005-06-13 Lute Kamstra <lute@gnu.org> + + * text.texi (Special Properties): Fix cross reference. + +2005-06-11 Luc Teirlinck <teirllm@auburn.edu> + + * debugging.texi (Function Debugging): Delete mention of empty + string argument to `cancel-debug-on-entry'. Delete inaccurate + description of the return value of that command. + +2005-06-11 Alan Mackenzie <acm@muc.de> + + * text.texi (Adaptive Fill): Amplify the description of + fill-context-prefix. + +2005-06-10 Luc Teirlinck <teirllm@auburn.edu> + + * syntax.texi (Parsing Expressions): Fix Texinfo error. + +2005-06-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * syntax.texi (Parsing Expressions): Document syntax-ppss. + +2005-06-10 Luc Teirlinck <teirllm@auburn.edu> + + * debugging.texi (Error Debugging): Minor rewording. + (Function Debugging): FUNCTION-NAME arg to `cancel-debug-on-entry' + is optional. + +2005-06-10 Lute Kamstra <lute@gnu.org> + + * elisp.texi: Use EMACSVER to refer to the current version of Emacs. + (Top): Give it a title. Correct version number. Give the + detailed node listing a more prominent header. + * intro.texi: Don't set VERSION here a second time. + Mention Emacs's version too. + * anti.texi (Antinews): Use EMACSVER to refer to the current + version of Emacs. + +2005-06-09 Kim F. Storm <storm@cua.dk> + + * searching.texi (Entire Match Data): Explain new `reseat' argument to + match-data and set-match-data. + +2005-06-08 Richard M. Stallman <rms@gnu.org> + + * searching.texi (Entire Match Data): Clarify when match-data + returns markers and when integers. + + * display.texi (Defining Faces): Explain that face name should not + end in `-face'. + + * modes.texi (Mode Line Data): Minor cleanup. + (Customizing Keywords): Node split out of Search-based Fontification. + Add example of using font-lock-add-keywords from a hook. + Clarify when MODE should be non-nil, and when nil. + +2005-06-06 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Mode Line Data): Explain what happens when the car + of a list is a void symbol. + (Search-based Fontification): Explain MODE arg to + font-lock-add-keywords and warn about calls from major modes. + +2005-06-08 Juri Linkov <juri@jurta.org> + + * display.texi (Standard Faces): Add `shadow' face. + +2005-05-29 Luc Teirlinck <teirllm@auburn.edu> + + * modes.texi (Major Mode Conventions): A derived mode only needs + to put the call to the parent mode inside `delay-mode-hooks'. + +2005-05-29 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Mode Hooks): Explain that after-change-major-mode-hook is + new, and what that implies. Clarify. + + * files.texi (Locating Files): Clean up the text. + + * frames.texi (Window Frame Parameters): Document user-size. + Shorten entry for top by referring to left. + +2005-05-26 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Mode Hooks): Explain that after-change-major-mode-hook + is new, and what the implications are. Other clarifications. + +2005-05-24 Richard M. Stallman <rms@gnu.org> + + * frames.texi (Dialog Boxes): Minor fixes. + +2005-05-25 Masatake YAMATO <jet@gyve.org> + + * display.texi (Standard Faces): Write about `mode-line-highlight'. + +2005-05-24 Luc Teirlinck <teirllm@auburn.edu> + + * frames.texi (Dialog Boxes): HEADER argument to `x-popup-dialog' + is optional. + +2005-05-24 Nick Roberts <nickrob@snap.net.nz> + + * frames.texi (Dialog Boxes): Descibe new optional argument. + +2005-05-23 Lute Kamstra <lute@gnu.org> + + * modes.texi (Font Lock Basics, Syntactic Font Lock): Recommend + syntax-begin-function over font-lock-beginning-of-syntax-function. + +2005-05-21 Luc Teirlinck <teirllm@auburn.edu> + + * minibuf.texi (Reading File Names): Update description of + `read-directory-name'. + + * modes.texi (Derived Modes): Clarify :group keyword. + +2005-05-21 Eli Zaretskii <eliz@gnu.org> + + * files.texi (Locating Files): New subsection. + Describe locate-file and executable-find. + +2005-05-21 Kevin Ryde <user42@zip.com.au> + + * frames.texi (Initial Parameters): Update cross reference to + "Emacs Invocation". + +2005-05-19 Luc Teirlinck <teirllm@auburn.edu> + + * keymaps.texi (Active Keymaps): Add anchor. + + * modes.texi (Hooks): Delete confusing and unnecessary sentence. + (Major Mode Conventions): Refer to `Auto Major Mode' in more + appropriate place. + (Derived Modes): Small clarifications. + (Minor Mode Conventions, Keymaps and Minor Modes): + Replace references to nodes with references to anchors. + (Mode Line Data): Warn that `(:eval FORM)' should not load any files. + Clarify description of lists whose first element is an integer. + (Mode Line Variables): Add anchor. + (%-Constructs): Clarify description of integer after %. + (Emulating Mode Line): Describe nil value for FACE. + +2005-05-18 Luc Teirlinck <teirllm@auburn.edu> + + * modes.texi (Derived Modes): Correct references to non-existing + variable standard-syntax-table. + +2005-05-17 Lute Kamstra <lute@gnu.org> + + * modes.texi (Defining Minor Modes): Mention the mode hook. + +2005-05-15 Kim F. Storm <storm@cua.dk> + + * processes.texi (Network): Remove open-network-stream-nowait. + (Network Servers): Remove open-network-stream-server. + +2005-05-15 Luc Teirlinck <teirllm@auburn.edu> + + * elisp.texi (Top): Update detailed menu. + + * variables.texi: Reorder nodes. + (Variables): Update menu. + (File Local Variables): Do not refer to the `-*-' line as + a "local variables list". Add pxref. + +2005-05-14 Luc Teirlinck <teirllm@auburn.edu> + + * elisp.texi (Top): Update detailed menu for node changes. + + * modes.texi (Modes): Update Menu. + (Hooks): Move to beginning of chapter. + Most minor modes run mode hooks too. + `add-hook' can handle void hooks or hooks whose value is a single + function. + (Major Modes): Update Menu. + (Major Mode Basics): New node, split off from `Major Modes'. + (Major Mode Conventions): Correct xref. Explain how to handle + auto-mode-alist if the major mode command has an autoload cookie. + (Auto Major Mode): Major update. Add magic-mode-alist. + (Derived Modes): Major update. + (Mode Line Format): Update Menu. + (Mode Line Basics): New node, split off from `Mode Line Format'. + + * loading.texi (Autoload): Mention `autoload cookie' as synonym + for `magic autoload comment'. Add index entries and anchor. + +2005-05-14 Richard M. Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Explain how important it is + that just loading certain files not change Emacs behavior. + + * modes.texi (Defining Minor Modes): Define define-global-minor-mode. + +2005-05-12 Lute Kamstra <lute@gnu.org> + + * modes.texi (Generic Modes): Update. + (Major Modes): Refer to node "Generic Modes". + + * elisp.texi (Top): Update to the current structure of the manual. + * processes.texi (Processes): Add menu description. + * customize.texi (Customization): Add menu descriptions. + +2005-05-11 Thien-Thi Nguyen <ttn@gnu.org> + + * processes.texi (Signals to Processes) + (Low-Level Network): Fix typos. + +2005-05-11 Lute Kamstra <lute@gnu.org> + + * elisp.texi (Top): Add some nodes from the chapter "Major and + Minor Modes" to the detailed node listing. + +2005-05-10 Richard M. Stallman <rms@gnu.org> + + * keymaps.texi (Extended Menu Items): Menu item filter functions + can be called at any time. + +2005-05-08 Luc Teirlinck <teirllm@auburn.edu> + + * variables.texi (File Local Variables): `(hack-local-variables t)' + now also checks whether a mode is specified in the local variables + list. + +2005-05-05 Kevin Ryde <user42@zip.com.au> + + * display.texi (The Echo Area): Correct format function cross + reference. + +2005-05-05 Luc Teirlinck <teirllm@auburn.edu> + + * variables.texi (Variable Aliases): Change description of + `define-obsolete-variable-alias'. + + * functions.texi (Functions): Add "Obsolete Functions" to menu. + (Defining Functions): Add xref. + (Obsolete Functions): New node. + (Function Safety): Standardize capitalization of section title. + + * frames.texi (Pop-Up Menus): Complete description of `x-popup-menu'. + (Dialog Boxes): Complete description of `x-popup-dialog'. + +2005-05-04 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Interactive Codes): Fix Texinfo usage. + Document U more clearly. + +2005-05-01 Luc Teirlinck <teirllm@auburn.edu> + + * variables.texi (Variable Aliases): `make-obsolete-variable' is a + function and not a macro. + + * frames.texi (Pop-Up Menus): Correct and clarify description of + `x-popup-menu'. + (Dialog Boxes): Clarify description of `x-popup-dialog'. + +2005-05-01 Richard M. Stallman <rms@gnu.org> + + * edebug.texi (Checking Whether to Stop): Fix previous change. + +2005-05-01 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi: Fix typos and Texinfo usage. + + * edebug.texi (Checking Whether to Stop): executing-macro -> + executing-kbd-macro. + +2005-05-01 Richard M. Stallman <rms@gnu.org> + + * display.texi (Invisible Text): Correct add-to-invisibility-spec. + +2005-04-30 Richard M. Stallman <rms@gnu.org> + + * files.texi (Magic File Names): Document `operations' property. + +2005-04-29 Lute Kamstra <lute@gnu.org> + + * modes.texi (Generic Modes): New node. + (Major Modes): Add it to the menu. + (Derived Modes): Add "derived mode" to concept index. + +2005-04-28 Lute Kamstra <lute@gnu.org> + + * modes.texi (Defining Minor Modes): Fix previous change. + (Font Lock Mode): Simplify. + (Font Lock Basics): Say that font-lock-defaults is buffer-local + when set and that some parts are optional. Add cross references. + (Search-based Fontification): Say how to specify font-lock-keywords. + Add cross references. Add font-lock-multiline to index. + Move font-lock-keywords-case-fold-search here from node "Other Font + Lock Variables". Document font-lock-add-keywords and + font-lock-remove-keywords. + (Other Font Lock Variables): Move font-lock-keywords-only, + font-lock-syntax-table, font-lock-beginning-of-syntax-function, + and font-lock-syntactic-face-function to node "Syntactic Font + Lock". Move font-lock-keywords-case-fold-search to node + "Search-based Fontification". Document font-lock-inhibit-thing-lock + and font-lock-{,un}fontify-{buffer,region}-function. + (Precalculated Fontification): Remove reference to deleted variable + font-lock-core-only. + (Faces for Font Lock): Add font-lock-comment-delimiter-face. + (Syntactic Font Lock): Add intro. Move font-lock-keywords-only, + font-lock-syntax-table, font-lock-beginning-of-syntax-function, + and font-lock-syntactic-face-function here from node "Other Font + Lock Variables". Move font-lock-syntactic-keywords to "Setting + Syntax Properties". Add cross references. + (Setting Syntax Properties): New node. + Move font-lock-syntactic-keywords here from "Syntactic Font Lock". + * syntax.texi (Syntax Properties): Add cross reference. + * hooks.texi (Standard Hooks): Add Font-Lock hooks. + +2005-04-26 Richard M. Stallman <rms@gnu.org> + + * display.texi (Defining Faces): + Document `default' elements of defface spec. + + * modes.texi (Major Mode Conventions): Explain customizing ElDoc mode. + + * variables.texi (Variable Aliases): Clarify text. + +2005-04-25 Chong Yidong <cyd@stupidchicken.com> + + * windows.texi (Window Hooks): Remove reference to obsolete Lazy Lock. + +2005-04-25 Luc Teirlinck <teirllm@auburn.edu> + + * hooks.texi (Standard Hooks): Most minor modes have mode hooks too. + +2005-04-24 Eli Zaretskii <eliz@gnu.org> + + * syntax.texi (Syntax Table Internals): Elaborate documentation of + syntax-after and syntax-class. + + * files.texi (Changing Files): Fix last change's cross-reference. + (Unique File Names): Don't mention "numbers" in the documentation + of make-temp-file and make-temp-name. + +2005-04-23 Richard M. Stallman <rms@gnu.org> + + * files.texi (Changing Files): Document MUSTBENEW arg in copy-file. + +2005-04-22 Nick Roberts <nickrob@snap.net.nz> + + * windows.texi (Cyclic Window Ordering): Clarify window-list. + +2005-04-22 Nick Roberts <nickrob@snap.net.nz> + + * variables.texi (Variable Aliases): Describe make-obsolete-variable + and define-obsolete-variable-alias. + +2005-04-22 Kim F. Storm <storm@cua.dk> + + * symbols.texi (Symbol Plists): Remove safe-get, as get is now safe. + (Other Plists): Remove safe-plist-get, as plist-get is now safe. + +2005-04-21 Lute Kamstra <lute@gnu.org> + + * lists.texi (Association Lists): Document rassq-delete-all. + +2005-04-19 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Search-based Fontification): Explain that + facespec is an expression to be evaluated. + +2005-04-19 Kevin Ryde <user42@zip.com.au> + + * streams.texi (Output Functions): Fix xref. + * strings.texi (String Conversion): Fix xref. + +2005-04-19 Kim F. Storm <storm@cua.dk> + + * symbols.texi (Symbol Plists): Add safe-get. + Mention that `get' may signal an error. + +2005-04-18 Nick Roberts <nickrob@snap.net.nz> + + * customize.texi (Variable Definitions): Replace tooltip-mode + example with save-place. + +2005-04-17 Richard M. Stallman <rms@gnu.org> + + * buffers.texi (Indirect Buffers): Clarify. + + * positions.texi (Positions): Clarify converting marker to integer. + + * strings.texi (String Basics): Mention string-match; clarify. + +2005-04-08 Lute Kamstra <lute@gnu.org> + + * modes.texi (Search-based Fontification): Fix cross references. + Use consistent terminology. Document anchored highlighting. + +2005-04-05 Lute Kamstra <lute@gnu.org> + + * modes.texi (Defining Minor Modes): Document :group keyword + argument and its default value. + +2005-04-03 Lute Kamstra <lute@gnu.org> + + * hooks.texi (Standard Hooks): Add some hooks. Add cross + references and/or descriptions. Delete major mode hooks; mention + them as a category instead. Rename or delete obsolete hooks. + +2005-04-02 Richard M. Stallman <rms@gnu.org> + + * nonascii.texi (Coding System Basics): Another wording cleanup. + +2005-04-01 Richard M. Stallman <rms@gnu.org> + + * nonascii.texi (Coding System Basics): Clarify previous change. + +2005-04-01 Kenichi Handa <handa@m17n.org> + + * nonascii.texi (Coding System Basics): Describe about rondtrip + identity of coding systems. + +2005-03-29 Chong Yidong <cyd@stupidchicken.com> + + * text.texi (Buffer Contents): Add filter-buffer-substring and + buffer-substring-filters. + +2005-03-26 Chong Yidong <cyd@stupidchicken.com> + + * anti.texi (Antinews): Mention `G' interactive code. + + * tips.texi (Compilation Tips): Mention benchmark.el. + +2005-03-27 Luc Teirlinck <teirllm@auburn.edu> + + * modes.texi (Other Font Lock Variables): `font-lock-fontify-block' + is now bound to M-o M-o. + + * keymaps.texi (Prefix Keys): `facemenu-keymap' is now on M-o. + +2005-03-26 Glenn Morris <gmorris@ast.cam.ac.uk> + + * calendar.texi: Delete file (and move contents to emacs-xtra.texi + in the Emacs Manual). + * Makefile.in (srcs): Remove calendar.texi. + * makefile.w32-in (srcs): Remove calendar.texi. + * display.texi (Display): Change name of next node. + * os.texi (System In): Change name of previous node. + * elisp.texi (Top): Remove Calendar references. + * vol1.texi (Top): Remove Calendar references. + * vol2.texi (Top): Remove Calendar references. + +2005-03-25 Richard M. Stallman <rms@gnu.org> + + * display.texi (Standard Faces, Fringe Bitmaps, Customizing Bitmaps): + Cleanup previous change. + +2005-03-25 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Face Attributes): Faces earlier in an :inherit + list take precedence. + (Scroll Bars): Fix description of vertical-scroll-bars. + Document frame-current-scroll-bars and window-current-scroll-bars. + + * markers.texi (The Mark): Document temporary Transient Mark mode. + + * minibuf.texi (Reading File Names): + Document read-file-name-completion-ignore-case. + + * positions.texi (Screen Lines): Document nil for width argument + to compute-motion. + +2005-03-23 Kim F. Storm <storm@cua.dk> + + * display.texi (Standard Faces): Other faces used in the fringe + implicitly inherits from the fringe face. + (Fringe Bitmaps): FACE in right-fringe and left-fringe display + properties implicitly inherits from fringe face. + (Customizing Bitmaps): Likewise for set-fringe-bitmap-face. + +2005-03-20 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Invisible Text): State default value of + line-move-ignore-invisible. + (Managing Overlays): Document remove-overlays. + (Standard Faces): Document escape-glyph face. + + * minibuf.texi (Reading File Names): Document read-file-name-function. + + * modes.texi (Other Font Lock Variables): + Document font-lock-lines-before. + + * positions.texi (Skipping Characters): skip-chars-forward allows + character classes. + +2005-03-18 Lute Kamstra <lute@gnu.org> + + * edebug.texi (Instrumenting Macro Calls): Fix another typo. + +2005-03-17 Richard M. Stallman <rms@gnu.org> + + * text.texi (Undo): Document extensible undo entries. + + * searching.texi (String Search, Regexp Search, Regexp Search): + Cleanups. + + * nonascii.texi (Character Codes): Minor fix. + + * display.texi (Display Property): Explain the significance + of having text properties that are eq. + (Other Display Specs): Explain string as display spec. + + * commands.texi (Interactive Codes): Document G option. + +2005-03-17 Chong Yidong <cyd@stupidchicken.com> + + * text.texi (Filling): Add sentence-end-without-period and + sentence-end-without-space. + (Changing Properties): Minor fix. + + * anti.texi: Total rewrite. + +2005-03-15 Lute Kamstra <lute@gnu.org> + + * edebug.texi (Instrumenting Macro Calls): Fix typos. + +2005-03-08 Kim F. Storm <storm@cua.dk> + + * display.texi (Specified Space): Property :width is support on + non-graphic terminals, :height is not. + +2005-03-07 Richard M. Stallman <rms@gnu.org> + + * display.texi (Overlay Arrow, Fringe Bitmaps, Customizing Bitmaps): + Now subnodes of Fringes. + (Overlay Arrow): Document overlay-arrow-variable-list. + (Fringe Size/Pos): New node, broken out of Fringes. + (Display): Explain clearing vs redisplay better. + (Truncation): Clarify use of bitmaps. + (The Echo Area): Clarify the uses of the echo area. + Add max-mini-window-height. + (Progress): Clarify. + (Invisible Text): Explain that main loop moves point out. + (Selective Display): Say "hidden", not "invisible". + (Managing Overlays): Move up. Describe relation to Undo here. + (Overlay Properties): Clarify intro. + (Finding Overlays): Explain return values when nothing found. + (Width): truncate-string-to-width has added arg. + (Displaying Faces): Clarify and update mode line face handling. + (Face Functions): Minor cleanup. + (Conditional Display): Merge into Other Display Specs. + (Pixel Specification, Other Display Specs): Minor cleanups. + (Images, Image Descriptors): Minor cleanups. + (GIF Images): Patents have expired. + (Showing Images): Explain default text for insert-image. + (Manipulating Button Types): Merge into Manipulating Buttons. + (Making Buttons): Explain return values. + (Button Buffer Commands): Add xref. + (Inverse Video): Update mode-line-inverse-video. + (Display Table Format): Clarify. + (Active Display Table): Give defaults for window-display-table. + + * calendar.texi (Calendar Customizing): calendar-holiday-marker + and calendar-today-marker are strings, not chars. + (Holiday Customizing): Minor fix. + + * internals.texi (Writing Emacs Primitives): Update `or' example. + Update limit on # args of subr. + + * edebug.texi (Using Edebug): Arrow is in fringe. + (Instrumenting): Arg to eval-defun works without loading edebug. + (Edebug Execution Modes): Add xref. + + * customize.texi (Common Keywords): Clarify :require. + Mention :version here. + (Variable Definitions, Group Definitions): Not here. + (Variable Definitions): Clarify symbol arg to :initialize and :set fns. + +2005-03-07 Chong Yidong <cyd@stupidchicken.com> + * nonascii.texi (Text Representations): Clarify position-bytes. + (Character Sets): Add list-charset-chars. + (Scanning Charsets): Add charset-after. + (Encoding and I/O): Minor fix. + +2005-03-06 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Vertical Scrolling): Get rid of "Emacs 21". + (Resizing Windows): Likewise. + + * text.texi (Change Hooks): Get rid of "Emacs 21". + + * strings.texi (Formatting Strings): Get rid of "Emacs 21". + + * streams.texi (Output Variables): Get rid of "Emacs 21". + + * searching.texi (Regexp Special, Char Classes): Get rid of "Emacs 21". + + * os.texi (Translating Input): Replace flow-control example + with a less obsolete example that uses `keyboard-translate'. + + * objects.texi (Hash Table Type, Circular Objects): + Get rid of "Emacs 21". + + * modes.texi (Mode Line Format): Get rid of "Emacs 21". + (Mode Line Data, Properties in Mode, Header Lines): Likewise. + + * minibuf.texi (Minibuffer Misc): Get rid of "Emacs 21". + + * lists.texi (List Elements, Building Lists): Get rid of "Emacs 21". + + * keymaps.texi (Menu Separators, Tool Bar): Get rid of "Emacs 21". + (Menu Bar): Fix when menu-bar-update-hook is called. + + * hash.texi (Hash Tables): Get rid of "Emacs 21". + + * frames.texi (Text Terminal Colors): Get rid of "Emacs 21", + and make it read better. + + * files.texi (Writing to Files): Get rid of "Emacs 21". + (Unique File Names): Likewise. + + * elisp.texi: Update Emacs version to 22. + + * display.texi (Forcing Redisplay): Get rid of "Emacs 21". + (Overlay Properties, Face Attributes): Likewise. + (Managing Overlays): Fix punctuation. + (Attribute Functions): Clarify set-face-font; get rid of + info about old Emacs versions. + (Auto Faces, Font Lookup, Display Property, Images): + Get rid of "Emacs 21". + + * calendar.texi (Calendar Customizing): Get rid of "Emacs 21". + +2005-03-05 Richard M. Stallman <rms@gnu.org> + + * debugging.texi (Error Debugging): Remove stack-trace-on-error. + +2005-03-04 Lute Kamstra <lute@gnu.org> + + * debugging.texi (Error Debugging): Document stack-trace-on-error. + +2005-03-03 Lute Kamstra <lute@gnu.org> + + * edebug.texi (Instrumenting Macro Calls): Fix typo. + +2005-03-01 Lute Kamstra <lute@gnu.org> + + * debugging.texi (Debugger Commands): Update `j'. + +2005-02-28 Lute Kamstra <lute@gnu.org> + + * debugging.texi (Debugging): Fix typo. + (Error Debugging): Document eval-expression-debug-on-error. + (Function Debugging): Update example. + (Using Debugger): Mention starred stack frames. + (Debugger Commands): Document `j' and `l'. + (Invoking the Debugger): `d' and `j' exit recursive edit too. + Update the messages that the debugger displays. + (Internals of Debugger): Add cross reference. Update example. + (Excess Open): Minor improvement. + (Excess Close): Minor improvement. + +2005-02-26 Richard M. Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Clarify. + Put all the major mode key reservations together. + Mention the Mouse-1 => Mouse-2 conventions. + + * syntax.texi (Syntax Class Table): Clarify. + (Syntax Table Functions): syntax-after moved from here. + (Syntax Table Internals): syntax-after moved to here. + (Parsing Expressions): Update info on number of values + and what's meaningful in the STATE argument. + (Categories): Fix typo. + + * sequences.texi (Arrays): Cleanup. + (Char-Tables): Clarify. + + * processes.texi (Deleting Processes): Cleanups, add xref. + (Subprocess Creation): Explain nil in exec-path. Cleanup. + (Process Information): set-process-coding-system, some args optional. + (Input to Processes): Explain various types for PROCESS args. + Rename them from PROCESS-NAME to PROCESS. + (Signals to Processes): Likewise. + (Decoding Output): Cleanup. + (Query Before Exit): Clarify. + + * os.texi (Startup Summary): Correct the options; add missing ones. + (Terminal Output, Batch Mode): Clarify. + (Flow Control): Node deleted. + + * markers.texi (The Mark): Clarify. + + * macros.texi (Expansion): Cleanup. + (Indenting Macros): indent-spec allows ints, not floats. + + * keymaps.texi (Keymaps): Clarify. + (Format of Keymaps): Update lisp-mode-map example. + (Active Keymaps, Key Lookup): Clarify. + (Changing Key Bindings): Add xref to `kbd'. + (Key Binding Commands, Simple Menu Items): Clarify. + (Mouse Menus, Menu Bar): Clarify. + (Menu Example): Replace print example with menu-bar-replace-menu. + + * help.texi (Documentation Basics): Add function-documentation prop. + + * elisp.texi (Top): Don't refer to Flow Control node. + + * commands.texi (Command Overview): Improve xrefs. + (Adjusting Point): Adjusting point applies to intangible and invis. + (Key Sequence Input): Doc extra read-key-sequence args. + Likewise for read-key-sequence-vector. + + * backups.texi (Rename or Copy): Minor fix. + (Numbered Backups): For version-control, say the default. + (Auto-Saving): make-auto-save-file-name example is simplified. + + * advice.texi (Advising Functions): Don't imply one part of Emacs + should advise another part. Markup changes. + (Defining Advice): Move transitional para. + (Activation of Advice): Cleanup. + Explain if COMPILE is nil or negative. + + * abbrevs.texi (Abbrev Expansion): Clarify, fix typo. + +2005-02-24 Lute Kamstra <lute@gnu.org> + + * modes.texi (Defining Minor Modes): Explain that INIT-VALUE, + LIGHTER, and KEYMAP can be omitted when KEYWORD-ARGS are used. + +2005-02-23 Lute Kamstra <lute@gnu.org> + + * modes.texi (Defining Minor Modes): define-minor-mode can be used + to define global minor modes as well. + + * display.texi (Managing Overlays): overlay-buffer returns nil for + deleted overlays. + +2005-02-22 Kim F. Storm <storm@cua.dk> + + * minibuf.texi (Basic Completion): Allow symbols in addition to + strings in try-completion and all-completions. + +2005-02-14 Lute Kamstra <lute@gnu.org> + + * elisp.texi (Top): Remove reference to deleted node. + + * lists.texi (Lists): Remove reference to deleted node. + (Cons Cells): Fix typo. + + * loading.texi (Where Defined): Fix typo. + +2005-02-14 Richard M. Stallman <rms@gnu.org> + + * variables.texi (Creating Buffer-Local): change-major-mode-hook + is useful for discarding some minor modes. + + * symbols.texi (Symbol Components): Reorder examples. + + * streams.texi (Input Functions): State standard-input default. + (Output Variables): State standard-output default. + + * objects.texi (Printed Representation): Clarify read syntax vs print. + (Floating Point Type): Explain meaning better. + (Symbol Type): Explain uniqueness better. + (Cons Cell Type): Explain empty list sooner. CAR and CDR later. + List examples sooner. + (Box Diagrams): New subnode broken out. + Some examples moved from old Lists as Boxes node. + (Dotted Pair Notation): Clarify intro. + (Array Type): Clarify. + (Type Predicates): Add hash-table-p. + + * numbers.texi (Integer Basics): Clarify radix explanation. + (Predicates on Numbers): Minor clarification. + (Comparison of Numbers): Minor clarification. Clarify eql. + Typos in min, max. + (Math Functions): Clarify overflow in expt. + + * minibuf.texi (Text from Minibuffer): Minor clarification. + Mention arrow keys. + + * loading.texi (Autoload): defun's doc string overrides autoload's + doc string. + (Repeated Loading): Modernize "add to list" examples. + (Where Defined): Finish updating table of load-history elts. + + * lists.texi (List-related Predicates): Minor wording improvement. + (Lists as Boxes): Node deleted. + (Building Lists): Explain trivial cases of number-sequence. + + * hash.texi (Hash Tables): Add desc to menu items. + (Creating Hash): Expain "full" means "make larger", + (Hash Access): Any object can be a key. + State value of maphash. + + * functions.texi (What Is a Function): Wording cleanup. + (Function Documentation): Minor cleanup. + Explain purpose of calling convention at end of doc string. + (Function Names): Wording cleanup. + (Calling Functions): Wording cleanup. + Explain better how funcall calls the function. + (Function Cells): Delete example of saving and redefining function. + + * control.texi (Combining Conditions): Wording cleanup. + (Iteration): dolist and dotimes bind VAR locally. + (Cleanups): Xref to Atomic Changes. + + * compile.texi (Byte Compilation): Delete 19.29 info. + (Compilation Functions): Macros' difficulties don't affect defsubst. + (Docs and Compilation): Delete 19.29 info. + +2005-02-10 Richard M. Stallman <rms@gnu.org> + + * objects.texi (Symbol Type): Minor correction. + +2005-02-06 Lute Kamstra <lute@gnu.org> + + * modes.texi (Example Major Modes): Fix typos. + +2005-02-06 Richard M. Stallman <rms@gnu.org> + + * text.texi (Margins): fill-nobreak-predicate can be one function. + + * strings.texi (Modifying Strings): clear-string can make unibyte. + (Formatting Strings): format gives error if values missing. + + * positions.texi (Character Motion): Mention default arg + for forward-char. backward-char refers to forward-char. + (Word Motion): Mention default arg for forward-word. + (Buffer End Motion): Mention default arg for beginning-of-buffer. + Simplify end-of-buffer. + (Text Lines): Mention default arg for forward-line. + (List Motion): Mention default arg for beginning/end-of-defun. + (Skipping Characters): Minor fixes in explaining character-set. + + * modes.texi (Major Mode Conventions): Mention "system abbrevs". + Mode inheritance applies only when default-major-mode is nil. + Clarifications. + (Example Major Modes): Update Text mode and Lisp mode examples. + (Minor Mode Conventions): Mention define-minor-mode at top. + (Defining Minor Modes): In Hungry example, don't define C-M-DEL. + (Mode Line Format): Update mode line face display info. + (Properties in Mode): Mention effect of risky vars. + (Imenu): Define imenu-add-to-menubar. + (Font Lock Mode): Add descriptions to menu lines. + (Faces for Font Lock): Add font-lock-doc-face. + +2005-02-05 Lute Kamstra <lute@gnu.org> + + * text.texi (Maintaining Undo): Remove obsolete function. + +2005-02-05 Eli Zaretskii <eliz@gnu.org> + + * frames.texi (Color Names): Add pointer to the X docs about RGB + color specifications. Improve indexing + (Text Terminal Colors): Replace the description of RGB values by + an xref to "Color Names". + +2005-02-03 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Basic Windows): Add cursor-in-non-selected-windows. + Clarify. + (Selecting Windows): Clarify save-selected-window. + (Cyclic Window Ordering): Clarify walk-windows. + (Window Point): Clarify. + (Window Start): Add comment to example. + (Resizing Windows): Add `interactive' specs in examples. + Document fit-window-to-buffer. + + * text.texi (User-Level Deletion): just-one-space takes numeric arg. + (Undo, Maintaining Undo): Clarify last change. + (Sorting): In sort-numeric-fields, explain about octal and hex. + Mention sort-numeric-base. + (Format Properties): Add xref for hard newlines. + + * frames.texi (Window Frame Parameters): Explain pixel=char on tty. + (Pop-Up Menus): Fix typo. + (Color Names): Explain all types of color names. + Explain color-values on B&W terminal. + (Text Terminal Colors): Explain "rgb values" are lists. Fix arg names. + + * files.texi (File Locks): Not supported on MS systems. + (Testing Accessibility): Clarify. + + * edebug.texi (Printing in Edebug): Fix edebug-print-circle. + (Coverage Testing): Fix typo. + + * commands.texi (Misc Events): Remove stray space. + + * buffers.texi (Buffer Names): Clarify generate-new-buffer-name. + (Modification Time): Clarify when visited-file-modtime returns 0. + (The Buffer List): Clarify bury-buffer. + (Killing Buffers): Clarify. + (Indirect Buffers): Add clone-indirect-buffer. + +2005-02-02 Matt Hodges <MPHodges@member.fsf.org> + + * edebug.texi (Printing in Edebug): Fix default value of + edebug-print-circle. + (Coverage Testing): Fix displayed frequency count data. + +2005-02-02 Luc Teirlinck <teirllm@auburn.edu> + + * text.texi (Maintaining Undo): Add `undo-outer-limit'. + +2005-02-02 Kim F. Storm <storm@cua.dk> + + * text.texi (Undo) <buffer-undo-list>: Describe `apply' elements. + +2005-01-29 Eli Zaretskii <eliz@gnu.org> + + * commands.texi (Misc Events): Describe the help-echo event. + + * text.texi (Special Properties) <help-echo>: Use `pos' + consistently in description of the help-echo property. + Use @code{nil} instead of @var{nil}. + + * display.texi (Overlay Properties): Fix the index entry for + help-echo overlay property. + + * customize.texi (Type Keywords): Uncomment the xref to the + help-echo property documentation. + +2005-01-23 Kim F. Storm <storm@cua.dk> + + * windows.texi (Window Start): Fix `pos-visible-in-window-p' + return value. Third element FULLY replaced by PARTIAL which + specifies number of invisible pixels if row is only partially visible. + (Textual Scrolling): Mention auto-window-vscroll. + (Vertical Scrolling): New defvar auto-window-vscroll. + +2005-01-16 Luc Teirlinck <teirllm@auburn.edu> + + * keymaps.texi (Changing Key Bindings): `suppress-keymap' now uses + command remapping. + +2005-01-15 Richard M. Stallman <rms@gnu.org> + + * display.texi (Defining Images): Mention DATA-P arg of create-image. + +2005-01-14 Kim F. Storm <storm@cua.dk> + + * commands.texi (Accessing Events): Add WHOLE arg to posn-at-x-y. + + * text.texi (Links and Mouse-1): Fix string and vector item. + +2005-01-13 Richard M. Stallman <rms@gnu.org> + + * keymaps.texi (Active Keymaps): Rewrite the text, and update the + descriptions of overriding-local-map and overriding-terminal-local-map. + + * text.texi (Links and Mouse-1): Clarify text. + +2005-01-13 Kim F. Storm <storm@cua.dk> + + * modes.texi (Emulating Mode Line): Update format-mode-line entry. + +2005-01-13 Francis Litterio <franl@world.std.com> (tiny change) + + * keymaps.texi (Active Keymaps): Fix overriding-local-map description. + +2005-01-12 Kim F. Storm <storm@cua.dk> + + * text.texi (Links and Mouse-1): Rename section from Enabling + Mouse-1 to Following Links. Change xrefs. + Add examples for define-button-type and define-widget. + + * display.texi (Button Properties, Button Buffer Commands): + Clarify mouse-1 and follow-link functionality. + +2005-01-12 Richard M. Stallman <rms@gnu.org> + + * text.texi (Enabling Mouse-1 to Follow Links): Redo prev. change. + + * display.texi (Beeping): Fix Texinfo usage. + + * modes.texi (Emulating Mode Line): Doc FACE arg in format-header-line. + +2005-01-11 Kim F. Storm <storm@cua.dk> + + * display.texi (Button Properties, Button Buffer Commands): + Mention mouse-1 binding. Add follow-link keyword. + + * text.texi (Text Properties): Add "Enable Mouse-1" to submenu. + (Enabling Mouse-1 to Follow Links): New subsection. + +2005-01-06 Richard M. Stallman <rms@gnu.org> + + * text.texi (Special Properties): Minor change. + + * os.texi (Timers): Clarify previous change. + + * modes.texi (Emulating Mode Line): format-mode-line requires 1 arg. + +2005-01-01 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi (Face Attributes): Correct xref to renamed node. + +2005-01-01 Richard M. Stallman <rms@gnu.org> + + * display.texi (Face Attributes): Describe hex color specs. + +2004-12-31 Richard M. Stallman <rms@gnu.org> + + * os.texi (Timers): Update previous change. + +2004-12-30 Kim F. Storm <storm@cua.dk> + + * display.texi (Line Height): Total line-height is now specified + in line-height property of form (HEIGHT TOTAL). Swap (FACE . RATIO) + in cons cells. (nil . RATIO) is relative to actual line height. + Use line-height `t' instead of `0' to get minimum height. + +2004-12-29 Richard M. Stallman <rms@gnu.org> + + * os.texi (Timers): Discuss timers vs editing the buffer and undo. + +2004-12-28 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Quitting): Clarify value of with-local-quit. + + * elisp.texi (Top): Fix previous change. + + * loading.texi (Loading): Fix previous change. + +2004-12-27 Richard M. Stallman <rms@gnu.org> + + * Makefile.in (MAKEINFO): Specify --force. + + * buffers.texi (Killing Buffers): Add buffer-save-without-query. + + * modes.texi (Emulating Mode Line): Document format's BUFFER arg. + + * display.texi (Line Height): Further clarify. + + * elisp.texi (Top): Update Loading submenu. + + * loading.texi (Where Defined): New node. + (Unloading): load-history moved to Where Defined. + +2004-12-21 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Event Input Misc): Add while-no-input. + +2004-12-11 Richard M. Stallman <rms@gnu.org> + + * display.texi (Line Height): Rewrite text for clarity. + +2004-12-11 Kim F. Storm <storm@cua.dk> + + * display.texi (Display): Add node "Line Height" to menu. + (Line Height): New node. Move full description of line-spacing + and line-height text properties here from text.texi. + (Scroll Bars): Add vertical-scroll-bar variable. + + * frames.texi (Window Frame Parameters): Remove line-height defvar. + + * locals.texi (Standard Buffer-Local Variables): Fix xref for + line-spacing and vertical-scroll-bar. + + * text.texi (Special Properties): Just mention line-spacing and + line-height here, add xref to new "Line Height" node. + +2004-12-09 Thien-Thi Nguyen <ttn@gnu.org> + + * frames.texi (Window Frame Parameters): New @defvar for `line-spacing'. + + * locals.texi (Standard Buffer-Local Variables): + Add @xref for `line-spacing'. + +2004-12-05 Richard M. Stallman <rms@gnu.org> + + * Makefile.in (maintainer-clean): Remove the info files + in $(infodir) where they are created. + +2004-12-03 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Selecting Windows): get-lru-window and + get-largest-window don't consider dedicated windows. + + * text.texi (Undo): Document undo-in-progress. + +2004-11-26 Richard M. Stallman <rms@gnu.org> + + * locals.texi (Standard Buffer-Local Variables): Undo prev change. + Remove a few vars that are not always buffer-local. + +2004-11-24 Luc Teirlinck <teirllm@auburn.edu> + + * locals.texi (Standard Buffer-Local Variables): Comment out + xref's to non-existent node `Yet to be written'. + +2004-11-24 Richard M. Stallman <rms@gnu.org> + + * processes.texi (Synchronous Processes): Grammar fix. + + * numbers.texi (Comparison of Numbers): Add eql. + + * locals.texi (Standard Buffer-Local Variables): Add many vars. + + * intro.texi (Printing Notation): Fix previous change. + + * display.texi (Customizing Bitmaps): Move indicate-buffer-boundaries + and default-indicate-buffer-boundaries from here. + (Usual Display): To here. + (Scroll Bars): Add scroll-bar-mode and scroll-bar-width. + (Usual Display): Move tab-width up. + + * customize.texi (Variable Definitions): Replace + show-paren-mode example with tooltip-mode. + (Simple Types, Composite Types, Defining New Types): + Minor cleanups. + +2004-11-21 Jesper Harder <harder@ifa.au.dk> + + * processes.texi (Synchronous Processes, Output from Processes): + Markup fix. + +2004-11-20 Richard M. Stallman <rms@gnu.org> + + * positions.texi (Skipping Characters): skip-chars-forward + now handles char classes. + + * intro.texi (Printing Notation): Avoid confusion of `print' + when explaining @print. + + * macros.texi (Argument Evaluation): Fix 1st `for' expansion example. + + * display.texi (Display Table Format): Minor fix. + + * streams.texi (Output Functions): Fix print example. + + * Makefile.in (elisp): New target. + (dist): Depend on $(infodir)/elisp, not elisp. + Copy the info files from $(infodir). + + * minibuf.texi (Text from Minibuffer): Document KEEP-ALL arg in + read-from-minibuffer. + + * searching.texi (Regexp Search): Rename that to search-spaces-regexp. + +2004-11-19 Richard M. Stallman <rms@gnu.org> + + * searching.texi (Regexp Search): Add search-whitespace-regexp. + +2004-11-19 CHENG Gao <chenggao@gmail.com> (tiny change) + + * tips.texi (Coding Conventions): Fix typo. + +2004-11-16 Richard M. Stallman <rms@gnu.org> + + * tips.texi (Coding Conventions): Separate defvar and require + methods to avoid warnings. Use require only when there are many + functions and variables from that package. + + * minibuf.texi (Minibuffer Completion): When ignoring case, + predicate must not be case-sensitive. + + * debugging.texi (Function Debugging, Explicit Debug): Clarified. + (Test Coverage): Don't talk about "splotches". Clarified. + +2004-11-16 Thien-Thi Nguyen <ttn@gnu.org> + + * frames.texi (Window Frame Parameters): Fix typo. + +2004-11-15 Kim F. Storm <storm@cua.dk> + + * symbols.texi (Other Plists): Note that plist-get may signal error. + Add safe-plist-get. + +2004-11-15 Thien-Thi Nguyen <ttn@gnu.org> + + * modes.texi (Font Lock Basics): Fix typo. + +2004-11-08 Richard M. Stallman <rms@gnu.org> + + * syntax.texi (Syntax Table Functions): Add syntax-after. + +2004-11-06 Lars Brinkhoff <lars@nocrew.org> + + * os.texi (Processor Run Time): New section documenting + get-internal-run-time. + +2004-11-06 Eli Zaretskii <eliz@gnu.org> + + * Makefile.in (install, maintainer-clean): Don't use "elisp-*" as + it nukes elisp-cover.texi. + (dist): Change elisp-[0-9] to elisp-[1-9], as there could be no + elisp-0 etc. + +2004-11-05 Luc Teirlinck <teirllm@auburn.edu> + + * commands.texi (Keyboard Macros): Document `append' return value + of `defining-kbd-macro'. + +2004-11-01 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Interactive Call): Add called-interactively-p. + +2004-10-29 Simon Josefsson <jas@extundo.com> + + * minibuf.texi (Reading a Password): Revert. + +2004-10-28 Richard M. Stallman <rms@gnu.org> + + * frames.texi (Display Feature Testing): Explain about "vendor". + +2004-10-27 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Interactive Codes): `N' uses numeric prefix, + not raw. Clarify `n'. + (Interactive Call): Rewrite interactive-p, focusing on when + and how to use it. + (Misc Events): Clarify previous change. + + * advice.texi (Simple Advice): Clarify what job the example does. + (Around-Advice): Clarify ad-do-it. + (Activation of Advice): An option of ad-default-compilation-action + is `never', not `nil'. + +2004-10-26 Kim F. Storm <storm@cua.dk> + + * commands.texi (Interactive Codes): Add U code letter. + +2004-10-25 Simon Josefsson <jas@extundo.com> + + * minibuf.texi (Reading a Password): Add. + +2004-10-24 Jason Rumney <jasonr@gnu.org> + + * commands.texi (Misc Events): Remove mouse-wheel. Add wheel-up + and wheel-down. + +2004-10-24 Kai Grossjohann <kai.grossjohann@gmx.net> + + * processes.texi (Synchronous Processes): Document process-file. + +2004-10-22 Kenichi Handa <handa@m17n.org> + + * text.texi (translate-region): Document that it accepts also a + char-table. + +2004-10-22 David Ponce <david@dponce.com> + + * windows.texi (Resizing Windows): Document the `preserve-before' + argument of the functions `enlarge-window' and `shrink-window'. + +2004-10-19 Jason Rumney <jasonr@gnu.org> + + * makefile.w32-in (elisp): Change order of arguments to makeinfo. + +2004-10-09 Luc Teirlinck <teirllm@auburn.edu> + + * text.texi (Filling): Add anchor for definition of + `sentence-end-double-space'. + + * searching.texi (Regexp Example): Update description of how + Emacs currently recognizes the end of a sentence. + (Standard Regexps): Update definition of the variable + `sentence-end'. Add definition of the function `sentence-end'. + +2004-10-08 Paul Pogonyshev <pogonyshev@gmx.net> + + * display.texi (Progress): New node. + +2004-10-05 Kim F. Storm <storm@cua.dk> + + * display.texi (Fringe Bitmaps): Update fringe-bitmaps-at-pos. + +2004-09-29 Kim F. Storm <storm@cua.dk> + + * display.texi (Fringe Bitmaps): Use symbols rather than numbers + to identify bitmaps. Remove -fringe-bitmap suffix for standard + fringe bitmap symbols, as they now have their own namespace. + (Customizing Bitmaps) <define-fringe-bitmap>: Clarify bit ordering + vs. pixels. Signal error if no free bitmap slots. + (Pixel Specification): Change IMAGE to @var{image}. + +2004-09-28 Richard M. Stallman <rms@gnu.org> + + * text.texi (Special Properties): Clarify line-spacing and line-height. + + * searching.texi (Regexp Search): Add looking-back. + +2004-09-25 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi: Correct typos. + (Image Descriptors): Correct xref's. + +2004-09-25 Richard M. Stallman <rms@gnu.org> + + * text.texi (Special Properties): Cleanups in `cursor'. + Rewrites in `line-height' and `line-spacing'; exchange them. + + * display.texi (Fringes): Rewrite previous change. + (Fringe Bitmaps): Merge text from Display Fringe Bitmaps. Rewrite. + (Display Fringe Bitmaps): Node deleted, text moved. + (Customizing Bitmaps): Split off from Fringe Bitmaps. Rewrite. + (Scroll Bars): Clarify set-window-scroll-bars. + (Pointer Shape): Rewrite. + (Specified Space): Clarify :align-to, etc. + (Pixel Specification): Use @var. Clarify new text. + (Other Display Specs): Clarify `slice'. + (Image Descriptors): Cleanups. + (Showing Images): Cleanups. + +2004-09-24 Luc Teirlinck <teirllm@auburn.edu> + + * hooks.texi (Standard Hooks): Add `after-change-major-mode-hook'. + + * modes.texi: Various minor changes in addition to: + (Major Mode Conventions): Final call to `run-mode-hooks' should + not be inside the `delay-mode-hooks' form. + (Mode Hooks): New node. + (Hooks): Delete obsolete example. + Move definitions of `run-mode-hooks' and `delay-mode-hooks' to new + node "Mode Hooks". + +2004-09-22 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi: Correct various typos. + (Display): Rename node "Pointer Shapes" to "Pointer + Shape". (There is already a node called "Pointer Shapes" in + frames.texi.) + (Images): Remove non-existent node "Image Slices" from menu. + +2004-09-23 Kim F. Storm <storm@cua.dk> + + * text.texi (Special Properties): Add `cursor', `pointer', + `line-height', and `line-spacing' properties. + + * display.texi (Display): Add 'Fringe Bitmaps' and 'Pointer + Shapes' to menu. + (Standard Faces): Doc fix for fringe face. + (Fringes): Add `overflow-newline-into-fringe' and + 'indicate-buffer-boundaries'. + (Fringe Bitmaps, Pointer Shapes): New nodes. + (Display Property): Add 'Pixel Specification' and 'Display Fringe + Bitmaps' to menu. + (Specified Space): Describe pixel width and height. + (Pixel Specification): New node. + (Other Display Specs): Add `slice' property. + (Display Fringe Bitmaps): New node. + (Images): Add 'Image Slices' to menu. + (Image Descriptors): Add `:pointer' and `:map' properties. + (Showing Images): Add slice arg to `insert-image'. Add + 'insert-sliced-image'. + +2004-09-20 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Key Sequence Input): + Clarify downcasing in read-key-sequence. + +2004-09-08 Juri Linkov <juri@jurta.org> + + * minibuf.texi (Minibuffer History): Add `history-delete-duplicates'. + +2004-09-07 Luc Teirlinck <teirllm@auburn.edu> + + * locals.texi (Standard Buffer-Local Variables): Add + `buffer-auto-save-file-format'. + * internals.texi (Buffer Internals): Describe new + auto_save_file_format field of the buffer structure. + * files.texi (Format Conversion): `auto-save-file-format' has been + renamed `buffer-auto-save-file-format'. + +2004-08-27 Luc Teirlinck <teirllm@auburn.edu> + + * abbrevs.texi (Abbrev Expansion): `abbrev-start-location' can be + an integer or a marker. + (Abbrev Expansion): Replace example for `pre-abbrev-expand-hook'. + +2004-08-22 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Major Mode Conventions): Discuss rebinding of + standard key bindings. + +2004-08-18 Kim F. Storm <storm@cua.dk> + + * processes.texi (Accepting Output): Add `just-this-one' arg to + `accept-process-output'. + (Output from Processes): New var `process-adaptive-read-buffering'. + +2004-08-10 Luc Teirlinck <teirllm@auburn.edu> + + * keymaps.texi: Various changes in addition to: + (Keymap Terminology): `kbd' uses same syntax as Edit Macro mode. + Give more varied examples for `kbd'. + (Creating Keymaps): Char tables have slots for all characters + without modifiers. + (Active Keymaps): `overriding-local-map' and + `overriding-terminal-local-map' also override text property and + overlay keymaps. + (Functions for Key Lookup): Mention OLP arg to `current-active-maps'. + (Scanning Keymaps): `accessible-keymaps' uses `[]' instead of `""' + to denote a prefix of no events. + `map-keymap' includes parent's bindings _recursively_. + Clarify and correct description of `where-is-internal'. + Mention BUFFER-OR-NAME arg to `describe-bindings'. + (Menu Example): For menus intended for use with the keyboard, the + menu items should be bound to characters or real function keys. + +2004-08-08 Luc Teirlinck <teirllm@auburn.edu> + + * objects.texi (Character Type): Reposition `@anchor' to prevent + double space inside sentence in Info. + + * hooks.texi (Standard Hooks): `disabled-command-hook' has been + renamed to `disabled-command-function'. + * commands.texi (Key Sequence Input): Remove unnecessary anchor. + (Command Loop Info): Replace reference to it. + (Disabling Commands): `disabled-command-hook' has been renamed to + `disabled-command-function'. + +2004-08-07 Luc Teirlinck <teirllm@auburn.edu> + + * os.texi (Translating Input): Only non-prefix bindings in + `key-translation-map' override actual key bindings. Warn about + possible indirect effect of actual key bindings on non-prefix + bindings in `key-translation-map'. + +2004-08-06 Luc Teirlinck <teirllm@auburn.edu> + + * minibuf.texi (High-Level Completion): Add anchor for definition + of `read-variable'. + + * commands.texi: Various changes in addition to: + (Using Interactive): Clarify description of `interactive-form'. + (Interactive Call): Mention default for KEYS argument to + `call-interactively'. + (Command Loop Info): Clarify description of `this-command-keys'. + Mention KEEP-RECORD argument to `clear-this-command-keys'. + Value of `last-event-frame' can be `macro'. + (Repeat Events): `double-click-fuzz' is also used to distinguish + clicks and drags. + (Classifying Events): Clarify descriptions of `event-modifiers' + `event-basic-type' and `event-convert-list'. + (Accessing Events): `posn-timestamp' takes POSITION argument. + (Quoted Character Input): Clarify description of + `read-quoted-char' and fix example. + (Quitting): Add `with-local-quit'. + (Disabling Commands): Correct and clarify descriptions of + `enable-command' and `disable-command'. + Mention what happens if `disabled-command-hook' is nil. + (Keyboard Macros): Mention LOOPFUNC arg to `execute-kbd-macro'. + Describe `executing-kbd-macro' instead of obsolete `executing-macro'. + +2004-07-24 Luc Teirlinck <teirllm@auburn.edu> + + * frames.texi: Various changes in addition to: + (Creating Frames): Expand and clarify description of `make-frame'. + (Window Frame Parameters): Either none or both of the `icon-left' + and `icon-top' parameters must be specified. Put descriptions of + `menu-bar-lines' and `toolbar-lines' closer together and change + them accordingly. + (Frame Titles): `multiple-frames' is not guaranteed to be accurate + except while processing `frame-title-format' or `icon-title-format'. + (Deleting Frames): Correct description of `delete-frame'. + Non-nil return values of `frame-live-p' are like those of `framep'. + (Frames and Windows): Mention return value of + `set-frame-selected-window'. + (Visibility of Frames): Mention `force' argument to + `make-frame-invisible'. `frame-visible-p' returns t for all + frames on text-only terminals. + (Frame Configurations): Restoring a frame configuration does not + restore deleted frames. + (Window System Selections): `x-set-selection' returns DATA. + (Resources): Add example. + (Display Feature Testing): Clarify descriptions of + `display-pixel-height', `display-pixel-width', `x-server-version' + and `x-server-vendor'. + + * windows.texi (Choosing Window): Add anchor. + * minibuf.texi (Minibuffer Misc): Add anchor. + +2004-07-23 John Paul Wallington <jpw@gnu.org> + + * macros.texi (Defining Macros): Declaration keyword for setting + Edebug spec is `debug' not `edebug'. + +2004-07-19 Luc Teirlinck <teirllm@auburn.edu> + + * windows.texi: Various small changes in addition to: + (Window Point): Mention return value of `set-window-point'. + (Window Start): `pos-visible-in-window-p' disregards horizontal + scrolling. Explain return value if PARTIALLY is non-nil. + (Vertical Scrolling): Mention PIXELS-P argument to `window-vscroll' + and `set-window-vscroll'. + (Size of Window): The argument WINDOW to `window-inside-edges', + `window-pixel-edges' and `window-inside-pixel-edges' is optional. + (Resizing Windows): Explain return value of + `shrink-window-if-larger-than-buffer'. + `window-size-fixed' automatically becomes buffer local when set. + (Window Configurations): Explain return value of + `set-window-configuration'. + + * minibuf.texi (Minibuffer Misc): Add anchor for + `minibuffer-scroll-window'. + + * positions.texi (Text Lines): Add anchor for `count-lines'. + +2004-07-17 Richard M. Stallman <rms@gnu.org> + + * display.texi (Overlay Properties): Adding `evaporate' prop + deletes empty overlay immediately. + + * abbrevs.texi (Abbrev Expansion): Clarify pre-abbrev-expand-hook, + fix example. + +2004-07-16 Jim Blandy <jimb@redhat.com> + + * searching.texi (Regexp Backslash): Document new \_< and \_> + operators. + +2004-07-16 Juanma Barranquero <lektu@terra.es> + + * display.texi (Images): Fix Texinfo usage. + +2004-07-14 Luc Teirlinck <teirllm@auburn.edu> + + * buffers.texi (Modification Time): `visited-file-modtime' now + returns a list of two integers, instead of a cons. + +2004-07-13 Luc Teirlinck <teirllm@auburn.edu> + + * windows.texi: Various changes in addition to: + (Splitting Windows): Add `split-window-keep-point'. + +2004-07-09 Richard M. Stallman <rms@gnu.org> + + * frames.texi (Input Focus): Minor fix. + +2004-07-07 Luc Teirlinck <teirllm@auburn.edu> + + * frames.texi (Input Focus): Clarify descriptions of + `select-frame-set-input-focus' and `select-frame'. + +2004-07-06 Luc Teirlinck <teirllm@auburn.edu> + + * os.texi: Various small changes in addition to: + (Killing Emacs): Expand and clarify description of + `kill-emacs-query-functions' and `kill-emacs-hook'. + (System Environment): Expand and clarify description of `getenv' + and `setenv'. + (Timers): Clarify description of `run-at-time'. + (Translating Input): Correct description of + `extra-keyboard-modifiers'. + (Flow Control): Correct description of `enable-flow-control'. + +2004-07-06 Thien-Thi Nguyen <ttn@gnu.org> + + * os.texi: Update copyright. + (Session Management): Grammar fix. + Clarify which Emacs does the restarting. + Use @samp for *scratch* buffer. + +2004-07-04 Alan Mackenzie <acm@muc.de> + + * frames.texi (Input Focus): Add documentation for + `select-frame-set-input-focus'. Replace refs to non-existent + `switch-frame' with `select-frame'. Minor corrections and tidying + up of text-only terminal stuff. + +2004-07-02 Richard M. Stallman <rms@gnu.org> + + * files.texi (Saving Buffers): Cleanup write-contents-function. + (Magic File Names): Cleanup file-remote-p. + +2004-07-02 Kai Grossjohann <kai@emptydomain.de> + + * files.texi (Magic File Names): `file-remote-p' returns an + identifier of the remote system, not just t. + +2004-07-02 David Kastrup <dak@gnu.org> + + * searching.texi (Entire Match Data): Add explanation about new + match-data behavior when @var{integers} is non-nil. + +2004-06-24 Richard M. Stallman <rms@gnu.org> + + * commands.texi (Misc Events): Describe usr1-signal, usr2-signal event. + + * customize.texi (Variable Definitions): Note about doc strings + and :set. + + * keymaps.texi (Keymap Terminology): Document `kbd'. + (Changing Key Bindings, Key Binding Commands): Use kbd in examples. + + * display.texi (Invisible Text): Setting buffer-invisibility-spec + makes it buffer-local. + + * files.texi (Saving Buffers): Correct previous change. + + * commands.texi (Accessing Events): + Clarify posn-col-row and posn-actual-col-row. + +2004-06-24 David Ponce <david.ponce@wanadoo.fr> + + * commands.texi (Accessing Events): New functions + posn-at-point and posn-at-x-y. Add example to posn-x-y. + +2004-06-23 Luc Teirlinck <teirllm@auburn.edu> + + * lists.texi, files.texi, processes.texi, macros.texi, hash.texi: + * frames.texi, buffers.texi, backups.texi, variables.texi: + * loading.texi, eval.texi, functions.texi, control.texi: + * symbols.texi, minibuf.texi: Reposition @anchor's. + + * help.texi: Various small changes in addition to the following. + (Describing Characters): Describe PREFIX argument to + `key-description'. Correct and clarify definition of + `text-char-description'. Describe NEED-VECTOR argument to + `read-kbd-macro'. + (Help Functions): Clarify definition of `apropos'. + +2004-06-23 Lars Hansen <larsh@math.ku.dk> + + * files.texi (Saving Buffers): Correct description of + `write-contents-functions'. + +2004-06-21 Juanma Barranquero <lektu@terra.es> + + * display.texi (Images): Remove redundant @vindex directives. + Rewrite `image-library-alist' doc in active voice. + +2004-06-14 Juanma Barranquero <lektu@terra.es> + + * display.texi (Images): Document new delayed library loading, + variable `image-library-alist' and (existing but undocumented) + function `image-type-available-p'. + +2004-06-05 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (Minibuffer Completion): For INITIAL arg, + refer the user to the Initial Input node. + (Text from Minibuffer): Likewise. + (Initial Input): New node. Document this feature + and say it is mostly deprecated. + +2004-05-30 Richard M. Stallman <rms@gnu.org> + + * loading.texi (Named Features): Clarify return value + and meaning of NOERROR. + + * variables.texi (File Local Variables): Minor cleanup. + +2004-05-30 Michael Albinus <michael.albinus@gmx.de> + + * files.texi (Magic File Names): Add `file-remote-p' as operation + of file name handlers. + +2004-05-29 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Minor Mode Conventions): (-) has no special meaning + as arg to a minor mode command. + +2004-05-22 Richard M. Stallman <rms@gnu.org> + + * syntax.texi (Syntax Class Table): Word syntax not just for English. + + * streams.texi (Output Variables): Doc float-output-format. + + * searching.texi (Regexp Special): Nested repetition can be infloop. + + * eval.texi (Eval): Increasing max-lisp-eval-depth can cause + real stack overflow. + + * compile.texi: Minor cleanups. + +2004-05-22 Luc Teirlinck <teirllm@dms.auburn.edu> + + * lists.texi (Cons Cells): Explain dotted lists, true lists, + circular lists. + (List Elements): Explain handling of circular and dotted lists. + +2004-05-19 Thien-Thi Nguyen <ttn@gnu.org> + + * modes.texi (Search-based Fontification): Fix typo. + +2004-05-10 Juanma Barranquero <lektu@terra.es> + + * modes.texi (Mode Line Variables): Fix description of + global-mode-string, which is now after which-func-mode, not the + buffer name. + +2004-05-07 Lars Hansen <larsh@math.ku.dk> + + * modes.texi (Desktop Save Mode): Add. + (Modes): Add menu entry Desktop Save Mode. + + * hooks.texi: Add desktop-after-read-hook, + desktop-no-desktop-file-hook and desktop-save-hook. + + * locals.texi: Add desktop-save-buffer. + +2004-04-30 Jesper Harder <harder@ifa.au.dk> + + * display.texi: emacs -> Emacs. + +2004-04-27 Matthew Mundell <matt@mundell.ukfsn.org> + + * files.texi (Changing Files): Document set-file-times. + +2004-04-23 Juanma Barranquero <lektu@terra.es> + + * makefile.w32-in: Add "-*- makefile -*-" mode tag. + +2004-04-18 Jesper Harder <harder@ifa.au.dk> + + * tips.texi (Coding Conventions): defopt -> defcustom. + +2004-04-16 Luc Teirlinck <teirllm@auburn.edu> + + * sequences.texi: Various clarifications. + +2004-04-14 Luc Teirlinck <teirllm@auburn.edu> + + * buffers.texi (Read Only Buffers): Mention optional ARG to + `toggle-read-only'. + +2004-04-14 Nick Roberts <nick@nick.uklinux.net> + + * windows.texi (Selecting Windows): Note that get-lru-window + returns a full-width window if possible. + +2004-04-13 Luc Teirlinck <teirllm@auburn.edu> + + * buffers.texi: Various changes in addition to: + (Buffer File Name): Add `find-buffer-visiting'. + (Buffer Modification): Mention optional ARG to `not-modified'. + (Indirect Buffers): Mention optional CLONE argument to + `make-indirect-buffer'. + + * files.texi: Various changes in addition to: + (Visiting Functions): `find-file-hook' is now a normal hook. + (File Name Expansion): Explain difference between the way that + `expand-file-name' and `file-truename' treat `..'. + (Contents of Directories): Mention optional ID-FORMAT argument to + `directory-files-and-attributes'. + (Format Conversion): Mention new optional CONFIRM argument to + `format-write-file'. + +2004-04-12 Miles Bader <miles@gnu.org> + + * macros.texi (Expansion): Add description of `macroexpand-all'. + +2004-04-05 Jesper Harder <harder@ifa.au.dk> + + * variables.texi (Variable Aliases): Mention + cyclic-variable-indirection. + + * errors.texi (Standard Errors): Ditto. + +2004-04-04 Luc Teirlinck <teirllm@auburn.edu> + + * backups.texi: Various small changes in addition to: + (Making Backups): Mention return value of `backup-buffer'. + (Auto-Saving): Mention optional FORCE argument to + `delete-auto-save-file-if-necessary'. + (Reverting): Mention optional PRESERVE-MODES argument to + `revert-buffer'. Correct description of `revert-buffer-function'. + +2004-03-22 Juri Linkov <juri@jurta.org> + + * sequences.texi (Sequence Functions): Replace xref to `Vectors' + with `Vector Functions'. + + * text.texi (Sorting): Add missing quote. + +2004-03-14 Luc Teirlinck <teirllm@auburn.edu> + + * intro.texi (Lisp History): Replace xref to `cl' manual with + inforef. + +2004-03-12 Richard M. Stallman <rms@gnu.org> + + * intro.texi (Version Info): Add arg to emacs-version. + (Lisp History): Change xref to CL manual. + +2004-03-09 Luc Teirlinck <teirllm@auburn.edu> + + * minibuf.texi (Completion Commands): Add xref to Emacs manual + for Partial Completion mode. + +2004-03-07 Thien-Thi Nguyen <ttn@gnu.org> + + * customize.texi: Fix typo. Remove eol whitespace. + +2004-03-04 Richard M. Stallman <rms@gnu.org> + + * processes.texi: Fix typos. + + * lists.texi (Building Lists): Minor clarification. + + * hash.texi (Creating Hash): Correct the meaning of t for WEAK + in make-hash-table. + +2004-02-29 Juanma Barranquero <lektu@terra.es> + + * makefile.w32-in (clean, maintainer-clean): Use $(DEL) instead of + rm, and ignore exit code. + +2004-02-27 Dan Nicolaescu <dann@ics.uci.edu> + + * display.texi (Defining Faces): Add description for min-colors. + Update example. + +2004-02-23 Luc Teirlinck <teirllm@auburn.edu> + + * abbrevs.texi: Various corrections and clarifications in addition + to the following: + (Abbrev Tables): Delete add-abbrev (as suggested by RMS). + +2004-02-22 Matthew Mundell <matt@mundell.ukfsn.org> (tiny change) + + * calendar.texi (Holiday Customizing): Quote arg of holiday-sexp. + +2004-02-21 Luc Teirlinck <teirllm@auburn.edu> + + * text.texi: Various small changes in addition to the following: + (User-Level Deletion): Mention optional BACKWARD-ONLY argument + to delete-horizontal-space. + (Kill Functions, Yanking, Low-Level Kill Ring): Clarify and correct + description of yank-handler text property at various places. + + * frames.texi (Window System Selections): Add anchor. + + * syntax.texi (Syntax Table Functions): Clarify and correct + descriptions of make-syntax-table and copy-syntax-table. + (Motion and Syntax): Clarify SYNTAXES argument to + skip-syntax-forward. + (Parsing Expressions): Mention that the return value of + parse-partial-sexp is currently a list of ten rather than nine + elements. + (Categories): Various corrections and clarifications. + +2004-02-17 Luc Teirlinck <teirllm@auburn.edu> + + * markers.texi (Marker Insertion Types): Minor change. + + * locals.texi (Standard Buffer-Local Variables): + * commands.texi (Interactive Codes, Using Interactive): + * functions.texi (Related Topics): Fix xrefs. + +2004-02-16 Luc Teirlinck <teirllm@auburn.edu> + + * lists.texi (Sets And Lists): Update description of delete-dups. + +2004-02-16 Jesper Harder <harder@ifa.au.dk> (tiny change) + + * keymaps.texi (Tool Bar): tool-bar-item => tool-bar-button. + +2004-02-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * frames.texi (Parameter Access): frame-parameters arg is optional. + modify-frame-parameters handles nil for FRAME. + (Window Frame Parameters): menu-bar-lines and tool-bar-lines + are all-or-nothing for certain toolkits. + Mention parameter wait-for-wm. + (Frames and Windows): In frame-first-window and frame-selected-window + the arg is optional. + (Input Focus): In redirect-frame-focus the second arg is optional. + (Window System Selections): Mention selection type CLIPBOARD. + Mention data-type UTF8_STRING. + Mention numbering of cut buffers. + (Resources): Describe x-resource-name. + +2004-02-16 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Buffers and Windows): Delete false table + about all-frames. + + * syntax.texi (Parsing Expressions): Delete old caveat + about parse-sexp-ignore-comments. + + * streams.texi (Output Variables): Add print-quoted. + + * lists.texi (Building Lists): Minor cleanup. + + * hash.texi (Creating Hash): Correct and clarify doc of WEAK values. + + * display.texi (Overlays): Explain overlays use markers. + (Managing Overlays): Explain front-advance and rear-advance + in more detail. + + * loading.texi (Unloading): Document unload-feature-special-hooks. + Get rid of fns-NNN.el file. + +2004-02-16 Matthew Mundell <matt@mundell.ukfsn.org> (tiny change) + + * help.texi (Describing Characters): Fix text-char-description + example output. + + * edebug.texi (Using Edebug): Fix example. + + * debugging.texi (Internals of Debugger): Fix return value. + + * files.texi (Changing Files): Fix argname. + + * calendar.texi: Fix parens, and default values. + + * display.texi, frames.texi, internals.texi, modes.texi: Minor fixes. + * nonascii.texi, objects.texi, os.texi: Minor fixes. + * searching.texi, text.texi, tips.texi, windows.text: Minor fixes. + + * positions.texi (Text Lines): Don't add -1 in current-line. + +2004-02-16 Richard M. Stallman <rms@gnu.org> + + * compile.texi (Compiler Errors): if-boundp feature applies to cond. + +2004-02-16 Jesper Harder <harder@ifa.au.dk> (tiny change) + + * processes.texi (Low-Level Network): Fix a typo. + +2004-02-12 Kim F. Storm <storm@cua.dk> + + * display.texi (Fringes): Use consistent wording. + Note that window-fringe's window arg is optional. + (Scroll Bars): Use consistent wording. + +2004-02-11 Luc Teirlinck <teirllm@auburn.edu> + + * tips.texi (Comment Tips): Document the new conventions for + commenting out code. + +2004-02-07 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * positions.texi (Text Lines): Added missing end defun. + +2004-02-07 Kim F. Storm <storm@cua.dk> + + * positions.texi (Text Lines): Add line-number-at-pos. + +2004-02-06 John Paul Wallington <jpw@gnu.org> + + * display.texi (Button Properties, Button Buffer Commands): + mouse-2 invokes button, not down-mouse-1. + +2004-02-04 Jason Rumney <jasonr@gnu.org> + + * makefile.w32-in: Sync with Makefile.in changes. + +2004-02-03 Luc Teirlinck <teirllm@auburn.edu> + + * minibuf.texi (Text from Minibuffer): Various corrections and + clarifications. + (Object from Minibuffer): Correct Lisp description of + read-minibuffer. + (Minibuffer History): Clarify description of cons values for + HISTORY arguments. + (Basic Completion): Various corrections and clarifications. Add + completion-regexp-list. + (Minibuffer Completion): Correct and clarify description of + completing-read. + (Completion Commands): Mention Partial Completion mode. Various + other minor changes. + (High-Level Completion): Various corrections and clarifications. + (Reading File Names): Ditto. + (Minibuffer Misc): Ditto. + +2004-01-26 Luc Teirlinck <teirllm@auburn.edu> + + * strings.texi (Text Comparison): assoc-string also matches + elements of alists that are strings instead of conses. + (Formatting Strings): Standardize Texinfo usage. Update index + entries. + +2004-01-20 Luc Teirlinck <teirllm@auburn.edu> + + * lists.texi (Sets And Lists): Add delete-dups. + +2004-01-15 Luc Teirlinck <teirllm@auburn.edu> + + * edebug.texi (Instrumenting Macro Calls): `declare' is not a + special form. + * macros.texi (Defining Macros): Update description of `declare', + which now is a macro. + (Wrong Time): Fix typos. + +2004-01-14 Luc Teirlinck <teirllm@auburn.edu> + + * compile.texi (Compilation Functions): Expand descriptions of + `compile-defun', `byte-compile-file', `byte-recompile-directory' + and `batch-byte-compile'. In particular, mention and describe + all optional arguments. + (Disassembly): Correct and clarify the description of `disassemble'. + +2004-01-11 Luc Teirlinck <teirllm@auburn.edu> + + * searching.texi: Various small changes in addition to the + following. + (Regexp Example): Adapt to new value of `sentence-end'. + (Regexp Functions): The PAREN argument to `regexp-opt' can be + `words'. + (Search and Replace): Add usage note for `perform-replace'. + (Entire Match Data): Mention INTEGERS and REUSE arguments to + `match-data'. + (Standard Regexps): Update for new values of `paragraph-start' + and `sentence-end'. + +2004-01-07 Luc Teirlinck <teirllm@auburn.edu> + + * files.texi (Saving Buffers): Clarify descriptions of + `write-contents-functions' and `before-save-hook'. + Make the defvar's for `before-save-hook' and `after-save-hook' + into defopt's. + +2004-01-07 Kim F. Storm <storm@cua.dk> + + * commands.texi (Click Events): Describe new image and + width/height elements of click events. + (Accessing Events): Add posn-string, posn-image, and + posn-object-width-height. Change posn-object to return either + image or string object. + +2004-01-01 Simon Josefsson <jas@extundo.com> + + * hooks.texi (Standard Hooks): Add before-save-hook. + * files.texi (Saving Buffers): Likewise. + +2004-01-03 Richard M. Stallman <rms@gnu.org> + + * frames.texi (Frames and Windows): Delete frame-root-window. + +2004-01-03 Luc Teirlinck <teirllm@auburn.edu> + + * eval.texi, hash.texi, help.texi, symbols.texi: Add anchors. + + * functions.texi: Various small changes in addition to the + following. + (What Is a Function): `functionp' returns nil for macros. Clarify + behavior of this and following functions for symbol arguments. + (Function Documentation): Add `\' in front of (fn @var{arglist}) + and explain why. + (Defining Functions): Mention DOCSTRING argument to `defalias'. + Add anchor. + (Mapping Functions): Add anchor. Unquote nil in mapcar* example. + +2004-01-01 Miles Bader <miles@gnu.org> + + * display.texi (Buttons): New section. + +2003-12-31 Andreas Schwab <schwab@suse.de> + + * numbers.texi (Math Functions): sqrt reports a domain-error + error. + (Float Basics): Use `(/ 0.0 0.0)' instead of `(sqrt -1.0)'. + +2003-12-30 Luc Teirlinck <teirllm@auburn.edu> + + * tips.texi (Documentation Tips): Update item on hyperlinks in + documentation strings. + + * errors.texi (Standard Errors): Various small corrections and + additions. + + * control.texi: Various small changes in addition to the + following. + (Signaling Errors): Provide some more details on how `signal' + constructs the error message. Add anchor to the definition of + `signal'. + (Error Symbols): Describe special treatment of `quit'. + (Cleanups): Rename BODY argument of `unwind-protect' to BODY-FORM + to emphasize that it has to be a single form. + + * buffers.texi: Add anchor. + +2003-12-29 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Choosing Window): Add same-window-p, special-display-p. + (Window Configurations): Add window-configuration-frame. + + * variables.texi (Creating Buffer-Local): Add local-variable-if-set-p. + + * text.texi (Examining Properties): Add get-char-property-and-overlay. + Change arg name in get-char-property. + (Special Properties): Update handling of keymap property. + + * strings.texi (Modifying Strings): Add clear-string. + (Text Comparison): Add assoc-string and remove + assoc-ignore-case, assoc-ignore-representation. + + * os.texi (Time of Day): Add set-time-zone-rule. + + * numbers.texi (Math Functions): asin, acos, log, log10 + report domain-error errors. + + * nonascii.texi (Converting Representations): + Add multibyte-char-to-unibyte and unibyte-char-to-multibyte. + (Encoding and I/O): Add file-name-coding-system. + + * modes.texi (Search-based Fontification): Explain that + face specs are symbols with face names as values. + + * minibuf.texi (Minibuffer Misc): Add set-minibuffer-window. + + * lists.texi (Building Lists): remq moved elsewhere. + (Sets And Lists): remq moved here. + (Association Lists): Refer to assoc-string. + + * internals.texi (Garbage Collection): Add memory-use-counts. + + * frames.texi (Frames and Windows): Add set-frame-selected-window + and frame-root-window. + + * files.texi (Contents of Directories): + Add directory-files-and-attributes. + + * display.texi (Refresh Screen): Add force-window-update. + (Invisible Text): Explain about moving point out of invis text. + (Overlay Properties): Add overlay-properties. + (Managing Overlays): Add overlayp. + (GIF Images): Invalid image number displays a hollow box. + + * buffers.texi (Buffer Modification): Add restore-buffer-modified-p. + (Killing Buffers): Add buffer-live-p. + +2003-12-25 Markus Rost <rost@mathematik.uni-bielefeld.de> + + * display.texi (Fringes): Fix typo "set-buffer-window". + +2003-12-24 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi, eval.texi, help.texi, internals.texi, loading.texi: + * nonascii.texi, processes.texi, tips.texi, variables.texi: + Add or change various xrefs and anchors. + + * commands.texi: Replace all occurrences of @acronym{CAR} with + @sc{car}, for consistency with the rest of the Elisp manual. + `car' and `cdr' are historically acronyms, but are no longer + widely thought of as such. + + * internals.texi (Pure Storage): Mention that `purecopy' does not + copy text properties. + (Object Internals): Now 29 bits are used (in most implementations) + to address Lisp objects. + + * variables.texi (Variables with Restricted Values): New node. + + * objects.texi (Lisp Data Types): Mention that certain variables + can only take on a restricted set of values and add an xref to + the new node "Variables with Restricted Values". + + * eval.texi (Function Indirection): Describe the errors that + `indirect-function' can signal. + (Eval): Clarify the descriptions of `eval-region' and `values'. + Describe `eval-buffer' instead of `eval-current-buffer' and + mention `eval-current-buffer' as an alias for `current-buffer'. + Correct the description and mention all optional arguments. + + * nonascii.texi: Various small changes in addition to the + following. + (Converting Representations): Clarify behavior of + `string-make-multibyte' and `string-to-multibyte' for unibyte all + ASCII arguments. + (Character Sets): Document the variable `charset-list' and adapt + the definition of the function `charset-list' accordingly. + (Translation of Characters): Clarify use of generic characters in + `make-translation-table'. Clarify and correct the description of + the use of translation tables in encoding and decoding. + (User-Chosen Coding Systems): Correct and clarify the description + of `select-safe-coding-system'. + (Default Coding Systems): Clarify description of + `file-coding-system-alist'. + +2003-11-30 Luc Teirlinck <teirllm@auburn.edu> + + * strings.texi (Text Comparison): Correctly describe when two + strings are `equal'. Combine and clarify descriptions of + `assoc-ignore-case' and `assoc-ignore-representation'. + + * objects.texi (Non-ASCII in Strings): Clarify description of + when a string is unibyte or multibyte. + (Bool-Vector Type): Update examples. + (Equality Predicates): Correctly describe when two strings are + `equal'. + +2003-11-29 Luc Teirlinck <teirllm@auburn.edu> + + * lists.texi (Building Lists): `append' no longer accepts integer + arguments. Update the description of `number-sequence' to reflect + recent changes. + (Sets And Lists): Describe `member-ignore-case' after `member'. + +2003-11-27 Kim F. Storm <storm@cua.dk> + + * commands.texi (Click Events): Click object may be an images. + Describe (dx . dy) element of click positions. + (Accessing Events): Remove duplicate posn-timestamp. + New functions posn-object and posn-object-x-y. + +2003-11-23 Kim F. Storm <storm@cua.dk> + + * commands.texi (Click Events): Describe enhancements to event + position lists, including new text-pos and (col . row) items. + Mention left-fringe and right-fringe area events. + (Accessing Events): New functions posn-area and + posn-actual-col-row. Mention posn-timestamp. Mention that + posn-point in non-text area still returns buffer position. + Clarify posn-col-row. + +2003-11-21 Lars Hansen <larsh@math.ku.dk> + + * files.texi (File Attributes): Describe new parameter ID-FORMAT. + * anti.texi (File Attributes): Describe removed parameter + ID-FORMAT. + +2003-11-20 Luc Teirlinck <teirllm@auburn.edu> + + * positions.texi (Positions): Mention that, if a marker is used as + a position, its buffer is ignored. + + * markers.texi (Overview of Markers): Mention it here too. + +2003-11-12 Luc Teirlinck <teirllm@auburn.edu> + + * numbers.texi (Numeric Conversions): Not just `floor', but also + `truncate', `ceiling' and `round' accept optional argument DIVISOR. + +2003-11-10 Luc Teirlinck <teirllm@auburn.edu> + + * markers.texi (Creating Markers): Specify insertion type of + created markers. Add xref to `Marker Insertion Types'. + Second argument to `copy-marker' is optional. + (Marker Insertion Types): Mention that most markers are created + with insertion type nil. + (The Mark): Correctly describe when `mark' signals an error. + (The Region): Correctly describe when `region-beginning' and + `region-end' signal an error. + +2003-11-08 Luc Teirlinck <teirllm@auburn.edu> + + * hash.texi (Creating Hash): Clarify description of `eql'. + `makehash' is obsolete. + (Hash Access): Add Common Lisp notes for `remhash' and `clrhash'. + + * positions.texi (Point): Change description of `buffer-end', so + that it is also correct for floating point arguments. + (List Motion): Correct argument lists of `beginning-of-defun' and + `end-of-defun'. + (Excursions): Add xref to `Marker Insertion Types'. + (Narrowing): Argument to `narrow-to-page' is optional. + +2003-11-06 Luc Teirlinck <teirllm@auburn.edu> + + * streams.texi (Output Streams): Clarify behavior of point for + marker output streams. + +2003-11-04 Luc Teirlinck <teirllm@auburn.edu> + + * variables.texi (Defining Variables): Second argument to + `defconst' is not optional. + (Setting Variables): Mention optional argument APPEND to + `add-to-list'. + (Creating Buffer-Local): Expand description of + `make-variable-buffer-local'. + (Frame-Local Variables): Expand description of + `make-variable-frame-local'. + (Variable Aliases): Correct description of optional argument + DOCSTRING to `defvaralias'. Mention return value of + `defvaralias'. + (File Local Variables): Add xref to `File variables' in Emacs + Manual. Correct description of `hack-local-variables'. Mention + `safe-local-variable' property. Mention optional second argument + to `risky-local-variable-p'. + +2003-11-03 Luc Teirlinck <teirllm@auburn.edu> + + * symbols.texi (Symbol Plists): Mention return value of `setplist'. + +2003-11-02 Jesper Harder <harder@ifa.au.dk> (tiny change) + + * lispref/anti.texi, lispref/backups.texi, lispref/commands.texi + lispref/customize.texi, lispref/display.texi, lispref/files.texi, + lispref/internals.texi, lispref/keymaps.texi, lispref/loading.texi, + lispref/modes.texi, lispref/nonascii.texi, lispref/numbers.texi, + lispref/objects.texi, lispref/os.texi, lispref/positions.texi, + lispref/processes.texi, lispref/searching.texi, + lispref/sequences.texi, lispref/streams.texi, lispref/strings.texi, + lispref/syntax.texi, lispref/text.texi: Replace @sc{foo} with + @acronym{FOO}. + +2003-10-27 Luc Teirlinck <teirllm@auburn.edu> + + * strings.texi (Creating Strings): Argument START to `substring' + can not be `nil'. Expand description of + `substring-no-properties'. Correct description of `split-string', + especially with respect to empty matches. Prevent very bad line + break in definition of `split-string-default-separators'. + (Text Comparison): `string=' and `string<' also accept symbols as + arguments. + (String Conversion): More completely describe argument BASE in + `string-to-number'. + (Formatting Strings): `%s' and `%S' in `format' do require + corresponding object. Clarify behavior of numeric prefix after + `%' in `format'. + (Case Conversion): The argument to `upcase-initials' can be a + character. + +2003-10-27 Kenichi Handa <handa@m17n.org> + + * display.texi (Fontsets): Fix texinfo usage. + +2003-10-25 Kenichi Handa <handa@m17n.org> + + * display.texi (Fontsets): Add description of the function + set-fontset-font. + +2003-10-23 Luc Teirlinck <teirllm@auburn.edu> + + * display.texi (Temporary Displays): Add xref to `Documentation + Tips'. + + * functions.texi (Function Safety): Use inforef instead of pxref + for SES. + +2003-10-23 Andreas Schwab <schwab@suse.de> + + * Makefile.in (TEX, texinputdir): Don't define. + (TEXI2DVI): Define. + (srcs): Remove $(srcdir)/index.perm and $(srcdir)/index.unperm, + add $(srcdir)/index.texi. + ($(infodir)/elisp): Remove index.texi dependency. + (elisp.dvi): Likewise. Use $(TEXI2DVI). + (index.texi): Remove target. + (dist): Don't link $(srcdir)/permute-index. + (clean): Don't remove index.texi. + + * permute-index, index.perm: Remove. + * index.texi: Rename from index.unperm. + +2003-10-22 Luc Teirlinck <teirllm@auburn.edu> + + * tips.texi (Documentation Tips): Document new behavior for face + and variable hyperlinks in Help mode. + +2003-10-21 Luc Teirlinck <teirllm@auburn.edu> + + * objects.texi (Integer Type): Update for extra bit of integer range. + (Character Type): Ditto. + +2003-10-16 Eli Zaretskii <eliz@gnu.org> + + * numbers.texi (Integer Basics): Add index entries for reading + numbers in hex, octal, and binary. + +2003-10-16 Lute Kamstra <lute@gnu.org> + + * modes.texi (Mode Line Format): Mention force-mode-line-update's + argument. + +2003-10-13 Luc Teirlinck <teirllm@auburn.edu> + + * windows.texi (Choosing Window): Fix typo. + * edebug.texi (Edebug Execution Modes): Fix typo. + +2003-10-13 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Basic Windows): A window has fringe settings, + display margins and scroll-bar settings. + (Splitting Windows): Doc split-window return value. + Clean up one-window-p. + (Selecting Windows): Fix typo. + (Cyclic Window Ordering): Explain frame as ALL-FRAMES in next-window. + (Buffers and Windows): In set-window-buffer, explain effect + on fringe settings and scroll bar settings. + (Displaying Buffers): In pop-to-buffer, explain nil as buffer arg. + (Choosing Window): Use defopt for pop-up-frame-function. + For special-display-buffer-names, explain same-window and same-frame. + Clarify window-dedicated-p return value. + (Textual Scrolling): scroll-up and scroll-down can get an error. + (Horizontal Scrolling): Clarify auto-hscroll-mode. + Clarify set-window-hscroll. + (Size of Window): Don't mention tool bar in window-height. + (Coordinates and Windows): Explain what coordinates-in-window-p + returns for fringes and display margins. + (Window Configurations): Explain saving fringes, etc. + + * tips.texi (Library Headers): Clean up Documentation. + + * syntax.texi (Parsing Expressions): Clean up forward-comment + and parse-sexp-lookup-properties. + + * sequences.texi (Sequence Functions): sequencep accepts bool-vectors. + + * os.texi (System Environment): Clean up text for load-average errors. + + * modes.texi (Hooks): Don't explain local hook details at front. + Clarify run-hooks and run-hook-with-args a little. + Clean up add-hook and remove-hook. + + * edebug.texi (Edebug Execution Modes): Clarify t. + Document edebug-sit-for-seconds. + (Coverage Testing): Document C-x X = and =. + (Instrumenting Macro Calls): Fix typo. + (Specification List): Don't index the specification keywords. + +2003-10-10 Kim F. Storm <storm@cua.dk> + + * processes.texi (Network): Introduce make-network-process. + +2003-10-09 Luc Teirlinck <teirllm@auburn.edu> + + * tips.texi (Library Headers): Fix typo. + +2003-10-07 Juri Linkov <juri@jurta.org> + + * modes.texi (Imenu): Mention imenu-create-index-function's + default value. Explain submenus better. + +2003-10-07 Lute Kamstra <lute@gnu.org> + + * modes.texi (Faces for Font Lock): Fix typo. + (Hooks): Explain how buffer-local hook variables can refer to + global hook variables. + Various minor clarifications. + +2003-10-06 Lute Kamstra <lute@gnu.org> + + * tips.texi (Coding Conventions): Mention naming conventions for + hooks. + +2003-10-05 Luc Teirlinck <teirllm@auburn.edu> + + * loading.texi (Library Search): Correct default value of + load-suffixes. + (Named Features): Fix typo. + +2003-10-05 Richard M. Stallman <rms@gnu.org> + + * loading.texi (Named Features): In `provide', + say how to test for subfeatures. + (Unloading): In unload-feature, use new var name + unload-feature-special-hooks. + +2003-10-03 Lute Kamstra <lute@gnu.org> + + * modes.texi (Major Mode Conventions): Mention third way to set up + Imenu. + (Imenu): A number of small fixes. + Delete documentation of internal variable imenu--index-alist. + Document the return value format of imenu-create-index-function + functions. + +2003-09-30 Richard M. Stallman <rms@gnu.org> + + * processes.texi (Network): Say what stopped datagram connections do. + + * lists.texi (Association Lists): Clarify `assq-delete-all'. + + * display.texi (Overlay Properties): Clarify `evaporate' property. + +2003-09-29 Lute Kamstra <lute@gnu.org> + + * modes.texi (Mode Line Data): Explain when symbols in mode-line + constructs should be marked as risky. + Change cons cell into proper list. + (Mode Line Variables): Change cons cell into proper list. + +2003-09-26 Lute Kamstra <lute@gnu.org> + + * modes.texi (Mode Line Data): Document the :propertize construct. + (Mode Line Variables): Reorder the descriptions of the variables + to match their order in the default mode-line-format. + Describe the new variables mode-line-position and mode-line-modes. + Update the default values of mode-line-frame-identification, + minor-mode-alist, and default-mode-line-format. + (Properties in Mode): Mention the :propertize construct. + +2003-09-26 Richard M. Stallman <rms@gnu.org> + + * buffers.texi, commands.texi, debugging.texi, eval.texi: + * loading.texi, minibuf.texi, text.texi, variables.texi: + Avoid @strong{Note:}. + +2003-09-26 Richard M. Stallman <rms@gnu.org> + + * keymaps.texi (Remapping Commands): Fix typo. + +2003-09-23 Luc Teirlinck <teirllm@mail.auburn.edu> + + * processes.texi (Low-Level Network): Fix typo. + +2003-09-23 Kim F. Storm <storm@cua.dk> + + * processes.texi (Network, Network Servers): Fix typos. + (Low-Level Network): Add timeout value for :server keyword. + Add new option keywords to make-network-process. + Add set-network-process-options. + Explain how to test availability of network options. + +2003-09-19 Richard M. Stallman <rms@gnu.org> + + * text.texi (Motion by Indent): Arg to + backward-to-indentation and forward-to-indentation is optional. + + * strings.texi (Creating Strings): Add substring-no-properties. + + * processes.texi + (Process Information): Add list-processes arg QUERY-ONLY. + Delete process-contact from here. + Add new status values for process-status. + Add process-get, process-put, process-plist, set-process-plist. + (Synchronous Processes): Add call-process-shell-command. + (Signals to Processes): signal-process allows process objects. + (Network): Complete rewrite. + (Network Servers, Datagrams, Low-Level Network): New nodes. + + * positions.texi (Word Motion): forward-word, backward-word + arg is optional. Reword. + + * abbrevs.texi (Defining Abbrevs): Index no-self-insert. + + * variables.texi (Creating Buffer-Local): + Delete duplicate definition of buffer-local-value. + (File Local Variables): Explain about discarding text props. + +2003-09-11 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (Intro to Minibuffers): Explain that the minibuffer + changes variables that record input events. + (Minibuffer Misc): Add minibuffer-selected-window. + + * lists.texi (Building Lists): Add copy-tree. + + * display.texi (Fontsets): Add char-displayable-p. + (Scroll Bars): New node. + +2003-09-08 Lute Kamstra <lute@gnu.org> + + * modes.texi (%-Constructs): Document new `%i' and `%I' + constructs. + +2003-09-03 Peter Runestig <peter@runestig.com> + + * makefile.w32-in: New file. + +2003-08-29 Richard M. Stallman <rms@gnu.org> + + * display.texi (Overlay Properties): Clarify how priorities + affect use of the properties. + +2003-08-19 Luc Teirlinck <teirllm@mail.auburn.edu> + + * customize.texi (Type Keywords): Correct the description of + `:help-echo' in the case where `motion-doc' is a function. + +2003-08-14 John Paul Wallington <jpw@gnu.org> + + * modes.texi (Emulating Mode Line): Subsection, not section. + +2003-08-13 Richard M. Stallman <rms@gnu.org> + + * elisp.texi (Top): Update subnode lists in menu. + + * text.texi (Insertion): Add insert-buffer-substring-no-properties. + (Kill Functions): kill-region has new arg yank-handler. + (Yanking): New node. + (Yank Commands): Add yank-undo-function. + (Low-Level Kill Ring): + kill-new and kill-append have new arg yank-handler. + (Changing Properties): Add remove-list-of-text-properties. + (Atomic Changes): New node. + + * symbols.texi (Other Plists): Add lax-plist-get, lax-plist-put. + + * streams.texi (Output Variables): Add eval-expression-print-length + and eval-expression-print-level. + + * os.texi (Time Conversion): For encode-time, explain limits on year. + + * objects.texi (Character Type): Define anchor "modifier bits". + + * modes.texi (Emulating Mode Line): New node. + (Search-based Fontification): Font Lock uses font-lock-face property. + (Other Font Lock Variables): Likewise. + + * keymaps.texi (Format of Keymaps): Keymaps contain char tables, + not vectors. + (Active Keymaps): Add emulation-mode-map-alists. + (Functions for Key Lookup): key-binding has new arg no-remap. + (Remapping Commands): New node. + (Scanning Keymaps): where-is-internal has new arg no-remap. + (Tool Bar): Add tool-bar-local-item-from-menu. + Clarify when to use tool-bar-add-item-from-menu. + + * commands.texi (Interactive Call): commandp has new arg. + (Command Loop Info): Add this-original-command. + +2003-08-06 John Paul Wallington <jpw@gnu.org> + + * compile.texi (Compiler Errors): Say `@end defmac' after `@defmac'. + + * display.texi (Warning Basics): Fix typo. + (Fringes): Add closing curly bracket and fix typo. + + * elisp.texi (Top): Fix typo. + +2003-08-05 Richard M. Stallman <rms@gnu.org> + + * elisp.texi: Update lists of subnodes. + + * windows.texi (Buffers and Windows): set-window-buffer has new arg. + + * variables.texi (Local Variables): Use lc for example variable names. + + * tips.texi (Library Headers): Explain where to put -*-. + + * strings.texi (Creating Strings): Fix xref for vconcat. + + * sequences.texi (Vector Functions): + vconcat no longer allows integer args. + + * minibuf.texi (Reading File Names): read-file-name has new + arg PREDICATE. New function read-directory-name. + + * macros.texi (Defining Macros): Give definition of `declare' + (Indenting Macros): New node. + + * frames.texi (Parameter Access): Add modify-all-frames-parameters. + (Window Frame Parameters): Make separate table of parameters + that are coupled with specific face attributes. + (Deleting Frames): delete-frame-hooks renamed to + delete-frame-functions. + + * files.texi (Magic File Names): Add file-remote-p. + Clarify file-local-copy. + + * edebug.texi (Instrumenting Macro Calls): Don't define `declare' + here; instead xref Defining Macros. + + * display.texi (Warnings): New node, and subnodes. + (Fringes): New node. + + * debugging.texi (Test Coverage): New node. + + * compile.texi (Compiler Errors): Explain with-no-warnings + and other ways to suppress warnings. + + * commands.texi (Interactive Call): Minor clarification. + + * buffers.texi (Buffer File Name): set-visited-file-name + renames the buffer too. + + * abbrevs.texi (Abbrev Tables): Add copy-abbrev-table. + +2003-07-24 Markus Rost <rost@math.ohio-state.edu> + + * abbrevs.texi (Abbrev Expansion): Use \s syntax in example. + +2003-07-22 Markus Rost <rost@math.ohio-state.edu> + + * internals.texi (Garbage Collection): Fix previous change. + +2003-07-22 Richard M. Stallman <rms@gnu.org> + + * files.texi (Truenames): Add LIMIT arg to file-chase-links. + + * display.texi (Width): Use \s syntax in example. + (Font Selection): Add face-font-rescale-alist. + + * modes.texi (Imenu): Add xref to Emacs Manual node on Imenu. + Remove spurious indent in example. + + * lists.texi (Building Lists): Add number-sequence. + + * internals.texi (Garbage Collection): Add gcs-done, gc-elapsed. + + * functions.texi (Function Documentation): Explain how to + show calling convention explicitly in the doc string. + + * windows.texi (Selecting Windows): save-selected-window saves + selected window of each frame. + (Window Configurations): Minor change. + + * syntax.texi (Syntax Table Functions): Use \s syntax in examples. + + * streams.texi (Output Variables): Add print-continuous-numbering + and print-number-table. + + * processes.texi (Decoding Output): New node. + + * os.texi (Time Conversion): decode-time arg is optional. + + * objects.texi (Character Type): Don't use space as example for \. + Make list of char names and \-sequences correspond. + Explain that \s is not used in strings. `\ ' needs space after. + + * nonascii.texi (Converting Representations): Add string-to-multibyte. + (Translation of Characters): Add translation-table-for-input. + (Default Coding Systems): Add auto-coding-functions. + (Explicit Encoding): Add decode-coding-inserted-region. + (Locales): Add locale-info. + + * minibuf.texi (Basic Completion): Describe test-completion. + Collections can be lists of strings. + Clean up lazy-completion-table. + (Programmed Completion): Mention test-completion. + Clarify why lambda expressions are not accepted. + (Minibuffer Misc): Describe minibufferp. + +2003-07-14 Richard M. Stallman <rms@gnu.org> + + * buffers.texi (Killing Buffers): kill-buffer-hook is perm local. + + * windows.texi (Selecting Windows): New arg to select-window. + (Selecting Windows): Add with-selected-window. + (Size of Window): Add window-inside-edges, etc. + + * internals.texi (Garbage Collection): Add post-gc-hook. + + * processes.texi (Subprocess Creation): Add exec-suffixes. + + * keymaps.texi (Functions for Key Lookup): Add current-active-maps. + (Scanning Keymaps): Add map-keymaps. + (Defining Menus): Add keymap-prompt. + + * numbers.texi (Integer Basics): Add most-positive-fixnum, + most-negative-fixnum. + + * compile.texi (Byte Compilation): Explain no-byte-compile + (Compiler Errors): New node. + + * os.texi (User Identification): user-uid, user-real-uid + can return float. + + * modes.texi (Major Mode Conventions): Explain about run-mode-hooks + and about derived modes. + (Minor Modes): Add minor-mode-list. + (Defining Minor Modes): Keyword args for define-minor-mode. + (Search-based Fontification): Explain managing other properties. + (Other Font Lock Variables): Add font-lock-extra-managed-props. + (Faces for Font Lock): Add font-locl-preprocessor-face. + (Hooks): Add run-mode-hooks and delay-mode-hooks. + + * variables.texi (Creating Buffer-Local): Add buffer-local-value. + (Variable Aliases): Clarify defvaralias. + + * loading.texi (Library Search): Add load-suffixes. + + * minibuf.texi (Basic Completion): Add lazy-completion-table. + (Programmed Completion): Add dynamic-completion-table. + + * files.texi (Changing Files): copy-file allows dir as NEWNAME. + (Magic File Names): Specify precedence order of handlers. + + * commands.texi (Command Overview): Emacs server runs pre-command-hook + and post-command-hook. + (Waiting): New calling convention for sit-for. + + * text.texi (Special Properties): local-map and keymap properties + apply based on their stickiness. + +2003-07-07 Richard M. Stallman <rms@gnu.org> + + * modes.texi (Minor Mode Conventions): Specify only some kinds + of list values as args to minor modes. + + * files.texi (File Name Expansion): Warn about iterative use + of substitute-in-file-name. + + * advice.texi (Activation of Advice): Clean up previous change. + +2003-07-06 Markus Rost <rost@math.ohio-state.edu> + + * advice.texi (Activation of Advice): Note that ad-start-advice is + turned on by default. + +2003-06-30 Richard M. Stallman <rms@gnu.org> + + * text.texi (Buffer Contents): Document current-word. + (Change Hooks): Not called for *Messages*. + + * functions.texi (Defining Functions): Explain about redefining + primitives. + (Function Safety): Renamed. Minor changes. + Comment out the detailed criteria for what is safe. + +2003-06-22 Andreas Schwab <schwab@suse.de> + + * objects.texi (Symbol Type): Fix description of examples. + +2003-06-16 Andreas Schwab <schwab@suse.de> + + * hash.texi (Creating Hash): Fix description of :weakness. + +2003-06-13 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> + + * files.texi (Changing Files): copy-file copies file modes, too. + +2003-05-28 Richard M. Stallman <rms@gnu.org> + + * strings.texi (Creating Strings): Clarify split-string. + +2003-05-22 Stephen J. Turnbull <stephen@xemacs.org> + + * strings.texi (Creating Strings): Update split-string specification + and examples. + +2003-05-19 Richard M. Stallman <rms@gnu.org> + + * elisp.texi: Correct invariant section names. + +2003-04-20 Richard M. Stallman <rms@gnu.org> + + * os.texi (Timers): Explain about timers and quitting. + +2003-04-19 Richard M. Stallman <rms@gnu.org> + + * internals.texi (Writing Emacs Primitives): Strings are + no longer special for GCPROs. Mention GCPRO5, GCPRO6. + Explain GCPRO convention for varargs function args. + +2003-04-16 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (Minibuffer Misc): Document fn minibuffer-message. + +2003-04-08 Richard M. Stallman <rms@gnu.org> + + * files.texi (Kinds of Files): Correct return value of file-symlink-p. + +2003-02-13 Kim F. Storm <storm@cua.dk> + + * objects.texi (Character Type): New \s escape for space. + +2003-01-31 Joe Buehler <jhpb@draco.hekimian.com> + + * os.texi (System Environment): Added cygwin system-type. + +2003-01-25 Richard M. Stallman <rms@gnu.org> + + * keymaps.texi: Document that a symbol can act as a keymap. + +2003-01-13 Richard M. Stallman <rms@gnu.org> + + * text.texi (Changing Properties): Say string indices are origin-0. + + * positions.texi (Screen Lines) <compute-motion>: + Correct order of elts in return value. + + * keymaps.texi (Changing Key Bindings) <define-key>: Mention + how to define a default binding. + +2002-12-07 Markus Rost <rost@math.ohio-state.edu> + + * loading.texi (Unloading): Fix recent change for load-history. + + * customize.texi (Simple Types): Clarify description of custom + type 'number. Describe new custom type 'float. + +2002-12-04 Markus Rost <rost@math.ohio-state.edu> + + * variables.texi (File Local Variables): Fix typo. + +2002-10-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> + + From Michael Albinus <Michael.Albinus@alcatel.de>. + + * README: Target for Info file is `make info'. + + * files.texi (File Name Components): Fixed typos in + `file-name-sans-extension'. + (Magic File Names): Complete list of operations for magic file + name handlers. + +2002-09-16 Jonathan Yavner <jyavner@engineer.com> + + * variables.texi (File Local Variables): New function + risky-local-variable-p. + +2002-09-15 Jonathan Yavner <jyavner@engineer.com> + + * functions.texi (Function safety): New node about unsafep. + +2002-08-05 Per Abrahamsen <abraham@dina.kvl.dk> + + * customize.texi (Splicing into Lists): Fixed example. + Reported by Fabrice Bauzac <fabrice.bauzac@wanadoo.fr> + +2002-06-17 Juanma Barranquero <lektu@terra.es> + + * frames.texi (Display Feature Testing): Fix typo. + +2002-06-12 Andreas Schwab <schwab@suse.de> + + * frames.texi (Initial Parameters, Resources): Fix references to + the Emacs manual. + +2002-05-13 Kim F. Storm <storm@cua.dk> + + * variables.texi (Intro to Buffer-Local): Updated warning and + example relating to changing buffer inside let. + +2002-03-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * os.texi (Session Management): New node about X Session management. + +2002-01-18 Eli Zaretskii <eliz@is.elta.co.il> + + * elisp.texi (VERSION): Set to 2.9. Update the version of Emacs + to which the manual corresponds, and the copyright years. + + * Makefile.in (VERSION): Set to 2.9. + +2001-11-29 Eli Zaretskii <eliz@is.elta.co.il> + + * elisp.texi: Change the category in @dircategory to "Emacs", to + make it consistent with info/dir. + +2001-11-25 Miles Bader <miles@gnu.org> + + * text.texi (Fields): Describe new `limit' arg in + field-beginning/field-end. + +2001-11-17 Eli Zaretskii <eliz@is.elta.co.il> + + * permute-index: Don't depend on csh-specific features. Replace + the interpreter name with /bin/sh. + + * two-volume-cross-refs.txt: New file. + * two.el: New file. + * spellfile: New file. + +2001-11-16 Eli Zaretskii <eliz@is.elta.co.il> + + * permute-index: New file. + + * vol1.texi, vol2.texi: Renamed from elisp-vol1.texi and + elisp-vol2.texi, respectively, to avoid file-name clashes in DOS + 8+3 restricted namespace. + + * Makefile.in (infodir): Define relative to $(srcdir). + ($(infodir)/elisp): Don't chdir into $(srcdir), but add it to the + include directories list via -I switch to makeinfo. + (index.texi): Use cp if both hard and symbolic links fail. + +2001-11-10 Eli Zaretskii <eliz@is.elta.co.il> + + * Makefile.in (distclean): Add. + + The following changes make ELisp manual part of the Emacs + distribution: + + * Makefile.in: Add Copyright notice. + (prefix): Remove. + (infodir): Change value to "../info". + (VPATH): New variable. + (MAKE): Don't define. + (texmacrodir): Don't define. + (texinputdir): Append the existing value of TEXINPUTS. + ($(infodir)/elisp): Instead of just "elisp". Reformat the + command to be compatible with man/Makefile.in, and to put the + output into ../info. + (info): Add target. + (installall): Target removed. + +2001-10-31 Pavel Jan,Am(Bk <Pavel@Janik.cz> + + * tips.texi (Coding Conventions): Fix typo. + +2001-10-23 Gerd Moellmann <gerd@gnu.org> + + * Makefile.in (srcs): Add gpl.texi and doclicense.texi. + +2001-10-22 Eli Zaretskii <eliz@is.elta.co.il> + + * files.texi (File Name Components): Update the description of + file-name-sans-extension and file-name-extension, as they now + ignore leading dots. + +2001-10-20 Gerd Moellmann <gerd@gnu.org> + + * (Version 21.1 released.) + +2001-10-19 Miles Bader <miles@gnu.org> + + * positions.texi (Text Lines): Describe behavior of + `beginning-of-line'/`end-of-line' in the presence of field properties. + +2001-10-17 Gerd Moellmann <gerd@gnu.org> + + * Makefile.in (VERSION): Set to 2.8. + (manual): Use `manual-21'. + + * elisp.texi (VERSION): Add and use it where the version + number was used. Set it to 2.8. + + * intro.texi: Likewise. + +2001-10-13 Eli Zaretskii <eliz@is.elta.co.il> + + * files.texi (File Name Completion): Document the significance of + a trailing slash in elements of completion-ignored-extensions. + +2001-10-06 Miles Bader <miles@gnu.org> + + * variables.texi (Variable Aliases): It's `@defmac', not `@defmacro'. + +2001-10-04 Gerd Moellmann <gerd@gnu.org> + + * variables.texi (Variable Aliases): New node. + +2001-10-04 Gerd Moellmann <gerd@gnu.org> + + * Branch for 21.1. + +2001-10-02 Miles Bader <miles@gnu.org> + + * minibuf.texi (Minibuffer Misc): Add entries for + `minibuffer-contents', `minibuffer-contents-no-properties', and + `delete-minibuffer-contents'. + Correct description for `minibuffer-prompt-end'. + + * text.texi (Property Search): Correct descriptions of + `next-char-property-change' and `previous-char-property-change'. + Add entries for `next-single-char-property-change' and + `previous-single-char-property-change'. + Make operand names a bit more consistent. + +2001-09-30 Eli Zaretskii <eliz@is.elta.co.il> + + * frames.texi (Finding All Frames): Document that next-frame and + previous-frame are local to current terminal. + +2001-09-26 Eli Zaretskii <eliz@is.elta.co.il> + + * keymaps.texi (Creating Keymaps): Fix the description of the + result of make-keymap. + +2001-09-23 Eli Zaretskii <eliz@is.elta.co.il> + + * display.texi (Font Lookup, Attribute Functions) + (Image Descriptors): Add cross-references to the definition of + selected frame. + + * buffers.texi (The Buffer List): Add cross-references to the + definition of selected frame. + + * frames.texi (Input Focus): Clarify which frame is _the_ selected + frame at any given time. + (Multiple Displays, Size and Position): Add a cross-reference to + the definition of the selected frame. + +2001-09-08 Eli Zaretskii <eliz@is.elta.co.il> + + * strings.texi (String Conversion) <string-to-number>: Document + that a float is returned for integers that are too large. + + * frames.texi (Mouse Position): Document mouse-position-function. + (Display Feature Testing): Document display-images-p. + (Window Frame Parameters): Document the cursor-type variable. + + * numbers.texi (Integer Basics): Document CL style read syntax for + integers in bases other than 10. + + * positions.texi (List Motion): Document + open-paren-in-column-0-is-defun-start. + + * lists.texi (Sets And Lists): Document member-ignore-case. + + * internals.texi (Garbage Collection): Document the used and free + strings report. + (Memory Usage): Document strings-consed. + + * os.texi (Time of Day): Document float-time. + (Recording Input): Document that clear-this-command-keys clears + the vector to be returned by recent-keys. + + * keymaps.texi (Scanning Keymaps) <where-is-internal>: The + argument keymap can be a list. + + * nonascii.texi (User-Chosen Coding Systems) + <select-safe-coding-system>: Document the new argument + accept-default-p and the variable + select-safe-coding-system-accept-default-p. Tell what happens if + buffer-file-coding-system is undecided. + (Default Coding Systems): Document auto-coding-regexp-alist. + + * display.texi (The Echo Area) <message>: Document + message-truncate-lines. + (Glyphs): Document that the glyph table is unused on windowed + displays. + + * help.texi (Describing Characters) <single-key-description>: + Document the new argument no-angles. + (Accessing Documentation) <documentation-property>: Document that + a non-string property is evaluated. + <documentation>: Document that the function-documentation property + is looked for. + + * windows.texi (Selecting Windows): Document some-window. + + * text.texi (MD5 Checksum): New node, documents the md5 primitive. + + * hooks.texi (Standard Hooks): Add kbd-macro-termination-hook and + apropos-mode-hook. + + * commands.texi (Using Interactive): Document interactive-form. + (Keyboard Macros): Document kbd-macro-termination-hook. + (Command Loop Info): Document that clear-this-command-keys clears + the vector to be returned by recent-keys. + +2001-09-04 Werner LEMBERG <wl@gnu.org> + + * Makefile.in (srcdir, texinputdir): New variables. + (srcs, index.texi, install): Use $(srcdir). + (.PHONY): Remove elisp.dvi. + (elisp): Use -I switch for makeinfo. + (elisp.dvi): Use $(srcdir) and $(texinputdir). + (installall, dist): Use $(srcdir). + Fix path to texinfo.tex. + (maintainer-clean): Add elisp.dvi and elisp.oaux. + +2001-08-30 Gerd Moellmann <gerd@gnu.org> + + * display.texi (Conditional Display): Adjust to API change. + + * configure: New file. + +2001-07-30 Gerd Moellmann <gerd@gnu.org> + + * commands.texi (Repeat Events): Add description of + double-click-fuzz. + +2001-05-08 Stefan Monnier <monnier@cs.yale.edu> + + * syntax.texi (Syntax Class Table): Add the missing designator for + comment and string fences. + (Syntax Properties): Add a xref to syntax table internals. + (Syntax Table Internals): Document string-to-syntax. + +2001-05-07 Gerd Moellmann <gerd@gnu.org> + + * Makefile.in (install): Use install-info command line options + like in Emacs' Makefile.in. + +2000-12-09 Miles Bader <miles@gnu.org> + + * windows.texi (Window Start): Update documentation for + `pos-visible-in-window-p'. + +2000-11-12 Stefan Monnier <monnier@cs.yale.edu> + + * lists.texi (Building Lists): Add footnote to explain how to add + to the end of a list. + +2000-10-25 Gerd Moellmann <gerd@gnu.org> + + * files.texi (Visiting Functions): Typos. + +2000-10-25 Kenichi Handa <handa@etl.go.jp> + + * files.texi (Visiting Functions): Return value of + find-file-noselect may be a list of buffers if wildcards are used. + +2000-10-24 Miles Bader <miles@lsi.nec.co.jp> + + * display.texi (Defining Faces): Document `graphic' display type + in face specs. + +2000-10-18 Kai Grossjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> + + * hooks.texi (Standard Hooks): Replace obsolete + `after-make-frame-hook' with `after-make-frame-functions'. + + * frames.texi (Creating Frames): Ditto. + + * variables.texi (Future Local Variables): Ditto. + +2000-10-16 Gerd Moellmann <gerd@gnu.org> + + * display.texi (Other Image Types): Add description of :foreground + and :background properties of mono PBM images. + +2000-08-17 Werner LEMBERG <wl@gnu.org> + + * .cvsignore: New file. + +2000-01-05 Gerd Moellmann <gerd@gnu.org> + + * tindex.pl: New script. + +1999-12-03 Dave Love <fx@gnu.org> + + * Makefile.in (MAKEINFO): New parameter. + +1999-09-17 Richard Stallman <rms@gnu.org> + + * Makefile.in (srcs): Add hash.texi. + (VERSION): Update to 20.6. + +1999-09-13 Richard Stallman <rms@gnu.org> + + * Makefile.in (index.texi): If cannot make a symlink, make a hard link. + +1998-08-29 Karl Heuer <kwzh@gnu.org> + + * configure.in: New file. + * Makefile.in: Renamed from Makefile. + (prefix, infodir): Use value obtained from configure. + (emacslibdir): Obsolete variable deleted. + (dist): Distribute configure.in, configure, Makefile.in. + +1998-06-12 Richard Stallman <rms@psilocin.ai.mit.edu> + + * Makefile (INSTALL_INFO): New variable. + (install): Run install-info. + +1998-05-09 Richard Stallman <rms@psilocin.ai.mit.edu> + + * Makefile (elisp.dvi): Add missing backslash. + +1998-05-02 Richard Stallman <rms@psilocin.gnu.org> + + * Makefile (elisp.dvi): Don't depend on texindex or on elisp.tps. + Run texindex without `./'. Always run texindex on elisp.tp. + (elisp.tps): Target deleted. + +1998-04-05 Richard Stallman <rms@psilocin.gnu.org> + + * Makefile (srcs): Add nonascii.texi and customize.texi. + (dist): Start by deleting `temp'. + +1998-02-17 Richard Stallman <rms@psilocin.gnu.org> + + * Makefile (makeinfo, texindex): Targets deleted. + (makeinfo.o, texindex.o): Targets deleted. + (clean, dist): Don't do anything with them or with getopt*. + +1998-01-30 Richard Stallman <rms@psilocin.gnu.org> + + * Makefile (SHELL): Defined. + +1998-01-27 Richard Stallman <rms@psilocin.gnu.org> + + * Makefile (elisp.tps): New target. + (elisp.dvi): Depend on elisp.tps. + +Wed Apr 3 15:24:25 1996 Karl Heuer <kwzh@gnu.ai.mit.edu> + + * README: Update phone number. + + * Makefile (elisp): Make this be the default target. + Depend on makeinfo.c instead of makeinfo. + (install): Don't depend on elisp.dvi, since we don't install that. + Use mkinstalldirs. + (dist): Add mkinstalldirs. + +Mon Jun 19 14:35:26 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu> + + * Makefile (VERSION): Update version number. + (maintainer-clean): Renamed from realclean. + +Wed Jun 7 17:04:59 1995 Karl Heuer <kwzh@nutrimat.gnu.ai.mit.edu> + + * Makefile (realclean): New target. + (elisp): Remove any old elisp-* files first. + +Tue Nov 23 19:59:40 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) + + * Makefile (VERSION): New variable. + (dist): Make packaged directory name `elisp-manual-19-$(VERSION)'. + Compressed file suffix should be `.gz', not `.z'. + +Mon Nov 22 15:06:19 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Makefile (elisp): Depend on makeinfo. + +Fri Nov 19 02:29:33 1993 Noah Friedman (friedman@gnu.ai.mit.edu) + + * Makefile (srcs): Add anti.texi. + +Fri May 28 18:04:53 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Makefile (infodir, prefix): New vars. + (install): Use infodir. + (emacsinfodir): Deleted. + +Thu May 27 02:11:25 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Makefile (srcs): Add calendar.texi. + + * Makefile (dist): Copy texindex.c and makeinfo.c. + Limit elisp-* files to those with one or two digits. + +Sun May 16 17:58:21 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu) + + * Makefile (dist): Changed to use Gzip instead of compress. + +Fri Apr 23 01:05:23 1993 Eric S. Raymond (eric@mole.gnu.ai.mit.edu) + + * loading.texi (Unloading): define-function changed back to + defalias. It may not stay this way, but at least it's + consistent with the known-good version of the code patch. + +Fri Mar 26 21:14:54 1993 Eric S. Raymond (eric@geech.gnu.ai.mit.edu) + + * modes.texi (Hooks): Document new optional arg of add-hook. + +Wed Mar 17 08:48:24 1993 Eric S. Raymond (eric@mole.gnu.ai.mit.edu) + + * variables.texi: Document nil initial value of buffer-local variables. + + * tips.texi: Add new section on standard library headers. + +Sat Feb 27 18:00:25 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu) + + * Makefile (srcs): Add frame.texi to the list of sources. + +Tue Feb 23 10:50:25 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu) + + * Makefile (dist): Don't bother excluding autosave files; they'll + never make it into the temp directory anyway, and the hash marks + in the name are problematic for make and the Bourne shell. + (srcs): + +Fri Feb 12 16:54:38 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu) + + * Makefile (dist): Don't include backup files or autosave files in + the distribution tar file. + +Tue Nov 26 21:10:34 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Makefile (srcs): Added index.perm. + (elisp.dvi): Remove erroneous shell comment. + Expect output of permute-index in permuted.fns. + Save old elisp.aux in elisp.oaux. + (clean): Added index.texi to be deleted. + +Sat Aug 11 17:39:10 1990 Richard Stallman (rms@sugar-bombs.ai.mit.edu) + + * Makefile (elisp.dvi, index.texi): Use shell if instead of ifdef. + +Tue Jun 26 09:57:26 1990 David Lawrence (tale@geech) + + * files.texi: Noted that completion-ignored-extensions is ignored + when making *Completions*. + +Fri Jun 8 16:44:44 EDT 1990 Jay Fenlason (hack@ai.mit.edu) + + * Makefile make dist now depends on elisp.dvi, since it tries + to include it in the dist file. + +Wed Mar 28 22:57:35 1990 Jim Kingdon (kingdon@mole.ai.mit.edu) + + * functions.texinfo (Mapping Functions): Add missing quote + +Mon Jun 19 18:09:24 1989 Richard Stallman (rms@sugar-bombs.ai.mit.edu) + + * texinfo.tex (frenchspacing): Use decimal codes for char to be set. + (defunargs): Turn off \hyphenchar of \sl font temporarily. + +Wed May 10 18:01:17 1989 Robert J. Chassell (bob@rice-chex.ai.mit.edu) + + * @result{}, @expansion{}, @print{}, @quiv{}, @point{}, + and @error{} are the terms now being used. The files in the + directory have been changed to reflect this. + + * All instances of @indentedresultt{} have been changed to + ` @result{}', using 5 spaces at the begining of the line. + +Mon Apr 24 21:02:55 1989 Robert J. Chassell (bob@rice-chex.ai.mit.edu) + + * @result{}, @expandsto{}, @prints{}, @quiv{}, @error{}, and the + experimental @indentedresult{}, @indentedexpandsto{} are part of + the texinfo.tex in this directory. These TeX macros are not + stable yet. + +Mon Apr 17 18:56:50 1989 Robert J. Chassell (bob@rice-chex.ai.mit.edu) + + * texinfo.tex: Temporarily added + \let\result=\dblarrow + \def\error{{\it ERROR} \longdblarrow} + We need to do this better soon. + +Tue Apr 11 12:23:28 1989 Robert J. Chassell (bob@rice-chex.ai.mit.edu) + + * Applied Karl Berry's patches to *.texinfo files, but not to + texinfo.tex; those diffs are in `berry-texinfo-tex-diffs'. (Karl's + new title page format is also not applied, since it requires + texinfo.tex changes.) + + * Cleaned up `Makefile' and defined the `emacslibdir' directory + for the Project GNU development environment. + +;; Local Variables: +;; coding: iso-2022-7bit +;; add-log-time-zone-rule: t +;; End: + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007 Free Software Foundation, Inc. + + This file is part of GNU Emacs. + + GNU Emacs is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GNU Emacs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Emacs; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +;;; arch-tag: 985ae0ce-df29-475b-b3f8-4bbcbf6f7fda diff --git a/doc/lispref/Makefile.in b/doc/lispref/Makefile.in new file mode 100644 index 00000000000..1a34d60a0d8 --- /dev/null +++ b/doc/lispref/Makefile.in @@ -0,0 +1,144 @@ +# Makefile for the GNU Emacs Lisp Reference Manual. + +# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, +# 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + +# This file is part of GNU Emacs. + +# GNU Emacs is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. + +# GNU Emacs is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# Standard configure variables. +srcdir = @srcdir@ + +# Tell make where to find source files; this is needed for the makefiles. +VPATH=@srcdir@ + +infodir = ../info +usermanualdir = $(srcdir)/../man + +TEXI2DVI = texi2dvi +SHELL = /bin/sh +INSTALL_INFO = install-info +MAKEINFO = makeinfo --force + +# The name of the manual: +VERSION=2.9 +manual = elisp-manual-21-$(VERSION) + +# List of all the texinfo files in the manual: + +srcs = \ + $(srcdir)/abbrevs.texi \ + $(srcdir)/advice.texi \ + $(srcdir)/anti.texi \ + $(srcdir)/back.texi \ + $(srcdir)/backups.texi \ + $(srcdir)/buffers.texi \ + $(srcdir)/commands.texi \ + $(srcdir)/compile.texi \ + $(srcdir)/control.texi \ + $(srcdir)/customize.texi \ + $(srcdir)/debugging.texi \ + $(srcdir)/display.texi \ + $(srcdir)/edebug.texi \ + $(srcdir)/elisp.texi \ + $(srcdir)/errors.texi \ + $(srcdir)/eval.texi \ + $(srcdir)/files.texi \ + $(srcdir)/frames.texi \ + $(srcdir)/functions.texi \ + $(srcdir)/hash.texi \ + $(srcdir)/help.texi \ + $(srcdir)/hooks.texi \ + $(srcdir)/internals.texi \ + $(srcdir)/intro.texi \ + $(srcdir)/keymaps.texi \ + $(srcdir)/lists.texi \ + $(srcdir)/loading.texi \ + $(srcdir)/locals.texi \ + $(srcdir)/macros.texi \ + $(srcdir)/maps.texi \ + $(srcdir)/markers.texi \ + $(srcdir)/minibuf.texi \ + $(srcdir)/modes.texi \ + $(srcdir)/nonascii.texi \ + $(srcdir)/numbers.texi \ + $(srcdir)/objects.texi \ + $(srcdir)/os.texi \ + $(srcdir)/positions.texi \ + $(srcdir)/processes.texi \ + $(srcdir)/searching.texi \ + $(srcdir)/sequences.texi \ + $(srcdir)/streams.texi \ + $(srcdir)/strings.texi \ + $(srcdir)/symbols.texi \ + $(srcdir)/syntax.texi \ + $(srcdir)/text.texi \ + $(srcdir)/tips.texi \ + $(srcdir)/variables.texi \ + $(srcdir)/windows.texi \ + $(srcdir)/index.texi \ + $(srcdir)/gpl.texi \ + $(srcdir)/doclicense.texi + + +.PHONY: clean + +# The info file is named `elisp'. +info: $(infodir)/elisp + +$(infodir)/elisp: $(srcs) + cd $(srcdir); $(MAKEINFO) -I. -I$(infodir) elisp.texi -o $(infodir)/elisp + +elisp.dvi: $(srcs) + $(TEXI2DVI) -I $(srcdir) -I $(usermanualdir) $(srcdir)/elisp.texi + +# This is for use in a separate distro of the Emacs Lisp manual. +install: elisp + $(srcdir)/mkinstalldirs $(infodir) + cp elisp elisp-[1-9] elisp-[1-9][0-9] $(infodir) + ${INSTALL_INFO} --info-dir=${infodir} ${infodir}/elisp + +# This is for use in a separate distro of the Emacs Lisp manual. +elisp: $(srcs) + $(MAKEINFO) -I. -I$(srcdir) $(srcdir)/elisp.texi + +clean: + rm -f *.toc *.aux *.log *.cp *.cps *.fn *.fns *.tp *.tps \ + *.vr *.vrs *.pg *.pgs *.ky *.kys + rm -f make.out core + +distclean: clean + +maintainer-clean: clean + rm -f elisp.dvi elisp.oaux + cd $(infodir); rm -f elisp elisp-[1-9] elisp-[1-9][0-9] + +dist: $(infodir)/elisp elisp.dvi + -rm -rf temp + -mkdir temp + -mkdir temp/$(manual) + -ln $(srcdir)/README $(srcdir)/configure.in $(srcdir)/configure \ + $(srcdir)/Makefile.in $(srcs) \ + $(srcdir)/../man/texinfo.tex \ + elisp.dvi elisp.aux elisp.??s \ + $(infodir)/elisp $(infodir)/elisp-[1-9] $(infodir)/elisp-[1-9][0-9] \ + temp/$(manual) + -(cd temp/$(manual); rm -f mkinstalldirs) + cp $(srcdir)/mkinstalldirs temp/$(manual) + (cd temp/$(manual); rm -f *~) + (cd temp; tar chf - $(manual)) | gzip > $(manual).tar.gz + -rm -rf temp diff --git a/doc/lispref/README b/doc/lispref/README new file mode 100644 index 00000000000..c5d4c8acc77 --- /dev/null +++ b/doc/lispref/README @@ -0,0 +1,72 @@ +Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. +See the end of the file for license conditions. + + +README for Edition 2.9 of the Emacs Lisp Reference Manual. + +* This directory contains the texinfo source files for the Reference +Manual, make-permuted-index, and the latest version of texinfo.tex, +which handles forms that cannot be handled by the older versions of +texinfo.tex. + +* Report Lisp Manual bugs to bug-lisp-manual@gnu.org. We don't read +these bug reports until it's time for a new edition. To report other +Emacs bugs, use bug-gnu-emacs@gnu.org. To ask questions, use the +newsgroup gnu.emacs.help. + +* The Emacs Lisp Reference Manual is quite large. It totals around +1100 pages in smallbook format; the info files total over +2.5 megabytes. + +* You can format this manual either for Info or for printing hardcopy +using TeX. + +* You can buy nicely printed copies from the Free Software Foundation. +For info, send mail to gnu@gnu.org or phone 617-542-5942. Buying a +manual from the Free Software Foundation helps support our GNU +development work. + +** This distribution contains a Makefile that you can use with GNU Make. +Otherwise, here are detailed instructions: + +** HARDCOPY: A copy of the version of `texinfo.tex' that formats this +manual is included in this distribution. + +The master file for formatting this manual for Tex is called +`elisp.texi'. It contains @include commands to include all the +chapters that make up the manual. In addition, `elisp.texi' has +the title page in a new format designed by Karl Berry, using the +@titlespec command. + +To create a DVI file with a sorted index, execute the following +commands in the shell: + +% ./configure +% make index.texi +% make elisp.dvi + +*** To create a DVI file with a permuted index, you may experiment +with `make-permuted-index'. + +** To make an Info file, you need to install Texinfo, then run +`./configure' and `make info'. To install the Info files, run +`make install'. + + +This file is part of GNU Emacs. + +GNU Emacs is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. diff --git a/doc/lispref/abbrevs.texi b/doc/lispref/abbrevs.texi new file mode 100644 index 00000000000..46e7c3739c4 --- /dev/null +++ b/doc/lispref/abbrevs.texi @@ -0,0 +1,411 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1999, 2001, 2002, 2003, +@c 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/abbrevs +@node Abbrevs, Processes, Syntax Tables, Top +@chapter Abbrevs and Abbrev Expansion +@cindex abbrev +@c @cindex abbrev table Redundant with "abbrev". + + An abbreviation or @dfn{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 @dfn{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 function to do +the expansion (@pxref{Defining Abbrevs}); its property list cell +typically contains the use count, the number of times the abbreviation +has been expanded. Alternatively, the use count is on the +@code{count} property and the system-abbrev flag is on the +@code{system-type} property. Abbrevs with a non-@code{nil} +@code{system-type} property are called ``system'' abbrevs. They are +usually defined by modes or packages, instead of by the user, and are +treated specially in certain respects. + +Because the symbols used for abbrevs are not interned in the usual +obarray, they will never appear as the result of reading a Lisp +expression; in fact, normally they are never used except by the code +that handles abbrevs. Therefore, it is safe to use them in an +extremely nonstandard way. @xref{Creating Symbols}. + + For the user-level commands for abbrevs, see @ref{Abbrevs,, Abbrev +Mode, emacs, The GNU Emacs Manual}. + +@menu +* Abbrev Mode:: Setting up Emacs for abbreviation. +* Tables: Abbrev Tables. Creating and working with abbrev tables. +* Defining Abbrevs:: Specifying abbreviations and their expansions. +* Files: Abbrev Files. Saving abbrevs in files. +* Expansion: Abbrev Expansion. Controlling expansion; expansion subroutines. +* Standard Abbrev Tables:: Abbrev tables used by various major modes. +@end menu + +@node Abbrev Mode, Abbrev Tables, Abbrevs, Abbrevs +@comment node-name, next, previous, up +@section Setting Up Abbrev Mode + + Abbrev mode is a minor mode controlled by the value of the variable +@code{abbrev-mode}. + +@defvar abbrev-mode +A non-@code{nil} value of this variable turns on the automatic expansion +of abbrevs when their abbreviations are inserted into a buffer. +If the value is @code{nil}, abbrevs may be defined, but they are not +expanded automatically. + +This variable automatically becomes buffer-local when set in any fashion. +@end defvar + +@defvar default-abbrev-mode +This is the value of @code{abbrev-mode} for buffers that do not override it. +This is the same as @code{(default-value 'abbrev-mode)}. +@end defvar + +@node Abbrev Tables, Defining Abbrevs, Abbrev Mode, Abbrevs +@section Abbrev Tables + + This section describes how to create and manipulate abbrev tables. + +@defun make-abbrev-table +This function creates and returns a new, empty abbrev table---an obarray +containing no symbols. It is a vector filled with zeros. +@end defun + +@defun clear-abbrev-table table +This function undefines all the abbrevs in abbrev table @var{table}, +leaving it empty. It always returns @code{nil}. +@end defun + +@defun copy-abbrev-table table +This function returns a copy of abbrev table @var{table}---a new +abbrev table that contains the same abbrev definitions. The only +difference between @var{table} and the returned copy is that this +function sets the property lists of all copied abbrevs to 0. +@end defun + +@defun define-abbrev-table tabname definitions +This function defines @var{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 @var{definitions}, a list of +elements of the form @code{(@var{abbrevname} @var{expansion} +@var{hook} @var{usecount} @var{system-flag})}. If an element of +@var{definitions} has length less than five, omitted elements default +to @code{nil}. A value of @code{nil} for @var{usecount} is equivalent +to zero. The return value is always @code{nil}. + +If this function is called more than once for the same @var{tabname}, +subsequent calls add the definitions in @var{definitions} to +@var{tabname}, rather than overriding the entire original contents. +(A subsequent call only overrides abbrevs explicitly redefined or +undefined in @var{definitions}.) +@end defun + +@defvar abbrev-table-name-list +This is a list of symbols whose values are abbrev tables. +@code{define-abbrev-table} adds the new abbrev table name to this list. +@end defvar + +@defun insert-abbrev-table-description name &optional human +This function inserts before point a description of the abbrev table +named @var{name}. The argument @var{name} is a symbol whose value is an +abbrev table. The return value is always @code{nil}. + +If @var{human} is non-@code{nil}, the description is human-oriented. +System abbrevs are listed and identified as such. Otherwise the +description is a Lisp expression---a call to @code{define-abbrev-table} +that would define @var{name} as it is currently defined, but without +the system abbrevs. (The mode or package using @var{name} is supposed +to add these to @var{name} separately.) +@end defun + +@node Defining Abbrevs, Abbrev Files, Abbrev Tables, Abbrevs +@comment node-name, next, previous, up +@section Defining Abbrevs + @code{define-abbrev} is the low-level basic function for defining an +abbrev in a specified abbrev table. When major modes predefine standard +abbrevs, they should call @code{define-abbrev} and specify @code{t} for +@var{system-flag}. Be aware that any saved non-``system'' abbrevs are +restored at startup, i.e. before some major modes are loaded. Major modes +should therefore not assume that when they are first loaded their abbrev +tables are empty. + +@defun define-abbrev table name expansion &optional hook count system-flag +This function defines an abbrev named @var{name}, in @var{table}, to +expand to @var{expansion} and call @var{hook}. The return value is +@var{name}. + +The value of @var{count}, if specified, initializes the abbrev's +usage-count. If @var{count} is not specified or @code{nil}, the use +count is initialized to zero. + +The argument @var{name} should be a string. The argument +@var{expansion} is normally the desired expansion (a string), or +@code{nil} to undefine the abbrev. If it is anything but a string or +@code{nil}, then the abbreviation ``expands'' solely by running +@var{hook}. + +The argument @var{hook} is a function or @code{nil}. If @var{hook} is +non-@code{nil}, then it is called with no arguments after the abbrev is +replaced with @var{expansion}; point is located at the end of +@var{expansion} when @var{hook} is called. + +@cindex @code{no-self-insert} property +If @var{hook} is a non-@code{nil} symbol whose @code{no-self-insert} +property is non-@code{nil}, @var{hook} can explicitly control whether +to insert the self-inserting input character that triggered the +expansion. If @var{hook} returns non-@code{nil} in this case, that +inhibits insertion of the character. By contrast, if @var{hook} +returns @code{nil}, @code{expand-abbrev} also returns @code{nil}, as +if expansion had not really occurred. + +If @var{system-flag} is non-@code{nil}, that marks the abbrev as a +``system'' abbrev with the @code{system-type} property. Unless +@var{system-flag} has the value @code{force}, a ``system'' abbrev will +not overwrite an existing definition for a non-``system'' abbrev of the +same name. + +Normally the function @code{define-abbrev} sets the variable +@code{abbrevs-changed} to @code{t}, if it actually changes the abbrev. +(This is so that some commands will offer to save the abbrevs.) It +does not do this for a ``system'' abbrev, since those won't be saved +anyway. +@end defun + +@defopt only-global-abbrevs +If this variable is non-@code{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 +behavior of the functions in this section; it is examined by their +callers. +@end defopt + +@node Abbrev Files, Abbrev Expansion, Defining Abbrevs, Abbrevs +@section 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 @code{load} (@pxref{How Programs Do Loading}). However, the +function @code{quietly-read-abbrev-file} is provided as a more +convenient interface. + + User-level facilities such as @code{save-some-buffers} can save +abbrevs in a file automatically, under the control of variables +described here. + +@defopt abbrev-file-name +This is the default file name for reading and saving abbrevs. +@end defopt + +@defun quietly-read-abbrev-file &optional filename +This function reads abbrev definitions from a file named @var{filename}, +previously written with @code{write-abbrev-file}. If @var{filename} is +omitted or @code{nil}, the file specified in @code{abbrev-file-name} is +used. @code{save-abbrevs} is set to @code{t} so that changes will be +saved. + +This function does not display any messages. It returns @code{nil}. +@end defun + +@defopt save-abbrevs +A non-@code{nil} value for @code{save-abbrevs} means that Emacs should +offer the user to save abbrevs when files are saved. If the value is +@code{silently}, Emacs saves the abbrevs without asking the user. +@code{abbrev-file-name} specifies the file to save the abbrevs in. +@end defopt + +@defvar abbrevs-changed +This variable is set non-@code{nil} by defining or altering any +abbrevs (except ``system'' abbrevs). This serves as a flag for +various Emacs commands to offer to save your abbrevs. +@end defvar + +@deffn Command write-abbrev-file &optional filename +Save all abbrev definitions (except ``system'' abbrevs), for all abbrev +tables listed in @code{abbrev-table-name-list}, in the file +@var{filename}, in the form of a Lisp program that when loaded will +define the same abbrevs. If @var{filename} is @code{nil} or omitted, +@code{abbrev-file-name} is used. This function returns @code{nil}. +@end deffn + +@node Abbrev Expansion, Standard Abbrev Tables, Abbrev Files, Abbrevs +@comment node-name, next, previous, up +@section Looking Up and Expanding Abbreviations + + Abbrevs are usually expanded by certain interactive commands, +including @code{self-insert-command}. This section describes the +subroutines used in writing such commands, as well as the variables they +use for communication. + +@defun abbrev-symbol abbrev &optional table +This function returns the symbol representing the abbrev named +@var{abbrev}. The value returned is @code{nil} if that abbrev is not +defined. The optional second argument @var{table} is the abbrev table +to look it up in. If @var{table} is @code{nil}, this function tries +first the current buffer's local abbrev table, and second the global +abbrev table. +@end defun + +@defun abbrev-expansion abbrev &optional table +This function returns the string that @var{abbrev} would expand into (as +defined by the abbrev tables used for the current buffer). If +@var{abbrev} is not a valid abbrev, the function returns @code{nil}. +The optional argument @var{table} specifies the abbrev table to use, +as in @code{abbrev-symbol}. +@end defun + +@deffn Command expand-abbrev +This command expands the abbrev before point, if any. If point does not +follow an abbrev, this command does nothing. The command returns the +abbrev symbol if it did expansion, @code{nil} otherwise. + +If the abbrev symbol has a hook function which is a symbol whose +@code{no-self-insert} property is non-@code{nil}, and if the hook +function returns @code{nil} as its value, then @code{expand-abbrev} +returns @code{nil} even though expansion did occur. +@end deffn + +@deffn Command abbrev-prefix-mark &optional arg +This command marks the current location of point as the beginning of +an abbrev. The next call to @code{expand-abbrev} will use the text +from here to point (where it is then) as the abbrev to expand, rather +than using the previous word as usual. + +First, this command expands any abbrev before point, unless @var{arg} +is non-@code{nil}. (Interactively, @var{arg} is the prefix argument.) +Then it inserts a hyphen before point, to indicate the start of the +next abbrev to be expanded. The actual expansion removes the hyphen. +@end deffn + +@defopt abbrev-all-caps +When this is set non-@code{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. +@end defopt + +@defvar abbrev-start-location +The value of this variable is a buffer position (an integer or a marker) +for @code{expand-abbrev} to use as the start of the next abbrev to be +expanded. The value can also be @code{nil}, which means to use the +word before point instead. @code{abbrev-start-location} is set to +@code{nil} each time @code{expand-abbrev} is called. This variable is +also set by @code{abbrev-prefix-mark}. +@end defvar + +@defvar abbrev-start-location-buffer +The value of this variable is the buffer for which +@code{abbrev-start-location} has been set. Trying to expand an abbrev +in any other buffer clears @code{abbrev-start-location}. This variable +is set by @code{abbrev-prefix-mark}. +@end defvar + +@defvar last-abbrev +This is the @code{abbrev-symbol} of the most recent abbrev expanded. This +information is left by @code{expand-abbrev} for the sake of the +@code{unexpand-abbrev} command (@pxref{Expanding Abbrevs,, Expanding +Abbrevs, emacs, The GNU Emacs Manual}). +@end defvar + +@defvar last-abbrev-location +This is the location of the most recent abbrev expanded. This contains +information left by @code{expand-abbrev} for the sake of the +@code{unexpand-abbrev} command. +@end defvar + +@defvar last-abbrev-text +This is the exact expansion text of the most recent abbrev expanded, +after case conversion (if any). Its value is @code{nil} if the abbrev +has already been unexpanded. This contains information left by +@code{expand-abbrev} for the sake of the @code{unexpand-abbrev} command. +@end defvar + +@c Emacs 19 feature +@defvar pre-abbrev-expand-hook +This is a normal hook whose functions are executed, in sequence, just +before any expansion of an abbrev. @xref{Hooks}. Since it is a normal +hook, the hook functions receive no arguments. However, they can find +the abbrev to be expanded by looking in the buffer before point. +Running the hook is the first thing that @code{expand-abbrev} does, and +so a hook function can be used to change the current abbrev table before +abbrev lookup happens. (Although you have to do this carefully. See +the example below.) +@end defvar + + The following sample code shows a simple use of +@code{pre-abbrev-expand-hook}. It assumes that @code{foo-mode} is a +mode for editing certain files in which lines that start with @samp{#} +are comments. You want to use Text mode abbrevs for those lines. The +regular local abbrev table, @code{foo-mode-abbrev-table} is +appropriate for all other lines. Then you can put the following code +in your @file{.emacs} file. @xref{Standard Abbrev Tables}, for the +definitions of @code{local-abbrev-table} and @code{text-mode-abbrev-table}. + +@smallexample +(defun foo-mode-pre-abbrev-expand () + (when (save-excursion (forward-line 0) (eq (char-after) ?#)) + (let ((local-abbrev-table text-mode-abbrev-table) + ;; Avoid infinite loop. + (pre-abbrev-expand-hook nil)) + (expand-abbrev)) + ;; We have already called `expand-abbrev' in this hook. + ;; Hence we want the "actual" call following this hook to be a no-op. + (setq abbrev-start-location (point-max) + abbrev-start-location-buffer (current-buffer)))) + +(add-hook 'foo-mode-hook + #'(lambda () + (add-hook 'pre-abbrev-expand-hook + 'foo-mode-pre-abbrev-expand + nil t))) +@end smallexample + +Note that @code{foo-mode-pre-abbrev-expand} just returns @code{nil} +without doing anything for lines not starting with @samp{#}. Hence +abbrevs expand normally using @code{foo-mode-abbrev-table} as local +abbrev table for such lines. + +@node Standard Abbrev Tables, , Abbrev Expansion, Abbrevs +@comment node-name, next, previous, up +@section Standard Abbrev Tables + + Here we list the variables that hold the abbrev tables for the +preloaded major modes of Emacs. + +@defvar 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. +@end defvar + +@defvar local-abbrev-table +The value of this buffer-local variable is the (mode-specific) +abbreviation table of the current buffer. +@end defvar + +@defvar fundamental-mode-abbrev-table +This is the local abbrev table used in Fundamental mode; in other words, +it is the local abbrev table in all buffers in Fundamental mode. +@end defvar + +@defvar text-mode-abbrev-table +This is the local abbrev table used in Text mode. +@end defvar + +@defvar lisp-mode-abbrev-table +This is the local abbrev table used in Lisp mode and Emacs Lisp mode. +@end defvar + +@ignore + arch-tag: 5ffdbe08-2cd4-48ec-a5a8-080f95756eec +@end ignore diff --git a/doc/lispref/advice.texi b/doc/lispref/advice.texi new file mode 100644 index 00000000000..4d580f9846d --- /dev/null +++ b/doc/lispref/advice.texi @@ -0,0 +1,773 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/advising +@node Advising Functions, Debugging, Byte Compilation, Top +@chapter Advising Emacs Lisp Functions +@cindex advising functions + + The @dfn{advice} feature lets you add to the existing definition of +a function, by @dfn{advising the function}. This is a cleaner method +for a library to customize functions defined within Emacs---cleaner +than redefining the whole function. + +@cindex piece of advice + Each function can have multiple @dfn{pieces of advice}, separately +defined. Each defined piece of advice can be @dfn{enabled} or +@dfn{disabled} explicitly. All the enabled pieces of advice for any given +function actually take effect when you @dfn{activate} advice for that +function, or when you define or redefine the function. Note that +enabling a piece of advice and activating advice for a function +are not the same thing. + + @strong{Usage Note:} Advice is useful for altering the behavior of +existing calls to an existing function. If you want the new behavior +for new calls, or for key bindings, you should define a new function +(or a new command) which uses the existing function. + + @strong{Usage note:} Advising a function can cause confusion in +debugging, since people who debug calls to the original function may +not notice that it has been modified with advice. Therefore, if you +have the possibility to change the code of that function (or ask +someone to do so) to run a hook, please solve the problem that way. +Advice should be reserved for the cases where you cannot get the +function changed. + + In particular, this means that a file in Emacs should not put advice +on a function in Emacs. There are currently a few exceptions to this +convention, but we aim to correct them. + +@menu +* Simple Advice:: A simple example to explain the basics of advice. +* Defining Advice:: Detailed description of @code{defadvice}. +* Around-Advice:: Wrapping advice around a function's definition. +* Computed Advice:: ...is to @code{defadvice} as @code{fset} is to @code{defun}. +* Activation of Advice:: Advice doesn't do anything until you activate it. +* Enabling Advice:: You can enable or disable each piece of advice. +* Preactivation:: Preactivation is a way of speeding up the + loading of compiled advice. +* Argument Access in Advice:: How advice can access the function's arguments. +* Advising Primitives:: Accessing arguments when advising a primitive. +* Combined Definition:: How advice is implemented. +@end menu + +@node Simple Advice +@section A Simple Advice Example + + The command @code{next-line} moves point down vertically one or more +lines; it is the standard binding of @kbd{C-n}. When used on the last +line of the buffer, this command inserts a newline to create a line to +move to if @code{next-line-add-newlines} is non-@code{nil} (its default +is @code{nil}.) + + Suppose you wanted to add a similar feature to @code{previous-line}, +which would insert a new line at the beginning of the buffer for the +command to move to (when @code{next-line-add-newlines} is +non-@code{nil}). How could you do this? + + You could do it by redefining the whole function, but that is not +modular. The advice feature provides a cleaner alternative: you can +effectively add your code to the existing function definition, without +actually changing or even seeing that definition. Here is how to do +this: + +@example +(defadvice previous-line (before next-line-at-end + (&optional arg try-vscroll)) + "Insert an empty line when moving up from the top line." + (if (and next-line-add-newlines (= arg 1) + (save-excursion (beginning-of-line) (bobp))) + (progn + (beginning-of-line) + (newline)))) +@end example + + This expression defines a @dfn{piece of advice} for the function +@code{previous-line}. This piece of advice is named +@code{next-line-at-end}, and the symbol @code{before} says that it is +@dfn{before-advice} which should run before the regular definition of +@code{previous-line}. @code{(&optional arg try-vscroll)} specifies +how the advice code can refer to the function's arguments. + + When this piece of advice runs, it creates an additional line, in the +situation where that is appropriate, but does not move point to that +line. This is the correct way to write the advice, because the normal +definition will run afterward and will move back to the newly inserted +line. + + Defining the advice doesn't immediately change the function +@code{previous-line}. That happens when you @dfn{activate} the advice, +like this: + +@example +(ad-activate 'previous-line) +@end example + +@noindent +This is what actually begins to use the advice that has been defined so +far for the function @code{previous-line}. Henceforth, whenever that +function is run, whether invoked by the user with @kbd{C-p} or +@kbd{M-x}, or called from Lisp, it runs the advice first, and its +regular definition second. + + This example illustrates before-advice, which is one @dfn{class} of +advice: it runs before the function's base definition. There are two +other advice classes: @dfn{after-advice}, which runs after the base +definition, and @dfn{around-advice}, which lets you specify an +expression to wrap around the invocation of the base definition. + +@node Defining Advice +@section Defining Advice +@cindex defining advice +@cindex advice, defining + + To define a piece of advice, use the macro @code{defadvice}. A call +to @code{defadvice} has the following syntax, which is based on the +syntax of @code{defun} and @code{defmacro}, but adds more: + +@findex defadvice +@example +(defadvice @var{function} (@var{class} @var{name} + @r{[}@var{position}@r{]} @r{[}@var{arglist}@r{]} + @var{flags}...) + @r{[}@var{documentation-string}@r{]} + @r{[}@var{interactive-form}@r{]} + @var{body-forms}...) +@end example + +@noindent +Here, @var{function} is the name of the function (or macro or special +form) to be advised. From now on, we will write just ``function'' when +describing the entity being advised, but this always includes macros and +special forms. + + In place of the argument list in an ordinary definition, an advice +definition calls for several different pieces of information. + +@cindex class of advice +@cindex before-advice +@cindex after-advice +@cindex around-advice +@var{class} specifies the @dfn{class} of the advice---one of @code{before}, +@code{after}, or @code{around}. Before-advice runs before the function +itself; after-advice runs after the function itself; around-advice is +wrapped around the execution of the function itself. After-advice and +around-advice can override the return value by setting +@code{ad-return-value}. + +@defvar ad-return-value +While advice is executing, after the function's original definition has +been executed, this variable holds its return value, which will +ultimately be returned to the caller after finishing all the advice. +After-advice and around-advice can arrange to return some other value +by storing it in this variable. +@end defvar + +The argument @var{name} is the name of the advice, a non-@code{nil} +symbol. The advice name uniquely identifies one piece of advice, within all +the pieces of advice in a particular class for a particular +@var{function}. The name allows you to refer to the piece of +advice---to redefine it, or to enable or disable it. + +The optional @var{position} specifies where, in the current list of +advice of the specified @var{class}, this new advice should be placed. +It should be either @code{first}, @code{last} or a number that specifies +a zero-based position (@code{first} is equivalent to 0). If no position +is specified, the default is @code{first}. Position values outside the +range of existing positions in this class are mapped to the beginning or +the end of the range, whichever is closer. The @var{position} value is +ignored when redefining an existing piece of advice. + +The optional @var{arglist} can be used to define the argument list for +the sake of advice. This becomes the argument list of the combined +definition that is generated in order to run the advice (@pxref{Combined +Definition}). Therefore, the advice expressions can use the argument +variables in this list to access argument values. + +The argument list used in advice need not be the same as the argument +list used in the original function, but must be compatible with it, so +that it can handle the ways the function is actually called. If two +pieces of advice for a function both specify an argument list, they must +specify the same argument list. + +@xref{Argument Access in Advice}, for more information about argument +lists and advice, and a more flexible way for advice to access the +arguments. + +The remaining elements, @var{flags}, are symbols that specify further +information about how to use this piece of advice. Here are the valid +symbols and their meanings: + +@table @code +@item activate +Activate the advice for @var{function} now. Changes in a function's +advice always take effect the next time you activate advice for the +function; this flag says to do so, for @var{function}, immediately after +defining this piece of advice. + +@cindex forward advice +This flag has no immediate effect if @var{function} itself is not defined yet (a +situation known as @dfn{forward advice}), because it is impossible to +activate an undefined function's advice. However, defining +@var{function} will automatically activate its advice. + +@item protect +Protect this piece of advice against non-local exits and errors in +preceding code and advice. Protecting advice places it as a cleanup in +an @code{unwind-protect} form, so that it will execute even if the +previous code gets an error or uses @code{throw}. @xref{Cleanups}. + +@item compile +Compile the combined definition that is used to run the advice. This +flag is ignored unless @code{activate} is also specified. +@xref{Combined Definition}. + +@item disable +Initially disable this piece of advice, so that it will not be used +unless subsequently explicitly enabled. @xref{Enabling Advice}. + +@item preactivate +Activate advice for @var{function} when this @code{defadvice} is +compiled or macroexpanded. This generates a compiled advised definition +according to the current advice state, which will be used during +activation if appropriate. @xref{Preactivation}. + +This is useful only if this @code{defadvice} is byte-compiled. +@end table + +The optional @var{documentation-string} serves to document this piece of +advice. When advice is active for @var{function}, the documentation for +@var{function} (as returned by @code{documentation}) combines the +documentation strings of all the advice for @var{function} with the +documentation string of its original function definition. + +The optional @var{interactive-form} form can be supplied to change the +interactive behavior of the original function. If more than one piece +of advice has an @var{interactive-form}, then the first one (the one +with the smallest position) found among all the advice takes precedence. + +The possibly empty list of @var{body-forms} specifies the body of the +advice. The body of an advice can access or change the arguments, the +return value, the binding environment, and perform any other kind of +side effect. + +@strong{Warning:} When you advise a macro, keep in mind that macros are +expanded when a program is compiled, not when a compiled program is run. +All subroutines used by the advice need to be available when the byte +compiler expands the macro. + +@deffn Command ad-unadvise function +This command deletes the advice from @var{function}. +@end deffn + +@deffn Command ad-unadvise-all +This command deletes all pieces of advice from all functions. +@end deffn + +@node Around-Advice +@section Around-Advice + + Around-advice lets you ``wrap'' a Lisp expression ``around'' the +original function definition. You specify where the original function +definition should go by means of the special symbol @code{ad-do-it}. +Where this symbol occurs inside the around-advice body, it is replaced +with a @code{progn} containing the forms of the surrounded code. Here +is an example: + +@example +(defadvice foo (around foo-around) + "Ignore case in `foo'." + (let ((case-fold-search t)) + ad-do-it)) +@end example + +@noindent +Its effect is to make sure that case is ignored in +searches when the original definition of @code{foo} is run. + +@defvar ad-do-it +This is not really a variable, rather a place-holder that looks like a +variable. You use it in around-advice to specify the place to run the +function's original definition and other ``earlier'' around-advice. +@end defvar + +If the around-advice does not use @code{ad-do-it}, then it does not run +the original function definition. This provides a way to override the +original definition completely. (It also overrides lower-positioned +pieces of around-advice). + +If the around-advice uses @code{ad-do-it} more than once, the original +definition is run at each place. In this way, around-advice can execute +the original definition (and lower-positioned pieces of around-advice) +several times. Another way to do that is by using @code{ad-do-it} +inside of a loop. + +@node Computed Advice +@section Computed Advice + +The macro @code{defadvice} resembles @code{defun} in that the code for +the advice, and all other information about it, are explicitly stated in +the source code. You can also create advice whose details are computed, +using the function @code{ad-add-advice}. + +@defun ad-add-advice function advice class position +Calling @code{ad-add-advice} adds @var{advice} as a piece of advice to +@var{function} in class @var{class}. The argument @var{advice} has +this form: + +@example +(@var{name} @var{protected} @var{enabled} @var{definition}) +@end example + +Here @var{protected} and @var{enabled} are flags, and @var{definition} +is the expression that says what the advice should do. If @var{enabled} +is @code{nil}, this piece of advice is initially disabled +(@pxref{Enabling Advice}). + +If @var{function} already has one or more pieces of advice in the +specified @var{class}, then @var{position} specifies where in the list +to put the new piece of advice. The value of @var{position} can either +be @code{first}, @code{last}, or a number (counting from 0 at the +beginning of the list). Numbers outside the range are mapped to the +beginning or the end of the range, whichever is closer. The +@var{position} value is ignored when redefining an existing piece of +advice. + +If @var{function} already has a piece of @var{advice} with the same +name, then the position argument is ignored and the old advice is +replaced with the new one. +@end defun + +@node Activation of Advice +@section Activation of Advice +@cindex activating advice +@cindex advice, activating + +By default, advice does not take effect when you define it---only when +you @dfn{activate} advice for the function that was advised. However, +the advice will be activated automatically if you define or redefine +the function later. You can request the activation of advice for a +function when you define the advice, by specifying the @code{activate} +flag in the @code{defadvice}. But normally you activate the advice +for a function by calling the function @code{ad-activate} or one of +the other activation commands listed below. + +Separating the activation of advice from the act of defining it permits +you to add several pieces of advice to one function efficiently, without +redefining the function over and over as each advice is added. More +importantly, it permits defining advice for a function before that +function is actually defined. + +When a function's advice is first activated, the function's original +definition is saved, and all enabled pieces of advice for that function +are combined with the original definition to make a new definition. +(Pieces of advice that are currently disabled are not used; see +@ref{Enabling Advice}.) This definition is installed, and optionally +byte-compiled as well, depending on conditions described below. + +In all of the commands to activate advice, if @var{compile} is +@code{t} (or anything but @code{nil} or a negative number), the +command also compiles the combined definition which implements the +advice. If it is @code{nil} or a negative number, what happens +depends on @code{ad-default-compilation-action} as described below. + +@deffn Command ad-activate function &optional compile +This command activates all the advice defined for @var{function}. +@end deffn + + Activating advice does nothing if @var{function}'s advice is already +active. But if there is new advice, added since the previous time you +activated advice for @var{function}, it activates the new advice. + +@deffn Command ad-deactivate function +This command deactivates the advice for @var{function}. +@cindex deactivating advice +@c @cindex advice, deactivating "advice, activating" is just above +@end deffn + +@deffn Command ad-update function &optional compile +This command activates the advice for @var{function} +if its advice is already activated. This is useful +if you change the advice. +@end deffn + +@deffn Command ad-activate-all &optional compile +This command activates the advice for all functions. +@end deffn + +@deffn Command ad-deactivate-all +This command deactivates the advice for all functions. +@end deffn + +@deffn Command ad-update-all &optional compile +This command activates the advice for all functions +whose advice is already activated. This is useful +if you change the advice of some functions. +@end deffn + +@deffn Command ad-activate-regexp regexp &optional compile +This command activates all pieces of advice whose names match +@var{regexp}. More precisely, it activates all advice for any function +which has at least one piece of advice that matches @var{regexp}. +@end deffn + +@deffn Command ad-deactivate-regexp regexp +This command deactivates all pieces of advice whose names match +@var{regexp}. More precisely, it deactivates all advice for any +function which has at least one piece of advice that matches +@var{regexp}. +@end deffn + +@deffn Command ad-update-regexp regexp &optional compile +This command activates pieces of advice whose names match @var{regexp}, +but only those for functions whose advice is already activated. +@cindex reactivating advice + +Reactivating a function's advice is useful for putting into effect all +the changes that have been made in its advice (including enabling and +disabling specific pieces of advice; @pxref{Enabling Advice}) since the +last time it was activated. +@end deffn + +@deffn Command ad-start-advice +Turn on automatic advice activation when a function is defined or +redefined. This is the default mode. +@end deffn + +@deffn Command ad-stop-advice +Turn off automatic advice activation when a function is defined or +redefined. +@end deffn + +@defopt ad-default-compilation-action +This variable controls whether to compile the combined definition +that results from activating advice for a function. + +A value of @code{always} specifies to compile unconditionally. +A value of @code{never} specifies never compile the advice. + +A value of @code{maybe} specifies to compile if the byte-compiler is +already loaded. A value of @code{like-original} specifies to compile +the advice if the original definition of the advised function is +compiled or a built-in function. + +This variable takes effect only if the @var{compile} argument of +@code{ad-activate} (or any of the above functions) did not force +compilation. +@end defopt + + If the advised definition was constructed during ``preactivation'' +(@pxref{Preactivation}), then that definition must already be compiled, +because it was constructed during byte-compilation of the file that +contained the @code{defadvice} with the @code{preactivate} flag. + +@node Enabling Advice +@section Enabling and Disabling Advice +@cindex enabling advice +@cindex advice, enabling and disabling +@cindex disabling advice + + Each piece of advice has a flag that says whether it is enabled or +not. By enabling or disabling a piece of advice, you can turn it on +and off without having to undefine and redefine it. For example, here is +how to disable a particular piece of advice named @code{my-advice} for +the function @code{foo}: + +@example +(ad-disable-advice 'foo 'before 'my-advice) +@end example + + This function by itself only changes the enable flag for a piece of +advice. To make the change take effect in the advised definition, you +must activate the advice for @code{foo} again: + +@example +(ad-activate 'foo) +@end example + +@deffn Command ad-disable-advice function class name +This command disables the piece of advice named @var{name} in class +@var{class} on @var{function}. +@end deffn + +@deffn Command ad-enable-advice function class name +This command enables the piece of advice named @var{name} in class +@var{class} on @var{function}. +@end deffn + + You can also disable many pieces of advice at once, for various +functions, using a regular expression. As always, the changes take real +effect only when you next reactivate advice for the functions in +question. + +@deffn Command ad-disable-regexp regexp +This command disables all pieces of advice whose names match +@var{regexp}, in all classes, on all functions. +@end deffn + +@deffn Command ad-enable-regexp regexp +This command enables all pieces of advice whose names match +@var{regexp}, in all classes, on all functions. +@end deffn + +@node Preactivation +@section Preactivation +@cindex preactivating advice +@cindex advice, preactivating + + Constructing a combined definition to execute advice is moderately +expensive. When a library advises many functions, this can make loading +the library slow. In that case, you can use @dfn{preactivation} to +construct suitable combined definitions in advance. + + To use preactivation, specify the @code{preactivate} flag when you +define the advice with @code{defadvice}. This @code{defadvice} call +creates a combined definition which embodies this piece of advice +(whether enabled or not) plus any other currently enabled advice for the +same function, and the function's own definition. If the +@code{defadvice} is compiled, that compiles the combined definition +also. + + When the function's advice is subsequently activated, if the enabled +advice for the function matches what was used to make this combined +definition, then the existing combined definition is used, thus avoiding +the need to construct one. Thus, preactivation never causes wrong +results---but it may fail to do any good, if the enabled advice at the +time of activation doesn't match what was used for preactivation. + + Here are some symptoms that can indicate that a preactivation did not +work properly, because of a mismatch. + +@itemize @bullet +@item +Activation of the advised +function takes longer than usual. +@item +The byte-compiler gets +loaded while an advised function gets activated. +@item +@code{byte-compile} is included in the value of @code{features} even +though you did not ever explicitly use the byte-compiler. +@end itemize + +Compiled preactivated advice works properly even if the function itself +is not defined until later; however, the function needs to be defined +when you @emph{compile} the preactivated advice. + +There is no elegant way to find out why preactivated advice is not being +used. What you can do is to trace the function +@code{ad-cache-id-verification-code} (with the function +@code{trace-function-background}) before the advised function's advice +is activated. After activation, check the value returned by +@code{ad-cache-id-verification-code} for that function: @code{verified} +means that the preactivated advice was used, while other values give +some information about why they were considered inappropriate. + + @strong{Warning:} There is one known case that can make preactivation +fail, in that a preconstructed combined definition is used even though +it fails to match the current state of advice. This can happen when two +packages define different pieces of advice with the same name, in the +same class, for the same function. But you should avoid that anyway. + +@node Argument Access in Advice +@section Argument Access in Advice + + The simplest way to access the arguments of an advised function in the +body of a piece of advice is to use the same names that the function +definition uses. To do this, you need to know the names of the argument +variables of the original function. + + While this simple method is sufficient in many cases, it has a +disadvantage: it is not robust, because it hard-codes the argument names +into the advice. If the definition of the original function changes, +the advice might break. + + Another method is to specify an argument list in the advice itself. +This avoids the need to know the original function definition's argument +names, but it has a limitation: all the advice on any particular +function must use the same argument list, because the argument list +actually used for all the advice comes from the first piece of advice +for that function. + + A more robust method is to use macros that are translated into the +proper access forms at activation time, i.e., when constructing the +advised definition. Access macros access actual arguments by position +regardless of how these actual arguments get distributed onto the +argument variables of a function. This is robust because in Emacs Lisp +the meaning of an argument is strictly determined by its position in the +argument list. + +@defmac ad-get-arg position +This returns the actual argument that was supplied at @var{position}. +@end defmac + +@defmac ad-get-args position +This returns the list of actual arguments supplied starting at +@var{position}. +@end defmac + +@defmac ad-set-arg position value +This sets the value of the actual argument at @var{position} to +@var{value} +@end defmac + +@defmac ad-set-args position value-list +This sets the list of actual arguments starting at @var{position} to +@var{value-list}. +@end defmac + + Now an example. Suppose the function @code{foo} is defined as + +@example +(defun foo (x y &optional z &rest r) ...) +@end example + +@noindent +and is then called with + +@example +(foo 0 1 2 3 4 5 6) +@end example + +@noindent +which means that @var{x} is 0, @var{y} is 1, @var{z} is 2 and @var{r} is +@code{(3 4 5 6)} within the body of @code{foo}. Here is what +@code{ad-get-arg} and @code{ad-get-args} return in this case: + +@example +(ad-get-arg 0) @result{} 0 +(ad-get-arg 1) @result{} 1 +(ad-get-arg 2) @result{} 2 +(ad-get-arg 3) @result{} 3 +(ad-get-args 2) @result{} (2 3 4 5 6) +(ad-get-args 4) @result{} (4 5 6) +@end example + + Setting arguments also makes sense in this example: + +@example +(ad-set-arg 5 "five") +@end example + +@noindent +has the effect of changing the sixth argument to @code{"five"}. If this +happens in advice executed before the body of @code{foo} is run, then +@var{r} will be @code{(3 4 "five" 6)} within that body. + + Here is an example of setting a tail of the argument list: + +@example +(ad-set-args 0 '(5 4 3 2 1 0)) +@end example + +@noindent +If this happens in advice executed before the body of @code{foo} is run, +then within that body, @var{x} will be 5, @var{y} will be 4, @var{z} +will be 3, and @var{r} will be @code{(2 1 0)} inside the body of +@code{foo}. + + These argument constructs are not really implemented as Lisp macros. +Instead they are implemented specially by the advice mechanism. + +@node Advising Primitives +@section Advising Primitives +@cindex advising primitives + + Advising a primitive function (also called a ``subr'') is risky. +Some primitive functions are used by the advice mechanism; advising +them could cause an infinite recursion. Also, many primitive +functions are called directly from C code. Calls to the primitive +from Lisp code will take note of the advice, but calls from C code +will ignore the advice. + +When the advice facility constructs the combined definition, it needs +to know the argument list of the original function. This is not +always possible for primitive functions. When advice cannot determine +the argument list, it uses @code{(&rest ad-subr-args)}, which always +works but is inefficient because it constructs a list of the argument +values. You can use @code{ad-define-subr-args} to declare the proper +argument names for a primitive function: + +@defun ad-define-subr-args function arglist +This function specifies that @var{arglist} should be used as the +argument list for function @var{function}. +@end defun + +For example, + +@example +(ad-define-subr-args 'fset '(sym newdef)) +@end example + +@noindent +specifies the argument list for the function @code{fset}. + +@node Combined Definition +@section The Combined Definition + + Suppose that a function has @var{n} pieces of before-advice +(numbered from 0 through @var{n}@minus{}1), @var{m} pieces of +around-advice and @var{k} pieces of after-advice. Assuming no piece +of advice is protected, the combined definition produced to implement +the advice for a function looks like this: + +@example +(lambda @var{arglist} + @r{[} @r{[}@var{advised-docstring}@r{]} @r{[}(interactive ...)@r{]} @r{]} + (let (ad-return-value) + @r{before-0-body-form}... + .... + @r{before-@var{n}@minus{}1-body-form}... + @r{around-0-body-form}... + @r{around-1-body-form}... + .... + @r{around-@var{m}@minus{}1-body-form}... + (setq ad-return-value + @r{apply original definition to @var{arglist}}) + @r{end-of-around-@var{m}@minus{}1-body-form}... + .... + @r{end-of-around-1-body-form}... + @r{end-of-around-0-body-form}... + @r{after-0-body-form}... + .... + @r{after-@var{k}@minus{}1-body-form}... + ad-return-value)) +@end example + +Macros are redefined as macros, which means adding @code{macro} to +the beginning of the combined definition. + +The interactive form is present if the original function or some piece +of advice specifies one. When an interactive primitive function is +advised, advice uses a special method: it calls the primitive with +@code{call-interactively} so that it will read its own arguments. +In this case, the advice cannot access the arguments. + +The body forms of the various advice in each class are assembled +according to their specified order. The forms of around-advice @var{l} +are included in one of the forms of around-advice @var{l} @minus{} 1. + +The innermost part of the around advice onion is + +@display +apply original definition to @var{arglist} +@end display + +@noindent +whose form depends on the type of the original function. The variable +@code{ad-return-value} is set to whatever this returns. The variable is +visible to all pieces of advice, which can access and modify it before +it is actually returned from the advised function. + +The semantic structure of advised functions that contain protected +pieces of advice is the same. The only difference is that +@code{unwind-protect} forms ensure that the protected advice gets +executed even if some previous piece of advice had an error or a +non-local exit. If any around-advice is protected, then the whole +around-advice onion is protected as a result. + +@ignore + arch-tag: 80c135c2-f1c3-4f8d-aa85-f8d8770d307f +@end ignore diff --git a/doc/lispref/anti.texi b/doc/lispref/anti.texi new file mode 100644 index 00000000000..1ec0c5ef327 --- /dev/null +++ b/doc/lispref/anti.texi @@ -0,0 +1,453 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1999, 2002, 2003, 2004, 2005, +@c 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. + +@c This node must have no pointers. + +@node Antinews, GNU Free Documentation License, System Interface, Top +@appendix Emacs 21 Antinews + +For those users who live backwards in time, here is information about +downgrading to Emacs version 21.4. We hope you will enjoy the greater +simplicity that results from the absence of many Emacs @value{EMACSVER} +features. + +@section Old Lisp Features in Emacs 21 + +@itemize @bullet +@item +Many unnecessary features of redisplay have been eliminated. (The +earlier major release, Emacs 20, will have a completely rewritten +redisplay engine, which will be even simpler.) + +@itemize @minus +@item +The function @code{redisplay} has been removed. To update the display +without delay, call @code{(sit-for 0)}. Since it is generally +considered wasteful to update the display if there are any pending +input events, no replacement for @code{(redisplay t)} is provided. + +@item +The function @code{force-window-update} has been removed. It +shouldn't be needed, since changes in window contents are detected +automatically. In case they aren't, call @code{redraw-display} to +redraw everything. + +@item +Point no longer moves out from underneath invisible text at the end of +each command. This allows the user to detect invisible text by moving +the cursor around---if the cursor gets stuck, there is something +invisible in the way. If you really want cursor motion to ignore the +text, try marking it as intangible. + +@item +Support for image maps and image slices has been removed. Emacs was +always meant for editing text, anyway. + +@item +The mode line now accepts all text properties, as well as +@code{:propertize} and @code{:eval} forms, regardless of the +@code{risky-local-variable} property. + +@item +The @code{line-height} and @code{line-spacing} properties no longer +have any meaning for newline characters. Such properties wouldn't +make sense, since newlines are not really characters; they just tell +you where to break a line. + +@item +Considerable simplifications have been made to the display +specification @code{(space . @var{props})}, which is used for +displaying a space of specified width and height. Pixel-based +specifications and Lisp expressions are no longer accepted. + +@item +Many features associated with the fringe areas have been removed, to +encourage people to concentrate on the main editing area (the fringe +will be completely removed in Emacs 20.) Arbitrary bitmaps can no +longer be displayed in the fringe; an overlay arrow can still be +displayed, but there can only be one overlay arrow at a time (any more +would be confusing.) The fringe widths cannot be adjusted, and +individual windows cannot have their own fringe settings. A mouse +click on the fringe no longer generates a special event. + +@item +Individual windows cannot have their own scroll-bar settings. + +@item +You can no longer use @samp{default} in a @code{defface} to specify +defaults for subsequent faces. + +@item +The function @code{display-supports-face-attributes-p} has been +removed. In @code{defface} specifications, the @code{supports} +predicate is no longer supported. + +@item +The functions @code{merge-face-attribute} and +@code{face-attribute-relative-p} have been removed. + +@item +The priority of faces in a list supplied by the @code{:inherit} face +attribute has been reversed. We like to make changes like this once +in a while, to keep Emacs Lisp programmers on their toes. + +@item +The @code{min-colors} face attribute, used for tailoring faces to +limited-color displays, does not exist. If in doubt, use colors like +``white'' and ``black,'' which ought to be defined everywhere. + +@item +The @code{tty-color-mode} frame parameter does not exist. You should +just trust the terminal capabilities database. +@end itemize + +@item +Several simplifications have been made to mouse support: + +@itemize @minus +@item +Clicking @kbd{mouse-1} won't follow links, as that is alien to the +spirit of Emacs. Therefore, the @code{follow-link} property doesn't +have any special meaning, and the function @code{mouse-on-link-p} has +been removed. + +@item +The variable @code{void-text-area-pointer} has been removed, so the +mouse pointer shape remains unchanged when moving between valid text +areas and void text areas. The @code{pointer} image and text +properties are no longer supported. + +@item +Mouse events will no longer specify the timestamp, the object clicked, +equivalent buffer positions (for marginal or fringe areas), glyph +coordinates, or relative pixel coordinates. +@end itemize + +@item +Simplifications have also been made to the way Emacs handles keymaps +and key sequences: + +@itemize @minus +@item +The @code{kbd} macro is now obsolete and is no longer documented. +It isn't that difficult to write key sequences using the string and +vector representations, and we want to encourage users to learn. + +@item +Emacs no longer supports key remapping. You can do pretty much the +same thing with @code{substitute-key-definition}, or by advising the +relevant command. + +@item +The @code{keymap} text and overlay property is now overridden by minor +mode keymaps, and will not work at the ends of text properties and +overlays. + +@item +The functions @code{map-keymap}, @code{keymap-prompt}, and +@code{current-active-maps} have been removed. +@end itemize + +@item +Process support has been pared down to a functional minimum. The +functions @code{call-process-shell-command} and @code{process-file} +have been deleted. Processes no longer maintain property lists, and +they won't ask any questions when the user tries to exit Emacs (which +would simply be rude.) The function @code{signal-process} won't +accept a process object, only the process id; determining the process +id from a process object is left as an exercise to the programmer. + +@item +Networking has also been simplified: @code{make-network-process} and +its various associated function have all been replaced with a single +easy-to-use function, @code{open-network-stream}, which can't use UDP, +can't act as a server, and can't set up non-blocking connections. +Also, deleting a network process with @code{delete-process} won't call +the sentinel. + +@item +Many programming shortcuts have been deleted, to provide you with the +enjoyment of ``rolling your own.'' The macros @code{while-no-input}, +@code{with-local-quit}, and @code{with-selected-window}, along with +@code{dynamic-completion-table} and @code{lazy-completion-table} no +longer exist. Also, there are no built-in progress reporters; +with Emacs, you can take progress for granted. + +@item +Variable aliases are no longer supported. Aliases are for functions, +not for variables. + +@item +The variables @code{most-positive-fixnum} and +@code{most-negative-fixnum} do not exist. On 32 bit machines, the +most positive integer is probably 134217727, and the most negative +integer is probably -134217728. + +@item +The functions @code{eql} and @code{macroexpand-all} are no longer +available. However, you can find similar functions in the @code{cl} +package. + +@item +The list returned by @code{split-string} won't include null substrings +for separators at the beginning or end of a string. If you want to +check for such separators, do it separately. + +@item +The function @code{assoc-string} has been removed. Use +@code{assoc-ignore-case} or @code{assoc-ignore-representation} (which +are no longer obsolete.) + +@item +The escape sequence @samp{\s} is always interpreted as a super +modifier, never a space. + +@item +The variable @code{buffer-save-without-query} has been removed, to +prevent Emacs from sneakily saving buffers. Also, the hook +@code{before-save-hook} has been removed, so if you want something to +be done before saving, advise or redefine @code{basic-save-buffer}. + +@item +The variable @code{buffer-auto-save-file-format} has been renamed to +@code{auto-save-file-format}, and is no longer a permanent local. + +@item +The function @code{visited-file-modtime} now returns a cons, instead +of a list of two integers. The primitive @code{set-file-times} has +been eliminated. + +@item +The function @code{file-remote-p} is no longer available. + +@item +When determining the filename extension, a leading dot in a filename +is no longer ignored. Thus, @file{.emacs} is considered to have +extension @file{emacs}, rather than being extensionless. + +@item +Emacs looks for special file handlers in a more efficient manner: it +will choose the first matching handler in +@code{file-name-handler-alist}, rather than trying to figure out which +provides the closest match. + +@item +The @code{predicate} argument for @code{read-file-name} has been +removed, and so have the variables @code{read-file-name-function} and +@code{read-file-name-completion-ignore-case}. The function +@code{read-directory-name} has also been removed. + +@item +The functions @code{all-completions} and @code{try-completion} will no +longer accept lists of strings or hash tables (it will still accept +alists, obarrays, and functions.) In addition, the function +@code{test-completion} is no longer available. + +@item +The @samp{G} interactive code character is no longer supported. +Use @samp{F} instead. + +@item +Arbitrary Lisp functions can no longer be recorded into +@code{buffer-undo-list}. As a consequence, @code{yank-undo-function} +is obsolete, and has been removed. + +@item +Emacs will never complain about commands that accumulate too much undo +information, so you no longer have to worry about binding +@code{buffer-undo-list} to @code{t} for such commands (though you may +want to do that anyway, to avoid taking up unnecessary memory space.) + +@item +Atomic change groups are no longer supported. + +@item +The list returned by @code{(match-data t)} no longer records the +buffer as a final element. + +@item +The function @code{looking-back} has been removed, so we no longer +have the benefit of hindsight. + +@item +The variable @code{search-spaces-regexp} does not exist. Spaces +always stand for themselves in regular expression searches. + +@item +The functions @code{skip-chars-forward} and @code{skip-chars-backward} +no longer accepts character classes such as @samp{[:alpha:]}. All +characters are created equal. + +@item +The @code{yank-handler} text property no longer has any meaning. +Also, @code{yank-excluded-properties}, @code{insert-for-yank}, and +@code{insert-buffer-substring-as-yank} have all been removed. + +@item +The variable @code{char-property-alias-alist} has been deleted. +Aliases are for functions, not for properties. + +@item +The function @code{get-char-property-and-overlay} has been deleted. +If you want the properties at a point, find the text properties at the +point; then, find the overlays at the point, and find the properties +on those overlays. + +@item +Font Lock mode only manages @code{face} properties; you can't use +font-lock keywords to specify arbitrary text properties for it to +manage. After all, it is called Font Lock mode, not Arbitrary +Properties Lock mode. + +@item +The arguments to @code{remove-overlays} are no longer optional. + +@item +In @code{replace-match}, the replacement text now inherits properties +from the surrounding text. + +@item +The variable @code{mode-line-format} no longer supports the @code{:propertize}, +@code{%i}, and @code{%I} constructs. The function +@code{format-mode-line} has been removed. + +@item +The functions @code{window-inside-edges} and @code{window-body-height} +have been removed. You should do the relevant calculations yourself, +starting with @code{window-width} and @code{window-height}. + +@item +The functions @code{window-pixel-edges} and +@code{window-inside-pixel-edges} have been removed. We prefer to +think in terms of lines and columns, not pixel coordinates. (Sometime +in the distant past, we will do away with graphical terminals +entirely, in favor of text terminals.) For similar reasons, the +functions @code{posn-at-point}, @code{posn-at-x-y}, and +@code{window-line-height} have been removed, and +@code{pos-visible-in-window-p} no longer worries about partially +visible rows. + +@item +The macro @code{save-selected-window} only saves the selected window +of the selected frame, so don't try selecting windows in other frames. + +@item +The function @code{minibufferp} is no longer available. + +@item +The function @code{modify-all-frames-parameters} has been removed (we +always suspected the name was ungrammatical, anyway.) + +@item +The @code{line-spacing} variable no longer accepts float values. + +@item +The function @code{tool-bar-local-item-from-menu} has been deleted. +If you need to make an entry in the tool bar, you can still use +@code{tool-bar-add-item-from-menu}, but that modifies the binding in +the source keymap instead of copying it into the local keymap. + +@item +When determining the major mode, the file name takes precedence over +the interpreter magic line. The variable @code{magic-mode-alist}, +which associates certain buffer beginnings with major modes, has been +eliminated. + +@item +The hook @code{after-change-major-mode-hook} is not defined, and +neither are @code{run-mode-hooks} and @code{delay-mode-hooks}. + +@item +The variable @code{minor-mode-list} has been removed. + +@item +@code{define-derived-mode} will copy abbrevs from the parent mode's +abbrev table, instead of creating a new, empty abbrev table. + +@item +There are no ``system'' abbrevs. When the user saves into the abbrevs +file, all abbrevs are saved. + +@item +The Warnings facility has been removed. Just use @code{error}. + +@item +Several hook variables have been renamed to flout the Emacs naming +conventions. We feel that consistency is boring, and having +non-standard hook names encourages users to check the documentation +before using a hook. For instance, the normal hook +@code{find-file-hook} has been renamed to @code{find-file-hooks}, and +the abnormal hook @code{delete-frame-functions} has been renamed to +@code{delete-frame-hook}. + +@item +The function @code{symbol-file} does not exist. If you want to know +which file defined a function or variable, try grepping for it. + +@item +The variable @code{load-history} records function definitions just +like variable definitions, instead of indicating which functions were +previously autoloaded. + +@item +There is a new variable, @code{recursive-load-depth-limit}, which +specifies how many times files can recursively load themselves; it is +50 by default, and @code{nil} means infinity. Previously, Emacs signaled an +error after just 3 recursive loads, which was boring. + +@item +Byte-compiler warnings and error messages will leave out the line and +character positions, in order to exercise your debugging skills. +Also, there is no @code{with-no-warnings} macro---instead of +suppressing compiler warnings, fix your code to avoid them! + +@item +The function @code{unsafep} has been removed. + +@item +File local variables can now specify a string with text properties. +Since arbitrary Lisp expressions can be embedded in text properties, +this can provide you with a great deal of flexibility and power. On +the other hand, @code{safe-local-eval-forms} and the +@code{safe-local-eval-function} function property have no special +meaning. + +@item +You can no longer use @code{char-displayable-p} to test if Emacs can +display a certain character. + +@item +The function @code{string-to-multibyte} is no longer available. + +@item +The @code{translation-table-for-input} translation table has been +removed. Also, translation hash tables are no longer available, so we +don't need the functions @code{lookup-character} and +@code{lookup-integer}. + +@item +The @code{table} argument to @code{translate-region} can no longer be +a char-table; it has to be a string. + +@item +The variable @code{auto-coding-functions} and the two functions +@code{merge-coding-systems} and @code{decode-coding-inserted-region} +have been deleted. The coding system property +@code{mime-text-unsuitable} no longer has any special meaning. + +@item +If pure storage overflows while dumping, Emacs won't tell you how much +additional pure storage it needs. Try adding in increments of 20000, +until you have enough. + +@item +The variables @code{gc-elapsed}, @code{gcs-done}, and +@code{post-gc-hook} have been garbage-collected. +@end itemize + +@ignore + arch-tag: 1d0ef137-2bad-430e-ae8e-d820d569b5a6 +@end ignore diff --git a/doc/lispref/back.texi b/doc/lispref/back.texi new file mode 100644 index 00000000000..19559eab9c1 --- /dev/null +++ b/doc/lispref/back.texi @@ -0,0 +1,42 @@ +\input /home/gd/gnu/doc/texinfo.tex @c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +@c Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@c +@c %**start of header +@setfilename back-cover +@settitle GNU Emacs Lisp Reference Manual +@c %**end of header +. +@sp 7 +@center @titlefont {GNU Emacs Lisp} +@sp 1 + +@quotation + 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. 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. +@end quotation + +@hfil +@bye + +@ignore + arch-tag: ac7694c8-1f02-4b42-9531-33ba13b179e1 +@end ignore diff --git a/doc/lispref/backups.texi b/doc/lispref/backups.texi new file mode 100644 index 00000000000..44795557f15 --- /dev/null +++ b/doc/lispref/backups.texi @@ -0,0 +1,756 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2001, 2002, 2003, +@c 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/backups +@node Backups and Auto-Saving, Buffers, Files, Top +@chapter Backups and Auto-Saving +@cindex 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. + +@menu +* Backup Files:: How backup files are made; how their names are chosen. +* Auto-Saving:: How auto-save files are made; how their names are chosen. +* Reverting:: @code{revert-buffer}, and how to customize what it does. +@end menu + +@node Backup Files +@section Backup Files +@cindex backup file + + A @dfn{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. Thus, normally, 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. + +@menu +* Making Backups:: How Emacs makes backup files, and when. +* Rename or Copy:: Two alternatives: renaming the old file or copying it. +* Numbered Backups:: Keeping multiple backups for each source file. +* Backup Names:: How backup file names are computed; customization. +@end menu + +@node Making Backups +@subsection Making Backup Files + +@defun backup-buffer + This function makes a backup of the file visited by the current +buffer, if appropriate. It is called by @code{save-buffer} before +saving the buffer the first time. + +If a backup was made by renaming, the return value is a cons cell of +the form (@var{modes} . @var{backupname}), where @var{modes} are the +mode bits of the original file, as returned by @code{file-modes} +(@pxref{File Attributes,, Other Information about Files}), and +@var{backupname} is the name of the backup. In all other cases, that +is, if a backup was made by copying or if no backup was made, this +function returns @code{nil}. +@end defun + +@defvar buffer-backed-up + This buffer-local variable says whether this buffer's file has +been backed up on account of this buffer. If it is non-@code{nil}, +the backup file has been written. Otherwise, the file should be backed +up when it is next saved (if backups are enabled). This is a +permanent local; @code{kill-all-local-variables} does not alter@tie{}it. +@end defvar + +@defopt make-backup-files +This variable determines whether or not to make backup files. If it +is non-@code{nil}, then Emacs creates a backup of each file when it is +saved for the first time---provided that @code{backup-inhibited} +is @code{nil} (see below). + +The following example shows how to change the @code{make-backup-files} +variable only in the Rmail buffers and not elsewhere. Setting it +@code{nil} stops Emacs from making backups of these files, which may +save disk space. (You would put this code in your init file.) + +@smallexample +@group +(add-hook 'rmail-mode-hook + (function (lambda () + (make-local-variable + 'make-backup-files) + (setq make-backup-files nil)))) +@end group +@end smallexample +@end defopt + +@defvar backup-enable-predicate +This variable's value is a function to be called on certain occasions to +decide whether a file should have backup files. The function receives +one argument, an absolute file name to consider. If the function returns +@code{nil}, backups are disabled for that file. Otherwise, the other +variables in this section say whether and how to make backups. + +@findex normal-backup-enable-predicate +The default value is @code{normal-backup-enable-predicate}, which checks +for files in @code{temporary-file-directory} and +@code{small-temporary-file-directory}. +@end defvar + +@defvar backup-inhibited +If this variable is non-@code{nil}, backups are inhibited. It records +the result of testing @code{backup-enable-predicate} on the visited file +name. It can also coherently be used by other mechanisms that inhibit +backups based on which file is visited. For example, VC sets this +variable non-@code{nil} to prevent making backups for files managed +with a version control system. + +This is a permanent local, so that changing the major mode does not lose +its value. Major modes should not set this variable---they should set +@code{make-backup-files} instead. +@end defvar + +@defvar backup-directory-alist +This variable's value is an alist of filename patterns and backup +directory names. Each element looks like +@smallexample +(@var{regexp} . @var{directory}) +@end smallexample + +@noindent +Backups of files with names matching @var{regexp} will be made in +@var{directory}. @var{directory} may be relative or absolute. If it is +absolute, so that all matching files are backed up into the same +directory, the file names in this directory will be the full name of the +file backed up with all directory separators changed to @samp{!} to +prevent clashes. This will not work correctly if your filesystem +truncates the resulting name. + +For the common case of all backups going into one directory, the alist +should contain a single element pairing @samp{"."} with the appropriate +directory name. + +If this variable is @code{nil}, or it fails to match a filename, the +backup is made in the original file's directory. + +On MS-DOS filesystems without long names this variable is always +ignored. +@end defvar + +@defvar make-backup-file-name-function +This variable's value is a function to use for making backups instead +of the default @code{make-backup-file-name}. A value of @code{nil} +gives the default @code{make-backup-file-name} behavior. +@xref{Backup Names,, Naming Backup Files}. + +This could be buffer-local to do something special for specific +files. If you define it, you may need to change +@code{backup-file-name-p} and @code{file-name-sans-versions} too. +@end defvar + + +@node Rename or Copy +@subsection Backup by Renaming or by Copying? +@cindex backup files, rename or copy + + There are two ways that Emacs can make a backup file: + +@itemize @bullet +@item +Emacs can rename the original file so that it becomes a backup file, and +then write the buffer being saved into a new file. After this +procedure, any other names (i.e., hard links) of the original file now +refer to the backup file. The new file is owned by the user doing the +editing, and its group is the default for new files written by the user +in that directory. + +@item +Emacs can copy the original file into a backup file, and then overwrite +the original file with new contents. After this procedure, any other +names (i.e., hard links) of the original file continue to refer to the +current (updated) version of the file. The file's owner and group will +be unchanged. +@end itemize + + The first method, renaming, is the default. + + The variable @code{backup-by-copying}, if non-@code{nil}, says to use +the second method, which is to copy the original file and overwrite it +with the new buffer contents. The variable @code{file-precious-flag}, +if non-@code{nil}, also has this effect (as a sideline of its main +significance). @xref{Saving Buffers}. + +@defopt backup-by-copying +If this variable is non-@code{nil}, Emacs always makes backup files by +copying. +@end defopt + + The following three variables, when non-@code{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. + +@defopt backup-by-copying-when-linked +If this variable is non-@code{nil}, Emacs makes backups by copying for +files with multiple names (hard links). + +This variable is significant only if @code{backup-by-copying} is +@code{nil}, since copying is always used when that variable is +non-@code{nil}. +@end defopt + +@defopt backup-by-copying-when-mismatch +If this variable is non-@code{nil}, Emacs makes backups by copying in cases +where renaming would change either the owner or the group of the file. + +The value has no effect when renaming would not alter 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 @code{backup-by-copying} is +@code{nil}, since copying is always used when that variable is +non-@code{nil}. +@end defopt + +@defopt backup-by-copying-when-privileged-mismatch +This variable, if non-@code{nil}, specifies the same behavior as +@code{backup-by-copying-when-mismatch}, but only for certain user-id +values: namely, those less than or equal to a certain number. You set +this variable to that number. + +Thus, if you set @code{backup-by-copying-when-privileged-mismatch} +to 0, backup by copying is done for the superuser only, +when necessary to prevent a change in the owner of the file. + +The default is 200. +@end defopt + +@node Numbered Backups +@subsection Making and Deleting Numbered Backup Files + + If a file's name is @file{foo}, the names of its numbered backup +versions are @file{foo.~@var{v}~}, for various integers @var{v}, like +this: @file{foo.~1~}, @file{foo.~2~}, @file{foo.~3~}, @dots{}, +@file{foo.~259~}, and so on. + +@defopt version-control +This variable controls whether to make a single non-numbered backup +file or multiple numbered backups. + +@table @asis +@item @code{nil} +Make numbered backups if the visited file already has numbered backups; +otherwise, do not. This is the default. + +@item @code{never} +Do not make numbered backups. + +@item @var{anything else} +Make numbered backups. +@end table +@end defopt + + The use of numbered backups ultimately leads to a large number of +backup versions, which must then be deleted. Emacs can do this +automatically or it can ask the user whether to delete them. + +@defopt kept-new-versions +The value of this variable is the number of newest versions to keep +when a new numbered backup is made. The newly made backup is included +in the count. The default value is@tie{}2. +@end defopt + +@defopt 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@tie{}2. +@end defopt + + 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 are kept +as old versions and those numbered 5 and 7 are kept as new versions; +backup version 3 is excess. The function @code{find-backup-file-name} +(@pxref{Backup Names}) is responsible for determining which backup +versions to delete, but does not delete them itself. + +@defopt delete-old-versions +If this variable is @code{t}, then saving a file deletes excess +backup versions silently. If it is @code{nil}, that means +to ask for confirmation before deleting excess backups. +Otherwise, they are not deleted at all. +@end defopt + +@defopt dired-kept-versions +This variable specifies how many of the newest backup versions to keep +in the Dired command @kbd{.} (@code{dired-clean-directory}). That's the +same thing @code{kept-new-versions} specifies when you make a new backup +file. The default is@tie{}2. +@end defopt + +@node Backup Names +@subsection Naming Backup Files + + The functions in this section are documented mainly because you can +customize the naming conventions for backup files by redefining them. +If you change one, you probably need to change the rest. + +@defun backup-file-name-p filename +This function returns a non-@code{nil} value if @var{filename} is a +possible name for a backup file. It just checks the name, not whether +a file with the name @var{filename} exists. + +@smallexample +@group +(backup-file-name-p "foo") + @result{} nil +@end group +@group +(backup-file-name-p "foo~") + @result{} 3 +@end group +@end smallexample + +The standard definition of this function is as follows: + +@smallexample +@group +(defun backup-file-name-p (file) + "Return non-nil if FILE is a backup file \ +name (numeric or not)..." + (string-match "~\\'" file)) +@end group +@end smallexample + +@noindent +Thus, the function returns a non-@code{nil} value if the file name ends +with a @samp{~}. (We use a backslash to split the documentation +string's first line into two lines in the text, but produce just one +line in the string itself.) + +This simple expression is placed in a separate function to make it easy +to redefine for customization. +@end defun + +@defun make-backup-file-name filename +This function returns a string that is the name to use for a +non-numbered backup file for file @var{filename}. On Unix, this is just +@var{filename} with a tilde appended. + +The standard definition of this function, on most operating systems, is +as follows: + +@smallexample +@group +(defun make-backup-file-name (file) + "Create the non-numeric backup file name for FILE..." + (concat file "~")) +@end group +@end smallexample + +You can change the backup-file naming convention by redefining this +function. The following example redefines @code{make-backup-file-name} +to prepend a @samp{.} in addition to appending a tilde: + +@smallexample +@group +(defun make-backup-file-name (filename) + (expand-file-name + (concat "." (file-name-nondirectory filename) "~") + (file-name-directory filename))) +@end group + +@group +(make-backup-file-name "backups.texi") + @result{} ".backups.texi~" +@end group +@end smallexample + +Some parts of Emacs, including some Dired commands, assume that backup +file names end with @samp{~}. If you do not follow that convention, it +will not cause serious problems, but these commands may give +less-than-desirable results. +@end defun + +@defun find-backup-file-name filename +This function computes the file name for a new backup file for +@var{filename}. It may also propose certain existing backup files for +deletion. @code{find-backup-file-name} returns a list whose @sc{car} is +the name for the new backup file and whose @sc{cdr} is a list of backup +files whose deletion is proposed. The value can also be @code{nil}, +which means not to make a backup. + +Two variables, @code{kept-old-versions} and @code{kept-new-versions}, +determine which backup versions should be kept. This function keeps +those versions by excluding them from the @sc{cdr} of the value. +@xref{Numbered Backups}. + +In this example, the value says that @file{~rms/foo.~5~} is the name +to use for the new backup file, and @file{~rms/foo.~3~} is an ``excess'' +version that the caller should consider deleting now. + +@smallexample +@group +(find-backup-file-name "~rms/foo") + @result{} ("~rms/foo.~5~" "~rms/foo.~3~") +@end group +@end smallexample +@end defun + +@c Emacs 19 feature +@defun file-newest-backup filename +This function returns the name of the most recent backup file for +@var{filename}, or @code{nil} if that file has no backup files. + +Some file comparison commands use this function so that they can +automatically compare a file with its most recent backup. +@end defun + +@node Auto-Saving +@section Auto-Saving +@c @cindex auto-saving Lots of symbols starting with auto-save here. + + Emacs periodically saves all files that you are visiting; this is +called @dfn{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, or after around 30 seconds of +idle time. @xref{Auto Save, Auto Save, Auto-Saving: Protection Against +Disasters, emacs, The GNU Emacs Manual}, for information on auto-save +for users. Here we describe the functions used to implement auto-saving +and the variables that control them. + +@defvar buffer-auto-save-file-name +This buffer-local variable is the name of the file used for +auto-saving the current buffer. It is @code{nil} if the buffer +should not be auto-saved. + +@example +@group +buffer-auto-save-file-name + @result{} "/xcssun/users/rms/lewis/#backups.texi#" +@end group +@end example +@end defvar + +@deffn 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 @var{arg}, the command turns auto-saving +on if the value of @var{arg} is @code{t}, a nonempty list, or a positive +integer. Otherwise, it turns auto-saving off. +@end deffn + +@defun auto-save-file-name-p filename +This function returns a non-@code{nil} value if @var{filename} is a +string that could be the name of an auto-save file. It assumes +the usual naming convention for auto-save files: a name that +begins and ends with hash marks (@samp{#}) is a possible auto-save file +name. The argument @var{filename} should not contain a directory part. + +@example +@group +(make-auto-save-file-name) + @result{} "/xcssun/users/rms/lewis/#backups.texi#" +@end group +@group +(auto-save-file-name-p "#backups.texi#") + @result{} 0 +@end group +@group +(auto-save-file-name-p "backups.texi") + @result{} nil +@end group +@end example + +The standard definition of this function is as follows: + +@example +@group +(defun auto-save-file-name-p (filename) + "Return non-nil if FILENAME can be yielded by..." + (string-match "^#.*#$" filename)) +@end group +@end example + +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 the function @code{make-auto-save-file-name} +correspondingly. +@end defun + +@defun 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 (@samp{#}) prepended +and appended to it. This function does not look at the variable +@code{auto-save-visited-file-name} (described below); callers of this +function should check that variable first. + +@example +@group +(make-auto-save-file-name) + @result{} "/xcssun/users/rms/lewis/#backups.texi#" +@end group +@end example + +Here is a simplified version of the standard definition of this +function: + +@example +@group +(defun make-auto-save-file-name () + "Return file name to use for auto-saves \ +of current buffer.." + (if buffer-file-name +@end group +@group + (concat + (file-name-directory buffer-file-name) + "#" + (file-name-nondirectory buffer-file-name) + "#") + (expand-file-name + (concat "#%" (buffer-name) "#")))) +@end group +@end example + +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 @code{auto-save-file-name-p} in a corresponding way. +@end defun + +@defopt auto-save-visited-file-name +If this variable is non-@code{nil}, Emacs auto-saves buffers in +the files they are visiting. That is, the auto-save is done in the same +file that you are editing. Normally, this variable is @code{nil}, so +auto-save files have distinct names that are created by +@code{make-auto-save-file-name}. + +When you change the value of this variable, the new value does not take +effect in an existing buffer until the next time auto-save mode is +reenabled in it. If auto-save mode is already enabled, auto-saves +continue to go in the same file name until @code{auto-save-mode} is +called again. +@end defopt + +@defun recent-auto-save-p +This function returns @code{t} if the current buffer has been +auto-saved since the last time it was read in or saved. +@end defun + +@defun 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 @code{nil}. +@end defun + +@defopt auto-save-interval +The value of this variable specifies how often to do auto-saving, in +terms of number of input events. Each time this many additional input +events are read, Emacs does auto-saving for all buffers in which that is +enabled. Setting this to zero disables autosaving based on the +number of characters typed. +@end defopt + +@defopt auto-save-timeout +The value of this variable is the number of seconds of idle time that +should cause auto-saving. Each time the user pauses for this long, +Emacs does auto-saving for all buffers in which that is enabled. (If +the current buffer is large, the specified timeout is multiplied by a +factor that increases as the size increases; for a million-byte +buffer, the factor is almost 4.) + +If the value is zero or @code{nil}, then auto-saving is not done as a +result of idleness, only after a certain number of input events as +specified by @code{auto-save-interval}. +@end defopt + +@defvar auto-save-hook +This normal hook is run whenever an auto-save is about to happen. +@end defvar + +@defopt auto-save-default +If this variable is non-@code{nil}, buffers that are visiting files +have auto-saving enabled by default. Otherwise, they do not. +@end defopt + +@deffn Command do-auto-save &optional no-message current-only +This function auto-saves all buffers that need to be auto-saved. It +saves all buffers for which auto-saving is enabled and that have been +changed since the previous auto-save. + +If any buffers are auto-saved, @code{do-auto-save} normally displays a +message saying @samp{Auto-saving...} in the echo area while +auto-saving is going on. However, if @var{no-message} is +non-@code{nil}, the message is inhibited. + +If @var{current-only} is non-@code{nil}, only the current buffer +is auto-saved. +@end deffn + +@defun delete-auto-save-file-if-necessary &optional force +This function deletes the current buffer's auto-save file if +@code{delete-auto-save-files} is non-@code{nil}. It is called every +time a buffer is saved. + +Unless @var{force} is non-@code{nil}, this function only deletes the +file if it was written by the current Emacs session since the last +true save. +@end defun + +@defopt delete-auto-save-files +This variable is used by the function +@code{delete-auto-save-file-if-necessary}. If it is non-@code{nil}, +Emacs deletes auto-save files when a true save is done (in the visited +file). This saves disk space and unclutters your directory. +@end defopt + +@defun 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 it was made in the current Emacs session. If the visited +file name has not changed, this function does nothing. +@end defun + +@defvar buffer-saved-size +The value of this buffer-local variable is the length of the current +buffer, when it was last read in, saved, or auto-saved. This is +used to detect a substantial decrease in size, and turn off auto-saving +in response. + +If it is @minus{}1, that means auto-saving is temporarily shut off in +this buffer due to a substantial decrease in size. Explicitly saving +the buffer stores a positive value in this variable, thus reenabling +auto-saving. Turning auto-save mode off or on also updates this +variable, so that the substantial decrease in size is forgotten. +@end defvar + +@defvar auto-save-list-file-name +This variable (if non-@code{nil}) specifies a file for recording the +names of all the auto-save files. Each time Emacs does auto-saving, it +writes two lines into this file for each buffer that has auto-saving +enabled. The first line gives the name of the visited file (it's empty +if the buffer has none), and the second gives the name of the auto-save +file. + +When Emacs exits normally, it deletes this file; if Emacs crashes, you +can look in the file to find all the auto-save files that might contain +work that was otherwise lost. The @code{recover-session} command uses +this file to find them. + +The default name for this file specifies your home directory and starts +with @samp{.saves-}. It also contains the Emacs process @acronym{ID} and the +host name. +@end defvar + +@defvar auto-save-list-file-prefix +After Emacs reads your init file, it initializes +@code{auto-save-list-file-name} (if you have not already set it +non-@code{nil}) based on this prefix, adding the host name and process +ID. If you set this to @code{nil} in your init file, then Emacs does +not initialize @code{auto-save-list-file-name}. +@end defvar + +@node Reverting +@section 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 @code{revert-buffer} command. @xref{Reverting, , +Reverting a Buffer, emacs, The GNU Emacs Manual}. + +@deffn Command revert-buffer &optional ignore-auto noconfirm preserve-modes +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. + +By default, if the latest auto-save file is more recent than the visited +file, and the argument @var{ignore-auto} is @code{nil}, +@code{revert-buffer} asks the user whether to use that auto-save +instead. When you invoke this command interactively, @var{ignore-auto} +is @code{t} if there is no numeric prefix argument; thus, the +interactive default is not to check the auto-save file. + +Normally, @code{revert-buffer} asks for confirmation before it changes +the buffer; but if the argument @var{noconfirm} is non-@code{nil}, +@code{revert-buffer} does not ask for confirmation. + +Normally, this command reinitializes the buffer's major and minor modes +using @code{normal-mode}. But if @var{preserve-modes} is +non-@code{nil}, the modes remain unchanged. + +Reverting tries to preserve marker positions in the buffer by using the +replacement feature of @code{insert-file-contents}. If the buffer +contents and the file contents are identical before the revert +operation, reverting preserves all the markers. If they are not +identical, reverting does change the buffer; in that case, it preserves +the markers in the unchanged text (if any) at the beginning and end of +the buffer. Preserving any additional markers would be problematical. +@end deffn + +You can customize how @code{revert-buffer} does its work by setting +the variables described in the rest of this section. + +@defopt revert-without-query +This variable holds a list of files that should be reverted without +query. The value is a list of regular expressions. If the visited file +name matches one of these regular expressions, and the file has changed +on disk but the buffer is not modified, then @code{revert-buffer} +reverts the file without asking the user for confirmation. +@end defopt + + Some major modes customize @code{revert-buffer} by making +buffer-local bindings for these variables: + +@defvar revert-buffer-function +@anchor{Definition of revert-buffer-function} +The value of this variable is the function to use to revert this +buffer. If non-@code{nil}, it should be a function with two optional +arguments to do the work of reverting. The two optional arguments, +@var{ignore-auto} and @var{noconfirm}, are the arguments that +@code{revert-buffer} received. If the value is @code{nil}, reverting +works the usual way. + +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, can give this variable a buffer-local value that is a function to +regenerate the contents. +@end defvar + +@defvar revert-buffer-insert-file-contents-function +The value of this variable, if non-@code{nil}, specifies the function to use to +insert the updated contents when reverting this buffer. The function +receives two arguments: first the file name to use; second, @code{t} if +the user has asked to read the auto-save file. + +The reason for a mode to set this variable instead of +@code{revert-buffer-function} is to avoid duplicating or replacing the +rest of what @code{revert-buffer} does: asking for confirmation, +clearing the undo list, deciding the proper major mode, and running the +hooks listed below. +@end defvar + +@defvar before-revert-hook +This normal hook is run by @code{revert-buffer} before +inserting the modified contents---but only if +@code{revert-buffer-function} is @code{nil}. +@end defvar + +@defvar after-revert-hook +This normal hook is run by @code{revert-buffer} after inserting +the modified contents---but only if @code{revert-buffer-function} is +@code{nil}. +@end defvar + +@ignore + arch-tag: 295a6321-e5ab-46d5-aef5-0bb4f447a67f +@end ignore diff --git a/doc/lispref/book-spine.texinfo b/doc/lispref/book-spine.texinfo new file mode 100644 index 00000000000..7355c4530ae --- /dev/null +++ b/doc/lispref/book-spine.texinfo @@ -0,0 +1,29 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename book-spine +@settitle book-spine +@c %**end of header + +@c need dot in text so first space command works! +. +@sp 7 + +@center @titlefont{GNU Emacs Lisp Reference Manual} +@sp 5 +@center GNU +@center Emacs Version 22.1 +@center for Unix Users +@sp 5 + +@center by +@center Bil Lewis, +@center Dan LaLiberte, +@center and the +@center GNU Manual Group +@sp 5 +@center Free Software Foundation +@bye + +@ignore + arch-tag: 4466c7ca-e549-4119-948c-6eed34e1ff87 +@end ignore diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi new file mode 100644 index 00000000000..e9cafb69fb5 --- /dev/null +++ b/doc/lispref/buffers.texi @@ -0,0 +1,1165 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, 2002, +@c 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/buffers +@node Buffers, Windows, Backups and Auto-Saving, Top +@chapter Buffers +@cindex buffer + + A @dfn{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 that are not visiting files. While several buffers may +exist at one time, only one buffer is designated the @dfn{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. + +@menu +* Buffer Basics:: What is a buffer? +* Current Buffer:: Designating a buffer as current + so that primitives will access its contents. +* Buffer Names:: Accessing and changing buffer names. +* Buffer File Name:: The buffer file name indicates which file is visited. +* Buffer Modification:: A buffer is @dfn{modified} if it needs to be saved. +* Modification Time:: Determining whether the visited file was changed + ``behind Emacs's back''. +* Read Only Buffers:: Modifying text is not allowed in a read-only buffer. +* The Buffer List:: How to look at all the existing buffers. +* Creating Buffers:: Functions that create buffers. +* Killing Buffers:: Buffers exist until explicitly killed. +* Indirect Buffers:: An indirect buffer shares text with some other buffer. +* Buffer Gap:: The gap in the buffer. +@end menu + +@node Buffer Basics +@comment node-name, next, previous, up +@section Buffer Basics + +@ifnottex + A @dfn{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 that are not visiting files. Although several buffers +normally exist, only one buffer is designated the @dfn{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. +@end ifnottex + + Buffers in Emacs editing are objects that have distinct names and hold +text that can be edited. Buffers appear to Lisp programs as a special +data type. You can think of the contents of a buffer as a string that +you can extend; insertions and deletions may occur in any part of the +buffer. @xref{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 accessible only through +special-purpose functions. For example, the visited file name 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 +@dfn{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 @code{fill-column} or @code{comment-column} in this +way. For more information about buffer-local variables and functions +related to them, see @ref{Buffer-Local Variables}. + + For functions and variables related to visiting files in buffers, see +@ref{Visiting Files} and @ref{Saving Buffers}. For functions and +variables related to the display of buffers in windows, see +@ref{Buffers and Windows}. + +@defun bufferp object +This function returns @code{t} if @var{object} is a buffer, +@code{nil} otherwise. +@end defun + +@node Current Buffer +@section The Current Buffer +@cindex selecting a buffer +@cindex changing to another buffer +@cindex current buffer + + There are, in general, many buffers in an Emacs session. At any time, +one of them is designated as the @dfn{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 (@pxref{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 temporarily designate any buffer as +current 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 +@code{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 buffer that the command will apply to. +(@xref{Command Loop}.) Therefore, @code{set-buffer} is not the way to +switch visibly to a different buffer so that the user can edit it. For +that, you must use the functions described in @ref{Displaying Buffers}. + + @strong{Warning:} Lisp functions that change to a different current buffer +should not depend 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 @code{set-buffer} within a @code{save-current-buffer} or +@code{save-excursion} (@pxref{Excursions}) form that will restore the +current buffer when your function is done. Here is an example, the +code for the command @code{append-to-buffer} (with the documentation +string abridged): + +@example +@group +(defun append-to-buffer (buffer start end) + "Append to specified buffer the text of the region. +@dots{}" + (interactive "BAppend to buffer: \nr") + (let ((oldbuf (current-buffer))) + (save-current-buffer + (set-buffer (get-buffer-create buffer)) + (insert-buffer-substring oldbuf start end)))) +@end group +@end example + +@noindent +This function binds a local variable to record the current buffer, and +then @code{save-current-buffer} arranges to make it current again. +Next, @code{set-buffer} makes the specified buffer current. Finally, +@code{insert-buffer-substring} copies the string from the original +current buffer to the specified (and now current) buffer. + + If the buffer appended to happens to be displayed in some window, +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. + + If you make local bindings (with @code{let} or function arguments) for +a variable that may also have buffer-local bindings, make sure that the +same buffer is current at the beginning and at the end of the local +binding's scope. Otherwise you might bind it in one buffer and unbind +it in another! There are two ways to do this. In simple cases, you may +see that nothing ever changes the current buffer within the scope of the +binding. Otherwise, use @code{save-current-buffer} or +@code{save-excursion} to make sure that the buffer current at the +beginning is current again whenever the variable is unbound. + + Do not rely on using @code{set-buffer} to change the current buffer +back, because that won't do the job if a quit happens while the wrong +buffer is current. Here is what @emph{not} to do: + +@example +@group +(let (buffer-read-only + (obuf (current-buffer))) + (set-buffer @dots{}) + @dots{} + (set-buffer obuf)) +@end group +@end example + +@noindent +Using @code{save-current-buffer}, as shown here, handles quitting, +errors, and @code{throw}, as well as ordinary evaluation. + +@example +@group +(let (buffer-read-only) + (save-current-buffer + (set-buffer @dots{}) + @dots{})) +@end group +@end example + +@defun current-buffer +This function returns the current buffer. + +@example +@group +(current-buffer) + @result{} #<buffer buffers.texi> +@end group +@end example +@end defun + +@defun set-buffer buffer-or-name +This function makes @var{buffer-or-name} the current buffer. This does +not display the buffer in any window, so the user cannot necessarily see +the buffer. But Lisp programs will now operate on it. + +This function returns the buffer identified by @var{buffer-or-name}. +An error is signaled if @var{buffer-or-name} does not identify an +existing buffer. +@end defun + +@defspec save-current-buffer body@dots{} +The @code{save-current-buffer} special form saves the identity of the +current buffer, evaluates the @var{body} forms, and finally restores +that buffer as current. The return value is the value of the last +form in @var{body}. The current buffer is restored even in case of an +abnormal exit via @code{throw} or error (@pxref{Nonlocal Exits}). + +If the buffer that used to be current has been killed by the time of +exit from @code{save-current-buffer}, then it is not made current again, +of course. Instead, whichever buffer was current just before exit +remains current. +@end defspec + +@defmac with-current-buffer buffer-or-name body@dots{} +The @code{with-current-buffer} macro saves the identity of the current +buffer, makes @var{buffer-or-name} current, evaluates the @var{body} +forms, and finally restores the buffer. The return value is the value +of the last form in @var{body}. The current buffer is restored even +in case of an abnormal exit via @code{throw} or error (@pxref{Nonlocal +Exits}). + +An error is signaled if @var{buffer-or-name} does not identify an +existing buffer. +@end defmac + +@defmac with-temp-buffer body@dots{} +@anchor{Definition of with-temp-buffer} +The @code{with-temp-buffer} macro evaluates the @var{body} forms +with a temporary buffer as the current buffer. It saves the identity of +the current buffer, creates a temporary buffer and makes it current, +evaluates the @var{body} forms, and finally restores the previous +current buffer while killing the temporary buffer. By default, undo +information (@pxref{Undo}) is not recorded in the buffer created by +this macro (but @var{body} can enable that, if needed). + +The return value is the value of the last form in @var{body}. You can +return the contents of the temporary buffer by using +@code{(buffer-string)} as the last form. + +The current buffer is restored even in case of an abnormal exit via +@code{throw} or error (@pxref{Nonlocal Exits}). + +See also @code{with-temp-file} in @ref{Definition of with-temp-file,, +Writing to Files}. +@end defmac + +@node Buffer Names +@section Buffer Names +@cindex buffer names + + Each buffer has a unique name, which is a string. Many of the +functions that work on buffers accept either a buffer or a buffer name +as an argument. Any argument called @var{buffer-or-name} is of this +sort, and an error is signaled if it is neither a string nor a buffer. +Any argument called @var{buffer} must be an actual buffer +object, not a name. + +@cindex hidden buffers +@cindex buffers without undo information + Buffers that are ephemeral and generally uninteresting to the user +have names starting with a space, so that the @code{list-buffers} and +@code{buffer-menu} commands don't mention them (but if such a buffer +visits a file, it @strong{is} mentioned). A name starting with +space also initially disables recording undo information; see +@ref{Undo}. + +@defun buffer-name &optional buffer +This function returns the name of @var{buffer} as a string. If +@var{buffer} is not supplied, it defaults to the current buffer. + +If @code{buffer-name} returns @code{nil}, it means that @var{buffer} +has been killed. @xref{Killing Buffers}. + +@example +@group +(buffer-name) + @result{} "buffers.texi" +@end group + +@group +(setq foo (get-buffer "temp")) + @result{} #<buffer temp> +@end group +@group +(kill-buffer foo) + @result{} nil +@end group +@group +(buffer-name foo) + @result{} nil +@end group +@group +foo + @result{} #<killed buffer> +@end group +@end example +@end defun + +@deffn Command rename-buffer newname &optional unique +This function renames the current buffer to @var{newname}. An error +is signaled if @var{newname} is not a string. + +@c Emacs 19 feature +Ordinarily, @code{rename-buffer} signals an error if @var{newname} is +already in use. However, if @var{unique} is non-@code{nil}, it modifies +@var{newname} to make a name that is not in use. Interactively, you can +make @var{unique} non-@code{nil} with a numeric prefix argument. +(This is how the command @code{rename-uniquely} is implemented.) + +This function returns the name actually given to the buffer. +@end deffn + +@defun get-buffer buffer-or-name +This function returns the buffer specified by @var{buffer-or-name}. +If @var{buffer-or-name} is a string and there is no buffer with that +name, the value is @code{nil}. If @var{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: + +@example +@group +(setq b (get-buffer "lewis")) + @result{} #<buffer lewis> +@end group +@group +(get-buffer b) + @result{} #<buffer lewis> +@end group +@group +(get-buffer "Frazzle-nots") + @result{} nil +@end group +@end example + +See also the function @code{get-buffer-create} in @ref{Creating Buffers}. +@end defun + +@c Emacs 19 feature +@defun generate-new-buffer-name starting-name &optional ignore +This function returns a name that would be unique for a new buffer---but +does not create the buffer. It starts with @var{starting-name}, and +produces a name not currently in use for any buffer by appending a +number inside of @samp{<@dots{}>}. It starts at 2 and keeps +incrementing the number until it is not the name of an existing buffer. + +If the optional second argument @var{ignore} is non-@code{nil}, it +should be a string, a potential buffer name. It means to consider +that potential buffer acceptable, if it is tried, even it is the name +of an existing buffer (which would normally be rejected). Thus, if +buffers named @samp{foo}, @samp{foo<2>}, @samp{foo<3>} and +@samp{foo<4>} exist, + +@example +(generate-new-buffer-name "foo") + @result{} "foo<5>" +(generate-new-buffer-name "foo" "foo<3>") + @result{} "foo<3>" +(generate-new-buffer-name "foo" "foo<6>") + @result{} "foo<5>" +@end example + +See the related function @code{generate-new-buffer} in @ref{Creating +Buffers}. +@end defun + +@node Buffer File Name +@section Buffer File Name +@cindex visited file +@cindex buffer file name +@cindex file name of buffer + + The @dfn{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 @code{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. +@xref{Visiting Files}. + +@defun buffer-file-name &optional buffer +This function returns the absolute file name of the file that +@var{buffer} is visiting. If @var{buffer} is not visiting any file, +@code{buffer-file-name} returns @code{nil}. If @var{buffer} is not +supplied, it defaults to the current buffer. + +@example +@group +(buffer-file-name (other-buffer)) + @result{} "/usr/user/lewis/manual/files.texi" +@end group +@end example +@end defun + +@defvar buffer-file-name +This buffer-local variable contains the name of the file being visited +in the current buffer, or @code{nil} if it is not visiting a file. It +is a permanent local variable, unaffected by +@code{kill-all-local-variables}. + +@example +@group +buffer-file-name + @result{} "/usr/user/lewis/manual/buffers.texi" +@end group +@end example + +It is risky to change this variable's value without doing various other +things. Normally it is better to use @code{set-visited-file-name} (see +below); some of the things done there, such as changing the buffer name, +are not strictly necessary, but others are essential to avoid confusing +Emacs. +@end defvar + +@defvar buffer-file-truename +This buffer-local variable holds the abbreviated truename of the file +visited in the current buffer, or @code{nil} if no file is visited. +It is a permanent local, unaffected by +@code{kill-all-local-variables}. @xref{Truenames}, and +@ref{Definition of abbreviate-file-name}. +@end defvar + +@defvar buffer-file-number +This buffer-local variable holds the file number and directory device +number of the file visited in the current buffer, or @code{nil} if no +file or a nonexistent file is visited. It is a permanent local, +unaffected by @code{kill-all-local-variables}. + +The value is normally a list of the form @code{(@var{filenum} +@var{devnum})}. This pair of numbers uniquely identifies the file among +all files accessible on the system. See the function +@code{file-attributes}, in @ref{File Attributes}, for more information +about them. + +If @code{buffer-file-name} is the name of a symbolic link, then both +numbers refer to the recursive target. +@end defvar + +@defun get-file-buffer filename +This function returns the buffer visiting file @var{filename}. If +there is no such buffer, it returns @code{nil}. The argument +@var{filename}, which must be a string, is expanded (@pxref{File Name +Expansion}), then compared against the visited file names of all live +buffers. Note that the buffer's @code{buffer-file-name} must match +the expansion of @var{filename} exactly. This function will not +recognize other names for the same file. + +@example +@group +(get-file-buffer "buffers.texi") + @result{} #<buffer buffers.texi> +@end group +@end example + +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. +@end defun + +@defun find-buffer-visiting filename &optional predicate +This is like @code{get-file-buffer}, except that it can return any +buffer visiting the file @emph{possibly under a different name}. That +is, the buffer's @code{buffer-file-name} does not need to match the +expansion of @var{filename} exactly, it only needs to refer to the +same file. If @var{predicate} is non-@code{nil}, it should be a +function of one argument, a buffer visiting @var{filename}. The +buffer is only considered a suitable return value if @var{predicate} +returns non-@code{nil}. If it can not find a suitable buffer to +return, @code{find-buffer-visiting} returns @code{nil}. +@end defun + +@deffn Command set-visited-file-name filename &optional no-query along-with-file +If @var{filename} is a non-empty string, this function changes the +name of the file visited in the current buffer to @var{filename}. (If the +buffer had no visited file, this gives it one.) The @emph{next time} +the buffer is saved it will go in the newly-specified file. + +This command marks the buffer as modified, since it does not (as far +as Emacs knows) match the contents of @var{filename}, even if it +matched the former visited file. It also renames the buffer to +correspond to the new file name, unless the new name is already in +use. + +If @var{filename} is @code{nil} or the empty string, that stands for +``no visited file.'' In this case, @code{set-visited-file-name} marks +the buffer as having no visited file, without changing the buffer's +modified flag. + +Normally, this function asks the user for confirmation if there +already is a buffer visiting @var{filename}. If @var{no-query} is +non-@code{nil}, that prevents asking this question. If there already +is a buffer visiting @var{filename}, and the user confirms or +@var{query} is non-@code{nil}, this function makes the new buffer name +unique by appending a number inside of @samp{<@dots{}>} to @var{filename}. + +If @var{along-with-file} is non-@code{nil}, that means to assume that +the former visited file has been renamed to @var{filename}. In this +case, the command does not change the buffer's modified flag, nor the +buffer's recorded last file modification time as reported by +@code{visited-file-modtime} (@pxref{Modification Time}). If +@var{along-with-file} is @code{nil}, this function clears the recorded +last file modification time, after which @code{visited-file-modtime} +returns zero. + +@c Wordy to avoid overfull hbox. --rjc 16mar92 +When the function @code{set-visited-file-name} is called interactively, it +prompts for @var{filename} in the minibuffer. +@end deffn + +@defvar list-buffers-directory +This buffer-local variable specifies a string to display in a buffer +listing where the visited file name would go, for buffers that don't +have a visited file name. Dired buffers use this variable. +@end defvar + +@node Buffer Modification +@section Buffer Modification +@cindex buffer modification +@cindex modification flag (of buffer) + + Emacs keeps a flag called the @dfn{modified flag} for each buffer, to +record whether you have changed the text of the buffer. This flag is +set to @code{t} whenever you alter the contents of the buffer, and +cleared to @code{nil} when you save it. Thus, the flag shows whether +there are unsaved changes. The flag value is normally shown in the mode +line (@pxref{Mode Line Variables}), and controls saving (@pxref{Saving +Buffers}) and auto-saving (@pxref{Auto-Saving}). + + Some Lisp programs set the flag explicitly. For example, the function +@code{set-visited-file-name} sets the flag to @code{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 +@ref{Text}. + +@defun buffer-modified-p &optional buffer +This function returns @code{t} if the buffer @var{buffer} has been modified +since it was last read in from a file or saved, or @code{nil} +otherwise. If @var{buffer} is not supplied, the current buffer +is tested. +@end defun + +@defun set-buffer-modified-p flag +This function marks the current buffer as modified if @var{flag} is +non-@code{nil}, or as unmodified if the flag is @code{nil}. + +Another effect of calling this function is to cause unconditional +redisplay of the mode line for the current buffer. In fact, the +function @code{force-mode-line-update} works by doing this: + +@example +@group +(set-buffer-modified-p (buffer-modified-p)) +@end group +@end example +@end defun + +@defun restore-buffer-modified-p flag +Like @code{set-buffer-modified-p}, but does not force redisplay +of mode lines. +@end defun + +@deffn Command not-modified &optional arg +This command marks the current buffer as unmodified, and not needing +to be saved. If @var{arg} is non-@code{nil}, it marks the buffer as +modified, so that it will be saved at the next suitable occasion. +Interactively, @var{arg} is the prefix argument. + +Don't use this function in programs, since it prints a message in the +echo area; use @code{set-buffer-modified-p} (above) instead. +@end deffn + +@defun buffer-modified-tick &optional buffer +This function returns @var{buffer}'s modification-count. This is a +counter that increments every time the buffer is modified. If +@var{buffer} is @code{nil} (or omitted), the current buffer is used. +The counter can wrap around occasionally. +@end defun + +@defun buffer-chars-modified-tick &optional buffer +This function returns @var{buffer}'s character-change modification-count. +Changes to text properties leave this counter unchanged; however, each +time text is inserted or removed from the buffer, the counter is reset +to the value that would be returned @code{buffer-modified-tick}. +By comparing the values returned by two @code{buffer-chars-modified-tick} +calls, you can tell whether a character change occurred in that buffer +in between the calls. If @var{buffer} is @code{nil} (or omitted), the +current buffer is used. +@end defun + +@node Modification Time +@comment node-name, next, previous, up +@section Buffer Modification Time +@cindex comparing file modification time +@cindex modification time of buffer + + 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. (@xref{File Attributes}, +for how to examine a file's modification time.) + +@defun verify-visited-file-modtime buffer +This function compares what @var{buffer} has recorded for the +modification time of its visited file against the actual modification +time of the file as recorded by the operating system. The two should be +the same unless some other process has written the file since Emacs +visited or saved it. + +The function returns @code{t} if the last actual modification time and +Emacs's recorded modification time are the same, @code{nil} otherwise. +It also returns @code{t} if the buffer has no recorded last +modification time, that is if @code{visited-file-modtime} would return +zero. + +It always returns @code{t} for buffers that are not visiting a file, +even if @code{visited-file-modtime} returns a non-zero value. For +instance, it always returns @code{t} for dired buffers. It returns +@code{t} for buffers that are visiting a file that does not exist and +never existed, but @code{nil} for file-visiting buffers whose file has +been deleted. +@end defun + +@defun 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 @code{set-visited-file-name} and other +exceptional places where the usual test to avoid overwriting a changed +file should not be done. +@end defun + +@c Emacs 19 feature +@defun visited-file-modtime +This function returns the current buffer's recorded last file +modification time, as a list of the form @code{(@var{high} @var{low})}. +(This is the same format that @code{file-attributes} uses to return +time values; see @ref{File Attributes}.) + +If the buffer has no recorded last modification time, this function +returns zero. This case occurs, for instance, if the buffer is not +visiting a file or if the time has been explicitly cleared by +@code{clear-visited-file-modtime}. Note, however, that +@code{visited-file-modtime} returns a list for some non-file buffers +too. For instance, in a Dired buffer listing a directory, it returns +the last modification time of that directory, as recorded by Dired. + +For a new buffer visiting a not yet existing file, @var{high} is +@minus{}1 and @var{low} is 65535, that is, +@ifnottex +@w{2**16 - 1.} +@end ifnottex +@tex +@math{2^{16}-1}. +@end tex +@end defun + +@c Emacs 19 feature +@defun set-visited-file-modtime &optional time +This function updates the buffer's record of the last modification time +of the visited file, to the value specified by @var{time} if @var{time} +is not @code{nil}, and otherwise to the last modification time of the +visited file. + +If @var{time} is neither @code{nil} nor zero, it should have the form +@code{(@var{high} . @var{low})} or @code{(@var{high} @var{low})}, in +either case containing two integers, each of which holds 16 bits of the +time. + +This function is useful if the buffer was not read from the file +normally, or if the file itself has been changed for some known benign +reason. +@end defun + +@defun ask-user-about-supersession-threat filename +This function is used to ask a user how to proceed after an attempt to +modify an buffer visiting file @var{filename} when the file is newer +than the buffer text. Emacs detects this because the modification +time of the file on disk is newer than the last save-time of the +buffer. This means some other program has probably altered the file. + +@kindex file-supersession +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 +@code{file-supersession} error with data @code{(@var{filename})}, in which +case the proposed buffer modification is not allowed. + +This function is called automatically by Emacs on the proper +occasions. It exists so you can customize Emacs by redefining it. +See the file @file{userlock.el} for the standard definition. + +See also the file locking mechanism in @ref{File Locks}. +@end defun + +@node Read Only Buffers +@section Read-Only Buffers +@cindex read-only buffer +@cindex buffer, read-only + + If a buffer is @dfn{read-only}, then you cannot change its contents, +although you may change your view of the contents by scrolling and +narrowing. + + Read-only buffers are used in two kinds of situations: + +@itemize @bullet +@item +A buffer visiting a write-protected file is normally read-only. + +Here, the purpose is to inform 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 @kbd{C-x C-q}. + +@item +Modes such as Dired and Rmail make buffers read-only when altering the +contents with the usual editing commands would probably be a mistake. + +The special commands of these modes bind @code{buffer-read-only} to +@code{nil} (with @code{let}) or bind @code{inhibit-read-only} to +@code{t} around the places where they themselves change the text. +@end itemize + +@defvar buffer-read-only +This buffer-local variable specifies whether the buffer is read-only. +The buffer is read-only if this variable is non-@code{nil}. +@end defvar + +@defvar inhibit-read-only +If this variable is non-@code{nil}, then read-only buffers and, +depending on the actual value, some or all read-only characters may be +modified. Read-only characters in a buffer are those that have +non-@code{nil} @code{read-only} properties (either text properties or +overlay properties). @xref{Special Properties}, for more information +about text properties. @xref{Overlays}, for more information about +overlays and their properties. + +If @code{inhibit-read-only} is @code{t}, all @code{read-only} character +properties have no effect. If @code{inhibit-read-only} is a list, then +@code{read-only} character properties have no effect if they are members +of the list (comparison is done with @code{eq}). +@end defvar + +@deffn Command toggle-read-only &optional arg +This command toggles whether the current buffer is read-only. It is +intended for interactive use; do not 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 @code{buffer-read-only} explicitly to the +proper value, @code{t} or @code{nil}. + +If @var{arg} is non-@code{nil}, it should be a raw prefix argument. +@code{toggle-read-only} sets @code{buffer-read-only} to @code{t} if +the numeric value of that prefix argument is positive and to +@code{nil} otherwise. @xref{Prefix Command Arguments}. +@end deffn + +@defun barf-if-buffer-read-only +This function signals a @code{buffer-read-only} error if the current +buffer is read-only. @xref{Using Interactive}, for another way to +signal an error if the current buffer is read-only. +@end defun + +@node The Buffer List +@section The Buffer List +@cindex buffer list + + The @dfn{buffer list} is a list of all live buffers. The order of +the buffers in the list is based primarily on how recently each buffer +has been displayed in a window. Several functions, notably +@code{other-buffer}, use this ordering. A buffer list displayed for +the user also follows this order. + + Creating a buffer adds it to the end of the buffer list, and killing +a buffer removes it. Buffers move to the front of the list when they +are selected for display in a window (@pxref{Displaying Buffers}), and +to the end when they are buried (see @code{bury-buffer}, below). +There are no functions available to the Lisp programmer which directly +manipulate the buffer list. + + In addition to the fundamental Emacs buffer list, each frame has its +own version of the buffer list, in which the buffers that have been +selected in that frame come first, starting with the buffers most +recently selected @emph{in that frame}. (This order is recorded in +@var{frame}'s @code{buffer-list} frame parameter; see @ref{Buffer +Parameters}.) The buffers that were never selected in @var{frame} come +afterward, ordered according to the fundamental Emacs buffer list. + +@defun buffer-list &optional frame +This function returns the buffer list, including all buffers, even those +whose names begin with a space. The elements are actual buffers, not +their names. + +If @var{frame} is a frame, this returns @var{frame}'s buffer list. If +@var{frame} is @code{nil}, the fundamental Emacs buffer list is used: +all the buffers appear in order of most recent selection, regardless of +which frames they were selected in. + +@example +@group +(buffer-list) + @result{} (#<buffer buffers.texi> + #<buffer *Minibuf-1*> #<buffer buffer.c> + #<buffer *Help*> #<buffer TAGS>) +@end group + +@group +;; @r{Note that the name of the minibuffer} +;; @r{begins with a space!} +(mapcar (function buffer-name) (buffer-list)) + @result{} ("buffers.texi" " *Minibuf-1*" + "buffer.c" "*Help*" "TAGS") +@end group +@end example +@end defun + + The list that @code{buffer-list} returns is constructed specifically +by @code{buffer-list}; it is not an internal Emacs data structure, and +modifying it has no effect on the order of buffers. If you want to +change the order of buffers in the frame-independent buffer list, here +is an easy way: + +@example +(defun reorder-buffer-list (new-list) + (while new-list + (bury-buffer (car new-list)) + (setq new-list (cdr new-list)))) +@end example + + With this method, you can specify any order for the list, but there is +no danger of losing a buffer or adding something that is not a valid +live buffer. + + To change the order or value of a frame's buffer list, set the frame's +@code{buffer-list} frame parameter with @code{modify-frame-parameters} +(@pxref{Parameter Access}). + +@defun other-buffer &optional buffer visible-ok frame +This function returns the first buffer in the buffer list other than +@var{buffer}. Usually this is the buffer selected most recently (in +frame @var{frame} or else the currently selected frame, @pxref{Input +Focus}), aside from @var{buffer}. Buffers whose names start with a +space are not considered at all. + +If @var{buffer} is not supplied (or if it is not a buffer), then +@code{other-buffer} returns the first buffer in the selected frame's +buffer list that is not now visible in any window in a visible frame. + +If @var{frame} has a non-@code{nil} @code{buffer-predicate} parameter, +then @code{other-buffer} uses that predicate to decide which buffers to +consider. It calls the predicate once for each buffer, and if the value +is @code{nil}, that buffer is ignored. @xref{Buffer Parameters}. + +@c Emacs 19 feature +If @var{visible-ok} is @code{nil}, @code{other-buffer} avoids returning +a buffer visible in any window on any visible frame, except as a last +resort. If @var{visible-ok} is non-@code{nil}, then it does not matter +whether a buffer is displayed somewhere or not. + +If no suitable buffer exists, the buffer @samp{*scratch*} is returned +(and created, if necessary). +@end defun + +@deffn Command bury-buffer &optional buffer-or-name +This function puts @var{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 +@code{other-buffer} to return. The argument can be either a buffer +itself or the name of one. + +@code{bury-buffer} operates on each frame's @code{buffer-list} parameter +as well as the frame-independent Emacs buffer list; therefore, the +buffer that you bury will come last in the value of @code{(buffer-list +@var{frame})} and in the value of @code{(buffer-list nil)}. + +If @var{buffer-or-name} is @code{nil} or omitted, this means to bury the +current buffer. In addition, if the buffer is displayed in the selected +window, this switches to some other buffer (obtained using +@code{other-buffer}) in the selected window. But if the buffer is +displayed in some other window, it remains displayed there. + +To replace a buffer in all the windows that display it, use +@code{replace-buffer-in-windows}. @xref{Buffers and Windows}. +@end deffn + +@node Creating Buffers +@section Creating Buffers +@cindex creating buffers +@cindex buffers, creating + + This section describes the two primitives for creating buffers. +@code{get-buffer-create} creates a buffer if it finds no existing buffer +with the specified name; @code{generate-new-buffer} always creates a new +buffer and gives it a unique name. + + Other functions you can use to create buffers include +@code{with-output-to-temp-buffer} (@pxref{Temporary Displays}) and +@code{create-file-buffer} (@pxref{Visiting Files}). Starting a +subprocess can also create a buffer (@pxref{Processes}). + +@defun get-buffer-create name +This function returns a buffer named @var{name}. It returns a live +buffer with that name, if one exists; otherwise, it creates a new +buffer. The buffer does not become the current buffer---this function +does not change which buffer is current. + +If @var{name} is a buffer instead of a string, it is returned, even if +it is dead. An error is signaled if @var{name} is neither a string +nor a buffer. + +@example +@group +(get-buffer-create "foo") + @result{} #<buffer foo> +@end group +@end example + +The major mode for a newly created buffer is set to Fundamental mode. +(The variable @code{default-major-mode} is handled at a higher level; +see @ref{Auto Major Mode}.) If the name begins with a space, the +buffer initially disables undo information recording (@pxref{Undo}). +@end defun + +@defun generate-new-buffer name +This function returns a newly created, empty buffer, but does not make +it current. If there is no buffer named @var{name}, then that is the +name of the new buffer. If that name is in use, this function adds +suffixes of the form @samp{<@var{n}>} to @var{name}, where @var{n} is an +integer. It tries successive integers starting with 2 until it finds an +available name. + +An error is signaled if @var{name} is not a string. + +@example +@group +(generate-new-buffer "bar") + @result{} #<buffer bar> +@end group +@group +(generate-new-buffer "bar") + @result{} #<buffer bar<2>> +@end group +@group +(generate-new-buffer "bar") + @result{} #<buffer bar<3>> +@end group +@end example + +The major mode for the new buffer is set to Fundamental mode. The +variable @code{default-major-mode} is handled at a higher level. +@xref{Auto Major Mode}. + +See the related function @code{generate-new-buffer-name} in @ref{Buffer +Names}. +@end defun + +@node Killing Buffers +@section Killing Buffers +@cindex killing buffers +@cindex buffers, killing + + @dfn{Killing a buffer} makes its name unknown to Emacs and makes the +memory space it occupied available for other use. + + The buffer object for the buffer that 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; if you kill two distinct buffers, they remain +distinct according to @code{eq} although both are dead. + + If you kill a buffer that is current or displayed in a window, Emacs +automatically selects or displays some other buffer instead. This means +that killing a buffer can in general change the current buffer. +Therefore, when you kill a buffer, you should also take the precautions +associated with changing the current buffer (unless you happen to know +that the buffer being killed isn't current). @xref{Current Buffer}. + + If you kill a buffer that is the base buffer of one or more indirect +buffers, the indirect buffers are automatically killed as well. + + The @code{buffer-name} of a killed buffer is @code{nil}. You can use +this feature to test whether a buffer has been killed: + +@example +@group +(defun buffer-killed-p (buffer) + "Return t if BUFFER is killed." + (not (buffer-name buffer))) +@end group +@end example + +@deffn Command kill-buffer buffer-or-name +This function kills the buffer @var{buffer-or-name}, freeing all its +memory for other uses or to be returned to the operating system. If +@var{buffer-or-name} is @code{nil}, it kills the current buffer. + +Any processes that have this buffer as the @code{process-buffer} are +sent the @code{SIGHUP} signal, which normally causes them to terminate. +(The basic meaning of @code{SIGHUP} is that a dialup line has been +disconnected.) @xref{Signals to Processes}. + +If the buffer is visiting a file and contains unsaved changes, +@code{kill-buffer} asks the user to confirm before the buffer is killed. +It does this even if not called interactively. To prevent the request +for confirmation, clear the modified flag before calling +@code{kill-buffer}. @xref{Buffer Modification}. + +Killing a buffer that is already dead has no effect. + +This function returns @code{t} if it actually killed the buffer. It +returns @code{nil} if the user refuses to confirm or if +@var{buffer-or-name} was already dead. + +@smallexample +(kill-buffer "foo.unchanged") + @result{} t +(kill-buffer "foo.changed") + +---------- Buffer: Minibuffer ---------- +Buffer foo.changed modified; kill anyway? (yes or no) @kbd{yes} +---------- Buffer: Minibuffer ---------- + + @result{} t +@end smallexample +@end deffn + +@defvar kill-buffer-query-functions +After confirming unsaved changes, @code{kill-buffer} calls the functions +in the list @code{kill-buffer-query-functions}, in order of appearance, +with no arguments. The buffer being killed is the current buffer when +they are called. The idea of this feature is that these functions will +ask for confirmation from the user. If any of them returns @code{nil}, +@code{kill-buffer} spares the buffer's life. +@end defvar + +@defvar kill-buffer-hook +This is a normal hook run by @code{kill-buffer} after asking all the +questions it is going to ask, just before actually killing the buffer. +The buffer to be killed is current when the hook functions run. +@xref{Hooks}. This variable is a permanent local, so its local binding +is not cleared by changing major modes. +@end defvar + +@defvar buffer-offer-save +This variable, if non-@code{nil} in a particular buffer, tells +@code{save-buffers-kill-emacs} and @code{save-some-buffers} (if the +second optional argument to that function is @code{t}) to offer to +save that buffer, just as they offer to save file-visiting buffers. +@xref{Definition of save-some-buffers}. The variable +@code{buffer-offer-save} automatically becomes buffer-local when set +for any reason. @xref{Buffer-Local Variables}. +@end defvar + +@defvar buffer-save-without-query +This variable, if non-@code{nil} in a particular buffer, tells +@code{save-buffers-kill-emacs} and @code{save-some-buffers} to save +this buffer (if it's modified) without asking the user. The variable +automatically becomes buffer-local when set for any reason. +@end defvar + +@defun buffer-live-p object +This function returns @code{t} if @var{object} is a buffer which has +not been killed, @code{nil} otherwise. +@end defun + +@node Indirect Buffers +@section Indirect Buffers +@cindex indirect buffers +@cindex base buffer + + An @dfn{indirect buffer} shares the text of some other buffer, which +is called the @dfn{base buffer} of the indirect buffer. In some ways it +is the analogue, for buffers, of a symbolic link among files. The base +buffer may not itself be an indirect buffer. + + The text of the indirect buffer is always identical to the text of its +base buffer; changes made by editing either one are visible immediately +in the other. This includes the text properties as well as the characters +themselves. + + In all other respects, the indirect buffer and its base buffer are +completely separate. They have different names, independent values of +point, independent narrowing, independent markers and overlays (though +inserting or deleting text in either buffer relocates the markers and +overlays for both), independent major modes, and independent +buffer-local variable bindings. + + An indirect buffer cannot visit a file, but its base buffer can. If +you try to save the indirect buffer, that actually saves the base +buffer. + + Killing an indirect buffer has no effect on its base buffer. Killing +the base buffer effectively kills the indirect buffer in that it cannot +ever again be the current buffer. + +@deffn Command make-indirect-buffer base-buffer name &optional clone +This creates and returns an indirect buffer named @var{name} whose +base buffer is @var{base-buffer}. The argument @var{base-buffer} may +be a live buffer or the name (a string) of an existing buffer. If +@var{name} is the name of an existing buffer, an error is signaled. + +If @var{clone} is non-@code{nil}, then the indirect buffer originally +shares the ``state'' of @var{base-buffer} such as major mode, minor +modes, buffer local variables and so on. If @var{clone} is omitted +or @code{nil} the indirect buffer's state is set to the default state +for new buffers. + +If @var{base-buffer} is an indirect buffer, its base buffer is used as +the base for the new buffer. If, in addition, @var{clone} is +non-@code{nil}, the initial state is copied from the actual base +buffer, not from @var{base-buffer}. +@end deffn + +@defun clone-indirect-buffer newname display-flag &optional norecord +This function creates and returns a new indirect buffer that shares +the current buffer's base buffer and copies the rest of the current +buffer's attributes. (If the current buffer is not indirect, it is +used as the base buffer.) + +If @var{display-flag} is non-@code{nil}, that means to display the new +buffer by calling @code{pop-to-buffer}. If @var{norecord} is +non-@code{nil}, that means not to put the new buffer to the front of +the buffer list. +@end defun + +@defun buffer-base-buffer &optional buffer +This function returns the base buffer of @var{buffer}, which defaults +to the current buffer. If @var{buffer} is not indirect, the value is +@code{nil}. Otherwise, the value is another buffer, which is never an +indirect buffer. +@end defun + +@node Buffer Gap +@section The Buffer Gap + + Emacs buffers are implemented using an invisible @dfn{gap} to make +insertion and deletion faster. Insertion works by filling in part of +the gap, and deletion adds to the gap. Of course, this means that the +gap must first be moved to the locus of the insertion or deletion. +Emacs moves the gap only when you try to insert or delete. This is why +your first editing command in one part of a large buffer, after +previously editing in another far-away part, sometimes involves a +noticeable delay. + + This mechanism works invisibly, and Lisp code should never be affected +by the gap's current location, but these functions are available for +getting information about the gap status. + +@defun gap-position +This function returns the current gap position in the current buffer. +@end defun + +@defun gap-size +This function returns the current gap size of the current buffer. +@end defun + +@ignore + arch-tag: 2e53cfab-5691-41f6-b5a8-9c6a3462399c +@end ignore diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi new file mode 100644 index 00000000000..fabe38f9428 --- /dev/null +++ b/doc/lispref/commands.texi @@ -0,0 +1,3290 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, 2002, +@c 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/commands +@node Command Loop, Keymaps, Minibuffers, Top +@chapter Command Loop +@cindex editor command loop +@cindex command loop + + When you run Emacs, it enters the @dfn{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. + +@menu +* Command Overview:: How the command loop reads commands. +* Defining Commands:: Specifying how a function should read arguments. +* Interactive Call:: Calling a command, so that it will read arguments. +* Command Loop Info:: Variables set by the command loop for you to examine. +* Adjusting Point:: Adjustment of point after a command. +* Input Events:: What input looks like when you read it. +* Reading Input:: How to read input events from the keyboard or mouse. +* Special Events:: Events processed immediately and individually. +* Waiting:: Waiting for user input or elapsed time. +* Quitting:: How @kbd{C-g} works. How to catch or defer quitting. +* Prefix Command Arguments:: How the commands to set prefix args work. +* Recursive Editing:: Entering a recursive edit, + and why you usually shouldn't. +* Disabling Commands:: How the command loop handles disabled commands. +* Command History:: How the command history is set up, and how accessed. +* Keyboard Macros:: How keyboard macros are implemented. +@end menu + +@node Command Overview +@section Command Loop Overview + + The first thing the command loop must do is read a key sequence, which +is a sequence of events that translates into a command. It does this by +calling the function @code{read-key-sequence}. Your Lisp code can also +call this function (@pxref{Key Sequence Input}). Lisp programs can also +do input at a lower level with @code{read-event} (@pxref{Reading One +Event}) or discard pending input with @code{discard-input} +(@pxref{Event Input Misc}). + + The key sequence is translated into a command through the currently +active keymaps. @xref{Key Lookup}, for information on how this is done. +The result should be a keyboard macro or an interactively callable +function. If the key is @kbd{M-x}, then it reads the name of another +command, which it then calls. This is done by the command +@code{execute-extended-command} (@pxref{Interactive Call}). + + To execute a command requires first reading the arguments for it. +This is done by calling @code{command-execute} (@pxref{Interactive +Call}). For commands written in Lisp, the @code{interactive} +specification says how to read the arguments. This may use the prefix +argument (@pxref{Prefix Command Arguments}) or may read with prompting +in the minibuffer (@pxref{Minibuffers}). For example, the command +@code{find-file} has an @code{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 or vector (i.e., a keyboard macro) then +@code{execute-kbd-macro} is used to execute it. You can call this +function yourself (@pxref{Keyboard Macros}). + + To terminate the execution of a running command, type @kbd{C-g}. This +character causes @dfn{quitting} (@pxref{Quitting}). + +@defvar pre-command-hook +The editor command loop runs this normal hook before each command. At +that time, @code{this-command} contains the command that is about to +run, and @code{last-command} describes the previous command. +@xref{Command Loop Info}. +@end defvar + +@defvar post-command-hook +The editor command loop runs this normal hook after each command +(including commands terminated prematurely by quitting or by errors), +and also when the command loop is first entered. At that time, +@code{this-command} refers to the command that just ran, and +@code{last-command} refers to the command before that. +@end defvar + + Quitting is suppressed while running @code{pre-command-hook} and +@code{post-command-hook}. If an error happens while executing one of +these hooks, it terminates execution of the hook, and clears the hook +variable to @code{nil} so as to prevent an infinite loop of errors. + + A request coming into the Emacs server (@pxref{Emacs Server,,, +emacs, The GNU Emacs Manual}) runs these two hooks just as a keyboard +command does. + +@node Defining Commands +@section Defining Commands +@cindex defining commands +@cindex commands, defining +@cindex functions, making them interactive +@cindex interactive function + + A Lisp function becomes a command when its body contains, at top +level, a form that calls the special form @code{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. + +@menu +* Using Interactive:: General rules for @code{interactive}. +* Interactive Codes:: The standard letter-codes for reading arguments + in various ways. +* Interactive Examples:: Examples of how to read interactive arguments. +@end menu + +@node Using Interactive +@subsection Using @code{interactive} +@cindex arguments, interactive entry + + This section describes how to write the @code{interactive} form that +makes a Lisp function an interactively-callable command, and how to +examine a command's @code{interactive} form. + +@defspec 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 +@kbd{M-x} or by entering a key sequence bound to it). The argument +@var{arg-descriptor} declares how to compute the arguments to the +command when the command is called interactively. + +A command may be called from Lisp programs like any other function, but +then the caller supplies the arguments and @var{arg-descriptor} has no +effect. + +The @code{interactive} form has its effect because the command loop +(actually, its subroutine @code{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 +@code{interactive} form are executed, but at this time +@code{interactive} simply returns @code{nil} without even evaluating its +argument. +@end defspec + +There are three possibilities for the argument @var{arg-descriptor}: + +@itemize @bullet +@item +It may be omitted or @code{nil}; then the command is called with no +arguments. This leads quickly to an error if the command requires one +or more arguments. + +@item +It may be a string; then its contents should consist of a code character +followed by a prompt (which some code characters use and some ignore). +The prompt ends either with the end of the string or with a newline. +Here is a simple example: + +@smallexample +(interactive "bFrobnicate buffer: ") +@end smallexample + +@noindent +The code letter @samp{b} says to read the name of an existing buffer, +with completion. The buffer name is 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. +You can specify any number of arguments in this way. + +@c Emacs 19 feature +The prompt string can use @samp{%} to include previous argument values +(starting with the first argument) in the prompt. This is done using +@code{format} (@pxref{Formatting Strings}). For example, here is how +you could read the name of an existing buffer followed by a new name to +give to that buffer: + +@smallexample +@group +(interactive "bBuffer to rename: \nsRename buffer %s to: ") +@end group +@end smallexample + +@cindex @samp{*} in @code{interactive} +@cindex read-only buffers in interactive +If the first character in the string is @samp{*}, then an error is +signaled if the buffer is read-only. + +@cindex @samp{@@} in @code{interactive} +@c Emacs 19 feature +If the first character in the string is @samp{@@}, and if the key +sequence used to invoke the command includes any mouse events, then +the window associated with the first of those events is selected +before the command is run. + +You can use @samp{*} and @samp{@@} together; the order does not matter. +Actual reading of arguments is controlled by the rest of the prompt +string (starting with the first character that is not @samp{*} or +@samp{@@}). + +@item +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. Usually this form will call various functions to read input +from the user, most often through the minibuffer (@pxref{Minibuffers}) +or directly from the keyboard (@pxref{Reading Input}). + +Providing point or the mark as an argument value is also common, but +if you do this @emph{and} read input (whether using the minibuffer or +not), be sure to get the integer values of point or the mark after +reading. The current buffer may be receiving subprocess output; if +subprocess output arrives while the command is waiting for input, it +could relocate point and the mark. + +Here's an example of what @emph{not} to do: + +@smallexample +(interactive + (list (region-beginning) (region-end) + (read-string "Foo: " nil 'my-history))) +@end smallexample + +@noindent +Here's how to avoid the problem, by examining point and the mark after +reading the keyboard input: + +@smallexample +(interactive + (let ((string (read-string "Foo: " nil 'my-history))) + (list (region-beginning) (region-end) string))) +@end smallexample + +@strong{Warning:} the argument values should not include any data +types that can't be printed and then read. Some facilities save +@code{command-history} in a file to be read in the subsequent +sessions; if a command's arguments contain a data type that prints +using @samp{#<@dots{}>} syntax, those facilities won't work. + +There are, however, a few exceptions: it is ok to use a limited set of +expressions such as @code{(point)}, @code{(mark)}, +@code{(region-beginning)}, and @code{(region-end)}, because Emacs +recognizes them specially and puts the expression (rather than its +value) into the command history. To see whether the expression you +wrote is one of these exceptions, run the command, then examine +@code{(car command-history)}. +@end itemize + +@cindex examining the @code{interactive} form +@defun interactive-form function +This function returns the @code{interactive} form of @var{function}. +If @var{function} is an interactively callable function +(@pxref{Interactive Call}), the value is the command's +@code{interactive} form @code{(interactive @var{spec})}, which +specifies how to compute its arguments. Otherwise, the value is +@code{nil}. If @var{function} is a symbol, its function definition is +used. +@end defun + +@node Interactive Codes +@comment node-name, next, previous, up +@subsection Code Characters for @code{interactive} +@cindex interactive code description +@cindex description for interactive codes +@cindex codes, interactive, description of +@cindex characters for interactive codes + + The code character descriptions below contain a number of key words, +defined here as follows: + +@table @b +@item Completion +@cindex interactive completion +Provide completion. @key{TAB}, @key{SPC}, and @key{RET} perform name +completion because the argument is read using @code{completing-read} +(@pxref{Completion}). @kbd{?} displays a list of possible completions. + +@item 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. + +@item Default +@cindex default argument string +A default value of some sort is used if the user enters no text in the +minibuffer. The default depends on the code character. + +@item 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. + +Even though the code letter doesn't use a prompt string, you must follow +it with a newline if it is not the last code character in the string. + +@item Prompt +A prompt immediately follows the code character. The prompt ends either +with the end of the string or with a newline. + +@item Special +This code character is meaningful only at the beginning of the +interactive string, and it does not look for a prompt or a newline. +It is a single, isolated character. +@end table + +@cindex reading interactive arguments + Here are the code character descriptions for use with @code{interactive}: + +@table @samp +@item * +Signal an error if the current buffer is read-only. Special. + +@item @@ +Select the window mentioned in the first mouse event in the key +sequence that invoked this command. Special. + +@item a +A function name (i.e., a symbol satisfying @code{fboundp}). Existing, +Completion, Prompt. + +@item b +The name of an existing buffer. By default, uses the name of the +current buffer (@pxref{Buffers}). Existing, Completion, Default, +Prompt. + +@item 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, +Default, Prompt. + +@item c +A character. The cursor does not move into the echo area. Prompt. + +@item C +A command name (i.e., a symbol satisfying @code{commandp}). Existing, +Completion, Prompt. + +@item d +@cindex position argument +The position of point, as an integer (@pxref{Point}). No I/O. + +@item D +A directory name. The default is the current default directory of the +current buffer, @code{default-directory} (@pxref{File Name Expansion}). +Existing, Completion, Default, Prompt. + +@item e +The first or next mouse event in the key sequence that invoked the command. +More precisely, @samp{e} gets events that are lists, so you can look at +the data in the lists. @xref{Input Events}. No I/O. + +You can use @samp{e} more than once in a single command's interactive +specification. If the key sequence that invoked the command has +@var{n} events that are lists, the @var{n}th @samp{e} provides the +@var{n}th such event. Events that are not lists, such as function keys +and @acronym{ASCII} characters, do not count where @samp{e} is concerned. + +@item f +A file name of an existing file (@pxref{File Names}). The default +directory is @code{default-directory}. Existing, Completion, Default, +Prompt. + +@item F +A file name. The file need not exist. Completion, Default, Prompt. + +@item G +A file name. The file need not exist. If the user enters just a +directory name, then the value is just that directory name, with no +file name within the directory added. Completion, Default, Prompt. + +@item i +An irrelevant argument. This code always supplies @code{nil} as +the argument's value. No I/O. + +@item k +A key sequence (@pxref{Key Sequences}). This keeps reading events +until a command (or undefined command) is found in the current key +maps. The key sequence argument is represented as a string or vector. +The cursor does not move into the echo area. Prompt. + +If @samp{k} reads a key sequence that ends with a down-event, it also +reads and discards the following up-event. You can get access to that +up-event with the @samp{U} code character. + +This kind of input is used by commands such as @code{describe-key} and +@code{global-set-key}. + +@item K +A key sequence, whose definition you intend to change. This works like +@samp{k}, except that it suppresses, for the last input event in the key +sequence, the conversions that are normally used (when necessary) to +convert an undefined key into a defined one. + +@item m +@cindex marker argument +The position of the mark, as an integer. No I/O. + +@item M +Arbitrary text, read in the minibuffer using the current buffer's input +method, and returned as a string (@pxref{Input Methods,,, emacs, The GNU +Emacs Manual}). Prompt. + +@item n +A number, read with the minibuffer. If the input is not a number, the +user has to try again. @samp{n} never uses the prefix argument. +Prompt. + +@item N +The numeric prefix argument; but if there is no prefix argument, read +a number as with @kbd{n}. The value is always a number. @xref{Prefix +Command Arguments}. Prompt. + +@item p +@cindex numeric prefix argument usage +The numeric prefix argument. (Note that this @samp{p} is lower case.) +No I/O. + +@item P +@cindex raw prefix argument usage +The raw prefix argument. (Note that this @samp{P} is upper case.) No +I/O. + +@item r +@cindex region argument +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. + +@item s +Arbitrary text, read in the minibuffer and returned as a string +(@pxref{Text from Minibuffer}). Terminate the input with either +@kbd{C-j} or @key{RET}. (@kbd{C-q} may be used to include either of +these characters in the input.) Prompt. + +@item S +An interned symbol whose name is read in the minibuffer. Any whitespace +character terminates the input. (Use @kbd{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. + +@item U +A key sequence or @code{nil}. Can be used after a @samp{k} or +@samp{K} argument to get the up-event that was discarded (if any) +after @samp{k} or @samp{K} read a down-event. If no up-event has been +discarded, @samp{U} provides @code{nil} as the argument. No I/O. + +@item v +A variable declared to be a user option (i.e., satisfying the +predicate @code{user-variable-p}). This reads the variable using +@code{read-variable}. @xref{Definition of read-variable}. Existing, +Completion, Prompt. + +@item x +A Lisp object, specified with its read syntax, terminated with a +@kbd{C-j} or @key{RET}. The object is not evaluated. @xref{Object from +Minibuffer}. Prompt. + +@item X +@cindex evaluated expression argument +A Lisp form's value. @samp{X} reads as @samp{x} does, then evaluates +the form so that its value becomes the argument for the command. +Prompt. + +@item z +A coding system name (a symbol). If the user enters null input, the +argument value is @code{nil}. @xref{Coding Systems}. Completion, +Existing, Prompt. + +@item Z +A coding system name (a symbol)---but only if this command has a prefix +argument. With no prefix argument, @samp{Z} provides @code{nil} as the +argument value. Completion, Existing, Prompt. +@end table + +@node Interactive Examples +@comment node-name, next, previous, up +@subsection Examples of Using @code{interactive} +@cindex examples of using @code{interactive} +@cindex @code{interactive}, examples of using + + Here are some examples of @code{interactive}: + +@example +@group +(defun foo1 () ; @r{@code{foo1} takes no arguments,} + (interactive) ; @r{just moves forward two words.} + (forward-word 2)) + @result{} foo1 +@end group + +@group +(defun foo2 (n) ; @r{@code{foo2} takes one argument,} + (interactive "p") ; @r{which is the numeric prefix.} + (forward-word (* 2 n))) + @result{} foo2 +@end group + +@group +(defun foo3 (n) ; @r{@code{foo3} takes one argument,} + (interactive "nCount:") ; @r{which is read with the Minibuffer.} + (forward-word (* 2 n))) + @result{} foo3 +@end group + +@group +(defun three-b (b1 b2 b3) + "Select three existing buffers. +Put them into three windows, selecting the last one." +@end group + (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)) + @result{} three-b +@group +(three-b "*scratch*" "declarations.texi" "*mail*") + @result{} nil +@end group +@end example + +@node Interactive Call +@section Interactive Call +@cindex interactive call + + After the command loop has translated a key sequence into a command it +invokes that command using the function @code{command-execute}. If the +command is a function, @code{command-execute} calls +@code{call-interactively}, which reads the arguments and calls the +command. You can also call these functions yourself. + +@defun commandp object &optional for-call-interactively +Returns @code{t} if @var{object} is suitable for calling interactively; +that is, if @var{object} is a command. Otherwise, returns @code{nil}. + +The interactively callable objects include strings and vectors (treated +as keyboard macros), lambda expressions that contain a top-level call to +@code{interactive}, byte-code function objects made from such lambda +expressions, autoload objects that are declared as interactive +(non-@code{nil} fourth argument to @code{autoload}), and some of the +primitive functions. + +A symbol satisfies @code{commandp} if its function definition +satisfies @code{commandp}. Keys and keymaps are not commands. +Rather, they are used to look up commands (@pxref{Keymaps}). + +If @var{for-call-interactively} is non-@code{nil}, then +@code{commandp} returns @code{t} only for objects that +@code{call-interactively} could call---thus, not for keyboard macros. + +See @code{documentation} in @ref{Accessing Documentation}, for a +realistic example of using @code{commandp}. +@end defun + +@defun call-interactively command &optional record-flag keys +This function calls the interactively callable function @var{command}, +reading arguments according to its interactive calling specifications. +It returns whatever @var{command} returns. An error is signaled if +@var{command} is not a function or if it cannot be called +interactively (i.e., is not a command). Note that keyboard macros +(strings and vectors) are not accepted, even though they are +considered commands, because they are not functions. If @var{command} +is a symbol, then @code{call-interactively} uses its function definition. + +@cindex record command history +If @var{record-flag} is non-@code{nil}, then this command and its +arguments are unconditionally added to the list @code{command-history}. +Otherwise, the command is added only if it uses the minibuffer to read +an argument. @xref{Command History}. + +The argument @var{keys}, if given, should be a vector which specifies +the sequence of events to supply if the command inquires which events +were used to invoke it. If @var{keys} is omitted or @code{nil}, the +default is the return value of @code{this-command-keys-vector}. +@xref{Definition of this-command-keys-vector}. +@end defun + +@defun command-execute command &optional record-flag keys special +@cindex keyboard macro execution +This function executes @var{command}. The argument @var{command} must +satisfy the @code{commandp} predicate; i.e., it must be an interactively +callable function or a keyboard macro. + +A string or vector as @var{command} is executed with +@code{execute-kbd-macro}. A function is passed to +@code{call-interactively}, along with the optional @var{record-flag} +and @var{keys}. + +A symbol is handled by using its function definition in its place. A +symbol with an @code{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. + +The argument @var{special}, if given, means to ignore the prefix +argument and not clear it. This is used for executing special events +(@pxref{Special Events}). +@end defun + +@deffn Command execute-extended-command prefix-argument +@cindex read command name +This function reads a command name from the minibuffer using +@code{completing-read} (@pxref{Completion}). Then it uses +@code{command-execute} to call the specified command. Whatever that +command returns becomes the value of @code{execute-extended-command}. + +@cindex execute with prefix argument +If the command asks for a prefix argument, it receives the value +@var{prefix-argument}. If @code{execute-extended-command} is called +interactively, the current raw prefix argument is used for +@var{prefix-argument}, and thus passed on to whatever command is run. + +@c !!! Should this be @kindex? +@cindex @kbd{M-x} +@code{execute-extended-command} is the normal definition of @kbd{M-x}, +so it uses the string @w{@samp{M-x }} as a prompt. (It would be better +to take the prompt from the events used to invoke +@code{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. + +@example +@group +(execute-extended-command 3) +---------- Buffer: Minibuffer ---------- +3 M-x forward-word RET +---------- Buffer: Minibuffer ---------- + @result{} t +@end group +@end example +@end deffn + +@defun interactive-p +This function returns @code{t} if the containing function (the one +whose code includes the call to @code{interactive-p}) was called in +direct response to user input. This means that it was called with the +function @code{call-interactively}, and that a keyboard macro is +not running, and that Emacs is not running in batch mode. + +If the containing function was called by Lisp evaluation (or with +@code{apply} or @code{funcall}), then it was not called interactively. +@end defun + + The most common use of @code{interactive-p} is for deciding whether +to give the user additional visual feedback (such as by printing an +informative message). For example: + +@example +@group +;; @r{Here's the usual way to use @code{interactive-p}.} +(defun foo () + (interactive) + (when (interactive-p) + (message "foo"))) + @result{} foo +@end group + +@group +;; @r{This function is just to illustrate the behavior.} +(defun bar () + (interactive) + (setq foobar (list (foo) (interactive-p)))) + @result{} bar +@end group + +@group +;; @r{Type @kbd{M-x foo}.} + @print{} foo +@end group + +@group +;; @r{Type @kbd{M-x bar}.} +;; @r{This does not display a message.} +@end group + +@group +foobar + @result{} (nil t) +@end group +@end example + + If you want to test @emph{only} whether the function was called +using @code{call-interactively}, add an optional argument +@code{print-message} which should be non-@code{nil} in an interactive +call, and use the @code{interactive} spec to make sure it is +non-@code{nil}. Here's an example: + +@example +(defun foo (&optional print-message) + (interactive "p") + (when print-message + (message "foo"))) +@end example + +@noindent +Defined in this way, the function does display the message when called +from a keyboard macro. We use @code{"p"} because the numeric prefix +argument is never @code{nil}. + +@defun called-interactively-p +This function returns @code{t} when the calling function was called +using @code{call-interactively}. + +When possible, instead of using this function, you should use the +method in the example above; that method makes it possible for a +caller to ``pretend'' that the function was called interactively. +@end defun + +@node Command Loop Info +@comment node-name, next, previous, up +@section 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. + +@defvar 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 copied from @code{this-command} when a command returns to +the command loop, except when the command has specified a prefix +argument for the following command. + +This variable is always local to the current terminal and cannot be +buffer-local. @xref{Multiple Displays}. +@end defvar + +@defvar real-last-command +This variable is set up by Emacs just like @code{last-command}, +but never altered by Lisp programs. +@end defvar + +@defvar this-command +@cindex current command +This variable records the name of the command now being executed by +the editor command loop. Like @code{last-command}, it is normally a symbol +with a function definition. + +The command loop sets this variable just before running a command, and +copies its value into @code{last-command} when the command finishes +(unless the command specified a prefix argument for the following +command). + +@cindex kill command repetition +Some commands set this variable during their execution, as a flag for +whatever command runs next. In particular, the functions for killing text +set @code{this-command} to @code{kill-region} so that any kill commands +immediately following will know to append the killed text to the +previous kill. +@end defvar + +If you do not want a particular command to be recognized as the previous +command in the case where it got an error, you must code that command to +prevent this. One way is to set @code{this-command} to @code{t} at the +beginning of the command, and set @code{this-command} back to its proper +value at the end, like this: + +@example +(defun foo (args@dots{}) + (interactive @dots{}) + (let ((old-this-command this-command)) + (setq this-command t) + @r{@dots{}do the work@dots{}} + (setq this-command old-this-command))) +@end example + +@noindent +We do not bind @code{this-command} with @code{let} because that would +restore the old value in case of error---a feature of @code{let} which +in this case does precisely what we want to avoid. + +@defvar this-original-command +This has the same value as @code{this-command} except when command +remapping occurs (@pxref{Remapping Commands}). In that case, +@code{this-command} gives the command actually run (the result of +remapping), and @code{this-original-command} gives the command that +was specified to run but remapped into another command. +@end defvar + +@defun this-command-keys +This function returns a string or vector containing the key sequence +that invoked the present command, plus any previous commands that +generated the prefix argument for this command. Any events read by the +command using @code{read-event} without a timeout get tacked on to the end. + +However, if the command has called @code{read-key-sequence}, it +returns the last read key sequence. @xref{Key Sequence Input}. The +value is a string if all events in the sequence were characters that +fit in a string. @xref{Input Events}. + +@example +@group +(this-command-keys) +;; @r{Now use @kbd{C-u C-x C-e} to evaluate that.} + @result{} "^U^X^E" +@end group +@end example +@end defun + +@defun this-command-keys-vector +@anchor{Definition of this-command-keys-vector} +Like @code{this-command-keys}, except that it always returns the events +in a vector, so you don't need to deal with the complexities of storing +input events in a string (@pxref{Strings of Events}). +@end defun + +@defun clear-this-command-keys &optional keep-record +This function empties out the table of events for +@code{this-command-keys} to return. Unless @var{keep-record} is +non-@code{nil}, it also empties the records that the function +@code{recent-keys} (@pxref{Recording Input}) will subsequently return. +This is useful after reading a password, to prevent the password from +echoing inadvertently as part of the next command in certain cases. +@end defun + +@defvar last-nonmenu-event +This variable holds the last input event read as part of a key sequence, +not counting events resulting from mouse menus. + +One use of this variable is for telling @code{x-popup-menu} where to pop +up a menu. It is also used internally by @code{y-or-n-p} +(@pxref{Yes-or-No Queries}). +@end defvar + +@defvar last-command-event +@defvarx last-command-char +This variable is set to the last input event that was read by the +command loop as part of a command. The principal use of this variable +is in @code{self-insert-command}, which uses it to decide which +character to insert. + +@example +@group +last-command-event +;; @r{Now use @kbd{C-u C-x C-e} to evaluate that.} + @result{} 5 +@end group +@end example + +@noindent +The value is 5 because that is the @acronym{ASCII} code for @kbd{C-e}. + +The alias @code{last-command-char} exists for compatibility with +Emacs version 18. +@end defvar + +@c Emacs 19 feature +@defvar last-event-frame +This variable records which frame the last input event was directed to. +Usually this is the frame that was selected when the event was +generated, but if that frame has redirected input focus to another +frame, the value is the frame to which the event was redirected. +@xref{Input Focus}. + +If the last event came from a keyboard macro, the value is @code{macro}. +@end defvar + +@node Adjusting Point +@section Adjusting Point After Commands +@cindex adjusting point +@cindex invisible/intangible text, and point +@cindex @code{display} property, and point display +@cindex @code{composition} property, and point display + + It is not easy to display a value of point in the middle of a +sequence of text that has the @code{display}, @code{composition} or +@code{intangible} property, or is invisible. Therefore, after a +command finishes and returns to the command loop, if point is within +such a sequence, the command loop normally moves point to the edge of +the sequence. + + A command can inhibit this feature by setting the variable +@code{disable-point-adjustment}: + +@defvar disable-point-adjustment +If this variable is non-@code{nil} when a command returns to the +command loop, then the command loop does not check for those text +properties, and does not move point out of sequences that have them. + +The command loop sets this variable to @code{nil} before each command, +so if a command sets it, the effect applies only to that command. +@end defvar + +@defvar global-disable-point-adjustment +If you set this variable to a non-@code{nil} value, the feature of +moving point out of these sequences is completely turned off. +@end defvar + +@node Input Events +@section Input Events +@cindex events +@cindex input events + +The Emacs command loop reads a sequence of @dfn{input events} that +represent keyboard or mouse activity. The events for keyboard activity +are characters or symbols; mouse events are always lists. This section +describes the representation and meaning of input events in detail. + +@defun eventp object +This function returns non-@code{nil} if @var{object} is an input event +or event type. + +Note that any symbol might be used as an event or an event type. +@code{eventp} cannot distinguish whether a symbol is intended by Lisp +code to be used as an event. Instead, it distinguishes whether the +symbol has actually been used in an event that has been read as input in +the current Emacs session. If a symbol has not yet been so used, +@code{eventp} returns @code{nil}. +@end defun + +@menu +* Keyboard Events:: Ordinary characters--keys with symbols on them. +* Function Keys:: Function keys--keys with names, not symbols. +* Mouse Events:: Overview of mouse events. +* Click Events:: Pushing and releasing a mouse button. +* Drag Events:: Moving the mouse before releasing the button. +* Button-Down Events:: A button was pushed and not yet released. +* Repeat Events:: Double and triple click (or drag, or down). +* Motion Events:: Just moving the mouse, not pushing a button. +* Focus Events:: Moving the mouse between frames. +* Misc Events:: Other events the system can generate. +* Event Examples:: Examples of the lists for mouse events. +* Classifying Events:: Finding the modifier keys in an event symbol. + Event types. +* Accessing Events:: Functions to extract info from events. +* Strings of Events:: Special considerations for putting + keyboard character events in a string. +@end menu + +@node Keyboard Events +@subsection Keyboard Events +@cindex keyboard events + +There are two kinds of input you can get from the keyboard: ordinary +keys, and function keys. Ordinary keys correspond to characters; the +events they generate are represented in Lisp as characters. The event +type of a character event is the character itself (an integer); see +@ref{Classifying Events}. + +@cindex modifier bits (of input character) +@cindex basic code (of input character) +An input character event consists of a @dfn{basic code} between 0 and +524287, plus any or all of these @dfn{modifier bits}: + +@table @asis +@item meta +The +@tex +@math{2^{27}} +@end tex +@ifnottex +2**27 +@end ifnottex +bit in the character code indicates a character +typed with the meta key held down. + +@item control +The +@tex +@math{2^{26}} +@end tex +@ifnottex +2**26 +@end ifnottex +bit in the character code indicates a non-@acronym{ASCII} +control character. + +@sc{ascii} control characters such as @kbd{C-a} have special basic +codes of their own, so Emacs needs no special bit to indicate them. +Thus, the code for @kbd{C-a} is just 1. + +But if you type a control combination not in @acronym{ASCII}, such as +@kbd{%} with the control key, the numeric value you get is the code +for @kbd{%} plus +@tex +@math{2^{26}} +@end tex +@ifnottex +2**26 +@end ifnottex +(assuming the terminal supports non-@acronym{ASCII} +control characters). + +@item shift +The +@tex +@math{2^{25}} +@end tex +@ifnottex +2**25 +@end ifnottex +bit in the character code indicates an @acronym{ASCII} control +character typed with the shift key held down. + +For letters, the basic code itself indicates upper versus lower case; +for digits and punctuation, the shift key selects an entirely different +character with a different basic code. In order to keep within the +@acronym{ASCII} character set whenever possible, Emacs avoids using the +@tex +@math{2^{25}} +@end tex +@ifnottex +2**25 +@end ifnottex +bit for those characters. + +However, @acronym{ASCII} provides no way to distinguish @kbd{C-A} from +@kbd{C-a}, so Emacs uses the +@tex +@math{2^{25}} +@end tex +@ifnottex +2**25 +@end ifnottex +bit in @kbd{C-A} and not in +@kbd{C-a}. + +@item hyper +The +@tex +@math{2^{24}} +@end tex +@ifnottex +2**24 +@end ifnottex +bit in the character code indicates a character +typed with the hyper key held down. + +@item super +The +@tex +@math{2^{23}} +@end tex +@ifnottex +2**23 +@end ifnottex +bit in the character code indicates a character +typed with the super key held down. + +@item alt +The +@tex +@math{2^{22}} +@end tex +@ifnottex +2**22 +@end ifnottex +bit in the character code indicates a character typed with +the alt key held down. (On some terminals, the key labeled @key{ALT} +is actually the meta key.) +@end table + + It is best to avoid mentioning specific bit numbers in your program. +To test the modifier bits of a character, use the function +@code{event-modifiers} (@pxref{Classifying Events}). When making key +bindings, you can use the read syntax for characters with modifier bits +(@samp{\C-}, @samp{\M-}, and so on). For making key bindings with +@code{define-key}, you can use lists such as @code{(control hyper ?x)} to +specify the characters (@pxref{Changing Key Bindings}). The function +@code{event-convert-list} converts such a list into an event type +(@pxref{Classifying Events}). + +@node Function Keys +@subsection Function Keys + +@cindex function keys +Most keyboards also have @dfn{function keys}---keys that have names or +symbols that are not characters. Function keys are represented in Emacs +Lisp as symbols; the symbol's name is the function key's label, in lower +case. For example, pressing a key labeled @key{F1} places the symbol +@code{f1} in the input stream. + +The event type of a function key event is the event symbol itself. +@xref{Classifying Events}. + +Here are a few special cases in the symbol-naming convention for +function keys: + +@table @asis +@item @code{backspace}, @code{tab}, @code{newline}, @code{return}, @code{delete} +These keys correspond to common @acronym{ASCII} control characters that have +special keys on most keyboards. + +In @acronym{ASCII}, @kbd{C-i} and @key{TAB} are the same character. If the +terminal can distinguish between them, Emacs conveys the distinction to +Lisp programs by representing the former as the integer 9, and the +latter as the symbol @code{tab}. + +Most of the time, it's not useful to distinguish the two. So normally +@code{function-key-map} (@pxref{Translation Keymaps}) is set up to map +@code{tab} into 9. Thus, a key binding for character code 9 (the +character @kbd{C-i}) also applies to @code{tab}. Likewise for the other +symbols in this group. The function @code{read-char} likewise converts +these events into characters. + +In @acronym{ASCII}, @key{BS} is really @kbd{C-h}. But @code{backspace} +converts into the character code 127 (@key{DEL}), not into code 8 +(@key{BS}). This is what most users prefer. + +@item @code{left}, @code{up}, @code{right}, @code{down} +Cursor arrow keys +@item @code{kp-add}, @code{kp-decimal}, @code{kp-divide}, @dots{} +Keypad keys (to the right of the regular keyboard). +@item @code{kp-0}, @code{kp-1}, @dots{} +Keypad keys with digits. +@item @code{kp-f1}, @code{kp-f2}, @code{kp-f3}, @code{kp-f4} +Keypad PF keys. +@item @code{kp-home}, @code{kp-left}, @code{kp-up}, @code{kp-right}, @code{kp-down} +Keypad arrow keys. Emacs normally translates these into the +corresponding non-keypad keys @code{home}, @code{left}, @dots{} +@item @code{kp-prior}, @code{kp-next}, @code{kp-end}, @code{kp-begin}, @code{kp-insert}, @code{kp-delete} +Additional keypad duplicates of keys ordinarily found elsewhere. Emacs +normally translates these into the like-named non-keypad keys. +@end table + +You can use the modifier keys @key{ALT}, @key{CTRL}, @key{HYPER}, +@key{META}, @key{SHIFT}, and @key{SUPER} with function keys. The way to +represent them is with prefixes in the symbol name: + +@table @samp +@item A- +The alt modifier. +@item C- +The control modifier. +@item H- +The hyper modifier. +@item M- +The meta modifier. +@item S- +The shift modifier. +@item s- +The super modifier. +@end table + +Thus, the symbol for the key @key{F3} with @key{META} held down is +@code{M-f3}. When you use more than one prefix, we recommend you +write them in alphabetical order; but the order does not matter in +arguments to the key-binding lookup and modification functions. + +@node Mouse Events +@subsection Mouse Events + +Emacs supports four kinds of mouse events: click events, drag events, +button-down events, and motion events. All mouse events are represented +as lists. The @sc{car} of the list is the event type; this says which +mouse button was involved, and which modifier keys were used with it. +The event type can also distinguish double or triple button presses +(@pxref{Repeat Events}). The rest of the list elements give position +and time information. + +For key lookup, only the event type matters: two events of the same type +necessarily run the same command. The command can access the full +values of these events using the @samp{e} interactive code. +@xref{Interactive Codes}. + +A key sequence that starts with a mouse event is read using the keymaps +of the buffer in the window that the mouse was in, not the current +buffer. This does not imply that clicking in a window selects that +window or its buffer---that is entirely under the control of the command +binding of the key sequence. + +@node Click Events +@subsection Click Events +@cindex click event +@cindex mouse click event + +When the user presses a mouse button and releases it at the same +location, that generates a @dfn{click} event. All mouse click event +share the same format: + +@example +(@var{event-type} @var{position} @var{click-count}) +@end example + +@table @asis +@item @var{event-type} +This is a symbol that indicates which mouse button was used. It is +one of the symbols @code{mouse-1}, @code{mouse-2}, @dots{}, where the +buttons are numbered left to right. + +You can also use prefixes @samp{A-}, @samp{C-}, @samp{H-}, @samp{M-}, +@samp{S-} and @samp{s-} for modifiers alt, control, hyper, meta, shift +and super, just as you would with function keys. + +This symbol also serves as the event type of the event. Key bindings +describe events by their types; thus, if there is a key binding for +@code{mouse-1}, that binding would apply to all events whose +@var{event-type} is @code{mouse-1}. + +@item @var{position} +This is the position where the mouse click occurred. The actual +format of @var{position} depends on what part of a window was clicked +on. + +For mouse click events in the text area, mode line, header line, or in +the marginal areas, @var{position} has this form: + +@example +(@var{window} @var{pos-or-area} (@var{x} . @var{y}) @var{timestamp} + @var{object} @var{text-pos} (@var{col} . @var{row}) + @var{image} (@var{dx} . @var{dy}) (@var{width} . @var{height})) +@end example + +@table @asis +@item @var{window} +This is the window in which the click occurred. + +@item @var{pos-or-area} +This is the buffer position of the character clicked on in the text +area, or if clicked outside the text area, it is the window area in +which the click occurred. It is one of the symbols @code{mode-line}, +@code{header-line}, @code{vertical-line}, @code{left-margin}, +@code{right-margin}, @code{left-fringe}, or @code{right-fringe}. + +In one special case, @var{pos-or-area} is a list containing a symbol (one +of the symbols listed above) instead of just the symbol. This happens +after the imaginary prefix keys for the event are inserted into the +input stream. @xref{Key Sequence Input}. + + +@item @var{x}, @var{y} +These are the pixel coordinates of the click, relative to +the top left corner of @var{window}, which is @code{(0 . 0)}. +For the mode or header line, @var{y} does not have meaningful data. +For the vertical line, @var{x} does not have meaningful data. + +@item @var{timestamp} +This is the time at which the event occurred, in milliseconds. + +@item @var{object} +This is the object on which the click occurred. It is either +@code{nil} if there is no string property, or it has the form +(@var{string} . @var{string-pos}) when there is a string-type text +property at the click position. + +@table @asis +@item @var{string} +This is the string on which the click occurred, including any +properties. + +@item @var{string-pos} +This is the position in the string on which the click occurred, +relevant if properties at the click need to be looked up. +@end table + +@item @var{text-pos} +For clicks on a marginal area or on a fringe, this is the buffer +position of the first visible character in the corresponding line in +the window. For other events, it is the current buffer position in +the window. + +@item @var{col}, @var{row} +These are the actual coordinates of the glyph under the @var{x}, +@var{y} position, possibly padded with default character width +glyphs if @var{x} is beyond the last glyph on the line. + +@item @var{image} +This is the image object on which the click occurred. It is either +@code{nil} if there is no image at the position clicked on, or it is +an image object as returned by @code{find-image} if click was in an image. + +@item @var{dx}, @var{dy} +These are the pixel coordinates of the click, relative to +the top left corner of @var{object}, which is @code{(0 . 0)}. If +@var{object} is @code{nil}, the coordinates are relative to the top +left corner of the character glyph clicked on. + +@item @var{width}, @var{height} +These are the pixel width and height of @var{object} or, if this is +@code{nil}, those of the character glyph clicked on. +@end table + +@sp 1 +For mouse clicks on a scroll-bar, @var{position} has this form: + +@example +(@var{window} @var{area} (@var{portion} . @var{whole}) @var{timestamp} @var{part}) +@end example + +@table @asis +@item @var{window} +This is the window whose scroll-bar was clicked on. + +@item @var{area} +This is the scroll bar where the click occurred. It is one of the +symbols @code{vertical-scroll-bar} or @code{horizontal-scroll-bar}. + +@item @var{portion} +This is the distance of the click from the top or left end of +the scroll bar. + +@item @var{whole} +This is the length of the entire scroll bar. + +@item @var{timestamp} +This is the time at which the event occurred, in milliseconds. + +@item @var{part} +This is the part of the scroll-bar which was clicked on. It is one +of the symbols @code{above-handle}, @code{handle}, @code{below-handle}, +@code{up}, @code{down}, @code{top}, @code{bottom}, and @code{end-scroll}. +@end table + +@item @var{click-count} +This is the number of rapid repeated presses so far of the same mouse +button. @xref{Repeat Events}. +@end table + +@node Drag Events +@subsection Drag Events +@cindex drag event +@cindex mouse drag event + +With Emacs, you can have a drag event without even changing your +clothes. A @dfn{drag event} happens every time the user presses a mouse +button and then moves the mouse to a different character position before +releasing the button. Like all mouse events, drag events are +represented in Lisp as lists. The lists record both the starting mouse +position and the final position, like this: + +@example +(@var{event-type} + (@var{window1} START-POSITION) + (@var{window2} END-POSITION)) +@end example + +For a drag event, the name of the symbol @var{event-type} contains the +prefix @samp{drag-}. For example, dragging the mouse with button 2 +held down generates a @code{drag-mouse-2} event. The second and third +elements of the event give the starting and ending position of the +drag. They have the same form as @var{position} in a click event +(@pxref{Click Events}) that is not on the scroll bar part of the +window. You can access the second element of any mouse event in the +same way, with no need to distinguish drag events from others. + +The @samp{drag-} prefix follows the modifier key prefixes such as +@samp{C-} and @samp{M-}. + +If @code{read-key-sequence} receives a drag event that has no key +binding, and the corresponding click event does have a binding, it +changes the drag event into a click event at the drag's starting +position. This means that you don't have to distinguish between click +and drag events unless you want to. + +@node Button-Down Events +@subsection Button-Down Events +@cindex button-down event + +Click and drag events happen when the user releases a mouse button. +They cannot happen earlier, because there is no way to distinguish a +click from a drag until the button is released. + +If you want to take action as soon as a button is pressed, you need to +handle @dfn{button-down} events.@footnote{Button-down is the +conservative antithesis of drag.} These occur as soon as a button is +pressed. They are represented by lists that look exactly like click +events (@pxref{Click Events}), except that the @var{event-type} symbol +name contains the prefix @samp{down-}. The @samp{down-} prefix follows +modifier key prefixes such as @samp{C-} and @samp{M-}. + +The function @code{read-key-sequence} ignores any button-down events +that don't have command bindings; therefore, the Emacs command loop +ignores them too. This means that you need not worry about defining +button-down events unless you want them to do something. The usual +reason to define a button-down event is so that you can track mouse +motion (by reading motion events) until the button is released. +@xref{Motion Events}. + +@node Repeat Events +@subsection Repeat Events +@cindex repeat events +@cindex double-click events +@cindex triple-click events +@cindex mouse events, repeated + +If you press the same mouse button more than once in quick succession +without moving the mouse, Emacs generates special @dfn{repeat} mouse +events for the second and subsequent presses. + +The most common repeat events are @dfn{double-click} events. Emacs +generates a double-click event when you click a button twice; the event +happens when you release the button (as is normal for all click +events). + +The event type of a double-click event contains the prefix +@samp{double-}. Thus, a double click on the second mouse button with +@key{meta} held down comes to the Lisp program as +@code{M-double-mouse-2}. If a double-click event has no binding, the +binding of the corresponding ordinary click event is used to execute +it. Thus, you need not pay attention to the double click feature +unless you really want to. + +When the user performs a double click, Emacs generates first an ordinary +click event, and then a double-click event. Therefore, you must design +the command binding of the double click event to assume that the +single-click command has already run. It must produce the desired +results of a double click, starting from the results of a single click. + +This is convenient, if the meaning of a double click somehow ``builds +on'' the meaning of a single click---which is recommended user interface +design practice for double clicks. + +If you click a button, then press it down again and start moving the +mouse with the button held down, then you get a @dfn{double-drag} event +when you ultimately release the button. Its event type contains +@samp{double-drag} instead of just @samp{drag}. If a double-drag event +has no binding, Emacs looks for an alternate binding as if the event +were an ordinary drag. + +Before the double-click or double-drag event, Emacs generates a +@dfn{double-down} event when the user presses the button down for the +second time. Its event type contains @samp{double-down} instead of just +@samp{down}. If a double-down event has no binding, Emacs looks for an +alternate binding as if the event were an ordinary button-down event. +If it finds no binding that way either, the double-down event is +ignored. + +To summarize, when you click a button and then press it again right +away, Emacs generates a down event and a click event for the first +click, a double-down event when you press the button again, and finally +either a double-click or a double-drag event. + +If you click a button twice and then press it again, all in quick +succession, Emacs generates a @dfn{triple-down} event, followed by +either a @dfn{triple-click} or a @dfn{triple-drag}. The event types of +these events contain @samp{triple} instead of @samp{double}. If any +triple event has no binding, Emacs uses the binding that it would use +for the corresponding double event. + +If you click a button three or more times and then press it again, the +events for the presses beyond the third are all triple events. Emacs +does not have separate event types for quadruple, quintuple, etc.@: +events. However, you can look at the event list to find out precisely +how many times the button was pressed. + +@defun event-click-count event +This function returns the number of consecutive button presses that led +up to @var{event}. If @var{event} is a double-down, double-click or +double-drag event, the value is 2. If @var{event} is a triple event, +the value is 3 or greater. If @var{event} is an ordinary mouse event +(not a repeat event), the value is 1. +@end defun + +@defopt double-click-fuzz +To generate repeat events, successive mouse button presses must be at +approximately the same screen position. The value of +@code{double-click-fuzz} specifies the maximum number of pixels the +mouse may be moved (horizontally or vertically) between two successive +clicks to make a double-click. + +This variable is also the threshold for motion of the mouse to count +as a drag. +@end defopt + +@defopt double-click-time +To generate repeat events, the number of milliseconds between +successive button presses must be less than the value of +@code{double-click-time}. Setting @code{double-click-time} to +@code{nil} disables multi-click detection entirely. Setting it to +@code{t} removes the time limit; Emacs then detects multi-clicks by +position only. +@end defopt + +@node Motion Events +@subsection Motion Events +@cindex motion event +@cindex mouse motion events + +Emacs sometimes generates @dfn{mouse motion} events to describe motion +of the mouse without any button activity. Mouse motion events are +represented by lists that look like this: + +@example +(mouse-movement (POSITION)) +@end example + +The second element of the list describes the current position of the +mouse, just as in a click event (@pxref{Click Events}). + +The special form @code{track-mouse} enables generation of motion events +within its body. Outside of @code{track-mouse} forms, Emacs does not +generate events for mere motion of the mouse, and these events do not +appear. @xref{Mouse Tracking}. + +@node Focus Events +@subsection Focus Events +@cindex focus event + +Window systems provide general ways for the user to control which window +gets keyboard input. This choice of window is called the @dfn{focus}. +When the user does something to switch between Emacs frames, that +generates a @dfn{focus event}. The normal definition of a focus event, +in the global keymap, is to select a new frame within Emacs, as the user +would expect. @xref{Input Focus}. + +Focus events are represented in Lisp as lists that look like this: + +@example +(switch-frame @var{new-frame}) +@end example + +@noindent +where @var{new-frame} is the frame switched to. + +Most X window managers are set up so that just moving the mouse into a +window is enough to set the focus there. Emacs appears to do this, +because it changes the cursor to solid in the new frame. However, there +is no need for the Lisp program to know about the focus change until +some other kind of input arrives. So Emacs generates a focus event only +when the user actually types a keyboard key or presses a mouse button in +the new frame; just moving the mouse between frames does not generate a +focus event. + +A focus event in the middle of a key sequence would garble the +sequence. So Emacs never generates a focus event in the middle of a key +sequence. If the user changes focus in the middle of a key +sequence---that is, after a prefix key---then Emacs reorders the events +so that the focus event comes either before or after the multi-event key +sequence, and not within it. + +@node Misc Events +@subsection Miscellaneous System Events + +A few other event types represent occurrences within the system. + +@table @code +@cindex @code{delete-frame} event +@item (delete-frame (@var{frame})) +This kind of event indicates that the user gave the window manager +a command to delete a particular window, which happens to be an Emacs frame. + +The standard definition of the @code{delete-frame} event is to delete @var{frame}. + +@cindex @code{iconify-frame} event +@item (iconify-frame (@var{frame})) +This kind of event indicates that the user iconified @var{frame} using +the window manager. Its standard definition is @code{ignore}; since the +frame has already been iconified, Emacs has no work to do. The purpose +of this event type is so that you can keep track of such events if you +want to. + +@cindex @code{make-frame-visible} event +@item (make-frame-visible (@var{frame})) +This kind of event indicates that the user deiconified @var{frame} using +the window manager. Its standard definition is @code{ignore}; since the +frame has already been made visible, Emacs has no work to do. + +@cindex @code{wheel-up} event +@cindex @code{wheel-down} event +@item (wheel-up @var{position}) +@item (wheel-down @var{position}) +These kinds of event are generated by moving a mouse wheel. Their +usual meaning is a kind of scroll or zoom. + +The element @var{position} is a list describing the position of the +event, in the same format as used in a mouse-click event. + +This kind of event is generated only on some kinds of systems. On some +systems, @code{mouse-4} and @code{mouse-5} are used instead. For +portable code, use the variables @code{mouse-wheel-up-event} and +@code{mouse-wheel-down-event} defined in @file{mwheel.el} to determine +what event types to expect for the mouse wheel. + +@cindex @code{drag-n-drop} event +@item (drag-n-drop @var{position} @var{files}) +This kind of event is generated when a group of files is +selected in an application outside of Emacs, and then dragged and +dropped onto an Emacs frame. + +The element @var{position} is a list describing the position of the +event, in the same format as used in a mouse-click event, and +@var{files} is the list of file names that were dragged and dropped. +The usual way to handle this event is by visiting these files. + +This kind of event is generated, at present, only on some kinds of +systems. + +@cindex @code{help-echo} event +@item help-echo +This kind of event is generated when a mouse pointer moves onto a +portion of buffer text which has a @code{help-echo} text property. +The generated event has this form: + +@example +(help-echo @var{frame} @var{help} @var{window} @var{object} @var{pos}) +@end example + +@noindent +The precise meaning of the event parameters and the way these +parameters are used to display the help-echo text are described in +@ref{Text help-echo}. + +@cindex @code{sigusr1} event +@cindex @code{sigusr2} event +@cindex user signals +@item sigusr1 +@itemx sigusr2 +These events are generated when the Emacs process receives +the signals @code{SIGUSR1} and @code{SIGUSR2}. They contain no +additional data because signals do not carry additional information. + +To catch a user signal, bind the corresponding event to an interactive +command in the @code{special-event-map} (@pxref{Active Keymaps}). +The command is called with no arguments, and the specific signal event is +available in @code{last-input-event}. For example: + +@smallexample +(defun sigusr-handler () + (interactive) + (message "Caught signal %S" last-input-event)) + +(define-key special-event-map [sigusr1] 'sigusr-handler) +@end smallexample + +To test the signal handler, you can make Emacs send a signal to itself: + +@smallexample +(signal-process (emacs-pid) 'sigusr1) +@end smallexample +@end table + + If one of these events arrives in the middle of a key sequence---that +is, after a prefix key---then Emacs reorders the events so that this +event comes either before or after the multi-event key sequence, not +within it. + +@node Event Examples +@subsection Event Examples + +If the user presses and releases the left mouse button over the same +location, that generates a sequence of events like this: + +@smallexample +(down-mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864320)) +(mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864180)) +@end smallexample + +While holding the control key down, the user might hold down the +second mouse button, and drag the mouse from one line to the next. +That produces two events, as shown here: + +@smallexample +(C-down-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219)) +(C-drag-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219) + (#<window 18 on NEWS> 3510 (0 . 28) -729648)) +@end smallexample + +While holding down the meta and shift keys, the user might press the +second mouse button on the window's mode line, and then drag the mouse +into another window. That produces a pair of events like these: + +@smallexample +(M-S-down-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844)) +(M-S-drag-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844) + (#<window 20 on carlton-sanskrit.tex> 161 (33 . 3) + -453816)) +@end smallexample + +To handle a SIGUSR1 signal, define an interactive function, and +bind it to the @code{signal usr1} event sequence: + +@smallexample +(defun usr1-handler () + (interactive) + (message "Got USR1 signal")) +(global-set-key [signal usr1] 'usr1-handler) +@end smallexample + +@node Classifying Events +@subsection Classifying Events +@cindex event type + + Every event has an @dfn{event type}, which classifies the event for +key binding purposes. For a keyboard event, the event type equals the +event value; thus, the event type for a character is the character, and +the event type for a function key symbol is the symbol itself. For +events that are lists, the event type is the symbol in the @sc{car} of +the list. Thus, the event type is always a symbol or a character. + + Two events of the same type are equivalent where key bindings are +concerned; thus, they always run the same command. That does not +necessarily mean they do the same things, however, as some commands look +at the whole event to decide what to do. For example, some commands use +the location of a mouse event to decide where in the buffer to act. + + Sometimes broader classifications of events are useful. For example, +you might want to ask whether an event involved the @key{META} key, +regardless of which other key or mouse button was used. + + The functions @code{event-modifiers} and @code{event-basic-type} are +provided to get such information conveniently. + +@defun event-modifiers event +This function returns a list of the modifiers that @var{event} has. The +modifiers are symbols; they include @code{shift}, @code{control}, +@code{meta}, @code{alt}, @code{hyper} and @code{super}. In addition, +the modifiers list of a mouse event symbol always contains one of +@code{click}, @code{drag}, and @code{down}. For double or triple +events, it also contains @code{double} or @code{triple}. + +The argument @var{event} may be an entire event object, or just an +event type. If @var{event} is a symbol that has never been used in an +event that has been read as input in the current Emacs session, then +@code{event-modifiers} can return @code{nil}, even when @var{event} +actually has modifiers. + +Here are some examples: + +@example +(event-modifiers ?a) + @result{} nil +(event-modifiers ?A) + @result{} (shift) +(event-modifiers ?\C-a) + @result{} (control) +(event-modifiers ?\C-%) + @result{} (control) +(event-modifiers ?\C-\S-a) + @result{} (control shift) +(event-modifiers 'f5) + @result{} nil +(event-modifiers 's-f5) + @result{} (super) +(event-modifiers 'M-S-f5) + @result{} (meta shift) +(event-modifiers 'mouse-1) + @result{} (click) +(event-modifiers 'down-mouse-1) + @result{} (down) +@end example + +The modifiers list for a click event explicitly contains @code{click}, +but the event symbol name itself does not contain @samp{click}. +@end defun + +@defun event-basic-type event +This function returns the key or mouse button that @var{event} +describes, with all modifiers removed. The @var{event} argument is as +in @code{event-modifiers}. For example: + +@example +(event-basic-type ?a) + @result{} 97 +(event-basic-type ?A) + @result{} 97 +(event-basic-type ?\C-a) + @result{} 97 +(event-basic-type ?\C-\S-a) + @result{} 97 +(event-basic-type 'f5) + @result{} f5 +(event-basic-type 's-f5) + @result{} f5 +(event-basic-type 'M-S-f5) + @result{} f5 +(event-basic-type 'down-mouse-1) + @result{} mouse-1 +@end example +@end defun + +@defun mouse-movement-p object +This function returns non-@code{nil} if @var{object} is a mouse movement +event. +@end defun + +@defun event-convert-list list +This function converts a list of modifier names and a basic event type +to an event type which specifies all of them. The basic event type +must be the last element of the list. For example, + +@example +(event-convert-list '(control ?a)) + @result{} 1 +(event-convert-list '(control meta ?a)) + @result{} -134217727 +(event-convert-list '(control super f1)) + @result{} C-s-f1 +@end example +@end defun + +@node Accessing Events +@subsection Accessing Events +@cindex mouse events, data in + + This section describes convenient functions for accessing the data in +a mouse button or motion event. + + These two functions return the starting or ending position of a +mouse-button event, as a list of this form: + +@example +(@var{window} @var{pos-or-area} (@var{x} . @var{y}) @var{timestamp} + @var{object} @var{text-pos} (@var{col} . @var{row}) + @var{image} (@var{dx} . @var{dy}) (@var{width} . @var{height})) +@end example + +@defun event-start event +This returns the starting position of @var{event}. + +If @var{event} is a click or button-down event, this returns the +location of the event. If @var{event} is a drag event, this returns the +drag's starting position. +@end defun + +@defun event-end event +This returns the ending position of @var{event}. + +If @var{event} is a drag event, this returns the position where the user +released the mouse button. If @var{event} is a click or button-down +event, the value is actually the starting position, which is the only +position such events have. +@end defun + +@cindex mouse position list, accessing + These functions take a position list as described above, and +return various parts of it. + +@defun posn-window position +Return the window that @var{position} is in. +@end defun + +@defun posn-area position +Return the window area recorded in @var{position}. It returns @code{nil} +when the event occurred in the text area of the window; otherwise, it +is a symbol identifying the area in which the event occurred. +@end defun + +@defun posn-point position +Return the buffer position in @var{position}. When the event occurred +in the text area of the window, in a marginal area, or on a fringe, +this is an integer specifying a buffer position. Otherwise, the value +is undefined. +@end defun + +@defun posn-x-y position +Return the pixel-based x and y coordinates in @var{position}, as a +cons cell @code{(@var{x} . @var{y})}. These coordinates are relative +to the window given by @code{posn-window}. + +This example shows how to convert these window-relative coordinates +into frame-relative coordinates: + +@example +(defun frame-relative-coordinates (position) + "Return frame-relative coordinates from POSITION." + (let* ((x-y (posn-x-y position)) + (window (posn-window position)) + (edges (window-inside-pixel-edges window))) + (cons (+ (car x-y) (car edges)) + (+ (cdr x-y) (cadr edges))))) +@end example +@end defun + +@defun posn-col-row position +Return the row and column (in units of the frame's default character +height and width) of @var{position}, as a cons cell @code{(@var{col} . +@var{row})}. These are computed from the @var{x} and @var{y} values +actually found in @var{position}. +@end defun + +@defun posn-actual-col-row position +Return the actual row and column in @var{position}, as a cons cell +@code{(@var{col} . @var{row})}. The values are the actual row number +in the window, and the actual character number in that row. It returns +@code{nil} if @var{position} does not include actual positions values. +You can use @code{posn-col-row} to get approximate values. +@end defun + +@defun posn-string position +Return the string object in @var{position}, either @code{nil}, or a +cons cell @code{(@var{string} . @var{string-pos})}. +@end defun + +@defun posn-image position +Return the image object in @var{position}, either @code{nil}, or an +image @code{(image ...)}. +@end defun + +@defun posn-object position +Return the image or string object in @var{position}, either +@code{nil}, an image @code{(image ...)}, or a cons cell +@code{(@var{string} . @var{string-pos})}. +@end defun + +@defun posn-object-x-y position +Return the pixel-based x and y coordinates relative to the upper left +corner of the object in @var{position} as a cons cell @code{(@var{dx} +. @var{dy})}. If the @var{position} is a buffer position, return the +relative position in the character at that position. +@end defun + +@defun posn-object-width-height position +Return the pixel width and height of the object in @var{position} as a +cons cell @code{(@var{width} . @var{height})}. If the @var{position} +is a buffer position, return the size of the character at that position. +@end defun + +@cindex timestamp of a mouse event +@defun posn-timestamp position +Return the timestamp in @var{position}. This is the time at which the +event occurred, in milliseconds. +@end defun + + These functions compute a position list given particular buffer +position or screen position. You can access the data in this position +list with the functions described above. + +@defun posn-at-point &optional pos window +This function returns a position list for position @var{pos} in +@var{window}. @var{pos} defaults to point in @var{window}; +@var{window} defaults to the selected window. + +@code{posn-at-point} returns @code{nil} if @var{pos} is not visible in +@var{window}. +@end defun + +@defun posn-at-x-y x y &optional frame-or-window whole +This function returns position information corresponding to pixel +coordinates @var{x} and @var{y} in a specified frame or window, +@var{frame-or-window}, which defaults to the selected window. +The coordinates @var{x} and @var{y} are relative to the +frame or window used. +If @var{whole} is @code{nil}, the coordinates are relative +to the window text area, otherwise they are relative to +the entire window area including scroll bars, margins and fringes. +@end defun + + These functions are useful for decoding scroll bar events. + +@defun scroll-bar-event-ratio event +This function returns the fractional vertical position of a scroll bar +event within the scroll bar. The value is a cons cell +@code{(@var{portion} . @var{whole})} containing two integers whose ratio +is the fractional position. +@end defun + +@defun scroll-bar-scale ratio total +This function multiplies (in effect) @var{ratio} by @var{total}, +rounding the result to an integer. The argument @var{ratio} is not a +number, but rather a pair @code{(@var{num} . @var{denom})}---typically a +value returned by @code{scroll-bar-event-ratio}. + +This function is handy for scaling a position on a scroll bar into a +buffer position. Here's how to do that: + +@example +(+ (point-min) + (scroll-bar-scale + (posn-x-y (event-start event)) + (- (point-max) (point-min)))) +@end example + +Recall that scroll bar events have two integers forming a ratio, in place +of a pair of x and y coordinates. +@end defun + +@node Strings of Events +@subsection Putting Keyboard Events in Strings +@cindex keyboard events in strings +@cindex strings with keyboard events + + In most of the places where strings are used, we conceptualize the +string as containing text characters---the same kind of characters found +in buffers or files. Occasionally Lisp programs use strings that +conceptually contain keyboard characters; for example, they may be key +sequences or keyboard macro definitions. However, storing keyboard +characters in a string is a complex matter, for reasons of historical +compatibility, and it is not always possible. + + We recommend that new programs avoid dealing with these complexities +by not storing keyboard events in strings. Here is how to do that: + +@itemize @bullet +@item +Use vectors instead of strings for key sequences, when you plan to use +them for anything other than as arguments to @code{lookup-key} and +@code{define-key}. For example, you can use +@code{read-key-sequence-vector} instead of @code{read-key-sequence}, and +@code{this-command-keys-vector} instead of @code{this-command-keys}. + +@item +Use vectors to write key sequence constants containing meta characters, +even when passing them directly to @code{define-key}. + +@item +When you have to look at the contents of a key sequence that might be a +string, use @code{listify-key-sequence} (@pxref{Event Input Misc}) +first, to convert it to a list. +@end itemize + + The complexities stem from the modifier bits that keyboard input +characters can include. Aside from the Meta modifier, none of these +modifier bits can be included in a string, and the Meta modifier is +allowed only in special cases. + + The earliest GNU Emacs versions represented meta characters as codes +in the range of 128 to 255. At that time, the basic character codes +ranged from 0 to 127, so all keyboard character codes did fit in a +string. Many Lisp programs used @samp{\M-} in string constants to stand +for meta characters, especially in arguments to @code{define-key} and +similar functions, and key sequences and sequences of events were always +represented as strings. + + When we added support for larger basic character codes beyond 127, and +additional modifier bits, we had to change the representation of meta +characters. Now the flag that represents the Meta modifier in a +character is +@tex +@math{2^{27}} +@end tex +@ifnottex +2**27 +@end ifnottex +and such numbers cannot be included in a string. + + To support programs with @samp{\M-} in string constants, there are +special rules for including certain meta characters in a string. +Here are the rules for interpreting a string as a sequence of input +characters: + +@itemize @bullet +@item +If the keyboard character value is in the range of 0 to 127, it can go +in the string unchanged. + +@item +The meta variants of those characters, with codes in the range of +@tex +@math{2^{27}} +@end tex +@ifnottex +2**27 +@end ifnottex +to +@tex +@math{2^{27} + 127}, +@end tex +@ifnottex +2**27+127, +@end ifnottex +can also go in the string, but you must change their +numeric values. You must set the +@tex +@math{2^{7}} +@end tex +@ifnottex +2**7 +@end ifnottex +bit instead of the +@tex +@math{2^{27}} +@end tex +@ifnottex +2**27 +@end ifnottex +bit, resulting in a value between 128 and 255. Only a unibyte string +can include these codes. + +@item +Non-@acronym{ASCII} characters above 256 can be included in a multibyte string. + +@item +Other keyboard character events cannot fit in a string. This includes +keyboard events in the range of 128 to 255. +@end itemize + + Functions such as @code{read-key-sequence} that construct strings of +keyboard input characters follow these rules: they construct vectors +instead of strings, when the events won't fit in a string. + + When you use the read syntax @samp{\M-} in a string, it produces a +code in the range of 128 to 255---the same code that you get if you +modify the corresponding keyboard event to put it in the string. Thus, +meta events in strings work consistently regardless of how they get into +the strings. + + However, most programs would do well to avoid these issues by +following the recommendations at the beginning of this section. + +@node Reading Input +@section Reading Input +@cindex read input +@cindex keyboard input + + The editor command loop reads key sequences using the function +@code{read-key-sequence}, which uses @code{read-event}. These and other +functions for event input are also available for use in Lisp programs. +See also @code{momentary-string-display} in @ref{Temporary Displays}, +and @code{sit-for} in @ref{Waiting}. @xref{Terminal Input}, for +functions and variables for controlling terminal input modes and +debugging terminal input. + + For higher-level input facilities, see @ref{Minibuffers}. + +@menu +* Key Sequence Input:: How to read one key sequence. +* Reading One Event:: How to read just one event. +* Event Mod:: How Emacs modifies events as they are read. +* Invoking the Input Method:: How reading an event uses the input method. +* Quoted Character Input:: Asking the user to specify a character. +* Event Input Misc:: How to reread or throw away input events. +@end menu + +@node Key Sequence Input +@subsection Key Sequence Input +@cindex key sequence input + + The command loop reads input a key sequence at a time, by calling +@code{read-key-sequence}. Lisp programs can also call this function; +for example, @code{describe-key} uses it to read the key to describe. + +@defun read-key-sequence prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop +This function reads a key sequence and returns it as a string or +vector. It keeps reading events until it has accumulated a complete key +sequence; that is, enough to specify a non-prefix command using the +currently active keymaps. (Remember that a key sequence that starts +with a mouse event is read using the keymaps of the buffer in the +window that the mouse was in, not the current buffer.) + +If the events are all characters and all can fit in a string, then +@code{read-key-sequence} returns a string (@pxref{Strings of Events}). +Otherwise, it returns a vector, since a vector can hold all kinds of +events---characters, symbols, and lists. The elements of the string or +vector are the events in the key sequence. + +Reading a key sequence includes translating the events in various +ways. @xref{Translation Keymaps}. + +The argument @var{prompt} is either a string to be displayed in the +echo area as a prompt, or @code{nil}, meaning not to display a prompt. +The argument @var{continue-echo}, if non-@code{nil}, means to echo +this key as a continuation of the previous key. + +Normally any upper case event is converted to lower case if the +original event is undefined and the lower case equivalent is defined. +The argument @var{dont-downcase-last}, if non-@code{nil}, means do not +convert the last event to lower case. This is appropriate for reading +a key sequence to be defined. + +The argument @var{switch-frame-ok}, if non-@code{nil}, means that this +function should process a @code{switch-frame} event if the user +switches frames before typing anything. If the user switches frames +in the middle of a key sequence, or at the start of the sequence but +@var{switch-frame-ok} is @code{nil}, then the event will be put off +until after the current key sequence. + +The argument @var{command-loop}, if non-@code{nil}, means that this +key sequence is being read by something that will read commands one +after another. It should be @code{nil} if the caller will read just +one key sequence. + +In the following example, Emacs displays the prompt @samp{?} in the +echo area, and then the user types @kbd{C-x C-f}. + +@example +(read-key-sequence "?") + +@group +---------- Echo Area ---------- +?@kbd{C-x C-f} +---------- Echo Area ---------- + + @result{} "^X^F" +@end group +@end example + +The function @code{read-key-sequence} suppresses quitting: @kbd{C-g} +typed while reading with this function works like any other character, +and does not set @code{quit-flag}. @xref{Quitting}. +@end defun + +@defun read-key-sequence-vector prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop +This is like @code{read-key-sequence} except that it always +returns the key sequence as a vector, never as a string. +@xref{Strings of Events}. +@end defun + +@cindex upper case key sequence +@cindex downcasing in @code{lookup-key} +If an input character is upper-case (or has the shift modifier) and +has no key binding, but its lower-case equivalent has one, then +@code{read-key-sequence} converts the character to lower case. Note +that @code{lookup-key} does not perform case conversion in this way. + +The function @code{read-key-sequence} also transforms some mouse events. +It converts unbound drag events into click events, and discards unbound +button-down events entirely. It also reshuffles focus events and +miscellaneous window events so that they never appear in a key sequence +with any other events. + +@cindex @code{header-line} prefix key +@cindex @code{mode-line} prefix key +@cindex @code{vertical-line} prefix key +@cindex @code{horizontal-scroll-bar} prefix key +@cindex @code{vertical-scroll-bar} prefix key +@cindex @code{menu-bar} prefix key +@cindex mouse events, in special parts of frame +When mouse events occur in special parts of a window, such as a mode +line or a scroll bar, the event type shows nothing special---it is the +same symbol that would normally represent that combination of mouse +button and modifier keys. The information about the window part is kept +elsewhere in the event---in the coordinates. But +@code{read-key-sequence} translates this information into imaginary +``prefix keys,'' all of which are symbols: @code{header-line}, +@code{horizontal-scroll-bar}, @code{menu-bar}, @code{mode-line}, +@code{vertical-line}, and @code{vertical-scroll-bar}. You can define +meanings for mouse clicks in special window parts by defining key +sequences using these imaginary prefix keys. + +For example, if you call @code{read-key-sequence} and then click the +mouse on the window's mode line, you get two events, like this: + +@example +(read-key-sequence "Click on the mode line: ") + @result{} [mode-line + (mouse-1 + (#<window 6 on NEWS> mode-line + (40 . 63) 5959987))] +@end example + +@defvar num-input-keys +@c Emacs 19 feature +This variable's value is the number of key sequences processed so far in +this Emacs session. This includes key sequences read from the terminal +and key sequences read from keyboard macros being executed. +@end defvar + +@node Reading One Event +@subsection Reading One Event +@cindex reading a single event +@cindex event, reading only one + + The lowest level functions for command input are those that read a +single event. + +None of the three functions below suppresses quitting. + +@defun read-event &optional prompt inherit-input-method seconds +This function reads and returns the next event of command input, waiting +if necessary until an event is available. Events can come directly from +the user or from a keyboard macro. + +If the optional argument @var{prompt} is non-@code{nil}, it should be a +string to display in the echo area as a prompt. Otherwise, +@code{read-event} does not display any message to indicate it is waiting +for input; instead, it prompts by echoing: it displays descriptions of +the events that led to or were read by the current command. @xref{The +Echo Area}. + +If @var{inherit-input-method} is non-@code{nil}, then the current input +method (if any) is employed to make it possible to enter a +non-@acronym{ASCII} character. Otherwise, input method handling is disabled +for reading this event. + +If @code{cursor-in-echo-area} is non-@code{nil}, then @code{read-event} +moves the cursor temporarily to the echo area, to the end of any message +displayed there. Otherwise @code{read-event} does not move the cursor. + +If @var{seconds} is non-@code{nil}, it should be a number specifying +the maximum time to wait for input, in seconds. If no input arrives +within that time, @code{read-event} stops waiting and returns +@code{nil}. A floating-point value for @var{seconds} means to wait +for a fractional number of seconds. Some systems support only a whole +number of seconds; on these systems, @var{seconds} is rounded down. +If @var{seconds} is @code{nil}, @code{read-event} waits as long as +necessary for input to arrive. + +If @var{seconds} is @code{nil}, Emacs is considered idle while waiting +for user input to arrive. Idle timers---those created with +@code{run-with-idle-timer} (@pxref{Idle Timers})---can run during this +period. However, if @var{seconds} is non-@code{nil}, the state of +idleness remains unchanged. If Emacs is non-idle when +@code{read-event} is called, it remains non-idle throughout the +operation of @code{read-event}; if Emacs is idle (which can happen if +the call happens inside an idle timer), it remains idle. + +If @code{read-event} gets an event that is defined as a help character, +then in some cases @code{read-event} processes the event directly without +returning. @xref{Help Functions}. Certain other events, called +@dfn{special events}, are also processed directly within +@code{read-event} (@pxref{Special Events}). + +Here is what happens if you call @code{read-event} and then press the +right-arrow function key: + +@example +@group +(read-event) + @result{} right +@end group +@end example +@end defun + +@defun read-char &optional prompt inherit-input-method seconds +This function reads and returns a character of command input. If the +user generates an event which is not a character (i.e. a mouse click or +function key event), @code{read-char} signals an error. The arguments +work as in @code{read-event}. + +In the first example, the user types the character @kbd{1} (@acronym{ASCII} +code 49). The second example shows a keyboard macro definition that +calls @code{read-char} from the minibuffer using @code{eval-expression}. +@code{read-char} reads the keyboard macro's very next character, which +is @kbd{1}. Then @code{eval-expression} displays its return value in +the echo area. + +@example +@group +(read-char) + @result{} 49 +@end group + +@group +;; @r{We assume here you use @kbd{M-:} to evaluate this.} +(symbol-function 'foo) + @result{} "^[:(read-char)^M1" +@end group +@group +(execute-kbd-macro 'foo) + @print{} 49 + @result{} nil +@end group +@end example +@end defun + +@defun read-char-exclusive &optional prompt inherit-input-method seconds +This function reads and returns a character of command input. If the +user generates an event which is not a character, +@code{read-char-exclusive} ignores it and reads another event, until it +gets a character. The arguments work as in @code{read-event}. +@end defun + +@defvar num-nonmacro-input-events +This variable holds the total number of input events received so far +from the terminal---not counting those generated by keyboard macros. +@end defvar + +@node Event Mod +@subsection Modifying and Translating Input Events + + Emacs modifies every event it reads according to +@code{extra-keyboard-modifiers}, then translates it through +@code{keyboard-translate-table} (if applicable), before returning it +from @code{read-event}. + +@c Emacs 19 feature +@defvar extra-keyboard-modifiers +This variable lets Lisp programs ``press'' the modifier keys on the +keyboard. The value is a character. Only the modifiers of the +character matter. Each time the user types a keyboard key, it is +altered as if those modifier keys were held down. For instance, if +you bind @code{extra-keyboard-modifiers} to @code{?\C-\M-a}, then all +keyboard input characters typed during the scope of the binding will +have the control and meta modifiers applied to them. The character +@code{?\C-@@}, equivalent to the integer 0, does not count as a control +character for this purpose, but as a character with no modifiers. +Thus, setting @code{extra-keyboard-modifiers} to zero cancels any +modification. + +When using a window system, the program can ``press'' any of the +modifier keys in this way. Otherwise, only the @key{CTL} and @key{META} +keys can be virtually pressed. + +Note that this variable applies only to events that really come from +the keyboard, and has no effect on mouse events or any other events. +@end defvar + +@defvar keyboard-translate-table +This variable is the translate table for keyboard characters. It lets +you reshuffle the keys on the keyboard without changing any command +bindings. Its value is normally a char-table, or else @code{nil}. +(It can also be a string or vector, but this is considered obsolete.) + +If @code{keyboard-translate-table} is a char-table +(@pxref{Char-Tables}), then each character read from the keyboard is +looked up in this char-table. If the value found there is +non-@code{nil}, then it is used instead of the actual input character. + +Note that this translation is the first thing that happens to a +character after it is read from the terminal. Record-keeping features +such as @code{recent-keys} and dribble files record the characters after +translation. + +Note also that this translation is done before the characters are +supplied to input methods (@pxref{Input Methods}). Use +@code{translation-table-for-input} (@pxref{Translation of Characters}), +if you want to translate characters after input methods operate. +@end defvar + +@defun keyboard-translate from to +This function modifies @code{keyboard-translate-table} to translate +character code @var{from} into character code @var{to}. It creates +the keyboard translate table if necessary. +@end defun + + Here's an example of using the @code{keyboard-translate-table} to +make @kbd{C-x}, @kbd{C-c} and @kbd{C-v} perform the cut, copy and paste +operations: + +@example +(keyboard-translate ?\C-x 'control-x) +(keyboard-translate ?\C-c 'control-c) +(keyboard-translate ?\C-v 'control-v) +(global-set-key [control-x] 'kill-region) +(global-set-key [control-c] 'kill-ring-save) +(global-set-key [control-v] 'yank) +@end example + +@noindent +On a graphical terminal that supports extended @acronym{ASCII} input, +you can still get the standard Emacs meanings of one of those +characters by typing it with the shift key. That makes it a different +character as far as keyboard translation is concerned, but it has the +same usual meaning. + + @xref{Translation Keymaps}, for mechanisms that translate event sequences +at the level of @code{read-key-sequence}. + +@node Invoking the Input Method +@subsection Invoking the Input Method + + The event-reading functions invoke the current input method, if any +(@pxref{Input Methods}). If the value of @code{input-method-function} +is non-@code{nil}, it should be a function; when @code{read-event} reads +a printing character (including @key{SPC}) with no modifier bits, it +calls that function, passing the character as an argument. + +@defvar input-method-function +If this is non-@code{nil}, its value specifies the current input method +function. + +@strong{Warning:} don't bind this variable with @code{let}. It is often +buffer-local, and if you bind it around reading input (which is exactly +when you @emph{would} bind it), switching buffers asynchronously while +Emacs is waiting will cause the value to be restored in the wrong +buffer. +@end defvar + + The input method function should return a list of events which should +be used as input. (If the list is @code{nil}, that means there is no +input, so @code{read-event} waits for another event.) These events are +processed before the events in @code{unread-command-events} +(@pxref{Event Input Misc}). Events +returned by the input method function are not passed to the input method +function again, even if they are printing characters with no modifier +bits. + + If the input method function calls @code{read-event} or +@code{read-key-sequence}, it should bind @code{input-method-function} to +@code{nil} first, to prevent recursion. + + The input method function is not called when reading the second and +subsequent events of a key sequence. Thus, these characters are not +subject to input method processing. The input method function should +test the values of @code{overriding-local-map} and +@code{overriding-terminal-local-map}; if either of these variables is +non-@code{nil}, the input method should put its argument into a list and +return that list with no further processing. + +@node Quoted Character Input +@subsection Quoted Character Input +@cindex quoted character input + + You can use the function @code{read-quoted-char} to ask the user to +specify a character, and allow the user to specify a control or meta +character conveniently, either literally or as an octal character code. +The command @code{quoted-insert} uses this function. + +@defun read-quoted-char &optional prompt +@cindex octal character input +@cindex control characters, reading +@cindex nonprinting characters, reading +This function is like @code{read-char}, except that if the first +character read is an octal digit (0-7), it reads any number of octal +digits (but stopping if a non-octal digit is found), and returns the +character represented by that numeric character code. If the +character that terminates the sequence of octal digits is @key{RET}, +it is discarded. Any other terminating character is used as input +after this function returns. + +Quitting is suppressed when the first character is read, so that the +user can enter a @kbd{C-g}. @xref{Quitting}. + +If @var{prompt} is supplied, it specifies a string for prompting the +user. The prompt string is always displayed in the echo area, followed +by a single @samp{-}. + +In the following example, the user types in the octal number 177 (which +is 127 in decimal). + +@example +(read-quoted-char "What character") + +@group +---------- Echo Area ---------- +What character @kbd{1 7 7}- +---------- Echo Area ---------- + + @result{} 127 +@end group +@end example +@end defun + +@need 2000 +@node Event Input Misc +@subsection Miscellaneous Event Input Features + +This section describes how to ``peek ahead'' at events without using +them up, how to check for pending input, and how to discard pending +input. See also the function @code{read-passwd} (@pxref{Reading a +Password}). + +@defvar unread-command-events +@cindex next input +@cindex peeking at input +This variable holds a list of events waiting to be read as command +input. The events are used in the order they appear in the list, and +removed one by one as they are used. + +The variable is needed because in some cases a function reads an event +and then decides not to use it. Storing the event in this variable +causes it to be processed normally, by the command loop or by the +functions to read command input. + +@cindex prefix argument unreading +For example, the function that implements numeric prefix arguments reads +any number of digits. When it finds a non-digit event, it must unread +the event so that it can be read normally by the command loop. +Likewise, incremental search uses this feature to unread events with no +special meaning in a search, because these events should exit the search +and then execute normally. + +The reliable and easy way to extract events from a key sequence so as to +put them in @code{unread-command-events} is to use +@code{listify-key-sequence} (@pxref{Strings of Events}). + +Normally you add events to the front of this list, so that the events +most recently unread will be reread first. + +Events read from this list are not normally added to the current +command's key sequence (as returned by e.g. @code{this-command-keys}), +as the events will already have been added once as they were read for +the first time. An element of the form @code{(@code{t} . @var{event})} +forces @var{event} to be added to the current command's key sequence. +@end defvar + +@defun listify-key-sequence key +This function converts the string or vector @var{key} to a list of +individual events, which you can put in @code{unread-command-events}. +@end defun + +@defvar unread-command-char +This variable holds a character to be read as command input. +A value of -1 means ``empty.'' + +This variable is mostly obsolete now that you can use +@code{unread-command-events} instead; it exists only to support programs +written for Emacs versions 18 and earlier. +@end defvar + +@defun input-pending-p +@cindex waiting for command key input +This function determines whether any command input is currently +available to be read. It returns immediately, with value @code{t} if +there is available input, @code{nil} otherwise. On rare occasions it +may return @code{t} when no input is available. +@end defun + +@defvar last-input-event +@defvarx last-input-char +This variable records the last terminal input event read, whether +as part of a command or explicitly by a Lisp program. + +In the example below, the Lisp program reads the character @kbd{1}, +@acronym{ASCII} code 49. It becomes the value of @code{last-input-event}, +while @kbd{C-e} (we assume @kbd{C-x C-e} command is used to evaluate +this expression) remains the value of @code{last-command-event}. + +@example +@group +(progn (print (read-char)) + (print last-command-event) + last-input-event) + @print{} 49 + @print{} 5 + @result{} 49 +@end group +@end example + +The alias @code{last-input-char} exists for compatibility with +Emacs version 18. +@end defvar + +@defmac while-no-input body@dots{} +This construct runs the @var{body} forms and returns the value of the +last one---but only if no input arrives. If any input arrives during +the execution of the @var{body} forms, it aborts them (working much +like a quit). The @code{while-no-input} form returns @code{nil} if +aborted by a real quit, and returns @code{t} if aborted by arrival of +other input. + +If a part of @var{body} binds @code{inhibit-quit} to non-@code{nil}, +arrival of input during those parts won't cause an abort until +the end of that part. + +If you want to be able to distinguish all possible values computed +by @var{body} from both kinds of abort conditions, write the code +like this: + +@example +(while-no-input + (list + (progn . @var{body}))) +@end example +@end defmac + +@defun discard-input +@cindex flushing input +@cindex discarding input +@cindex keyboard macro, terminating +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 @code{nil}. + +In the following example, the user may type a number of characters right +after starting the evaluation of the form. After the @code{sleep-for} +finishes sleeping, @code{discard-input} discards any characters typed +during the sleep. + +@example +(progn (sleep-for 2) + (discard-input)) + @result{} nil +@end example +@end defun + +@node Special Events +@section Special Events + +@cindex special events +Special events are handled at a very low level---as soon as they are +read. The @code{read-event} function processes these events itself, and +never returns them. Instead, it keeps waiting for the first event +that is not special and returns that one. + +Events that are handled in this way do not echo, they are never grouped +into key sequences, and they never appear in the value of +@code{last-command-event} or @code{(this-command-keys)}. They do not +discard a numeric argument, they cannot be unread with +@code{unread-command-events}, they may not appear in a keyboard macro, +and they are not recorded in a keyboard macro while you are defining +one. + +These events do, however, appear in @code{last-input-event} immediately +after they are read, and this is the way for the event's definition to +find the actual event. + +The events types @code{iconify-frame}, @code{make-frame-visible}, +@code{delete-frame}, @code{drag-n-drop}, and user signals like +@code{sigusr1} are normally handled in this way. The keymap which +defines how to handle special events---and which events are special---is +in the variable @code{special-event-map} (@pxref{Active Keymaps}). + +@node Waiting +@section Waiting for Elapsed Time or Input +@cindex waiting + + The wait functions are designed to 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. +@code{sit-for} pauses and updates the screen, and returns immediately if +input comes in, while @code{sleep-for} pauses without updating the +screen. + +@defun sit-for seconds &optional nodisp +This function performs redisplay (provided there is no pending input +from the user), then waits @var{seconds} seconds, or until input is +available. The usual purpose of @code{sit-for} is to give the user +time to read text that you display. The value is @code{t} if +@code{sit-for} waited the full time with no input arriving +(@pxref{Event Input Misc}). Otherwise, the value is @code{nil}. + +The argument @var{seconds} need not be an integer. If it is a floating +point number, @code{sit-for} waits for a fractional number of seconds. +Some systems support only a whole number of seconds; on these systems, +@var{seconds} is rounded down. + +The expression @code{(sit-for 0)} is equivalent to @code{(redisplay)}, +i.e. it requests a redisplay, without any delay, if there is no pending input. +@xref{Forcing Redisplay}. + +If @var{nodisp} is non-@code{nil}, then @code{sit-for} does not +redisplay, but it still returns as soon as input is available (or when +the timeout elapses). + +In batch mode (@pxref{Batch Mode}), @code{sit-for} cannot be +interrupted, even by input from the standard input descriptor. It is +thus equivalent to @code{sleep-for}, which is described below. + +It is also possible to call @code{sit-for} with three arguments, +as @code{(sit-for @var{seconds} @var{millisec} @var{nodisp})}, +but that is considered obsolete. +@end defun + +@defun sleep-for seconds &optional millisec +This function simply pauses for @var{seconds} seconds without updating +the display. It pays no attention to available input. It returns +@code{nil}. + +The argument @var{seconds} need not be an integer. If it is a floating +point number, @code{sleep-for} waits for a fractional number of seconds. +Some systems support only a whole number of seconds; on these systems, +@var{seconds} is rounded down. + +The optional argument @var{millisec} specifies an additional waiting +period measured in milliseconds. This adds to the period specified by +@var{seconds}. If the system doesn't support waiting fractions of a +second, you get an error if you specify nonzero @var{millisec}. + +Use @code{sleep-for} when you wish to guarantee a delay. +@end defun + + @xref{Time of Day}, for functions to get the current time. + +@node Quitting +@section Quitting +@cindex @kbd{C-g} +@cindex quitting +@cindex interrupt Lisp functions + + Typing @kbd{C-g} while a Lisp function is running causes Emacs to +@dfn{quit} whatever it is doing. This means that control returns to the +innermost active command loop. + + Typing @kbd{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 @kbd{C-g} +normally runs the command @code{keyboard-quit}, whose effect is to quit. +However, when @kbd{C-g} follows a prefix key, they combine to form an +undefined key. The effect is to cancel the prefix key as well as any +prefix argument. + + In the minibuffer, @kbd{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 +@emph{within} the minibuffer.) The reason why @kbd{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. @kbd{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 @kbd{C-g} always quit directly. + + When @kbd{C-g} does directly quit, it does so by setting the variable +@code{quit-flag} to @code{t}. Emacs checks this variable at appropriate +times and quits if it is not @code{nil}. Setting @code{quit-flag} +non-@code{nil} in any way thus causes a quit. + + At the level of C code, quitting cannot happen just anywhere; only at the +special places that check @code{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 @code{read-key-sequence} or +@code{read-quoted-char} prevent quitting entirely even though they wait +for input. Instead of quitting, @kbd{C-g} serves as the requested +input. In the case of @code{read-key-sequence}, this serves to bring +about the special behavior of @kbd{C-g} in the command loop. In the +case of @code{read-quoted-char}, this is so that @kbd{C-q} can be used +to quote a @kbd{C-g}. + +@cindex preventing quitting + You can prevent quitting for a portion of a Lisp function by binding +the variable @code{inhibit-quit} to a non-@code{nil} value. Then, +although @kbd{C-g} still sets @code{quit-flag} to @code{t} as usual, the +usual result of this---a quit---is prevented. Eventually, +@code{inhibit-quit} will become @code{nil} again, such as when its +binding is unwound at the end of a @code{let} form. At that time, if +@code{quit-flag} is still non-@code{nil}, the requested quit happens +immediately. This behavior is ideal when you wish to make sure that +quitting does not happen within a ``critical section'' of the program. + +@cindex @code{read-quoted-char} quitting + In some functions (such as @code{read-quoted-char}), @kbd{C-g} is +handled in a special way that does not involve quitting. This is done +by reading the input with @code{inhibit-quit} bound to @code{t}, and +setting @code{quit-flag} to @code{nil} before @code{inhibit-quit} +becomes @code{nil} again. This excerpt from the definition of +@code{read-quoted-char} shows how this is done; it also shows that +normal quitting is permitted after the first character of input. + +@example +(defun read-quoted-char (&optional prompt) + "@dots{}@var{documentation}@dots{}" + (let ((message-log-max nil) done (first t) (code 0) char) + (while (not done) + (let ((inhibit-quit first) + @dots{}) + (and prompt (message "%s-" prompt)) + (setq char (read-event)) + (if inhibit-quit (setq quit-flag nil))) + @r{@dots{}set the variable @code{code}@dots{}}) + code)) +@end example + +@defvar quit-flag +If this variable is non-@code{nil}, then Emacs quits immediately, unless +@code{inhibit-quit} is non-@code{nil}. Typing @kbd{C-g} ordinarily sets +@code{quit-flag} non-@code{nil}, regardless of @code{inhibit-quit}. +@end defvar + +@defvar inhibit-quit +This variable determines whether Emacs should quit when @code{quit-flag} +is set to a value other than @code{nil}. If @code{inhibit-quit} is +non-@code{nil}, then @code{quit-flag} has no special effect. +@end defvar + +@defmac with-local-quit body@dots{} +This macro executes @var{body} forms in sequence, but allows quitting, at +least locally, within @var{body} even if @code{inhibit-quit} was +non-@code{nil} outside this construct. It returns the value of the +last form in @var{body}, unless exited by quitting, in which case +it returns @code{nil}. + +If @code{inhibit-quit} is @code{nil} on entry to @code{with-local-quit}, +it only executes the @var{body}, and setting @code{quit-flag} causes +a normal quit. However, if @code{inhibit-quit} is non-@code{nil} so +that ordinary quitting is delayed, a non-@code{nil} @code{quit-flag} +triggers a special kind of local quit. This ends the execution of +@var{body} and exits the @code{with-local-quit} body with +@code{quit-flag} still non-@code{nil}, so that another (ordinary) quit +will happen as soon as that is allowed. If @code{quit-flag} is +already non-@code{nil} at the beginning of @var{body}, the local quit +happens immediately and the body doesn't execute at all. + +This macro is mainly useful in functions that can be called from +timers, process filters, process sentinels, @code{pre-command-hook}, +@code{post-command-hook}, and other places where @code{inhibit-quit} is +normally bound to @code{t}. +@end defmac + +@deffn Command keyboard-quit +This function signals the @code{quit} condition with @code{(signal 'quit +nil)}. This is the same thing that quitting does. (See @code{signal} +in @ref{Errors}.) +@end deffn + + You can specify a character other than @kbd{C-g} to use for quitting. +See the function @code{set-input-mode} in @ref{Terminal Input}. + +@node Prefix Command Arguments +@section Prefix Command Arguments +@cindex prefix argument +@cindex raw prefix argument +@cindex numeric prefix argument + + Most Emacs commands can use a @dfn{prefix argument}, a number +specified before the command itself. (Don't confuse prefix arguments +with prefix keys.) The prefix argument is at all times represented by a +value, which may be @code{nil}, meaning there is currently no prefix +argument. Each command may use the prefix argument or ignore it. + + There are two representations of the prefix argument: @dfn{raw} and +@dfn{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: + +@itemize @bullet +@item +@code{nil}, meaning there is no prefix argument. Its numeric value is +1, but numerous commands make a distinction between @code{nil} and the +integer 1. + +@item +An integer, which stands for itself. + +@item +A list of one element, which is an integer. This form of prefix +argument results from one or a succession of @kbd{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. + +@item +The symbol @code{-}. This indicates that @kbd{M--} or @kbd{C-u -} was +typed, without following digits. The equivalent numeric value is +@minus{}1, but some commands make a distinction between the integer +@minus{}1 and the symbol @code{-}. +@end itemize + +We illustrate these possibilities by calling the following function with +various prefixes: + +@example +@group +(defun display-prefix (arg) + "Display the value of the raw prefix arg." + (interactive "P") + (message "%s" arg)) +@end group +@end example + +@noindent +Here are the results of calling @code{display-prefix} with various +raw prefix arguments: + +@example + M-x display-prefix @print{} nil + +C-u M-x display-prefix @print{} (4) + +C-u C-u M-x display-prefix @print{} (16) + +C-u 3 M-x display-prefix @print{} 3 + +M-3 M-x display-prefix @print{} 3 ; @r{(Same as @code{C-u 3}.)} + +C-u - M-x display-prefix @print{} - + +M-- M-x display-prefix @print{} - ; @r{(Same as @code{C-u -}.)} + +C-u - 7 M-x display-prefix @print{} -7 + +M-- 7 M-x display-prefix @print{} -7 ; @r{(Same as @code{C-u -7}.)} +@end example + + Emacs uses two variables to store the prefix argument: +@code{prefix-arg} and @code{current-prefix-arg}. Commands such as +@code{universal-argument} that set up prefix arguments for other +commands store them in @code{prefix-arg}. In contrast, +@code{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 @code{interactive} specification. +(@xref{Using Interactive}.) Alternatively, functions may look at the +value of the prefix argument directly in the variable +@code{current-prefix-arg}, but this is less clean. + +@defun prefix-numeric-value arg +This function returns the numeric meaning of a valid raw prefix argument +value, @var{arg}. The argument may be a symbol, a number, or a list. +If it is @code{nil}, the value 1 is returned; if it is @code{-}, the +value @minus{}1 is returned; if it is a number, that number is returned; +if it is a list, the @sc{car} of that list (which should be a number) is +returned. +@end defun + +@defvar current-prefix-arg +This variable holds the raw prefix argument for the @emph{current} +command. Commands may examine it directly, but the usual method for +accessing it is with @code{(interactive "P")}. +@end defvar + +@defvar prefix-arg +The value of this variable is the raw prefix argument for the +@emph{next} editing command. Commands such as @code{universal-argument} +that specify prefix arguments for the following command work by setting +this variable. +@end defvar + +@defvar last-prefix-arg +The raw prefix argument value used by the previous command. +@end defvar + + The following commands exist to set up prefix arguments for the +following command. Do not call them for any other reason. + +@deffn 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. +@end deffn + +@deffn Command digit-argument arg +This command adds to the prefix argument for the following command. The +argument @var{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. +@end deffn + +@deffn Command negative-argument arg +This command adds to the numeric argument for the next command. The +argument @var{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. +@end deffn + +@node Recursive Editing +@section Recursive Editing +@cindex recursive command loop +@cindex recursive editing level +@cindex command loop, recursive + + The Emacs command loop is entered automatically when Emacs starts up. +This top-level invocation of the command loop never exits; it keeps +running as long as Emacs does. Lisp programs can also invoke the +command loop. Since this makes more than one activation of the command +loop, we call it @dfn{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 they finish. (The special +commands for exiting are always available, but they 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. + +@cindex minibuffer input + 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. + +@cindex @code{throw} example +@kindex exit +@cindex exit recursive editing +@cindex aborting + To invoke a recursive editing level, call the function +@code{recursive-edit}. This function contains the command loop; it also +contains a call to @code{catch} with tag @code{exit}, which makes it +possible to exit the recursive editing level by throwing to @code{exit} +(@pxref{Catch and Throw}). If you throw a value other than @code{t}, +then @code{recursive-edit} returns normally to the function that called +it. The command @kbd{C-M-c} (@code{exit-recursive-edit}) does this. +Throwing a @code{t} value causes @code{recursive-edit} to quit, so that +control returns to the command loop one level up. This is called +@dfn{aborting}, and is done by @kbd{C-]} (@code{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 should have a command to go back to the previous mode. +(The @kbd{e} command in Rmail uses this technique.) 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 +@kbd{m} command in Rmail does this.) + + Recursive edits are useful in debugging. You can insert a call to +@code{debug} into a function definition as a sort of breakpoint, so that +you can look around when the function gets there. @code{debug} invokes +a recursive edit but also provides the other features of the debugger. + + Recursive editing levels are also used when you type @kbd{C-r} in +@code{query-replace} or use @kbd{C-x q} (@code{kbd-macro-query}). + +@defun recursive-edit +@cindex suspend evaluation +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. + +If the current buffer is not the same as the selected window's buffer, +@code{recursive-edit} saves and restores the current buffer. Otherwise, +if you switch buffers, the buffer you switched to is current after +@code{recursive-edit} returns. + +In the following example, the function @code{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 @kbd{C-M-c} to exit and continue executing @code{simple-rec}. + +@example +(defun simple-rec () + (forward-word 1) + (message "Recursive edit in progress") + (recursive-edit) + (forward-word 1)) + @result{} simple-rec +(simple-rec) + @result{} nil +@end example +@end defun + +@deffn Command exit-recursive-edit +This function exits from the innermost recursive edit (including +minibuffer input). Its definition is effectively @code{(throw 'exit +nil)}. +@end deffn + +@deffn Command abort-recursive-edit +This function aborts the command that requested the innermost recursive +edit (including minibuffer input), by signaling @code{quit} +after exiting the recursive edit. Its definition is effectively +@code{(throw 'exit t)}. @xref{Quitting}. +@end deffn + +@deffn 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. +@end deffn + +@defun recursion-depth +This function returns the current depth of recursive edits. When no +recursive edit is active, it returns 0. +@end defun + +@node Disabling Commands +@section Disabling Commands +@cindex disabled command + + @dfn{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. + +@kindex disabled + The low-level mechanism for disabling a command is to put a +non-@code{nil} @code{disabled} property on the Lisp symbol for the +command. These properties are normally set up by the user's +init file (@pxref{Init File}) with Lisp expressions such as this: + +@example +(put 'upcase-region 'disabled t) +@end example + +@noindent +For a few commands, these properties are present by default (you can +remove them in your init file if you wish). + + If the value of the @code{disabled} property is a string, the message +saying the command is disabled includes that string. For example: + +@example +(put 'delete-region 'disabled + "Text deleted this way cannot be yanked back!\n") +@end example + + @xref{Disabling,,, emacs, The GNU Emacs Manual}, 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. + +@deffn Command enable-command command +Allow @var{command} (a symbol) to be executed without special +confirmation from now on, and alter the user's init file (@pxref{Init +File}) so that this will apply to future sessions. +@end deffn + +@deffn Command disable-command command +Require special confirmation to execute @var{command} from now on, and +alter the user's init file so that this will apply to future sessions. +@end deffn + +@defvar disabled-command-function +The value of this variable should be a function. When the user +invokes a disabled command interactively, this function is called +instead of the disabled command. It can use @code{this-command-keys} +to determine what the user typed to run the command, and thus find the +command itself. + +The value may also be @code{nil}. Then all commands work normally, +even disabled ones. + +By default, the value is a function that asks the user whether to +proceed. +@end defvar + +@node Command History +@section Command History +@cindex command history +@cindex complex command +@cindex history of commands + + The command loop keeps a history of the complex commands that have +been executed, to make it convenient to repeat these commands. A +@dfn{complex command} is one for which the interactive argument reading +uses the minibuffer. This includes any @kbd{M-x} command, any +@kbd{M-:} command, and any command whose @code{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. + +@defvar 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 when it +reaches the maximum size (@pxref{Minibuffer History}), the oldest +elements are deleted as new ones are added. + +@example +@group +command-history +@result{} ((switch-to-buffer "chistory.texi") + (describe-key "^X^[") + (visit-tags-table "~/emacs/src/") + (find-tag "repeat-complex-command")) +@end group +@end example +@end defvar + + This history list is actually a special case of minibuffer history +(@pxref{Minibuffer History}), with one special twist: the elements are +expressions rather than strings. + + There are a number of commands devoted to the editing and recall of +previous commands. The commands @code{repeat-complex-command}, and +@code{list-command-history} are described in the user manual +(@pxref{Repetition,,, emacs, The GNU Emacs Manual}). Within the +minibuffer, the usual minibuffer history commands are available. + +@node Keyboard Macros +@section Keyboard Macros +@cindex keyboard macros + + A @dfn{keyboard macro} is a canned sequence of input events that can +be considered a command and made the definition of a key. The Lisp +representation of a keyboard macro is a string or vector containing the +events. Don't confuse keyboard macros with Lisp macros +(@pxref{Macros}). + +@defun execute-kbd-macro kbdmacro &optional count loopfunc +This function executes @var{kbdmacro} as a sequence of events. If +@var{kbdmacro} is a string or vector, then the events in it are executed +exactly as if they had been input by the user. The sequence is +@emph{not} expected to be a single key sequence; normally a keyboard +macro definition consists of several key sequences concatenated. + +If @var{kbdmacro} is a symbol, then its function definition is used in +place of @var{kbdmacro}. If that is another symbol, this process repeats. +Eventually the result should be a string or vector. If the result is +not a symbol, string, or vector, an error is signaled. + +The argument @var{count} is a repeat count; @var{kbdmacro} is executed that +many times. If @var{count} is omitted or @code{nil}, @var{kbdmacro} is +executed once. If it is 0, @var{kbdmacro} is executed over and over until it +encounters an error or a failing search. + +If @var{loopfunc} is non-@code{nil}, it is a function that is called, +without arguments, prior to each iteration of the macro. If +@var{loopfunc} returns @code{nil}, then this stops execution of the macro. + +@xref{Reading One Event}, for an example of using @code{execute-kbd-macro}. +@end defun + +@defvar executing-kbd-macro +This variable contains the string or vector that defines the keyboard +macro that is currently executing. It is @code{nil} if no macro is +currently executing. A command can test this variable so as to behave +differently when run from an executing macro. Do not set this variable +yourself. +@end defvar + +@defvar defining-kbd-macro +This variable is non-@code{nil} if and only if a keyboard macro is +being defined. A command can test this variable so as to behave +differently while a macro is being defined. The value is +@code{append} while appending to the definition of an existing macro. +The commands @code{start-kbd-macro}, @code{kmacro-start-macro} and +@code{end-kbd-macro} set this variable---do not set it yourself. + +The variable is always local to the current terminal and cannot be +buffer-local. @xref{Multiple Displays}. +@end defvar + +@defvar last-kbd-macro +This variable is the definition of the most recently defined keyboard +macro. Its value is a string or vector, or @code{nil}. + +The variable is always local to the current terminal and cannot be +buffer-local. @xref{Multiple Displays}. +@end defvar + +@defvar kbd-macro-termination-hook +This normal hook (@pxref{Standard Hooks}) is run when a keyboard +macro terminates, regardless of what caused it to terminate (reaching +the macro end or an error which ended the macro prematurely). +@end defvar + +@ignore + arch-tag: e34944ad-7d5c-4980-be00-36a5fe54d4b1 +@end ignore diff --git a/doc/lispref/compile.texi b/doc/lispref/compile.texi new file mode 100644 index 00000000000..8f5c047fd6b --- /dev/null +++ b/doc/lispref/compile.texi @@ -0,0 +1,886 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/compile +@node Byte Compilation, Advising Functions, Loading, Top +@chapter Byte Compilation +@cindex byte compilation +@cindex byte-code +@cindex compilation (Emacs Lisp) + + Emacs Lisp has a @dfn{compiler} that translates functions written +in Lisp into a special representation called @dfn{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 @dfn{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. + + Compiling a Lisp file with the Emacs byte compiler always reads the +file as multibyte text, even if Emacs was started with @samp{--unibyte}, +unless the file specifies otherwise. This is so that compilation gives +results compatible with running the same file without compilation. +@xref{Loading Non-ASCII}. + + In general, any version of Emacs can run byte-compiled code produced +by recent earlier versions of Emacs, but the reverse is not true. + +@vindex no-byte-compile + If you do not want a Lisp file to be compiled, ever, put a file-local +variable binding for @code{no-byte-compile} into it, like this: + +@example +;; -*-no-byte-compile: t; -*- +@end example + + @xref{Compilation Errors}, for how to investigate errors occurring in +byte compilation. + +@menu +* Speed of Byte-Code:: An example of speedup from byte compilation. +* Compilation Functions:: Byte compilation functions. +* Docs and Compilation:: Dynamic loading of documentation strings. +* Dynamic Loading:: Dynamic loading of individual functions. +* Eval During Compile:: Code to be evaluated when you compile. +* Compiler Errors:: Handling compiler error messages. +* Byte-Code Objects:: The data type used for byte-compiled functions. +* Disassembly:: Disassembling byte-code; how to read byte-code. +@end menu + +@node Speed of Byte-Code +@section Performance of Byte-Compiled Code + + A byte-compiled function is not as efficient as a primitive function +written in C, but runs much faster than the version written in Lisp. +Here is an example: + +@example +@group +(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)))) +@result{} silly-loop +@end group + +@group +(silly-loop 100000) +@result{} ("Fri Mar 18 17:25:57 1994" + "Fri Mar 18 17:26:28 1994") ; @r{31 seconds} +@end group + +@group +(byte-compile 'silly-loop) +@result{} @r{[Compiled code not shown]} +@end group + +@group +(silly-loop 100000) +@result{} ("Fri Mar 18 17:26:52 1994" + "Fri Mar 18 17:26:58 1994") ; @r{6 seconds} +@end group +@end example + + In this example, the interpreted code required 31 seconds to run, +whereas the byte-compiled code required 6 seconds. These results are +representative, but actual results will vary greatly. + +@node Compilation Functions +@comment node-name, next, previous, up +@section The Compilation Functions +@cindex compilation functions + + You can byte-compile an individual function or macro definition with +the @code{byte-compile} function. You can compile a whole file with +@code{byte-compile-file}, or several files with +@code{byte-recompile-directory} or @code{batch-byte-compile}. + + The byte compiler produces error messages and warnings about each file +in a buffer called @samp{*Compile-Log*}. These report things in your +program that suggest a problem but are not necessarily erroneous. + +@cindex macro compilation + Be careful when writing macro calls in files that you may someday +byte-compile. Macro calls are expanded when they are compiled, so the +macros must already be defined for proper compilation. For more +details, see @ref{Compiling Macros}. If a program does not work the +same way when compiled as it does when interpreted, erroneous macro +definitions are one likely cause (@pxref{Problems with Macros}). +Inline (@code{defsubst}) functions are less troublesome; if you +compile a call to such a function before its definition is known, the +call will still work right, it will just run slower. + + Normally, compiling a file does not evaluate the file's contents or +load the file. But it does execute any @code{require} calls at top +level in the file. One way to ensure that necessary macro definitions +are available during compilation is to require the file that defines +them (@pxref{Named Features}). To avoid loading the macro definition files +when someone @emph{runs} the compiled program, write +@code{eval-when-compile} around the @code{require} calls (@pxref{Eval +During Compile}). + +@defun byte-compile symbol +This function byte-compiles the function definition of @var{symbol}, +replacing the previous definition with the compiled one. The function +definition of @var{symbol} must be the actual code for the function; +i.e., the compiler does not follow indirection to another symbol. +@code{byte-compile} returns the new, compiled definition of +@var{symbol}. + + If @var{symbol}'s definition is a byte-code function object, +@code{byte-compile} does nothing and returns @code{nil}. Lisp records +only one function definition for any symbol, and if that is already +compiled, non-compiled code is not available anywhere. So there is no +way to ``compile the same definition again.'' + +@example +@group +(defun factorial (integer) + "Compute factorial of INTEGER." + (if (= 1 integer) 1 + (* integer (factorial (1- integer))))) +@result{} factorial +@end group + +@group +(byte-compile 'factorial) +@result{} +#[(integer) + "^H\301U\203^H^@@\301\207\302^H\303^HS!\"\207" + [integer 1 * factorial] + 4 "Compute factorial of INTEGER."] +@end group +@end example + +@noindent +The result is a byte-code function object. The string it contains is +the actual byte-code; each character in it is an instruction or an +operand of 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. + +If the argument to @code{byte-compile} is a @code{lambda} expression, +it returns the corresponding compiled code, but does not store +it anywhere. +@end defun + +@deffn Command compile-defun &optional arg +This command reads the defun containing point, compiles it, and +evaluates the result. If you use this on a defun that is actually a +function definition, the effect is to install a compiled version of that +function. + +@code{compile-defun} normally displays the result of evaluation in the +echo area, but if @var{arg} is non-@code{nil}, it inserts the result +in the current buffer after the form it compiled. +@end deffn + +@deffn Command byte-compile-file filename &optional load +This function compiles a file of Lisp code named @var{filename} into a +file of byte-code. The output file's name is made by changing the +@samp{.el} suffix into @samp{.elc}; if @var{filename} does not end in +@samp{.el}, it adds @samp{.elc} to the end of @var{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 batched together, then each +batch is compiled, and written so that its compiled code will be +executed when the file is read. All comments are discarded when the +input file is read. + +This command returns @code{t} if there were no errors and @code{nil} +otherwise. When called interactively, it prompts for the file name. + +If @var{load} is non-@code{nil}, this command loads the compiled file +after compiling it. Interactively, @var{load} is the prefix argument. + +@example +@group +% ls -l push* +-rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el +@end group + +@group +(byte-compile-file "~/emacs/push.el") + @result{} t +@end group + +@group +% 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 +@end group +@end example +@end deffn + +@deffn Command byte-recompile-directory directory &optional flag force +@cindex library compilation +This command recompiles every @samp{.el} file in @var{directory} (or +its subdirectories) that needs recompilation. A file needs +recompilation if a @samp{.elc} file exists but is older than the +@samp{.el} file. + +When a @samp{.el} file has no corresponding @samp{.elc} file, +@var{flag} says what to do. If it is @code{nil}, this command ignores +these files. If @var{flag} is 0, it compiles them. If it is neither +@code{nil} nor 0, it asks the user whether to compile each such file, +and asks about each subdirectory as well. + +Interactively, @code{byte-recompile-directory} prompts for +@var{directory} and @var{flag} is the prefix argument. + +If @var{force} is non-@code{nil}, this command recompiles every +@samp{.el} file that has a @samp{.elc} file. + +The returned value is unpredictable. +@end deffn + +@defun batch-byte-compile &optional noforce +This function runs @code{byte-compile-file} on files specified on the +command line. This function must be used only in a batch execution of +Emacs, as it kills Emacs on completion. An error in one file does not +prevent processing of subsequent files, but no output file will be +generated for it, and the Emacs process will terminate with a nonzero +status code. + +If @var{noforce} is non-@code{nil}, this function does not recompile +files that have an up-to-date @samp{.elc} file. + +@example +% emacs -batch -f batch-byte-compile *.el +@end example +@end defun + +@defun byte-code code-string data-vector max-stack +@cindex byte-code interpreter +This function actually interprets byte-code. A byte-compiled function +is actually defined with a body that calls @code{byte-code}. Don't call +this function yourself---only the byte compiler knows how to generate +valid calls to this function. + +In Emacs version 18, byte-code was always executed by way of a call to +the function @code{byte-code}. Nowadays, byte-code is usually executed +as part of a byte-code function object, and only rarely through an +explicit call to @code{byte-code}. +@end defun + +@node Docs and Compilation +@section Documentation Strings and Compilation +@cindex dynamic loading of documentation + + Functions and variables loaded from a byte-compiled file access their +documentation strings dynamically from the file whenever needed. This +saves space within Emacs, and makes loading faster because the +documentation strings themselves need not be processed while loading the +file. Actual access to the documentation strings becomes slower as a +result, but this normally is not enough to bother users. + + Dynamic access to documentation strings does have drawbacks: + +@itemize @bullet +@item +If you delete or move the compiled file after loading it, Emacs can no +longer access the documentation strings for the functions and variables +in the file. + +@item +If you alter the compiled file (such as by compiling a new version), +then further access to documentation strings in this file will +probably give nonsense results. +@end itemize + + If your site installs Emacs following the usual procedures, these +problems will never normally occur. Installing a new version uses a new +directory with a different name; as long as the old version remains +installed, its files will remain unmodified in the places where they are +expected to be. + + However, if you have built Emacs yourself and use it from the +directory where you built it, you will experience this problem +occasionally if you edit and recompile Lisp files. When it happens, you +can cure the problem by reloading the file after recompiling it. + + You can turn off this feature at compile time by setting +@code{byte-compile-dynamic-docstrings} to @code{nil}; this is useful +mainly if you expect to change the file, and you want Emacs processes +that have already loaded it to keep working when the file changes. +You can do this globally, or for one source file by specifying a +file-local binding for the variable. One way to do that is by adding +this string to the file's first line: + +@example +-*-byte-compile-dynamic-docstrings: nil;-*- +@end example + +@defvar byte-compile-dynamic-docstrings +If this is non-@code{nil}, the byte compiler generates compiled files +that are set up for dynamic loading of documentation strings. +@end defvar + +@cindex @samp{#@@@var{count}} +@cindex @samp{#$} + The dynamic documentation string feature writes compiled files that +use a special Lisp reader construct, @samp{#@@@var{count}}. This +construct skips the next @var{count} characters. It also uses the +@samp{#$} construct, which stands for ``the name of this file, as a +string.'' It is usually best not to use these constructs in Lisp source +files, since they are not designed to be clear to humans reading the +file. + +@node Dynamic Loading +@section Dynamic Loading of Individual Functions + +@cindex dynamic loading of functions +@cindex lazy loading + When you compile a file, you can optionally enable the @dfn{dynamic +function loading} feature (also known as @dfn{lazy loading}). With +dynamic function loading, loading the file doesn't fully read the +function definitions in the file. Instead, each function definition +contains a place-holder which refers to the file. The first time each +function is called, it reads the full definition from the file, to +replace the place-holder. + + The advantage of dynamic function loading is that loading the file +becomes much faster. This is a good thing for a file which contains +many separate user-callable functions, if using one of them does not +imply you will probably also use the rest. A specialized mode which +provides many keyboard commands often has that usage pattern: a user may +invoke the mode, but use only a few of the commands it provides. + + The dynamic loading feature has certain disadvantages: + +@itemize @bullet +@item +If you delete or move the compiled file after loading it, Emacs can no +longer load the remaining function definitions not already loaded. + +@item +If you alter the compiled file (such as by compiling a new version), +then trying to load any function not already loaded will usually yield +nonsense results. +@end itemize + + These problems will never happen in normal circumstances with +installed Emacs files. But they are quite likely to happen with Lisp +files that you are changing. The easiest way to prevent these problems +is to reload the new compiled file immediately after each recompilation. + + The byte compiler uses the dynamic function loading feature if the +variable @code{byte-compile-dynamic} is non-@code{nil} at compilation +time. Do not set this variable globally, since dynamic loading is +desirable only for certain files. Instead, enable the feature for +specific source files with file-local variable bindings. For example, +you could do it by writing this text in the source file's first line: + +@example +-*-byte-compile-dynamic: t;-*- +@end example + +@defvar byte-compile-dynamic +If this is non-@code{nil}, the byte compiler generates compiled files +that are set up for dynamic function loading. +@end defvar + +@defun fetch-bytecode function +If @var{function} is a byte-code function object, this immediately +finishes loading the byte code of @var{function} from its +byte-compiled file, if it is not fully loaded already. Otherwise, +it does nothing. It always returns @var{function}. +@end defun + +@node Eval During Compile +@section Evaluation During Compilation + + These features permit you to write code to be evaluated during +compilation of a program. + +@defspec eval-and-compile body@dots{} +This form marks @var{body} to be evaluated both when you compile the +containing code and when you run it (whether compiled or not). + +You can get a similar result by putting @var{body} in a separate file +and referring to that file with @code{require}. That method is +preferable when @var{body} is large. Effectively @code{require} is +automatically @code{eval-and-compile}, the package is loaded both when +compiling and executing. + +@code{autoload} is also effectively @code{eval-and-compile} too. It's +recognized when compiling, so uses of such a function don't produce +``not known to be defined'' warnings. + +Most uses of @code{eval-and-compile} are fairly sophisticated. + +If a macro has a helper function to build its result, and that macro +is used both locally and outside the package, then +@code{eval-and-compile} should be used to get the helper both when +compiling and then later when running. + +If functions are defined programmatically (with @code{fset} say), then +@code{eval-and-compile} can be used to have that done at compile-time +as well as run-time, so calls to those functions are checked (and +warnings about ``not known to be defined'' suppressed). +@end defspec + +@defspec eval-when-compile body@dots{} +This form marks @var{body} to be evaluated at compile time but not when +the compiled program is loaded. The result of evaluation by the +compiler becomes a constant which appears in the compiled program. If +you load the source file, rather than compiling it, @var{body} is +evaluated normally. + +@cindex compile-time constant +If you have a constant that needs some calculation to produce, +@code{eval-when-compile} can do that at compile-time. For example, + +@lisp +(defvar my-regexp + (eval-when-compile (regexp-opt '("aaa" "aba" "abb")))) +@end lisp + +@cindex macros, at compile time +If you're using another package, but only need macros from it (the +byte compiler will expand those), then @code{eval-when-compile} can be +used to load it for compiling, but not executing. For example, + +@lisp +(eval-when-compile + (require 'my-macro-package)) ;; only macros needed from this +@end lisp + +The same sort of thing goes for macros and @code{defsubst} functions +defined locally and only for use within the file. They are needed for +compiling the file, but in most cases they are not needed for +execution of the compiled file. For example, + +@lisp +(eval-when-compile + (unless (fboundp 'some-new-thing) + (defmacro 'some-new-thing () + (compatibility code)))) +@end lisp + +@noindent +This is often good for code that's only a fallback for compatibility +with other versions of Emacs. + +@strong{Common Lisp Note:} At top level, @code{eval-when-compile} is analogous to the Common +Lisp idiom @code{(eval-when (compile eval) @dots{})}. Elsewhere, the +Common Lisp @samp{#.} reader macro (but not when interpreting) is closer +to what @code{eval-when-compile} does. +@end defspec + +@node Compiler Errors +@section Compiler Errors +@cindex compiler errors + + Byte compilation outputs all errors and warnings into the buffer +@samp{*Compile-Log*}. The messages include file names and line +numbers that identify the location of the problem. The usual Emacs +commands for operating on compiler diagnostics work properly on +these messages. + + However, the warnings about functions that were used but not +defined are always ``located'' at the end of the file, so these +commands won't find the places they are really used. To do that, +you must search for the function names. + + You can suppress the compiler warning for calling an undefined +function @var{func} by conditionalizing the function call on an +@code{fboundp} test, like this: + +@example +(if (fboundp '@var{func}) ...(@var{func} ...)...) +@end example + +@noindent +The call to @var{func} must be in the @var{then-form} of the +@code{if}, and @var{func} must appear quoted in the call to +@code{fboundp}. (This feature operates for @code{cond} as well.) + + Likewise, you can suppress a compiler warning for an unbound variable +@var{variable} by conditionalizing its use on a @code{boundp} test, +like this: + +@example +(if (boundp '@var{variable}) ...@var{variable}...) +@end example + +@noindent +The reference to @var{variable} must be in the @var{then-form} of the +@code{if}, and @var{variable} must appear quoted in the call to +@code{boundp}. + + You can suppress any compiler warnings using the construct +@code{with-no-warnings}: + +@c This is implemented with a defun, but conceptually it is +@c a special form. + +@defspec with-no-warnings body@dots{} +In execution, this is equivalent to @code{(progn @var{body}...)}, +but the compiler does not issue warnings for anything that occurs +inside @var{body}. + +We recommend that you use this construct around the smallest +possible piece of code. +@end defspec + +@node Byte-Code Objects +@section Byte-Code Function Objects +@cindex compiled function +@cindex byte-code function + + Byte-compiled functions have a special data type: they are +@dfn{byte-code function objects}. + + Internally, a byte-code function object is much like a vector; +however, the evaluator handles this data type specially when it appears +as a function to be called. The printed representation for a byte-code +function object is like that for a vector, with an additional @samp{#} +before the opening @samp{[}. + + A byte-code function object must have at least four elements; there is +no maximum number, but only the first six elements have any normal use. +They are: + +@table @var +@item arglist +The list of argument symbols. + +@item byte-code +The string containing the byte-code instructions. + +@item constants +The vector of Lisp objects referenced by the byte code. These include +symbols used as function names and variable names. + +@item stacksize +The maximum stack size this function needs. + +@item docstring +The documentation string (if any); otherwise, @code{nil}. The value may +be a number or a list, in case the documentation string is stored in a +file. Use the function @code{documentation} to get the real +documentation string (@pxref{Accessing Documentation}). + +@item interactive +The interactive spec (if any). This can be a string or a Lisp +expression. It is @code{nil} for a function that isn't interactive. +@end table + +Here's an example of a byte-code function object, in printed +representation. It is the definition of the command +@code{backward-sexp}. + +@example +#[(&optional arg) + "^H\204^F^@@\301^P\302^H[!\207" + [arg 1 forward-sexp] + 2 + 254435 + "p"] +@end example + + The primitive way to create a byte-code object is with +@code{make-byte-code}: + +@defun make-byte-code &rest elements +This function constructs and returns a byte-code function object +with @var{elements} as its elements. +@end defun + + You should not try to come up with the elements for a byte-code +function yourself, because if they are inconsistent, Emacs may crash +when you call the function. Always leave it to the byte compiler to +create these objects; it makes the elements consistent (we hope). + + You can access the elements of a byte-code object using @code{aref}; +you can also use @code{vconcat} to create a vector with the same +elements. + +@node Disassembly +@section Disassembled Byte-Code +@cindex 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. +It pushes values onto a stack of its own, then pops them off to use them +in calculations whose results are themselves pushed back on the stack. +When a byte-code function returns, it pops a value off the stack and +returns it as the value of the function. + + In addition to the stack, byte-code functions can use, bind, and set +ordinary Lisp variables, by transferring values between variables and +the stack. + +@deffn Command disassemble object &optional buffer-or-name +This command displays the disassembled code for @var{object}. In +interactive use, or if @var{buffer-or-name} is @code{nil} or omitted, +the output goes in a buffer named @samp{*Disassemble*}. If +@var{buffer-or-name} is non-@code{nil}, it must be a buffer or the +name of an existing buffer. Then the output goes there, at point, and +point is left before the output. + +The argument @var{object} can be a function name, a lambda expression +or a byte-code object. If it is a lambda expression, @code{disassemble} +compiles it and disassembles the resulting compiled code. +@end deffn + + Here are two examples of using the @code{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 @code{disassemble}. +These examples show unoptimized byte-code. Nowadays byte-code is +usually optimized, but we did not want to rewrite these examples, since +they still serve their purpose. + +@example +@group +(defun factorial (integer) + "Compute factorial of an integer." + (if (= 1 integer) 1 + (* integer (factorial (1- integer))))) + @result{} factorial +@end group + +@group +(factorial 4) + @result{} 24 +@end group + +@group +(disassemble 'factorial) + @print{} byte-code for factorial: + doc: Compute factorial of an integer. + args: (integer) +@end group + +@group +0 constant 1 ; @r{Push 1 onto stack.} + +1 varref integer ; @r{Get value of @code{integer}} + ; @r{from the environment} + ; @r{and push the value} + ; @r{onto the stack.} +@end group + +@group +2 eqlsign ; @r{Pop top two values off stack,} + ; @r{compare them,} + ; @r{and push result onto stack.} +@end group + +@group +3 goto-if-nil 10 ; @r{Pop and test top of stack;} + ; @r{if @code{nil}, go to 10,} + ; @r{else continue.} +@end group + +@group +6 constant 1 ; @r{Push 1 onto top of stack.} + +7 goto 17 ; @r{Go to 17 (in this case, 1 will be} + ; @r{returned by the function).} +@end group + +@group +10 constant * ; @r{Push symbol @code{*} onto stack.} + +11 varref integer ; @r{Push value of @code{integer} onto stack.} +@end group + +@group +12 constant factorial ; @r{Push @code{factorial} onto stack.} + +13 varref integer ; @r{Push value of @code{integer} onto stack.} + +14 sub1 ; @r{Pop @code{integer}, decrement value,} + ; @r{push new value onto stack.} +@end group + +@group + ; @r{Stack now contains:} + ; @minus{} @r{decremented value of @code{integer}} + ; @minus{} @r{@code{factorial}} + ; @minus{} @r{value of @code{integer}} + ; @minus{} @r{@code{*}} +@end group + +@group +15 call 1 ; @r{Call function @code{factorial} using} + ; @r{the first (i.e., the top) element} + ; @r{of the stack as the argument;} + ; @r{push returned value onto stack.} +@end group + +@group + ; @r{Stack now contains:} + ; @minus{} @r{result of recursive} + ; @r{call to @code{factorial}} + ; @minus{} @r{value of @code{integer}} + ; @minus{} @r{@code{*}} +@end group + +@group +16 call 2 ; @r{Using the first two} + ; @r{(i.e., the top two)} + ; @r{elements of the stack} + ; @r{as arguments,} + ; @r{call the function @code{*},} + ; @r{pushing the result onto the stack.} +@end group + +@group +17 return ; @r{Return the top element} + ; @r{of the stack.} + @result{} nil +@end group +@end example + +The @code{silly-loop} function is somewhat more complex: + +@example +@group +(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)))) + @result{} silly-loop +@end group + +@group +(disassemble 'silly-loop) + @print{} byte-code for silly-loop: + doc: Return time before and after N iterations of a loop. + args: (n) + +0 constant current-time-string ; @r{Push} + ; @r{@code{current-time-string}} + ; @r{onto top of stack.} +@end group + +@group +1 call 0 ; @r{Call @code{current-time-string}} + ; @r{ with no argument,} + ; @r{ pushing result onto stack.} +@end group + +@group +2 varbind t1 ; @r{Pop stack and bind @code{t1}} + ; @r{to popped value.} +@end group + +@group +3 varref n ; @r{Get value of @code{n} from} + ; @r{the environment and push} + ; @r{the value onto the stack.} +@end group + +@group +4 sub1 ; @r{Subtract 1 from top of stack.} +@end group + +@group +5 dup ; @r{Duplicate the top of the stack;} + ; @r{i.e., copy the top of} + ; @r{the stack and push the} + ; @r{copy onto the stack.} +@end group + +@group +6 varset n ; @r{Pop the top of the stack,} + ; @r{and bind @code{n} to the value.} + + ; @r{In effect, the sequence @code{dup varset}} + ; @r{copies the top of the stack} + ; @r{into the value of @code{n}} + ; @r{without popping it.} +@end group + +@group +7 constant 0 ; @r{Push 0 onto stack.} +@end group + +@group +8 gtr ; @r{Pop top two values off stack,} + ; @r{test if @var{n} is greater than 0} + ; @r{and push result onto stack.} +@end group + +@group +9 goto-if-nil-else-pop 17 ; @r{Goto 17 if @code{n} <= 0} + ; @r{(this exits the while loop).} + ; @r{else pop top of stack} + ; @r{and continue} +@end group + +@group +12 constant nil ; @r{Push @code{nil} onto stack} + ; @r{(this is the body of the loop).} +@end group + +@group +13 discard ; @r{Discard result of the body} + ; @r{of the loop (a while loop} + ; @r{is always evaluated for} + ; @r{its side effects).} +@end group + +@group +14 goto 3 ; @r{Jump back to beginning} + ; @r{of while loop.} +@end group + +@group +17 discard ; @r{Discard result of while loop} + ; @r{by popping top of stack.} + ; @r{This result is the value @code{nil} that} + ; @r{was not popped by the goto at 9.} +@end group + +@group +18 varref t1 ; @r{Push value of @code{t1} onto stack.} +@end group + +@group +19 constant current-time-string ; @r{Push} + ; @r{@code{current-time-string}} + ; @r{onto top of stack.} +@end group + +@group +20 call 0 ; @r{Call @code{current-time-string} again.} +@end group + +@group +21 list2 ; @r{Pop top two elements off stack,} + ; @r{create a list of them,} + ; @r{and push list onto stack.} +@end group + +@group +22 unbind 1 ; @r{Unbind @code{t1} in local environment.} + +23 return ; @r{Return value of the top of stack.} + + @result{} nil +@end group +@end example + + +@ignore + arch-tag: f78e3050-2f0a-4dee-be27-d9979a0a2289 +@end ignore diff --git a/doc/lispref/configure b/doc/lispref/configure new file mode 100755 index 00000000000..7f67f08dfa3 --- /dev/null +++ b/doc/lispref/configure @@ -0,0 +1,775 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=elisp.texi + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS <<EOF +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS <<EOF + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <<EOF + +CONFIG_FILES=\${CONFIG_FILES-"Makefile"} +EOF +cat >> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +EOF +cat >> $CONFIG_STATUS <<EOF + +EOF +cat >> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/doc/lispref/configure.in b/doc/lispref/configure.in new file mode 100644 index 00000000000..7db2f8cab5e --- /dev/null +++ b/doc/lispref/configure.in @@ -0,0 +1,7 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(elisp.texi) +AC_OUTPUT(Makefile) + +m4_if(dnl Do not change this comment + arch-tag: 61db4227-0d2b-4c4d-ad54-ca9a1ee518ea +)dnl diff --git a/doc/lispref/control.texi b/doc/lispref/control.texi new file mode 100644 index 00000000000..e99a6329f3e --- /dev/null +++ b/doc/lispref/control.texi @@ -0,0 +1,1291 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, 2002, +@c 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/control +@node Control Structures, Variables, Evaluation, Top +@chapter Control Structures +@cindex special forms for control structures +@cindex control structures + + A Lisp program consists of expressions or @dfn{forms} (@pxref{Forms}). +We control the order of execution of these forms by enclosing them in +@dfn{control structures}. Control structures are special forms which +control when, whether, or how many times to execute the forms they +contain. + + The simplest order of execution is sequential execution: first form +@var{a}, then form @var{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 +written. We call this @dfn{textual order}. For example, if a function +body consists of two forms @var{a} and @var{b}, evaluation of the +function evaluates first @var{a} and then @var{b}. The result of +evaluating @var{b} becomes the value of the function. + + Explicit control structures make possible an order of execution other +than sequential. + + Emacs Lisp provides several kinds of control structure, including +other varieties of sequencing, conditionals, iteration, and (controlled) +jumps---all discussed below. The built-in control structures are +special forms since their subforms are not necessarily evaluated or not +evaluated sequentially. You can use macros to define your own control +structure constructs (@pxref{Macros}). + +@menu +* Sequencing:: Evaluation in textual order. +* Conditionals:: @code{if}, @code{cond}, @code{when}, @code{unless}. +* Combining Conditions:: @code{and}, @code{or}, @code{not}. +* Iteration:: @code{while} loops. +* Nonlocal Exits:: Jumping out of a sequence. +@end menu + +@node Sequencing +@section Sequencing + + Evaluating forms in the order they appear is the most common way +control passes from one form to another. In some contexts, such as in a +function body, this happens automatically. Elsewhere you must use a +control structure construct to do this: @code{progn}, the simplest +control construct of Lisp. + + A @code{progn} special form looks like this: + +@example +@group +(progn @var{a} @var{b} @var{c} @dots{}) +@end group +@end example + +@noindent +and it says to execute the forms @var{a}, @var{b}, @var{c}, and so on, in +that order. These forms are called the @dfn{body} of the @code{progn} form. +The value of the last form in the body becomes the value of the entire +@code{progn}. @code{(progn)} returns @code{nil}. + +@cindex implicit @code{progn} + In the early days of Lisp, @code{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 @code{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 @code{progn}'': +several forms are allowed just as in the body of an actual @code{progn}. +Many other control structures likewise contain an implicit @code{progn}. +As a result, @code{progn} is not used as much as it was many years ago. +It is needed now most often inside an @code{unwind-protect}, @code{and}, +@code{or}, or in the @var{then}-part of an @code{if}. + +@defspec progn forms@dots{} +This special form evaluates all of the @var{forms}, in textual +order, returning the result of the final form. + +@example +@group +(progn (print "The first form") + (print "The second form") + (print "The third form")) + @print{} "The first form" + @print{} "The second form" + @print{} "The third form" +@result{} "The third form" +@end group +@end example +@end defspec + + Two other control constructs likewise evaluate a series of forms but return +a different value: + +@defspec prog1 form1 forms@dots{} +This special form evaluates @var{form1} and all of the @var{forms}, in +textual order, returning the result of @var{form1}. + +@example +@group +(prog1 (print "The first form") + (print "The second form") + (print "The third form")) + @print{} "The first form" + @print{} "The second form" + @print{} "The third form" +@result{} "The first form" +@end group +@end example + +Here is a way to remove the first element from a list in the variable +@code{x}, then return the value of that former element: + +@example +(prog1 (car x) (setq x (cdr x))) +@end example +@end defspec + +@defspec prog2 form1 form2 forms@dots{} +This special form evaluates @var{form1}, @var{form2}, and all of the +following @var{forms}, in textual order, returning the result of +@var{form2}. + +@example +@group +(prog2 (print "The first form") + (print "The second form") + (print "The third form")) + @print{} "The first form" + @print{} "The second form" + @print{} "The third form" +@result{} "The second form" +@end group +@end example +@end defspec + +@node Conditionals +@section Conditionals +@cindex conditional evaluation + + Conditional control structures choose among alternatives. Emacs Lisp +has four conditional forms: @code{if}, which is much the same as in +other languages; @code{when} and @code{unless}, which are variants of +@code{if}; and @code{cond}, which is a generalized case statement. + +@defspec if condition then-form else-forms@dots{} +@code{if} chooses between the @var{then-form} and the @var{else-forms} +based on the value of @var{condition}. If the evaluated @var{condition} is +non-@code{nil}, @var{then-form} is evaluated and the result returned. +Otherwise, the @var{else-forms} are evaluated in textual order, and the +value of the last one is returned. (The @var{else} part of @code{if} is +an example of an implicit @code{progn}. @xref{Sequencing}.) + +If @var{condition} has the value @code{nil}, and no @var{else-forms} are +given, @code{if} returns @code{nil}. + +@code{if} is a special form because the branch that is not selected is +never evaluated---it is ignored. Thus, in the example below, +@code{true} is not printed because @code{print} is never called. + +@example +@group +(if nil + (print 'true) + 'very-false) +@result{} very-false +@end group +@end example +@end defspec + +@defmac when condition then-forms@dots{} +This is a variant of @code{if} where there are no @var{else-forms}, +and possibly several @var{then-forms}. In particular, + +@example +(when @var{condition} @var{a} @var{b} @var{c}) +@end example + +@noindent +is entirely equivalent to + +@example +(if @var{condition} (progn @var{a} @var{b} @var{c}) nil) +@end example +@end defmac + +@defmac unless condition forms@dots{} +This is a variant of @code{if} where there is no @var{then-form}: + +@example +(unless @var{condition} @var{a} @var{b} @var{c}) +@end example + +@noindent +is entirely equivalent to + +@example +(if @var{condition} nil + @var{a} @var{b} @var{c}) +@end example +@end defmac + +@defspec cond clause@dots{} +@code{cond} chooses among an arbitrary number of alternatives. Each +@var{clause} in the @code{cond} must be a list. The @sc{car} of this +list is the @var{condition}; the remaining elements, if any, the +@var{body-forms}. Thus, a clause looks like this: + +@example +(@var{condition} @var{body-forms}@dots{}) +@end example + +@code{cond} tries the clauses in textual order, by evaluating the +@var{condition} of each clause. If the value of @var{condition} is +non-@code{nil}, the clause ``succeeds''; then @code{cond} evaluates its +@var{body-forms}, and the value of the last of @var{body-forms} becomes +the value of the @code{cond}. The remaining clauses are ignored. + +If the value of @var{condition} is @code{nil}, the clause ``fails,'' so +the @code{cond} moves on to the following clause, trying its +@var{condition}. + +If every @var{condition} evaluates to @code{nil}, so that every clause +fails, @code{cond} returns @code{nil}. + +A clause may also look like this: + +@example +(@var{condition}) +@end example + +@noindent +Then, if @var{condition} is non-@code{nil} when tested, the value of +@var{condition} becomes the value of the @code{cond} form. + +The following example has four clauses, which test for the cases where +the value of @code{x} is a number, string, buffer and symbol, +respectively: + +@example +@group +(cond ((numberp x) x) + ((stringp x) x) + ((bufferp x) + (setq temporary-hack x) ; @r{multiple body-forms} + (buffer-name x)) ; @r{in one clause} + ((symbolp x) (symbol-value x))) +@end group +@end example + +Often we want to execute the last clause whenever none of the previous +clauses was successful. To do this, we use @code{t} as the +@var{condition} of the last clause, like this: @code{(t +@var{body-forms})}. The form @code{t} evaluates to @code{t}, which is +never @code{nil}, so this clause never fails, provided the @code{cond} +gets to it at all. + +For example, + +@example +@group +(setq a 5) +(cond ((eq a 'hack) 'foo) + (t "default")) +@result{} "default" +@end group +@end example + +@noindent +This @code{cond} expression returns @code{foo} if the value of @code{a} +is @code{hack}, and returns the string @code{"default"} otherwise. +@end defspec + +Any conditional construct can be expressed with @code{cond} or with +@code{if}. Therefore, the choice between them is a matter of style. +For example: + +@example +@group +(if @var{a} @var{b} @var{c}) +@equiv{} +(cond (@var{a} @var{b}) (t @var{c})) +@end group +@end example + +@node Combining Conditions +@section Constructs for Combining Conditions + + This section describes three constructs that are often used together +with @code{if} and @code{cond} to express complicated conditions. The +constructs @code{and} and @code{or} can also be used individually as +kinds of multiple conditional constructs. + +@defun not condition +This function tests for the falsehood of @var{condition}. It returns +@code{t} if @var{condition} is @code{nil}, and @code{nil} otherwise. +The function @code{not} is identical to @code{null}, and we recommend +using the name @code{null} if you are testing for an empty list. +@end defun + +@defspec and conditions@dots{} +The @code{and} special form tests whether all the @var{conditions} are +true. It works by evaluating the @var{conditions} one by one in the +order written. + +If any of the @var{conditions} evaluates to @code{nil}, then the result +of the @code{and} must be @code{nil} regardless of the remaining +@var{conditions}; so @code{and} returns @code{nil} right away, ignoring +the remaining @var{conditions}. + +If all the @var{conditions} turn out non-@code{nil}, then the value of +the last of them becomes the value of the @code{and} form. Just +@code{(and)}, with no @var{conditions}, returns @code{t}, appropriate +because all the @var{conditions} turned out non-@code{nil}. (Think +about it; which one did not?) + +Here is an example. The first condition returns the integer 1, which is +not @code{nil}. Similarly, the second condition returns the integer 2, +which is not @code{nil}. The third condition is @code{nil}, so the +remaining condition is never evaluated. + +@example +@group +(and (print 1) (print 2) nil (print 3)) + @print{} 1 + @print{} 2 +@result{} nil +@end group +@end example + +Here is a more realistic example of using @code{and}: + +@example +@group +(if (and (consp foo) (eq (car foo) 'x)) + (message "foo is a list starting with x")) +@end group +@end example + +@noindent +Note that @code{(car foo)} is not executed if @code{(consp foo)} returns +@code{nil}, thus avoiding an error. + +@code{and} expressions can also be written using either @code{if} or +@code{cond}. Here's how: + +@example +@group +(and @var{arg1} @var{arg2} @var{arg3}) +@equiv{} +(if @var{arg1} (if @var{arg2} @var{arg3})) +@equiv{} +(cond (@var{arg1} (cond (@var{arg2} @var{arg3})))) +@end group +@end example +@end defspec + +@defspec or conditions@dots{} +The @code{or} special form tests whether at least one of the +@var{conditions} is true. It works by evaluating all the +@var{conditions} one by one in the order written. + +If any of the @var{conditions} evaluates to a non-@code{nil} value, then +the result of the @code{or} must be non-@code{nil}; so @code{or} returns +right away, ignoring the remaining @var{conditions}. The value it +returns is the non-@code{nil} value of the condition just evaluated. + +If all the @var{conditions} turn out @code{nil}, then the @code{or} +expression returns @code{nil}. Just @code{(or)}, with no +@var{conditions}, returns @code{nil}, appropriate because all the +@var{conditions} turned out @code{nil}. (Think about it; which one +did not?) + +For example, this expression tests whether @code{x} is either +@code{nil} or the integer zero: + +@example +(or (eq x nil) (eq x 0)) +@end example + +Like the @code{and} construct, @code{or} can be written in terms of +@code{cond}. For example: + +@example +@group +(or @var{arg1} @var{arg2} @var{arg3}) +@equiv{} +(cond (@var{arg1}) + (@var{arg2}) + (@var{arg3})) +@end group +@end example + +You could almost write @code{or} in terms of @code{if}, but not quite: + +@example +@group +(if @var{arg1} @var{arg1} + (if @var{arg2} @var{arg2} + @var{arg3})) +@end group +@end example + +@noindent +This is not completely equivalent because it can evaluate @var{arg1} or +@var{arg2} twice. By contrast, @code{(or @var{arg1} @var{arg2} +@var{arg3})} never evaluates any argument more than once. +@end defspec + +@node Iteration +@section Iteration +@cindex iteration +@cindex recursion + + Iteration means executing part of a program repetitively. For +example, you might want to repeat some computation once for each element +of a list, or once for each integer from 0 to @var{n}. You can do this +in Emacs Lisp with the special form @code{while}: + +@defspec while condition forms@dots{} +@code{while} first evaluates @var{condition}. If the result is +non-@code{nil}, it evaluates @var{forms} in textual order. Then it +reevaluates @var{condition}, and if the result is non-@code{nil}, it +evaluates @var{forms} again. This process repeats until @var{condition} +evaluates to @code{nil}. + +There is no limit on the number of iterations that may occur. The loop +will continue until either @var{condition} evaluates to @code{nil} or +until an error or @code{throw} jumps out of it (@pxref{Nonlocal Exits}). + +The value of a @code{while} form is always @code{nil}. + +@example +@group +(setq num 0) + @result{} 0 +@end group +@group +(while (< num 4) + (princ (format "Iteration %d." num)) + (setq num (1+ num))) + @print{} Iteration 0. + @print{} Iteration 1. + @print{} Iteration 2. + @print{} Iteration 3. + @result{} nil +@end group +@end example + +To write a ``repeat...until'' loop, which will execute something on each +iteration and then do the end-test, put the body followed by the +end-test in a @code{progn} as the first argument of @code{while}, as +shown here: + +@example +@group +(while (progn + (forward-line 1) + (not (looking-at "^$")))) +@end group +@end example + +@noindent +This moves forward one line and continues moving by lines until it +reaches an empty line. It is peculiar in that the @code{while} has no +body, just the end test (which also does the real work of moving point). +@end defspec + + The @code{dolist} and @code{dotimes} macros provide convenient ways to +write two common kinds of loops. + +@defmac dolist (var list [result]) body@dots{} +This construct executes @var{body} once for each element of +@var{list}, binding the variable @var{var} locally to hold the current +element. Then it returns the value of evaluating @var{result}, or +@code{nil} if @var{result} is omitted. For example, here is how you +could use @code{dolist} to define the @code{reverse} function: + +@example +(defun reverse (list) + (let (value) + (dolist (elt list value) + (setq value (cons elt value))))) +@end example +@end defmac + +@defmac dotimes (var count [result]) body@dots{} +This construct executes @var{body} once for each integer from 0 +(inclusive) to @var{count} (exclusive), binding the variable @var{var} +to the integer for the current iteration. Then it returns the value +of evaluating @var{result}, or @code{nil} if @var{result} is omitted. +Here is an example of using @code{dotimes} to do something 100 times: + +@example +(dotimes (i 100) + (insert "I will not obey absurd orders\n")) +@end example +@end defmac + +@node Nonlocal Exits +@section Nonlocal Exits +@cindex nonlocal exits + + A @dfn{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. +Nonlocal exits unbind all variable bindings made by the constructs being +exited. + +@menu +* Catch and Throw:: Nonlocal exits for the program's own purposes. +* Examples of Catch:: Showing how such nonlocal exits can be written. +* Errors:: How errors are signaled and handled. +* Cleanups:: Arranging to run a cleanup form if an error happens. +@end menu + +@node Catch and Throw +@subsection Explicit Nonlocal Exits: @code{catch} and @code{throw} + + Most control constructs affect only the flow of control within the +construct itself. The function @code{throw} is the exception to this +rule of normal program execution: it performs a nonlocal exit on +request. (There are other exceptions, but they are for error handling +only.) @code{throw} is used inside a @code{catch}, and jumps back to +that @code{catch}. For example: + +@example +@group +(defun foo-outer () + (catch 'foo + (foo-inner))) + +(defun foo-inner () + @dots{} + (if x + (throw 'foo t)) + @dots{}) +@end group +@end example + +@noindent +The @code{throw} form, if executed, transfers control straight back to +the corresponding @code{catch}, which returns immediately. The code +following the @code{throw} is not executed. The second argument of +@code{throw} is used as the return value of the @code{catch}. + + The function @code{throw} finds the matching @code{catch} based on the +first argument: it searches for a @code{catch} whose first argument is +@code{eq} to the one specified in the @code{throw}. If there is more +than one applicable @code{catch}, the innermost one takes precedence. +Thus, in the above example, the @code{throw} specifies @code{foo}, and +the @code{catch} in @code{foo-outer} specifies the same symbol, so that +@code{catch} is the applicable one (assuming there is no other matching +@code{catch} in between). + + Executing @code{throw} exits all Lisp constructs up to the matching +@code{catch}, including function calls. When binding constructs such as +@code{let} or function calls are exited in this way, the bindings are +unbound, just as they are when these constructs exit normally +(@pxref{Local Variables}). Likewise, @code{throw} restores the buffer +and position saved by @code{save-excursion} (@pxref{Excursions}), and +the narrowing status saved by @code{save-restriction} and the window +selection saved by @code{save-window-excursion} (@pxref{Window +Configurations}). It also runs any cleanups established with the +@code{unwind-protect} special form when it exits that form +(@pxref{Cleanups}). + + The @code{throw} need not appear lexically within the @code{catch} +that it jumps to. It can equally well be called from another function +called within the @code{catch}. As long as the @code{throw} takes place +chronologically after entry to the @code{catch}, and chronologically +before exit from it, it has access to that @code{catch}. This is why +@code{throw} can be used in commands such as @code{exit-recursive-edit} +that throw back to the editor command loop (@pxref{Recursive Editing}). + +@cindex CL note---only @code{throw} in Emacs +@quotation +@b{Common Lisp note:} Most other versions of Lisp, including Common Lisp, +have several ways of transferring control nonsequentially: @code{return}, +@code{return-from}, and @code{go}, for example. Emacs Lisp has only +@code{throw}. +@end quotation + +@defspec catch tag body@dots{} +@cindex tag on run time stack +@code{catch} establishes a return point for the @code{throw} function. +The return point is distinguished from other such return points by +@var{tag}, which may be any Lisp object except @code{nil}. The argument +@var{tag} is evaluated normally before the return point is established. + +With the return point in effect, @code{catch} evaluates the forms of the +@var{body} in textual order. If the forms execute normally (without +error or nonlocal exit) the value of the last body form is returned from +the @code{catch}. + +If a @code{throw} is executed during the execution of @var{body}, +specifying the same value @var{tag}, the @code{catch} form exits +immediately; the value it returns is whatever was specified as the +second argument of @code{throw}. +@end defspec + +@defun throw tag value +The purpose of @code{throw} is to return from a return point previously +established with @code{catch}. The argument @var{tag} is used to choose +among the various existing return points; it must be @code{eq} to the value +specified in the @code{catch}. If multiple return points match @var{tag}, +the innermost one is used. + +The argument @var{value} is used as the value to return from that +@code{catch}. + +@kindex no-catch +If no return point is in effect with tag @var{tag}, then a @code{no-catch} +error is signaled with data @code{(@var{tag} @var{value})}. +@end defun + +@node Examples of Catch +@subsection Examples of @code{catch} and @code{throw} + + One way to use @code{catch} and @code{throw} is to exit from a doubly +nested loop. (In most languages, this would be done with a ``go to.'') +Here we compute @code{(foo @var{i} @var{j})} for @var{i} and @var{j} +varying from 0 to 9: + +@example +@group +(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)))))) +@end group +@end example + +@noindent +If @code{foo} ever returns non-@code{nil}, we stop immediately and return a +list of @var{i} and @var{j}. If @code{foo} always returns @code{nil}, the +@code{catch} returns normally, and the value is @code{nil}, since that +is the result of the @code{while}. + + Here are two tricky examples, slightly different, showing two +return points at once. First, two return points with the same tag, +@code{hack}: + +@example +@group +(defun catch2 (tag) + (catch tag + (throw 'hack 'yes))) +@result{} catch2 +@end group + +@group +(catch 'hack + (print (catch2 'hack)) + 'no) +@print{} yes +@result{} no +@end group +@end example + +@noindent +Since both return points have tags that match the @code{throw}, it goes to +the inner one, the one established in @code{catch2}. Therefore, +@code{catch2} returns normally with value @code{yes}, and this value is +printed. Finally the second body form in the outer @code{catch}, which is +@code{'no}, is evaluated and returned from the outer @code{catch}. + + Now let's change the argument given to @code{catch2}: + +@example +@group +(catch 'hack + (print (catch2 'quux)) + 'no) +@result{} yes +@end group +@end example + +@noindent +We still have two return points, but this time only the outer one has +the tag @code{hack}; the inner one has the tag @code{quux} instead. +Therefore, @code{throw} makes the outer @code{catch} return the value +@code{yes}. The function @code{print} is never called, and the +body-form @code{'no} is never evaluated. + +@node Errors +@subsection Errors +@cindex errors + + When Emacs Lisp attempts to evaluate a form that, for some reason, +cannot be evaluated, it @dfn{signals} an @dfn{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 @kbd{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 that should be deleted before +the program is finished. In such cases, you would use +@code{unwind-protect} to establish @dfn{cleanup expressions} to be +evaluated in case of error. (@xref{Cleanups}.) Occasionally, you may +wish the program to continue execution despite an error in a subroutine. +In these cases, you would use @code{condition-case} to establish +@dfn{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 @code{catch} and @code{throw} +instead. @xref{Catch and Throw}. + +@menu +* Signaling Errors:: How to report an error. +* Processing of Errors:: What Emacs does when you report an error. +* Handling Errors:: How you can trap errors and continue execution. +* Error Symbols:: How errors are classified for trapping them. +@end menu + +@node Signaling Errors +@subsubsection How to Signal an Error +@cindex signaling errors + + @dfn{Signaling} an error means beginning error processing. Error +processing normally aborts all or part of the running program and +returns to a point that is set up to handle the error +(@pxref{Processing of Errors}). Here we describe 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 +@sc{car} of an integer or move forward a character at the end of the +buffer. You can also signal errors explicitly with the functions +@code{error} and @code{signal}. + + Quitting, which happens when the user types @kbd{C-g}, is not +considered an error, but it is handled almost like an error. +@xref{Quitting}. + + Every error specifies an error message, one way or another. The +message should state what is wrong (``File does not exist''), not how +things ought to be (``File must exist''). The convention in Emacs +Lisp is that error messages should start with a capital letter, but +should not end with any sort of punctuation. + +@defun error format-string &rest args +This function signals an error with an error message constructed by +applying @code{format} (@pxref{Formatting Strings}) to +@var{format-string} and @var{args}. + +These examples show typical uses of @code{error}: + +@example +@group +(error "That is an error -- try something else") + @error{} That is an error -- try something else +@end group + +@group +(error "You have committed %d errors" 10) + @error{} You have committed 10 errors +@end group +@end example + +@code{error} works by calling @code{signal} with two arguments: the +error symbol @code{error}, and a list containing the string returned by +@code{format}. + +@strong{Warning:} If you want to use your own string as an error message +verbatim, don't just write @code{(error @var{string})}. If @var{string} +contains @samp{%}, it will be interpreted as a format specifier, with +undesirable results. Instead, use @code{(error "%s" @var{string})}. +@end defun + +@defun signal error-symbol data +@anchor{Definition of signal} +This function signals an error named by @var{error-symbol}. The +argument @var{data} is a list of additional Lisp objects relevant to +the circumstances of the error. + +The argument @var{error-symbol} must be an @dfn{error symbol}---a symbol +bearing a property @code{error-conditions} whose value is a list of +condition names. This is how Emacs Lisp classifies different sorts of +errors. @xref{Error Symbols}, for a description of error symbols, +error conditions and condition names. + +If the error is not handled, the two arguments are used in printing +the error message. Normally, this error message is provided by the +@code{error-message} property of @var{error-symbol}. If @var{data} is +non-@code{nil}, this is followed by a colon and a comma separated list +of the unevaluated elements of @var{data}. For @code{error}, the +error message is the @sc{car} of @var{data} (that must be a string). +Subcategories of @code{file-error} are handled specially. + +The number and significance of the objects in @var{data} depends on +@var{error-symbol}. For example, with a @code{wrong-type-arg} error, +there should be two objects in the list: a predicate that describes the type +that was expected, and the object that failed to fit that type. + +Both @var{error-symbol} and @var{data} are available to any error +handlers that handle the error: @code{condition-case} binds a local +variable to a list of the form @code{(@var{error-symbol} .@: +@var{data})} (@pxref{Handling Errors}). + +The function @code{signal} never returns (though in older Emacs versions +it could sometimes return). + +@smallexample +@group +(signal 'wrong-number-of-arguments '(x y)) + @error{} Wrong number of arguments: x, y +@end group + +@group +(signal 'no-such-error '("My unknown error condition")) + @error{} peculiar error: "My unknown error condition" +@end group +@end smallexample +@end defun + +@cindex CL note---no continuable errors +@quotation +@b{Common Lisp note:} Emacs Lisp has nothing like the Common Lisp +concept of continuable errors. +@end quotation + +@node Processing of Errors +@subsubsection How Emacs Processes Errors + +When an error is signaled, @code{signal} searches for an active +@dfn{handler} for the error. A handler is a sequence of Lisp +expressions designated to be executed if an error happens in part of the +Lisp program. If the error has an applicable handler, the handler is +executed, and control resumes following the handler. The handler +executes in the environment of the @code{condition-case} that +established it; all functions called within that @code{condition-case} +have already been exited, and the handler cannot return to them. + +If there is no applicable handler for the error, it terminates the +current command and returns control to the editor command loop. (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. You can use the variable +@code{command-error-function} to control how this is done: + +@defvar command-error-function +This variable, if non-@code{nil}, specifies a function to use to +handle errors that return control to the Emacs command loop. The +function should take three arguments: @var{data}, a list of the same +form that @code{condition-case} would bind to its variable; +@var{context}, a string describing the situation in which the error +occurred, or (more often) @code{nil}; and @var{caller}, the Lisp +function which called the primitive that signaled the error. +@end defvar + +@cindex @code{debug-on-error} use +An error that has no explicit handler may call the Lisp debugger. The +debugger is enabled if the variable @code{debug-on-error} (@pxref{Error +Debugging}) is non-@code{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. + +@node Handling Errors +@subsubsection Writing Code to Handle Errors +@cindex error handler +@cindex handling 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 +@code{condition-case}. A simple example looks like this: + +@example +@group +(condition-case nil + (delete-file filename) + (error nil)) +@end group +@end example + +@noindent +This deletes the file named @var{filename}, catching any error and +returning @code{nil} if an error occurs. + + The @code{condition-case} construct is often used to trap errors that +are predictable, such as failure to open a file in a call to +@code{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. + + The second argument of @code{condition-case} is called the +@dfn{protected form}. (In the example above, the protected form is a +call to @code{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 functions called by this form, in +their subroutines, and so on. This is a good thing, since, strictly +speaking, errors can be signaled only by Lisp primitives (including +@code{signal} and @code{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 @dfn{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, +@code{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 +@code{condition-case} forms offer to handle the same error, the inner of +the two gets to handle it. + + If an error is handled by some @code{condition-case} form, this +ordinarily prevents the debugger from being run, even if +@code{debug-on-error} says this error should invoke the debugger. + + If you want to be able to debug errors that are caught by a +@code{condition-case}, set the variable @code{debug-on-signal} to a +non-@code{nil} value. You can also specify that a particular handler +should let the debugger run first, by writing @code{debug} among the +conditions, like this: + +@example +@group +(condition-case nil + (delete-file filename) + ((debug error) nil)) +@end group +@end example + +@noindent +The effect of @code{debug} here is only to prevent +@code{condition-case} from suppressing the call to the debugger. Any +given error will invoke the debugger only if @code{debug-on-error} and +the other usual filtering mechanisms say it should. @xref{Error Debugging}. + + Once Emacs decides that a certain handler handles the error, it +returns control to that handler. To do so, Emacs unbinds all variable +bindings made by binding constructs that are being exited, and +executes the cleanups of all @code{unwind-protect} forms that are +being exited. Once control arrives at the handler, the body of the +handler executes normally. + + After execution of the handler body, execution returns from the +@code{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 @code{throw} and +@code{catch} (@pxref{Catch and Throw}), but they are entirely separate +facilities. An error cannot be caught by a @code{catch}, and a +@code{throw} cannot be handled by an error handler (though using +@code{throw} when there is no suitable @code{catch} signals an error +that can be handled). + +@defspec condition-case var protected-form handlers@dots{} +This special form establishes the error handlers @var{handlers} around +the execution of @var{protected-form}. If @var{protected-form} executes +without error, the value it returns becomes the value of the +@code{condition-case} form; in this case, the @code{condition-case} has +no effect. The @code{condition-case} form makes a difference when an +error occurs during @var{protected-form}. + +Each of the @var{handlers} is a list of the form @code{(@var{conditions} +@var{body}@dots{})}. Here @var{conditions} is an error condition name +to be handled, or a list of condition names (which can include @code{debug} +to allow the debugger to run before the handler); @var{body} is one or more +Lisp expressions to be executed when this handler handles an error. +Here are examples of handlers: + +@smallexample +@group +(error nil) + +(arith-error (message "Division by zero")) + +((arith-error file-error) + (message + "Either division by zero or failure to open a file")) +@end group +@end smallexample + +Each error that occurs has an @dfn{error symbol} that describes what +kind of error it is. The @code{error-conditions} property of this +symbol is a list of condition names (@pxref{Error Symbols}). Emacs +searches all the active @code{condition-case} forms for a handler that +specifies one or more of these condition names; the innermost matching +@code{condition-case} handles the error. Within this +@code{condition-case}, the first applicable handler handles the error. + +After executing the body of the handler, the @code{condition-case} +returns normally, using the value of the last form in the handler body +as the overall value. + +@cindex error description +The argument @var{var} is a variable. @code{condition-case} does not +bind this variable when executing the @var{protected-form}, only when it +handles an error. At that time, it binds @var{var} locally to an +@dfn{error description}, which is a list giving the particulars of the +error. The error description has the form @code{(@var{error-symbol} +. @var{data})}. 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 @var{data}---the third element of the +error description. + +If @var{var} is @code{nil}, that means no variable is bound. Then the +error symbol and associated data are not available to the handler. +@end defspec + +@defun error-message-string error-description +This function returns the error message string for a given error +descriptor. It is useful if you want to handle an error by printing the +usual error message for that error. @xref{Definition of signal}. +@end defun + +@cindex @code{arith-error} example +Here is an example of using @code{condition-case} to handle the error +that results from dividing by zero. The handler displays the error +message (but without a beep), then returns a very large number. + +@smallexample +@group +(defun safe-divide (dividend divisor) + (condition-case err + ;; @r{Protected form.} + (/ dividend divisor) +@end group +@group + ;; @r{The handler.} + (arith-error ; @r{Condition.} + ;; @r{Display the usual message for this error.} + (message "%s" (error-message-string err)) + 1000000))) +@result{} safe-divide +@end group + +@group +(safe-divide 5 0) + @print{} Arithmetic error: (arith-error) +@result{} 1000000 +@end group +@end smallexample + +@noindent +The handler specifies condition name @code{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 @code{condition-case}. Thus, + +@smallexample +@group +(safe-divide nil 3) + @error{} Wrong type argument: number-or-marker-p, nil +@end group +@end smallexample + + Here is a @code{condition-case} that catches all kinds of errors, +including those signaled with @code{error}: + +@smallexample +@group +(setq baz 34) + @result{} 34 +@end group + +@group +(condition-case err + (if (eq baz 35) + t + ;; @r{This is a call to the function @code{error}.} + (error "Rats! The variable %s was %s, not 35" 'baz baz)) + ;; @r{This is the handler; it is not a form.} + (error (princ (format "The error was: %s" err)) + 2)) +@print{} The error was: (error "Rats! The variable baz was 34, not 35") +@result{} 2 +@end group +@end smallexample + +@node Error Symbols +@subsubsection Error Symbols and Condition Names +@cindex error symbol +@cindex error name +@cindex condition name +@cindex user-defined error +@kindex error-conditions + + When you signal an error, you specify an @dfn{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 Emacs Lisp language. + + These narrow classifications are grouped into a hierarchy of wider +classes called @dfn{error conditions}, identified by @dfn{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 +@code{error} which takes in all kinds of errors (but not @code{quit}). +Thus, each error has one or more condition names: @code{error}, the +error symbol if that is distinct from @code{error}, and perhaps some +intermediate classifications. + + In order for a symbol to be an error symbol, it must have an +@code{error-conditions} property which gives a list of condition names. +This list defines the conditions that this kind of error belongs to. +(The error symbol itself, and the symbol @code{error}, should always be +members of this list.) Thus, the hierarchy of condition names is +defined by the @code{error-conditions} properties of the error symbols. +Because quitting is not considered an error, the value of the +@code{error-conditions} property of @code{quit} is just @code{(quit)}. + +@cindex peculiar error + In addition to the @code{error-conditions} list, the error symbol +should have an @code{error-message} property whose value is a string to +be printed when that error is signaled but not handled. If the +error symbol has no @code{error-message} property or if the +@code{error-message} property exists, but is not a string, the error +message @samp{peculiar error} is used. @xref{Definition of signal}. + + Here is how we define a new error symbol, @code{new-error}: + +@example +@group +(put 'new-error + 'error-conditions + '(error my-own-errors new-error)) +@result{} (error my-own-errors new-error) +@end group +@group +(put 'new-error 'error-message "A new error") +@result{} "A new error" +@end group +@end example + +@noindent +This error has three condition names: @code{new-error}, the narrowest +classification; @code{my-own-errors}, which we imagine is a wider +classification; and @code{error}, which is the widest of all. + + The error string should start with a capital letter but it should +not end with a period. This is for consistency with the rest of Emacs. + + Naturally, Emacs will never signal @code{new-error} on its own; only +an explicit call to @code{signal} (@pxref{Definition of signal}) in +your code can do this: + +@example +@group +(signal 'new-error '(x y)) + @error{} A new error: x, y +@end group +@end example + + This error can be handled through any of the three condition names. +This example handles @code{new-error} and any other errors in the class +@code{my-own-errors}: + +@example +@group +(condition-case foo + (bar nil t) + (my-own-errors nil)) +@end group +@end example + + 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. It would be cumbersome to give +@code{signal} a list of condition names rather than one error symbol. + + By contrast, using only error symbols without condition names would +seriously decrease the power of @code{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. + + @xref{Standard Errors}, for a list of all the standard error symbols +and their conditions. + +@node Cleanups +@subsection Cleaning Up from Nonlocal Exits + + The @code{unwind-protect} construct is essential whenever you +temporarily put a data structure in an inconsistent state; it permits +you to make the data consistent again in the event of an error or +throw. (Another more specific cleanup construct that is used only for +changes in buffer contents is the atomic change group; @ref{Atomic +Changes}.) + +@defspec unwind-protect body-form cleanup-forms@dots{} +@cindex cleanup forms +@cindex protected forms +@cindex error cleanup +@cindex unwinding +@code{unwind-protect} executes @var{body-form} with a guarantee that +the @var{cleanup-forms} will be evaluated if control leaves +@var{body-form}, no matter how that happens. @var{body-form} may +complete normally, or execute a @code{throw} out of the +@code{unwind-protect}, or cause an error; in all cases, the +@var{cleanup-forms} will be evaluated. + +If @var{body-form} finishes normally, @code{unwind-protect} returns the +value of @var{body-form}, after it evaluates the @var{cleanup-forms}. +If @var{body-form} does not finish, @code{unwind-protect} does not +return any value in the normal sense. + +Only @var{body-form} is protected by the @code{unwind-protect}. If any +of the @var{cleanup-forms} themselves exits nonlocally (via a +@code{throw} or an error), @code{unwind-protect} is @emph{not} +guaranteed to evaluate the rest of them. If the failure of one of the +@var{cleanup-forms} has the potential to cause trouble, then protect +it with another @code{unwind-protect} around that form. + +The number of currently active @code{unwind-protect} forms counts, +together with the number of local variable bindings, against the limit +@code{max-specpdl-size} (@pxref{Definition of max-specpdl-size,, Local +Variables}). +@end defspec + + For example, here we make an invisible buffer for temporary use, and +make sure to kill it before finishing: + +@smallexample +@group +(save-excursion + (let ((buffer (get-buffer-create " *temp*"))) + (set-buffer buffer) + (unwind-protect + @var{body-form} + (kill-buffer buffer)))) +@end group +@end smallexample + +@noindent +You might think that we could just as well write @code{(kill-buffer +(current-buffer))} and dispense with the variable @code{buffer}. +However, the way shown above is safer, if @var{body-form} happens to +get an error after switching to a different buffer! (Alternatively, +you could write another @code{save-excursion} around @var{body-form}, +to ensure that the temporary buffer becomes current again in time to +kill it.) + + Emacs includes a standard macro called @code{with-temp-buffer} which +expands into more or less the code shown above (@pxref{Definition of +with-temp-buffer,, Current Buffer}). Several of the macros defined in +this manual use @code{unwind-protect} in this way. + +@findex ftp-login + Here is an actual example derived from an FTP package. It creates a +process (@pxref{Processes}) to try to establish a connection to a remote +machine. As the function @code{ftp-login} is highly susceptible to +numerous problems that 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. + +@smallexample +@group +(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))))) +@end group +@end smallexample + + This example has a small bug: if the user types @kbd{C-g} to +quit, and the quit happens immediately after the function +@code{ftp-setup-buffer} returns but before the variable @code{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. + +@ignore + arch-tag: 8abc30d4-4d3a-47f9-b908-e9e971c18c6d +@end ignore diff --git a/doc/lispref/customize.texi b/doc/lispref/customize.texi new file mode 100644 index 00000000000..8b1b1a9b91f --- /dev/null +++ b/doc/lispref/customize.texi @@ -0,0 +1,1253 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/customize +@node Customization, Loading, Macros, Top +@chapter Writing Customization Definitions + +@cindex customization definitions + This chapter describes how to declare user options for customization, +and also customization groups for classifying them. We use the term +@dfn{customization item} to include both kinds of customization +definitions---as well as face definitions (@pxref{Defining Faces}). + +@menu +* Common Keywords:: Common keyword arguments for all kinds of + customization declarations. +* Group Definitions:: Writing customization group definitions. +* Variable Definitions:: Declaring user options. +* Customization Types:: Specifying the type of a user option. +@end menu + +@node Common Keywords +@section Common Item Keywords + +@cindex customization keywords + All kinds of customization declarations (for variables and groups, and +for faces) accept keyword arguments for specifying various information. +This section describes some keywords that apply to all kinds. + + All of these keywords, except @code{:tag}, can be used more than once +in a given item. Each use of the keyword has an independent effect. +The keyword @code{:tag} is an exception because any given item can only +display one name. + +@table @code +@item :tag @var{label} +@kindex tag@r{, customization keyword} +Use @var{label}, a string, instead of the item's name, to label the +item in customization menus and buffers. @strong{Don't use a tag +which is substantially different from the item's real name; that would +cause confusion.} One legitimate case for use of @code{:tag} is to +specify a dash where normally a hyphen would be converted to a space: + +@example +(defcustom cursor-in-non-selected-windows @dots{} + :tag "Cursor In Non-selected Windows" +@end example + +@kindex group@r{, customization keyword} +@item :group @var{group} +Put this customization item in group @var{group}. When you use +@code{:group} in a @code{defgroup}, it makes the new group a subgroup of +@var{group}. + +If you use this keyword more than once, you can put a single item into +more than one group. Displaying any of those groups will show this +item. Please don't overdo this, since the result would be annoying. + +@item :link @var{link-data} +@kindex link@r{, customization keyword} +Include an external link after the documentation string for this item. +This is a sentence containing an active field which references some +other documentation. + +There are several alternatives you can use for @var{link-data}: + +@table @code +@item (custom-manual @var{info-node}) +Link to an Info node; @var{info-node} is a string which specifies the +node name, as in @code{"(emacs)Top"}. The link appears as +@samp{[Manual]} in the customization buffer and enters the built-in +Info reader on @var{info-node}. + +@item (info-link @var{info-node}) +Like @code{custom-manual} except that the link appears +in the customization buffer with the Info node name. + +@item (url-link @var{url}) +Link to a web page; @var{url} is a string which specifies the +@acronym{URL}. The link appears in the customization buffer as +@var{url} and invokes the WWW browser specified by +@code{browse-url-browser-function}. + +@item (emacs-commentary-link @var{library}) +Link to the commentary section of a library; @var{library} is a string +which specifies the library name. + +@item (emacs-library-link @var{library}) +Link to an Emacs Lisp library file; @var{library} is a string which +specifies the library name. + +@item (file-link @var{file}) +Link to a file; @var{file} is a string which specifies the name of the +file to visit with @code{find-file} when the user invokes this link. + +@item (function-link @var{function}) +Link to the documentation of a function; @var{function} is a string +which specifies the name of the function to describe with +@code{describe-function} when the user invokes this link. + +@item (variable-link @var{variable}) +Link to the documentation of a variable; @var{variable} is a string +which specifies the name of the variable to describe with +@code{describe-variable} when the user invokes this link. + +@item (custom-group-link @var{group}) +Link to another customization group. Invoking it creates a new +customization buffer for @var{group}. +@end table + +You can specify the text to use in the customization buffer by adding +@code{:tag @var{name}} after the first element of the @var{link-data}; +for example, @code{(info-link :tag "foo" "(emacs)Top")} makes a link to +the Emacs manual which appears in the buffer as @samp{foo}. + +An item can have more than one external link; however, most items have +none at all. + +@item :load @var{file} +@kindex load@r{, customization keyword} +Load file @var{file} (a string) before displaying this customization +item. Loading is done with @code{load-library}, and only if the file is +not already loaded. + +@item :require @var{feature} +@kindex require@r{, customization keyword} +Execute @code{(require '@var{feature})} when your saved customizations +set the value of this item. @var{feature} should be a symbol. + +The most common reason to use @code{:require} is when a variable enables +a feature such as a minor mode, and just setting the variable won't have +any effect unless the code which implements the mode is loaded. + +@item :version @var{version} +@kindex version@r{, customization keyword} +This keyword specifies that the item was first introduced in Emacs +version @var{version}, or that its default value was changed in that +version. The value @var{version} must be a string. + +@item :package-version '(@var{package} . @var{version}) +@kindex package-version@r{, customization keyword} +This keyword specifies that the item was first introduced in +@var{package} version @var{version}, or that its meaning or default +value was changed in that version. The value of @var{package} is a +symbol and @var{version} is a string. + +This keyword takes priority over @code{:version}. + +@var{package} should be the official name of the package, such as MH-E +or Gnus. If the package @var{package} is released as part of Emacs, +@var{package} and @var{version} should appear in the value of +@code{customize-package-emacs-version-alist}. +@end table + +Packages distributed as part of Emacs that use the +@code{:package-version} keyword must also update the +@code{customize-package-emacs-version-alist} variable. + +@defvar customize-package-emacs-version-alist +This alist provides a mapping for the versions of Emacs that are +associated with versions of a package listed in the +@code{:package-version} keyword. Its elements look like this: + +@example +(@var{package} (@var{pversion} . @var{eversion})@dots{}) +@end example + +For each @var{package}, which is a symbol, there are one or more +elements that contain a package version @var{pversion} with an +associated Emacs version @var{eversion}. These versions are strings. +For example, the MH-E package updates this alist with the following: + +@smallexample +(add-to-list 'customize-package-emacs-version-alist + '(MH-E ("6.0" . "22.1") ("6.1" . "22.1") ("7.0" . "22.1") + ("7.1" . "22.1") ("7.2" . "22.1") ("7.3" . "22.1") + ("7.4" . "22.1") ("8.0" . "22.1"))) +@end smallexample + +The value of @var{package} needs to be unique and it needs to match +the @var{package} value appearing in the @code{:package-version} +keyword. Since the user might see the value in a error message, a good +choice is the official name of the package, such as MH-E or Gnus. +@end defvar + +@node Group Definitions +@section Defining Customization Groups +@cindex define customization group +@cindex customization groups, defining + + Each Emacs Lisp package should have one main customization group which +contains all the options, faces and other groups in the package. If the +package has a small number of options and faces, use just one group and +put everything in it. When there are more than twelve or so options and +faces, then you should structure them into subgroups, and put the +subgroups under the package's main customization group. It is OK to +put some of the options and faces in the package's main group alongside +the subgroups. + + The package's main or only group should be a member of one or more of +the standard customization groups. (To display the full list of them, +use @kbd{M-x customize}.) Choose one or more of them (but not too +many), and add your group to each of them using the @code{:group} +keyword. + + The way to declare new customization groups is with @code{defgroup}. + +@defmac defgroup group members doc [keyword value]@dots{} +Declare @var{group} as a customization group containing @var{members}. +Do not quote the symbol @var{group}. The argument @var{doc} specifies +the documentation string for the group. + +The argument @var{members} is a list specifying an initial set of +customization items to be members of the group. However, most often +@var{members} is @code{nil}, and you specify the group's members by +using the @code{:group} keyword when defining those members. + +If you want to specify group members through @var{members}, each element +should have the form @code{(@var{name} @var{widget})}. Here @var{name} +is a symbol, and @var{widget} is a widget type for editing that symbol. +Useful widgets are @code{custom-variable} for a variable, +@code{custom-face} for a face, and @code{custom-group} for a group. + +When you introduce a new group into Emacs, use the @code{:version} +keyword in the @code{defgroup}; then you need not use it for +the individual members of the group. + +In addition to the common keywords (@pxref{Common Keywords}), you can +also use this keyword in @code{defgroup}: + +@table @code +@item :prefix @var{prefix} +@kindex prefix@r{, @code{defgroup} keyword} +If the name of an item in the group starts with @var{prefix}, then the +tag for that item is constructed (by default) by omitting @var{prefix}. + +One group can have any number of prefixes. +@end table +@end defmac + + The prefix-discarding feature is currently turned off, which means +that @code{:prefix} currently has no effect. We did this because we +found that discarding the specified prefixes often led to confusing +names for options. This happened because the people who wrote the +@code{defgroup} definitions for various groups added @code{:prefix} +keywords whenever they make logical sense---that is, whenever the +variables in the library have a common prefix. + + In order to obtain good results with @code{:prefix}, it would be +necessary to check the specific effects of discarding a particular +prefix, given the specific items in a group and their names and +documentation. If the resulting text is not clear, then @code{:prefix} +should not be used in that case. + + It should be possible to recheck all the customization groups, delete +the @code{:prefix} specifications which give unclear results, and then +turn this feature back on, if someone would like to do the work. + +@node Variable Definitions +@section Defining Customization Variables +@cindex define customization options +@cindex customization variables, how to define + + Use @code{defcustom} to declare user-customizable variables. + +@defmac defcustom option standard doc [keyword value]@dots{} +This construct declares @var{option} as a customizable user option +variable. You should not quote @var{option}. The argument @var{doc} +specifies the documentation string for the variable. There is no need +to start it with a @samp{*}, because @code{defcustom} automatically +marks @var{option} as a @dfn{user option} (@pxref{Defining +Variables}). + +The argument @var{standard} is an expression that specifies the +standard value for @var{option}. Evaluating the @code{defcustom} form +evaluates @var{standard}, but does not necessarily install the +standard value. If @var{option} already has a default value, +@code{defcustom} does not change it. If the user has saved a +customization for @var{option}, @code{defcustom} installs the user's +customized value as @var{option}'s default value. If neither of those +cases applies, @code{defcustom} installs the result of evaluating +@var{standard} as the default value. + +The expression @var{standard} can be evaluated at various other times, +too---whenever the customization facility needs to know @var{option}'s +standard value. So be sure to use an expression which is harmless to +evaluate at any time. We recommend avoiding backquotes in +@var{standard}, because they are not expanded when editing the value, +so list values will appear to have the wrong structure. + +Every @code{defcustom} should specify @code{:group} at least once. + +If you specify the @code{:set} keyword, to make the variable take other +special actions when set through the customization buffer, the +variable's documentation string should tell the user specifically how +to do the same job in hand-written Lisp code. + +When you evaluate a @code{defcustom} form with @kbd{C-M-x} in Emacs Lisp +mode (@code{eval-defun}), a special feature of @code{eval-defun} +arranges to set the variable unconditionally, without testing whether +its value is void. (The same feature applies to @code{defvar}.) +@xref{Defining Variables}. +@end defmac + + @code{defcustom} accepts the following additional keywords: + +@table @code +@item :type @var{type} +Use @var{type} as the data type for this option. It specifies which +values are legitimate, and how to display the value. +@xref{Customization Types}, for more information. + +@item :options @var{value-list} +@kindex options@r{, @code{defcustom} keyword} +Specify the list of reasonable values for use in this +option. The user is not restricted to using only these values, but they +are offered as convenient alternatives. + +This is meaningful only for certain types, currently including +@code{hook}, @code{plist} and @code{alist}. See the definition of the +individual types for a description of how to use @code{:options}. + +@item :set @var{setfunction} +@kindex set@r{, @code{defcustom} keyword} +Specify @var{setfunction} as the way to change the value of this +option. The function @var{setfunction} should take two arguments, a +symbol (the option name) and the new value, and should do whatever is +necessary to update the value properly for this option (which may not +mean simply setting the option as a Lisp variable). The default for +@var{setfunction} is @code{set-default}. + +@item :get @var{getfunction} +@kindex get@r{, @code{defcustom} keyword} +Specify @var{getfunction} as the way to extract the value of this +option. The function @var{getfunction} should take one argument, a +symbol, and should return whatever customize should use as the +``current value'' for that symbol (which need not be the symbol's Lisp +value). The default is @code{default-value}. + +You have to really understand the workings of Custom to use +@code{:get} correctly. It is meant for values that are treated in +Custom as variables but are not actually stored in Lisp variables. It +is almost surely a mistake to specify @code{getfunction} for a value +that really is stored in a Lisp variable. + +@item :initialize @var{function} +@kindex initialize@r{, @code{defcustom} keyword} +@var{function} should be a function used to initialize the variable +when the @code{defcustom} is evaluated. It should take two arguments, +the option name (a symbol) and the value. Here are some predefined +functions meant for use in this way: + +@table @code +@item custom-initialize-set +Use the variable's @code{:set} function to initialize the variable, but +do not reinitialize it if it is already non-void. + +@item custom-initialize-default +Like @code{custom-initialize-set}, but use the function +@code{set-default} to set the variable, instead of the variable's +@code{:set} function. This is the usual choice for a variable whose +@code{:set} function enables or disables a minor mode; with this choice, +defining the variable will not call the minor mode function, but +customizing the variable will do so. + +@item custom-initialize-reset +Always use the @code{:set} function to initialize the variable. If +the variable is already non-void, reset it by calling the @code{:set} +function using the current value (returned by the @code{:get} method). +This is the default @code{:initialize} function. + +@item custom-initialize-changed +Use the @code{:set} function to initialize the variable, if it is +already set or has been customized; otherwise, just use +@code{set-default}. + +@item custom-initialize-safe-set +@itemx custom-initialize-safe-default +These functions behave like @code{custom-initialize-set} +(@code{custom-initialize-default}, respectively), but catch errors. +If an error occurs during initialization, they set the variable to +@code{nil} using @code{set-default}, and throw no error. + +These two functions are only meant for options defined in pre-loaded +files, where some variables or functions used to compute the option's +value may not yet be defined. The option normally gets updated in +@file{startup.el}, ignoring the previously computed value. Because of +this typical usage, the value which these two functions compute +normally only matters when, after startup, one unsets the option's +value and then reevaluates the defcustom. By that time, the necessary +variables and functions will be defined, so there will not be an error. +@end table + +@item :set-after @var{variables} +@kindex set-after@r{, @code{defcustom} keyword} +When setting variables according to saved customizations, make sure to +set the variables @var{variables} before this one; in other words, delay +setting this variable until after those others have been handled. Use +@code{:set-after} if setting this variable won't work properly unless +those other variables already have their intended values. +@end table + + The @code{:require} keyword is useful for an option that turns on the +operation of a certain feature. Assuming that the package is coded to +check the value of the option, you still need to arrange for the package +to be loaded. You can do that with @code{:require}. @xref{Common +Keywords}. Here is an example, from the library @file{saveplace.el}: + +@example +(defcustom save-place nil + "Non-nil means automatically save place in each file..." + :type 'boolean + :require 'saveplace + :group 'save-place) +@end example + +If a customization item has a type such as @code{hook} or +@code{alist}, which supports @code{:options}, you can add additional +values to the list from outside the @code{defcustom} declaration by +calling @code{custom-add-frequent-value}. For example, if you define a +function @code{my-lisp-mode-initialization} intended to be called from +@code{emacs-lisp-mode-hook}, you might want to add that to the list of +reasonable values for @code{emacs-lisp-mode-hook}, but not by editing +its definition. You can do it thus: + +@example +(custom-add-frequent-value 'emacs-lisp-mode-hook + 'my-lisp-mode-initialization) +@end example + +@defun custom-add-frequent-value symbol value +For the customization option @var{symbol}, add @var{value} to the +list of reasonable values. + +The precise effect of adding a value depends on the customization type +of @var{symbol}. +@end defun + +Internally, @code{defcustom} uses the symbol property +@code{standard-value} to record the expression for the standard value, +and @code{saved-value} to record the value saved by the user with the +customization buffer. Both properties are actually lists whose car is +an expression which evaluates to the value. + +@node Customization Types +@section Customization Types + +@cindex customization types + When you define a user option with @code{defcustom}, you must specify +its @dfn{customization type}. That is a Lisp object which describes (1) +which values are legitimate and (2) how to display the value in the +customization buffer for editing. + +@kindex type@r{, @code{defcustom} keyword} + You specify the customization type in @code{defcustom} with the +@code{:type} keyword. The argument of @code{:type} is evaluated, but +only once when the @code{defcustom} is executed, so it isn't useful +for the value to vary. Normally we use a quoted constant. For +example: + +@example +(defcustom diff-command "diff" + "The command to use to run diff." + :type '(string) + :group 'diff) +@end example + + In general, a customization type is a list whose first element is a +symbol, one of the customization type names defined in the following +sections. After this symbol come a number of arguments, depending on +the symbol. Between the type symbol and its arguments, you can +optionally write keyword-value pairs (@pxref{Type Keywords}). + + Some of the type symbols do not use any arguments; those are called +@dfn{simple types}. For a simple type, if you do not use any +keyword-value pairs, you can omit the parentheses around the type +symbol. For example just @code{string} as a customization type is +equivalent to @code{(string)}. + +@menu +* Simple Types:: +* Composite Types:: +* Splicing into Lists:: +* Type Keywords:: +* Defining New Types:: +@end menu + +All customization types are implemented as widgets; see @ref{Top, , +Introduction, widget, The Emacs Widget Library}, for details. + +@node Simple Types +@subsection Simple Types + + This section describes all the simple customization types. + +@table @code +@item sexp +The value may be any Lisp object that can be printed and read back. You +can use @code{sexp} as a fall-back for any option, if you don't want to +take the time to work out a more specific type to use. + +@item integer +The value must be an integer, and is represented textually +in the customization buffer. + +@item number +The value must be a number (floating point or integer), and is +represented textually in the customization buffer. + +@item float +The value must be a floating point number, and is represented +textually in the customization buffer. + +@item string +The value must be a string, and the customization buffer shows just the +contents, with no delimiting @samp{"} characters and no quoting with +@samp{\}. + +@item regexp +Like @code{string} except that the string must be a valid regular +expression. + +@item character +The value must be a character code. A character code is actually an +integer, but this type shows the value by inserting the character in the +buffer, rather than by showing the number. + +@item file +The value must be a file name, and you can do completion with +@kbd{M-@key{TAB}}. + +@item (file :must-match t) +The value must be a file name for an existing file, and you can do +completion with @kbd{M-@key{TAB}}. + +@item directory +The value must be a directory name, and you can do completion with +@kbd{M-@key{TAB}}. + +@item hook +The value must be a list of functions (or a single function, but that is +obsolete usage). This customization type is used for hook variables. +You can use the @code{:options} keyword in a hook variable's +@code{defcustom} to specify a list of functions recommended for use in +the hook; see @ref{Variable Definitions}. + +@item alist +The value must be a list of cons-cells, the @sc{car} of each cell +representing a key, and the @sc{cdr} of the same cell representing an +associated value. The user can add and delete key/value pairs, and +edit both the key and the value of each pair. + +You can specify the key and value types like this: + +@smallexample +(alist :key-type @var{key-type} :value-type @var{value-type}) +@end smallexample + +@noindent +where @var{key-type} and @var{value-type} are customization type +specifications. The default key type is @code{sexp}, and the default +value type is @code{sexp}. + +The user can add any key matching the specified key type, but you can +give some keys a preferential treatment by specifying them with the +@code{:options} (see @ref{Variable Definitions}). The specified keys +will always be shown in the customize buffer (together with a suitable +value), with a checkbox to include or exclude or disable the key/value +pair from the alist. The user will not be able to edit the keys +specified by the @code{:options} keyword argument. + +The argument to the @code{:options} keywords should be a list of +specifications for reasonable keys in the alist. Ordinarily, they are +simply atoms, which stand for themselves as. For example: + +@smallexample +:options '("foo" "bar" "baz") +@end smallexample + +@noindent +specifies that there are three ``known'' keys, namely @code{"foo"}, +@code{"bar"} and @code{"baz"}, which will always be shown first. + +You may want to restrict the value type for specific keys, for +example, the value associated with the @code{"bar"} key can only be an +integer. You can specify this by using a list instead of an atom in +the list. The first element will specify the key, like before, while +the second element will specify the value type. For example: + +@smallexample +:options '("foo" ("bar" integer) "baz") +@end smallexample + +Finally, you may want to change how the key is presented. By default, +the key is simply shown as a @code{const}, since the user cannot change +the special keys specified with the @code{:options} keyword. However, +you may want to use a more specialized type for presenting the key, like +@code{function-item} if you know it is a symbol with a function binding. +This is done by using a customization type specification instead of a +symbol for the key. + +@smallexample +:options '("foo" ((function-item some-function) integer) + "baz") +@end smallexample + +Many alists use lists with two elements, instead of cons cells. For +example, + +@smallexample +(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) + "Each element is a list of the form (KEY VALUE).") +@end smallexample + +@noindent +instead of + +@smallexample +(defcustom cons-alist '(("foo" . 1) ("bar" . 2) ("baz" . 3)) + "Each element is a cons-cell (KEY . VALUE).") +@end smallexample + +Because of the way lists are implemented on top of cons cells, you can +treat @code{list-alist} in the example above as a cons cell alist, where +the value type is a list with a single element containing the real +value. + +@smallexample +(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) + "Each element is a list of the form (KEY VALUE)." + :type '(alist :value-type (group integer))) +@end smallexample + +The @code{group} widget is used here instead of @code{list} only because +the formatting is better suited for the purpose. + +Similarly, you can have alists with more values associated with each +key, using variations of this trick: + +@smallexample +(defcustom person-data '(("brian" 50 t) + ("dorith" 55 nil) + ("ken" 52 t)) + "Alist of basic info about people. +Each element has the form (NAME AGE MALE-FLAG)." + :type '(alist :value-type (group integer boolean))) + +(defcustom pets '(("brian") + ("dorith" "dog" "guppy") + ("ken" "cat")) + "Alist of people's pets. +In an element (KEY . VALUE), KEY is the person's name, +and the VALUE is a list of that person's pets." + :type '(alist :value-type (repeat string))) +@end smallexample + +@item plist +The @code{plist} custom type is similar to the @code{alist} (see above), +except that the information is stored as a property list, i.e. a list of +this form: + +@smallexample +(@var{key} @var{value} @var{key} @var{value} @var{key} @var{value} @dots{}) +@end smallexample + +The default @code{:key-type} for @code{plist} is @code{symbol}, +rather than @code{sexp}. + +@item symbol +The value must be a symbol. It appears in the customization buffer as +the name of the symbol. + +@item function +The value must be either a lambda expression or a function name. When +it is a function name, you can do completion with @kbd{M-@key{TAB}}. + +@item variable +The value must be a variable name, and you can do completion with +@kbd{M-@key{TAB}}. + +@item face +The value must be a symbol which is a face name, and you can do +completion with @kbd{M-@key{TAB}}. + +@item boolean +The value is boolean---either @code{nil} or @code{t}. Note that by +using @code{choice} and @code{const} together (see the next section), +you can specify that the value must be @code{nil} or @code{t}, but also +specify the text to describe each value in a way that fits the specific +meaning of the alternative. + +@item coding-system +The value must be a coding-system name, and you can do completion with +@kbd{M-@key{TAB}}. + +@item color +The value must be a valid color name, and you can do completion with +@kbd{M-@key{TAB}}. A sample is provided. +@end table + +@node Composite Types +@subsection Composite Types +@cindex Composite Types (customization) + + When none of the simple types is appropriate, you can use composite +types, which build new types from other types or from specified data. +The specified types or data are called the @dfn{arguments} of the +composite type. The composite type normally looks like this: + +@example +(@var{constructor} @var{arguments}@dots{}) +@end example + +@noindent +but you can also add keyword-value pairs before the arguments, like +this: + +@example +(@var{constructor} @r{@{}@var{keyword} @var{value}@r{@}}@dots{} @var{arguments}@dots{}) +@end example + + Here is a table of constructors and how to use them to write +composite types: + +@table @code +@item (cons @var{car-type} @var{cdr-type}) +The value must be a cons cell, its @sc{car} must fit @var{car-type}, and +its @sc{cdr} must fit @var{cdr-type}. For example, @code{(cons string +symbol)} is a customization type which matches values such as +@code{("foo" . foo)}. + +In the customization buffer, the @sc{car} and the @sc{cdr} are +displayed and edited separately, each according to the type +that you specify for it. + +@item (list @var{element-types}@dots{}) +The value must be a list with exactly as many elements as the +@var{element-types} given; and each element must fit the +corresponding @var{element-type}. + +For example, @code{(list integer string function)} describes a list of +three elements; the first element must be an integer, the second a +string, and the third a function. + +In the customization buffer, each element is displayed and edited +separately, according to the type specified for it. + +@item (vector @var{element-types}@dots{}) +Like @code{list} except that the value must be a vector instead of a +list. The elements work the same as in @code{list}. + +@item (choice @var{alternative-types}@dots{}) +The value must fit at least one of @var{alternative-types}. +For example, @code{(choice integer string)} allows either an +integer or a string. + +In the customization buffer, the user selects an alternative +using a menu, and can then edit the value in the usual way for that +alternative. + +Normally the strings in this menu are determined automatically from the +choices; however, you can specify different strings for the menu by +including the @code{:tag} keyword in the alternatives. For example, if +an integer stands for a number of spaces, while a string is text to use +verbatim, you might write the customization type this way, + +@example +(choice (integer :tag "Number of spaces") + (string :tag "Literal text")) +@end example + +@noindent +so that the menu offers @samp{Number of spaces} and @samp{Literal text}. + +In any alternative for which @code{nil} is not a valid value, other than +a @code{const}, you should specify a valid default for that alternative +using the @code{:value} keyword. @xref{Type Keywords}. + +If some values are covered by more than one of the alternatives, +customize will choose the first alternative that the value fits. This +means you should always list the most specific types first, and the +most general last. Here's an example of proper usage: + +@example +(choice (const :tag "Off" nil) + symbol (sexp :tag "Other")) +@end example + +@noindent +This way, the special value @code{nil} is not treated like other +symbols, and symbols are not treated like other Lisp expressions. + +@item (radio @var{element-types}@dots{}) +This is similar to @code{choice}, except that the choices are displayed +using `radio buttons' rather than a menu. This has the advantage of +displaying documentation for the choices when applicable and so is often +a good choice for a choice between constant functions +(@code{function-item} customization types). + +@item (const @var{value}) +The value must be @var{value}---nothing else is allowed. + +The main use of @code{const} is inside of @code{choice}. For example, +@code{(choice integer (const nil))} allows either an integer or +@code{nil}. + +@code{:tag} is often used with @code{const}, inside of @code{choice}. +For example, + +@example +(choice (const :tag "Yes" t) + (const :tag "No" nil) + (const :tag "Ask" foo)) +@end example + +@noindent +describes a variable for which @code{t} means yes, @code{nil} means no, +and @code{foo} means ``ask.'' + +@item (other @var{value}) +This alternative can match any Lisp value, but if the user chooses this +alternative, that selects the value @var{value}. + +The main use of @code{other} is as the last element of @code{choice}. +For example, + +@example +(choice (const :tag "Yes" t) + (const :tag "No" nil) + (other :tag "Ask" foo)) +@end example + +@noindent +describes a variable for which @code{t} means yes, @code{nil} means no, +and anything else means ``ask.'' If the user chooses @samp{Ask} from +the menu of alternatives, that specifies the value @code{foo}; but any +other value (not @code{t}, @code{nil} or @code{foo}) displays as +@samp{Ask}, just like @code{foo}. + +@item (function-item @var{function}) +Like @code{const}, but used for values which are functions. This +displays the documentation string as well as the function name. +The documentation string is either the one you specify with +@code{:doc}, or @var{function}'s own documentation string. + +@item (variable-item @var{variable}) +Like @code{const}, but used for values which are variable names. This +displays the documentation string as well as the variable name. The +documentation string is either the one you specify with @code{:doc}, or +@var{variable}'s own documentation string. + +@item (set @var{types}@dots{}) +The value must be a list, and each element of the list must match one of +the @var{types} specified. + +This appears in the customization buffer as a checklist, so that each of +@var{types} may have either one corresponding element or none. It is +not possible to specify two different elements that match the same one +of @var{types}. For example, @code{(set integer symbol)} allows one +integer and/or one symbol in the list; it does not allow multiple +integers or multiple symbols. As a result, it is rare to use +nonspecific types such as @code{integer} in a @code{set}. + +Most often, the @var{types} in a @code{set} are @code{const} types, as +shown here: + +@example +(set (const :bold) (const :italic)) +@end example + +Sometimes they describe possible elements in an alist: + +@example +(set (cons :tag "Height" (const height) integer) + (cons :tag "Width" (const width) integer)) +@end example + +@noindent +That lets the user specify a height value optionally +and a width value optionally. + +@item (repeat @var{element-type}) +The value must be a list and each element of the list must fit the type +@var{element-type}. This appears in the customization buffer as a +list of elements, with @samp{[INS]} and @samp{[DEL]} buttons for adding +more elements or removing elements. + +@item (restricted-sexp :match-alternatives @var{criteria}) +This is the most general composite type construct. The value may be +any Lisp object that satisfies one of @var{criteria}. @var{criteria} +should be a list, and each element should be one of these +possibilities: + +@itemize @bullet +@item +A predicate---that is, a function of one argument that has no side +effects, and returns either @code{nil} or non-@code{nil} according to +the argument. Using a predicate in the list says that objects for which +the predicate returns non-@code{nil} are acceptable. + +@item +A quoted constant---that is, @code{'@var{object}}. This sort of element +in the list says that @var{object} itself is an acceptable value. +@end itemize + +For example, + +@example +(restricted-sexp :match-alternatives + (integerp 't 'nil)) +@end example + +@noindent +allows integers, @code{t} and @code{nil} as legitimate values. + +The customization buffer shows all legitimate values using their read +syntax, and the user edits them textually. +@end table + + Here is a table of the keywords you can use in keyword-value pairs +in a composite type: + +@table @code +@item :tag @var{tag} +Use @var{tag} as the name of this alternative, for user communication +purposes. This is useful for a type that appears inside of a +@code{choice}. + +@item :match-alternatives @var{criteria} +@kindex match-alternatives@r{, customization keyword} +Use @var{criteria} to match possible values. This is used only in +@code{restricted-sexp}. + +@item :args @var{argument-list} +@kindex args@r{, customization keyword} +Use the elements of @var{argument-list} as the arguments of the type +construct. For instance, @code{(const :args (foo))} is equivalent to +@code{(const foo)}. You rarely need to write @code{:args} explicitly, +because normally the arguments are recognized automatically as +whatever follows the last keyword-value pair. +@end table + +@node Splicing into Lists +@subsection Splicing into Lists + + The @code{:inline} feature lets you splice a variable number of +elements into the middle of a list or vector. You use it in a +@code{set}, @code{choice} or @code{repeat} type which appears among the +element-types of a @code{list} or @code{vector}. + + Normally, each of the element-types in a @code{list} or @code{vector} +describes one and only one element of the list or vector. Thus, if an +element-type is a @code{repeat}, that specifies a list of unspecified +length which appears as one element. + + But when the element-type uses @code{:inline}, the value it matches is +merged directly into the containing sequence. For example, if it +matches a list with three elements, those become three elements of the +overall sequence. This is analogous to using @samp{,@@} in the backquote +construct. + + For example, to specify a list whose first element must be @code{baz} +and whose remaining arguments should be zero or more of @code{foo} and +@code{bar}, use this customization type: + +@example +(list (const baz) (set :inline t (const foo) (const bar))) +@end example + +@noindent +This matches values such as @code{(baz)}, @code{(baz foo)}, @code{(baz bar)} +and @code{(baz foo bar)}. + + When the element-type is a @code{choice}, you use @code{:inline} not +in the @code{choice} itself, but in (some of) the alternatives of the +@code{choice}. For example, to match a list which must start with a +file name, followed either by the symbol @code{t} or two strings, use +this customization type: + +@example +(list file + (choice (const t) + (list :inline t string string))) +@end example + +@noindent +If the user chooses the first alternative in the choice, then the +overall list has two elements and the second element is @code{t}. If +the user chooses the second alternative, then the overall list has three +elements and the second and third must be strings. + +@node Type Keywords +@subsection Type Keywords + +You can specify keyword-argument pairs in a customization type after the +type name symbol. Here are the keywords you can use, and their +meanings: + +@table @code +@item :value @var{default} +This is used for a type that appears as an alternative inside of +@code{choice}; it specifies the default value to use, at first, if and +when the user selects this alternative with the menu in the +customization buffer. + +Of course, if the actual value of the option fits this alternative, it +will appear showing the actual value, not @var{default}. + +If @code{nil} is not a valid value for the alternative, then it is +essential to specify a valid default with @code{:value}. + +@item :format @var{format-string} +@kindex format@r{, customization keyword} +This string will be inserted in the buffer to represent the value +corresponding to the type. The following @samp{%} escapes are available +for use in @var{format-string}: + +@table @samp +@item %[@var{button}%] +Display the text @var{button} marked as a button. The @code{:action} +attribute specifies what the button will do if the user invokes it; +its value is a function which takes two arguments---the widget which +the button appears in, and the event. + +There is no way to specify two different buttons with different +actions. + +@item %@{@var{sample}%@} +Show @var{sample} in a special face specified by @code{:sample-face}. + +@item %v +Substitute the item's value. How the value is represented depends on +the kind of item, and (for variables) on the customization type. + +@item %d +Substitute the item's documentation string. + +@item %h +Like @samp{%d}, but if the documentation string is more than one line, +add an active field to control whether to show all of it or just the +first line. + +@item %t +Substitute the tag here. You specify the tag with the @code{:tag} +keyword. + +@item %% +Display a literal @samp{%}. +@end table + +@item :action @var{action} +@kindex action@r{, customization keyword} +Perform @var{action} if the user clicks on a button. + +@item :button-face @var{face} +@kindex button-face@r{, customization keyword} +Use the face @var{face} (a face name or a list of face names) for button +text displayed with @samp{%[@dots{}%]}. + +@item :button-prefix @var{prefix} +@itemx :button-suffix @var{suffix} +@kindex button-prefix@r{, customization keyword} +@kindex button-suffix@r{, customization keyword} +These specify the text to display before and after a button. +Each can be: + +@table @asis +@item @code{nil} +No text is inserted. + +@item a string +The string is inserted literally. + +@item a symbol +The symbol's value is used. +@end table + +@item :tag @var{tag} +Use @var{tag} (a string) as the tag for the value (or part of the value) +that corresponds to this type. + +@item :doc @var{doc} +@kindex doc@r{, customization keyword} +Use @var{doc} as the documentation string for this value (or part of the +value) that corresponds to this type. In order for this to work, you +must specify a value for @code{:format}, and use @samp{%d} or @samp{%h} +in that value. + +The usual reason to specify a documentation string for a type is to +provide more information about the meanings of alternatives inside a +@code{:choice} type or the parts of some other composite type. + +@item :help-echo @var{motion-doc} +@kindex help-echo@r{, customization keyword} +When you move to this item with @code{widget-forward} or +@code{widget-backward}, it will display the string @var{motion-doc} in +the echo area. In addition, @var{motion-doc} is used as the mouse +@code{help-echo} string and may actually be a function or form evaluated +to yield a help string. If it is a function, it is called with one +argument, the widget. + +@item :match @var{function} +@kindex match@r{, customization keyword} +Specify how to decide whether a value matches the type. The +corresponding value, @var{function}, should be a function that accepts +two arguments, a widget and a value; it should return non-@code{nil} if +the value is acceptable. + +@ignore +@item :indent @var{columns} +Indent this item by @var{columns} columns. The indentation is used for +@samp{%n}, and automatically for group names, for checklists and radio +buttons, and for editable lists. It affects the whole of the +item except for the first line. + +@item :offset @var{columns} +An integer indicating how many extra spaces to indent the subitems of +this item. By default, subitems are indented the same as their parent. + +@item :extra-offset +An integer indicating how many extra spaces to add to this item's +indentation, compared to its parent. + +@item :notify +A function called each time the item or a subitem is changed. The +function is called with two or three arguments. The first argument is +the item itself, the second argument is the item that was changed, and +the third argument is the event leading to the change, if any. + +@item :menu-tag +A tag used in the menu when the widget is used as an option in a +@code{menu-choice} widget. + +@item :menu-tag-get +A function used for finding the tag when the widget is used as an option +in a @code{menu-choice} widget. By default, the tag used will be either the +@code{:menu-tag} or @code{:tag} property if present, or the @code{princ} +representation of the @code{:value} property if not. + +@item :validate +A function which takes a widget as an argument, and return @code{nil} +if the widget's current value is valid for the widget. Otherwise, it +should return the widget containing the invalid data, and set that +widget's @code{:error} property to a string explaining the error. + +You can use the function @code{widget-children-validate} for this job; +it tests that all children of @var{widget} are valid. + +@item :tab-order +Specify the order in which widgets are traversed with +@code{widget-forward} or @code{widget-backward}. This is only partially +implemented. + +@enumerate a +@item +Widgets with tabbing order @code{-1} are ignored. + +@item +(Unimplemented) When on a widget with tabbing order @var{n}, go to the +next widget in the buffer with tabbing order @var{n+1} or @code{nil}, +whichever comes first. + +@item +When on a widget with no tabbing order specified, go to the next widget +in the buffer with a positive tabbing order, or @code{nil} +@end enumerate + +@item :parent +The parent of a nested widget (e.g., a @code{menu-choice} item or an +element of a @code{editable-list} widget). + +@item :sibling-args +This keyword is only used for members of a @code{radio-button-choice} or +@code{checklist}. The value should be a list of extra keyword +arguments, which will be used when creating the @code{radio-button} or +@code{checkbox} associated with this item. +@end ignore +@end table + +@node Defining New Types +@subsection Defining New Types + +In the previous sections we have described how to construct elaborate +type specifications for @code{defcustom}. In some cases you may want +to give such a type specification a name. The obvious case is when +you are using the same type for many user options: rather than repeat +the specification for each option, you can give the type specification +a name, and use that name each @code{defcustom}. The other case is +when a user option's value is a recursive data structure. To make it +possible for a datatype to refer to itself, it needs to have a name. + +Since custom types are implemented as widgets, the way to define a new +customize type is to define a new widget. We are not going to describe +the widget interface here in details, see @ref{Top, , Introduction, +widget, The Emacs Widget Library}, for that. Instead we are going to +demonstrate the minimal functionality needed for defining new customize +types by a simple example. + +@example +(define-widget 'binary-tree-of-string 'lazy + "A binary tree made of cons-cells and strings." + :offset 4 + :tag "Node" + :type '(choice (string :tag "Leaf" :value "") + (cons :tag "Interior" + :value ("" . "") + binary-tree-of-string + binary-tree-of-string))) + +(defcustom foo-bar "" + "Sample variable holding a binary tree of strings." + :type 'binary-tree-of-string) +@end example + +The function to define a new widget is called @code{define-widget}. The +first argument is the symbol we want to make a new widget type. The +second argument is a symbol representing an existing widget, the new +widget is going to be defined in terms of difference from the existing +widget. For the purpose of defining new customization types, the +@code{lazy} widget is perfect, because it accepts a @code{:type} keyword +argument with the same syntax as the keyword argument to +@code{defcustom} with the same name. The third argument is a +documentation string for the new widget. You will be able to see that +string with the @kbd{M-x widget-browse @key{RET} binary-tree-of-string +@key{RET}} command. + +After these mandatory arguments follow the keyword arguments. The most +important is @code{:type}, which describes the data type we want to match +with this widget. Here a @code{binary-tree-of-string} is described as +being either a string, or a cons-cell whose car and cdr are themselves +both @code{binary-tree-of-string}. Note the reference to the widget +type we are currently in the process of defining. The @code{:tag} +attribute is a string to name the widget in the user interface, and the +@code{:offset} argument is there to ensure that child nodes are +indented four spaces relative to the parent node, making the tree +structure apparent in the customization buffer. + +The @code{defcustom} shows how the new widget can be used as an ordinary +customization type. + +The reason for the name @code{lazy} is that the other composite +widgets convert their inferior widgets to internal form when the +widget is instantiated in a buffer. This conversion is recursive, so +the inferior widgets will convert @emph{their} inferior widgets. If +the data structure is itself recursive, this conversion is an infinite +recursion. The @code{lazy} widget prevents the recursion: it convert +its @code{:type} argument only when needed. + +@ignore + arch-tag: d1b8fad3-f48c-4ce4-a402-f73b5ef19bd2 +@end ignore diff --git a/doc/lispref/debugging.texi b/doc/lispref/debugging.texi new file mode 100644 index 00000000000..a427e746b27 --- /dev/null +++ b/doc/lispref/debugging.texi @@ -0,0 +1,834 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998, 1999, 2001, 2002, 2003, +@c 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/debugging +@node Debugging, Read and Print, Advising Functions, Top +@chapter 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. + +@itemize @bullet +@item +If the problem occurs when you run the program, you can use a Lisp +debugger to investigate what is happening during execution. In addition +to the ordinary debugger, Emacs comes with a source-level debugger, +Edebug. This chapter describes both of them. + +@item +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. + +@item +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. +@end itemize + +@menu +* Debugger:: How the Emacs Lisp debugger is implemented. +* Edebug:: A source-level Emacs Lisp debugger. +* Syntax Errors:: How to find syntax errors. +* Test Coverage:: Ensuring you have tested all branches in your code. +* Compilation Errors:: How to find errors that show up in byte compilation. +@end menu + + Another useful debugging tool is the 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. +@xref{Terminal Input}. + + For debugging problems in terminal descriptions, the +@code{open-termscript} function can be useful. @xref{Terminal Output}. + +@node Debugger +@section The Lisp Debugger +@cindex debugger for Emacs Lisp +@cindex Lisp debugger +@cindex break + + The ordinary @dfn{Lisp debugger} provides the ability to suspend +evaluation of a form. While evaluation is suspended (a state that is +commonly known as a @dfn{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. @xref{Recursive Editing}. + +@menu +* Error Debugging:: Entering the debugger when an error happens. +* Infinite Loops:: Stopping and debugging a program that doesn't exit. +* Function Debugging:: Entering it when a certain function is called. +* Explicit Debug:: Entering it at a certain point in the program. +* Using Debugger:: What the debugger does; what you see while in it. +* Debugger Commands:: Commands used while in the debugger. +* Invoking the Debugger:: How to call the function @code{debug}. +* Internals of Debugger:: Subroutines of the debugger, and global variables. +@end menu + +@node Error Debugging +@subsection Entering the Debugger on an Error +@cindex error debugging +@cindex debugging errors + + 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 cause Lisp errors when invoked +inappropriately (such as @kbd{C-f} at the end of the buffer), and during +ordinary editing it would be very inconvenient to enter the debugger +each time this happens. So if you want errors to enter the debugger, set +the variable @code{debug-on-error} to non-@code{nil}. (The command +@code{toggle-debug-on-error} provides an easy way to do this.) + +@defopt debug-on-error +This variable determines whether the debugger is called when an error is +signaled and not handled. If @code{debug-on-error} is @code{t}, all +kinds of errors call the debugger (except those listed in +@code{debug-ignored-errors}). If it is @code{nil}, none call the +debugger. + +The value can also be a list of error conditions that should call the +debugger. For example, if you set it to the list +@code{(void-variable)}, then only errors about a variable that has no +value invoke the debugger. + +When this variable is non-@code{nil}, Emacs does not create an error +handler around process filter functions and sentinels. Therefore, +errors in these functions also invoke the debugger. @xref{Processes}. +@end defopt + +@defopt debug-ignored-errors +This variable specifies certain kinds of errors that should not enter +the debugger. Its value is a list of error condition symbols and/or +regular expressions. If the error has any of those condition symbols, +or if the error message matches any of the regular expressions, then +that error does not enter the debugger, regardless of the value of +@code{debug-on-error}. + +The normal value of this variable lists several errors that happen often +during editing but rarely result from bugs in Lisp programs. However, +``rarely'' is not ``never''; if your program fails with an error that +matches this list, you will need to change this list in order to debug +the error. The easiest way is usually to set +@code{debug-ignored-errors} to @code{nil}. +@end defopt + +@defopt eval-expression-debug-on-error +If this variable has a non-@code{nil} value, then +@code{debug-on-error} is set to @code{t} when evaluating with the +command @code{eval-expression}. If +@code{eval-expression-debug-on-error} is @code{nil}, then the value of +@code{debug-on-error} is not changed. @xref{Lisp Eval,, Evaluating +Emacs-Lisp Expressions, emacs, The GNU Emacs Manual}. +@end defopt + +@defopt debug-on-signal +Normally, errors that are caught by @code{condition-case} never run the +debugger, even if @code{debug-on-error} is non-@code{nil}. In other +words, @code{condition-case} gets a chance to handle the error before +the debugger gets a chance. + +If you set @code{debug-on-signal} to a non-@code{nil} value, then the +debugger gets the first chance at every error; an error will invoke the +debugger regardless of any @code{condition-case}, if it fits the +criteria specified by the values of @code{debug-on-error} and +@code{debug-ignored-errors}. + +@strong{Warning:} This variable is strong medicine! Various parts of +Emacs handle errors in the normal course of affairs, and you may not +even realize that errors happen there. If you set +@code{debug-on-signal} to a non-@code{nil} value, those errors will +enter the debugger. + +@strong{Warning:} @code{debug-on-signal} has no effect when +@code{debug-on-error} is @code{nil}. +@end defopt + + To debug an error that happens during loading of the init +file, use the option @samp{--debug-init}. This binds +@code{debug-on-error} to @code{t} while loading the init file, and +bypasses the @code{condition-case} which normally catches errors in the +init file. + + If your init file sets @code{debug-on-error}, the effect may +not last past the end of loading the init file. (This is an undesirable +byproduct of the code that implements the @samp{--debug-init} command +line option.) The best way to make the init file set +@code{debug-on-error} permanently is with @code{after-init-hook}, like +this: + +@example +(add-hook 'after-init-hook + (lambda () (setq debug-on-error t))) +@end example + +@node Infinite Loops +@subsection Debugging Infinite Loops +@cindex infinite loops +@cindex loops, infinite +@cindex quitting from infinite loop +@cindex stopping an infinite loop + + 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 @kbd{C-g}, which causes a @dfn{quit}. + + Ordinary quitting gives no information about why the program was +looping. To get more information, you can set the variable +@code{debug-on-quit} to non-@code{nil}. Quitting with @kbd{C-g} is not +considered an error, and @code{debug-on-error} has no effect on the +handling of @kbd{C-g}. Likewise, @code{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. + +@defopt debug-on-quit +This variable determines whether the debugger is called when @code{quit} +is signaled and not handled. If @code{debug-on-quit} is non-@code{nil}, +then the debugger is called whenever you quit (that is, type @kbd{C-g}). +If @code{debug-on-quit} is @code{nil}, then the debugger is not called +when you quit. @xref{Quitting}. +@end defopt + +@node Function Debugging +@subsection Entering the Debugger on a Function Call +@cindex function call debugging +@cindex debugging specific functions + + To investigate a problem that happens in the middle of a program, one +useful technique is to enter the debugger whenever 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. + +@deffn Command debug-on-entry function-name +This function requests @var{function-name} to invoke the debugger each +time it is called. It works by inserting the form +@code{(implement-debug-on-entry)} into the function definition as the +first form. + +Any function or macro defined as Lisp code may be set to break on +entry, regardless of whether it is interpreted code or compiled code. +If the function is a command, it will enter the debugger when called +from Lisp and when called interactively (after the reading of the +arguments). You can also set debug-on-entry for primitive functions +(i.e., those written in C) this way, but it only takes effect when the +primitive is called from Lisp code. Debug-on-entry is not allowed for +special forms. + +When @code{debug-on-entry} is called interactively, it prompts for +@var{function-name} in the minibuffer. If the function is already set +up to invoke the debugger on entry, @code{debug-on-entry} does nothing. +@code{debug-on-entry} always returns @var{function-name}. + +@strong{Warning:} if you redefine a function after using +@code{debug-on-entry} on it, the code to enter the debugger is +discarded by the redefinition. In effect, redefining the function +cancels the break-on-entry feature for that function. + +Here's an example to illustrate use of this function: + +@example +@group +(defun fact (n) + (if (zerop n) 1 + (* n (fact (1- n))))) + @result{} fact +@end group +@group +(debug-on-entry 'fact) + @result{} fact +@end group +@group +(fact 3) +@end group + +@group +------ Buffer: *Backtrace* ------ +Debugger entered--entering a function: +* fact(3) + eval((fact 3)) + eval-last-sexp-1(nil) + eval-last-sexp(nil) + call-interactively(eval-last-sexp) +------ Buffer: *Backtrace* ------ +@end group + +@group +(symbol-function 'fact) + @result{} (lambda (n) + (debug (quote debug)) + (if (zerop n) 1 (* n (fact (1- n))))) +@end group +@end example +@end deffn + +@deffn Command cancel-debug-on-entry &optional function-name +This function undoes the effect of @code{debug-on-entry} on +@var{function-name}. When called interactively, it prompts for +@var{function-name} in the minibuffer. If @var{function-name} is +omitted or @code{nil}, it cancels break-on-entry for all functions. +Calling @code{cancel-debug-on-entry} does nothing to a function which is +not currently set up to break on entry. +@end deffn + +@node Explicit Debug +@subsection Explicit Entry to the Debugger + + You can cause the debugger to be called at a certain point in your +program by writing the expression @code{(debug)} at that point. To do +this, visit the source file, insert the text @samp{(debug)} at the +proper place, and type @kbd{C-M-x} (@code{eval-defun}, a Lisp mode key +binding). @strong{Warning:} if you do this for temporary debugging +purposes, be sure to undo this insertion before you save the file! + + The place where you insert @samp{(debug)} must be a place where an +additional form can be evaluated and its value ignored. (If the value +of @code{(debug)} isn't ignored, it will alter the execution of the +program!) The most common suitable places are inside a @code{progn} or +an implicit @code{progn} (@pxref{Sequencing}). + +@node Using Debugger +@subsection Using the Debugger + + When the debugger is entered, it displays the previously selected +buffer in one window and a buffer named @samp{*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 (@pxref{Recursive Editing}) +and it is wise to go back to the backtrace buffer and exit the debugger +(with the @kbd{q} command) when you are finished with it. Exiting +the debugger gets out of the recursive edit and kills the backtrace +buffer. + +@cindex current stack frame + The backtrace buffer shows you the functions that are executing and +their argument values. 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 @dfn{current frame}. Some of the debugger commands +operate on the current frame. If a line starts with a star, that means +that exiting that frame will call the debugger again. This is useful +for examining the return value of a function. + + If a function name is underlined, that means the debugger knows +where its source code is located. You can click @kbd{Mouse-2} on that +name, or move to it and type @key{RET}, to visit the source code. + + The debugger itself must 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. + +@node Debugger Commands +@subsection Debugger Commands +@cindex debugger command list + + The debugger buffer (in Debugger mode) provides special commands in +addition to the usual Emacs commands. 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 for the function and +type @kbd{C-M-x} on its definition.) You cannot use the Lisp debugger +to step through a primitive function. + + Here is a list of Debugger mode commands: + +@table @kbd +@item 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 any side-effects that you caused by changing +variable values or data structures while inside the debugger). + +Continuing is possible after entry to the debugger due to function entry +or exit, explicit invocation, or quitting. You cannot continue if the +debugger was entered because of an error. + +@item 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 @kbd{u} command +to cancel this flag. + +@item 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. + +@item u +Don't enter the debugger when the current frame is exited. This +cancels a @kbd{b} command on that frame. The visible effect is to +remove the star from the line in the backtrace buffer. + +@item j +Flag the current frame like @kbd{b}. Then continue execution like +@kbd{c}, but temporarily disable break-on-entry for all functions that +are set up to do so by @code{debug-on-entry}. + +@item e +Read a Lisp expression in the minibuffer, evaluate it, and print the +value in the echo area. The debugger alters certain important +variables, and the current buffer, as part of its operation; @kbd{e} +temporarily restores their values from outside the debugger, so you can +examine and change them. This makes the debugger more transparent. By +contrast, @kbd{M-:} does nothing special in the debugger; it shows you +the variable values within the debugger. + +@item R +Like @kbd{e}, but also save the result of evaluation in the +buffer @samp{*Debugger-record*}. + +@item q +Terminate the program being debugged; return to top-level Emacs +command execution. + +If the debugger was entered due to a @kbd{C-g} but you really want +to quit, and not debug, use the @kbd{q} command. + +@item r +Return a value from the debugger. The value is computed by reading an +expression with the minibuffer and evaluating it. + +The @kbd{r} command is useful when the debugger was invoked due to exit +from a Lisp call frame (as requested with @kbd{b} or by entering the +frame with @kbd{d}); then the value specified in the @kbd{r} command is +used as the value of that frame. It is also useful if you call +@code{debug} and use its return value. Otherwise, @kbd{r} has the same +effect as @kbd{c}, and the specified return value does not matter. + +You can't use @kbd{r} when the debugger was entered due to an error. + +@item l +Display a list of functions that will invoke the debugger when called. +This is a list of functions that are set to break on entry by means of +@code{debug-on-entry}. @strong{Warning:} if you redefine such a +function and thus cancel the effect of @code{debug-on-entry}, it may +erroneously show up in this list. +@end table + +@node Invoking the Debugger +@subsection Invoking the Debugger + + Here we describe in full detail the function @code{debug} that is used +to invoke the debugger. + +@defun debug &rest debugger-args +This function enters the debugger. It switches buffers to a buffer +named @samp{*Backtrace*} (or @samp{*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, showing the backtrace buffer in Debugger mode. + +The Debugger mode @kbd{c}, @kbd{d}, @kbd{j}, and @kbd{r} commands exit +the recursive edit; then @code{debug} switches back to the previous +buffer and returns to whatever called @code{debug}. This is the only +way the function @code{debug} can return to its caller. + +The use of the @var{debugger-args} is that @code{debug} displays the +rest of its arguments at the top of the @samp{*Backtrace*} buffer, so +that the user can see them. Except as described below, this is the +@emph{only} way these arguments are used. + +However, certain values for first argument to @code{debug} have a +special significance. (Normally, these values are used only by the +internals of Emacs, and not by programmers calling @code{debug}.) Here +is a table of these special values: + +@table @code +@item lambda +@cindex @code{lambda} in debug +A first argument of @code{lambda} means @code{debug} was called +because of entry to a function when @code{debug-on-next-call} was +non-@code{nil}. The debugger displays @samp{Debugger +entered--entering a function:} as a line of text at the top of the +buffer. + +@item debug +@code{debug} as first argument means @code{debug} was called because +of entry to a function that was set to debug on entry. The debugger +displays the string @samp{Debugger entered--entering a function:}, +just as in the @code{lambda} case. It also marks the stack frame for +that function so that it will invoke the debugger when exited. + +@item t +When the first argument is @code{t}, this indicates a call to +@code{debug} due to evaluation of a function call form when +@code{debug-on-next-call} is non-@code{nil}. The debugger displays +@samp{Debugger entered--beginning evaluation of function call form:} +as the top line in the buffer. + +@item exit +When the first argument is @code{exit}, it indicates the exit of a +stack frame previously marked to invoke the debugger on exit. The +second argument given to @code{debug} in this case is the value being +returned from the frame. The debugger displays @samp{Debugger +entered--returning value:} in the top line of the buffer, followed by +the value being returned. + +@item error +@cindex @code{error} in debug +When the first argument is @code{error}, the debugger indicates that +it is being entered because an error or @code{quit} was signaled and +not handled, by displaying @samp{Debugger entered--Lisp error:} +followed by the error signaled and any arguments to @code{signal}. +For example, + +@example +@group +(let ((debug-on-error t)) + (/ 1 0)) +@end group + +@group +------ Buffer: *Backtrace* ------ +Debugger entered--Lisp error: (arith-error) + /(1 0) +... +------ Buffer: *Backtrace* ------ +@end group +@end example + +If an error was signaled, presumably the variable +@code{debug-on-error} is non-@code{nil}. If @code{quit} was signaled, +then presumably the variable @code{debug-on-quit} is non-@code{nil}. + +@item nil +Use @code{nil} as the first of the @var{debugger-args} when you want +to enter the debugger explicitly. The rest of the @var{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 @code{debug} is called. +@end table +@end defun + +@node Internals of Debugger +@subsection Internals of the Debugger + + This section describes functions and variables used internally by the +debugger. + +@defvar 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. This function should invoke +some kind of debugger. The default value of the variable is +@code{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 @code{debug} (@pxref{Invoking the Debugger}). +@end defvar + +@deffn Command backtrace +@cindex run time stack +@cindex call stack +This function prints a trace of Lisp function calls currently active. +This is the function used by @code{debug} to fill up the +@samp{*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 @code{nil}. + +In the following example, a Lisp expression calls @code{backtrace} +explicitly. This prints the backtrace to the stream +@code{standard-output}, which, in this case, is the buffer +@samp{backtrace-output}. + +Each line of the backtrace represents one function call. The line shows +the values of the function's arguments if they are all known; if they +are still being computed, the line says so. The arguments of special +forms are elided. + +@smallexample +@group +(with-output-to-temp-buffer "backtrace-output" + (let ((var 1)) + (save-excursion + (setq var (eval '(progn + (1+ var) + (list 'testing (backtrace)))))))) + + @result{} (testing nil) +@end group + +@group +----------- Buffer: backtrace-output ------------ + backtrace() + (list ...computing arguments...) +@end group + (progn ...) + eval((progn (1+ var) (list (quote testing) (backtrace)))) + (setq ...) + (save-excursion ...) + (let ...) + (with-output-to-temp-buffer ...) + eval((with-output-to-temp-buffer ...)) + eval-last-sexp-1(nil) +@group + eval-last-sexp(nil) + call-interactively(eval-last-sexp) +----------- Buffer: backtrace-output ------------ +@end group +@end smallexample +@end deffn + +@ignore @c Not worth mentioning +@defopt stack-trace-on-error +@cindex stack trace +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-@code{nil} then a +backtrace is shown in a pop-up buffer named @samp{*Backtrace*} on every +error. If it is @code{nil}, then a backtrace is not shown. + +When a backtrace is shown, that buffer is not selected. If either +@code{debug-on-quit} or @code{debug-on-error} is also non-@code{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. +@end defopt +@end ignore + +@defvar debug-on-next-call +@cindex @code{eval}, and debugging +@cindex @code{apply}, and debugging +@cindex @code{funcall}, and debugging +If this variable is non-@code{nil}, it says to call the debugger before +the next @code{eval}, @code{apply} or @code{funcall}. Entering the +debugger sets @code{debug-on-next-call} to @code{nil}. + +The @kbd{d} command in the debugger works by setting this variable. +@end defvar + +@defun backtrace-debug level flag +This function sets the debug-on-exit flag of the stack frame @var{level} +levels down the stack, giving it the value @var{flag}. If @var{flag} is +non-@code{nil}, this will cause the debugger to be entered when that +frame later exits. Even a nonlocal exit through that frame will enter +the debugger. + +This function is used only by the debugger. +@end defun + +@defvar command-debug-status +This variable records the debugging status of the current interactive +command. Each time a command is called interactively, this variable is +bound to @code{nil}. The debugger can set this variable to leave +information for future debugger invocations during the same command +invocation. + +The advantage of using this variable rather than an ordinary global +variable is that the data will never carry over to a subsequent command +invocation. +@end defvar + +@defun backtrace-frame frame-number +The function @code{backtrace-frame} is intended for use in Lisp +debuggers. It returns information about what computation is happening +in the stack frame @var{frame-number} levels down. + +If that frame has not evaluated the arguments yet, or is a special +form, the value is @code{(nil @var{function} @var{arg-forms}@dots{})}. + +If that frame has evaluated its arguments and called its function +already, the return value is @code{(t @var{function} +@var{arg-values}@dots{})}. + +In the return value, @var{function} is whatever was supplied as the +@sc{car} of the evaluated list, or a @code{lambda} expression in the +case of a macro call. If the function has a @code{&rest} argument, that +is represented as the tail of the list @var{arg-values}. + +If @var{frame-number} is out of range, @code{backtrace-frame} returns +@code{nil}. +@end defun + +@include edebug.texi + +@node Syntax Errors +@section Debugging Invalid Lisp Syntax +@cindex debugging invalid Lisp syntax + + The Lisp reader reports invalid syntax, but cannot say where the real +problem is. For example, the error ``End of file during parsing'' in +evaluating an expression indicates an excess of open parentheses (or +square brackets). The reader detects this imbalance at the end of the +file, but it cannot figure out where the close parenthesis should have +been. Likewise, ``Invalid read syntax: ")"'' indicates an excess close +parenthesis or missing open parenthesis, but does not say where the +missing parenthesis belongs. How, then, to find what to change? + + If the problem is not simply an imbalance of parentheses, a useful +technique is to try @kbd{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. + +@cindex unbalanced parentheses +@cindex parenthesis mismatch, debugging + However, unmatched parentheses are the most common syntax errors in +Lisp, and we can give further advice for those cases. (In addition, +just moving point through the code with Show Paren mode enabled might +find the mismatch.) + +@menu +* Excess Open:: How to find a spurious open paren or missing close. +* Excess Close:: How to find a spurious close paren or missing open. +@end menu + +@node Excess Open +@subsection 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 go to the end of +the file and type @kbd{C-u C-M-u}. This will move you to the +beginning of the first defun that is unbalanced. + + The next step is to determine precisely what is wrong. There is no +way to be sure of this except by studying 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 @kbd{C-M-q} +and see what moves. @strong{But don't do this yet!} Keep reading, +first. + + Before you do this, make sure the defun has enough close parentheses. +Otherwise, @kbd{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 @kbd{C-M-e} to move there, since +that too will fail to work until the defun is balanced. + + Now you can go to the beginning of the defun and type @kbd{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 @kbd{C-M-q} with @kbd{C-_}, since the old +indentation is probably appropriate to the intended parentheses. + + After you think you have fixed the problem, use @kbd{C-M-q} again. If +the old indentation actually fit the intended nesting of parentheses, +and you have put back those parentheses, @kbd{C-M-q} should not change +anything. + +@node Excess Close +@subsection Excess Close Parentheses + + To deal with an excess close parenthesis, first go to the beginning +of the file, then type @kbd{C-u -1 C-M-u} to find the end of the first +unbalanced defun. + + Then find the actual matching close parenthesis by typing @kbd{C-M-f} +at the beginning of that 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 @kbd{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 @kbd{C-M-q} with @kbd{C-_}, since the +old indentation is probably appropriate to the intended parentheses. + + After you think you have fixed the problem, use @kbd{C-M-q} again. If +the old indentation actually fits the intended nesting of parentheses, +and you have put back those parentheses, @kbd{C-M-q} should not change +anything. + +@node Test Coverage +@section Test Coverage +@cindex coverage testing + +@findex testcover-start +@findex testcover-mark-all +@findex testcover-next-mark + You can do coverage testing for a file of Lisp code by loading the +@code{testcover} library and using the command @kbd{M-x +testcover-start @key{RET} @var{file} @key{RET}} to instrument the +code. Then test your code by calling it one or more times. Then use +the command @kbd{M-x testcover-mark-all} to display colored highlights +on the code to show where coverage is insufficient. The command +@kbd{M-x testcover-next-mark} will move point forward to the next +highlighted spot. + + Normally, a red highlight indicates the form was never completely +evaluated; a brown highlight means it always evaluated to the same +value (meaning there has been little testing of what is done with the +result). However, the red highlight is skipped for forms that can't +possibly complete their evaluation, such as @code{error}. The brown +highlight is skipped for forms that are expected to always evaluate to +the same value, such as @code{(setq x 14)}. + + For difficult cases, you can add do-nothing macros to your code to +give advice to the test coverage tool. + +@defmac 1value form +Evaluate @var{form} and return its value, but inform coverage testing +that @var{form}'s value should always be the same. +@end defmac + +@defmac noreturn form +Evaluate @var{form}, informing coverage testing that @var{form} should +never return. If it ever does return, you get a run-time error. +@end defmac + + Edebug also has a coverage testing feature (@pxref{Coverage +Testing}). These features partly duplicate each other, and it would +be cleaner to combine them. + +@node Compilation Errors +@section Debugging Problems in Compilation +@cindex debugging byte compilation problems + + When an error happens during byte compilation, it is normally due to +invalid syntax in the program you are compiling. The compiler prints a +suitable error message in the @samp{*Compile-Log*} buffer, and then +stops. The message may state a function name in which the error was +found, or it may not. Either way, here is how to find out where in the +file the error occurred. + + What you should do is switch to the buffer @w{@samp{ *Compiler Input*}}. +(Note that the buffer name starts with a space, so it does not show +up in @kbd{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 @emph{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, this technique can't localize the error precisely, but can still +show you which function to check. + +@ignore + arch-tag: ddc57378-b0e6-4195-b7b6-43f8777395a7 +@end ignore diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi new file mode 100644 index 00000000000..db630ba2c51 --- /dev/null +++ b/doc/lispref/display.texi @@ -0,0 +1,5442 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/display +@node Display, System Interface, Processes, Top +@chapter Emacs Display + + This chapter describes a number of features related to the display +that Emacs presents to the user. + +@menu +* Refresh Screen:: Clearing the screen and redrawing everything on it. +* Forcing Redisplay:: Forcing redisplay. +* Truncation:: Folding or wrapping long text lines. +* The Echo Area:: Displaying messages at the bottom of the screen. +* Warnings:: Displaying warning messages for the user. +* Invisible Text:: Hiding part of the buffer text. +* Selective Display:: Hiding part of the buffer text (the old way). +* Temporary Displays:: Displays that go away automatically. +* Overlays:: Use overlays to highlight parts of the buffer. +* Width:: How wide a character or string is on the screen. +* Line Height:: Controlling the height of lines. +* Faces:: A face defines a graphics style for text characters: + font, colors, etc. +* Fringes:: Controlling window fringes. +* Scroll Bars:: Controlling vertical scroll bars. +* Display Property:: Enabling special display features. +* Images:: Displaying images in Emacs buffers. +* Buttons:: Adding clickable buttons to Emacs buffers. +* Abstract Display:: Emacs' Widget for Object Collections. +* Blinking:: How Emacs shows the matching open parenthesis. +* Usual Display:: The usual conventions for displaying nonprinting chars. +* Display Tables:: How to specify other conventions. +* Beeping:: Audible signal to the user. +* Window Systems:: Which window system is being used. +@end menu + +@node Refresh Screen +@section Refreshing the Screen + + The function @code{redraw-frame} clears and redisplays the entire +contents of a given frame (@pxref{Frames}). This is useful if the +screen is corrupted. + +@c Emacs 19 feature +@defun redraw-frame frame +This function clears and redisplays frame @var{frame}. +@end defun + + Even more powerful is @code{redraw-display}: + +@deffn Command redraw-display +This function clears and redisplays all visible frames. +@end deffn + + This function calls for redisplay of certain windows, the next time +redisplay is done, but does not clear them first. + +@defun force-window-update &optional object +This function forces some or all windows to be updated on next redisplay. +If @var{object} is a window, it forces redisplay of that window. If +@var{object} is a buffer or buffer name, it forces redisplay of all +windows displaying that buffer. If @var{object} is @code{nil} (or +omitted), it forces redisplay of all windows. +@end defun + + Processing user input takes absolute priority over redisplay. If you +call these functions when input is available, they do nothing +immediately, but a full redisplay does happen eventually---after all the +input has been processed. + + Normally, suspending and resuming Emacs also refreshes the screen. +Some terminal emulators record separate contents for display-oriented +programs such as Emacs and for ordinary sequential display. If you are +using such a terminal, you might want to inhibit the redisplay on +resumption. + +@defvar no-redraw-on-reenter +@cindex suspend (cf. @code{no-redraw-on-reenter}) +@cindex resume (cf. @code{no-redraw-on-reenter}) +This variable controls whether Emacs redraws the entire screen after it +has been suspended and resumed. Non-@code{nil} means there is no need +to redraw, @code{nil} means redrawing is needed. The default is @code{nil}. +@end defvar + +@node Forcing Redisplay +@section Forcing Redisplay +@cindex forcing redisplay + + Emacs redisplay normally stops if input arrives, and does not happen +at all if input is available before it starts. Most of the time, this +is exactly what you want. However, you can prevent preemption by +binding @code{redisplay-dont-pause} to a non-@code{nil} value. + +@defvar redisplay-preemption-period +This variable specifies how many seconds Emacs waits between checks +for new input during redisplay. (The default is 0.1 seconds.) If +input has arrived when Emacs checks, it pre-empts redisplay and +processes the available input before trying again to redisplay. + +If this variable is @code{nil}, Emacs does not check for input during +redisplay, and redisplay cannot be preempted by input. + +This variable is only obeyed on graphical terminals. For +text terminals, see @ref{Terminal Output}. +@end defvar + +@defvar redisplay-dont-pause +If this variable is non-@code{nil}, pending input does not +prevent or halt redisplay; redisplay occurs, and finishes, +regardless of whether input is available. +@end defvar + +@defun redisplay &optional force +This function performs an immediate redisplay provided there are no +pending input events. This is equivalent to @code{(sit-for 0)}. + +If the optional argument @var{force} is non-@code{nil}, it forces an +immediate and complete redisplay even if input is available. + +Returns @code{t} if redisplay was performed, or @code{nil} otherwise. +@end defun + +@node Truncation +@section Truncation +@cindex line wrapping +@cindex line truncation +@cindex continuation lines +@cindex @samp{$} in display +@cindex @samp{\} in display + + When a line of text extends beyond the right edge of a window, Emacs +can @dfn{continue} the line (make it ``wrap'' to the next screen +line), or @dfn{truncate} the line (limit it to one screen line). The +additional screen lines used to display a long text line are called +@dfn{continuation} lines. Continuation is not the same as filling; +continuation happens on the screen only, not in the buffer contents, +and it breaks a line precisely at the right margin, not at a word +boundary. @xref{Filling}. + + On a graphical display, tiny arrow images in the window fringes +indicate truncated and continued lines (@pxref{Fringes}). On a text +terminal, a @samp{$} in the rightmost column of the window indicates +truncation; a @samp{\} on the rightmost column indicates a line that +``wraps.'' (The display table can specify alternate characters to use +for this; @pxref{Display Tables}). + +@defopt truncate-lines +This buffer-local variable controls how Emacs displays lines that extend +beyond the right edge of the window. The default is @code{nil}, which +specifies continuation. If the value is non-@code{nil}, then these +lines are truncated. + +If the variable @code{truncate-partial-width-windows} is non-@code{nil}, +then truncation is always used for side-by-side windows (within one +frame) regardless of the value of @code{truncate-lines}. +@end defopt + +@defopt default-truncate-lines +This variable is the default value for @code{truncate-lines}, for +buffers that do not have buffer-local values for it. +@end defopt + +@defopt truncate-partial-width-windows +This variable controls display of lines that extend beyond the right +edge of the window, in side-by-side windows (@pxref{Splitting Windows}). +If it is non-@code{nil}, these lines are truncated; otherwise, +@code{truncate-lines} says what to do with them. +@end defopt + + When horizontal scrolling (@pxref{Horizontal Scrolling}) is in use in +a window, that forces truncation. + + If your buffer contains @emph{very} long lines, and you use +continuation to display them, just thinking about them can make Emacs +redisplay slow. The column computation and indentation functions also +become slow. Then you might find it advisable to set +@code{cache-long-line-scans} to @code{t}. + +@defvar cache-long-line-scans +If this variable is non-@code{nil}, various indentation and motion +functions, and Emacs redisplay, cache the results of scanning the +buffer, and consult the cache to avoid rescanning regions of the buffer +unless they are modified. + +Turning on the cache slows down processing of short lines somewhat. + +This variable is automatically buffer-local in every buffer. +@end defvar + +@node The Echo Area +@section The Echo Area +@cindex error display +@cindex echo area + + The @dfn{echo area} is used for displaying error messages +(@pxref{Errors}), for messages made with the @code{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 @cite{GNU Emacs Manual} +specifies the rules for resolving conflicts between the echo area and +the minibuffer for use of that screen space (@pxref{Minibuffer,, The +Minibuffer, emacs, The GNU Emacs Manual}). + + You can write output in the echo area by using the Lisp printing +functions with @code{t} as the stream (@pxref{Output Functions}), or +explicitly. + +@menu +* Displaying Messages:: Explicitly displaying text in the echo area. +* Progress:: Informing user about progress of a long operation. +* Logging Messages:: Echo area messages are logged for the user. +* Echo Area Customization:: Controlling the echo area. +@end menu + +@node Displaying Messages +@subsection Displaying Messages in the Echo Area +@cindex display message in echo area + + This section describes the functions for explicitly producing echo +area messages. Many other Emacs features display messages there, too. + +@defun message format-string &rest arguments +This function displays a message in the echo area. The argument +@var{format-string} is similar to a C language @code{printf} format +string. See @code{format} in @ref{Formatting Strings}, for the details +on the conversion specifications. @code{message} returns the +constructed string. + +In batch mode, @code{message} prints the message text on the standard +error stream, followed by a newline. + +If @var{format-string}, or strings among the @var{arguments}, have +@code{face} text properties, these affect the way the message is displayed. + +@c Emacs 19 feature +If @var{format-string} is @code{nil} or the empty string, +@code{message} clears the echo area; if the echo area has been +expanded automatically, this brings it back to its normal size. +If the minibuffer is active, this brings the minibuffer contents back +onto the screen immediately. + +@example +@group +(message "Minibuffer depth is %d." + (minibuffer-depth)) + @print{} Minibuffer depth is 0. +@result{} "Minibuffer depth is 0." +@end group + +@group +---------- Echo Area ---------- +Minibuffer depth is 0. +---------- Echo Area ---------- +@end group +@end example + +To automatically display a message in the echo area or in a pop-buffer, +depending on its size, use @code{display-message-or-buffer} (see below). +@end defun + +@defmac with-temp-message message &rest body +This construct displays a message in the echo area temporarily, during +the execution of @var{body}. It displays @var{message}, executes +@var{body}, then returns the value of the last body form while restoring +the previous echo area contents. +@end defmac + +@defun message-or-box format-string &rest arguments +This function displays a message like @code{message}, but may display it +in a dialog box instead of the echo area. If this function is called in +a command that was invoked using the mouse---more precisely, if +@code{last-nonmenu-event} (@pxref{Command Loop Info}) is either +@code{nil} or a list---then it uses a dialog box or pop-up menu to +display the message. Otherwise, it uses the echo area. (This is the +same criterion that @code{y-or-n-p} uses to make a similar decision; see +@ref{Yes-or-No Queries}.) + +You can force use of the mouse or of the echo area by binding +@code{last-nonmenu-event} to a suitable value around the call. +@end defun + +@defun message-box format-string &rest arguments +@anchor{message-box} +This function displays a message like @code{message}, but uses a dialog +box (or a pop-up menu) whenever that is possible. If it is impossible +to use a dialog box or pop-up menu, because the terminal does not +support them, then @code{message-box} uses the echo area, like +@code{message}. +@end defun + +@defun display-message-or-buffer message &optional buffer-name not-this-window frame +This function displays the message @var{message}, which may be either a +string or a buffer. If it is shorter than the maximum height of the +echo area, as defined by @code{max-mini-window-height}, it is displayed +in the echo area, using @code{message}. Otherwise, +@code{display-buffer} is used to show it in a pop-up buffer. + +Returns either the string shown in the echo area, or when a pop-up +buffer is used, the window used to display it. + +If @var{message} is a string, then the optional argument +@var{buffer-name} is the name of the buffer used to display it when a +pop-up buffer is used, defaulting to @samp{*Message*}. In the case +where @var{message} is a string and displayed in the echo area, it is +not specified whether the contents are inserted into the buffer anyway. + +The optional arguments @var{not-this-window} and @var{frame} are as for +@code{display-buffer}, and only used if a buffer is displayed. +@end defun + +@defun current-message +This function returns the message currently being displayed in the +echo area, or @code{nil} if there is none. +@end defun + +@node Progress +@subsection Reporting Operation Progress +@cindex progress reporting + + When an operation can take a while to finish, you should inform the +user about the progress it makes. This way the user can estimate +remaining time and clearly see that Emacs is busy working, not hung. + + Functions listed in this section provide simple and efficient way of +reporting operation progress. Here is a working example that does +nothing useful: + +@smallexample +(let ((progress-reporter + (make-progress-reporter "Collecting mana for Emacs..." + 0 500))) + (dotimes (k 500) + (sit-for 0.01) + (progress-reporter-update progress-reporter k)) + (progress-reporter-done progress-reporter)) +@end smallexample + +@defun make-progress-reporter message min-value max-value &optional current-value min-change min-time +This function creates and returns a @dfn{progress reporter}---an +object you will use as an argument for all other functions listed +here. The idea is to precompute as much data as possible to make +progress reporting very fast. + +When this progress reporter is subsequently used, it will display +@var{message} in the echo area, followed by progress percentage. +@var{message} is treated as a simple string. If you need it to depend +on a filename, for instance, use @code{format} before calling this +function. + +@var{min-value} and @var{max-value} arguments stand for starting and +final states of your operation. For instance, if you scan a buffer, +they should be the results of @code{point-min} and @code{point-max} +correspondingly. It is required that @var{max-value} is greater than +@var{min-value}. If you create progress reporter when some part of +the operation has already been completed, then specify +@var{current-value} argument. But normally you should omit it or set +it to @code{nil}---it will default to @var{min-value} then. + +Remaining arguments control the rate of echo area updates. Progress +reporter will wait for at least @var{min-change} more percents of the +operation to be completed before printing next message. +@var{min-time} specifies the minimum time in seconds to pass between +successive prints. It can be fractional. Depending on Emacs and +system capabilities, progress reporter may or may not respect this +last argument or do it with varying precision. Default value for +@var{min-change} is 1 (one percent), for @var{min-time}---0.2 +(seconds.) + +This function calls @code{progress-reporter-update}, so the first +message is printed immediately. +@end defun + +@defun progress-reporter-update reporter value +This function does the main work of reporting progress of your +operation. It displays the message of @var{reporter}, followed by +progress percentage determined by @var{value}. If percentage is zero, +or close enough according to the @var{min-change} and @var{min-time} +arguments, then it is omitted from the output. + +@var{reporter} must be the result of a call to +@code{make-progress-reporter}. @var{value} specifies the current +state of your operation and must be between @var{min-value} and +@var{max-value} (inclusive) as passed to +@code{make-progress-reporter}. For instance, if you scan a buffer, +then @var{value} should be the result of a call to @code{point}. + +This function respects @var{min-change} and @var{min-time} as passed +to @code{make-progress-reporter} and so does not output new messages +on every invocation. It is thus very fast and normally you should not +try to reduce the number of calls to it: resulting overhead will most +likely negate your effort. +@end defun + +@defun progress-reporter-force-update reporter value &optional new-message +This function is similar to @code{progress-reporter-update} except +that it prints a message in the echo area unconditionally. + +The first two arguments have the same meaning as for +@code{progress-reporter-update}. Optional @var{new-message} allows +you to change the message of the @var{reporter}. Since this functions +always updates the echo area, such a change will be immediately +presented to the user. +@end defun + +@defun progress-reporter-done reporter +This function should be called when the operation is finished. It +prints the message of @var{reporter} followed by word ``done'' in the +echo area. + +You should always call this function and not hope for +@code{progress-reporter-update} to print ``100%.'' Firstly, it may +never print it, there are many good reasons for this not to happen. +Secondly, ``done'' is more explicit. +@end defun + +@defmac dotimes-with-progress-reporter (var count [result]) message body@dots{} +This is a convenience macro that works the same way as @code{dotimes} +does, but also reports loop progress using the functions described +above. It allows you to save some typing. + +You can rewrite the example in the beginning of this node using +this macro this way: + +@example +(dotimes-with-progress-reporter + (k 500) + "Collecting some mana for Emacs..." + (sit-for 0.01)) +@end example +@end defmac + +@node Logging Messages +@subsection Logging Messages in @samp{*Messages*} +@cindex logging echo-area messages + + Almost all the messages displayed in the echo area are also recorded +in the @samp{*Messages*} buffer so that the user can refer back to +them. This includes all the messages that are output with +@code{message}. + +@defopt message-log-max +This variable specifies how many lines to keep in the @samp{*Messages*} +buffer. The value @code{t} means there is no limit on how many lines to +keep. The value @code{nil} disables message logging entirely. Here's +how to display a message and prevent it from being logged: + +@example +(let (message-log-max) + (message @dots{})) +@end example +@end defopt + + To make @samp{*Messages*} more convenient for the user, the logging +facility combines successive identical messages. It also combines +successive related messages for the sake of two cases: question +followed by answer, and a series of progress messages. + + A ``question followed by an answer'' means two messages like the +ones produced by @code{y-or-n-p}: the first is @samp{@var{question}}, +and the second is @samp{@var{question}...@var{answer}}. The first +message conveys no additional information beyond what's in the second, +so logging the second message discards the first from the log. + + A ``series of progress messages'' means successive messages like +those produced by @code{make-progress-reporter}. They have the form +@samp{@var{base}...@var{how-far}}, where @var{base} is the same each +time, while @var{how-far} varies. Logging each message in the series +discards the previous one, provided they are consecutive. + + The functions @code{make-progress-reporter} and @code{y-or-n-p} +don't have to do anything special to activate the message log +combination feature. It operates whenever two consecutive messages +are logged that share a common prefix ending in @samp{...}. + +@node Echo Area Customization +@subsection Echo Area Customization + + These variables control details of how the echo area works. + +@defvar cursor-in-echo-area +This variable controls where the cursor appears when a message is +displayed in the echo area. If it is non-@code{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 @code{nil}; Lisp programs bind it to @code{t} +for brief periods of time. +@end defvar + +@defvar echo-area-clear-hook +This normal hook is run whenever the echo area is cleared---either by +@code{(message nil)} or for any other reason. +@end defvar + +@defvar echo-keystrokes +This variable determines how much time should elapse before command +characters echo. Its value must be an integer or floating point number, +which specifies the +number of seconds to wait before echoing. If the user types a prefix +key (such as @kbd{C-x}) and then delays this many seconds before +continuing, the prefix key is echoed in the echo area. (Once echoing +begins in a key sequence, all subsequent characters in the same key +sequence are echoed immediately.) + +If the value is zero, then command input is not echoed. +@end defvar + +@defvar message-truncate-lines +Normally, displaying a long message resizes the echo area to display +the entire message. But if the variable @code{message-truncate-lines} +is non-@code{nil}, the echo area does not resize, and the message is +truncated to fit it, as in Emacs 20 and before. +@end defvar + + The variable @code{max-mini-window-height}, which specifies the +maximum height for resizing minibuffer windows, also applies to the +echo area (which is really a special use of the minibuffer window. +@xref{Minibuffer Misc}. + +@node Warnings +@section Reporting Warnings +@cindex warnings + + @dfn{Warnings} are a facility for a program to inform the user of a +possible problem, but continue running. + +@menu +* Warning Basics:: Warnings concepts and functions to report them. +* Warning Variables:: Variables programs bind to customize their warnings. +* Warning Options:: Variables users set to control display of warnings. +@end menu + +@node Warning Basics +@subsection Warning Basics +@cindex severity level + + Every warning has a textual message, which explains the problem for +the user, and a @dfn{severity level} which is a symbol. Here are the +possible severity levels, in order of decreasing severity, and their +meanings: + +@table @code +@item :emergency +A problem that will seriously impair Emacs operation soon +if you do not attend to it promptly. +@item :error +A report of data or circumstances that are inherently wrong. +@item :warning +A report of data or circumstances that are not inherently wrong, but +raise suspicion of a possible problem. +@item :debug +A report of information that may be useful if you are debugging. +@end table + + When your program encounters invalid input data, it can either +signal a Lisp error by calling @code{error} or @code{signal} or report +a warning with severity @code{:error}. Signaling a Lisp error is the +easiest thing to do, but it means the program cannot continue +processing. If you want to take the trouble to implement a way to +continue processing despite the bad data, then reporting a warning of +severity @code{:error} is the right way to inform the user of the +problem. For instance, the Emacs Lisp byte compiler can report an +error that way and continue compiling other functions. (If the +program signals a Lisp error and then handles it with +@code{condition-case}, the user won't see the error message; it could +show the message to the user by reporting it as a warning.) + +@cindex warning type + Each warning has a @dfn{warning type} to classify it. The type is a +list of symbols. The first symbol should be the custom group that you +use for the program's user options. For example, byte compiler +warnings use the warning type @code{(bytecomp)}. You can also +subcategorize the warnings, if you wish, by using more symbols in the +list. + +@defun display-warning type message &optional level buffer-name +This function reports a warning, using @var{message} as the message +and @var{type} as the warning type. @var{level} should be the +severity level, with @code{:warning} being the default. + +@var{buffer-name}, if non-@code{nil}, specifies the name of the buffer +for logging the warning. By default, it is @samp{*Warnings*}. +@end defun + +@defun lwarn type level message &rest args +This function reports a warning using the value of @code{(format +@var{message} @var{args}...)} as the message. In other respects it is +equivalent to @code{display-warning}. +@end defun + +@defun warn message &rest args +This function reports a warning using the value of @code{(format +@var{message} @var{args}...)} as the message, @code{(emacs)} as the +type, and @code{:warning} as the severity level. It exists for +compatibility only; we recommend not using it, because you should +specify a specific warning type. +@end defun + +@node Warning Variables +@subsection Warning Variables + + Programs can customize how their warnings appear by binding +the variables described in this section. + +@defvar warning-levels +This list defines the meaning and severity order of the warning +severity levels. Each element defines one severity level, +and they are arranged in order of decreasing severity. + +Each element has the form @code{(@var{level} @var{string} +@var{function})}, where @var{level} is the severity level it defines. +@var{string} specifies the textual description of this level. +@var{string} should use @samp{%s} to specify where to put the warning +type information, or it can omit the @samp{%s} so as not to include +that information. + +The optional @var{function}, if non-@code{nil}, is a function to call +with no arguments, to get the user's attention. + +Normally you should not change the value of this variable. +@end defvar + +@defvar warning-prefix-function +If non-@code{nil}, the value is a function to generate prefix text for +warnings. Programs can bind the variable to a suitable function. +@code{display-warning} calls this function with the warnings buffer +current, and the function can insert text in it. That text becomes +the beginning of the warning message. + +The function is called with two arguments, the severity level and its +entry in @code{warning-levels}. It should return a list to use as the +entry (this value need not be an actual member of +@code{warning-levels}). By constructing this value, the function can +change the severity of the warning, or specify different handling for +a given severity level. + +If the variable's value is @code{nil} then there is no function +to call. +@end defvar + +@defvar warning-series +Programs can bind this variable to @code{t} to say that the next +warning should begin a series. When several warnings form a series, +that means to leave point on the first warning of the series, rather +than keep moving it for each warning so that it appears on the last one. +The series ends when the local binding is unbound and +@code{warning-series} becomes @code{nil} again. + +The value can also be a symbol with a function definition. That is +equivalent to @code{t}, except that the next warning will also call +the function with no arguments with the warnings buffer current. The +function can insert text which will serve as a header for the series +of warnings. + +Once a series has begun, the value is a marker which points to the +buffer position in the warnings buffer of the start of the series. + +The variable's normal value is @code{nil}, which means to handle +each warning separately. +@end defvar + +@defvar warning-fill-prefix +When this variable is non-@code{nil}, it specifies a fill prefix to +use for filling each warning's text. +@end defvar + +@defvar warning-type-format +This variable specifies the format for displaying the warning type +in the warning message. The result of formatting the type this way +gets included in the message under the control of the string in the +entry in @code{warning-levels}. The default value is @code{" (%s)"}. +If you bind it to @code{""} then the warning type won't appear at +all. +@end defvar + +@node Warning Options +@subsection Warning Options + + These variables are used by users to control what happens +when a Lisp program reports a warning. + +@defopt warning-minimum-level +This user option specifies the minimum severity level that should be +shown immediately to the user. The default is @code{:warning}, which +means to immediately display all warnings except @code{:debug} +warnings. +@end defopt + +@defopt warning-minimum-log-level +This user option specifies the minimum severity level that should be +logged in the warnings buffer. The default is @code{:warning}, which +means to log all warnings except @code{:debug} warnings. +@end defopt + +@defopt warning-suppress-types +This list specifies which warning types should not be displayed +immediately for the user. Each element of the list should be a list +of symbols. If its elements match the first elements in a warning +type, then that warning is not displayed immediately. +@end defopt + +@defopt warning-suppress-log-types +This list specifies which warning types should not be logged in the +warnings buffer. Each element of the list should be a list of +symbols. If it matches the first few elements in a warning type, then +that warning is not logged. +@end defopt + +@node Invisible Text +@section Invisible Text + +@cindex invisible text +You can make characters @dfn{invisible}, so that they do not appear on +the screen, with the @code{invisible} property. This can be either a +text property (@pxref{Text Properties}) or a property of an overlay +(@pxref{Overlays}). Cursor motion also partly ignores these +characters; if the command loop finds point within them, it moves +point to the other side of them. + +In the simplest case, any non-@code{nil} @code{invisible} property makes +a character invisible. This is the default case---if you don't alter +the default value of @code{buffer-invisibility-spec}, this is how the +@code{invisible} property works. You should normally use @code{t} +as the value of the @code{invisible} property if you don't plan +to set @code{buffer-invisibility-spec} yourself. + +More generally, you can use the variable @code{buffer-invisibility-spec} +to control which values of the @code{invisible} property make text +invisible. This permits you to classify the text into different subsets +in advance, by giving them different @code{invisible} values, and +subsequently make various subsets visible or invisible by changing the +value of @code{buffer-invisibility-spec}. + +Controlling visibility with @code{buffer-invisibility-spec} is +especially useful in a program to display the list of entries in a +database. It permits the implementation of convenient filtering +commands to view just a part of the entries in the database. Setting +this variable is very fast, much faster than scanning all the text in +the buffer looking for properties to change. + +@defvar buffer-invisibility-spec +This variable specifies which kinds of @code{invisible} properties +actually make a character invisible. Setting this variable makes it +buffer-local. + +@table @asis +@item @code{t} +A character is invisible if its @code{invisible} property is +non-@code{nil}. This is the default. + +@item a list +Each element of the list specifies a criterion for invisibility; if a +character's @code{invisible} property fits any one of these criteria, +the character is invisible. The list can have two kinds of elements: + +@table @code +@item @var{atom} +A character is invisible if its @code{invisible} property value +is @var{atom} or if it is a list with @var{atom} as a member. + +@item (@var{atom} . t) +A character is invisible if its @code{invisible} property value is +@var{atom} or if it is a list with @var{atom} as a member. Moreover, +a sequence of such characters displays as an ellipsis. +@end table +@end table +@end defvar + + Two functions are specifically provided for adding elements to +@code{buffer-invisibility-spec} and removing elements from it. + +@defun add-to-invisibility-spec element +This function adds the element @var{element} to +@code{buffer-invisibility-spec}. If @code{buffer-invisibility-spec} +was @code{t}, it changes to a list, @code{(t)}, so that text whose +@code{invisible} property is @code{t} remains invisible. +@end defun + +@defun remove-from-invisibility-spec element +This removes the element @var{element} from +@code{buffer-invisibility-spec}. This does nothing if @var{element} +is not in the list. +@end defun + + A convention for use of @code{buffer-invisibility-spec} is that a +major mode should use the mode's own name as an element of +@code{buffer-invisibility-spec} and as the value of the +@code{invisible} property: + +@example +;; @r{If you want to display an ellipsis:} +(add-to-invisibility-spec '(my-symbol . t)) +;; @r{If you don't want ellipsis:} +(add-to-invisibility-spec 'my-symbol) + +(overlay-put (make-overlay beginning end) + 'invisible 'my-symbol) + +;; @r{When done with the overlays:} +(remove-from-invisibility-spec '(my-symbol . t)) +;; @r{Or respectively:} +(remove-from-invisibility-spec 'my-symbol) +@end example + +@vindex line-move-ignore-invisible + Ordinarily, functions that operate on text or move point do not care +whether the text is invisible. The user-level line motion commands +explicitly ignore invisible newlines if +@code{line-move-ignore-invisible} is non-@code{nil} (the default), but +only because they are explicitly programmed to do so. + + However, if a command ends with point inside or immediately before +invisible text, the main editing loop moves point further forward or +further backward (in the same direction that the command already moved +it) until that condition is no longer true. Thus, if the command +moved point back into an invisible range, Emacs moves point back to +the beginning of that range, and then back one more character. If the +command moved point forward into an invisible range, Emacs moves point +forward up to the first visible character that follows the invisible +text. + + Incremental search can make invisible overlays visible temporarily +and/or permanently when a match includes invisible text. To enable +this, the overlay should have a non-@code{nil} +@code{isearch-open-invisible} property. The property value should be a +function to be called with the overlay as an argument. This function +should make the overlay visible permanently; it is used when the match +overlaps the overlay on exit from the search. + + During the search, such overlays are made temporarily visible by +temporarily modifying their invisible and intangible properties. If you +want this to be done differently for a certain overlay, give it an +@code{isearch-open-invisible-temporary} property which is a function. +The function is called with two arguments: the first is the overlay, and +the second is @code{nil} to make the overlay visible, or @code{t} to +make it invisible again. + +@node Selective Display +@section Selective Display +@c @cindex selective display Duplicates selective-display + + @dfn{Selective display} refers to a pair of related features for +hiding certain lines on the screen. + + The first variant, explicit selective display, is designed for use +in a Lisp program: it controls which lines are hidden by altering the +text. This kind of hiding in some ways resembles the effect of the +@code{invisible} property (@pxref{Invisible Text}), but the two +features are different and do not work the same way. + + In the second variant, the choice of lines to hide is made +automatically based on indentation. This variant is designed to be a +user-level feature. + + The way you control explicit selective display is by replacing a +newline (control-j) with a carriage return (control-m). The text that +was formerly a line following that newline is now hidden. Strictly +speaking, it is temporarily no longer a line at all, since only +newlines can separate lines; it is now part of the previous line. + + Selective display does not directly affect editing commands. For +example, @kbd{C-f} (@code{forward-char}) moves point unhesitatingly +into hidden text. However, the replacement of newline characters with +carriage return characters affects some editing commands. For +example, @code{next-line} skips hidden lines, since it searches only +for newlines. Modes that use selective display can also define +commands that take account of the newlines, or that control which +parts of the text are hidden. + + When you write a selectively displayed buffer into a file, all the +control-m's are output as newlines. This means that when you next read +in the file, it looks OK, with nothing hidden. The selective display +effect is seen only within Emacs. + +@defvar selective-display +This buffer-local variable enables selective display. This means that +lines, or portions of lines, may be made hidden. + +@itemize @bullet +@item +If the value of @code{selective-display} is @code{t}, then the character +control-m marks the start of hidden text; the control-m, and the rest +of the line following it, are not displayed. This is explicit selective +display. + +@item +If the value of @code{selective-display} is a positive integer, then +lines that start with more than that many columns of indentation are not +displayed. +@end itemize + +When some portion of a buffer is hidden, the vertical movement +commands operate as if that portion did not exist, allowing a single +@code{next-line} command to skip any number of hidden lines. +However, character movement commands (such as @code{forward-char}) do +not skip the hidden portion, and it is possible (if tricky) to insert +or delete text in an hidden portion. + +In the examples below, we show the @emph{display appearance} of the +buffer @code{foo}, which changes with the value of +@code{selective-display}. The @emph{contents} of the buffer do not +change. + +@example +@group +(setq selective-display nil) + @result{} 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 ---------- +@end group + +@group +(setq selective-display 2) + @result{} 2 + +---------- Buffer: foo ---------- +1 on this column + 2on this column + 2on this column +1 on this column +---------- Buffer: foo ---------- +@end group +@end example +@end defvar + +@defvar selective-display-ellipses +If this buffer-local variable is non-@code{nil}, then Emacs displays +@samp{@dots{}} at the end of a line that is followed by hidden text. +This example is a continuation of the previous one. + +@example +@group +(setq selective-display-ellipses t) + @result{} t + +---------- Buffer: foo ---------- +1 on this column + 2on this column ... + 2on this column +1 on this column +---------- Buffer: foo ---------- +@end group +@end example + +You can use a display table to substitute other text for the ellipsis +(@samp{@dots{}}). @xref{Display Tables}. +@end defvar + +@node Temporary Displays +@section Temporary Displays + + Temporary displays are used by Lisp programs to put output into a +buffer and then present it to the user for perusal rather than for +editing. Many help commands use this feature. + +@defspec with-output-to-temp-buffer buffer-name forms@dots{} +This function executes @var{forms} while arranging to insert any output +they print into the buffer named @var{buffer-name}, which is first +created if necessary, and put into Help mode. Finally, the buffer is +displayed in some window, but not selected. + +If the @var{forms} do not change the major mode in the output buffer, +so that it is still Help mode at the end of their execution, then +@code{with-output-to-temp-buffer} makes this buffer read-only at the +end, and also scans it for function and variable names to make them +into clickable cross-references. @xref{Docstring hyperlinks, , Tips +for Documentation Strings}, in particular the item on hyperlinks in +documentation strings, for more details. + +The string @var{buffer-name} specifies the temporary buffer, which +need not already exist. The argument must be a string, not a buffer. +The buffer is erased initially (with no questions asked), and it is +marked as unmodified after @code{with-output-to-temp-buffer} exits. + +@code{with-output-to-temp-buffer} binds @code{standard-output} to the +temporary buffer, then it evaluates the forms in @var{forms}. Output +using the Lisp output functions within @var{forms} goes by default to +that buffer (but screen display and messages in the echo area, although +they are ``output'' in the general sense of the word, are not affected). +@xref{Output Functions}. + +Several hooks are available for customizing the behavior +of this construct; they are listed below. + +The value of the last form in @var{forms} is returned. + +@example +@group +---------- Buffer: foo ---------- + This is the contents of foo. +---------- Buffer: foo ---------- +@end group + +@group +(with-output-to-temp-buffer "foo" + (print 20) + (print standard-output)) +@result{} #<buffer foo> + +---------- Buffer: foo ---------- +20 + +#<buffer foo> + +---------- Buffer: foo ---------- +@end group +@end example +@end defspec + +@defvar temp-buffer-show-function +If this variable is non-@code{nil}, @code{with-output-to-temp-buffer} +calls it as a function to do the job of displaying a help buffer. The +function gets one argument, which is the buffer it should display. + +It is a good idea for this function to run @code{temp-buffer-show-hook} +just as @code{with-output-to-temp-buffer} normally would, inside of +@code{save-selected-window} and with the chosen window and buffer +selected. +@end defvar + +@defvar temp-buffer-setup-hook +This normal hook is run by @code{with-output-to-temp-buffer} before +evaluating @var{body}. When the hook runs, the temporary buffer is +current. This hook is normally set up with a function to put the +buffer in Help mode. +@end defvar + +@defvar temp-buffer-show-hook +This normal hook is run by @code{with-output-to-temp-buffer} after +displaying the temporary buffer. When the hook runs, the temporary buffer +is current, and the window it was displayed in is selected. This hook +is normally set up with a function to make the buffer read only, and +find function names and variable names in it, provided the major mode +is Help mode. +@end defvar + +@defun momentary-string-display string position &optional char message +This function momentarily displays @var{string} in the current buffer at +@var{position}. It has no effect on the undo list or on the buffer's +modification status. + +The momentary display remains until the next input event. If the next +input event is @var{char}, @code{momentary-string-display} ignores it +and returns. Otherwise, that event remains buffered for subsequent use +as input. Thus, typing @var{char} will simply remove the string from +the display, while typing (say) @kbd{C-f} will remove the string from +the display and later (presumably) move point forward. The argument +@var{char} is a space by default. + +The return value of @code{momentary-string-display} is not meaningful. + +If the string @var{string} does not contain control characters, you can +do the same job in a more general way by creating (and then subsequently +deleting) an overlay with a @code{before-string} property. +@xref{Overlay Properties}. + +If @var{message} is non-@code{nil}, it is displayed in the echo area +while @var{string} is displayed in the buffer. If it is @code{nil}, a +default message says to type @var{char} to continue. + +In this example, point is initially located at the beginning of the +second line: + +@example +@group +---------- Buffer: foo ---------- +This is the contents of foo. +@point{}Second line. +---------- Buffer: foo ---------- +@end group + +@group +(momentary-string-display + "**** Important Message! ****" + (point) ?\r + "Type RET when done reading") +@result{} t +@end group + +@group +---------- Buffer: foo ---------- +This is the contents of foo. +**** Important Message! ****Second line. +---------- Buffer: foo ---------- + +---------- Echo Area ---------- +Type RET when done reading +---------- Echo Area ---------- +@end group +@end example +@end defun + +@node Overlays +@section Overlays +@cindex overlays + +You can use @dfn{overlays} to alter the appearance of a buffer's text on +the screen, for the sake of presentation features. An overlay is an +object that belongs to a particular buffer, and has a specified +beginning and end. It also has properties that you can examine and set; +these affect the display of the text within the overlay. + +An overlay uses markers to record its beginning and end; thus, +editing the text of the buffer adjusts the beginning and end of each +overlay so that it stays with the text. When you create the overlay, +you can specify whether text inserted at the beginning should be +inside the overlay or outside, and likewise for the end of the overlay. + +@menu +* Managing Overlays:: Creating and moving overlays. +* Overlay Properties:: How to read and set properties. + What properties do to the screen display. +* Finding Overlays:: Searching for overlays. +@end menu + +@node Managing Overlays +@subsection Managing Overlays + + This section describes the functions to create, delete and move +overlays, and to examine their contents. Overlay changes are not +recorded in the buffer's undo list, since the overlays are not +part of the buffer's contents. + +@defun overlayp object +This function returns @code{t} if @var{object} is an overlay. +@end defun + +@defun make-overlay start end &optional buffer front-advance rear-advance +This function creates and returns an overlay that belongs to +@var{buffer} and ranges from @var{start} to @var{end}. Both @var{start} +and @var{end} must specify buffer positions; they may be integers or +markers. If @var{buffer} is omitted, the overlay is created in the +current buffer. + +The arguments @var{front-advance} and @var{rear-advance} specify the +marker insertion type for the start of the overlay and for the end of +the overlay, respectively. @xref{Marker Insertion Types}. If they +are both @code{nil}, the default, then the overlay extends to include +any text inserted at the beginning, but not text inserted at the end. +If @var{front-advance} is non-@code{nil}, text inserted at the +beginning of the overlay is excluded from the overlay. If +@var{rear-advance} is non-@code{nil}, text inserted at the end of the +overlay is included in the overlay. +@end defun + +@defun overlay-start overlay +This function returns the position at which @var{overlay} starts, +as an integer. +@end defun + +@defun overlay-end overlay +This function returns the position at which @var{overlay} ends, +as an integer. +@end defun + +@defun overlay-buffer overlay +This function returns the buffer that @var{overlay} belongs to. It +returns @code{nil} if @var{overlay} has been deleted. +@end defun + +@defun delete-overlay overlay +This function deletes @var{overlay}. The overlay continues to exist as +a Lisp object, and its property list is unchanged, but it ceases to be +attached to the buffer it belonged to, and ceases to have any effect on +display. + +A deleted overlay is not permanently disconnected. You can give it a +position in a buffer again by calling @code{move-overlay}. +@end defun + +@defun move-overlay overlay start end &optional buffer +This function moves @var{overlay} to @var{buffer}, and places its bounds +at @var{start} and @var{end}. Both arguments @var{start} and @var{end} +must specify buffer positions; they may be integers or markers. + +If @var{buffer} is omitted, @var{overlay} stays in the same buffer it +was already associated with; if @var{overlay} was deleted, it goes into +the current buffer. + +The return value is @var{overlay}. + +This is the only valid way to change the endpoints of an overlay. Do +not try modifying the markers in the overlay by hand, as that fails to +update other vital data structures and can cause some overlays to be +``lost.'' +@end defun + +@defun remove-overlays &optional start end name value +This function removes all the overlays between @var{start} and +@var{end} whose property @var{name} has the value @var{value}. It can +move the endpoints of the overlays in the region, or split them. + +If @var{name} is omitted or @code{nil}, it means to delete all overlays in +the specified region. If @var{start} and/or @var{end} are omitted or +@code{nil}, that means the beginning and end of the buffer respectively. +Therefore, @code{(remove-overlays)} removes all the overlays in the +current buffer. +@end defun + + Here are some examples: + +@example +;; @r{Create an overlay.} +(setq foo (make-overlay 1 10)) + @result{} #<overlay from 1 to 10 in display.texi> +(overlay-start foo) + @result{} 1 +(overlay-end foo) + @result{} 10 +(overlay-buffer foo) + @result{} #<buffer display.texi> +;; @r{Give it a property we can check later.} +(overlay-put foo 'happy t) + @result{} t +;; @r{Verify the property is present.} +(overlay-get foo 'happy) + @result{} t +;; @r{Move the overlay.} +(move-overlay foo 5 20) + @result{} #<overlay from 5 to 20 in display.texi> +(overlay-start foo) + @result{} 5 +(overlay-end foo) + @result{} 20 +;; @r{Delete the overlay.} +(delete-overlay foo) + @result{} nil +;; @r{Verify it is deleted.} +foo + @result{} #<overlay in no buffer> +;; @r{A deleted overlay has no position.} +(overlay-start foo) + @result{} nil +(overlay-end foo) + @result{} nil +(overlay-buffer foo) + @result{} nil +;; @r{Undelete the overlay.} +(move-overlay foo 1 20) + @result{} #<overlay from 1 to 20 in display.texi> +;; @r{Verify the results.} +(overlay-start foo) + @result{} 1 +(overlay-end foo) + @result{} 20 +(overlay-buffer foo) + @result{} #<buffer display.texi> +;; @r{Moving and deleting the overlay does not change its properties.} +(overlay-get foo 'happy) + @result{} t +@end example + + Emacs stores the overlays of each buffer in two lists, divided +around an arbitrary ``center position.'' One list extends backwards +through the buffer from that center position, and the other extends +forwards from that center position. The center position can be anywhere +in the buffer. + +@defun overlay-recenter pos +This function recenters the overlays of the current buffer around +position @var{pos}. That makes overlay lookup faster for positions +near @var{pos}, but slower for positions far away from @var{pos}. +@end defun + + A loop that scans the buffer forwards, creating overlays, can run +faster if you do @code{(overlay-recenter (point-max))} first. + +@node Overlay Properties +@subsection Overlay Properties + + Overlay properties are like text properties in that the properties that +alter how a character is displayed can come from either source. But in +most respects they are different. @xref{Text Properties}, for comparison. + + Text properties are considered a part of the text; overlays and +their properties are specifically considered not to be part of the +text. Thus, copying text between various buffers and strings +preserves text properties, but does not try to preserve overlays. +Changing a buffer's text properties marks the buffer as modified, +while moving an overlay or changing its properties does not. Unlike +text property changes, overlay property changes are not recorded in +the buffer's undo list. + + These functions read and set the properties of an overlay: + +@defun overlay-get overlay prop +This function returns the value of property @var{prop} recorded in +@var{overlay}, if any. If @var{overlay} does not record any value for +that property, but it does have a @code{category} property which is a +symbol, that symbol's @var{prop} property is used. Otherwise, the value +is @code{nil}. +@end defun + +@defun overlay-put overlay prop value +This function sets the value of property @var{prop} recorded in +@var{overlay} to @var{value}. It returns @var{value}. +@end defun + +@defun overlay-properties overlay +This returns a copy of the property list of @var{overlay}. +@end defun + + See also the function @code{get-char-property} which checks both +overlay properties and text properties for a given character. +@xref{Examining Properties}. + + Many overlay properties have special meanings; here is a table +of them: + +@table @code +@item priority +@kindex priority @r{(overlay property)} +This property's value (which should be a nonnegative integer number) +determines the priority of the overlay. The priority matters when two +or more overlays cover the same character and both specify the same +property; the one whose @code{priority} value is larger takes priority +over the other. For the @code{face} property, the higher priority +value does not completely replace the other; instead, its face +attributes override the face attributes of the lower priority +@code{face} property. + +Currently, all overlays take priority over text properties. Please +avoid using negative priority values, as we have not yet decided just +what they should mean. + +@item window +@kindex window @r{(overlay property)} +If the @code{window} property is non-@code{nil}, then the overlay +applies only on that window. + +@item category +@kindex category @r{(overlay property)} +If an overlay has a @code{category} property, we call it the +@dfn{category} of the overlay. It should be a symbol. The properties +of the symbol serve as defaults for the properties of the overlay. + +@item face +@kindex face @r{(overlay property)} +This property controls the way text is displayed---for example, which +font and which colors. @xref{Faces}, for more information. + +In the simplest case, the value is a face name. It can also be a list; +then each element can be any of these possibilities: + +@itemize @bullet +@item +A face name (a symbol or string). + +@item +A property list of face attributes. This has the form (@var{keyword} +@var{value} @dots{}), where each @var{keyword} is a face attribute +name and @var{value} is a meaningful value for that attribute. With +this feature, you do not need to create a face each time you want to +specify a particular attribute for certain text. @xref{Face +Attributes}. + +@item +A cons cell, either of the form @code{(foreground-color . @var{color-name})} or +@code{(background-color . @var{color-name})}. These elements specify +just the foreground color or just the background color. + +@code{(foreground-color . @var{color-name})} has the same effect as +@code{(:foreground @var{color-name})}; likewise for the background. +@end itemize + +@item mouse-face +@kindex mouse-face @r{(overlay property)} +This property is used instead of @code{face} when the mouse is within +the range of the overlay. + +@item display +@kindex display @r{(overlay property)} +This property activates various features that change the +way text is displayed. For example, it can make text appear taller +or shorter, higher or lower, wider or narrower, or replaced with an image. +@xref{Display Property}. + +@item help-echo +@kindex help-echo @r{(overlay property)} +If an overlay has a @code{help-echo} property, then when you move the +mouse onto the text in the overlay, Emacs displays a help string in the +echo area, or in the tooltip window. For details see @ref{Text +help-echo}. + +@item modification-hooks +@kindex modification-hooks @r{(overlay property)} +This property's value is a list of functions to be called if any +character within the overlay is changed or if text is inserted strictly +within the overlay. + +The hook functions are called both before and after each change. +If the functions save the information they receive, and compare notes +between calls, they can determine exactly what change has been made +in the buffer text. + +When called before a change, each function receives four arguments: the +overlay, @code{nil}, and the beginning and end of the text range to be +modified. + +When called after a change, each function receives five arguments: the +overlay, @code{t}, the beginning and end of the text range just +modified, and the length of the pre-change text replaced by that range. +(For an insertion, the pre-change length is zero; for a deletion, that +length is the number of characters deleted, and the post-change +beginning and end are equal.) + +If these functions modify the buffer, they should bind +@code{inhibit-modification-hooks} to @code{t} around doing so, to +avoid confusing the internal mechanism that calls these hooks. + +Text properties also support the @code{modification-hooks} property, +but the details are somewhat different (@pxref{Special Properties}). + +@item insert-in-front-hooks +@kindex insert-in-front-hooks @r{(overlay property)} +This property's value is a list of functions to be called before and +after inserting text right at the beginning of the overlay. The calling +conventions are the same as for the @code{modification-hooks} functions. + +@item insert-behind-hooks +@kindex insert-behind-hooks @r{(overlay property)} +This property's value is a list of functions to be called before and +after inserting text right at the end of the overlay. The calling +conventions are the same as for the @code{modification-hooks} functions. + +@item invisible +@kindex invisible @r{(overlay property)} +The @code{invisible} property can make the text in the overlay +invisible, which means that it does not appear on the screen. +@xref{Invisible Text}, for details. + +@item intangible +@kindex intangible @r{(overlay property)} +The @code{intangible} property on an overlay works just like the +@code{intangible} text property. @xref{Special Properties}, for details. + +@item isearch-open-invisible +This property tells incremental search how to make an invisible overlay +visible, permanently, if the final match overlaps it. @xref{Invisible +Text}. + +@item isearch-open-invisible-temporary +This property tells incremental search how to make an invisible overlay +visible, temporarily, during the search. @xref{Invisible Text}. + +@item before-string +@kindex before-string @r{(overlay property)} +This property's value is a string to add to the display at the beginning +of the overlay. The string does not appear in the buffer in any +sense---only on the screen. + +@item after-string +@kindex after-string @r{(overlay property)} +This property's value is a string to add to the display at the end of +the overlay. The string does not appear in the buffer in any +sense---only on the screen. + +@item evaporate +@kindex evaporate @r{(overlay property)} +If this property is non-@code{nil}, the overlay is deleted automatically +if it becomes empty (i.e., if its length becomes zero). If you give +an empty overlay a non-@code{nil} @code{evaporate} property, that deletes +it immediately. + +@item local-map +@cindex keymap of character (and overlays) +@kindex local-map @r{(overlay property)} +If this property is non-@code{nil}, it specifies a keymap for a portion +of the text. The property's value replaces the buffer's local map, when +the character after point is within the overlay. @xref{Active Keymaps}. + +@item keymap +@kindex keymap @r{(overlay property)} +The @code{keymap} property is similar to @code{local-map} but overrides the +buffer's local map (and the map specified by the @code{local-map} +property) rather than replacing it. +@end table + +@node Finding Overlays +@subsection Searching for Overlays + +@defun overlays-at pos +This function returns a list of all the overlays that cover the +character at position @var{pos} in the current buffer. The list is in +no particular order. An overlay contains position @var{pos} if it +begins at or before @var{pos}, and ends after @var{pos}. + +To illustrate usage, here is a Lisp function that returns a list of the +overlays that specify property @var{prop} for the character at point: + +@smallexample +(defun find-overlays-specifying (prop) + (let ((overlays (overlays-at (point))) + found) + (while overlays + (let ((overlay (car overlays))) + (if (overlay-get overlay prop) + (setq found (cons overlay found)))) + (setq overlays (cdr overlays))) + found)) +@end smallexample +@end defun + +@defun overlays-in beg end +This function returns a list of the overlays that overlap the region +@var{beg} through @var{end}. ``Overlap'' means that at least one +character is contained within the overlay and also contained within the +specified region; however, empty overlays are included in the result if +they are located at @var{beg}, or strictly between @var{beg} and @var{end}. +@end defun + +@defun next-overlay-change pos +This function returns the buffer position of the next beginning or end +of an overlay, after @var{pos}. If there is none, it returns +@code{(point-max)}. +@end defun + +@defun previous-overlay-change pos +This function returns the buffer position of the previous beginning or +end of an overlay, before @var{pos}. If there is none, it returns +@code{(point-min)}. +@end defun + + As an example, here's a simplified (and inefficient) version of the +primitive function @code{next-single-char-property-change} +(@pxref{Property Search}). It searches forward from position +@var{pos} for the next position where the value of a given property +@code{prop}, as obtained from either overlays or text properties, +changes. + +@smallexample +(defun next-single-char-property-change (position prop) + (save-excursion + (goto-char position) + (let ((propval (get-char-property (point) prop))) + (while (and (not (eobp)) + (eq (get-char-property (point) prop) propval)) + (goto-char (min (next-overlay-change (point)) + (next-single-property-change (point) prop))))) + (point))) +@end smallexample + +@node Width +@section Width + +Since not all characters have the same width, these functions let you +check the width of a character. @xref{Primitive Indent}, and +@ref{Screen Lines}, for related functions. + +@defun char-width char +This function returns the width in columns of the character @var{char}, +if it were displayed in the current buffer and the selected window. +@end defun + +@defun string-width string +This function returns the width in columns of the string @var{string}, +if it were displayed in the current buffer and the selected window. +@end defun + +@defun truncate-string-to-width string width &optional start-column padding ellipsis +This function returns the part of @var{string} that fits within +@var{width} columns, as a new string. + +If @var{string} does not reach @var{width}, then the result ends where +@var{string} ends. If one multi-column character in @var{string} +extends across the column @var{width}, that character is not included in +the result. Thus, the result can fall short of @var{width} but cannot +go beyond it. + +The optional argument @var{start-column} specifies the starting column. +If this is non-@code{nil}, then the first @var{start-column} columns of +the string are omitted from the value. If one multi-column character in +@var{string} extends across the column @var{start-column}, that +character is not included. + +The optional argument @var{padding}, if non-@code{nil}, is a padding +character added at the beginning and end of the result string, to extend +it to exactly @var{width} columns. The padding character is used at the +end of the result if it falls short of @var{width}. It is also used at +the beginning of the result if one multi-column character in +@var{string} extends across the column @var{start-column}. + +If @var{ellipsis} is non-@code{nil}, it should be a string which will +replace the end of @var{str} (including any padding) if it extends +beyond @var{end-column}, unless the display width of @var{str} is +equal to or less than the display width of @var{ellipsis}. If +@var{ellipsis} is non-@code{nil} and not a string, it stands for +@code{"..."}. + +@example +(truncate-string-to-width "\tab\t" 12 4) + @result{} "ab" +(truncate-string-to-width "\tab\t" 12 4 ?\s) + @result{} " ab " +@end example +@end defun + +@node Line Height +@section Line Height +@cindex line height + + The total height of each display line consists of the height of the +contents of the line, plus optional additional vertical line spacing +above or below the display line. + + The height of the line contents is the maximum height of any +character or image on that display line, including the final newline +if there is one. (A display line that is continued doesn't include a +final newline.) That is the default line height, if you do nothing to +specify a greater height. (In the most common case, this equals the +height of the default frame font.) + + There are several ways to explicitly specify a larger line height, +either by specifying an absolute height for the display line, or by +specifying vertical space. However, no matter what you specify, the +actual line height can never be less than the default. + +@kindex line-height @r{(text property)} + A newline can have a @code{line-height} text or overlay property +that controls the total height of the display line ending in that +newline. + + If the property value is @code{t}, the newline character has no +effect on the displayed height of the line---the visible contents +alone determine the height. This is useful for tiling small images +(or image slices) without adding blank areas between the images. + + If the property value is a list of the form @code{(@var{height} +@var{total})}, that adds extra space @emph{below} the display line. +First Emacs uses @var{height} as a height spec to control extra space +@emph{above} the line; then it adds enough space @emph{below} the line +to bring the total line height up to @var{total}. In this case, the +other ways to specify the line spacing are ignored. + + Any other kind of property value is a height spec, which translates +into a number---the specified line height. There are several ways to +write a height spec; here's how each of them translates into a number: + +@table @code +@item @var{integer} +If the height spec is a positive integer, the height value is that integer. +@item @var{float} +If the height spec is a float, @var{float}, the numeric height value +is @var{float} times the frame's default line height. +@item (@var{face} . @var{ratio}) +If the height spec is a cons of the format shown, the numeric height +is @var{ratio} times the height of face @var{face}. @var{ratio} can +be any type of number, or @code{nil} which means a ratio of 1. +If @var{face} is @code{t}, it refers to the current face. +@item (nil . @var{ratio}) +If the height spec is a cons of the format shown, the numeric height +is @var{ratio} times the height of the contents of the line. +@end table + + Thus, any valid height spec determines the height in pixels, one way +or another. If the line contents' height is less than that, Emacs +adds extra vertical space above the line to achieve the specified +total height. + + If you don't specify the @code{line-height} property, the line's +height consists of the contents' height plus the line spacing. +There are several ways to specify the line spacing for different +parts of Emacs text. + +@vindex default-line-spacing + You can specify the line spacing for all lines in a frame with the +@code{line-spacing} frame parameter (@pxref{Layout Parameters}). +However, if the variable @code{default-line-spacing} is +non-@code{nil}, it overrides the frame's @code{line-spacing} +parameter. An integer value specifies the number of pixels put below +lines on graphical displays. A floating point number specifies the +spacing relative to the frame's default line height. + +@vindex line-spacing + You can specify the line spacing for all lines in a buffer via the +buffer-local @code{line-spacing} variable. An integer value specifies +the number of pixels put below lines on graphical displays. A floating +point number specifies the spacing relative to the default frame line +height. This overrides line spacings specified for the frame. + +@kindex line-spacing @r{(text property)} + Finally, a newline can have a @code{line-spacing} text or overlay +property that overrides the default frame line spacing and the buffer +local @code{line-spacing} variable, for the display line ending in +that newline. + + One way or another, these mechanisms specify a Lisp value for the +spacing of each line. The value is a height spec, and it translates +into a Lisp value as described above. However, in this case the +numeric height value specifies the line spacing, rather than the line +height. + +@node Faces +@section Faces +@cindex faces + + A @dfn{face} is a named collection of graphical attributes: font +family, foreground color, background color, optional underlining, and +many others. Faces are used in Emacs to control the style of display of +particular parts of the text or the frame. @xref{Standard Faces,,, +emacs, The GNU Emacs Manual}, for the list of faces Emacs normally +comes with. + +@cindex face id +Each face has its own @dfn{face number}, which distinguishes faces at +low levels within Emacs. However, for most purposes, you refer to +faces in Lisp programs by the symbols that name them. + +@defun facep object +This function returns @code{t} if @var{object} is a face name string +or symbol (or if it is a vector of the kind used internally to record +face data). It returns @code{nil} otherwise. +@end defun + +Each face name is meaningful for all frames, and by default it has the +same meaning in all frames. But you can arrange to give a particular +face name a special meaning in one frame if you wish. + +@menu +* Defining Faces:: How to define a face with @code{defface}. +* Face Attributes:: What is in a face? +* Attribute Functions:: Functions to examine and set face attributes. +* Displaying Faces:: How Emacs combines the faces specified for a character. +* Font Selection:: Finding the best available font for a face. +* Face Functions:: How to define and examine faces. +* Auto Faces:: Hook for automatic face assignment. +* Font Lookup:: Looking up the names of available fonts + and information about them. +* Fontsets:: A fontset is a collection of fonts + that handle a range of character sets. +@end menu + +@node Defining Faces +@subsection Defining Faces + + The way to define a new face is with @code{defface}. This creates a +kind of customization item (@pxref{Customization}) which the user can +customize using the Customization buffer (@pxref{Easy Customization,,, +emacs, The GNU Emacs Manual}). + +@defmac defface face spec doc [keyword value]@dots{} +This declares @var{face} as a customizable face that defaults +according to @var{spec}. You should not quote the symbol @var{face}, +and it should not end in @samp{-face} (that would be redundant). The +argument @var{doc} specifies the face documentation. The keywords you +can use in @code{defface} are the same as in @code{defgroup} and +@code{defcustom} (@pxref{Common Keywords}). + +When @code{defface} executes, it defines the face according to +@var{spec}, then uses any customizations that were read from the +init file (@pxref{Init File}) to override that specification. + +When you evaluate a @code{defface} form with @kbd{C-M-x} in Emacs +Lisp mode (@code{eval-defun}), a special feature of @code{eval-defun} +overrides any customizations of the face. This way, the face reflects +exactly what the @code{defface} says. + +The purpose of @var{spec} is to specify how the face should appear on +different kinds of terminals. It should be an alist whose elements +have the form @code{(@var{display} @var{atts})}. Each element's +@sc{car}, @var{display}, specifies a class of terminals. (The first +element, if its @sc{car} is @code{default}, is special---it specifies +defaults for the remaining elements). The element's @sc{cadr}, +@var{atts}, is a list of face attributes and their values; it +specifies what the face should look like on that kind of terminal. +The possible attributes are defined in the value of +@code{custom-face-attributes}. + +The @var{display} part of an element of @var{spec} determines which +frames the element matches. If more than one element of @var{spec} +matches a given frame, the first element that matches is the one used +for that frame. There are three possibilities for @var{display}: + +@table @asis +@item @code{default} +This element of @var{spec} doesn't match any frames; instead, it +specifies defaults that apply to all frames. This kind of element, if +used, must be the first element of @var{spec}. Each of the following +elements can override any or all of these defaults. + +@item @code{t} +This element of @var{spec} matches all frames. Therefore, any +subsequent elements of @var{spec} are never used. Normally +@code{t} is used in the last (or only) element of @var{spec}. + +@item a list +If @var{display} is a list, each element should have the form +@code{(@var{characteristic} @var{value}@dots{})}. Here +@var{characteristic} specifies a way of classifying frames, and the +@var{value}s are possible classifications which @var{display} should +apply to. Here are the possible values of @var{characteristic}: + +@table @code +@item type +The kind of window system the frame uses---either @code{graphic} (any +graphics-capable display), @code{x}, @code{pc} (for the MS-DOS console), +@code{w32} (for MS Windows 9X/NT/2K/XP), @code{mac} (for the Macintosh +display), or @code{tty} (a non-graphics-capable display). +@xref{Window Systems, window-system}. + +@item class +What kinds of colors the frame supports---either @code{color}, +@code{grayscale}, or @code{mono}. + +@item background +The kind of background---either @code{light} or @code{dark}. + +@item min-colors +An integer that represents the minimum number of colors the frame +should support. This matches a frame if its +@code{display-color-cells} value is at least the specified integer. + +@item supports +Whether or not the frame can display the face attributes given in +@var{value}@dots{} (@pxref{Face Attributes}). See the documentation +for the function @code{display-supports-face-attributes-p} for more +information on exactly how this testing is done. @xref{Display Face +Attribute Testing}. +@end table + +If an element of @var{display} specifies more than one @var{value} for a +given @var{characteristic}, any of those values is acceptable. If +@var{display} has more than one element, each element should specify a +different @var{characteristic}; then @emph{each} characteristic of the +frame must match one of the @var{value}s specified for it in +@var{display}. +@end table +@end defmac + + Here's how the standard face @code{region} is defined: + +@example +@group +(defface region + '((((class color) (min-colors 88) (background dark)) + :background "blue3") +@end group + (((class color) (min-colors 88) (background light)) + :background "lightgoldenrod2") + (((class color) (min-colors 16) (background dark)) + :background "blue3") + (((class color) (min-colors 16) (background light)) + :background "lightgoldenrod2") + (((class color) (min-colors 8)) + :background "blue" :foreground "white") + (((type tty) (class mono)) + :inverse-video t) + (t :background "gray")) +@group + "Basic face for highlighting the region." + :group 'basic-faces) +@end group +@end example + + Internally, @code{defface} uses the symbol property +@code{face-defface-spec} to record the face attributes specified in +@code{defface}, @code{saved-face} for the attributes saved by the user +with the customization buffer, @code{customized-face} for the +attributes customized by the user for the current session, but not +saved, and @code{face-documentation} for the documentation string. + +@defopt frame-background-mode +This option, if non-@code{nil}, specifies the background type to use for +interpreting face definitions. If it is @code{dark}, then Emacs treats +all frames as if they had a dark background, regardless of their actual +background colors. If it is @code{light}, then Emacs treats all frames +as if they had a light background. +@end defopt + +@node Face Attributes +@subsection Face Attributes +@cindex face attributes + + The effect of using a face is determined by a fixed set of @dfn{face +attributes}. This table lists all the face attributes, and what they +mean. You can specify more than one face for a given piece of text; +Emacs merges the attributes of all the faces to determine how to +display the text. @xref{Displaying Faces}. + + Any attribute in a face can have the value @code{unspecified}. This +means the face doesn't specify that attribute. In face merging, when +the first face fails to specify a particular attribute, that means the +next face gets a chance. However, the @code{default} face must +specify all attributes. + + Some of these font attributes are meaningful only on certain kinds of +displays---if your display cannot handle a certain attribute, the +attribute is ignored. (The attributes @code{:family}, @code{:width}, +@code{:height}, @code{:weight}, and @code{:slant} correspond to parts of +an X Logical Font Descriptor.) + +@table @code +@item :family +Font family name, or fontset name (@pxref{Fontsets}). If you specify a +font family name, the wild-card characters @samp{*} and @samp{?} are +allowed. + +@item :width +Relative proportionate width, also known as the character set width or +set width. This should be one of the symbols @code{ultra-condensed}, +@code{extra-condensed}, @code{condensed}, @code{semi-condensed}, +@code{normal}, @code{semi-expanded}, @code{expanded}, +@code{extra-expanded}, or @code{ultra-expanded}. + +@item :height +Either the font height, an integer in units of 1/10 point, a floating +point number specifying the amount by which to scale the height of any +underlying face, or a function, which is called with the old height +(from the underlying face), and should return the new height. + +@item :weight +Font weight---a symbol from this series (from most dense to most faint): +@code{ultra-bold}, @code{extra-bold}, @code{bold}, @code{semi-bold}, +@code{normal}, @code{semi-light}, @code{light}, @code{extra-light}, +or @code{ultra-light}. + +On a text-only terminal, any weight greater than normal is displayed as +extra bright, and any weight less than normal is displayed as +half-bright (provided the terminal supports the feature). + +@item :slant +Font slant---one of the symbols @code{italic}, @code{oblique}, @code{normal}, +@code{reverse-italic}, or @code{reverse-oblique}. + +On a text-only terminal, slanted text is displayed as half-bright, if +the terminal supports the feature. + +@item :foreground +Foreground color, a string. The value can be a system-defined color +name, or a hexadecimal color specification of the form +@samp{#@var{rr}@var{gg}@var{bb}}. (@samp{#000000} is black, +@samp{#ff0000} is red, @samp{#00ff00} is green, @samp{#0000ff} is +blue, and @samp{#ffffff} is white.) + +@item :background +Background color, a string, like the foreground color. + +@item :inverse-video +Whether or not characters should be displayed in inverse video. The +value should be @code{t} (yes) or @code{nil} (no). + +@item :stipple +The background stipple, a bitmap. + +The value can be a string; that should be the name of a file containing +external-format X bitmap data. The file is found in the directories +listed in the variable @code{x-bitmap-file-path}. + +Alternatively, the value can specify the bitmap directly, with a list +of the form @code{(@var{width} @var{height} @var{data})}. Here, +@var{width} and @var{height} specify the size in pixels, and +@var{data} is a string containing the raw bits of the bitmap, row by +row. Each row occupies @math{(@var{width} + 7) / 8} consecutive bytes +in the string (which should be a unibyte string for best results). +This means that each row always occupies at least one whole byte. + +If the value is @code{nil}, that means use no stipple pattern. + +Normally you do not need to set the stipple attribute, because it is +used automatically to handle certain shades of gray. + +@item :underline +Whether or not characters should be underlined, and in what color. If +the value is @code{t}, underlining uses the foreground color of the +face. If the value is a string, underlining uses that color. The +value @code{nil} means do not underline. + +@item :overline +Whether or not characters should be overlined, and in what color. +The value is used like that of @code{:underline}. + +@item :strike-through +Whether or not characters should be strike-through, and in what +color. The value is used like that of @code{:underline}. + +@item :inherit +The name of a face from which to inherit attributes, or a list of face +names. Attributes from inherited faces are merged into the face like an +underlying face would be, with higher priority than underlying faces. +If a list of faces is used, attributes from faces earlier in the list +override those from later faces. + +@item :box +Whether or not a box should be drawn around characters, its color, the +width of the box lines, and 3D appearance. +@end table + + Here are the possible values of the @code{:box} attribute, and what +they mean: + +@table @asis +@item @code{nil} +Don't draw a box. + +@item @code{t} +Draw a box with lines of width 1, in the foreground color. + +@item @var{color} +Draw a box with lines of width 1, in color @var{color}. + +@item @code{(:line-width @var{width} :color @var{color} :style @var{style})} +This way you can explicitly specify all aspects of the box. The value +@var{width} specifies the width of the lines to draw; it defaults to 1. + +The value @var{color} specifies the color to draw with. The default is +the foreground color of the face for simple boxes, and the background +color of the face for 3D boxes. + +The value @var{style} specifies whether to draw a 3D box. If it is +@code{released-button}, the box looks like a 3D button that is not being +pressed. If it is @code{pressed-button}, the box looks like a 3D button +that is being pressed. If it is @code{nil} or omitted, a plain 2D box +is used. +@end table + + In older versions of Emacs, before @code{:family}, @code{:height}, +@code{:width}, @code{:weight}, and @code{:slant} existed, these +attributes were used to specify the type face. They are now +semi-obsolete, but they still work: + +@table @code +@item :font +This attribute specifies the font name. + +@item :bold +A non-@code{nil} value specifies a bold font. + +@item :italic +A non-@code{nil} value specifies an italic font. +@end table + + For compatibility, you can still set these ``attributes,'' even +though they are not real face attributes. Here is what that does: + +@table @code +@item :font +You can specify an X font name as the ``value'' of this ``attribute''; +that sets the @code{:family}, @code{:width}, @code{:height}, +@code{:weight}, and @code{:slant} attributes according to the font name. + +If the value is a pattern with wildcards, the first font that matches +the pattern is used to set these attributes. + +@item :bold +A non-@code{nil} makes the face bold; @code{nil} makes it normal. +This actually works by setting the @code{:weight} attribute. + +@item :italic +A non-@code{nil} makes the face italic; @code{nil} makes it normal. +This actually works by setting the @code{:slant} attribute. +@end table + +@defvar x-bitmap-file-path +This variable specifies a list of directories for searching +for bitmap files, for the @code{:stipple} attribute. +@end defvar + +@defun bitmap-spec-p object +This returns @code{t} if @var{object} is a valid bitmap specification, +suitable for use with @code{:stipple} (see above). It returns +@code{nil} otherwise. +@end defun + +@node Attribute Functions +@subsection Face Attribute Functions + + This section describes the functions for accessing and modifying the +attributes of an existing face. + +@defun set-face-attribute face frame &rest arguments +This function sets one or more attributes of face @var{face} for frame +@var{frame}. The attributes you specify this way override whatever +the @code{defface} says. + +The extra arguments @var{arguments} specify the attributes to set, and +the values for them. They should consist of alternating attribute names +(such as @code{:family} or @code{:underline}) and corresponding values. +Thus, + +@example +(set-face-attribute 'foo nil + :width 'extended + :weight 'bold + :underline "red") +@end example + +@noindent +sets the attributes @code{:width}, @code{:weight} and @code{:underline} +to the corresponding values. + +If @var{frame} is @code{t}, this function sets the default attributes +for new frames. Default attribute values specified this way override +the @code{defface} for newly created frames. + +If @var{frame} is @code{nil}, this function sets the attributes for +all existing frames, and the default for new frames. +@end defun + +@defun face-attribute face attribute &optional frame inherit +This returns the value of the @var{attribute} attribute of face +@var{face} on @var{frame}. If @var{frame} is @code{nil}, +that means the selected frame (@pxref{Input Focus}). + +If @var{frame} is @code{t}, this returns whatever new-frames default +value you previously specified with @code{set-face-attribute} for the +@var{attribute} attribute of @var{face}. If you have not specified +one, it returns @code{nil}. + +If @var{inherit} is @code{nil}, only attributes directly defined by +@var{face} are considered, so the return value may be +@code{unspecified}, or a relative value. If @var{inherit} is +non-@code{nil}, @var{face}'s definition of @var{attribute} is merged +with the faces specified by its @code{:inherit} attribute; however the +return value may still be @code{unspecified} or relative. If +@var{inherit} is a face or a list of faces, then the result is further +merged with that face (or faces), until it becomes specified and +absolute. + +To ensure that the return value is always specified and absolute, use +a value of @code{default} for @var{inherit}; this will resolve any +unspecified or relative values by merging with the @code{default} face +(which is always completely specified). + +For example, + +@example +(face-attribute 'bold :weight) + @result{} bold +@end example +@end defun + +@defun face-attribute-relative-p attribute value +This function returns non-@code{nil} if @var{value}, when used as the +value of the face attribute @var{attribute}, is relative. This means +it would modify, rather than completely override, any value that comes +from a subsequent face in the face list or that is inherited from +another face. + +@code{unspecified} is a relative value for all attributes. +For @code{:height}, floating point values are also relative. + +For example: + +@example +(face-attribute-relative-p :height 2.0) + @result{} t +@end example +@end defun + +@defun merge-face-attribute attribute value1 value2 +If @var{value1} is a relative value for the face attribute +@var{attribute}, returns it merged with the underlying value +@var{value2}; otherwise, if @var{value1} is an absolute value for the +face attribute @var{attribute}, returns @var{value1} unchanged. +@end defun + + The functions above did not exist before Emacs 21. For compatibility +with older Emacs versions, you can use the following functions to set +and examine the face attributes which existed in those versions. +They use values of @code{t} and @code{nil} for @var{frame} +just like @code{set-face-attribute} and @code{face-attribute}. + +@defun set-face-foreground face color &optional frame +@defunx set-face-background face color &optional frame +These functions set the foreground (or background, respectively) color +of face @var{face} to @var{color}. The argument @var{color} should be a +string, the name of a color. + +Certain shades of gray are implemented by stipple patterns on +black-and-white screens. +@end defun + +@defun set-face-stipple face pattern &optional frame +This function sets the background stipple pattern of face @var{face} +to @var{pattern}. The argument @var{pattern} should be the name of a +stipple pattern defined by the X server, or actual bitmap data +(@pxref{Face Attributes}), or @code{nil} meaning don't use stipple. + +Normally there is no need to pay attention to stipple patterns, because +they are used automatically to handle certain shades of gray. +@end defun + +@defun set-face-font face font &optional frame +This function sets the font of face @var{face}. This actually sets +the attributes @code{:family}, @code{:width}, @code{:height}, +@code{:weight}, and @code{:slant} according to the font name +@var{font}. +@end defun + +@defun set-face-bold-p face bold-p &optional frame +This function specifies whether @var{face} should be bold. If +@var{bold-p} is non-@code{nil}, that means yes; @code{nil} means no. +This actually sets the @code{:weight} attribute. +@end defun + +@defun set-face-italic-p face italic-p &optional frame +This function specifies whether @var{face} should be italic. If +@var{italic-p} is non-@code{nil}, that means yes; @code{nil} means no. +This actually sets the @code{:slant} attribute. +@end defun + +@defun set-face-underline-p face underline &optional frame +This function sets the underline attribute of face @var{face}. +Non-@code{nil} means do underline; @code{nil} means don't. +If @var{underline} is a string, underline with that color. +@end defun + +@defun set-face-inverse-video-p face inverse-video-p &optional frame +This function sets the @code{:inverse-video} attribute of face +@var{face}. +@end defun + +@defun invert-face face &optional frame +This function swaps the foreground and background colors of face +@var{face}. +@end defun + + These functions examine the attributes of a face. If you don't +specify @var{frame}, they refer to the selected frame; @code{t} refers +to the default data for new frames. They return the symbol +@code{unspecified} if the face doesn't define any value for that +attribute. + +@defun face-foreground face &optional frame inherit +@defunx face-background face &optional frame inherit +These functions return the foreground color (or background color, +respectively) of face @var{face}, as a string. + +If @var{inherit} is @code{nil}, only a color directly defined by the face is +returned. If @var{inherit} is non-@code{nil}, any faces specified by its +@code{:inherit} attribute are considered as well, and if @var{inherit} +is a face or a list of faces, then they are also considered, until a +specified color is found. To ensure that the return value is always +specified, use a value of @code{default} for @var{inherit}. +@end defun + +@defun face-stipple face &optional frame inherit +This function returns the name of the background stipple pattern of face +@var{face}, or @code{nil} if it doesn't have one. + +If @var{inherit} is @code{nil}, only a stipple directly defined by the +face is returned. If @var{inherit} is non-@code{nil}, any faces +specified by its @code{:inherit} attribute are considered as well, and +if @var{inherit} is a face or a list of faces, then they are also +considered, until a specified stipple is found. To ensure that the +return value is always specified, use a value of @code{default} for +@var{inherit}. +@end defun + +@defun face-font face &optional frame +This function returns the name of the font of face @var{face}. +@end defun + +@defun face-bold-p face &optional frame +This function returns @code{t} if @var{face} is bold---that is, if it is +bolder than normal. It returns @code{nil} otherwise. +@end defun + +@defun face-italic-p face &optional frame +This function returns @code{t} if @var{face} is italic or oblique, +@code{nil} otherwise. +@end defun + +@defun face-underline-p face &optional frame +This function returns the @code{:underline} attribute of face @var{face}. +@end defun + +@defun face-inverse-video-p face &optional frame +This function returns the @code{:inverse-video} attribute of face @var{face}. +@end defun + +@node Displaying Faces +@subsection Displaying Faces + + Here are the ways to specify which faces to use for display of text: + +@itemize @bullet +@item +With defaults. The @code{default} face is used as the ultimate +default for all text. (In Emacs 19 and 20, the @code{default} +face is used only when no other face is specified.) + +@item +For a mode line or header line, the face @code{mode-line} or +@code{mode-line-inactive}, or @code{header-line}, is merged in just +before @code{default}. + +@item +With text properties. A character can have a @code{face} property; if +so, the faces and face attributes specified there apply. @xref{Special +Properties}. + +If the character has a @code{mouse-face} property, that is used instead +of the @code{face} property when the mouse is ``near enough'' to the +character. + +@item +With overlays. An overlay can have @code{face} and @code{mouse-face} +properties too; they apply to all the text covered by the overlay. + +@item +With a region that is active. In Transient Mark mode, the region is +highlighted with the face @code{region} (@pxref{Standard Faces,,, +emacs, The GNU Emacs Manual}). + +@item +With special glyphs. Each glyph can specify a particular face +number. @xref{Glyphs}. +@end itemize + + If these various sources together specify more than one face for a +particular character, Emacs merges the attributes of the various faces +specified. For each attribute, Emacs tries first the face of any +special glyph; then the face for region highlighting, if appropriate; +then the faces specified by overlays, followed by those specified by +text properties, then the @code{mode-line} or +@code{mode-line-inactive} or @code{header-line} face (if in a mode +line or a header line), and last the @code{default} face. + + When multiple overlays cover one character, an overlay with higher +priority overrides those with lower priority. @xref{Overlays}. + +@node Font Selection +@subsection Font Selection + + @dfn{Selecting a font} means mapping the specified face attributes for +a character to a font that is available on a particular display. The +face attributes, as determined by face merging, specify most of the +font choice, but not all. Part of the choice depends on what character +it is. + + If the face specifies a fontset name, that fontset determines a +pattern for fonts of the given charset. If the face specifies a font +family, a font pattern is constructed. + + Emacs tries to find an available font for the given face attributes +and character's registry and encoding. If there is a font that matches +exactly, it is used, of course. The hard case is when no available font +exactly fits the specification. Then Emacs looks for one that is +``close''---one attribute at a time. You can specify the order to +consider the attributes. In the case where a specified font family is +not available, you can specify a set of mappings for alternatives to +try. + +@defvar face-font-selection-order +This variable specifies the order of importance of the face attributes +@code{:width}, @code{:height}, @code{:weight}, and @code{:slant}. The +value should be a list containing those four symbols, in order of +decreasing importance. + +Font selection first finds the best available matches for the first +attribute listed; then, among the fonts which are best in that way, it +searches for the best matches in the second attribute, and so on. + +The attributes @code{:weight} and @code{:width} have symbolic values in +a range centered around @code{normal}. Matches that are more extreme +(farther from @code{normal}) are somewhat preferred to matches that are +less extreme (closer to @code{normal}); this is designed to ensure that +non-normal faces contrast with normal ones, whenever possible. + +The default is @code{(:width :height :weight :slant)}, which means first +find the fonts closest to the specified @code{:width}, then---among the +fonts with that width---find a best match for the specified font height, +and so on. + +One example of a case where this variable makes a difference is when the +default font has no italic equivalent. With the default ordering, the +@code{italic} face will use a non-italic font that is similar to the +default one. But if you put @code{:slant} before @code{:height}, the +@code{italic} face will use an italic font, even if its height is not +quite right. +@end defvar + +@defvar face-font-family-alternatives +This variable lets you specify alternative font families to try, if a +given family is specified and doesn't exist. Each element should have +this form: + +@example +(@var{family} @var{alternate-families}@dots{}) +@end example + +If @var{family} is specified but not available, Emacs will try the other +families given in @var{alternate-families}, one by one, until it finds a +family that does exist. +@end defvar + +@defvar face-font-registry-alternatives +This variable lets you specify alternative font registries to try, if a +given registry is specified and doesn't exist. Each element should have +this form: + +@example +(@var{registry} @var{alternate-registries}@dots{}) +@end example + +If @var{registry} is specified but not available, Emacs will try the +other registries given in @var{alternate-registries}, one by one, +until it finds a registry that does exist. +@end defvar + + Emacs can make use of scalable fonts, but by default it does not use +them, since the use of too many or too big scalable fonts can crash +XFree86 servers. + +@defvar scalable-fonts-allowed +This variable controls which scalable fonts to use. A value of +@code{nil}, the default, means do not use scalable fonts. @code{t} +means to use any scalable font that seems appropriate for the text. + +Otherwise, the value must be a list of regular expressions. Then a +scalable font is enabled for use if its name matches any regular +expression in the list. For example, + +@example +(setq scalable-fonts-allowed '("muleindian-2$")) +@end example + +@noindent +allows the use of scalable fonts with registry @code{muleindian-2}. +@end defvar + +@defvar face-font-rescale-alist +This variable specifies scaling for certain faces. Its value should +be a list of elements of the form + +@example +(@var{fontname-regexp} . @var{scale-factor}) +@end example + +If @var{fontname-regexp} matches the font name that is about to be +used, this says to choose a larger similar font according to the +factor @var{scale-factor}. You would use this feature to normalize +the font size if certain fonts are bigger or smaller than their +nominal heights and widths would suggest. +@end defvar + +@node Face Functions +@subsection Functions for Working with Faces + + Here are additional functions for creating and working with faces. + +@defun make-face name +This function defines a new face named @var{name}, initially with all +attributes @code{nil}. It does nothing if there is already a face named +@var{name}. +@end defun + +@defun face-list +This function returns a list of all defined face names. +@end defun + +@defun copy-face old-face new-name &optional frame new-frame +This function defines a face named @var{new-name} as a copy of the existing +face named @var{old-face}. It creates the face @var{new-name} if that +doesn't already exist. + +If the optional argument @var{frame} is given, this function applies +only to that frame. Otherwise it applies to each frame individually, +copying attributes from @var{old-face} in each frame to @var{new-face} +in the same frame. + +If the optional argument @var{new-frame} is given, then @code{copy-face} +copies the attributes of @var{old-face} in @var{frame} to @var{new-name} +in @var{new-frame}. +@end defun + +@defun face-id face +This function returns the face number of face @var{face}. +@end defun + +@defun face-documentation face +This function returns the documentation string of face @var{face}, or +@code{nil} if none was specified for it. +@end defun + +@defun face-equal face1 face2 &optional frame +This returns @code{t} if the faces @var{face1} and @var{face2} have the +same attributes for display. +@end defun + +@defun face-differs-from-default-p face &optional frame +This returns non-@code{nil} if the face @var{face} displays +differently from the default face. +@end defun + +@cindex face alias +A @dfn{face alias} provides an equivalent name for a face. You can +define a face alias by giving the alias symbol the @code{face-alias} +property, with a value of the target face name. The following example +makes @code{modeline} an alias for the @code{mode-line} face. + +@example +(put 'modeline 'face-alias 'mode-line) +@end example + + +@node Auto Faces +@subsection Automatic Face Assignment +@cindex automatic face assignment +@cindex faces, automatic choice + + This hook is used for automatically assigning facesto text in the +buffer. It is part of the implementation of Jit-Lock mode, used by +Font-Lock. + +@defvar fontification-functions +This variable holds a list of functions that are called by Emacs +redisplay as needed to assign faces automatically to text in the buffer. + +The functions are called in the order listed, with one argument, a +buffer position @var{pos}. Each function should attempt to assign faces +to the text in the current buffer starting at @var{pos}. + +Each function should record the faces they assign by setting the +@code{face} property. It should also add a non-@code{nil} +@code{fontified} property for all the text it has assigned faces to. +That property tells redisplay that faces have been assigned to that text +already. + +It is probably a good idea for each function to do nothing if the +character after @var{pos} already has a non-@code{nil} @code{fontified} +property, but this is not required. If one function overrides the +assignments made by a previous one, the properties as they are +after the last function finishes are the ones that really matter. + +For efficiency, we recommend writing these functions so that they +usually assign faces to around 400 to 600 characters at each call. +@end defvar + +@node Font Lookup +@subsection Looking Up Fonts + +@defun x-list-fonts pattern &optional face frame maximum +This function returns a list of available font names that match +@var{pattern}. If the optional arguments @var{face} and @var{frame} are +specified, then the list is limited to fonts that are the same size as +@var{face} currently is on @var{frame}. + +The argument @var{pattern} should be a string, perhaps with wildcard +characters: the @samp{*} character matches any substring, and the +@samp{?} character matches any single character. Pattern matching +of font names ignores case. + +If you specify @var{face} and @var{frame}, @var{face} should be a face name +(a symbol) and @var{frame} should be a frame. + +The optional argument @var{maximum} sets a limit on how many fonts to +return. If this is non-@code{nil}, then the return value is truncated +after the first @var{maximum} matching fonts. Specifying a small value +for @var{maximum} can make this function much faster, in cases where +many fonts match the pattern. +@end defun + +@defun x-family-fonts &optional family frame +This function returns a list describing the available fonts for family +@var{family} on @var{frame}. If @var{family} is omitted or @code{nil}, +this list applies to all families, and therefore, it contains all +available fonts. Otherwise, @var{family} must be a string; it may +contain the wildcards @samp{?} and @samp{*}. + +The list describes the display that @var{frame} is on; if @var{frame} is +omitted or @code{nil}, it applies to the selected frame's display +(@pxref{Input Focus}). + +The list contains a vector of the following form for each font: + +@example +[@var{family} @var{width} @var{point-size} @var{weight} @var{slant} + @var{fixed-p} @var{full} @var{registry-and-encoding}] +@end example + +The first five elements correspond to face attributes; if you +specify these attributes for a face, it will use this font. + +The last three elements give additional information about the font. +@var{fixed-p} is non-@code{nil} if the font is fixed-pitch. +@var{full} is the full name of the font, and +@var{registry-and-encoding} is a string giving the registry and +encoding of the font. + +The result list is sorted according to the current face font sort order. +@end defun + +@defun x-font-family-list &optional frame +This function returns a list of the font families available for +@var{frame}'s display. If @var{frame} is omitted or @code{nil}, it +describes the selected frame's display (@pxref{Input Focus}). + +The value is a list of elements of this form: + +@example +(@var{family} . @var{fixed-p}) +@end example + +@noindent +Here @var{family} is a font family, and @var{fixed-p} is +non-@code{nil} if fonts of that family are fixed-pitch. +@end defun + +@defvar font-list-limit +This variable specifies maximum number of fonts to consider in font +matching. The function @code{x-family-fonts} will not return more than +that many fonts, and font selection will consider only that many fonts +when searching a matching font for face attributes. The default is +currently 100. +@end defvar + +@node Fontsets +@subsection Fontsets + + A @dfn{fontset} is a list of fonts, each assigned to a range of +character codes. An individual font cannot display the whole range of +characters that Emacs supports, but a fontset can. Fontsets have names, +just as fonts do, and you can use a fontset name in place of a font name +when you specify the ``font'' for a frame or a face. Here is +information about defining a fontset under Lisp program control. + +@defun create-fontset-from-fontset-spec fontset-spec &optional style-variant-p noerror +This function defines a new fontset according to the specification +string @var{fontset-spec}. The string should have this format: + +@smallexample +@var{fontpattern}, @r{[}@var{charsetname}:@var{fontname}@r{]@dots{}} +@end smallexample + +@noindent +Whitespace characters before and after the commas are ignored. + +The first part of the string, @var{fontpattern}, should have the form of +a standard X font name, except that the last two fields should be +@samp{fontset-@var{alias}}. + +The new fontset has two names, one long and one short. The long name is +@var{fontpattern} in its entirety. The short name is +@samp{fontset-@var{alias}}. You can refer to the fontset by either +name. If a fontset with the same name already exists, an error is +signaled, unless @var{noerror} is non-@code{nil}, in which case this +function does nothing. + +If optional argument @var{style-variant-p} is non-@code{nil}, that says +to create bold, italic and bold-italic variants of the fontset as well. +These variant fontsets do not have a short name, only a long one, which +is made by altering @var{fontpattern} to indicate the bold or italic +status. + +The specification string also says which fonts to use in the fontset. +See below for the details. +@end defun + + The construct @samp{@var{charset}:@var{font}} specifies which font to +use (in this fontset) for one particular character set. Here, +@var{charset} is the name of a character set, and @var{font} is the font +to use for that character set. You can use this construct any number of +times in the specification string. + + For the remaining character sets, those that you don't specify +explicitly, Emacs chooses a font based on @var{fontpattern}: it replaces +@samp{fontset-@var{alias}} with a value that names one character set. +For the @acronym{ASCII} character set, @samp{fontset-@var{alias}} is replaced +with @samp{ISO8859-1}. + + In addition, when several consecutive fields are wildcards, Emacs +collapses them into a single wildcard. This is to prevent use of +auto-scaled fonts. Fonts made by scaling larger fonts are not usable +for editing, and scaling a smaller font is not useful because it is +better to use the smaller font in its own size, which Emacs does. + + Thus if @var{fontpattern} is this, + +@example +-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24 +@end example + +@noindent +the font specification for @acronym{ASCII} characters would be this: + +@example +-*-fixed-medium-r-normal-*-24-*-ISO8859-1 +@end example + +@noindent +and the font specification for Chinese GB2312 characters would be this: + +@example +-*-fixed-medium-r-normal-*-24-*-gb2312*-* +@end example + + You may not have any Chinese font matching the above font +specification. Most X distributions include only Chinese fonts that +have @samp{song ti} or @samp{fangsong ti} in the @var{family} field. In +such a case, @samp{Fontset-@var{n}} can be specified as below: + +@smallexample +Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\ + chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-* +@end smallexample + +@noindent +Then, the font specifications for all but Chinese GB2312 characters have +@samp{fixed} in the @var{family} field, and the font specification for +Chinese GB2312 characters has a wild card @samp{*} in the @var{family} +field. + +@defun set-fontset-font name character fontname &optional frame +This function modifies the existing fontset @var{name} to +use the font name @var{fontname} for the character @var{character}. + +If @var{name} is @code{nil}, this function modifies the default +fontset, whose short name is @samp{fontset-default}. + +@var{character} may be a cons; @code{(@var{from} . @var{to})}, where +@var{from} and @var{to} are non-generic characters. In that case, use +@var{fontname} for all characters in the range @var{from} and @var{to} +(inclusive). + +@var{character} may be a charset. In that case, use +@var{fontname} for all character in the charsets. + +@var{fontname} may be a cons; @code{(@var{family} . @var{registry})}, +where @var{family} is a family name of a font (possibly including a +foundry name at the head), @var{registry} is a registry name of a font +(possibly including an encoding name at the tail). + +For instance, this changes the default fontset to use a font of which +registry name is @samp{JISX0208.1983} for all characters belonging to +the charset @code{japanese-jisx0208}. + +@smallexample +(set-fontset-font nil 'japanese-jisx0208 '(nil . "JISX0208.1983")) +@end smallexample +@end defun + +@defun char-displayable-p char +This function returns @code{t} if Emacs ought to be able to display +@var{char}. More precisely, if the selected frame's fontset has a +font to display the character set that @var{char} belongs to. + +Fontsets can specify a font on a per-character basis; when the fontset +does that, this function's value may not be accurate. +@end defun + +@node Fringes +@section Fringes +@cindex fringes + + The @dfn{fringes} of a window are thin vertical strips down the +sides that are used for displaying bitmaps that indicate truncation, +continuation, horizontal scrolling, and the overlay arrow. + +@menu +* Fringe Size/Pos:: Specifying where to put the window fringes. +* Fringe Indicators:: Displaying indicator icons in the window fringes. +* Fringe Cursors:: Displaying cursors in the right fringe. +* Fringe Bitmaps:: Specifying bitmaps for fringe indicators. +* Customizing Bitmaps:: Specifying your own bitmaps to use in the fringes. +* Overlay Arrow:: Display of an arrow to indicate position. +@end menu + +@node Fringe Size/Pos +@subsection Fringe Size and Position + + The following buffer-local variables control the position and width +of the window fringes. + +@defvar fringes-outside-margins +The fringes normally appear between the display margins and the window +text. If the value is non-@code{nil}, they appear outside the display +margins. @xref{Display Margins}. +@end defvar + +@defvar left-fringe-width +This variable, if non-@code{nil}, specifies the width of the left +fringe in pixels. A value of @code{nil} means to use the left fringe +width from the window's frame. +@end defvar + +@defvar right-fringe-width +This variable, if non-@code{nil}, specifies the width of the right +fringe in pixels. A value of @code{nil} means to use the right fringe +width from the window's frame. +@end defvar + + The values of these variables take effect when you display the +buffer in a window. If you change them while the buffer is visible, +you can call @code{set-window-buffer} to display it once again in the +same window, to make the changes take effect. + +@defun set-window-fringes window left &optional right outside-margins +This function sets the fringe widths of window @var{window}. +If @var{window} is @code{nil}, the selected window is used. + +The argument @var{left} specifies the width in pixels of the left +fringe, and likewise @var{right} for the right fringe. A value of +@code{nil} for either one stands for the default width. If +@var{outside-margins} is non-@code{nil}, that specifies that fringes +should appear outside of the display margins. +@end defun + +@defun window-fringes &optional window +This function returns information about the fringes of a window +@var{window}. If @var{window} is omitted or @code{nil}, the selected +window is used. The value has the form @code{(@var{left-width} +@var{right-width} @var{outside-margins})}. +@end defun + + +@node Fringe Indicators +@subsection Fringe Indicators +@cindex fringe indicators +@cindex indicators, fringe + + The @dfn{fringe indicators} are tiny icons Emacs displays in the +window fringe (on a graphic display) to indicate truncated or +continued lines, buffer boundaries, overlay arrow, etc. + +@defopt indicate-empty-lines +@cindex fringes, and empty line indication +When this is non-@code{nil}, Emacs displays a special glyph in the +fringe of each empty line at the end of the buffer, on graphical +displays. @xref{Fringes}. This variable is automatically +buffer-local in every buffer. +@end defopt + +@defvar indicate-buffer-boundaries +This buffer-local variable controls how the buffer boundaries and +window scrolling are indicated in the window fringes. + +Emacs can indicate the buffer boundaries---that is, the first and last +line in the buffer---with angle icons when they appear on the screen. +In addition, Emacs can display an up-arrow in the fringe to show +that there is text above the screen, and a down-arrow to show +there is text below the screen. + +There are three kinds of basic values: + +@table @asis +@item @code{nil} +Don't display any of these fringe icons. +@item @code{left} +Display the angle icons and arrows in the left fringe. +@item @code{right} +Display the angle icons and arrows in the right fringe. +@item any non-alist +Display the angle icons in the left fringe +and don't display the arrows. +@end table + +Otherwise the value should be an alist that specifies which fringe +indicators to display and where. Each element of the alist should +have the form @code{(@var{indicator} . @var{position})}. Here, +@var{indicator} is one of @code{top}, @code{bottom}, @code{up}, +@code{down}, and @code{t} (which covers all the icons not yet +specified), while @var{position} is one of @code{left}, @code{right} +and @code{nil}. + +For example, @code{((top . left) (t . right))} places the top angle +bitmap in left fringe, and the bottom angle bitmap as well as both +arrow bitmaps in right fringe. To show the angle bitmaps in the left +fringe, and no arrow bitmaps, use @code{((top . left) (bottom . left))}. +@end defvar + +@defvar default-indicate-buffer-boundaries +The value of this variable is the default value for +@code{indicate-buffer-boundaries} in buffers that do not override it. +@end defvar + +@defvar fringe-indicator-alist +This buffer-local variable specifies the mapping from logical fringe +indicators to the actual bitmaps displayed in the window fringes. + +These symbols identify the logical fringe indicators: + +@table @asis +@item Truncation and continuation line indicators: +@code{truncation}, @code{continuation}. + +@item Buffer position indicators: +@code{up}, @code{down}, +@code{top}, @code{bottom}, +@code{top-bottom}. + +@item Empty line indicator: +@code{empty-line}. + +@item Overlay arrow indicator: +@code{overlay-arrow}. + +@item Unknown bitmap indicator: +@code{unknown}. +@end table + + The value is an alist where each element @code{(@var{indicator} . @var{bitmaps})} +specifies the fringe bitmaps used to display a specific logical +fringe indicator. + +Here, @var{indicator} specifies the logical indicator type, and +@var{bitmaps} is list of symbols @code{(@var{left} @var{right} +[@var{left1} @var{right1}])} which specifies the actual bitmap shown +in the left or right fringe for the logical indicator. + +The @var{left} and @var{right} symbols specify the bitmaps shown in +the left and/or right fringe for the specific indicator. The +@var{left1} or @var{right1} bitmaps are used only for the `bottom' and +`top-bottom indicators when the last (only) line in has no final +newline. Alternatively, @var{bitmaps} may be a single symbol which is +used in both left and right fringes. + +When @code{fringe-indicator-alist} has a buffer-local value, and there +is no bitmap defined for a logical indicator, or the bitmap is +@code{t}, the corresponding value from the (non-local) +@code{default-fringe-indicator-alist} is used. + +To completely hide a specific indicator, set the bitmap to @code{nil}. +@end defvar + +@defvar default-fringe-indicator-alist +The value of this variable is the default value for +@code{fringe-indicator-alist} in buffers that do not override it. +@end defvar + +Standard fringe bitmaps for indicators: +@example +left-arrow right-arrow up-arrow down-arrow +left-curly-arrow right-curly-arrow +left-triangle right-triangle +top-left-angle top-right-angle +bottom-left-angle bottom-right-angle +left-bracket right-bracket +filled-rectangle hollow-rectangle +filled-square hollow-square +vertical-bar horizontal-bar +empty-line question-mark +@end example + +@node Fringe Cursors +@subsection Fringe Cursors +@cindex fringe cursors +@cindex cursor, fringe + + When a line is exactly as wide as the window, Emacs displays the +cursor in the right fringe instead of using two lines. Different +bitmaps are used to represent the cursor in the fringe depending on +the current buffer's cursor type. + +@table @asis +@item Logical cursor types: +@code{box} , @code{hollow}, @code{bar}, +@code{hbar}, @code{hollow-small}. +@end table + +The @code{hollow-small} type is used instead of @code{hollow} when the +normal @code{hollow-rectangle} bitmap is too tall to fit on a specific +display line. + +@defvar overflow-newline-into-fringe +If this is non-@code{nil}, lines exactly as wide as the window (not +counting the final newline character) are not continued. Instead, +when point is at the end of the line, the cursor appears in the right +fringe. +@end defvar + +@defvar fringe-cursor-alist +This variable specifies the mapping from logical cursor type to the +actual fringe bitmaps displayed in the right fringe. The value is an +alist where each element @code{(@var{cursor} . @var{bitmap})} specifies +the fringe bitmaps used to display a specific logical cursor type in +the fringe. Here, @var{cursor} specifies the logical cursor type and +@var{bitmap} is a symbol specifying the fringe bitmap to be displayed +for that logical cursor type. + +When @code{fringe-cursor-alist} has a buffer-local value, and there is +no bitmap defined for a cursor type, the corresponding value from the +(non-local) @code{default-fringes-indicator-alist} is used. +@end defvar + +@defvar default-fringes-cursor-alist +The value of this variable is the default value for +@code{fringe-cursor-alist} in buffers that do not override it. +@end defvar + +Standard bitmaps for displaying the cursor in right fringe: +@example +filled-rectangle hollow-rectangle filled-square hollow-square +vertical-bar horizontal-bar +@end example + + +@node Fringe Bitmaps +@subsection Fringe Bitmaps +@cindex fringe bitmaps +@cindex bitmaps, fringe + + The @dfn{fringe bitmaps} are the actual bitmaps which represent the +logical fringe indicators for truncated or continued lines, buffer +boundaries, overlay arrow, etc. Fringe bitmap symbols have their own +name space. The fringe bitmaps are shared by all frames and windows. +You can redefine the built-in fringe bitmaps, and you can define new +fringe bitmaps. + + The way to display a bitmap in the left or right fringes for a given +line in a window is by specifying the @code{display} property for one +of the characters that appears in it. Use a display specification of +the form @code{(left-fringe @var{bitmap} [@var{face}])} or +@code{(right-fringe @var{bitmap} [@var{face}])} (@pxref{Display +Property}). Here, @var{bitmap} is a symbol identifying the bitmap you +want, and @var{face} (which is optional) is the name of the face whose +colors should be used for displaying the bitmap, instead of the +default @code{fringe} face. @var{face} is automatically merged with +the @code{fringe} face, so normally @var{face} need only specify the +foreground color for the bitmap. + +@defun fringe-bitmaps-at-pos &optional pos window +This function returns the fringe bitmaps of the display line +containing position @var{pos} in window @var{window}. The return +value has the form @code{(@var{left} @var{right} @var{ov})}, where @var{left} +is the symbol for the fringe bitmap in the left fringe (or @code{nil} +if no bitmap), @var{right} is similar for the right fringe, and @var{ov} +is non-@code{nil} if there is an overlay arrow in the left fringe. + +The value is @code{nil} if @var{pos} is not visible in @var{window}. +If @var{window} is @code{nil}, that stands for the selected window. +If @var{pos} is @code{nil}, that stands for the value of point in +@var{window}. +@end defun + +@node Customizing Bitmaps +@subsection Customizing Fringe Bitmaps + +@defun define-fringe-bitmap bitmap bits &optional height width align +This function defines the symbol @var{bitmap} as a new fringe bitmap, +or replaces an existing bitmap with that name. + +The argument @var{bits} specifies the image to use. It should be +either a string or a vector of integers, where each element (an +integer) corresponds to one row of the bitmap. Each bit of an integer +corresponds to one pixel of the bitmap, where the low bit corresponds +to the rightmost pixel of the bitmap. + +The height is normally the length of @var{bits}. However, you +can specify a different height with non-@code{nil} @var{height}. The width +is normally 8, but you can specify a different width with non-@code{nil} +@var{width}. The width must be an integer between 1 and 16. + +The argument @var{align} specifies the positioning of the bitmap +relative to the range of rows where it is used; the default is to +center the bitmap. The allowed values are @code{top}, @code{center}, +or @code{bottom}. + +The @var{align} argument may also be a list @code{(@var{align} +@var{periodic})} where @var{align} is interpreted as described above. +If @var{periodic} is non-@code{nil}, it specifies that the rows in +@code{bits} should be repeated enough times to reach the specified +height. +@end defun + +@defun destroy-fringe-bitmap bitmap +This function destroy the fringe bitmap identified by @var{bitmap}. +If @var{bitmap} identifies a standard fringe bitmap, it actually +restores the standard definition of that bitmap, instead of +eliminating it entirely. +@end defun + +@defun set-fringe-bitmap-face bitmap &optional face +This sets the face for the fringe bitmap @var{bitmap} to @var{face}. +If @var{face} is @code{nil}, it selects the @code{fringe} face. The +bitmap's face controls the color to draw it in. + +@var{face} is merged with the @code{fringe} face, so normally +@var{face} should specify only the foreground color. +@end defun + +@node Overlay Arrow +@subsection The Overlay Arrow +@c @cindex overlay arrow Duplicates variable names + + The @dfn{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 line of code +about to be executed. This feature has nothing to do with +@dfn{overlays} (@pxref{Overlays}). + +@defvar overlay-arrow-string +This variable holds the string to display to call attention to a +particular line, or @code{nil} if the arrow feature is not in use. +On a graphical display the contents of the string are ignored; instead a +glyph is displayed in the fringe area to the left of the display area. +@end defvar + +@defvar overlay-arrow-position +This variable holds a marker that indicates where to display the overlay +arrow. It should point at the beginning of a line. On a non-graphical +display the arrow text +appears 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-arrow string is displayed in any given buffer if the value +of @code{overlay-arrow-position} in that buffer points into that +buffer. Thus, it is possible to display multiple overlay arrow strings +by creating buffer-local bindings of @code{overlay-arrow-position}. +However, it is usually cleaner to use +@code{overlay-arrow-variable-list} to achieve this result. +@c !!! overlay-arrow-position: but the overlay string may remain in the display +@c of some other buffer until an update is required. This should be fixed +@c now. Is it? +@end defvar + + You can do a similar job by creating an overlay with a +@code{before-string} property. @xref{Overlay Properties}. + + You can define multiple overlay arrows via the variable +@code{overlay-arrow-variable-list}. + +@defvar overlay-arrow-variable-list +This variable's value is a list of variables, each of which specifies +the position of an overlay arrow. The variable +@code{overlay-arrow-position} has its normal meaning because it is on +this list. +@end defvar + +Each variable on this list can have properties +@code{overlay-arrow-string} and @code{overlay-arrow-bitmap} that +specify an overlay arrow string (for text-only terminals) or fringe +bitmap (for graphical terminals) to display at the corresponding +overlay arrow position. If either property is not set, the default +@code{overlay-arrow-string} or @code{overlay-arrow} fringe indicator +is used. + +@node Scroll Bars +@section Scroll Bars +@cindex scroll bars + +Normally the frame parameter @code{vertical-scroll-bars} controls +whether the windows in the frame have vertical scroll bars, and +whether they are on the left or right. The frame parameter +@code{scroll-bar-width} specifies how wide they are (@code{nil} +meaning the default). @xref{Layout Parameters}. + +@defun frame-current-scroll-bars &optional frame +This function reports the scroll bar type settings for frame +@var{frame}. The value is a cons cell +@code{(@var{vertical-type} .@: @var{horizontal-type})}, where +@var{vertical-type} is either @code{left}, @code{right}, or @code{nil} +(which means no scroll bar.) @var{horizontal-type} is meant to +specify the horizontal scroll bar type, but since they are not +implemented, it is always @code{nil}. +@end defun + +@vindex vertical-scroll-bar + You can enable or disable scroll bars for a particular buffer, +by setting the variable @code{vertical-scroll-bar}. This variable +automatically becomes buffer-local when set. The possible values are +@code{left}, @code{right}, @code{t}, which means to use the +frame's default, and @code{nil} for no scroll bar. + + You can also control this for individual windows. Call the function +@code{set-window-scroll-bars} to specify what to do for a specific window: + +@defun set-window-scroll-bars window width &optional vertical-type horizontal-type +This function sets the width and type of scroll bars for window +@var{window}. + +@var{width} specifies the scroll bar width in pixels (@code{nil} means +use the width specified for the frame). @var{vertical-type} specifies +whether to have a vertical scroll bar and, if so, where. The possible +values are @code{left}, @code{right} and @code{nil}, just like the +values of the @code{vertical-scroll-bars} frame parameter. + +The argument @var{horizontal-type} is meant to specify whether and +where to have horizontal scroll bars, but since they are not +implemented, it has no effect. If @var{window} is @code{nil}, the +selected window is used. +@end defun + +@defun window-scroll-bars &optional window +Report the width and type of scroll bars specified for @var{window}. +If @var{window} is omitted or @code{nil}, the selected window is used. +The value is a list of the form @code{(@var{width} +@var{cols} @var{vertical-type} @var{horizontal-type})}. The value +@var{width} is the value that was specified for the width (which may +be @code{nil}); @var{cols} is the number of columns that the scroll +bar actually occupies. + +@var{horizontal-type} is not actually meaningful. +@end defun + +If you don't specify these values for a window with +@code{set-window-scroll-bars}, the buffer-local variables +@code{scroll-bar-mode} and @code{scroll-bar-width} in the buffer being +displayed control the window's vertical scroll bars. The function +@code{set-window-buffer} examines these variables. If you change them +in a buffer that is already visible in a window, you can make the +window take note of the new values by calling @code{set-window-buffer} +specifying the same buffer that is already displayed. + +@defvar scroll-bar-mode +This variable, always local in all buffers, controls whether and where +to put scroll bars in windows displaying the buffer. The possible values +are @code{nil} for no scroll bar, @code{left} to put a scroll bar on +the left, and @code{right} to put a scroll bar on the right. +@end defvar + +@defun window-current-scroll-bars &optional window +This function reports the scroll bar type for window @var{window}. +If @var{window} is omitted or @code{nil}, the selected window is used. +The value is a cons cell +@code{(@var{vertical-type} .@: @var{horizontal-type})}. Unlike +@code{window-scroll-bars}, this reports the scroll bar type actually +used, once frame defaults and @code{scroll-bar-mode} are taken into +account. +@end defun + +@defvar scroll-bar-width +This variable, always local in all buffers, specifies the width of the +buffer's scroll bars, measured in pixels. A value of @code{nil} means +to use the value specified by the frame. +@end defvar + +@node Display Property +@section The @code{display} Property +@cindex display specification +@kindex display @r{(text property)} + + The @code{display} text property (or overlay property) is used to +insert images into text, and also control other aspects of how text +displays. The value of the @code{display} property should be a +display specification, or a list or vector containing several display +specifications. + + Some kinds of @code{display} properties specify something to display +instead of the text that has the property. In this case, ``the text'' +means all the consecutive characters that have the same Lisp object as +their @code{display} property; these characters are replaced as a +single unit. By contrast, characters that have similar but distinct +Lisp objects as their @code{display} properties are handled +separately. Here's a function that illustrates this point: + +@smallexample +(defun foo () + (goto-char (point-min)) + (dotimes (i 5) + (let ((string (concat "A"))) + (put-text-property (point) (1+ (point)) 'display string) + (forward-char 1) + (put-text-property (point) (1+ (point)) 'display string) + (forward-char 1)))) +@end smallexample + +@noindent +It gives each of the first ten characters in the buffer string +@code{"A"} as the @code{display} property, but they don't all get the +same string. The first two characters get the same string, so they +together are replaced with one @samp{A}. The next two characters get +a second string, so they together are replaced with one @samp{A}. +Likewise for each following pair of characters. Thus, the ten +characters appear as five A's. This function would have the same +results: + +@smallexample +(defun foo () + (goto-char (point-min)) + (dotimes (i 5) + (let ((string (concat "A"))) + (put-text-property (point) (2+ (point)) 'display string) + (put-text-property (point) (1+ (point)) 'display string) + (forward-char 2)))) +@end smallexample + +@noindent +This illustrates that what matters is the property value for +each character. If two consecutive characters have the same +object as the @code{display} property value, it's irrelevant +whether they got this property from a single call to +@code{put-text-property} or from two different calls. + + The rest of this section describes several kinds of +display specifications and what they mean. + +@menu +* Specified Space:: Displaying one space with a specified width. +* Pixel Specification:: Specifying space width or height in pixels. +* Other Display Specs:: Displaying an image; magnifying text; moving it + up or down on the page; adjusting the width + of spaces within text. +* Display Margins:: Displaying text or images to the side of the main text. +@end menu + +@node Specified Space +@subsection Specified Spaces +@cindex spaces, specified height or width +@cindex variable-width spaces + + To display a space of specified width and/or height, use a display +specification of the form @code{(space . @var{props})}, where +@var{props} is a property list (a list of alternating properties and +values). You can put this property on one or more consecutive +characters; a space of the specified height and width is displayed in +place of @emph{all} of those characters. These are the properties you +can use in @var{props} to specify the weight of the space: + +@table @code +@item :width @var{width} +If @var{width} is an integer or floating point number, it specifies +that the space width should be @var{width} times the normal character +width. @var{width} can also be a @dfn{pixel width} specification +(@pxref{Pixel Specification}). + +@item :relative-width @var{factor} +Specifies that the width of the stretch should be computed from the +first character in the group of consecutive characters that have the +same @code{display} property. The space width is the width of that +character, multiplied by @var{factor}. + +@item :align-to @var{hpos} +Specifies that the space should be wide enough to reach @var{hpos}. +If @var{hpos} is a number, it is measured in units of the normal +character width. @var{hpos} can also be a @dfn{pixel width} +specification (@pxref{Pixel Specification}). +@end table + + You should use one and only one of the above properties. You can +also specify the height of the space, with these properties: + +@table @code +@item :height @var{height} +Specifies the height of the space. +If @var{height} is an integer or floating point number, it specifies +that the space height should be @var{height} times the normal character +height. The @var{height} may also be a @dfn{pixel height} specification +(@pxref{Pixel Specification}). + +@item :relative-height @var{factor} +Specifies the height of the space, multiplying the ordinary height +of the text having this display specification by @var{factor}. + +@item :ascent @var{ascent} +If the value of @var{ascent} is a non-negative number no greater than +100, it specifies that @var{ascent} percent of the height of the space +should be considered as the ascent of the space---that is, the part +above the baseline. The ascent may also be specified in pixel units +with a @dfn{pixel ascent} specification (@pxref{Pixel Specification}). + +@end table + + Don't use both @code{:height} and @code{:relative-height} together. + + The @code{:width} and @code{:align-to} properties are supported on +non-graphic terminals, but the other space properties in this section +are not. + +@node Pixel Specification +@subsection Pixel Specification for Spaces +@cindex spaces, pixel specification + + The value of the @code{:width}, @code{:align-to}, @code{:height}, +and @code{:ascent} properties can be a special kind of expression that +is evaluated during redisplay. The result of the evaluation is used +as an absolute number of pixels. + + The following expressions are supported: + +@smallexample +@group + @var{expr} ::= @var{num} | (@var{num}) | @var{unit} | @var{elem} | @var{pos} | @var{image} | @var{form} + @var{num} ::= @var{integer} | @var{float} | @var{symbol} + @var{unit} ::= in | mm | cm | width | height +@end group +@group + @var{elem} ::= left-fringe | right-fringe | left-margin | right-margin + | scroll-bar | text + @var{pos} ::= left | center | right + @var{form} ::= (@var{num} . @var{expr}) | (@var{op} @var{expr} ...) + @var{op} ::= + | - +@end group +@end smallexample + + The form @var{num} specifies a fraction of the default frame font +height or width. The form @code{(@var{num})} specifies an absolute +number of pixels. If @var{num} is a symbol, @var{symbol}, its +buffer-local variable binding is used. + + The @code{in}, @code{mm}, and @code{cm} units specify the number of +pixels per inch, millimeter, and centimeter, respectively. The +@code{width} and @code{height} units correspond to the default width +and height of the current face. An image specification @code{image} +corresponds to the width or height of the image. + + The @code{left-fringe}, @code{right-fringe}, @code{left-margin}, +@code{right-margin}, @code{scroll-bar}, and @code{text} elements +specify to the width of the corresponding area of the window. + + The @code{left}, @code{center}, and @code{right} positions can be +used with @code{:align-to} to specify a position relative to the left +edge, center, or right edge of the text area. + + Any of the above window elements (except @code{text}) can also be +used with @code{:align-to} to specify that the position is relative to +the left edge of the given area. Once the base offset for a relative +position has been set (by the first occurrence of one of these +symbols), further occurrences of these symbols are interpreted as the +width of the specified area. For example, to align to the center of +the left-margin, use + +@example +:align-to (+ left-margin (0.5 . left-margin)) +@end example + + If no specific base offset is set for alignment, it is always relative +to the left edge of the text area. For example, @samp{:align-to 0} in a +header-line aligns with the first text column in the text area. + + A value of the form @code{(@var{num} . @var{expr})} stands for the +product of the values of @var{num} and @var{expr}. For example, +@code{(2 . in)} specifies a width of 2 inches, while @code{(0.5 . +@var{image})} specifies half the width (or height) of the specified +image. + + The form @code{(+ @var{expr} ...)} adds up the value of the +expressions. The form @code{(- @var{expr} ...)} negates or subtracts +the value of the expressions. + +@node Other Display Specs +@subsection Other Display Specifications + + Here are the other sorts of display specifications that you can use +in the @code{display} text property. + +@table @code +@item @var{string} +Display @var{string} instead of the text that has this property. + +Recursive display specifications are not supported---@var{string}'s +@code{display} properties, if any, are not used. + +@item (image . @var{image-props}) +This kind of display specification is an image descriptor (@pxref{Images}). +When used as a display specification, it means to display the image +instead of the text that has the display specification. + +@item (slice @var{x} @var{y} @var{width} @var{height}) +This specification together with @code{image} specifies a @dfn{slice} +(a partial area) of the image to display. The elements @var{y} and +@var{x} specify the top left corner of the slice, within the image; +@var{width} and @var{height} specify the width and height of the +slice. Integer values are numbers of pixels. A floating point number +in the range 0.0--1.0 stands for that fraction of the width or height +of the entire image. + +@item ((margin nil) @var{string}) +A display specification of this form means to display @var{string} +instead of the text that has the display specification, at the same +position as that text. It is equivalent to using just @var{string}, +but it is done as a special case of marginal display (@pxref{Display +Margins}). + +@item (space-width @var{factor}) +This display specification affects all the space characters within the +text that has the specification. It displays all of these spaces +@var{factor} times as wide as normal. The element @var{factor} should +be an integer or float. Characters other than spaces are not affected +at all; in particular, this has no effect on tab characters. + +@item (height @var{height}) +This display specification makes the text taller or shorter. +Here are the possibilities for @var{height}: + +@table @asis +@item @code{(+ @var{n})} +This means to use a font that is @var{n} steps larger. A ``step'' is +defined by the set of available fonts---specifically, those that match +what was otherwise specified for this text, in all attributes except +height. Each size for which a suitable font is available counts as +another step. @var{n} should be an integer. + +@item @code{(- @var{n})} +This means to use a font that is @var{n} steps smaller. + +@item a number, @var{factor} +A number, @var{factor}, means to use a font that is @var{factor} times +as tall as the default font. + +@item a symbol, @var{function} +A symbol is a function to compute the height. It is called with the +current height as argument, and should return the new height to use. + +@item anything else, @var{form} +If the @var{height} value doesn't fit the previous possibilities, it is +a form. Emacs evaluates it to get the new height, with the symbol +@code{height} bound to the current specified font height. +@end table + +@item (raise @var{factor}) +This kind of display specification raises or lowers the text +it applies to, relative to the baseline of the line. + +@var{factor} must be a number, which is interpreted as a multiple of the +height of the affected text. If it is positive, that means to display +the characters raised. If it is negative, that means to display them +lower down. + +If the text also has a @code{height} display specification, that does +not affect the amount of raising or lowering, which is based on the +faces used for the text. +@end table + +@c We put all the `@code{(when ...)}' on one line to encourage +@c makeinfo's end-of-sentence heuristics to DTRT. Previously, the dot +@c was at eol; the info file ended up w/ two spaces rendered after it. + You can make any display specification conditional. To do that, +package it in another list of the form +@code{(when @var{condition} . @var{spec})}. +Then the specification @var{spec} applies only when +@var{condition} evaluates to a non-@code{nil} value. During the +evaluation, @code{object} is bound to the string or buffer having the +conditional @code{display} property. @code{position} and +@code{buffer-position} are bound to the position within @code{object} +and the buffer position where the @code{display} property was found, +respectively. Both positions can be different when @code{object} is a +string. + +@node Display Margins +@subsection Displaying in the Margins +@cindex display margins +@cindex margins, display + + A buffer can have blank areas called @dfn{display margins} on the left +and on the right. Ordinary text never appears in these areas, but you +can put things into the display margins using the @code{display} +property. + + To put text in the left or right display margin of the window, use a +display specification of the form @code{(margin right-margin)} or +@code{(margin left-margin)} on it. To put an image in a display margin, +use that display specification along with the display specification for +the image. Unfortunately, there is currently no way to make +text or images in the margin mouse-sensitive. + + If you put such a display specification directly on text in the +buffer, the specified margin display appears @emph{instead of} that +buffer text itself. To put something in the margin @emph{in +association with} certain buffer text without preventing or altering +the display of that text, put a @code{before-string} property on the +text and put the display specification on the contents of the +before-string. + + Before the display margins can display anything, you must give +them a nonzero width. The usual way to do that is to set these +variables: + +@defvar left-margin-width +This variable specifies the width of the left margin. +It is buffer-local in all buffers. +@end defvar + +@defvar right-margin-width +This variable specifies the width of the right margin. +It is buffer-local in all buffers. +@end defvar + + Setting these variables does not immediately affect the window. These +variables are checked when a new buffer is displayed in the window. +Thus, you can make changes take effect by calling +@code{set-window-buffer}. + + You can also set the margin widths immediately. + +@defun set-window-margins window left &optional right +This function specifies the margin widths for window @var{window}. +The argument @var{left} controls the left margin and +@var{right} controls the right margin (default @code{0}). +@end defun + +@defun window-margins &optional window +This function returns the left and right margins of @var{window} +as a cons cell of the form @code{(@var{left} . @var{right})}. +If @var{window} is @code{nil}, the selected window is used. +@end defun + +@node Images +@section Images +@cindex images in buffers + + To display an image in an Emacs buffer, you must first create an image +descriptor, then use it as a display specifier in the @code{display} +property of text that is displayed (@pxref{Display Property}). + + Emacs is usually able to display images when it is run on a +graphical terminal. Images cannot be displayed in a text terminal, on +certain graphical terminals that lack the support for this, or if +Emacs is compiled without image support. You can use the function +@code{display-images-p} to determine if images can in principle be +displayed (@pxref{Display Feature Testing}). + +@menu +* Image Formats:: Supported image formats. +* Image Descriptors:: How to specify an image for use in @code{:display}. +* XBM Images:: Special features for XBM format. +* XPM Images:: Special features for XPM format. +* GIF Images:: Special features for GIF format. +* PostScript Images:: Special features for PostScript format. +* Other Image Types:: Various other formats are supported. +* Defining Images:: Convenient ways to define an image for later use. +* Showing Images:: Convenient ways to display an image once it is defined. +* Image Cache:: Internal mechanisms of image display. +@end menu + +@node Image Formats +@subsection Image Formats +@cindex image formats +@cindex image types + + Emacs can display a number of different image formats; some of them +are supported only if particular support libraries are installed on +your machine. In some environments, Emacs can load image +libraries on demand; if so, the variable @code{image-library-alist} +can be used to modify the set of known names for these dynamic +libraries (though it is not possible to add new image formats). + + The supported image formats include XBM, XPM (this requires the +libraries @code{libXpm} version 3.4k and @code{libz}), GIF (requiring +@code{libungif} 4.1.0), PostScript, PBM, JPEG (requiring the +@code{libjpeg} library version v6a), TIFF (requiring @code{libtiff} +v3.4), PNG (requiring @code{libpng} 1.0.2), and SVG (requiring +@code{librsvg} 2.0.0). + + You specify one of these formats with an image type symbol. The image +type symbols are @code{xbm}, @code{xpm}, @code{gif}, @code{postscript}, +@code{pbm}, @code{jpeg}, @code{tiff}, @code{png}, and @code{svg}. + +@defvar image-types +This variable contains a list of those image type symbols that are +potentially supported in the current configuration. +@emph{Potentially} here means that Emacs knows about the image types, +not necessarily that they can be loaded (they could depend on +unavailable dynamic libraries, for example). + +To know which image types are really available, use +@code{image-type-available-p}. +@end defvar + +@defvar image-library-alist +This in an alist of image types vs external libraries needed to +display them. + +Each element is a list @code{(@var{image-type} @var{library}...)}, +where the car is a supported image format from @code{image-types}, and +the rest are strings giving alternate filenames for the corresponding +external libraries to load. + +Emacs tries to load the libraries in the order they appear on the +list; if none is loaded, the running session of Emacs won't support +the image type. @code{pbm} and @code{xbm} don't need to be listed; +they're always supported. + +This variable is ignored if the image libraries are statically linked +into Emacs. +@end defvar + +@defun image-type-available-p type +This function returns non-@code{nil} if image type @var{type} is +available, i.e., if images of this type can be loaded and displayed in +Emacs. @var{type} should be one of the types contained in +@code{image-types}. + +For image types whose support libraries are statically linked, this +function always returns @code{t}; for other image types, it returns +@code{t} if the dynamic library could be loaded, @code{nil} otherwise. +@end defun + +@node Image Descriptors +@subsection Image Descriptors +@cindex image descriptor + + An image description is a list of the form @code{(image . @var{props})}, +where @var{props} is a property list containing alternating keyword +symbols (symbols whose names start with a colon) and their values. +You can use any Lisp object as a property, but the only properties +that have any special meaning are certain symbols, all of them keywords. + + Every image descriptor must contain the property @code{:type +@var{type}} to specify the format of the image. The value of @var{type} +should be an image type symbol; for example, @code{xpm} for an image in +XPM format. + + Here is a list of other properties that are meaningful for all image +types: + +@table @code +@item :file @var{file} +The @code{:file} property says to load the image from file +@var{file}. If @var{file} is not an absolute file name, it is expanded +in @code{data-directory}. + +@item :data @var{data} +The @code{:data} property says the actual contents of the image. +Each image must use either @code{:data} or @code{:file}, but not both. +For most image types, the value of the @code{:data} property should be a +string containing the image data; we recommend using a unibyte string. + +Before using @code{:data}, look for further information in the section +below describing the specific image format. For some image types, +@code{:data} may not be supported; for some, it allows other data types; +for some, @code{:data} alone is not enough, so you need to use other +image properties along with @code{:data}. + +@item :margin @var{margin} +The @code{:margin} property specifies how many pixels to add as an +extra margin around the image. The value, @var{margin}, must be a +non-negative number, or a pair @code{(@var{x} . @var{y})} of such +numbers. If it is a pair, @var{x} specifies how many pixels to add +horizontally, and @var{y} specifies how many pixels to add vertically. +If @code{:margin} is not specified, the default is zero. + +@item :ascent @var{ascent} +The @code{:ascent} property specifies the amount of the image's +height to use for its ascent---that is, the part above the baseline. +The value, @var{ascent}, must be a number in the range 0 to 100, or +the symbol @code{center}. + +If @var{ascent} is a number, that percentage of the image's height is +used for its ascent. + +If @var{ascent} is @code{center}, the image is vertically centered +around a centerline which would be the vertical centerline of text drawn +at the position of the image, in the manner specified by the text +properties and overlays that apply to the image. + +If this property is omitted, it defaults to 50. + +@item :relief @var{relief} +The @code{:relief} property, if non-@code{nil}, adds a shadow rectangle +around the image. The value, @var{relief}, specifies the width of the +shadow lines, in pixels. If @var{relief} is negative, shadows are drawn +so that the image appears as a pressed button; otherwise, it appears as +an unpressed button. + +@item :conversion @var{algorithm} +The @code{:conversion} property, if non-@code{nil}, specifies a +conversion algorithm that should be applied to the image before it is +displayed; the value, @var{algorithm}, specifies which algorithm. + +@table @code +@item laplace +@itemx emboss +Specifies the Laplace edge detection algorithm, which blurs out small +differences in color while highlighting larger differences. People +sometimes consider this useful for displaying the image for a +``disabled'' button. + +@item (edge-detection :matrix @var{matrix} :color-adjust @var{adjust}) +Specifies a general edge-detection algorithm. @var{matrix} must be +either a nine-element list or a nine-element vector of numbers. A pixel +at position @math{x/y} in the transformed image is computed from +original pixels around that position. @var{matrix} specifies, for each +pixel in the neighborhood of @math{x/y}, a factor with which that pixel +will influence the transformed pixel; element @math{0} specifies the +factor for the pixel at @math{x-1/y-1}, element @math{1} the factor for +the pixel at @math{x/y-1} etc., as shown below: +@iftex +@tex +$$\pmatrix{x-1/y-1 & x/y-1 & x+1/y-1 \cr + x-1/y & x/y & x+1/y \cr + x-1/y+1& x/y+1 & x+1/y+1 \cr}$$ +@end tex +@end iftex +@ifnottex +@display + (x-1/y-1 x/y-1 x+1/y-1 + x-1/y x/y x+1/y + x-1/y+1 x/y+1 x+1/y+1) +@end display +@end ifnottex + +The resulting pixel is computed from the color intensity of the color +resulting from summing up the RGB values of surrounding pixels, +multiplied by the specified factors, and dividing that sum by the sum +of the factors' absolute values. + +Laplace edge-detection currently uses a matrix of +@iftex +@tex +$$\pmatrix{1 & 0 & 0 \cr + 0& 0 & 0 \cr + 9 & 9 & -1 \cr}$$ +@end tex +@end iftex +@ifnottex +@display + (1 0 0 + 0 0 0 + 9 9 -1) +@end display +@end ifnottex + +Emboss edge-detection uses a matrix of +@iftex +@tex +$$\pmatrix{ 2 & -1 & 0 \cr + -1 & 0 & 1 \cr + 0 & 1 & -2 \cr}$$ +@end tex +@end iftex +@ifnottex +@display + ( 2 -1 0 + -1 0 1 + 0 1 -2) +@end display +@end ifnottex + +@item disabled +Specifies transforming the image so that it looks ``disabled.'' +@end table + +@item :mask @var{mask} +If @var{mask} is @code{heuristic} or @code{(heuristic @var{bg})}, build +a clipping mask for the image, so that the background of a frame is +visible behind the image. If @var{bg} is not specified, or if @var{bg} +is @code{t}, determine the background color of the image by looking at +the four corners of the image, assuming the most frequently occurring +color from the corners is the background color of the image. Otherwise, +@var{bg} must be a list @code{(@var{red} @var{green} @var{blue})} +specifying the color to assume for the background of the image. + +If @var{mask} is @code{nil}, remove a mask from the image, if it has +one. Images in some formats include a mask which can be removed by +specifying @code{:mask nil}. + +@item :pointer @var{shape} +This specifies the pointer shape when the mouse pointer is over this +image. @xref{Pointer Shape}, for available pointer shapes. + +@item :map @var{map} +This associates an image map of @dfn{hot spots} with this image. + +An image map is an alist where each element has the format +@code{(@var{area} @var{id} @var{plist})}. An @var{area} is specified +as either a rectangle, a circle, or a polygon. + +A rectangle is a cons +@code{(rect . ((@var{x0} . @var{y0}) . (@var{x1} . @var{y1})))} +which specifies the pixel coordinates of the upper left and bottom right +corners of the rectangle area. + +A circle is a cons +@code{(circle . ((@var{x0} . @var{y0}) . @var{r}))} +which specifies the center and the radius of the circle; @var{r} may +be a float or integer. + +A polygon is a cons +@code{(poly . [@var{x0} @var{y0} @var{x1} @var{y1} ...])} +where each pair in the vector describes one corner in the polygon. + +When the mouse pointer lies on a hot-spot area of an image, the +@var{plist} of that hot-spot is consulted; if it contains a @code{help-echo} +property, that defines a tool-tip for the hot-spot, and if it contains +a @code{pointer} property, that defines the shape of the mouse cursor when +it is on the hot-spot. +@xref{Pointer Shape}, for available pointer shapes. + +When you click the mouse when the mouse pointer is over a hot-spot, an +event is composed by combining the @var{id} of the hot-spot with the +mouse event; for instance, @code{[area4 mouse-1]} if the hot-spot's +@var{id} is @code{area4}. +@end table + +@defun image-mask-p spec &optional frame +This function returns @code{t} if image @var{spec} has a mask bitmap. +@var{frame} is the frame on which the image will be displayed. +@var{frame} @code{nil} or omitted means to use the selected frame +(@pxref{Input Focus}). +@end defun + +@node XBM Images +@subsection XBM Images +@cindex XBM + + To use XBM format, specify @code{xbm} as the image type. This image +format doesn't require an external library, so images of this type are +always supported. + + Additional image properties supported for the @code{xbm} image type are: + +@table @code +@item :foreground @var{foreground} +The value, @var{foreground}, should be a string specifying the image +foreground color, or @code{nil} for the default color. This color is +used for each pixel in the XBM that is 1. The default is the frame's +foreground color. + +@item :background @var{background} +The value, @var{background}, should be a string specifying the image +background color, or @code{nil} for the default color. This color is +used for each pixel in the XBM that is 0. The default is the frame's +background color. +@end table + + If you specify an XBM image using data within Emacs instead of an +external file, use the following three properties: + +@table @code +@item :data @var{data} +The value, @var{data}, specifies the contents of the image. +There are three formats you can use for @var{data}: + +@itemize @bullet +@item +A vector of strings or bool-vectors, each specifying one line of the +image. Do specify @code{:height} and @code{:width}. + +@item +A string containing the same byte sequence as an XBM file would contain. +You must not specify @code{:height} and @code{:width} in this case, +because omitting them is what indicates the data has the format of an +XBM file. The file contents specify the height and width of the image. + +@item +A string or a bool-vector containing the bits of the image (plus perhaps +some extra bits at the end that will not be used). It should contain at +least @var{width} * @code{height} bits. In this case, you must specify +@code{:height} and @code{:width}, both to indicate that the string +contains just the bits rather than a whole XBM file, and to specify the +size of the image. +@end itemize + +@item :width @var{width} +The value, @var{width}, specifies the width of the image, in pixels. + +@item :height @var{height} +The value, @var{height}, specifies the height of the image, in pixels. +@end table + +@node XPM Images +@subsection XPM Images +@cindex XPM + + To use XPM format, specify @code{xpm} as the image type. The +additional image property @code{:color-symbols} is also meaningful with +the @code{xpm} image type: + +@table @code +@item :color-symbols @var{symbols} +The value, @var{symbols}, should be an alist whose elements have the +form @code{(@var{name} . @var{color})}. In each element, @var{name} is +the name of a color as it appears in the image file, and @var{color} +specifies the actual color to use for displaying that name. +@end table + +@node GIF Images +@subsection GIF Images +@cindex GIF + + For GIF images, specify image type @code{gif}. + +@table @code +@item :index @var{index} +You can use @code{:index} to specify one image from a GIF file that +contains more than one image. This property specifies use of image +number @var{index} from the file. If the GIF file doesn't contain an +image with index @var{index}, the image displays as a hollow box. +@end table + +@ignore +This could be used to implement limited support for animated GIFs. +For example, the following function displays a multi-image GIF file +at point-min in the current buffer, switching between sub-images +every 0.1 seconds. + +(defun show-anim (file max) + "Display multi-image GIF file FILE which contains MAX subimages." + (display-anim (current-buffer) file 0 max t)) + +(defun display-anim (buffer file idx max first-time) + (when (= idx max) + (setq idx 0)) + (let ((img (create-image file nil :image idx))) + (save-excursion + (set-buffer buffer) + (goto-char (point-min)) + (unless first-time (delete-char 1)) + (insert-image img)) + (run-with-timer 0.1 nil 'display-anim buffer file (1+ idx) max nil))) +@end ignore + +@node PostScript Images +@subsection PostScript Images +@cindex postscript images + + To use PostScript for an image, specify image type @code{postscript}. +This works only if you have Ghostscript installed. You must always use +these three properties: + +@table @code +@item :pt-width @var{width} +The value, @var{width}, specifies the width of the image measured in +points (1/72 inch). @var{width} must be an integer. + +@item :pt-height @var{height} +The value, @var{height}, specifies the height of the image in points +(1/72 inch). @var{height} must be an integer. + +@item :bounding-box @var{box} +The value, @var{box}, must be a list or vector of four integers, which +specifying the bounding box of the PostScript image, analogous to the +@samp{BoundingBox} comment found in PostScript files. + +@example +%%BoundingBox: 22 171 567 738 +@end example +@end table + + Displaying PostScript images from Lisp data is not currently +implemented, but it may be implemented by the time you read this. +See the @file{etc/NEWS} file to make sure. + +@node Other Image Types +@subsection Other Image Types +@cindex PBM + + For PBM images, specify image type @code{pbm}. Color, gray-scale and +monochromatic images are supported. For mono PBM images, two additional +image properties are supported. + +@table @code +@item :foreground @var{foreground} +The value, @var{foreground}, should be a string specifying the image +foreground color, or @code{nil} for the default color. This color is +used for each pixel in the XBM that is 1. The default is the frame's +foreground color. + +@item :background @var{background} +The value, @var{background}, should be a string specifying the image +background color, or @code{nil} for the default color. This color is +used for each pixel in the XBM that is 0. The default is the frame's +background color. +@end table + + For JPEG images, specify image type @code{jpeg}. + + For TIFF images, specify image type @code{tiff}. + + For PNG images, specify image type @code{png}. + + For SVG images, specify image type @code{svg}. + +@node Defining Images +@subsection Defining Images + + The functions @code{create-image}, @code{defimage} and +@code{find-image} provide convenient ways to create image descriptors. + +@defun create-image file-or-data &optional type data-p &rest props +This function creates and returns an image descriptor which uses the +data in @var{file-or-data}. @var{file-or-data} can be a file name or +a string containing the image data; @var{data-p} should be @code{nil} +for the former case, non-@code{nil} for the latter case. + +The optional argument @var{type} is a symbol specifying the image type. +If @var{type} is omitted or @code{nil}, @code{create-image} tries to +determine the image type from the file's first few bytes, or else +from the file's name. + +The remaining arguments, @var{props}, specify additional image +properties---for example, + +@example +(create-image "foo.xpm" 'xpm nil :heuristic-mask t) +@end example + +The function returns @code{nil} if images of this type are not +supported. Otherwise it returns an image descriptor. +@end defun + +@defmac defimage symbol specs &optional doc +This macro defines @var{symbol} as an image name. The arguments +@var{specs} is a list which specifies how to display the image. +The third argument, @var{doc}, is an optional documentation string. + +Each argument in @var{specs} has the form of a property list, and each +one should specify at least the @code{:type} property and either the +@code{:file} or the @code{:data} property. The value of @code{:type} +should be a symbol specifying the image type, the value of +@code{:file} is the file to load the image from, and the value of +@code{:data} is a string containing the actual image data. Here is an +example: + +@example +(defimage test-image + ((:type xpm :file "~/test1.xpm") + (:type xbm :file "~/test1.xbm"))) +@end example + +@code{defimage} tests each argument, one by one, to see if it is +usable---that is, if the type is supported and the file exists. The +first usable argument is used to make an image descriptor which is +stored in @var{symbol}. + +If none of the alternatives will work, then @var{symbol} is defined +as @code{nil}. +@end defmac + +@defun find-image specs +This function provides a convenient way to find an image satisfying one +of a list of image specifications @var{specs}. + +Each specification in @var{specs} is a property list with contents +depending on image type. All specifications must at least contain the +properties @code{:type @var{type}} and either @w{@code{:file @var{file}}} +or @w{@code{:data @var{DATA}}}, where @var{type} is a symbol specifying +the image type, e.g.@: @code{xbm}, @var{file} is the file to load the +image from, and @var{data} is a string containing the actual image data. +The first specification in the list whose @var{type} is supported, and +@var{file} exists, is used to construct the image specification to be +returned. If no specification is satisfied, @code{nil} is returned. + +The image is looked for in @code{image-load-path}. +@end defun + +@defvar image-load-path +This variable's value is a list of locations in which to search for +image files. If an element is a string or a variable symbol whose +value is a string, the string is taken to be the name of a directory +to search. If an element is a variable symbol whose value is a list, +that is taken to be a list of directory names to search. + +The default is to search in the @file{images} subdirectory of the +directory specified by @code{data-directory}, then the directory +specified by @code{data-directory}, and finally in the directories in +@code{load-path}. Subdirectories are not automatically included in +the search, so if you put an image file in a subdirectory, you have to +supply the subdirectory name explicitly. For example, to find the +image @file{images/foo/bar.xpm} within @code{data-directory}, you +should specify the image as follows: + +@example +(defimage foo-image '((:type xpm :file "foo/bar.xpm"))) +@end example +@end defvar + +@defun image-load-path-for-library library image &optional path no-error +This function returns a suitable search path for images used by the +Lisp package @var{library}. + +The function searches for @var{image} first using @code{image-load-path}, +excluding @file{@code{data-directory}/images}, and then in +@code{load-path}, followed by a path suitable for @var{library}, which +includes @file{../../etc/images} and @file{../etc/images} relative to +the library file itself, and finally in +@file{@code{data-directory}/images}. + +Then this function returns a list of directories which contains first +the directory in which @var{image} was found, followed by the value of +@code{load-path}. If @var{path} is given, it is used instead of +@code{load-path}. + +If @var{no-error} is non-@code{nil} and a suitable path can't be +found, don't signal an error. Instead, return a list of directories as +before, except that @code{nil} appears in place of the image directory. + +Here is an example that uses a common idiom to provide compatibility +with versions of Emacs that lack the variable @code{image-load-path}: + +@example +(defvar image-load-path) ; shush compiler +(let* ((load-path (image-load-path-for-library + "mh-e" "mh-logo.xpm")) + (image-load-path (cons (car load-path) + (when (boundp 'image-load-path) + image-load-path)))) + (mh-tool-bar-folder-buttons-init)) +@end example +@end defun + +@node Showing Images +@subsection Showing Images + + You can use an image descriptor by setting up the @code{display} +property yourself, but it is easier to use the functions in this +section. + +@defun insert-image image &optional string area slice +This function inserts @var{image} in the current buffer at point. The +value @var{image} should be an image descriptor; it could be a value +returned by @code{create-image}, or the value of a symbol defined with +@code{defimage}. The argument @var{string} specifies the text to put +in the buffer to hold the image. If it is omitted or @code{nil}, +@code{insert-image} uses @code{" "} by default. + +The argument @var{area} specifies whether to put the image in a margin. +If it is @code{left-margin}, the image appears in the left margin; +@code{right-margin} specifies the right margin. If @var{area} is +@code{nil} or omitted, the image is displayed at point within the +buffer's text. + +The argument @var{slice} specifies a slice of the image to insert. If +@var{slice} is @code{nil} or omitted the whole image is inserted. +Otherwise, @var{slice} is a list @code{(@var{x} @var{y} @var{width} +@var{height})} which specifies the @var{x} and @var{y} positions and +@var{width} and @var{height} of the image area to insert. Integer +values are in units of pixels. A floating point number in the range +0.0--1.0 stands for that fraction of the width or height of the entire +image. + +Internally, this function inserts @var{string} in the buffer, and gives +it a @code{display} property which specifies @var{image}. @xref{Display +Property}. +@end defun + +@defun insert-sliced-image image &optional string area rows cols +This function inserts @var{image} in the current buffer at point, like +@code{insert-image}, but splits the image into @var{rows}x@var{cols} +equally sized slices. +@end defun + +@defun put-image image pos &optional string area +This function puts image @var{image} in front of @var{pos} in the +current buffer. The argument @var{pos} should be an integer or a +marker. It specifies the buffer position where the image should appear. +The argument @var{string} specifies the text that should hold the image +as an alternative to the default. + +The argument @var{image} must be an image descriptor, perhaps returned +by @code{create-image} or stored by @code{defimage}. + +The argument @var{area} specifies whether to put the image in a margin. +If it is @code{left-margin}, the image appears in the left margin; +@code{right-margin} specifies the right margin. If @var{area} is +@code{nil} or omitted, the image is displayed at point within the +buffer's text. + +Internally, this function creates an overlay, and gives it a +@code{before-string} property containing text that has a @code{display} +property whose value is the image. (Whew!) +@end defun + +@defun remove-images start end &optional buffer +This function removes images in @var{buffer} between positions +@var{start} and @var{end}. If @var{buffer} is omitted or @code{nil}, +images are removed from the current buffer. + +This removes only images that were put into @var{buffer} the way +@code{put-image} does it, not images that were inserted with +@code{insert-image} or in other ways. +@end defun + +@defun image-size spec &optional pixels frame +This function returns the size of an image as a pair +@w{@code{(@var{width} . @var{height})}}. @var{spec} is an image +specification. @var{pixels} non-@code{nil} means return sizes +measured in pixels, otherwise return sizes measured in canonical +character units (fractions of the width/height of the frame's default +font). @var{frame} is the frame on which the image will be displayed. +@var{frame} null or omitted means use the selected frame (@pxref{Input +Focus}). +@end defun + +@defvar max-image-size +This variable is used to define the maximum size of image that Emacs +will load. Emacs will refuse to load (and display) any image that is +larger than this limit. + +If the value is an integer, it directly specifies the maximum +image height and width, measured in pixels. If it is a floating +point number, it specifies the maximum image height and width +as a ratio to the frame height and width. If the value is +non-numeric, there is no explicit limit on the size of images. + +The purpose of this variable is to prevent unreasonably large images +from accidentally being loaded into Emacs. It only takes effect the +first time an image is loaded. Once an image is placed in the image +cache, it can always be displayed, even if the value of +@var{max-image-size} is subsequently changed (@pxref{Image Cache}). +@end defvar + +@node Image Cache +@subsection Image Cache +@cindex image cache + + Emacs stores images in an image cache so that it can display them +again more efficiently. When Emacs displays an image, it searches the +image cache for an existing image specification @code{equal} to the +desired specification. If a match is found, the image is displayed +from the cache; otherwise, Emacs loads the image normally. + + Occasionally, you may need to tell Emacs to refresh the images +associated with a given image specification. For example, suppose you +display an image using a specification that contains a @code{:file} +property. The image is loaded from the given file and stored in the +image cache. If you later display the image again, using the same +image specification, the image is displayed from the image cache. +Normally, this is not a problem. However, if the image file has +changed in the meantime, Emacs would be displaying the old version of +the image. In such a situation, it is necessary to ``refresh'' the +image using @code{image-refresh}. + +@defun image-refresh spec &optional frame +This function refreshes any images having image specifications +@code{equal} to @var{spec} on frame @var{frame}. If @var{frame} is +@code{nil}, the selected frame is used. If @var{frame} is @code{t}, +the refresh is applied to all existing frames. + +This works by removing all image with image specifications matching +@var{spec} from the image cache. Thus, the next time the image is +displayed, Emacs will load the image again. +@end defun + +@defun clear-image-cache &optional frame +This function clears the entire image cache. If @var{frame} is +non-@code{nil}, only the cache for that frame is cleared. Otherwise, +all frames' caches are cleared. +@end defun + +If an image in the image cache has not been displayed for a specified +period of time, Emacs removes it from the cache and frees the +associated memory. + +@defvar image-cache-eviction-delay +This variable specifies the number of seconds an image can remain in the +cache without being displayed. When an image is not displayed for this +length of time, Emacs removes it from the image cache. + +If the value is @code{nil}, Emacs does not remove images from the cache +except when you explicitly clear it. This mode can be useful for +debugging. +@end defvar + +@node Buttons +@section Buttons +@cindex buttons in buffers +@cindex clickable buttons in buffers + + The @emph{button} package defines functions for inserting and +manipulating clickable (with the mouse, or via keyboard commands) +buttons in Emacs buffers, such as might be used for help hyper-links, +etc. Emacs uses buttons for the hyper-links in help text and the like. + + A button is essentially a set of properties attached (via text +properties or overlays) to a region of text in an Emacs buffer. These +properties are called @dfn{button properties}. + + One of these properties (@code{action}) is a function, which will +be called when the user invokes it using the keyboard or the mouse. +The invoked function may then examine the button and use its other +properties as desired. + + In some ways the Emacs button package duplicates functionality offered +by the widget package (@pxref{Top, , Introduction, widget, The Emacs +Widget Library}), but the button package has the advantage that it is +much faster, much smaller, and much simpler to use (for elisp +programmers---for users, the result is about the same). The extra +speed and space savings are useful mainly if you need to create many +buttons in a buffer (for instance an @code{*Apropos*} buffer uses +buttons to make entries clickable, and may contain many thousands of +entries). + +@menu +* Button Properties:: Button properties with special meanings. +* Button Types:: Defining common properties for classes of buttons. +* Making Buttons:: Adding buttons to Emacs buffers. +* Manipulating Buttons:: Getting and setting properties of buttons. +* Button Buffer Commands:: Buffer-wide commands and bindings for buttons. +@end menu + +@node Button Properties +@subsection Button Properties +@cindex button properties + + Buttons have an associated list of properties defining their +appearance and behavior, and other arbitrary properties may be used +for application specific purposes. Some properties that have special +meaning to the button package include: + +@table @code +@item action +@kindex action @r{(button property)} +The function to call when the user invokes the button, which is passed +the single argument @var{button}. By default this is @code{ignore}, +which does nothing. + +@item mouse-action +@kindex mouse-action @r{(button property)} +This is similar to @code{action}, and when present, will be used +instead of @code{action} for button invocations resulting from +mouse-clicks (instead of the user hitting @key{RET}). If not +present, mouse-clicks use @code{action} instead. + +@item face +@kindex face @r{(button property)} +This is an Emacs face controlling how buttons of this type are +displayed; by default this is the @code{button} face. + +@item mouse-face +@kindex mouse-face @r{(button property)} +This is an additional face which controls appearance during +mouse-overs (merged with the usual button face); by default this is +the usual Emacs @code{highlight} face. + +@item keymap +@kindex keymap @r{(button property)} +The button's keymap, defining bindings active within the button +region. By default this is the usual button region keymap, stored +in the variable @code{button-map}, which defines @key{RET} and +@key{mouse-2} to invoke the button. + +@item type +@kindex type @r{(button property)} +The button-type of the button. When creating a button, this is +usually specified using the @code{:type} keyword argument. +@xref{Button Types}. + +@item help-echo +@kindex help-index @r{(button property)} +A string displayed by the Emacs tool-tip help system; by default, +@code{"mouse-2, RET: Push this button"}. + +@item follow-link +@kindex follow-link @r{(button property)} +The follow-link property, defining how a @key{Mouse-1} click behaves +on this button, @xref{Links and Mouse-1}. + +@item button +@kindex button @r{(button property)} +All buttons have a non-@code{nil} @code{button} property, which may be useful +in finding regions of text that comprise buttons (which is what the +standard button functions do). +@end table + + There are other properties defined for the regions of text in a +button, but these are not generally interesting for typical uses. + +@node Button Types +@subsection Button Types +@cindex button types + + Every button has a button @emph{type}, which defines default values +for the button's properties. Button types are arranged in a +hierarchy, with specialized types inheriting from more general types, +so that it's easy to define special-purpose types of buttons for +specific tasks. + +@defun define-button-type name &rest properties +Define a `button type' called @var{name}. The remaining arguments +form a sequence of @var{property value} pairs, specifying default +property values for buttons with this type (a button's type may be set +by giving it a @code{type} property when creating the button, using +the @code{:type} keyword argument). + +In addition, the keyword argument @code{:supertype} may be used to +specify a button-type from which @var{name} inherits its default +property values. Note that this inheritance happens only when +@var{name} is defined; subsequent changes to a supertype are not +reflected in its subtypes. +@end defun + + Using @code{define-button-type} to define default properties for +buttons is not necessary---buttons without any specified type use the +built-in button-type @code{button}---but it is encouraged, since +doing so usually makes the resulting code clearer and more efficient. + +@node Making Buttons +@subsection Making Buttons +@cindex making buttons + + Buttons are associated with a region of text, using an overlay or +text properties to hold button-specific information, all of which are +initialized from the button's type (which defaults to the built-in +button type @code{button}). Like all Emacs text, the appearance of +the button is governed by the @code{face} property; by default (via +the @code{face} property inherited from the @code{button} button-type) +this is a simple underline, like a typical web-page link. + + For convenience, there are two sorts of button-creation functions, +those that add button properties to an existing region of a buffer, +called @code{make-...button}, and those that also insert the button +text, called @code{insert-...button}. + + The button-creation functions all take the @code{&rest} argument +@var{properties}, which should be a sequence of @var{property value} +pairs, specifying properties to add to the button; see @ref{Button +Properties}. In addition, the keyword argument @code{:type} may be +used to specify a button-type from which to inherit other properties; +see @ref{Button Types}. Any properties not explicitly specified +during creation will be inherited from the button's type (if the type +defines such a property). + + The following functions add a button using an overlay +(@pxref{Overlays}) to hold the button properties: + +@defun make-button beg end &rest properties +This makes a button from @var{beg} to @var{end} in the +current buffer, and returns it. +@end defun + +@defun insert-button label &rest properties +This insert a button with the label @var{label} at point, +and returns it. +@end defun + + The following functions are similar, but use Emacs text properties +(@pxref{Text Properties}) to hold the button properties, making the +button actually part of the text instead of being a property of the +buffer. Buttons using text properties do not create markers into the +buffer, which is important for speed when you use extremely large +numbers of buttons. Both functions return the position of the start +of the new button: + +@defun make-text-button beg end &rest properties +This makes a button from @var{beg} to @var{end} in the current buffer, using +text properties. +@end defun + +@defun insert-text-button label &rest properties +This inserts a button with the label @var{label} at point, using text +properties. +@end defun + +@node Manipulating Buttons +@subsection Manipulating Buttons +@cindex manipulating buttons + +These are functions for getting and setting properties of buttons. +Often these are used by a button's invocation function to determine +what to do. + +Where a @var{button} parameter is specified, it means an object +referring to a specific button, either an overlay (for overlay +buttons), or a buffer-position or marker (for text property buttons). +Such an object is passed as the first argument to a button's +invocation function when it is invoked. + +@defun button-start button +Return the position at which @var{button} starts. +@end defun + +@defun button-end button +Return the position at which @var{button} ends. +@end defun + +@defun button-get button prop +Get the property of button @var{button} named @var{prop}. +@end defun + +@defun button-put button prop val +Set @var{button}'s @var{prop} property to @var{val}. +@end defun + +@defun button-activate button &optional use-mouse-action +Call @var{button}'s @code{action} property (i.e., invoke it). If +@var{use-mouse-action} is non-@code{nil}, try to invoke the button's +@code{mouse-action} property instead of @code{action}; if the button +has no @code{mouse-action} property, use @code{action} as normal. +@end defun + +@defun button-label button +Return @var{button}'s text label. +@end defun + +@defun button-type button +Return @var{button}'s button-type. +@end defun + +@defun button-has-type-p button type +Return @code{t} if @var{button} has button-type @var{type}, or one of +@var{type}'s subtypes. +@end defun + +@defun button-at pos +Return the button at position @var{pos} in the current buffer, or @code{nil}. +@end defun + +@defun button-type-put type prop val +Set the button-type @var{type}'s @var{prop} property to @var{val}. +@end defun + +@defun button-type-get type prop +Get the property of button-type @var{type} named @var{prop}. +@end defun + +@defun button-type-subtype-p type supertype +Return @code{t} if button-type @var{type} is a subtype of @var{supertype}. +@end defun + +@node Button Buffer Commands +@subsection Button Buffer Commands +@cindex button buffer commands + +These are commands and functions for locating and operating on +buttons in an Emacs buffer. + +@code{push-button} is the command that a user uses to actually `push' +a button, and is bound by default in the button itself to @key{RET} +and to @key{mouse-2} using a region-specific keymap. Commands +that are useful outside the buttons itself, such as +@code{forward-button} and @code{backward-button} are additionally +available in the keymap stored in @code{button-buffer-map}; a mode +which uses buttons may want to use @code{button-buffer-map} as a +parent keymap for its keymap. + +If the button has a non-@code{nil} @code{follow-link} property, and +@var{mouse-1-click-follows-link} is set, a quick @key{Mouse-1} click +will also activate the @code{push-button} command. +@xref{Links and Mouse-1}. + +@deffn Command push-button &optional pos use-mouse-action +Perform the action specified by a button at location @var{pos}. +@var{pos} may be either a buffer position or a mouse-event. If +@var{use-mouse-action} is non-@code{nil}, or @var{pos} is a +mouse-event (@pxref{Mouse Events}), try to invoke the button's +@code{mouse-action} property instead of @code{action}; if the button +has no @code{mouse-action} property, use @code{action} as normal. +@var{pos} defaults to point, except when @code{push-button} is invoked +interactively as the result of a mouse-event, in which case, the mouse +event's position is used. If there's no button at @var{pos}, do +nothing and return @code{nil}, otherwise return @code{t}. +@end deffn + +@deffn Command forward-button n &optional wrap display-message +Move to the @var{n}th next button, or @var{n}th previous button if +@var{n} is negative. If @var{n} is zero, move to the start of any +button at point. If @var{wrap} is non-@code{nil}, moving past either +end of the buffer continues from the other end. If +@var{display-message} is non-@code{nil}, the button's help-echo string +is displayed. Any button with a non-@code{nil} @code{skip} property +is skipped over. Returns the button found. +@end deffn + +@deffn Command backward-button n &optional wrap display-message +Move to the @var{n}th previous button, or @var{n}th next button if +@var{n} is negative. If @var{n} is zero, move to the start of any +button at point. If @var{wrap} is non-@code{nil}, moving past either +end of the buffer continues from the other end. If +@var{display-message} is non-@code{nil}, the button's help-echo string +is displayed. Any button with a non-@code{nil} @code{skip} property +is skipped over. Returns the button found. +@end deffn + +@defun next-button pos &optional count-current +@defunx previous-button pos &optional count-current +Return the next button after (for @code{next-button} or before (for +@code{previous-button}) position @var{pos} in the current buffer. If +@var{count-current} is non-@code{nil}, count any button at @var{pos} +in the search, instead of starting at the next button. +@end defun + +@node Abstract Display +@section Abstract Display +@cindex ewoc +@cindex display, abstract +@cindex display, arbitrary objects +@cindex model/view/controller +@cindex view part, model/view/controller + + The Ewoc package constructs buffer text that represents a structure +of Lisp objects, and updates the text to follow changes in that +structure. This is like the ``view'' component in the +``model/view/controller'' design paradigm. + + An @dfn{ewoc} is a structure that organizes information required to +construct buffer text that represents certain Lisp data. The buffer +text of the ewoc has three parts, in order: first, fixed @dfn{header} +text; next, textual descriptions of a series of data elements (Lisp +objects that you specify); and last, fixed @dfn{footer} text. +Specifically, an ewoc contains information on: + +@itemize @bullet +@item +The buffer which its text is generated in. + +@item +The text's start position in the buffer. + +@item +The header and footer strings. + +@item +A doubly-linked chain of @dfn{nodes}, each of which contains: + +@itemize +@item +A @dfn{data element}, a single Lisp object. + +@item +Links to the preceding and following nodes in the chain. +@end itemize + +@item +A @dfn{pretty-printer} function which is responsible for +inserting the textual representation of a data +element value into the current buffer. +@end itemize + + Typically, you define an ewoc with @code{ewoc-create}, and then pass +the resulting ewoc structure to other functions in the Ewoc package to +build nodes within it, and display it in the buffer. Once it is +displayed in the buffer, other functions determine the correspondance +between buffer positions and nodes, move point from one node's textual +representation to another, and so forth. @xref{Abstract Display +Functions}. + + A node @dfn{encapsulates} a data element much the way a variable +holds a value. Normally, encapsulation occurs as a part of adding a +node to the ewoc. You can retrieve the data element value and place a +new value in its place, like so: + +@lisp +(ewoc-data @var{node}) +@result{} value + +(ewoc-set-data @var{node} @var{new-value}) +@result{} @var{new-value} +@end lisp + +@noindent +You can also use, as the data element value, a Lisp object (list or +vector) that is a container for the ``real'' value, or an index into +some other structure. The example (@pxref{Abstract Display Example}) +uses the latter approach. + + When the data changes, you will want to update the text in the +buffer. You can update all nodes by calling @code{ewoc-refresh}, or +just specific nodes using @code{ewoc-invalidate}, or all nodes +satisfying a predicate using @code{ewoc-map}. Alternatively, you can +delete invalid nodes using @code{ewoc-delete} or @code{ewoc-filter}, +and add new nodes in their place. Deleting a node from an ewoc deletes +its associated textual description from buffer, as well. + +@menu +* Abstract Display Functions:: +* Abstract Display Example:: +@end menu + +@node Abstract Display Functions +@subsection Abstract Display Functions + + In this subsection, @var{ewoc} and @var{node} stand for the +structures described above (@pxref{Abstract Display}), while +@var{data} stands for an arbitrary Lisp object used as a data element. + +@defun ewoc-create pretty-printer &optional header footer nosep +This constructs and returns a new ewoc, with no nodes (and thus no data +elements). @var{pretty-printer} should be a function that takes one +argument, a data element of the sort you plan to use in this ewoc, and +inserts its textual description at point using @code{insert} (and never +@code{insert-before-markers}, because that would interfere with the +Ewoc package's internal mechanisms). + +Normally, a newline is automatically inserted after the header, +the footer and every node's textual description. If @var{nosep} +is non-@code{nil}, no newline is inserted. This may be useful for +displaying an entire ewoc on a single line, for example, or for +making nodes ``invisible'' by arranging for @var{pretty-printer} +to do nothing for those nodes. + +An ewoc maintains its text in the buffer that is current when +you create it, so switch to the intended buffer before calling +@code{ewoc-create}. +@end defun + +@defun ewoc-buffer ewoc +This returns the buffer where @var{ewoc} maintains its text. +@end defun + +@defun ewoc-get-hf ewoc +This returns a cons cell @code{(@var{header} . @var{footer})} +made from @var{ewoc}'s header and footer. +@end defun + +@defun ewoc-set-hf ewoc header footer +This sets the header and footer of @var{ewoc} to the strings +@var{header} and @var{footer}, respectively. +@end defun + +@defun ewoc-enter-first ewoc data +@defunx ewoc-enter-last ewoc data +These add a new node encapsulating @var{data}, putting it, respectively, +at the beginning or end of @var{ewoc}'s chain of nodes. +@end defun + +@defun ewoc-enter-before ewoc node data +@defunx ewoc-enter-after ewoc node data +These add a new node encapsulating @var{data}, adding it to +@var{ewoc} before or after @var{node}, respectively. +@end defun + +@defun ewoc-prev ewoc node +@defunx ewoc-next ewoc node +These return, respectively, the previous node and the next node of @var{node} +in @var{ewoc}. +@end defun + +@defun ewoc-nth ewoc n +This returns the node in @var{ewoc} found at zero-based index @var{n}. +A negative @var{n} means count from the end. @code{ewoc-nth} returns +@code{nil} if @var{n} is out of range. +@end defun + +@defun ewoc-data node +This extracts the data encapsulated by @var{node} and returns it. +@end defun + +@defun ewoc-set-data node data +This sets the data encapsulated by @var{node} to @var{data}. +@end defun + +@defun ewoc-locate ewoc &optional pos guess +This determines the node in @var{ewoc} which contains point (or +@var{pos} if specified), and returns that node. If @var{ewoc} has no +nodes, it returns @code{nil}. If @var{pos} is before the first node, +it returns the first node; if @var{pos} is after the last node, it returns +the last node. The optional third arg @var{guess} +should be a node that is likely to be near @var{pos}; this doesn't +alter the result, but makes the function run faster. +@end defun + +@defun ewoc-location node +This returns the start position of @var{node}. +@end defun + +@defun ewoc-goto-prev ewoc arg +@defunx ewoc-goto-next ewoc arg +These move point to the previous or next, respectively, @var{arg}th node +in @var{ewoc}. @code{ewoc-goto-prev} does not move if it is already at +the first node or if @var{ewoc} is empty, whereas @code{ewoc-goto-next} +moves past the last node, returning @code{nil}. Excepting this special +case, these functions return the node moved to. +@end defun + +@defun ewoc-goto-node ewoc node +This moves point to the start of @var{node} in @var{ewoc}. +@end defun + +@defun ewoc-refresh ewoc +This function regenerates the text of @var{ewoc}. It works by +deleting the text between the header and the footer, i.e., all the +data elements' representations, and then calling the pretty-printer +function for each node, one by one, in order. +@end defun + +@defun ewoc-invalidate ewoc &rest nodes +This is similar to @code{ewoc-refresh}, except that only @var{nodes} in +@var{ewoc} are updated instead of the entire set. +@end defun + +@defun ewoc-delete ewoc &rest nodes +This deletes each node in @var{nodes} from @var{ewoc}. +@end defun + +@defun ewoc-filter ewoc predicate &rest args +This calls @var{predicate} for each data element in @var{ewoc} and +deletes those nodes for which @var{predicate} returns @code{nil}. +Any @var{args} are passed to @var{predicate}. +@end defun + +@defun ewoc-collect ewoc predicate &rest args +This calls @var{predicate} for each data element in @var{ewoc} +and returns a list of those elements for which @var{predicate} +returns non-@code{nil}. The elements in the list are ordered +as in the buffer. Any @var{args} are passed to @var{predicate}. +@end defun + +@defun ewoc-map map-function ewoc &rest args +This calls @var{map-function} for each data element in @var{ewoc} and +updates those nodes for which @var{map-function} returns non-@code{nil}. +Any @var{args} are passed to @var{map-function}. +@end defun + +@node Abstract Display Example +@subsection Abstract Display Example + + Here is a simple example using functions of the ewoc package to +implement a ``color components display,'' an area in a buffer that +represents a vector of three integers (itself representing a 24-bit RGB +value) in various ways. + +@example +(setq colorcomp-ewoc nil + colorcomp-data nil + colorcomp-mode-map nil + colorcomp-labels ["Red" "Green" "Blue"]) + +(defun colorcomp-pp (data) + (if data + (let ((comp (aref colorcomp-data data))) + (insert (aref colorcomp-labels data) "\t: #x" + (format "%02X" comp) " " + (make-string (ash comp -2) ?#) "\n")) + (let ((cstr (format "#%02X%02X%02X" + (aref colorcomp-data 0) + (aref colorcomp-data 1) + (aref colorcomp-data 2))) + (samp " (sample text) ")) + (insert "Color\t: " + (propertize samp 'face `(foreground-color . ,cstr)) + (propertize samp 'face `(background-color . ,cstr)) + "\n")))) + +(defun colorcomp (color) + "Allow fiddling with COLOR in a new buffer. +The buffer is in Color Components mode." + (interactive "sColor (name or #RGB or #RRGGBB): ") + (when (string= "" color) + (setq color "green")) + (unless (color-values color) + (error "No such color: %S" color)) + (switch-to-buffer + (generate-new-buffer (format "originally: %s" color))) + (kill-all-local-variables) + (setq major-mode 'colorcomp-mode + mode-name "Color Components") + (use-local-map colorcomp-mode-map) + (erase-buffer) + (buffer-disable-undo) + (let ((data (apply 'vector (mapcar (lambda (n) (ash n -8)) + (color-values color)))) + (ewoc (ewoc-create 'colorcomp-pp + "\nColor Components\n\n" + (substitute-command-keys + "\n\\@{colorcomp-mode-map@}")))) + (set (make-local-variable 'colorcomp-data) data) + (set (make-local-variable 'colorcomp-ewoc) ewoc) + (ewoc-enter-last ewoc 0) + (ewoc-enter-last ewoc 1) + (ewoc-enter-last ewoc 2) + (ewoc-enter-last ewoc nil))) +@end example + +@cindex controller part, model/view/controller + This example can be extended to be a ``color selection widget'' (in +other words, the controller part of the ``model/view/controller'' +design paradigm) by defining commands to modify @code{colorcomp-data} +and to ``finish'' the selection process, and a keymap to tie it all +together conveniently. + +@smallexample +(defun colorcomp-mod (index limit delta) + (let ((cur (aref colorcomp-data index))) + (unless (= limit cur) + (aset colorcomp-data index (+ cur delta))) + (ewoc-invalidate + colorcomp-ewoc + (ewoc-nth colorcomp-ewoc index) + (ewoc-nth colorcomp-ewoc -1)))) + +(defun colorcomp-R-more () (interactive) (colorcomp-mod 0 255 1)) +(defun colorcomp-G-more () (interactive) (colorcomp-mod 1 255 1)) +(defun colorcomp-B-more () (interactive) (colorcomp-mod 2 255 1)) +(defun colorcomp-R-less () (interactive) (colorcomp-mod 0 0 -1)) +(defun colorcomp-G-less () (interactive) (colorcomp-mod 1 0 -1)) +(defun colorcomp-B-less () (interactive) (colorcomp-mod 2 0 -1)) + +(defun colorcomp-copy-as-kill-and-exit () + "Copy the color components into the kill ring and kill the buffer. +The string is formatted #RRGGBB (hash followed by six hex digits)." + (interactive) + (kill-new (format "#%02X%02X%02X" + (aref colorcomp-data 0) + (aref colorcomp-data 1) + (aref colorcomp-data 2))) + (kill-buffer nil)) + +(setq colorcomp-mode-map + (let ((m (make-sparse-keymap))) + (suppress-keymap m) + (define-key m "i" 'colorcomp-R-less) + (define-key m "o" 'colorcomp-R-more) + (define-key m "k" 'colorcomp-G-less) + (define-key m "l" 'colorcomp-G-more) + (define-key m "," 'colorcomp-B-less) + (define-key m "." 'colorcomp-B-more) + (define-key m " " 'colorcomp-copy-as-kill-and-exit) + m)) +@end smallexample + +Note that we never modify the data in each node, which is fixed when the +ewoc is created to be either @code{nil} or an index into the vector +@code{colorcomp-data}, the actual color components. + +@node Blinking +@section Blinking Parentheses +@cindex parenthesis matching +@cindex blinking parentheses +@cindex balancing parentheses + + This section describes the mechanism by which Emacs shows a matching +open parenthesis when the user inserts a close parenthesis. + +@defvar blink-paren-function +The value of this variable should be a function (of no arguments) to +be called whenever a character with close parenthesis syntax is inserted. +The value of @code{blink-paren-function} may be @code{nil}, in which +case nothing is done. +@end defvar + +@defopt blink-matching-paren +If this variable is @code{nil}, then @code{blink-matching-open} does +nothing. +@end defopt + +@defopt blink-matching-paren-distance +This variable specifies the maximum distance to scan for a matching +parenthesis before giving up. +@end defopt + +@defopt blink-matching-delay +This variable specifies the number of seconds for the cursor to remain +at the matching parenthesis. A fraction of a second often gives +good results, but the default is 1, which works on all systems. +@end defopt + +@deffn Command blink-matching-open +This function is the default value of @code{blink-paren-function}. 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, it displays the character's +context in the echo area. To avoid long delays, this function does not +search farther than @code{blink-matching-paren-distance} characters. + +Here is an example of calling this function explicitly. + +@smallexample +@group +(defun interactive-blink-matching-open () +@c Do not break this line! -- rms. +@c The first line of a doc string +@c must stand alone. + "Indicate momentarily the start of sexp before point." + (interactive) +@end group +@group + (let ((blink-matching-paren-distance + (buffer-size)) + (blink-matching-paren t)) + (blink-matching-open))) +@end group +@end smallexample +@end deffn + +@node Usual Display +@section Usual Display Conventions + + The usual display conventions define how to display each character +code. You can override these conventions by setting up a display table +(@pxref{Display Tables}). Here are the usual display conventions: + +@itemize @bullet +@item +Character codes 32 through 126 map to glyph codes 32 through 126. +Normally this means they display as themselves. + +@item +Character code 9 is a horizontal tab. It displays as whitespace +up to a position determined by @code{tab-width}. + +@item +Character code 10 is a newline. + +@item +All other codes in the range 0 through 31, and code 127, display in one +of two ways according to the value of @code{ctl-arrow}. If it is +non-@code{nil}, these codes map to sequences of two glyphs, where the +first glyph is the @acronym{ASCII} code for @samp{^}. (A display table can +specify a glyph to use instead of @samp{^}.) Otherwise, these codes map +just like the codes in the range 128 to 255. + +On MS-DOS terminals, Emacs arranges by default for the character code +127 to be mapped to the glyph code 127, which normally displays as an +empty polygon. This glyph is used to display non-@acronym{ASCII} characters +that the MS-DOS terminal doesn't support. @xref{MS-DOS and MULE,,, +emacs, The GNU Emacs Manual}. + +@item +Character codes 128 through 255 map to sequences of four glyphs, where +the first glyph is the @acronym{ASCII} code for @samp{\}, and the others are +digit characters representing the character code in octal. (A display +table can specify a glyph to use instead of @samp{\}.) + +@item +Multibyte character codes above 256 are displayed as themselves, or as a +question mark or empty box if the terminal cannot display that +character. +@end itemize + + The usual display conventions apply even when there is a display +table, for any character whose entry in the active display table is +@code{nil}. Thus, when you set up a display table, you need only +specify the characters for which you want special behavior. + + These display rules apply to carriage return (character code 13), when +it appears in the buffer. But that character may not appear in the +buffer where you expect it, if it was eliminated as part of end-of-line +conversion (@pxref{Coding System Basics}). + + 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. These variables also affect +how the mode line is displayed; if you want to force redisplay of the +mode line using the new values, call the function +@code{force-mode-line-update} (@pxref{Mode Line Format}). + +@defopt ctl-arrow +@cindex control characters in display +This buffer-local variable controls how control characters are +displayed. If it is non-@code{nil}, they are displayed as a caret +followed by the character: @samp{^A}. If it is @code{nil}, they are +displayed as a backslash followed by three octal digits: @samp{\001}. +@end defopt + +@c Following may have overfull hbox. +@defvar default-ctl-arrow +The value of this variable is the default value for @code{ctl-arrow} in +buffers that do not override it. @xref{Default Value}. +@end defvar + +@defopt tab-width +The value of this buffer-local variable is the spacing between tab +stops used for displaying tab characters in Emacs buffers. The value +is in units of columns, and the default is 8. Note that this feature +is completely independent of the user-settable tab stops used by the +command @code{tab-to-tab-stop}. @xref{Indent Tabs}. +@end defopt + +@node Display Tables +@section Display Tables + +@cindex display table +You can use the @dfn{display table} feature to control how all possible +character codes display on the screen. This is useful for displaying +European languages that have letters not in the @acronym{ASCII} character +set. + +The display table maps each character code into a sequence of +@dfn{glyphs}, each glyph being a graphic that takes up one character +position on the screen. You can also define how to display each glyph +on your terminal, using the @dfn{glyph table}. + +Display tables affect how the mode line is displayed; if you want to +force redisplay of the mode line using a new display table, call +@code{force-mode-line-update} (@pxref{Mode Line Format}). + +@menu +* Display Table Format:: What a display table consists of. +* Active Display Table:: How Emacs selects a display table to use. +* Glyphs:: How to define a glyph, and what glyphs mean. +@end menu + +@node Display Table Format +@subsection Display Table Format + + A display table is actually a char-table (@pxref{Char-Tables}) with +@code{display-table} as its subtype. + +@defun make-display-table +This creates and returns a display table. The table initially has +@code{nil} in all elements. +@end defun + + The ordinary elements of the display table are indexed by character +codes; the element at index @var{c} says how to display the character +code @var{c}. The value should be @code{nil} or a vector of the +glyphs to be output (@pxref{Glyphs}). @code{nil} says to display the +character @var{c} according to the usual display conventions +(@pxref{Usual Display}). + + @strong{Warning:} if you use the display table to change the display +of newline characters, the whole buffer will be displayed as one long +``line.'' + + The display table also has six ``extra slots'' which serve special +purposes. Here is a table of their meanings; @code{nil} in any slot +means to use the default for that slot, as stated below. + +@table @asis +@item 0 +The glyph for the end of a truncated screen line (the default for this +is @samp{$}). @xref{Glyphs}. On graphical terminals, Emacs uses +arrows in the fringes to indicate truncation, so the display table has +no effect. + +@item 1 +The glyph for the end of a continued line (the default is @samp{\}). +On graphical terminals, Emacs uses curved arrows in the fringes to +indicate continuation, so the display table has no effect. + +@item 2 +The glyph for indicating a character displayed as an octal character +code (the default is @samp{\}). + +@item 3 +The glyph for indicating a control character (the default is @samp{^}). + +@item 4 +A vector of glyphs for indicating the presence of invisible lines (the +default is @samp{...}). @xref{Selective Display}. + +@item 5 +The glyph used to draw the border between side-by-side windows (the +default is @samp{|}). @xref{Splitting Windows}. This takes effect only +when there are no scroll bars; if scroll bars are supported and in use, +a scroll bar separates the two windows. +@end table + + For example, here is how to construct a display table that mimics the +effect of setting @code{ctl-arrow} to a non-@code{nil} value: + +@example +(setq disptab (make-display-table)) +(let ((i 0)) + (while (< i 32) + (or (= i ?\t) (= i ?\n) + (aset disptab i (vector ?^ (+ i 64)))) + (setq i (1+ i))) + (aset disptab 127 (vector ?^ ??))) +@end example + +@defun display-table-slot display-table slot +This function returns the value of the extra slot @var{slot} of +@var{display-table}. The argument @var{slot} may be a number from 0 to +5 inclusive, or a slot name (symbol). Valid symbols are +@code{truncation}, @code{wrap}, @code{escape}, @code{control}, +@code{selective-display}, and @code{vertical-border}. +@end defun + +@defun set-display-table-slot display-table slot value +This function stores @var{value} in the extra slot @var{slot} of +@var{display-table}. The argument @var{slot} may be a number from 0 to +5 inclusive, or a slot name (symbol). Valid symbols are +@code{truncation}, @code{wrap}, @code{escape}, @code{control}, +@code{selective-display}, and @code{vertical-border}. +@end defun + +@defun describe-display-table display-table +This function displays a description of the display table +@var{display-table} in a help buffer. +@end defun + +@deffn Command describe-current-display-table +This command displays a description of the current display table in a +help buffer. +@end deffn + +@node Active Display Table +@subsection Active Display Table +@cindex active display table + + Each window can specify a display table, and so can each buffer. When +a buffer @var{b} is displayed in window @var{w}, display uses the +display table for window @var{w} if it has one; otherwise, the display +table for buffer @var{b} if it has one; otherwise, the standard display +table if any. The display table chosen is called the @dfn{active} +display table. + +@defun window-display-table &optional window +This function returns @var{window}'s display table, or @code{nil} +if @var{window} does not have an assigned display table. The default +for @var{window} is the selected window. +@end defun + +@defun set-window-display-table window table +This function sets the display table of @var{window} to @var{table}. +The argument @var{table} should be either a display table or +@code{nil}. +@end defun + +@defvar buffer-display-table +This variable is automatically buffer-local in all buffers; its value in +a particular buffer specifies the display table for that buffer. If it +is @code{nil}, that means the buffer does not have an assigned display +table. +@end defvar + +@defvar standard-display-table +This variable's value is the default display table, used whenever a +window has no display table and neither does the buffer displayed in +that window. This variable is @code{nil} by default. +@end defvar + + If there is no display table to use for a particular window---that is, +if the window specifies none, its buffer specifies none, and +@code{standard-display-table} is @code{nil}---then Emacs uses the usual +display conventions for all character codes in that window. @xref{Usual +Display}. + +A number of functions for changing the standard display table +are defined in the library @file{disp-table}. + +@node Glyphs +@subsection Glyphs + +@cindex glyph + A @dfn{glyph} is a generalization of a character; it stands for an +image that takes up a single character position on the screen. Normally +glyphs come from vectors in the display table (@pxref{Display Tables}). + + A glyph is represented in Lisp as a @dfn{glyph code}. A glyph code +can be @dfn{simple} or it can be defined by the @dfn{glyph table}. A +simple glyph code is just a way of specifying a character and a face +to output it in. @xref{Faces}. + + The following functions are used to manipulate simple glyph codes: + +@defun make-glyph-code char &optional face +This function returns a simple glyph code representing char @var{char} +with face @var{face}. +@end defun + +@defun glyph-char glyph +This function returns the character of simple glyph code @var{glyph}. +@end defun + +@defun glyph-face glyph +This function returns face of simple glyph code @var{glyph}, or +@code{nil} if @var{glyph} has the default face (face-id 0). +@end defun + + On character terminals, you can set up a @dfn{glyph table} to define +the meaning of glyph codes (represented as small integers). + +@defvar glyph-table +The value of this variable is the current glyph table. It should be +@code{nil} or a vector whose @var{g}th element defines glyph code +@var{g}. + +If a glyph code is greater than or equal to the length of the glyph +table, that code is automatically simple. If @code{glyph-table} is +@code{nil} then all glyph codes are simple. + +The glyph table is used only on character terminals. On graphical +displays, all glyph codes are simple. +@end defvar + + Here are the meaningful types of elements in the glyph table: + +@table @asis +@item @var{string} +Send the characters in @var{string} to the terminal to output +this glyph code. + +@item @var{code} +Define this glyph code as an alias for glyph code @var{code} created +by @code{make-glyph-code}. You can use such an alias to define a +small-numbered glyph code which specifies a character with a face. + +@item @code{nil} +This glyph code is simple. +@end table + +@defun create-glyph string +This function returns a newly-allocated glyph code which is set up to +display by sending @var{string} to the terminal. +@end defun + +@node Beeping +@section Beeping +@c @cindex beeping "beep" is adjacent +@cindex bell + + This section describes how to make Emacs ring the 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 just beeping when signaling an error is more +appropriate. (@xref{Errors}.) + +@defun ding &optional do-not-terminate +@cindex keyboard macro termination +This function beeps, or flashes the screen (see @code{visible-bell} below). +It also terminates any keyboard macro currently executing unless +@var{do-not-terminate} is non-@code{nil}. +@end defun + +@defun beep &optional do-not-terminate +This is a synonym for @code{ding}. +@end defun + +@defopt visible-bell +This variable determines whether Emacs should flash the screen to +represent a bell. Non-@code{nil} means yes, @code{nil} means no. This +is effective on graphical displays, and on text-only terminals +provided the terminal's Termcap entry defines the visible bell +capability (@samp{vb}). +@end defopt + +@defvar ring-bell-function +If this is non-@code{nil}, it specifies how Emacs should ``ring the +bell.'' Its value should be a function of no arguments. If this is +non-@code{nil}, it takes precedence over the @code{visible-bell} +variable. +@end defvar + +@node Window Systems +@section Window Systems + + Emacs works with several window systems, most notably the X Window +System. Both Emacs and X use the term ``window,'' but use it +differently. An Emacs frame is a single window as far as X is +concerned; the individual Emacs windows are not known to X at all. + +@defvar window-system +This variable tells Lisp programs what window system Emacs is running +under. The possible values are + +@table @code +@item x +@cindex X Window System +Emacs is displaying using X. +@item pc +Emacs is displaying using MS-DOS. +@item w32 +Emacs is displaying using Windows. +@item mac +Emacs is displaying using a Macintosh. +@item nil +Emacs is using a character-based terminal. +@end table +@end defvar + +@defvar window-setup-hook +This variable is a normal hook which Emacs runs after handling the +initialization files. Emacs runs this hook after it has completed +loading your init file, the default initialization file (if +any), and the terminal-specific Lisp code, and running the hook +@code{term-setup-hook}. + +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. +@end defvar + +@ignore + arch-tag: ffdf5714-7ecf-415b-9023-fbc6b409c2c6 +@end ignore diff --git a/doc/lispref/doclicense.texi b/doc/lispref/doclicense.texi new file mode 100644 index 00000000000..f2f32aaa968 --- /dev/null +++ b/doc/lispref/doclicense.texi @@ -0,0 +1,419 @@ +@c -*-texinfo-*- +@node GNU Free Documentation License, GPL, Antinews, Top + +@appendix GNU Free Documentation License +@center Version 1.2, November 2002 + +@display +Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display +@sp 1 +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document ``free'' in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft,'' which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@sp 1 +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document,'' below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you.'' You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (Thus, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque.'' + + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements,'' +``Dedications,'' ``Endorsements,'' or ``History.'') To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. +@sp 1 +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. +@sp 1 +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. +@sp 1 +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission.@* +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement.@* +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher.@* +D. Preserve all the copyright notices of the Document.@* +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices.@* +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below.@* +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice.@* +H. Include an unaltered copy of this License.@* +I. Preserve the section Entitled ``History,'' Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled ``History'' in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence.@* +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the ``History'' section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission.@* +K. For any section Entitled ``Acknowledgements'' or ``Dedications,'' + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein.@* +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles.@* +M. Delete any section Entitled ``Endorsements.'' Such a section + may not be included in the Modified Version.@* +N. Do not retitle any existing section to be Entitled ``Endorsements'' + or to conflict in title with any Invariant Section.@* +O. Preserve any Warranty Disclaimers.@* +@sp 1 +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements,'' provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. +@sp 1 +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements,'' +and any sections Entitled ``Dedications.'' You must delete all sections +Entitled ``Endorsements.'' +@sp 1 +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. +@sp 1 +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. +@sp 1 +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements,'' +``Dedications,'' or ``History,'' the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. +@sp 1 +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. +@sp 1 +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + +@end enumerate + +@unnumberedsec ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group +Copyright (C) @var{year} @var{your name}. +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled ``GNU +Free Documentation License.'' +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with...Texts.'' line with this: + +@smallexample +@group +with the Invariant Sections being @var{list their titles}, with the +Front-Cover Texts being @var{list}, and with the Back-Cover Texts being +@var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@ignore + arch-tag: 9014cf6e-f3c4-401d-b8da-4fe52723984c +@end ignore diff --git a/doc/lispref/edebug.texi b/doc/lispref/edebug.texi new file mode 100644 index 00000000000..4be030896c5 --- /dev/null +++ b/doc/lispref/edebug.texi @@ -0,0 +1,1582 @@ +@comment -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1992, 1993, 1994, 1998, 1999, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. + +@c This file can also be used by an independent Edebug User +@c Manual in which case the Edebug node below should be used +@c with the following links to the Bugs section and to the top level: + +@c , Bugs and Todo List, Top, Top + +@node Edebug, Syntax Errors, Debugger, Debugging +@section Edebug +@cindex Edebug debugging facility + + Edebug is a source-level debugger for Emacs Lisp programs with which +you can: + +@itemize @bullet +@item +Step through evaluation, stopping before and after each expression. + +@item +Set conditional or unconditional breakpoints. + +@item +Stop when a specified condition is true (the global break event). + +@item +Trace slow or fast, stopping briefly at each stop point, or +at each breakpoint. + +@item +Display expression results and evaluate expressions as if outside of +Edebug. + +@item +Automatically re-evaluate a list of expressions and +display their results each time Edebug updates the display. + +@item +Output trace info on function enter and exit. + +@item +Stop when an error occurs. + +@item +Display a backtrace, omitting Edebug's own frames. + +@item +Specify argument evaluation for macros and defining forms. + +@item +Obtain rudimentary coverage testing and frequency counts. +@end itemize + +The first three sections below should tell you enough about Edebug to +enable you to use it. + +@menu +* Using Edebug:: Introduction to use of Edebug. +* Instrumenting:: You must instrument your code + in order to debug it with Edebug. +* Modes: Edebug Execution Modes. Execution modes, stopping more or less often. +* Jumping:: Commands to jump to a specified place. +* Misc: Edebug Misc. Miscellaneous commands. +* Breaks:: Setting breakpoints to make the program stop. +* Trapping Errors:: Trapping errors with Edebug. +* Views: Edebug Views. Views inside and outside of Edebug. +* Eval: Edebug Eval. Evaluating expressions within Edebug. +* Eval List:: Expressions whose values are displayed + each time you enter Edebug. +* Printing in Edebug:: Customization of printing. +* Trace Buffer:: How to produce trace output in a buffer. +* Coverage Testing:: How to test evaluation coverage. +* The Outside Context:: Data that Edebug saves and restores. +* Edebug and Macros:: Specifying how to handle macro calls. +* Options: Edebug Options. Option variables for customizing Edebug. +@end menu + +@node Using Edebug +@subsection Using Edebug + + To debug a Lisp program with Edebug, you must first @dfn{instrument} +the Lisp code that you want to debug. A simple way to do this is to +first move point into the definition of a function or macro and then do +@kbd{C-u C-M-x} (@code{eval-defun} with a prefix argument). See +@ref{Instrumenting}, for alternative ways to instrument code. + + Once a function is instrumented, any call to the function activates +Edebug. Depending on which Edebug execution mode you have selected, +activating Edebug may stop execution and let you step through the +function, or it may update the display and continue execution while +checking for debugging commands. The default execution mode is step, +which stops execution. @xref{Edebug Execution Modes}. + + Within Edebug, you normally view an Emacs buffer showing the source of +the Lisp code you are debugging. This is referred to as the @dfn{source +code buffer}, and it is temporarily read-only. + + An arrow in the left fringe indicates the line where the function is +executing. Point initially shows where within the line the function is +executing, but this ceases to be true if you move point yourself. + + If you instrument the definition of @code{fac} (shown below) and then +execute @code{(fac 3)}, here is what you would normally see. Point is +at the open-parenthesis before @code{if}. + +@example +(defun fac (n) +=>@point{}(if (< 0 n) + (* n (fac (1- n))) + 1)) +@end example + +@cindex stop points +The places within a function where Edebug can stop execution are called +@dfn{stop points}. These occur both before and after each subexpression +that is a list, and also after each variable reference. +Here we use periods to show the stop points in the function +@code{fac}: + +@example +(defun fac (n) + .(if .(< 0 n.). + .(* n. .(fac .(1- n.).).). + 1).) +@end example + +The special commands of Edebug are available in the source code buffer +in addition to the commands of Emacs Lisp mode. For example, you can +type the Edebug command @key{SPC} to execute until the next stop point. +If you type @key{SPC} once after entry to @code{fac}, here is the +display you will see: + +@example +(defun fac (n) +=>(if @point{}(< 0 n) + (* n (fac (1- n))) + 1)) +@end example + +When Edebug stops execution after an expression, it displays the +expression's value in the echo area. + +Other frequently used commands are @kbd{b} to set a breakpoint at a stop +point, @kbd{g} to execute until a breakpoint is reached, and @kbd{q} to +exit Edebug and return to the top-level command loop. Type @kbd{?} to +display a list of all Edebug commands. + +@node Instrumenting +@subsection Instrumenting for Edebug + + In order to use Edebug to debug Lisp code, you must first +@dfn{instrument} the code. Instrumenting code inserts additional code +into it, to invoke Edebug at the proper places. + +@kindex C-M-x +@findex eval-defun (Edebug) + When you invoke command @kbd{C-M-x} (@code{eval-defun}) with a +prefix argument on a function definition, it instruments the +definition before evaluating it. (This does not modify the source +code itself.) If the variable @code{edebug-all-defs} is +non-@code{nil}, that inverts the meaning of the prefix argument: in +this case, @kbd{C-M-x} instruments the definition @emph{unless} it has +a prefix argument. The default value of @code{edebug-all-defs} is +@code{nil}. The command @kbd{M-x edebug-all-defs} toggles the value +of the variable @code{edebug-all-defs}. + +@findex eval-region @r{(Edebug)} +@findex eval-buffer @r{(Edebug)} +@findex eval-current-buffer @r{(Edebug)} + If @code{edebug-all-defs} is non-@code{nil}, then the commands +@code{eval-region}, @code{eval-current-buffer}, and @code{eval-buffer} +also instrument any definitions they evaluate. Similarly, +@code{edebug-all-forms} controls whether @code{eval-region} should +instrument @emph{any} form, even non-defining forms. This doesn't apply +to loading or evaluations in the minibuffer. The command @kbd{M-x +edebug-all-forms} toggles this option. + +@findex edebug-eval-top-level-form + Another command, @kbd{M-x edebug-eval-top-level-form}, is available to +instrument any top-level form regardless of the values of +@code{edebug-all-defs} and @code{edebug-all-forms}. + + While Edebug is active, the command @kbd{I} +(@code{edebug-instrument-callee}) instruments the definition of the +function or macro called by the list form after point, if is not already +instrumented. This is possible only if Edebug knows where to find the +source for that function; for this reading, after loading Edebug, +@code{eval-region} records the position of every definition it +evaluates, even if not instrumenting it. See also the @kbd{i} command +(@pxref{Jumping}), which steps into the call after instrumenting the +function. + + Edebug knows how to instrument all the standard special forms, +@code{interactive} forms with an expression argument, anonymous lambda +expressions, and other defining forms. However, Edebug cannot determine +on its own what a user-defined macro will do with the arguments of a +macro call, so you must provide that information using Edebug +specifications; see @ref{Edebug and Macros}, for details. + + When Edebug is about to instrument code for the first time in a +session, it runs the hook @code{edebug-setup-hook}, then sets it to +@code{nil}. You can use this to load Edebug specifications +associated with a package you are using, but only when you use Edebug. + +@findex eval-expression @r{(Edebug)} + To remove instrumentation from a definition, simply re-evaluate its +definition in a way that does not instrument. There are two ways of +evaluating forms that never instrument them: from a file with +@code{load}, and from the minibuffer with @code{eval-expression} +(@kbd{M-:}). + + If Edebug detects a syntax error while instrumenting, it leaves point +at the erroneous code and signals an @code{invalid-read-syntax} error. + + @xref{Edebug Eval}, for other evaluation functions available +inside of Edebug. + +@node Edebug Execution Modes +@subsection Edebug Execution Modes + +@cindex Edebug execution modes +Edebug supports several execution modes for running the program you are +debugging. We call these alternatives @dfn{Edebug execution modes}; do +not confuse them with major or minor modes. The current Edebug execution mode +determines how far Edebug continues execution before stopping---whether +it stops at each stop point, or continues to the next breakpoint, for +example---and how much Edebug displays the progress of the evaluation +before it stops. + +Normally, you specify the Edebug execution mode by typing a command to +continue the program in a certain mode. Here is a table of these +commands; all except for @kbd{S} resume execution of the program, at +least for a certain distance. + +@table @kbd +@item S +Stop: don't execute any more of the program, but wait for more +Edebug commands (@code{edebug-stop}). + +@item @key{SPC} +Step: stop at the next stop point encountered (@code{edebug-step-mode}). + +@item n +Next: stop at the next stop point encountered after an expression +(@code{edebug-next-mode}). Also see @code{edebug-forward-sexp} in +@ref{Jumping}. + +@item t +Trace: pause (normally one second) at each Edebug stop point +(@code{edebug-trace-mode}). + +@item T +Rapid trace: update the display at each stop point, but don't actually +pause (@code{edebug-Trace-fast-mode}). + +@item g +Go: run until the next breakpoint (@code{edebug-go-mode}). @xref{Breakpoints}. + +@item c +Continue: pause one second at each breakpoint, and then continue +(@code{edebug-continue-mode}). + +@item C +Rapid continue: move point to each breakpoint, but don't pause +(@code{edebug-Continue-fast-mode}). + +@item G +Go non-stop: ignore breakpoints (@code{edebug-Go-nonstop-mode}). You +can still stop the program by typing @kbd{S}, or any editing command. +@end table + +In general, the execution modes earlier in the above list run the +program more slowly or stop sooner than the modes later in the list. + +While executing or tracing, you can interrupt the execution by typing +any Edebug command. Edebug stops the program at the next stop point and +then executes the command you typed. For example, typing @kbd{t} during +execution switches to trace mode at the next stop point. You can use +@kbd{S} to stop execution without doing anything else. + +If your function happens to read input, a character you type intending +to interrupt execution may be read by the function instead. You can +avoid such unintended results by paying attention to when your program +wants input. + +@cindex keyboard macros (Edebug) +Keyboard macros containing the commands in this section do not +completely work: exiting from Edebug, to resume the program, loses track +of the keyboard macro. This is not easy to fix. Also, defining or +executing a keyboard macro outside of Edebug does not affect commands +inside Edebug. This is usually an advantage. See also the +@code{edebug-continue-kbd-macro} option (@pxref{Edebug Options}). + +When you enter a new Edebug level, the initial execution mode comes +from the value of the variable @code{edebug-initial-mode}. +(@xref{Edebug Options}.) By default, this specifies step mode. Note +that you may reenter the same Edebug level several times if, for +example, an instrumented function is called several times from one +command. + +@defopt edebug-sit-for-seconds +This option specifies how many seconds to wait between execution steps +in trace mode. The default is 1 second. +@end defopt + +@node Jumping +@subsection Jumping + + The commands described in this section execute until they reach a +specified location. All except @kbd{i} make a temporary breakpoint to +establish the place to stop, then switch to go mode. Any other +breakpoint reached before the intended stop point will also stop +execution. @xref{Breakpoints}, for the details on breakpoints. + + These commands may fail to work as expected in case of nonlocal exit, +as that can bypass the temporary breakpoint where you expected the +program to stop. + +@table @kbd +@item h +Proceed to the stop point near where point is (@code{edebug-goto-here}). + +@item f +Run the program for one expression +(@code{edebug-forward-sexp}). + +@item o +Run the program until the end of the containing sexp. + +@item i +Step into the function or macro called by the form after point. +@end table + +The @kbd{h} command proceeds to the stop point at or after the current +location of point, using a temporary breakpoint. + +The @kbd{f} command runs the program forward over one expression. More +precisely, it sets a temporary breakpoint at the position that +@kbd{C-M-f} would reach, then executes in go mode so that the program +will stop at breakpoints. + +With a prefix argument @var{n}, the temporary breakpoint is placed +@var{n} sexps beyond point. If the containing list ends before @var{n} +more elements, then the place to stop is after the containing +expression. + +You must check that the position @kbd{C-M-f} finds is a place that the +program will really get to. In @code{cond}, for example, this may not +be true. + +For flexibility, the @kbd{f} command does @code{forward-sexp} starting +at point, rather than at the stop point. If you want to execute one +expression @emph{from the current stop point}, first type @kbd{w}, to +move point there, and then type @kbd{f}. + +The @kbd{o} command continues ``out of'' an expression. It places a +temporary breakpoint at the end of the sexp containing point. If the +containing sexp is a function definition itself, @kbd{o} continues until +just before the last sexp in the definition. If that is where you are +now, it returns from the function and then stops. In other words, this +command does not exit the currently executing function unless you are +positioned after the last sexp. + +The @kbd{i} command steps into the function or macro called by the list +form after point, and stops at its first stop point. Note that the form +need not be the one about to be evaluated. But if the form is a +function call about to be evaluated, remember to use this command before +any of the arguments are evaluated, since otherwise it will be too late. + +The @kbd{i} command instruments the function or macro it's supposed to +step into, if it isn't instrumented already. This is convenient, but keep +in mind that the function or macro remains instrumented unless you explicitly +arrange to deinstrument it. + +@node Edebug Misc +@subsection Miscellaneous Edebug Commands + + Some miscellaneous Edebug commands are described here. + +@table @kbd +@item ? +Display the help message for Edebug (@code{edebug-help}). + +@item C-] +Abort one level back to the previous command level +(@code{abort-recursive-edit}). + +@item q +Return to the top level editor command loop (@code{top-level}). This +exits all recursive editing levels, including all levels of Edebug +activity. However, instrumented code protected with +@code{unwind-protect} or @code{condition-case} forms may resume +debugging. + +@item Q +Like @kbd{q}, but don't stop even for protected code +(@code{top-level-nonstop}). + +@item r +Redisplay the most recently known expression result in the echo area +(@code{edebug-previous-result}). + +@item d +Display a backtrace, excluding Edebug's own functions for clarity +(@code{edebug-backtrace}). + +You cannot use debugger commands in the backtrace buffer in Edebug as +you would in the standard debugger. + +The backtrace buffer is killed automatically when you continue +execution. +@end table + +You can invoke commands from Edebug that activate Edebug again +recursively. Whenever Edebug is active, you can quit to the top level +with @kbd{q} or abort one recursive edit level with @kbd{C-]}. You can +display a backtrace of all the pending evaluations with @kbd{d}. + +@node Breaks +@subsection Breaks + +Edebug's step mode stops execution when the next stop point is reached. +There are three other ways to stop Edebug execution once it has started: +breakpoints, the global break condition, and source breakpoints. + +@menu +* Breakpoints:: Breakpoints at stop points. +* Global Break Condition:: Breaking on an event. +* Source Breakpoints:: Embedding breakpoints in source code. +@end menu + +@node Breakpoints +@subsubsection Edebug Breakpoints + +@cindex breakpoints (Edebug) +While using Edebug, you can specify @dfn{breakpoints} in the program you +are testing: these are places where execution should stop. You can set a +breakpoint at any stop point, as defined in @ref{Using Edebug}. For +setting and unsetting breakpoints, the stop point that is affected is +the first one at or after point in the source code buffer. Here are the +Edebug commands for breakpoints: + +@table @kbd +@item b +Set a breakpoint at the stop point at or after point +(@code{edebug-set-breakpoint}). If you use a prefix argument, the +breakpoint is temporary---it turns off the first time it stops the +program. + +@item u +Unset the breakpoint (if any) at the stop point at or after +point (@code{edebug-unset-breakpoint}). + +@item x @var{condition} @key{RET} +Set a conditional breakpoint which stops the program only if +evaluating @var{condition} produces a non-@code{nil} value +(@code{edebug-set-conditional-breakpoint}). With a prefix argument, +the breakpoint is temporary. + +@item B +Move point to the next breakpoint in the current definition +(@code{edebug-next-breakpoint}). +@end table + +While in Edebug, you can set a breakpoint with @kbd{b} and unset one +with @kbd{u}. First move point to the Edebug stop point of your choice, +then type @kbd{b} or @kbd{u} to set or unset a breakpoint there. +Unsetting a breakpoint where none has been set has no effect. + +Re-evaluating or reinstrumenting a definition removes all of its +previous breakpoints. + +A @dfn{conditional breakpoint} tests a condition each time the program +gets there. Any errors that occur as a result of evaluating the +condition are ignored, as if the result were @code{nil}. To set a +conditional breakpoint, use @kbd{x}, and specify the condition +expression in the minibuffer. Setting a conditional breakpoint at a +stop point that has a previously established conditional breakpoint puts +the previous condition expression in the minibuffer so you can edit it. + +You can make a conditional or unconditional breakpoint +@dfn{temporary} by using a prefix argument with the command to set the +breakpoint. When a temporary breakpoint stops the program, it is +automatically unset. + +Edebug always stops or pauses at a breakpoint, except when the Edebug +mode is Go-nonstop. In that mode, it ignores breakpoints entirely. + +To find out where your breakpoints are, use the @kbd{B} command, which +moves point to the next breakpoint following point, within the same +function, or to the first breakpoint if there are no following +breakpoints. This command does not continue execution---it just moves +point in the buffer. + +@node Global Break Condition +@subsubsection Global Break Condition + +@cindex stopping on events +@cindex global break condition + A @dfn{global break condition} stops execution when a specified +condition is satisfied, no matter where that may occur. Edebug +evaluates the global break condition at every stop point; if it +evaluates to a non-@code{nil} value, then execution stops or pauses +depending on the execution mode, as if a breakpoint had been hit. If +evaluating the condition gets an error, execution does not stop. + +@findex edebug-set-global-break-condition + The condition expression is stored in +@code{edebug-global-break-condition}. You can specify a new expression +using the @kbd{X} command from the source code buffer while Edebug is +active, or using @kbd{C-x X X} from any buffer at any time, as long as +Edebug is loaded (@code{edebug-set-global-break-condition}). + + The global break condition is the simplest way to find where in your +code some event occurs, but it makes code run much more slowly. So you +should reset the condition to @code{nil} when not using it. + +@node Source Breakpoints +@subsubsection Source Breakpoints + +@findex edebug +@cindex source breakpoints + All breakpoints in a definition are forgotten each time you +reinstrument it. If you wish to make a breakpoint that won't be +forgotten, you can write a @dfn{source breakpoint}, which is simply a +call to the function @code{edebug} in your source code. You can, of +course, make such a call conditional. For example, in the @code{fac} +function, you can insert the first line as shown below, to stop when the +argument reaches zero: + +@example +(defun fac (n) + (if (= n 0) (edebug)) + (if (< 0 n) + (* n (fac (1- n))) + 1)) +@end example + + When the @code{fac} definition is instrumented and the function is +called, the call to @code{edebug} acts as a breakpoint. Depending on +the execution mode, Edebug stops or pauses there. + + If no instrumented code is being executed when @code{edebug} is called, +that function calls @code{debug}. +@c This may not be a good idea anymore. + +@node Trapping Errors +@subsection Trapping Errors + + Emacs normally displays an error message when an error is signaled and +not handled with @code{condition-case}. While Edebug is active and +executing instrumented code, it normally responds to all unhandled +errors. You can customize this with the options @code{edebug-on-error} +and @code{edebug-on-quit}; see @ref{Edebug Options}. + + When Edebug responds to an error, it shows the last stop point +encountered before the error. This may be the location of a call to a +function which was not instrumented, and within which the error actually +occurred. For an unbound variable error, the last known stop point +might be quite distant from the offending variable reference. In that +case, you might want to display a full backtrace (@pxref{Edebug Misc}). + +@c Edebug should be changed for the following: -- dan + If you change @code{debug-on-error} or @code{debug-on-quit} while +Edebug is active, these changes will be forgotten when Edebug becomes +inactive. Furthermore, during Edebug's recursive edit, these variables +are bound to the values they had outside of Edebug. + +@node Edebug Views +@subsection Edebug Views + + These Edebug commands let you view aspects of the buffer and window +status as they were before entry to Edebug. The outside window +configuration is the collection of windows and contents that were in +effect outside of Edebug. + +@table @kbd +@item v +Switch to viewing the outside window configuration +(@code{edebug-view-outside}). Type @kbd{C-x X w} to return to Edebug. + +@item p +Temporarily display the outside current buffer with point at its +outside position (@code{edebug-bounce-point}), pausing for one second +before returning to Edebug. With a prefix argument @var{n}, pause for +@var{n} seconds instead. + +@item w +Move point back to the current stop point in the source code buffer +(@code{edebug-where}). + +If you use this command in a different window displaying the same +buffer, that window will be used instead to display the current +definition in the future. + +@item W +@c Its function is not simply to forget the saved configuration -- dan +Toggle whether Edebug saves and restores the outside window +configuration (@code{edebug-toggle-save-windows}). + +With a prefix argument, @code{W} only toggles saving and restoring of +the selected window. To specify a window that is not displaying the +source code buffer, you must use @kbd{C-x X W} from the global keymap. +@end table + + You can view the outside window configuration with @kbd{v} or just +bounce to the point in the current buffer with @kbd{p}, even if +it is not normally displayed. + + After moving point, you may wish to jump back to the stop point. +You can do that with @kbd{w} from a source code buffer. You can jump +back to the stop point in the source code buffer from any buffer using +@kbd{C-x X w}. + + Each time you use @kbd{W} to turn saving @emph{off}, Edebug forgets the +saved outside window configuration---so that even if you turn saving +back @emph{on}, the current window configuration remains unchanged when +you next exit Edebug (by continuing the program). However, the +automatic redisplay of @samp{*edebug*} and @samp{*edebug-trace*} may +conflict with the buffers you wish to see unless you have enough windows +open. + +@node Edebug Eval +@subsection Evaluation + + While within Edebug, you can evaluate expressions ``as if'' Edebug +were not running. Edebug tries to be invisible to the expression's +evaluation and printing. Evaluation of expressions that cause side +effects will work as expected, except for changes to data that Edebug +explicitly saves and restores. @xref{The Outside Context}, for details +on this process. + +@table @kbd +@item e @var{exp} @key{RET} +Evaluate expression @var{exp} in the context outside of Edebug +(@code{edebug-eval-expression}). That is, Edebug tries to minimize its +interference with the evaluation. + +@item M-: @var{exp} @key{RET} +Evaluate expression @var{exp} in the context of Edebug itself. + +@item C-x C-e +Evaluate the expression before point, in the context outside of Edebug +(@code{edebug-eval-last-sexp}). +@end table + +@cindex lexical binding (Edebug) + Edebug supports evaluation of expressions containing references to +lexically bound symbols created by the following constructs in +@file{cl.el} (version 2.03 or later): @code{lexical-let}, +@code{macrolet}, and @code{symbol-macrolet}. + +@node Eval List +@subsection Evaluation List Buffer + + You can use the @dfn{evaluation list buffer}, called @samp{*edebug*}, to +evaluate expressions interactively. You can also set up the +@dfn{evaluation list} of expressions to be evaluated automatically each +time Edebug updates the display. + +@table @kbd +@item E +Switch to the evaluation list buffer @samp{*edebug*} +(@code{edebug-visit-eval-list}). +@end table + + In the @samp{*edebug*} buffer you can use the commands of Lisp +Interaction mode (@pxref{Lisp Interaction,,, emacs, The GNU Emacs +Manual}) as well as these special commands: + +@table @kbd +@item C-j +Evaluate the expression before point, in the outside context, and insert +the value in the buffer (@code{edebug-eval-print-last-sexp}). + +@item C-x C-e +Evaluate the expression before point, in the context outside of Edebug +(@code{edebug-eval-last-sexp}). + +@item C-c C-u +Build a new evaluation list from the contents of the buffer +(@code{edebug-update-eval-list}). + +@item C-c C-d +Delete the evaluation list group that point is in +(@code{edebug-delete-eval-item}). + +@item C-c C-w +Switch back to the source code buffer at the current stop point +(@code{edebug-where}). +@end table + + You can evaluate expressions in the evaluation list window with +@kbd{C-j} or @kbd{C-x C-e}, just as you would in @samp{*scratch*}; +but they are evaluated in the context outside of Edebug. + + The expressions you enter interactively (and their results) are lost +when you continue execution; but you can set up an @dfn{evaluation list} +consisting of expressions to be evaluated each time execution stops. + +@cindex evaluation list group + To do this, write one or more @dfn{evaluation list groups} in the +evaluation list buffer. An evaluation list group consists of one or +more Lisp expressions. Groups are separated by comment lines. + + The command @kbd{C-c C-u} (@code{edebug-update-eval-list}) rebuilds the +evaluation list, scanning the buffer and using the first expression of +each group. (The idea is that the second expression of the group is the +value previously computed and displayed.) + + Each entry to Edebug redisplays the evaluation list by inserting each +expression in the buffer, followed by its current value. It also +inserts comment lines so that each expression becomes its own group. +Thus, if you type @kbd{C-c C-u} again without changing the buffer text, +the evaluation list is effectively unchanged. + + If an error occurs during an evaluation from the evaluation list, the +error message is displayed in a string as if it were the result. +Therefore, expressions that use variables not currently valid do not +interrupt your debugging. + + Here is an example of what the evaluation list window looks like after +several expressions have been added to it: + +@smallexample +(current-buffer) +#<buffer *scratch*> +;--------------------------------------------------------------- +(selected-window) +#<window 16 on *scratch*> +;--------------------------------------------------------------- +(point) +196 +;--------------------------------------------------------------- +bad-var +"Symbol's value as variable is void: bad-var" +;--------------------------------------------------------------- +(recursion-depth) +0 +;--------------------------------------------------------------- +this-command +eval-last-sexp +;--------------------------------------------------------------- +@end smallexample + +To delete a group, move point into it and type @kbd{C-c C-d}, or simply +delete the text for the group and update the evaluation list with +@kbd{C-c C-u}. To add a new expression to the evaluation list, insert +the expression at a suitable place, insert a new comment line, then type +@kbd{C-c C-u}. You need not insert dashes in the comment line---its +contents don't matter. + +After selecting @samp{*edebug*}, you can return to the source code +buffer with @kbd{C-c C-w}. The @samp{*edebug*} buffer is killed when +you continue execution, and recreated next time it is needed. + +@node Printing in Edebug +@subsection Printing in Edebug + +@cindex printing (Edebug) +@cindex printing circular structures +@pindex cust-print + If an expression in your program produces a value containing circular +list structure, you may get an error when Edebug attempts to print it. + + One way to cope with circular structure is to set @code{print-length} +or @code{print-level} to truncate the printing. Edebug does this for +you; it binds @code{print-length} and @code{print-level} to 50 if they +were @code{nil}. (Actually, the variables @code{edebug-print-length} +and @code{edebug-print-level} specify the values to use within Edebug.) +@xref{Output Variables}. + +@defopt edebug-print-length +If non-@code{nil}, Edebug binds @code{print-length} to this value while +printing results. The default value is @code{50}. +@end defopt + +@defopt edebug-print-level +If non-@code{nil}, Edebug binds @code{print-level} to this value while +printing results. The default value is @code{50}. +@end defopt + + You can also print circular structures and structures that share +elements more informatively by binding @code{print-circle} +to a non-@code{nil} value. + + Here is an example of code that creates a circular structure: + +@example +(setq a '(x y)) +(setcar a a) +@end example + +@noindent +Custom printing prints this as @samp{Result: #1=(#1# y)}. The +@samp{#1=} notation labels the structure that follows it with the label +@samp{1}, and the @samp{#1#} notation references the previously labeled +structure. This notation is used for any shared elements of lists or +vectors. + +@defopt edebug-print-circle +If non-@code{nil}, Edebug binds @code{print-circle} to this value while +printing results. The default value is @code{t}. +@end defopt + + Other programs can also use custom printing; see @file{cust-print.el} +for details. + +@node Trace Buffer +@subsection Trace Buffer +@cindex trace buffer + + Edebug can record an execution trace, storing it in a buffer named +@samp{*edebug-trace*}. This is a log of function calls and returns, +showing the function names and their arguments and values. To enable +trace recording, set @code{edebug-trace} to a non-@code{nil} value. + + Making a trace buffer is not the same thing as using trace execution +mode (@pxref{Edebug Execution Modes}). + + When trace recording is enabled, each function entry and exit adds +lines to the trace buffer. A function entry record consists of +@samp{::::@{}, followed by the function name and argument values. A +function exit record consists of @samp{::::@}}, followed by the function +name and result of the function. + + The number of @samp{:}s in an entry shows its recursion depth. You +can use the braces in the trace buffer to find the matching beginning or +end of function calls. + +@findex edebug-print-trace-before +@findex edebug-print-trace-after + You can customize trace recording for function entry and exit by +redefining the functions @code{edebug-print-trace-before} and +@code{edebug-print-trace-after}. + +@defmac edebug-tracing string body@dots{} +This macro requests additional trace information around the execution +of the @var{body} forms. The argument @var{string} specifies text +to put in the trace buffer, after the @samp{@{} or @samp{@}}. All +the arguments are evaluated, and @code{edebug-tracing} returns the +value of the last form in @var{body}. +@end defmac + +@defun edebug-trace format-string &rest format-args +This function inserts text in the trace buffer. It computes the text +with @code{(apply 'format @var{format-string} @var{format-args})}. +It also appends a newline to separate entries. +@end defun + + @code{edebug-tracing} and @code{edebug-trace} insert lines in the +trace buffer whenever they are called, even if Edebug is not active. +Adding text to the trace buffer also scrolls its window to show the last +lines inserted. + +@node Coverage Testing +@subsection Coverage Testing + +@cindex coverage testing (Edebug) +@cindex frequency counts +@cindex performance analysis + Edebug provides rudimentary coverage testing and display of execution +frequency. + + Coverage testing works by comparing the result of each expression with +the previous result; each form in the program is considered ``covered'' +if it has returned two different values since you began testing coverage +in the current Emacs session. Thus, to do coverage testing on your +program, execute it under various conditions and note whether it behaves +correctly; Edebug will tell you when you have tried enough different +conditions that each form has returned two different values. + + Coverage testing makes execution slower, so it is only done if +@code{edebug-test-coverage} is non-@code{nil}. Frequency counting is +performed for all execution of an instrumented function, even if the +execution mode is Go-nonstop, and regardless of whether coverage testing +is enabled. + +@kindex C-x X = +@findex edebug-temp-display-freq-count + Use @kbd{C-x X =} (@code{edebug-display-freq-count}) to display both +the coverage information and the frequency counts for a definition. +Just @kbd{=} (@code{edebug-temp-display-freq-count}) displays the same +information temporarily, only until you type another key. + +@deffn Command edebug-display-freq-count +This command displays the frequency count data for each line of the +current definition. + +The frequency counts appear as comment lines after each line of code, +and you can undo all insertions with one @code{undo} command. The +counts appear under the @samp{(} before an expression or the @samp{)} +after an expression, or on the last character of a variable. To +simplify the display, a count is not shown if it is equal to the +count of an earlier expression on the same line. + +The character @samp{=} following the count for an expression says that +the expression has returned the same value each time it was evaluated. +In other words, it is not yet ``covered'' for coverage testing purposes. + +To clear the frequency count and coverage data for a definition, +simply reinstrument it with @code{eval-defun}. +@end deffn + +For example, after evaluating @code{(fac 5)} with a source +breakpoint, and setting @code{edebug-test-coverage} to @code{t}, when +the breakpoint is reached, the frequency data looks like this: + +@example +(defun fac (n) + (if (= n 0) (edebug)) +;#6 1 = =5 + (if (< 0 n) +;#5 = + (* n (fac (1- n))) +;# 5 0 + 1)) +;# 0 +@end example + +The comment lines show that @code{fac} was called 6 times. The +first @code{if} statement returned 5 times with the same result each +time; the same is true of the condition on the second @code{if}. +The recursive call of @code{fac} did not return at all. + + +@node The Outside Context +@subsection The Outside Context + +Edebug tries to be transparent to the program you are debugging, but it +does not succeed completely. Edebug also tries to be transparent when +you evaluate expressions with @kbd{e} or with the evaluation list +buffer, by temporarily restoring the outside context. This section +explains precisely what context Edebug restores, and how Edebug fails to +be completely transparent. + +@menu +* Checking Whether to Stop:: When Edebug decides what to do. +* Edebug Display Update:: When Edebug updates the display. +* Edebug Recursive Edit:: When Edebug stops execution. +@end menu + +@node Checking Whether to Stop +@subsubsection Checking Whether to Stop + +Whenever Edebug is entered, it needs to save and restore certain data +before even deciding whether to make trace information or stop the +program. + +@itemize @bullet +@item +@code{max-lisp-eval-depth} and @code{max-specpdl-size} are both +incremented once to reduce Edebug's impact on the stack. You could, +however, still run out of stack space when using Edebug. + +@item +The state of keyboard macro execution is saved and restored. While +Edebug is active, @code{executing-kbd-macro} is bound to @code{nil} +unless @code{edebug-continue-kbd-macro} is non-@code{nil}. +@end itemize + + +@node Edebug Display Update +@subsubsection Edebug Display Update + +@c This paragraph is not filled, because LaLiberte's conversion script +@c needs an xref to be on just one line. +When Edebug needs to display something (e.g., in trace mode), it saves +the current window configuration from ``outside'' Edebug +(@pxref{Window Configurations}). When you exit Edebug (by continuing +the program), it restores the previous window configuration. + +Emacs redisplays only when it pauses. Usually, when you continue +execution, the program re-enters Edebug at a breakpoint or after +stepping, without pausing or reading input in between. In such cases, +Emacs never gets a chance to redisplay the ``outside'' configuration. +Consequently, what you see is the same window configuration as the last +time Edebug was active, with no interruption. + +Entry to Edebug for displaying something also saves and restores the +following data (though some of them are deliberately not restored if an +error or quit signal occurs). + +@itemize @bullet +@item +@cindex current buffer point and mark (Edebug) +Which buffer is current, and the positions of point and the mark in the +current buffer, are saved and restored. + +@item +@cindex window configuration (Edebug) +The outside window configuration is saved and restored if +@code{edebug-save-windows} is non-@code{nil} (@pxref{Edebug Options}). + +The window configuration is not restored on error or quit, but the +outside selected window @emph{is} reselected even on error or quit in +case a @code{save-excursion} is active. If the value of +@code{edebug-save-windows} is a list, only the listed windows are saved +and restored. + +The window start and horizontal scrolling of the source code buffer are +not restored, however, so that the display remains coherent within Edebug. + +@item +The value of point in each displayed buffer is saved and restored if +@code{edebug-save-displayed-buffer-points} is non-@code{nil}. + +@item +The variables @code{overlay-arrow-position} and +@code{overlay-arrow-string} are saved and restored. So you can safely +invoke Edebug from the recursive edit elsewhere in the same buffer. + +@item +@code{cursor-in-echo-area} is locally bound to @code{nil} so that +the cursor shows up in the window. +@end itemize + +@node Edebug Recursive Edit +@subsubsection Edebug Recursive Edit + +When Edebug is entered and actually reads commands from the user, it +saves (and later restores) these additional data: + +@itemize @bullet +@item +The current match data. @xref{Match Data}. + +@item +The variables @code{last-command}, @code{this-command}, +@code{last-command-char}, @code{last-input-char}, +@code{last-input-event}, @code{last-command-event}, +@code{last-event-frame}, @code{last-nonmenu-event}, and +@code{track-mouse}. Commands used within Edebug do not affect these +variables outside of Edebug. + +Executing commands within Edebug can change the key sequence that +would be returned by @code{this-command-keys}, and there is no way to +reset the key sequence from Lisp. + +Edebug cannot save and restore the value of +@code{unread-command-events}. Entering Edebug while this variable has a +nontrivial value can interfere with execution of the program you are +debugging. + +@item +Complex commands executed while in Edebug are added to the variable +@code{command-history}. In rare cases this can alter execution. + +@item +Within Edebug, the recursion depth appears one deeper than the recursion +depth outside Edebug. This is not true of the automatically updated +evaluation list window. + +@item +@code{standard-output} and @code{standard-input} are bound to @code{nil} +by the @code{recursive-edit}, but Edebug temporarily restores them during +evaluations. + +@item +The state of keyboard macro definition is saved and restored. While +Edebug is active, @code{defining-kbd-macro} is bound to +@code{edebug-continue-kbd-macro}. +@end itemize + +@node Edebug and Macros +@subsection Edebug and Macros + +To make Edebug properly instrument expressions that call macros, some +extra care is needed. This subsection explains the details. + +@menu +* Instrumenting Macro Calls:: The basic problem. +* Specification List:: How to specify complex patterns of evaluation. +* Backtracking:: What Edebug does when matching fails. +* Specification Examples:: To help understand specifications. +@end menu + +@node Instrumenting Macro Calls +@subsubsection Instrumenting Macro Calls + + When Edebug instruments an expression that calls a Lisp macro, it needs +additional information about the macro to do the job properly. This is +because there is no a-priori way to tell which subexpressions of the +macro call are forms to be evaluated. (Evaluation may occur explicitly +in the macro body, or when the resulting expansion is evaluated, or any +time later.) + + Therefore, you must define an Edebug specification for each macro +that Edebug will encounter, to explain the format of calls to that +macro. To do this, add a @code{debug} declaration to the macro +definition. Here is a simple example that shows the specification for +the @code{for} example macro (@pxref{Argument Evaluation}). + +@smallexample +(defmacro for (var from init to final do &rest body) + "Execute a simple \"for\" loop. +For example, (for i from 1 to 10 do (print i))." + (declare (debug (symbolp "from" form "to" form "do" &rest form))) + ...) +@end smallexample + + The Edebug specification says which parts of a call to the macro are +forms to be evaluated. For simple macros, the @var{specification} +often looks very similar to the formal argument list of the macro +definition, but specifications are much more general than macro +arguments. @xref{Defining Macros}, for more explanation of +the @code{declare} form. + + You can also define an edebug specification for a macro separately +from the macro definition with @code{def-edebug-spec}. Adding +@code{debug} declarations is preferred, and more convenient, for macro +definitions in Lisp, but @code{def-edebug-spec} makes it possible to +define Edebug specifications for special forms implemented in C. + +@deffn Macro def-edebug-spec macro specification +Specify which expressions of a call to macro @var{macro} are forms to be +evaluated. @var{specification} should be the edebug specification. +Neither argument is evaluated. + +The @var{macro} argument can actually be any symbol, not just a macro +name. +@end deffn + +Here is a table of the possibilities for @var{specification} and how each +directs processing of arguments. + +@table @asis +@item @code{t} +All arguments are instrumented for evaluation. + +@item @code{0} +None of the arguments is instrumented. + +@item a symbol +The symbol must have an Edebug specification which is used instead. +This indirection is repeated until another kind of specification is +found. This allows you to inherit the specification from another macro. + +@item a list +The elements of the list describe the types of the arguments of a +calling form. The possible elements of a specification list are +described in the following sections. +@end table + +@vindex edebug-eval-macro-args +If a macro has no Edebug specification, neither through a @code{debug} +declaration nor through a @code{def-edebug-spec} call, the variable +@code{edebug-eval-macro-args} comes into play. If it is @code{nil}, +the default, none of the arguments is instrumented for evaluation. +If it is non-@code{nil}, all arguments are instrumented. + +@node Specification List +@subsubsection Specification List + +@cindex Edebug specification list +A @dfn{specification list} is required for an Edebug specification if +some arguments of a macro call are evaluated while others are not. Some +elements in a specification list match one or more arguments, but others +modify the processing of all following elements. The latter, called +@dfn{specification keywords}, are symbols beginning with @samp{&} (such +as @code{&optional}). + +A specification list may contain sublists which match arguments that are +themselves lists, or it may contain vectors used for grouping. Sublists +and groups thus subdivide the specification list into a hierarchy of +levels. Specification keywords apply only to the remainder of the +sublist or group they are contained in. + +When a specification list involves alternatives or repetition, matching +it against an actual macro call may require backtracking. +@xref{Backtracking}, for more details. + +Edebug specifications provide the power of regular expression matching, +plus some context-free grammar constructs: the matching of sublists with +balanced parentheses, recursive processing of forms, and recursion via +indirect specifications. + +Here's a table of the possible elements of a specification list, with +their meanings (see @ref{Specification Examples}, for the referenced +examples): + +@table @code +@item sexp +A single unevaluated Lisp object, which is not instrumented. +@c an "expression" is not necessarily intended for evaluation. + +@item form +A single evaluated expression, which is instrumented. + +@item place +@findex edebug-unwrap +A place to store a value, as in the Common Lisp @code{setf} construct. + +@item body +Short for @code{&rest form}. See @code{&rest} below. + +@item function-form +A function form: either a quoted function symbol, a quoted lambda +expression, or a form (that should evaluate to a function symbol or +lambda expression). This is useful when an argument that's a lambda +expression might be quoted with @code{quote} rather than +@code{function}, since it instruments the body of the lambda expression +either way. + +@item lambda-expr +A lambda expression with no quoting. + +@item &optional +@c @kindex &optional @r{(Edebug)} +All following elements in the specification list are optional; as soon +as one does not match, Edebug stops matching at this level. + +To make just a few elements optional followed by non-optional elements, +use @code{[&optional @var{specs}@dots{}]}. To specify that several +elements must all match or none, use @code{&optional +[@var{specs}@dots{}]}. See the @code{defun} example. + +@item &rest +@c @kindex &rest @r{(Edebug)} +All following elements in the specification list are repeated zero or +more times. In the last repetition, however, it is not a problem if the +expression runs out before matching all of the elements of the +specification list. + +To repeat only a few elements, use @code{[&rest @var{specs}@dots{}]}. +To specify several elements that must all match on every repetition, use +@code{&rest [@var{specs}@dots{}]}. + +@item &or +@c @kindex &or @r{(Edebug)} +Each of the following elements in the specification list is an +alternative. One of the alternatives must match, or the @code{&or} +specification fails. + +Each list element following @code{&or} is a single alternative. To +group two or more list elements as a single alternative, enclose them in +@code{[@dots{}]}. + +@item ¬ +@c @kindex ¬ @r{(Edebug)} +Each of the following elements is matched as alternatives as if by using +@code{&or}, but if any of them match, the specification fails. If none +of them match, nothing is matched, but the @code{¬} specification +succeeds. + +@item &define +@c @kindex &define @r{(Edebug)} +Indicates that the specification is for a defining form. The defining +form itself is not instrumented (that is, Edebug does not stop before and +after the defining form), but forms inside it typically will be +instrumented. The @code{&define} keyword should be the first element in +a list specification. + +@item nil +This is successful when there are no more arguments to match at the +current argument list level; otherwise it fails. See sublist +specifications and the backquote example. + +@item gate +@cindex preventing backtracking +No argument is matched but backtracking through the gate is disabled +while matching the remainder of the specifications at this level. This +is primarily used to generate more specific syntax error messages. See +@ref{Backtracking}, for more details. Also see the @code{let} example. + +@item @var{other-symbol} +@cindex indirect specifications +Any other symbol in a specification list may be a predicate or an +indirect specification. + +If the symbol has an Edebug specification, this @dfn{indirect +specification} should be either a list specification that is used in +place of the symbol, or a function that is called to process the +arguments. The specification may be defined with @code{def-edebug-spec} +just as for macros. See the @code{defun} example. + +Otherwise, the symbol should be a predicate. The predicate is called +with the argument and the specification fails if the predicate returns +@code{nil}. In either case, that argument is not instrumented. + +Some suitable predicates include @code{symbolp}, @code{integerp}, +@code{stringp}, @code{vectorp}, and @code{atom}. + +@item [@var{elements}@dots{}] +@cindex [@dots{}] (Edebug) +A vector of elements groups the elements into a single @dfn{group +specification}. Its meaning has nothing to do with vectors. + +@item "@var{string}" +The argument should be a symbol named @var{string}. This specification +is equivalent to the quoted symbol, @code{'@var{symbol}}, where the name +of @var{symbol} is the @var{string}, but the string form is preferred. + +@item (vector @var{elements}@dots{}) +The argument should be a vector whose elements must match the +@var{elements} in the specification. See the backquote example. + +@item (@var{elements}@dots{}) +Any other list is a @dfn{sublist specification} and the argument must be +a list whose elements match the specification @var{elements}. + +@cindex dotted lists (Edebug) +A sublist specification may be a dotted list and the corresponding list +argument may then be a dotted list. Alternatively, the last @sc{cdr} of a +dotted list specification may be another sublist specification (via a +grouping or an indirect specification, e.g., @code{(spec . [(more +specs@dots{})])}) whose elements match the non-dotted list arguments. +This is useful in recursive specifications such as in the backquote +example. Also see the description of a @code{nil} specification +above for terminating such recursion. + +Note that a sublist specification written as @code{(specs . nil)} +is equivalent to @code{(specs)}, and @code{(specs . +(sublist-elements@dots{}))} is equivalent to @code{(specs +sublist-elements@dots{})}. +@end table + +@c Need to document extensions with &symbol and :symbol + +Here is a list of additional specifications that may appear only after +@code{&define}. See the @code{defun} example. + +@table @code +@item name +The argument, a symbol, is the name of the defining form. + +A defining form is not required to have a name field; and it may have +multiple name fields. + +@item :name +This construct does not actually match an argument. The element +following @code{:name} should be a symbol; it is used as an additional +name component for the definition. You can use this to add a unique, +static component to the name of the definition. It may be used more +than once. + +@item arg +The argument, a symbol, is the name of an argument of the defining form. +However, lambda-list keywords (symbols starting with @samp{&}) +are not allowed. + +@item lambda-list +@cindex lambda-list (Edebug) +This matches a lambda list---the argument list of a lambda expression. + +@item def-body +The argument is the body of code in a definition. This is like +@code{body}, described above, but a definition body must be instrumented +with a different Edebug call that looks up information associated with +the definition. Use @code{def-body} for the highest level list of forms +within the definition. + +@item def-form +The argument is a single, highest-level form in a definition. This is +like @code{def-body}, except use this to match a single form rather than +a list of forms. As a special case, @code{def-form} also means that +tracing information is not output when the form is executed. See the +@code{interactive} example. +@end table + +@node Backtracking +@subsubsection Backtracking in Specifications + +@cindex backtracking +@cindex syntax error (Edebug) +If a specification fails to match at some point, this does not +necessarily mean a syntax error will be signaled; instead, +@dfn{backtracking} will take place until all alternatives have been +exhausted. Eventually every element of the argument list must be +matched by some element in the specification, and every required element +in the specification must match some argument. + +When a syntax error is detected, it might not be reported until much +later after higher-level alternatives have been exhausted, and with the +point positioned further from the real error. But if backtracking is +disabled when an error occurs, it can be reported immediately. Note +that backtracking is also reenabled automatically in several situations; +it is reenabled when a new alternative is established by +@code{&optional}, @code{&rest}, or @code{&or}, or at the start of +processing a sublist, group, or indirect specification. The effect of +enabling or disabling backtracking is limited to the remainder of the +level currently being processed and lower levels. + +Backtracking is disabled while matching any of the +form specifications (that is, @code{form}, @code{body}, @code{def-form}, and +@code{def-body}). These specifications will match any form so any error +must be in the form itself rather than at a higher level. + +Backtracking is also disabled after successfully matching a quoted +symbol or string specification, since this usually indicates a +recognized construct. But if you have a set of alternative constructs that +all begin with the same symbol, you can usually work around this +constraint by factoring the symbol out of the alternatives, e.g., +@code{["foo" &or [first case] [second case] ...]}. + +Most needs are satisfied by these two ways that backtracking is +automatically disabled, but occasionally it is useful to explicitly +disable backtracking by using the @code{gate} specification. This is +useful when you know that no higher alternatives could apply. See the +example of the @code{let} specification. + +@node Specification Examples +@subsubsection Specification Examples + +It may be easier to understand Edebug specifications by studying +the examples provided here. + +A @code{let} special form has a sequence of bindings and a body. Each +of the bindings is either a symbol or a sublist with a symbol and +optional expression. In the specification below, notice the @code{gate} +inside of the sublist to prevent backtracking once a sublist is found. + +@example +(def-edebug-spec let + ((&rest + &or symbolp (gate symbolp &optional form)) + body)) +@end example + +Edebug uses the following specifications for @code{defun} and +@code{defmacro} and the associated argument list and @code{interactive} +specifications. It is necessary to handle interactive forms specially +since an expression argument is actually evaluated outside of the +function body. + +@smallexample +(def-edebug-spec defmacro defun) ; @r{Indirect ref to @code{defun} spec.} +(def-edebug-spec defun + (&define name lambda-list + [&optional stringp] ; @r{Match the doc string, if present.} + [&optional ("interactive" interactive)] + def-body)) + +(def-edebug-spec lambda-list + (([&rest arg] + [&optional ["&optional" arg &rest arg]] + &optional ["&rest" arg] + ))) + +(def-edebug-spec interactive + (&optional &or stringp def-form)) ; @r{Notice: @code{def-form}} +@end smallexample + +The specification for backquote below illustrates how to match +dotted lists and use @code{nil} to terminate recursion. It also +illustrates how components of a vector may be matched. (The actual +specification defined by Edebug does not support dotted lists because +doing so causes very deep recursion that could fail.) + +@smallexample +(def-edebug-spec ` (backquote-form)) ; @r{Alias just for clarity.} + +(def-edebug-spec backquote-form + (&or ([&or "," ",@@"] &or ("quote" backquote-form) form) + (backquote-form . [&or nil backquote-form]) + (vector &rest backquote-form) + sexp)) +@end smallexample + + +@node Edebug Options +@subsection Edebug Options + + These options affect the behavior of Edebug: + +@defopt edebug-setup-hook +Functions to call before Edebug is used. Each time it is set to a new +value, Edebug will call those functions once and then +@code{edebug-setup-hook} is reset to @code{nil}. You could use this to +load up Edebug specifications associated with a package you are using +but only when you also use Edebug. +@xref{Instrumenting}. +@end defopt + +@defopt edebug-all-defs +If this is non-@code{nil}, normal evaluation of defining forms such as +@code{defun} and @code{defmacro} instruments them for Edebug. This +applies to @code{eval-defun}, @code{eval-region}, @code{eval-buffer}, +and @code{eval-current-buffer}. + +Use the command @kbd{M-x edebug-all-defs} to toggle the value of this +option. @xref{Instrumenting}. +@end defopt + +@defopt edebug-all-forms +If this is non-@code{nil}, the commands @code{eval-defun}, +@code{eval-region}, @code{eval-buffer}, and @code{eval-current-buffer} +instrument all forms, even those that don't define anything. +This doesn't apply to loading or evaluations in the minibuffer. + +Use the command @kbd{M-x edebug-all-forms} to toggle the value of this +option. @xref{Instrumenting}. +@end defopt + +@defopt edebug-save-windows +If this is non-@code{nil}, Edebug saves and restores the window +configuration. That takes some time, so if your program does not care +what happens to the window configurations, it is better to set this +variable to @code{nil}. + +If the value is a list, only the listed windows are saved and +restored. + +You can use the @kbd{W} command in Edebug to change this variable +interactively. @xref{Edebug Display Update}. +@end defopt + +@defopt edebug-save-displayed-buffer-points +If this is non-@code{nil}, Edebug saves and restores point in all +displayed buffers. + +Saving and restoring point in other buffers is necessary if you are +debugging code that changes the point of a buffer which is displayed in +a non-selected window. If Edebug or the user then selects the window, +point in that buffer will move to the window's value of point. + +Saving and restoring point in all buffers is expensive, since it +requires selecting each window twice, so enable this only if you need +it. @xref{Edebug Display Update}. +@end defopt + +@defopt edebug-initial-mode +If this variable is non-@code{nil}, it specifies the initial execution +mode for Edebug when it is first activated. Possible values are +@code{step}, @code{next}, @code{go}, @code{Go-nonstop}, @code{trace}, +@code{Trace-fast}, @code{continue}, and @code{Continue-fast}. + +The default value is @code{step}. +@xref{Edebug Execution Modes}. +@end defopt + +@defopt edebug-trace +If this is non-@code{nil}, trace each function entry and exit. +Tracing output is displayed in a buffer named @samp{*edebug-trace*}, one +function entry or exit per line, indented by the recursion level. + +Also see @code{edebug-tracing}, in @ref{Trace Buffer}. +@end defopt + +@defopt edebug-test-coverage +If non-@code{nil}, Edebug tests coverage of all expressions debugged. +@xref{Coverage Testing}. +@end defopt + +@defopt edebug-continue-kbd-macro +If non-@code{nil}, continue defining or executing any keyboard macro +that is executing outside of Edebug. Use this with caution since it is not +debugged. +@xref{Edebug Execution Modes}. +@end defopt + +@defopt edebug-on-error +Edebug binds @code{debug-on-error} to this value, if +@code{debug-on-error} was previously @code{nil}. @xref{Trapping +Errors}. +@end defopt + +@defopt edebug-on-quit +Edebug binds @code{debug-on-quit} to this value, if +@code{debug-on-quit} was previously @code{nil}. @xref{Trapping +Errors}. +@end defopt + + If you change the values of @code{edebug-on-error} or +@code{edebug-on-quit} while Edebug is active, their values won't be used +until the @emph{next} time Edebug is invoked via a new command. +@c Not necessarily a deeper command level. +@c A new command is not precisely true, but that is close enough -- dan + +@defopt edebug-global-break-condition +If non-@code{nil}, an expression to test for at every stop point. If +the result is non-@code{nil}, then break. Errors are ignored. +@xref{Global Break Condition}. +@end defopt + +@ignore + arch-tag: 74842db8-019f-4818-b5a4-b2de878e57fd +@end ignore diff --git a/doc/lispref/elisp-covers.texi b/doc/lispref/elisp-covers.texi new file mode 100644 index 00000000000..4b9693dece7 --- /dev/null +++ b/doc/lispref/elisp-covers.texi @@ -0,0 +1,257 @@ +\input texinfo @c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +@c Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@c +@comment %**start of header +@setfilename covers.info +@settitle GNU Emacs Lisp Reference Manual +@comment %**end of header + +@titlepage +@c ================ Volume 1 ================ +@w{ } +@sp 2 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 2 +@center @titlefont{Volume 1} +@sp 2 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + +@page +@c ================ Volume 2 ================ +@w{ } +@sp 5 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 2 +@center @titlefont{Volume 2} +@sp 2 +@center by Bil Lewis, +@center Dan LaLiberte, and +@center the GNU Manual Group + +@page +@c ================ Volume 1 with baseline skip 16pt ================ + +@tex +\global\baselineskip = 16pt +@end tex + +16 pts baseline skip: + +@w{ } +@sp 2 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 2 +@center @titlefont{Volume 1} +@sp 2 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + +@page +@c ================ Volume 1 with baseline skip 18pt ================ + +@tex +\global\baselineskip = 18pt +@end tex + +18 pts baseline skip, with 15pts between sections + +@w{ } +@sp 2 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@tex +\global\baselineskip = 15pt +@end tex + +@sp 2 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 2 +@center @titlefont{Volume 1} +@sp 2 +@center by Bil Lewis, +@center Dan LaLiberte, and +@center the GNU Manual Group + +@page +@c ================ Volume 1 with more baseline skip 24 pts ================ + +@tex +\global\baselineskip = 24pt +@end tex + +24 pts baseline skip: + +@w{ } +@sp 2 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 2 +@center @titlefont{Volume 1} +@sp 2 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + +@page +@c ================ Volume 2 with more baseline skip 18 pts ================ + +@tex +\global\baselineskip = 18pt +@end tex + +18 pts baseline skip: + +@w{ } +@sp 5 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 2 +@center @titlefont{Volume 2} +@sp 2 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + +@page +@c ================ Volume 2 with more baseline skip 24 pts ================ + +@tex +\global\baselineskip = 24pt +@end tex + +24 pts baseline skip: + +@w{ } +@sp 5 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 2 +@center @titlefont{Volume 2} +@sp 2 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + + +@page +@c ================ Spine 1 ================ + +@w{@titlefont{The GNU Emacs Lisp Reference Manual --- Vol. 1}} +@sp 4 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 4 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + +@sp 4 +@author The GNU Emacs Lisp Reference Manual --- Vol. 1 +@sp 3 +@author FSF + +@author + +@page +@c ================ Spine 2 ================ + +@w{@titlefont{The GNU Emacs Lisp Reference Manual --- Vol. 2}} +@sp 4 +@center GNU Emacs Version 19 +@center for Unix Users +@center Edition 2.3, June 1994 +@sp 4 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + + +@sp 4 +@author The GNU Emacs Lisp Reference Manual --- Vol. 2 +@sp 3 +@author FSF + +@end titlepage +@bye + +@ignore + arch-tag: 02d65d63-3b64-49bc-a5c0-bfd5eabb6c98 +@end ignore diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi new file mode 100644 index 00000000000..613bdbace38 --- /dev/null +++ b/doc/lispref/elisp.texi @@ -0,0 +1,1483 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename elisp +@settitle GNU Emacs Lisp Reference Manual +@c %**end of header + +@c Version of the manual and of Emacs. +@c Please remember to update the edition number in README as well. +@set VERSION 2.9 +@set EMACSVER 23.0.50 + +@dircategory Emacs +@direntry +* Elisp: (elisp). The Emacs Lisp Reference Manual. +@end direntry + +@c in general, keep the following line commented out, unless doing a +@c copy of this manual that will be published. The manual should go +@c onto the distribution in the full, 8.5 x 11" size. +@c set smallbook + +@ifset smallbook +@smallbook +@end ifset + +@c per rms and peterb, use 10pt fonts for the main text, mostly to +@c save on paper cost. +@c Do this inside @tex for now, so current makeinfo does not complain. +@tex +@ifset smallbook +@fonttextsize 10 +@set EMACSVER 22.1 +\global\let\urlcolor=\Black % don't print links in grayscale +\global\let\linkcolor=\Black +@end ifset +\global\hbadness=6666 % don't worry about not-too-underfull boxes +@end tex + +@c Combine indices. +@synindex cp fn +@syncodeindex vr fn +@syncodeindex ky fn +@syncodeindex pg fn +@c We use the "type index" to index new functions and variables. +@c @syncodeindex tp fn + +@copying +This is edition @value{VERSION} of the GNU Emacs Lisp Reference Manual,@* +corresponding to Emacs version @value{EMACSVER}. + +Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, +1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software +Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with the +Invariant Sections being ``GNU General Public License,'' with the +Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover +Texts as in (a) below. A copy of the license is included in the +section entitled ``GNU Free Documentation License.'' + +(a) The FSF's Back-Cover Text is: ``You are free to copy and modify +this GNU Manual. Buying copies from GNU Press supports the FSF in +developing GNU and promoting software freedom.'' +@end quotation +@end copying + +@titlepage +@title GNU Emacs Lisp Reference Manual +@subtitle For Emacs Version @value{EMACSVER} +@subtitle Revision @value{VERSION}, April 2007 + +@author by Bil Lewis, Dan LaLiberte, Richard Stallman +@author and the GNU Manual Group +@page +@vskip 0pt plus 1filll +@insertcopying + +@sp 2 +Published by the Free Software Foundation @* +51 Franklin St, Fifth Floor @* +Boston, MA 02110-1301 @* +USA @* +ISBN 1-882114-74-4 + +@sp 2 +Cover art by Etienne Suvasa. +@end titlepage + + +@c Print the tables of contents +@summarycontents +@contents + + +@ifnottex +@node Top, Introduction, (dir), (dir) +@top Emacs Lisp + +This Info file contains edition @value{VERSION} of the GNU Emacs Lisp +Reference Manual, corresponding to GNU Emacs version @value{EMACSVER}. +@end ifnottex + +@menu +* Introduction:: Introduction and conventions used. + +* Lisp Data Types:: Data types of objects in Emacs Lisp. +* Numbers:: Numbers and arithmetic functions. +* Strings and Characters:: Strings, and functions that work on them. +* Lists:: Lists, cons cells, and related functions. +* Sequences Arrays Vectors:: Lists, strings and vectors are called sequences. + Certain functions act on any kind of sequence. + The description of vectors is here as well. +* Hash Tables:: Very fast lookup-tables. +* Symbols:: Symbols represent names, uniquely. + +* Evaluation:: How Lisp expressions are evaluated. +* Control Structures:: Conditionals, loops, nonlocal exits. +* Variables:: Using symbols in programs to stand for values. +* Functions:: A function is a Lisp program + that can be invoked from other functions. +* Macros:: Macros are a way to extend the Lisp language. +* Customization:: Writing customization declarations. + +* Loading:: Reading files of Lisp code into Lisp. +* Byte Compilation:: Compilation makes programs run faster. +* Advising Functions:: Adding to the definition of a function. +* Debugging:: Tools and tips for debugging Lisp programs. + +* Read and Print:: Converting Lisp objects to text and back. +* Minibuffers:: Using the minibuffer to read input. +* Command Loop:: How the editor command loop works, + and how you can call its subroutines. +* Keymaps:: Defining the bindings from keys to commands. +* Modes:: Defining major and minor modes. +* Documentation:: Writing and using documentation strings. + +* Files:: Accessing files. +* Backups and Auto-Saving:: Controlling how backups and auto-save + files are made. +* Buffers:: Creating and using buffer objects. +* Windows:: Manipulating windows and displaying buffers. +* Frames:: Making multiple system-level windows. +* Positions:: Buffer positions and motion functions. +* Markers:: Markers represent positions and update + automatically when the text is changed. + +* Text:: Examining and changing text in buffers. +* Non-ASCII Characters:: Non-ASCII text in buffers and strings. +* Searching and Matching:: Searching buffers for strings or regexps. +* Syntax Tables:: The syntax table controls word and list parsing. +* Abbrevs:: How Abbrev mode works, and its data structures. + +* Processes:: Running and communicating with subprocesses. +* Display:: Features for controlling the screen display. +* System Interface:: Getting the user id, system type, environment + variables, and other such things. + +Appendices + +* Antinews:: Info for users downgrading to Emacs 21. +* GNU Free Documentation License:: The license for this documentation +* GPL:: Conditions for copying and changing GNU Emacs. +* Tips:: Advice and coding conventions for Emacs Lisp. +* GNU Emacs Internals:: Building and dumping Emacs; + internal data structures. +* Standard Errors:: List of all error symbols. +* Standard Buffer-Local Variables:: + List of variables buffer-local in all buffers. +* Standard Keymaps:: List of standard keymaps. +* Standard Hooks:: List of standard hook variables. + +* Index:: Index including concepts, functions, variables, + and other terms. + +@ignore +* New Symbols:: New functions and variables in Emacs @value{EMACSVER}. +@end ignore + +@c Do NOT modify the following 3 lines! They must have this form to +@c be correctly identified by `texinfo-multiple-files-update'. In +@c particular, the detailed menu header line MUST be identical to the +@c value of `texinfo-master-menu-header'. See texnfo-upd.el. + +@detailmenu + --- The Detailed Node Listing --- + --------------------------------- + +Here are other nodes that are inferiors of those already listed, +mentioned here so you can get to them in one step: + +Introduction + +* Caveats:: Flaws and a request for help. +* Lisp History:: Emacs Lisp is descended from Maclisp. +* Conventions:: How the manual is formatted. +* Version Info:: Which Emacs version is running? +* Acknowledgements:: The authors, editors, and sponsors of this manual. + +Conventions + +* Some Terms:: Explanation of terms we use in this manual. +* nil and t:: How the symbols @code{nil} and @code{t} are used. +* Evaluation Notation:: The format we use for examples of evaluation. +* Printing Notation:: The format we use for examples that print output. +* Error Messages:: The format we use for examples of errors. +* Buffer Text Notation:: The format we use for buffer contents in examples. +* Format of Descriptions:: Notation for describing functions, variables, etc. + +Format of Descriptions + +* A Sample Function Description:: A description of an imaginary + function, @code{foo}. +* A Sample Variable Description:: A description of an imaginary + variable, @code{electric-future-map}. + +Lisp Data Types + +* Printed Representation:: How Lisp objects are represented as text. +* Comments:: Comments and their formatting conventions. +* Programming Types:: Types found in all Lisp systems. +* Editing Types:: Types specific to Emacs. +* Circular Objects:: Read syntax for circular structure. +* Type Predicates:: Tests related to types. +* Equality Predicates:: Tests of equality between any two objects. + +Programming Types + +* Integer Type:: Numbers without fractional parts. +* Floating Point Type:: Numbers with fractional parts and with a large range. +* Character Type:: The representation of letters, numbers and + control characters. +* Symbol Type:: A multi-use object that refers to a function, + variable, property list, or itself. +* Sequence Type:: Both lists and arrays are classified as sequences. +* Cons Cell Type:: Cons cells, and lists (which are made from cons cells). +* Array Type:: Arrays include strings and vectors. +* String Type:: An (efficient) array of characters. +* Vector Type:: One-dimensional arrays. +* Char-Table Type:: One-dimensional sparse arrays indexed by characters. +* Bool-Vector Type:: One-dimensional arrays of @code{t} or @code{nil}. +* Hash Table Type:: Super-fast lookup tables. +* Function Type:: A piece of executable code you can call from elsewhere. +* Macro Type:: A method of expanding an expression into another + expression, more fundamental but less pretty. +* Primitive Function Type:: A function written in C, callable from Lisp. +* Byte-Code Type:: A function written in Lisp, then compiled. +* Autoload Type:: A type used for automatically loading seldom-used + functions. + +Character Type + +* Basic Char Syntax:: Syntax for regular characters. +* General Escape Syntax:: How to specify characters by their codes. +* Ctl-Char Syntax:: Syntax for control characters. +* Meta-Char Syntax:: Syntax for meta-characters. +* Other Char Bits:: Syntax for hyper-, super-, and alt-characters. + +Cons Cell and List Types + +* Box Diagrams:: Drawing pictures of lists. +* Dotted Pair Notation:: An alternative syntax for lists. +* Association List Type:: A specially constructed list. + +String Type + +* Syntax for Strings:: How to specify Lisp strings. +* Non-ASCII in Strings:: International characters in strings. +* Nonprinting Characters:: Literal unprintable characters in strings. +* Text Props and Strings:: Strings with text properties. + +Editing Types + +* Buffer Type:: The basic object of editing. +* Marker Type:: A position in a buffer. +* Window Type:: What makes buffers visible. +* Frame Type:: Windows subdivide frames. +* Window Configuration Type:: Recording the way a frame is subdivided. +* Frame Configuration Type:: Recording the status of all frames. +* Process Type:: A process running on the underlying OS. +* Stream Type:: Receive or send characters. +* Keymap Type:: What function a keystroke invokes. +* Overlay Type:: How an overlay is represented. + +Numbers + +* Integer Basics:: Representation and range of integers. +* Float Basics:: Representation and range of floating point. +* Predicates on Numbers:: Testing for numbers. +* Comparison of Numbers:: Equality and inequality predicates. +* Numeric Conversions:: Converting float to integer and vice versa. +* Arithmetic Operations:: How to add, subtract, multiply and divide. +* Rounding Operations:: Explicitly rounding floating point numbers. +* Bitwise Operations:: Logical and, or, not, shifting. +* Math Functions:: Trig, exponential and logarithmic functions. +* Random Numbers:: Obtaining random integers, predictable or not. + +Strings and Characters + +* String Basics:: Basic properties of strings and characters. +* Predicates for Strings:: Testing whether an object is a string or char. +* Creating Strings:: Functions to allocate new strings. +* Modifying Strings:: Altering the contents of an existing string. +* Text Comparison:: Comparing characters or strings. +* String Conversion:: Converting characters to strings and vice versa. +* Formatting Strings:: @code{format}: Emacs's analogue of @code{printf}. +* Case Conversion:: Case conversion functions. +* Case Tables:: Customizing case conversion. + +Lists + +* Cons Cells:: How lists are made out of cons cells. +* List-related Predicates:: Is this object a list? Comparing two lists. +* List Elements:: Extracting the pieces of a list. +* Building Lists:: Creating list structure. +* List Variables:: Modifying lists stored in variables. +* Modifying Lists:: Storing new pieces into an existing list. +* Sets And Lists:: A list can represent a finite mathematical set. +* Association Lists:: A list can represent a finite relation or mapping. +* Rings:: Managing a fixed-size ring of objects. + +Modifying Existing List Structure + +* Setcar:: Replacing an element in a list. +* Setcdr:: Replacing part of the list backbone. + This can be used to remove or add elements. +* Rearrangement:: Reordering the elements in a list; combining lists. + +Sequences, Arrays, and Vectors + +* Sequence Functions:: Functions that accept any kind of sequence. +* Arrays:: Characteristics of arrays in Emacs Lisp. +* Array Functions:: Functions specifically for arrays. +* Vectors:: Special characteristics of Emacs Lisp vectors. +* Vector Functions:: Functions specifically for vectors. +* Char-Tables:: How to work with char-tables. +* Bool-Vectors:: How to work with bool-vectors. + +Hash Tables + +* Creating Hash:: Functions to create hash tables. +* Hash Access:: Reading and writing the hash table contents. +* Defining Hash:: Defining new comparison methods +* Other Hash:: Miscellaneous. + +Symbols + +* Symbol Components:: Symbols have names, values, function definitions + and property lists. +* Definitions:: A definition says how a symbol will be used. +* Creating Symbols:: How symbols are kept unique. +* Property Lists:: Each symbol has a property list + for recording miscellaneous information. + +Property Lists + +* Plists and Alists:: Comparison of the advantages of property + lists and association lists. +* Symbol Plists:: Functions to access symbols' property lists. +* Other Plists:: Accessing property lists stored elsewhere. + +Evaluation + +* Intro Eval:: Evaluation in the scheme of things. +* Forms:: How various sorts of objects are evaluated. +* Quoting:: Avoiding evaluation (to put constants in + the program). +* Eval:: How to invoke the Lisp interpreter explicitly. + +Kinds of Forms + +* Self-Evaluating Forms:: Forms that evaluate to themselves. +* Symbol Forms:: Symbols evaluate as variables. +* Classifying Lists:: How to distinguish various sorts of list forms. +* Function Indirection:: When a symbol appears as the car of a list, + we find the real function via the symbol. +* Function Forms:: Forms that call functions. +* Macro Forms:: Forms that call macros. +* Special Forms:: "Special forms" are idiosyncratic primitives, + most of them extremely important. +* Autoloading:: Functions set up to load files + containing their real definitions. + +Control Structures + +* Sequencing:: Evaluation in textual order. +* Conditionals:: @code{if}, @code{cond}, @code{when}, @code{unless}. +* Combining Conditions:: @code{and}, @code{or}, @code{not}. +* Iteration:: @code{while} loops. +* Nonlocal Exits:: Jumping out of a sequence. + +Nonlocal Exits + +* Catch and Throw:: Nonlocal exits for the program's own purposes. +* Examples of Catch:: Showing how such nonlocal exits can be written. +* Errors:: How errors are signaled and handled. +* Cleanups:: Arranging to run a cleanup form if an + error happens. + +Errors + +* Signaling Errors:: How to report an error. +* Processing of Errors:: What Emacs does when you report an error. +* Handling Errors:: How you can trap errors and continue execution. +* Error Symbols:: How errors are classified for trapping them. +* Standard Errors:: List of all error symbols. + +Variables + +* Global Variables:: Variable values that exist permanently, everywhere. +* Constant Variables:: Certain "variables" have values that never change. +* Local Variables:: Variable values that exist only temporarily. +* Void Variables:: Symbols that lack values. +* Defining Variables:: A definition says a symbol is used as a variable. +* Tips for Defining:: Things you should think about when you + define a variable. +* Accessing Variables:: Examining values of variables whose names + are known only at run time. +* Setting Variables:: Storing new values in variables. +* Variable Scoping:: How Lisp chooses among local and global values. +* Buffer-Local Variables:: Variable values in effect only in one buffer. +* Frame-Local Variables:: Variable values in effect only in one frame. +* Future Local Variables:: New kinds of local values we might add some day. +* File Local Variables:: Handling local variable lists in files. +* Variable Aliases:: Variables that are aliases for other variables. +* Variables with Restricted Values:: Non-constant variables whose value can + @emph{not} be an arbitrary Lisp object. +* Standard Buffer-Local Variables:: + List of variables buffer-local in all buffers. + +Scoping Rules for Variable Bindings + +* Scope:: Scope means where in the program a value + is visible. Comparison with other languages. +* Extent:: Extent means how long in time a value exists. +* Impl of Scope:: Two ways to implement dynamic scoping. +* Using Scoping:: How to use dynamic scoping carefully and + avoid problems. + +Buffer-Local Variables + +* Intro to Buffer-Local:: Introduction and concepts. +* Creating Buffer-Local:: Creating and destroying buffer-local bindings. +* Default Value:: The default value is seen in buffers + that don't have their own buffer-local values. + +Functions + +* What Is a Function:: Lisp functions vs primitives; terminology. +* Lambda Expressions:: How functions are expressed as Lisp objects. +* Function Names:: A symbol can serve as the name of a function. +* Defining Functions:: Lisp expressions for defining functions. +* Calling Functions:: How to use an existing function. +* Mapping Functions:: Applying a function to each element of a list, etc. +* Anonymous Functions:: Lambda-expressions are functions with no names. +* Function Cells:: Accessing or setting the function definition + of a symbol. +* Obsolete Functions:: Declaring functions obsolete. +* Inline Functions:: Defining functions that the compiler will open code. +* Function Safety:: Determining whether a function is safe to call. +* Related Topics:: Cross-references to specific Lisp primitives + that have a special bearing on how + functions work. + +Lambda Expressions + +* Lambda Components:: The parts of a lambda expression. +* Simple Lambda:: A simple example. +* Argument List:: Details and special features of argument lists. +* Function Documentation:: How to put documentation in a function. + +Macros + +* Simple Macro:: A basic example. +* Expansion:: How, when and why macros are expanded. +* Compiling Macros:: How macros are expanded by the compiler. +* Defining Macros:: How to write a macro definition. +* Backquote:: Easier construction of list structure. +* Problems with Macros:: Don't evaluate the macro arguments too many times. + Don't hide the user's variables. +* Indenting Macros:: Specifying how to indent macro calls. + +Common Problems Using Macros + +* Wrong Time:: Do the work in the expansion, not in the macro. +* Argument Evaluation:: The expansion should evaluate each macro arg once. +* Surprising Local Vars:: Local variable bindings in the expansion + require special care. +* Eval During Expansion:: Don't evaluate them; put them in the expansion. +* Repeated Expansion:: Avoid depending on how many times expansion is done. + +Writing Customization Definitions + +* Common Keywords:: Common keyword arguments for all kinds of + customization declarations. +* Group Definitions:: Writing customization group definitions. +* Variable Definitions:: Declaring user options. +* Customization Types:: Specifying the type of a user option. + +Customization Types + +* Simple Types:: Simple customization types: sexp, integer, number, + string, file, directory, alist. +* Composite Types:: Build new types from other types or data. +* Splicing into Lists:: Splice elements into list with @code{:inline}. +* Type Keywords:: Keyword-argument pairs in a customization type. +* Defining New Types:: Give your type a name. + +Loading + +* How Programs Do Loading:: The @code{load} function and others. +* Load Suffixes:: Details about the suffixes that @code{load} tries. +* Library Search:: Finding a library to load. +* Loading Non-ASCII:: Non-@acronym{ASCII} characters in Emacs Lisp files. +* Autoload:: Setting up a function to autoload. +* Repeated Loading:: Precautions about loading a file twice. +* Named Features:: Loading a library if it isn't already loaded. +* Where Defined:: Finding which file defined a certain symbol. +* Unloading:: How to "unload" a library that was loaded. +* Hooks for Loading:: Providing code to be run when + particular libraries are loaded. + +Byte Compilation + +* Speed of Byte-Code:: An example of speedup from byte compilation. +* Compilation Functions:: Byte compilation functions. +* Docs and Compilation:: Dynamic loading of documentation strings. +* Dynamic Loading:: Dynamic loading of individual functions. +* Eval During Compile:: Code to be evaluated when you compile. +* Compiler Errors:: Handling compiler error messages. +* Byte-Code Objects:: The data type used for byte-compiled functions. +* Disassembly:: Disassembling byte-code; how to read byte-code. + +Advising Emacs Lisp Functions + +* Simple Advice:: A simple example to explain the basics of advice. +* Defining Advice:: Detailed description of @code{defadvice}. +* Around-Advice:: Wrapping advice around a function's definition. +* Computed Advice:: ...is to @code{defadvice} as @code{fset} is to @code{defun}. +* Activation of Advice:: Advice doesn't do anything until you activate it. +* Enabling Advice:: You can enable or disable each piece of advice. +* Preactivation:: Preactivation is a way of speeding up the + loading of compiled advice. +* Argument Access in Advice:: How advice can access the function's arguments. +* Advising Primitives:: Accessing arguments when advising a primitive. +* Combined Definition:: How advice is implemented. + +Debugging Lisp Programs + +* Debugger:: How the Emacs Lisp debugger is implemented. +* Edebug:: A source-level Emacs Lisp debugger. +* Syntax Errors:: How to find syntax errors. +* Test Coverage:: Ensuring you have tested all branches in your code. +* Compilation Errors:: How to find errors that show up in + byte compilation. + +The Lisp Debugger + +* Error Debugging:: Entering the debugger when an error happens. +* Infinite Loops:: Stopping and debugging a program that doesn't exit. +* Function Debugging:: Entering it when a certain function is called. +* Explicit Debug:: Entering it at a certain point in the program. +* Using Debugger:: What the debugger does; what you see while in it. +* Debugger Commands:: Commands used while in the debugger. +* Invoking the Debugger:: How to call the function @code{debug}. +* Internals of Debugger:: Subroutines of the debugger, and global variables. + +Edebug + +* Using Edebug:: Introduction to use of Edebug. +* Instrumenting:: You must instrument your code + in order to debug it with Edebug. +* Edebug Execution Modes:: Execution modes, stopping more or less often. +* Jumping:: Commands to jump to a specified place. +* Edebug Misc:: Miscellaneous commands. +* Breaks:: Setting breakpoints to make the program stop. +* Trapping Errors:: Trapping errors with Edebug. +* Edebug Views:: Views inside and outside of Edebug. +* Edebug Eval:: Evaluating expressions within Edebug. +* Eval List:: Expressions whose values are displayed + each time you enter Edebug. +* Printing in Edebug:: Customization of printing. +* Trace Buffer:: How to produce trace output in a buffer. +* Coverage Testing:: How to test evaluation coverage. +* The Outside Context:: Data that Edebug saves and restores. +* Edebug and Macros:: Specifying how to handle macro calls. +* Edebug Options:: Option variables for customizing Edebug. + +Debugging Invalid Lisp Syntax + +* Excess Open:: How to find a spurious open paren or missing close. +* Excess Close:: How to find a spurious close paren or missing open. + +Reading and Printing Lisp Objects + +* Streams Intro:: Overview of streams, reading and printing. +* Input Streams:: Various data types that can be used as + input streams. +* Input Functions:: Functions to read Lisp objects from text. +* Output Streams:: Various data types that can be used as + output streams. +* Output Functions:: Functions to print Lisp objects as text. +* Output Variables:: Variables that control what the printing + functions do. + +Minibuffers + +* Intro to Minibuffers:: Basic information about minibuffers. +* Text from Minibuffer:: How to read a straight text string. +* Object from Minibuffer:: How to read a Lisp object or expression. +* Minibuffer History:: Recording previous minibuffer inputs + so the user can reuse them. +* Initial Input:: Specifying initial contents for the minibuffer. +* Completion:: How to invoke and customize completion. +* Yes-or-No Queries:: Asking a question with a simple answer. +* Multiple Queries:: Asking a series of similar questions. +* Reading a Password:: Reading a password from the terminal. +* Minibuffer Commands:: Commands used as key bindings in minibuffers. +* Minibuffer Contents:: How such commands access the minibuffer text. +* Minibuffer Windows:: Operating on the special minibuffer windows. +* Recursive Mini:: Whether recursive entry to minibuffer is allowed. +* Minibuffer Misc:: Various customization hooks and variables. + +Completion + +* Basic Completion:: Low-level functions for completing strings. + (These are too low level to use the minibuffer.) +* Minibuffer Completion:: Invoking the minibuffer with completion. +* Completion Commands:: Minibuffer commands that do completion. +* High-Level Completion:: Convenient special cases of completion + (reading buffer name, file name, etc.) +* Reading File Names:: Using completion to read file names. +* Programmed Completion:: Finding the completions for a given file name. + +Command Loop + +* Command Overview:: How the command loop reads commands. +* Defining Commands:: Specifying how a function should read arguments. +* Interactive Call:: Calling a command, so that it will read arguments. +* Command Loop Info:: Variables set by the command loop for you to examine. +* Adjusting Point:: Adjustment of point after a command. +* Input Events:: What input looks like when you read it. +* Reading Input:: How to read input events from the keyboard or mouse. +* Special Events:: Events processed immediately and individually. +* Waiting:: Waiting for user input or elapsed time. +* Quitting:: How @kbd{C-g} works. How to catch or defer quitting. +* Prefix Command Arguments:: How the commands to set prefix args work. +* Recursive Editing:: Entering a recursive edit, + and why you usually shouldn't. +* Disabling Commands:: How the command loop handles disabled commands. +* Command History:: How the command history is set up, and how accessed. +* Keyboard Macros:: How keyboard macros are implemented. + +Defining Commands + +* Using Interactive:: General rules for @code{interactive}. +* Interactive Codes:: The standard letter-codes for reading arguments + in various ways. +* Interactive Examples:: Examples of how to read interactive arguments. + +Input Events + +* Keyboard Events:: Ordinary characters--keys with symbols on them. +* Function Keys:: Function keys--keys with names, not symbols. +* Mouse Events:: Overview of mouse events. +* Click Events:: Pushing and releasing a mouse button. +* Drag Events:: Moving the mouse before releasing the button. +* Button-Down Events:: A button was pushed and not yet released. +* Repeat Events:: Double and triple click (or drag, or down). +* Motion Events:: Just moving the mouse, not pushing a button. +* Focus Events:: Moving the mouse between frames. +* Misc Events:: Other events the system can generate. +* Event Examples:: Examples of the lists for mouse events. +* Classifying Events:: Finding the modifier keys in an event symbol. +* Accessing Events:: Functions to extract info from events. +* Strings of Events:: Special considerations for putting + keyboard character events in a string. + +Reading Input + +* Key Sequence Input:: How to read one key sequence. +* Reading One Event:: How to read just one event. +* Event Mod:: How Emacs modifies events as they are read. +* Invoking the Input Method:: How reading an event uses the input method. +* Quoted Character Input:: Asking the user to specify a character. +* Event Input Misc:: How to reread or throw away input events. + +Keymaps + +* Key Sequences:: Key sequences as Lisp objects. +* Keymap Basics:: Basic concepts of keymaps. +* Format of Keymaps:: What a keymap looks like as a Lisp object. +* Creating Keymaps:: Functions to create and copy keymaps. +* Inheritance and Keymaps:: How one keymap can inherit the bindings + of another keymap. +* Prefix Keys:: Defining a key with a keymap as its definition. +* Active Keymaps:: How Emacs searches the active keymaps + for a key binding. +* Searching Keymaps:: A pseudo-Lisp summary of searching active maps. +* Controlling Active Maps:: Each buffer has a local keymap + to override the standard (global) bindings. + A minor mode can also override them. +* Key Lookup:: How extracting elements from keymaps works. +* Functions for Key Lookup:: How to request key lookup. +* Changing Key Bindings:: Redefining a key in a keymap. +* Remapping Commands:: A keymap can translate one command to another. +* Translation Keymaps:: Keymaps for translating sequences of events. +* Key Binding Commands:: Interactive interfaces for redefining keys. +* Scanning Keymaps:: Looking through all keymaps, for printing help. +* Menu Keymaps:: A keymap can define a menu for X + or for use from the terminal. +* Standard Keymaps:: List of standard keymaps. + +Major and Minor Modes + +* Hooks:: How to use hooks; how to write code that + provides hooks. +* Major Modes:: Defining major modes. +* Minor Modes:: Defining minor modes. +* Mode Line Format:: Customizing the text that appears in the mode line. +* Imenu:: How a mode can provide a menu + of definitions in the buffer. +* Font Lock Mode:: How modes can highlight text according to syntax. +* Desktop Save Mode:: How modes can have buffer state saved between + Emacs sessions. + +Menu Keymaps + +* Defining Menus:: How to make a keymap that defines a menu. +* Mouse Menus:: How users actuate the menu with the mouse. +* Keyboard Menus:: How users actuate the menu with the keyboard. +* Menu Example:: Making a simple menu. +* Menu Bar:: How to customize the menu bar. +* Tool Bar:: A tool bar is a row of images. +* Modifying Menus:: How to add new items to a menu. + +Defining Menus + +* Simple Menu Items:: A simple kind of menu key binding, + limited in capabilities. +* Extended Menu Items:: More powerful menu item definitions + let you specify keywords to enable + various features. +* Menu Separators:: Drawing a horizontal line through a menu. +* Alias Menu Items:: Using command aliases in menu items. + +Major and Minor Modes + +* Hooks:: How to use hooks; how to write code that provides hooks. +* Major Modes:: Defining major modes. +* Minor Modes:: Defining minor modes. +* Mode Line Format:: Customizing the text that appears in the mode line. +* Imenu:: How a mode can provide a menu + of definitions in the buffer. +* Font Lock Mode:: How modes can highlight text according to syntax. +* Desktop Save Mode:: How modes can have buffer state saved between + Emacs sessions. + +Major Modes + +* Major Mode Basics:: +* Major Mode Conventions:: Coding conventions for keymaps, etc. +* Example Major Modes:: Text mode and Lisp modes. +* Auto Major Mode:: How Emacs chooses the major mode automatically. +* Mode Help:: Finding out how to use a mode. +* Derived Modes:: Defining a new major mode based on another major + mode. +* Generic Modes:: Defining a simple major mode that supports + comment syntax and Font Lock mode. +* Mode Hooks:: Hooks run at the end of major mode functions. + +Minor Modes + +* Minor Mode Conventions:: Tips for writing a minor mode. +* Keymaps and Minor Modes:: How a minor mode can have its own keymap. +* Defining Minor Modes:: A convenient facility for defining minor modes. + +Mode Line Format + +* Mode Line Basics:: +* Mode Line Data:: The data structure that controls the mode line. +* Mode Line Variables:: Variables used in that data structure. +* %-Constructs:: Putting information into a mode line. +* Properties in Mode:: Using text properties in the mode line. +* Header Lines:: Like a mode line, but at the top. +* Emulating Mode Line:: Formatting text as the mode line would. + +Font Lock Mode + +* Font Lock Basics:: Overview of customizing Font Lock. +* Search-based Fontification:: Fontification based on regexps. +* Customizing Keywords:: Customizing search-based fontification. +* Other Font Lock Variables:: Additional customization facilities. +* Levels of Font Lock:: Each mode can define alternative levels + so that the user can select more or less. +* Precalculated Fontification:: How Lisp programs that produce the buffer + contents can also specify how to fontify it. +* Faces for Font Lock:: Special faces specifically for Font Lock. +* Syntactic Font Lock:: Fontification based on syntax tables. +* Setting Syntax Properties:: Defining character syntax based on context + using the Font Lock mechanism. +* Multiline Font Lock:: How to coerce Font Lock into properly + highlighting multiline constructs. + +Multiline Font Lock Constructs + +* Font Lock Multiline:: Marking multiline chunks with a text property +* Region to Fontify:: Controlling which region gets refontified + after a buffer change. + +Documentation + +* Documentation Basics:: Good style for doc strings. + Where to put them. How Emacs stores them. +* Accessing Documentation:: How Lisp programs can access doc strings. +* Keys in Documentation:: Substituting current key bindings. +* Describing Characters:: Making printable descriptions of + non-printing characters and key sequences. +* Help Functions:: Subroutines used by Emacs help facilities. + +Files + +* Visiting Files:: Reading files into Emacs buffers for editing. +* Saving Buffers:: Writing changed buffers back into files. +* Reading from Files:: Reading files into other buffers. +* Writing to Files:: Writing new files from parts of buffers. +* File Locks:: Locking and unlocking files, to prevent + simultaneous editing by two people. +* Information about Files:: Testing existence, accessibility, size of files. +* Changing Files:: Renaming files, changing protection, etc. +* File Names:: Decomposing and expanding file names. +* Contents of Directories:: Getting a list of the files in a directory. +* Create/Delete Dirs:: Creating and Deleting Directories. +* Magic File Names:: Defining "magic" special handling + for certain file names. +* Format Conversion:: Conversion to and from various file formats. + +Visiting Files + +* Visiting Functions:: The usual interface functions for visiting. +* Subroutines of Visiting:: Lower-level subroutines that they use. + +Information about Files + +* Testing Accessibility:: Is a given file readable? Writable? +* Kinds of Files:: Is it a directory? A symbolic link? +* Truenames:: Eliminating symbolic links from a file name. +* File Attributes:: How large is it? Any other names? Etc. +* Locating Files:: How to find a file in standard places. + +File Names + +* File Name Components:: The directory part of a file name, and the rest. +* Relative File Names:: Some file names are relative to a + current directory. +* Directory Names:: A directory's name as a directory + is different from its name as a file. +* File Name Expansion:: Converting relative file names to absolute ones. +* Unique File Names:: Generating names for temporary files. +* File Name Completion:: Finding the completions for a given file name. +* Standard File Names:: If your package uses a fixed file name, + how to handle various operating systems simply. + +Backups and Auto-Saving + +* Backup Files:: How backup files are made; how their names + are chosen. +* Auto-Saving:: How auto-save files are made; how their + names are chosen. +* Reverting:: @code{revert-buffer}, and how to customize + what it does. + +Backup Files + +* Making Backups:: How Emacs makes backup files, and when. +* Rename or Copy:: Two alternatives: renaming the old file + or copying it. +* Numbered Backups:: Keeping multiple backups for each source file. +* Backup Names:: How backup file names are computed; customization. + +Buffers + +* Buffer Basics:: What is a buffer? +* Current Buffer:: Designating a buffer as current + so primitives will access its contents. +* Buffer Names:: Accessing and changing buffer names. +* Buffer File Name:: The buffer file name indicates which file + is visited. +* Buffer Modification:: A buffer is @dfn{modified} if it needs to be saved. +* Modification Time:: Determining whether the visited file was changed + ``behind Emacs's back''. +* Read Only Buffers:: Modifying text is not allowed in a + read-only buffer. +* The Buffer List:: How to look at all the existing buffers. +* Creating Buffers:: Functions that create buffers. +* Killing Buffers:: Buffers exist until explicitly killed. +* Indirect Buffers:: An indirect buffer shares text with some + other buffer. +* Buffer Gap:: The gap in the buffer. + +Windows + +* Basic Windows:: Basic information on using windows. +* Splitting Windows:: Splitting one window into two windows. +* Deleting Windows:: Deleting a window gives its space to other windows. +* Selecting Windows:: The selected window is the one that you edit in. +* Cyclic Window Ordering:: Moving around the existing windows. +* Buffers and Windows:: Each window displays the contents of a buffer. +* Displaying Buffers:: Higher-level functions for displaying a buffer + and choosing a window for it. +* Choosing Window:: How to choose a window for displaying a buffer. +* Window Point:: Each window has its own location of point. +* Window Start:: The display-start position controls which text + is on-screen in the window. +* Textual Scrolling:: Moving text up and down through the window. +* Vertical Scrolling:: Moving the contents up and down on the window. +* Horizontal Scrolling:: Moving the contents sideways on the window. +* Size of Window:: Accessing the size of a window. +* Resizing Windows:: Changing the size of a window. +* Coordinates and Windows:: Converting coordinates to windows. +* Window Tree:: The layout and sizes of all windows in a frame. +* Window Configurations:: Saving and restoring the state of the screen. +* Window Hooks:: Hooks for scrolling, window size changes, + redisplay going past a certain point, + or window configuration changes. + +Frames + +* Creating Frames:: Creating additional frames. +* Multiple Displays:: Creating frames on other displays. +* Frame Parameters:: Controlling frame size, position, font, etc. +* Frame Titles:: Automatic updating of frame titles. +* Deleting Frames:: Frames last until explicitly deleted. +* Finding All Frames:: How to examine all existing frames. +* Frames and Windows:: A frame contains windows; + display of text always works through windows. +* Minibuffers and Frames:: How a frame finds the minibuffer to use. +* Input Focus:: Specifying the selected frame. +* Visibility of Frames:: Frames may be visible or invisible, or icons. +* Raising and Lowering:: Raising a frame makes it hide other windows; + lowering it puts it underneath the others. +* Frame Configurations:: Saving the state of all frames. +* Mouse Tracking:: Getting events that say when the mouse moves. +* Mouse Position:: Asking where the mouse is, or moving it. +* Pop-Up Menus:: Displaying a menu for the user to select from. +* Dialog Boxes:: Displaying a box to ask yes or no. +* Pointer Shape:: Specifying the shape of the mouse pointer. +* Window System Selections::Transferring text to and from other windows. +* Drag and Drop:: Internals of Drag-and-Drop implementation. +* Color Names:: Getting the definitions of color names. +* Text Terminal Colors:: Defining colors for text-only terminals. +* Resources:: Getting resource values from the server. +* Display Feature Testing:: Determining the features of a terminal. + +Frame Parameters + +* Parameter Access:: How to change a frame's parameters. +* Initial Parameters:: Specifying frame parameters when you make a frame. +* Window Frame Parameters:: List of frame parameters for window systems. +* Size and Position:: Changing the size and position of a frame. +* Geometry:: Parsing geometry specifications. + +Window Frame Parameters + +* Basic Parameters:: Parameters that are fundamental. +* Position Parameters:: The position of the frame on the screen. +* Size Parameters:: Frame's size. +* Layout Parameters:: Size of parts of the frame, and + enabling or disabling some parts. +* Buffer Parameters:: Which buffers have been or should be shown. +* Management Parameters:: Communicating with the window manager. +* Cursor Parameters:: Controlling the cursor appearance. +* Color Parameters:: Colors of various parts of the frame. + +Positions + +* Point:: The special position where editing takes place. +* Motion:: Changing point. +* Excursions:: Temporary motion and buffer changes. +* Narrowing:: Restricting editing to a portion of the buffer. + +Motion + +* Character Motion:: Moving in terms of characters. +* Word Motion:: Moving in terms of words. +* Buffer End Motion:: Moving to the beginning or end of the buffer. +* Text Lines:: Moving in terms of lines of text. +* Screen Lines:: Moving in terms of lines as displayed. +* List Motion:: Moving by parsing lists and sexps. +* Skipping Characters:: Skipping characters belonging to a certain set. + +Markers + +* Overview of Markers:: The components of a marker, and how it relocates. +* Predicates on Markers:: Testing whether an object is a marker. +* Creating Markers:: Making empty markers or markers at certain places. +* Information from Markers::Finding the marker's buffer or character + position. +* Marker Insertion Types:: Two ways a marker can relocate when you + insert where it points. +* Moving Markers:: Moving the marker to a new buffer or position. +* The Mark:: How "the mark" is implemented with a marker. +* The Region:: How to access "the region". + +Text + +* Near Point:: Examining text in the vicinity of point. +* Buffer Contents:: Examining text in a general fashion. +* Comparing Text:: Comparing substrings of buffers. +* Insertion:: Adding new text to a buffer. +* Commands for Insertion:: User-level commands to insert text. +* Deletion:: Removing text from a buffer. +* User-Level Deletion:: User-level commands to delete text. +* The Kill Ring:: Where removed text sometimes is saved for + later use. +* Undo:: Undoing changes to the text of a buffer. +* Maintaining Undo:: How to enable and disable undo information. + How to control how much information is kept. +* Filling:: Functions for explicit filling. +* Margins:: How to specify margins for filling commands. +* Adaptive Fill:: Adaptive Fill mode chooses a fill prefix + from context. +* Auto Filling:: How auto-fill mode is implemented to break lines. +* Sorting:: Functions for sorting parts of the buffer. +* Columns:: Computing horizontal positions, and using them. +* Indentation:: Functions to insert or adjust indentation. +* Case Changes:: Case conversion of parts of the buffer. +* Text Properties:: Assigning Lisp property lists to text characters. +* Substitution:: Replacing a given character wherever it appears. +* Transposition:: Swapping two portions of a buffer. +* Registers:: How registers are implemented. Accessing + the text or position stored in a register. +* Base 64:: Conversion to or from base 64 encoding. +* MD5 Checksum:: Compute the MD5 "message digest"/"checksum". +* Atomic Changes:: Installing several buffer changes "atomically". +* Change Hooks:: Supplying functions to be run when text is changed. + +The Kill Ring + +* Kill Ring Concepts:: What text looks like in the kill ring. +* Kill Functions:: Functions that kill text. +* Yanking:: How yanking is done. +* Yank Commands:: Commands that access the kill ring. +* Low-Level Kill Ring:: Functions and variables for kill ring access. +* Internals of Kill Ring:: Variables that hold kill-ring data. + +Indentation + +* Primitive Indent:: Functions used to count and insert indentation. +* Mode-Specific Indent:: Customize indentation for different modes. +* Region Indent:: Indent all the lines in a region. +* Relative Indent:: Indent the current line based on previous lines. +* Indent Tabs:: Adjustable, typewriter-like tab stops. +* Motion by Indent:: Move to first non-blank character. + +Text Properties + +* Examining Properties:: Looking at the properties of one character. +* Changing Properties:: Setting the properties of a range of text. +* Property Search:: Searching for where a property changes value. +* Special Properties:: Particular properties with special meanings. +* Format Properties:: Properties for representing formatting of text. +* Sticky Properties:: How inserted text gets properties from + neighboring text. +* Lazy Properties:: Computing text properties in a lazy fashion + only when text is examined. +* Clickable Text:: Using text properties to make regions of text + do something when you click on them. +* Links and Mouse-1:: How to make @key{Mouse-1} follow a link. +* Fields:: The @code{field} property defines + fields within the buffer. +* Not Intervals:: Why text properties do not use + Lisp-visible text intervals. + +Non-ASCII Characters + +* Text Representations:: Unibyte and multibyte representations +* Converting Representations:: Converting unibyte to multibyte and vice versa. +* Selecting a Representation:: Treating a byte sequence as unibyte or multi. +* Character Codes:: How unibyte and multibyte relate to + codes of individual characters. +* Character Sets:: The space of possible character codes + is divided into various character sets. +* Chars and Bytes:: More information about multibyte encodings. +* Splitting Characters:: Converting a character to its byte sequence. +* Scanning Charsets:: Which character sets are used in a buffer? +* Translation of Characters:: Translation tables are used for conversion. +* Coding Systems:: Coding systems are conversions for saving files. +* Input Methods:: Input methods allow users to enter various + non-ASCII characters without special keyboards. +* Locales:: Interacting with the POSIX locale. + +Coding Systems + +* Coding System Basics:: Basic concepts. +* Encoding and I/O:: How file I/O functions handle coding systems. +* Lisp and Coding Systems:: Functions to operate on coding system names. +* User-Chosen Coding Systems:: Asking the user to choose a coding system. +* Default Coding Systems:: Controlling the default choices. +* Specifying Coding Systems:: Requesting a particular coding system + for a single file operation. +* Explicit Encoding:: Encoding or decoding text without doing I/O. +* Terminal I/O Encoding:: Use of encoding for terminal I/O. +* MS-DOS File Types:: How DOS "text" and "binary" files + relate to coding systems. + +Searching and Matching + +* String Search:: Search for an exact match. +* Searching and Case:: Case-independent or case-significant searching. +* Regular Expressions:: Describing classes of strings. +* Regexp Search:: Searching for a match for a regexp. +* POSIX Regexps:: Searching POSIX-style for the longest match. +* Match Data:: Finding out which part of the text matched, + after a string or regexp search. +* Search and Replace:: Commands that loop, searching and replacing. +* Standard Regexps:: Useful regexps for finding sentences, pages,... + +Regular Expressions + +* Syntax of Regexps:: Rules for writing regular expressions. +* Regexp Example:: Illustrates regular expression syntax. +* Regexp Functions:: Functions for operating on regular expressions. + +Syntax of Regular Expressions + +* Regexp Special:: Special characters in regular expressions. +* Char Classes:: Character classes used in regular expressions. +* Regexp Backslash:: Backslash-sequences in regular expressions. + +The Match Data + +* Replacing Match:: Replacing a substring that was matched. +* Simple Match Data:: Accessing single items of match data, + such as where a particular subexpression started. +* Entire Match Data:: Accessing the entire match data at once, as a list. +* Saving Match Data:: Saving and restoring the match data. + +Syntax Tables + +* Syntax Basics:: Basic concepts of syntax tables. +* Syntax Descriptors:: How characters are classified. +* Syntax Table Functions:: How to create, examine and alter syntax tables. +* Syntax Properties:: Overriding syntax with text properties. +* Motion and Syntax:: Moving over characters with certain syntaxes. +* Parsing Expressions:: Parsing balanced expressions + using the syntax table. +* Standard Syntax Tables:: Syntax tables used by various major modes. +* Syntax Table Internals:: How syntax table information is stored. +* Categories:: Another way of classifying character syntax. + +Syntax Descriptors + +* Syntax Class Table:: Table of syntax classes. +* Syntax Flags:: Additional flags each character can have. + +Parsing Expressions + +* Motion via Parsing:: Motion functions that work by parsing. +* Position Parse:: Determining the syntactic state of a position. +* Parser State:: How Emacs represents a syntactic state. +* Low-Level Parsing:: Parsing across a specified region. +* Control Parsing:: Parameters that affect parsing. + +Abbrevs And Abbrev Expansion + +* Abbrev Mode:: Setting up Emacs for abbreviation. +* Abbrev Tables:: Creating and working with abbrev tables. +* Defining Abbrevs:: Specifying abbreviations and their expansions. +* Abbrev Files:: Saving abbrevs in files. +* Abbrev Expansion:: Controlling expansion; expansion subroutines. +* Standard Abbrev Tables:: Abbrev tables used by various major modes. + +Processes + +* Subprocess Creation:: Functions that start subprocesses. +* Shell Arguments:: Quoting an argument to pass it to a shell. +* Synchronous Processes:: Details of using synchronous subprocesses. +* Asynchronous Processes:: Starting up an asynchronous subprocess. +* Deleting Processes:: Eliminating an asynchronous subprocess. +* Process Information:: Accessing run-status and other attributes. +* Input to Processes:: Sending input to an asynchronous subprocess. +* Signals to Processes:: Stopping, continuing or interrupting + an asynchronous subprocess. +* Output from Processes:: Collecting output from an asynchronous subprocess. +* Sentinels:: Sentinels run when process run-status changes. +* Query Before Exit:: Whether to query if exiting will kill a process. +* Transaction Queues:: Transaction-based communication with subprocesses. +* Network:: Opening network connections. +* Network Servers:: Network servers let Emacs accept net connections. +* Datagrams:: UDP network connections. +* Low-Level Network:: Lower-level but more general function + to create connections and servers. +* Misc Network:: Additional relevant functions for network connections. +* Byte Packing:: Using bindat to pack and unpack binary data. + +Receiving Output from Processes + +* Process Buffers:: If no filter, output is put in a buffer. +* Filter Functions:: Filter functions accept output from the process. +* Decoding Output:: Filters can get unibyte or multibyte strings. +* Accepting Output:: How to wait until process output arrives. + +Low-Level Network Access + +* Proc: Network Processes. Using @code{make-network-process}. +* Options: Network Options. Further control over network connections. +* Features: Network Feature Testing. + Determining which network features work on + the machine you are using. + +Packing and Unpacking Byte Arrays + +* Bindat Spec:: Describing data layout. +* Bindat Functions:: Doing the unpacking and packing. +* Bindat Examples:: Samples of what bindat.el can do for you! + +Emacs Display + +* Refresh Screen:: Clearing the screen and redrawing everything on it. +* Forcing Redisplay:: Forcing redisplay. +* Truncation:: Folding or wrapping long text lines. +* The Echo Area:: Displaying messages at the bottom of the screen. +* Warnings:: Displaying warning messages for the user. +* Invisible Text:: Hiding part of the buffer text. +* Selective Display:: Hiding part of the buffer text (the old way). +* Temporary Displays:: Displays that go away automatically. +* Overlays:: Use overlays to highlight parts of the buffer. +* Width:: How wide a character or string is on the screen. +* Line Height:: Controlling the height of lines. +* Faces:: A face defines a graphics style + for text characters: font, colors, etc. +* Fringes:: Controlling window fringes. +* Scroll Bars:: Controlling vertical scroll bars. +* Display Property:: Enabling special display features. +* Images:: Displaying images in Emacs buffers. +* Buttons:: Adding clickable buttons to Emacs buffers. +* Abstract Display:: Emacs' Widget for Object Collections. +* Blinking:: How Emacs shows the matching open parenthesis. +* Usual Display:: The usual conventions for displaying nonprinting chars. +* Display Tables:: How to specify other conventions. +* Beeping:: Audible signal to the user. +* Window Systems:: Which window system is being used. + +The Echo Area + +* Displaying Messages:: Explicitly displaying text in the echo area. +* Progress:: Informing user about progress of a long operation. +* Logging Messages:: Echo area messages are logged for the user. +* Echo Area Customization:: Controlling the echo area. + +Reporting Warnings + +* Warning Basics:: Warnings concepts and functions to report them. +* Warning Variables:: Variables programs bind to customize their warnings. +* Warning Options:: Variables users set to control display of warnings. + +Overlays + +* Managing Overlays:: Creating and moving overlays. +* Overlay Properties:: How to read and set properties. + What properties do to the screen display. +* Finding Overlays:: Searching for overlays. + +Faces + +* Defining Faces:: How to define a face with @code{defface}. +* Face Attributes:: What is in a face? +* Attribute Functions:: Functions to examine and set face attributes. +* Displaying Faces:: How Emacs combines the faces specified for + a character. +* Font Selection:: Finding the best available font for a face. +* Face Functions:: How to define and examine faces. +* Auto Faces:: Hook for automatic face assignment. +* Font Lookup:: Looking up the names of available fonts + and information about them. +* Fontsets:: A fontset is a collection of fonts + that handle a range of character sets. + +Fringes + +* Fringe Size/Pos:: Specifying where to put the window fringes. +* Fringe Indicators:: Displaying indicator icons in the window fringes. +* Fringe Cursors:: Displaying cursors in the right fringe. +* Fringe Bitmaps:: Specifying bitmaps for fringe indicators. +* Customizing Bitmaps:: Specifying your own bitmaps to use in the fringes. +* Overlay Arrow:: Display of an arrow to indicate position. + +The @code{display} Property + +* Specified Space:: Displaying one space with a specified width. +* Pixel Specification:: Specifying space width or height in pixels. +* Other Display Specs:: Displaying an image; magnifying text; moving it + up or down on the page; adjusting the width + of spaces within text. +* Display Margins:: Displaying text or images to the side of + the main text. + +Images + +* Image Descriptors:: How to specify an image for use in @code{:display}. +* XBM Images:: Special features for XBM format. +* XPM Images:: Special features for XPM format. +* GIF Images:: Special features for GIF format. +* PostScript Images:: Special features for PostScript format. +* Other Image Types:: Various other formats are supported. +* Defining Images:: Convenient ways to define an image for later use. +* Showing Images:: Convenient ways to display an image once + it is defined. +* Image Cache:: Internal mechanisms of image display. + +Buttons + +* Button Properties:: Button properties with special meanings. +* Button Types:: Defining common properties for classes of buttons. +* Making Buttons:: Adding buttons to Emacs buffers. +* Manipulating Buttons:: Getting and setting properties of buttons. +* Button Buffer Commands:: Buffer-wide commands and bindings for buttons. + +Abstract Display + +* Abstract Display Functions:: Functions in the Ewoc package. +* Abstract Display Example:: Example of using Ewoc. + +Display Tables + +* Display Table Format:: What a display table consists of. +* Active Display Table:: How Emacs selects a display table to use. +* Glyphs:: How to define a glyph, and what glyphs mean. + +Operating System Interface + +* Starting Up:: Customizing Emacs start-up processing. +* Getting Out:: How exiting works (permanent or temporary). +* System Environment:: Distinguish the name and kind of system. +* User Identification:: Finding the name and user id of the user. +* Time of Day:: Getting the current time. +* Time Conversion:: Converting a time from numeric form to a string, or + to calendrical data (or vice versa). +* Time Parsing:: Converting a time from numeric form to text + and vice versa. +* Processor Run Time:: Getting the run time used by Emacs. +* Time Calculations:: Adding, subtracting, comparing times, etc. +* Timers:: Setting a timer to call a function at a certain time. +* Idle Timers:: Setting a timer to call a function when Emacs has + been idle for a certain length of time. +* Terminal Input:: Accessing and recording terminal input. +* Terminal Output:: Controlling and recording terminal output. +* Sound Output:: Playing sounds on the computer's speaker. +* X11 Keysyms:: Operating on key symbols for X Windows +* Batch Mode:: Running Emacs without terminal interaction. +* Session Management:: Saving and restoring state with X Session Management. + +Starting Up Emacs + +* Startup Summary:: Sequence of actions Emacs performs at start-up. +* Init File:: Details on reading the init file (@file{.emacs}). +* Terminal-Specific:: How the terminal-specific Lisp file is read. +* Command-Line Arguments:: How command-line arguments are processed, + and how you can customize them. + +Getting Out of Emacs + +* Killing Emacs:: Exiting Emacs irreversibly. +* Suspending Emacs:: Exiting Emacs reversibly. + +Terminal Input + +* Input Modes:: Options for how input is processed. +* Recording Input:: Saving histories of recent or all input events. + +Tips and Conventions + +* Coding Conventions:: Conventions for clean and robust programs. +* Key Binding Conventions:: Which keys should be bound by which programs. +* Programming Tips:: Making Emacs code fit smoothly in Emacs. +* Compilation Tips:: Making compiled code run fast. +* Warning Tips:: Turning off compiler warnings. +* Documentation Tips:: Writing readable documentation strings. +* Comment Tips:: Conventions for writing comments. +* Library Headers:: Standard headers for library packages. + +GNU Emacs Internals + +* Building Emacs:: How the dumped Emacs is made. +* Pure Storage:: A kludge to make preloaded Lisp functions sharable. +* Garbage Collection:: Reclaiming space for Lisp objects no longer used. +* Memory Usage:: Info about total size of Lisp objects made so far. +* Writing Emacs Primitives:: Writing C code for Emacs. +* Object Internals:: Data formats of buffers, windows, processes. + +Object Internals + +* Buffer Internals:: Components of a buffer structure. +* Window Internals:: Components of a window structure. +* Process Internals:: Components of a process structure. +@end detailmenu +@end menu + +@include intro.texi +@include objects.texi +@include numbers.texi +@include strings.texi + +@include lists.texi +@include sequences.texi +@include hash.texi +@include symbols.texi +@include eval.texi + +@include control.texi +@include variables.texi +@include functions.texi +@include macros.texi + +@include customize.texi +@include loading.texi +@include compile.texi +@include advice.texi + +@include debugging.texi +@include streams.texi +@include minibuf.texi +@include commands.texi + +@include keymaps.texi +@include modes.texi +@include help.texi +@include files.texi + +@include backups.texi +@include buffers.texi +@include windows.texi +@include frames.texi + +@include positions.texi +@include markers.texi +@include text.texi +@include nonascii.texi + +@include searching.texi +@include syntax.texi +@include abbrevs.texi +@include processes.texi + +@include display.texi +@include os.texi + +@c MOVE to Emacs Manual: include misc-modes.texi + +@c appendices + +@c REMOVE this: include non-hacker.texi + +@include anti.texi +@include doclicense.texi +@include gpl.texi +@include tips.texi +@include internals.texi +@include errors.texi +@include locals.texi +@include maps.texi +@include hooks.texi + +@include index.texi + +@ignore +@node New Symbols, , Index, Top +@unnumbered New Symbols Since the Previous Edition + +@printindex tp +@end ignore + +@bye + + +These words prevent "local variables" above from confusing Emacs. + +@ignore + arch-tag: f7e9a219-a0e1-4776-b631-08eaa1d49b34 +@end ignore diff --git a/doc/lispref/errors.texi b/doc/lispref/errors.texi new file mode 100644 index 00000000000..af2df791c39 --- /dev/null +++ b/doc/lispref/errors.texi @@ -0,0 +1,209 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/errors +@node Standard Errors, Standard Buffer-Local Variables, GNU Emacs Internals, Top +@appendix Standard Errors +@cindex 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 +@code{error-message} property of the symbol) and a cross reference to a +description of how the error can occur. + + Each error symbol has an @code{error-conditions} property that is a +list of symbols. Normally this list includes the error symbol itself +and the symbol @code{error}. Occasionally it includes additional +symbols, which are intermediate classifications, narrower than +@code{error} but broader than a single error symbol. For example, all +the errors in accessing files have the condition @code{file-error}. If +we do not say here that a certain error symbol has additional error +conditions, that means it has none. + + As a special exception, the error symbol @code{quit} does not have the +condition @code{error}, because quitting is not considered an error. + + @xref{Errors}, for an explanation of how errors are generated and +handled. + +@table @code +@item @var{symbol} +@var{string}; @var{reference}. + +@item error +@code{"error"}@* +@xref{Errors}. + +@item quit +@code{"Quit"}@* +@xref{Quitting}. + +@item args-out-of-range +@code{"Args out of range"}@* +This happens when trying to access an element beyond the range of a +sequence or buffer.@* +@xref{Sequences Arrays Vectors}, @xref{Text}. + +@item arith-error +@code{"Arithmetic error"}@* +@xref{Arithmetic Operations}. + +@item beginning-of-buffer +@code{"Beginning of buffer"}@* +@xref{Character Motion}. + +@item buffer-read-only +@code{"Buffer is read-only"}@* +@xref{Read Only Buffers}. + +@item coding-system-error +@code{"Invalid coding system"}@* +@xref{Lisp and Coding Systems}. + +@item cyclic-function-indirection +@code{"Symbol's chain of function indirections\@* contains a loop"}@* +@xref{Function Indirection}. + +@item cyclic-variable-indirection +@code{"Symbol's chain of variable indirections\@* contains a loop"}@* +@xref{Variable Aliases}. + +@item end-of-buffer +@code{"End of buffer"}@* +@xref{Character Motion}. + +@item end-of-file +@code{"End of file during parsing"}@* +Note that this is not a subcategory of @code{file-error}, +because it pertains to the Lisp reader, not to file I/O.@* +@xref{Input Functions}. + +@item file-already-exists +This is a subcategory of @code{file-error}.@* +@xref{Writing to Files}. + +@item file-date-error +This is a subcategory of @code{file-error}. It occurs when +@code{copy-file} tries and fails to set the last-modification time of +the output file.@* +@xref{Changing Files}. + +@item file-error +We do not list the error-strings of this error and its subcategories, +because the error message is normally constructed from the data items +alone when the error condition @code{file-error} is present. Thus, +the error-strings are not very relevant. However, these error symbols +do have @code{error-message} properties, and if no data is provided, +the @code{error-message} property @emph{is} used.@* +@xref{Files}. + +@item file-locked +This is a subcategory of @code{file-error}.@* +@xref{File Locks}. + +@item file-supersession +This is a subcategory of @code{file-error}.@* +@xref{Modification Time}. + +@item ftp-error +This is a subcategory of @code{file-error}, which results from problems +in accessing a remote file using ftp.@* +@xref{Remote Files,,, emacs, The GNU Emacs Manual}. + +@item invalid-function +@code{"Invalid function"}@* +@xref{Function Indirection}. + +@item invalid-read-syntax +@code{"Invalid read syntax"}@* +@xref{Printed Representation}. + +@item invalid-regexp +@code{"Invalid regexp"}@* +@xref{Regular Expressions}. + +@item mark-inactive +@code{"The mark is not active now"}@* +@xref{The Mark}. + +@item no-catch +@code{"No catch for tag"}@* +@xref{Catch and Throw}. + +@item scan-error +@code{"Scan error"}@* +This happens when certain syntax-parsing functions +find invalid syntax or mismatched parentheses.@* +@xref{List Motion}, and @ref{Parsing Expressions}. + +@item search-failed +@code{"Search failed"}@* +@xref{Searching and Matching}. + +@item setting-constant +@code{"Attempt to set a constant symbol"}@* +The values of the symbols @code{nil} and @code{t}, +and any symbols that start with @samp{:}, +may not be changed.@* +@xref{Constant Variables, , Variables that Never Change}. + +@item text-read-only +@code{"Text is read-only"}@* +This is a subcategory of @code{buffer-read-only}.@* +@xref{Special Properties}. + +@item undefined-color +@code{"Undefined color"}@* +@xref{Color Names}. + +@item void-function +@code{"Symbol's function definition is void"}@* +@xref{Function Cells}. + +@item void-variable +@code{"Symbol's value as variable is void"}@* +@xref{Accessing Variables}. + +@item wrong-number-of-arguments +@code{"Wrong number of arguments"}@* +@xref{Classifying Lists}. + +@item wrong-type-argument +@code{"Wrong type argument"}@* +@xref{Type Predicates}. +@end table + + These kinds of error, which are classified as special cases of +@code{arith-error}, can occur on certain systems for invalid use of +mathematical functions. + +@table @code +@item domain-error +@code{"Arithmetic domain error"}@* +@xref{Math Functions}. + +@item overflow-error +@code{"Arithmetic overflow error"}@* +This is a subcategory of @code{domain-error}.@* +@xref{Math Functions}. + +@item range-error +@code{"Arithmetic range error"}@* +@xref{Math Functions}. + +@item singularity-error +@code{"Arithmetic singularity error"}@* +This is a subcategory of @code{domain-error}.@* +@xref{Math Functions}. + +@item underflow-error +@code{"Arithmetic underflow error"}@* +This is a subcategory of @code{domain-error}.@* +@xref{Math Functions}. +@end table + +@ignore + arch-tag: 717c6048-5d9d-4c7d-9a62-df57390b6f19 +@end ignore diff --git a/doc/lispref/eval.texi b/doc/lispref/eval.texi new file mode 100644 index 00000000000..772f502553c --- /dev/null +++ b/doc/lispref/eval.texi @@ -0,0 +1,758 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998, 2001, 2002, 2003, +@c 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/eval +@node Evaluation, Control Structures, Symbols, Top +@chapter Evaluation +@cindex evaluation +@cindex interpreter +@cindex interpreter +@cindex value of expression + + The @dfn{evaluation} of expressions in Emacs Lisp is performed by the +@dfn{Lisp interpreter}---a program that receives a Lisp object as input +and computes its @dfn{value as an expression}. How it does this depends +on the data type of the object, according to 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 @code{eval}. + +@ifnottex +@menu +* Intro Eval:: Evaluation in the scheme of things. +* Forms:: How various sorts of objects are evaluated. +* Quoting:: Avoiding evaluation (to put constants in the program). +* Eval:: How to invoke the Lisp interpreter explicitly. +@end menu + +@node Intro Eval +@section Introduction to Evaluation + + The Lisp interpreter, or evaluator, is the program that computes +the value of an expression that 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. +@end ifnottex + +@cindex forms +@cindex expression + A Lisp object that is intended for evaluation is called an +@dfn{expression} or a @dfn{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 @code{read} whether this +object is a form to be evaluated, or serves some entirely different +purpose. @xref{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 active keymaps, and then +uses @code{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. +@xref{Command Loop}. + +@cindex recursive evaluation + Evaluation is a recursive process. That is, evaluation of a form may +call @code{eval} 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 @code{(car x)}: the subform @code{x} must first be evaluated +recursively, so that its value can be passed as an argument to the +function @code{car}. + + Evaluation of a function call ultimately calls the function specified +in it. @xref{Functions}. The execution of the function may itself work +by evaluating the function definition; or the function may be a Lisp +primitive implemented in C, or it may be a byte-compiled function +(@pxref{Byte Compilation}). + +@cindex environment + The evaluation of forms takes place in a context called the +@dfn{environment}, which consists of the current values and bindings of +all Lisp variables.@footnote{This definition of ``environment'' is +specifically not intended to include all the data that can affect the +result of a program.} Whenever a form refers to a variable without +creating a new binding for it, the value of the variable's binding in +the current environment is used. @xref{Variables}. + +@cindex side effect + Evaluation of a form may create new environments for recursive +evaluation by binding variables (@pxref{Local Variables}). These +environments are temporary and vanish by the time evaluation of the form +is complete. The form may also make changes that persist; these changes +are called @dfn{side effects}. An example of a form that produces side +effects is @code{(setq foo 1)}. + + The details of what evaluation means for each kind of form are +described below (@pxref{Forms}). + +@node Forms +@section Kinds of Forms + + A Lisp object that is intended to be evaluated is called a @dfn{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.'' This section describes all three kinds, one by +one, starting with the ``all other types'' which are self-evaluating +forms. + +@menu +* Self-Evaluating Forms:: Forms that evaluate to themselves. +* Symbol Forms:: Symbols evaluate as variables. +* Classifying Lists:: How to distinguish various sorts of list forms. +* Function Indirection:: When a symbol appears as the car of a list, + we find the real function via the symbol. +* Function Forms:: Forms that call functions. +* Macro Forms:: Forms that call macros. +* Special Forms:: "Special forms" are idiosyncratic primitives, + most of them extremely important. +* Autoloading:: Functions set up to load files + containing their real definitions. +@end menu + +@node Self-Evaluating Forms +@subsection Self-Evaluating Forms +@cindex vector evaluation +@cindex literal evaluation +@cindex self-evaluating form + + A @dfn{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 @code{"foo"} evaluates to the string @code{"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. + +@example +@group +'123 ; @r{A number, shown without evaluation.} + @result{} 123 +@end group +@group +123 ; @r{Evaluated as usual---result is the same.} + @result{} 123 +@end group +@group +(eval '123) ; @r{Evaluated ``by hand''---result is the same.} + @result{} 123 +@end group +@group +(eval (eval '123)) ; @r{Evaluating twice changes nothing.} + @result{} 123 +@end group +@end example + + 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 there's no way to write them textually. It is possible +to construct Lisp expressions containing these types by means of a Lisp +program. Here is an example: + +@example +@group +;; @r{Build an expression containing a buffer object.} +(setq print-exp (list 'print (current-buffer))) + @result{} (print #<buffer eval.texi>) +@end group +@group +;; @r{Evaluate it.} +(eval print-exp) + @print{} #<buffer eval.texi> + @result{} #<buffer eval.texi> +@end group +@end example + +@node Symbol Forms +@subsection Symbol Forms +@cindex symbol evaluation + + 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 @ref{Variables}. + + In the following example, we set the value of a symbol with +@code{setq}. Then we evaluate the symbol, and get back the value that +@code{setq} stored. + +@example +@group +(setq a 123) + @result{} 123 +@end group +@group +(eval 'a) + @result{} 123 +@end group +@group +a + @result{} 123 +@end group +@end example + + The symbols @code{nil} and @code{t} are treated specially, so that the +value of @code{nil} is always @code{nil}, and the value of @code{t} is +always @code{t}; you cannot set or bind them to any other values. Thus, +these two symbols act like self-evaluating forms, even though +@code{eval} treats them like any other symbol. A symbol whose name +starts with @samp{:} also self-evaluates in the same way; likewise, +its value ordinarily cannot be changed. @xref{Constant Variables}. + +@node Classifying Lists +@subsection Classification of List Forms +@cindex list form evaluation + + 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 +remaining list elements constitute the @dfn{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 +@emph{not} evaluated, as it would be in some Lisp dialects such as +Scheme. + +@node Function Indirection +@subsection Symbol Function Indirection +@cindex symbol function indirection +@cindex indirection for functions +@cindex void function + + If the first element of the list is a symbol then evaluation examines +the symbol's function cell, and uses its contents instead of the +original symbol. If the contents are another symbol, this process, +called @dfn{symbol function indirection}, is repeated until it obtains a +non-symbol. @xref{Function Names}, for more information about using a +symbol as a name for a function stored in the function cell of the +symbol. + + 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, in which case the subroutine +@code{symbol-function} signals a @code{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. + +@kindex invalid-function + More precisely, we should now have a Lisp function (a lambda +expression), a byte-code function, 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 @code{invalid-function} is signaled. + + The following example illustrates the symbol indirection process. We +use @code{fset} to set the function cell of a symbol and +@code{symbol-function} to get the function cell contents +(@pxref{Function Cells}). Specifically, we store the symbol @code{car} +into the function cell of @code{first}, and the symbol @code{first} into +the function cell of @code{erste}. + +@smallexample +@group +;; @r{Build this function cell linkage:} +;; ------------- ----- ------- ------- +;; | #<subr car> | <-- | car | <-- | first | <-- | erste | +;; ------------- ----- ------- ------- +@end group +@end smallexample + +@smallexample +@group +(symbol-function 'car) + @result{} #<subr car> +@end group +@group +(fset 'first 'car) + @result{} car +@end group +@group +(fset 'erste 'first) + @result{} first +@end group +@group +(erste '(1 2 3)) ; @r{Call the function referenced by @code{erste}.} + @result{} 1 +@end group +@end smallexample + + 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. + +@smallexample +@group +((lambda (arg) (erste arg)) + '(1 2 3)) + @result{} 1 +@end group +@end smallexample + +@noindent +Executing the function itself evaluates its body; this does involve +symbol function indirection when calling @code{erste}. + + The built-in function @code{indirect-function} provides an easy way to +perform symbol function indirection explicitly. + +@c Emacs 19 feature +@defun indirect-function function &optional noerror +@anchor{Definition of indirect-function} +This function returns the meaning of @var{function} as a function. If +@var{function} is a symbol, then it finds @var{function}'s function +definition and starts over with that value. If @var{function} is not a +symbol, then it returns @var{function} itself. + +This function signals a @code{void-function} error if the final symbol +is unbound and optional argument @var{noerror} is @code{nil} or +omitted. Otherwise, if @var{noerror} is non-@code{nil}, it returns +@code{nil} if the final symbol is unbound. + +It signals a @code{cyclic-function-indirection} error if there is a +loop in the chain of symbols. + +Here is how you could define @code{indirect-function} in Lisp: + +@smallexample +(defun indirect-function (function) + (if (symbolp function) + (indirect-function (symbol-function function)) + function)) +@end smallexample +@end defun + +@node Function Forms +@subsection Evaluation of Function Forms +@cindex function form evaluation +@cindex function call + + If the first element of a list being evaluated is a Lisp function +object, byte-code object or primitive function object, then that list is +a @dfn{function call}. For example, here is a call to the function +@code{+}: + +@example +(+ 1 x) +@end example + + The first step in evaluating a function call is to evaluate the +remaining elements of the list from left to right. The results are the +actual argument values, one value for each list element. The next step +is to call the function with this list of arguments, effectively using +the function @code{apply} (@pxref{Calling Functions}). If the function +is written in Lisp, the arguments are used to bind the argument +variables of the function (@pxref{Lambda Expressions}); then the forms +in the function body are evaluated in order, and the value of the last +body form becomes the value of the function call. + +@node Macro Forms +@subsection Lisp Macro Evaluation +@cindex macro call evaluation + + If the first element of a list being evaluated is a macro object, then +the list is a @dfn{macro call}. When a macro call is evaluated, the +elements of the rest of the list are @emph{not} initially evaluated. +Instead, these elements themselves are used as the arguments of the +macro. The macro definition computes a replacement form, called the +@dfn{expansion} of the macro, to be 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. + + Ordinary evaluation of a macro call finishes by evaluating the +expansion. However, the macro expansion is not necessarily evaluated +right away, or at all, because other programs also expand macro calls, +and they may or may not evaluate the expansions. + + 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 computed when the expansion is evaluated. + + For example, given a macro defined as follows: + +@example +@group +(defmacro cadr (x) + (list 'car (list 'cdr x))) +@end group +@end example + +@noindent +an expression such as @code{(cadr (assq 'handler list))} is a macro +call, and its expansion is: + +@example +(car (cdr (assq 'handler list))) +@end example + +@noindent +Note that the argument @code{(assq 'handler list)} appears in the +expansion. + +@xref{Macros}, for a complete description of Emacs Lisp macros. + +@node Special Forms +@subsection Special Forms +@cindex special form evaluation + + A @dfn{special form} is a primitive function specially marked so that +its arguments are not all evaluated. Most 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. + +@table @code +@item and +@pxref{Combining Conditions} + +@item catch +@pxref{Catch and Throw} + +@item cond +@pxref{Conditionals} + +@item condition-case +@pxref{Handling Errors} + +@item defconst +@pxref{Defining Variables} + +@item defmacro +@pxref{Defining Macros} + +@item defun +@pxref{Defining Functions} + +@item defvar +@pxref{Defining Variables} + +@item function +@pxref{Anonymous Functions} + +@item if +@pxref{Conditionals} + +@item interactive +@pxref{Interactive Call} + +@item let +@itemx let* +@pxref{Local Variables} + +@item or +@pxref{Combining Conditions} + +@item prog1 +@itemx prog2 +@itemx progn +@pxref{Sequencing} + +@item quote +@pxref{Quoting} + +@item save-current-buffer +@pxref{Current Buffer} + +@item save-excursion +@pxref{Excursions} + +@item save-restriction +@pxref{Narrowing} + +@item save-window-excursion +@pxref{Window Configurations} + +@item setq +@pxref{Setting Variables} + +@item setq-default +@pxref{Creating Buffer-Local} + +@item track-mouse +@pxref{Mouse Tracking} + +@item unwind-protect +@pxref{Nonlocal Exits} + +@item while +@pxref{Iteration} + +@item with-output-to-temp-buffer +@pxref{Temporary Displays} +@end table + +@cindex CL note---special forms compared +@quotation +@b{Common Lisp note:} Here are some comparisons of special forms in +GNU Emacs Lisp and Common Lisp. @code{setq}, @code{if}, and +@code{catch} are special forms in both Emacs Lisp and Common Lisp. +@code{defun} is a special form in Emacs Lisp, but a macro in Common +Lisp. @code{save-excursion} is a special form in Emacs Lisp, but +doesn't exist in Common Lisp. @code{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).@refill +@end quotation + +@node Autoloading +@subsection Autoloading + + The @dfn{autoload} feature allows you to call a function or macro +whose function definition has not yet been loaded into Emacs. It +specifies which file contains the definition. When an autoload object +appears as a symbol's function definition, calling that symbol as a +function automatically loads the specified file; then it calls the real +definition loaded from that file. @xref{Autoload}. + +@node Quoting +@section Quoting + + The special form @code{quote} returns its single argument, as written, +without evaluating it. This provides a way to include constant symbols +and lists, which are not self-evaluating objects, in a program. (It is +not necessary to quote self-evaluating objects such as numbers, strings, +and vectors.) + +@defspec quote object +This special form returns @var{object}, without evaluating it. +@end defspec + +@cindex @samp{'} for quoting +@cindex quoting using apostrophe +@cindex apostrophe for quoting +Because @code{quote} is used so often in programs, Lisp provides a +convenient read syntax for it. An apostrophe character (@samp{'}) +followed by a Lisp object (in read syntax) expands to a list whose first +element is @code{quote}, and whose second element is the object. Thus, +the read syntax @code{'x} is an abbreviation for @code{(quote x)}. + +Here are some examples of expressions that use @code{quote}: + +@example +@group +(quote (+ 1 2)) + @result{} (+ 1 2) +@end group +@group +(quote foo) + @result{} foo +@end group +@group +'foo + @result{} foo +@end group +@group +''foo + @result{} (quote foo) +@end group +@group +'(quote foo) + @result{} (quote foo) +@end group +@group +['foo] + @result{} [(quote foo)] +@end group +@end example + + Other quoting constructs include @code{function} (@pxref{Anonymous +Functions}), which causes an anonymous lambda expression written in Lisp +to be compiled, and @samp{`} (@pxref{Backquote}), which is used to quote +only part of a list, while computing and substituting other parts. + +@node Eval +@section 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 +after reading a form from text being edited or getting one from a +property list. On these occasions, use the @code{eval} function. + + The functions and variables described in this section evaluate forms, +specify limits to the evaluation process, or record recently returned +values. Loading a file also does evaluation (@pxref{Loading}). + + It is generally cleaner and more flexible to store a function in a +data structure, and call it with @code{funcall} or @code{apply}, than +to store an expression in the data structure and evaluate it. Using +functions provides the ability to pass information to them as +arguments. + +@defun eval form +This is the basic function evaluating an expression. It evaluates +@var{form} in the current environment and returns the result. How the +evaluation proceeds depends on the type of the object (@pxref{Forms}). + +Since @code{eval} is a function, the argument expression that appears +in a call to @code{eval} is evaluated twice: once as preparation before +@code{eval} is called, and again by the @code{eval} function itself. +Here is an example: + +@example +@group +(setq foo 'bar) + @result{} bar +@end group +@group +(setq bar 'baz) + @result{} baz +;; @r{Here @code{eval} receives argument @code{foo}} +(eval 'foo) + @result{} bar +;; @r{Here @code{eval} receives argument @code{bar}, which is the value of @code{foo}} +(eval foo) + @result{} baz +@end group +@end example + +The number of currently active calls to @code{eval} is limited to +@code{max-lisp-eval-depth} (see below). +@end defun + +@deffn Command eval-region start end &optional stream read-function +@anchor{Definition of eval-region} +This function evaluates the forms in the current buffer in the region +defined by the positions @var{start} and @var{end}. It reads forms from +the region and calls @code{eval} on them until the end of the region is +reached, or until an error is signaled and not handled. + +By default, @code{eval-region} does not produce any output. However, +if @var{stream} is non-@code{nil}, any output produced by output +functions (@pxref{Output Functions}), as well as the values that +result from evaluating the expressions in the region are printed using +@var{stream}. @xref{Output Streams}. + +If @var{read-function} is non-@code{nil}, it should be a function, +which is used instead of @code{read} to read expressions one by one. +This function is called with one argument, the stream for reading +input. You can also use the variable @code{load-read-function} +(@pxref{Definition of load-read-function,, How Programs Do Loading}) +to specify this function, but it is more robust to use the +@var{read-function} argument. + +@code{eval-region} does not move point. It always returns @code{nil}. +@end deffn + +@cindex evaluation of buffer contents +@deffn Command eval-buffer &optional buffer-or-name stream filename unibyte print +This is similar to @code{eval-region}, but the arguments provide +different optional features. @code{eval-buffer} operates on the +entire accessible portion of buffer @var{buffer-or-name}. +@var{buffer-or-name} can be a buffer, a buffer name (a string), or +@code{nil} (or omitted), which means to use the current buffer. +@var{stream} is used as in @code{eval-region}, unless @var{stream} is +@code{nil} and @var{print} non-@code{nil}. In that case, values that +result from evaluating the expressions are still discarded, but the +output of the output functions is printed in the echo area. +@var{filename} is the file name to use for @code{load-history} +(@pxref{Unloading}), and defaults to @code{buffer-file-name} +(@pxref{Buffer File Name}). If @var{unibyte} is non-@code{nil}, +@code{read} converts strings to unibyte whenever possible. + +@findex eval-current-buffer +@code{eval-current-buffer} is an alias for this command. +@end deffn + +@defvar max-lisp-eval-depth +@anchor{Definition of max-lisp-eval-depth} +This variable defines the maximum depth allowed in calls to @code{eval}, +@code{apply}, and @code{funcall} before an error is signaled (with error +message @code{"Lisp nesting exceeds max-lisp-eval-depth"}). + +This limit, with the associated error when it is exceeded, is one way +Emacs Lisp avoids infinite recursion on an ill-defined function. If +you increase the value of @code{max-lisp-eval-depth} too much, such +code can cause stack overflow instead. +@cindex Lisp nesting error + +The depth limit counts internal uses of @code{eval}, @code{apply}, and +@code{funcall}, such as for calling the functions mentioned in Lisp +expressions, and recursive evaluation of function call arguments and +function body forms, as well as explicit calls in Lisp code. + +The default value of this variable is 300. If you set it to a value +less than 100, Lisp will reset it to 100 if the given value is reached. +Entry to the Lisp debugger increases the value, if there is little room +left, to make sure the debugger itself has room to execute. + +@code{max-specpdl-size} provides another limit on nesting. +@xref{Definition of max-specpdl-size,, Local Variables}. +@end defvar + +@defvar values +The value of this variable is a list of the values returned by all the +expressions that were read, evaluated, and printed from buffers +(including the minibuffer) by the standard Emacs commands which do +this. (Note that this does @emph{not} include evaluation in +@samp{*ielm*} buffers, nor evaluation using @kbd{C-j} in +@code{lisp-interaction-mode}.) The elements are ordered most recent +first. + +@example +@group +(setq x 1) + @result{} 1 +@end group +@group +(list 'A (1+ 2) auto-save-default) + @result{} (A 3 t) +@end group +@group +values + @result{} ((A 3 t) 1 @dots{}) +@end group +@end example + +This variable is useful for referring back to values of forms recently +evaluated. It is generally a bad idea to print the value of +@code{values} itself, since this may be very long. Instead, examine +particular elements, like this: + +@example +@group +;; @r{Refer to the most recent evaluation result.} +(nth 0 values) + @result{} (A 3 t) +@end group +@group +;; @r{That put a new element on,} +;; @r{so all elements move back one.} +(nth 1 values) + @result{} (A 3 t) +@end group +@group +;; @r{This gets the element that was next-to-most-recent} +;; @r{before this example.} +(nth 3 values) + @result{} 1 +@end group +@end example +@end defvar + +@ignore + arch-tag: f723a4e0-31b3-453f-8afc-0bf8fd276d57 +@end ignore diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi new file mode 100644 index 00000000000..bfcbe476f95 --- /dev/null +++ b/doc/lispref/files.texi @@ -0,0 +1,3108 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/files +@node Files, Backups and Auto-Saving, Documentation, Top +@comment node-name, next, previous, up +@chapter 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 +@ref{Buffers}, and those related to backups and auto-saving are +described in @ref{Backups and Auto-Saving}. + + Many of the file functions take one or more arguments that are file +names. A file name is actually a string. Most of these functions +expand file name arguments by calling @code{expand-file-name}, so that +@file{~} is handled correctly, as are relative file names (including +@samp{../}). These functions don't recognize environment variable +substitutions such as @samp{$HOME}. @xref{File Name Expansion}. + + When file I/O functions signal Lisp errors, they usually use the +condition @code{file-error} (@pxref{Handling Errors}). The error +message is in most cases obtained from the operating system, according +to locale @code{system-message-locale}, and decoded using coding system +@code{locale-coding-system} (@pxref{Locales}). + +@menu +* Visiting Files:: Reading files into Emacs buffers for editing. +* Saving Buffers:: Writing changed buffers back into files. +* Reading from Files:: Reading files into buffers without visiting. +* Writing to Files:: Writing new files from parts of buffers. +* File Locks:: Locking and unlocking files, to prevent + simultaneous editing by two people. +* Information about Files:: Testing existence, accessibility, size of files. +* Changing Files:: Renaming files, changing protection, etc. +* File Names:: Decomposing and expanding file names. +* Contents of Directories:: Getting a list of the files in a directory. +* Create/Delete Dirs:: Creating and Deleting Directories. +* Magic File Names:: Defining "magic" special handling + for certain file names. +* Format Conversion:: Conversion to and from various file formats. +@end menu + +@node Visiting Files +@section Visiting Files +@cindex finding files +@cindex visiting files + + Visiting a file means reading a file into a buffer. Once this is +done, we say that the buffer is @dfn{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 +@dfn{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 that 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. + +@menu +* Visiting Functions:: The usual interface functions for visiting. +* Subroutines of Visiting:: Lower-level subroutines that they use. +@end menu + +@node Visiting Functions +@subsection Functions for Visiting Files + + This section describes the functions normally used to visit files. +For historical reasons, these functions have names starting with +@samp{find-} rather than @samp{visit-}. @xref{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. + + In a Lisp program, if you want to look at the contents of a file but +not alter it, the fastest way is to use @code{insert-file-contents} in a +temporary buffer. Visiting the file is not necessary and takes longer. +@xref{Reading from Files}. + +@deffn Command find-file filename &optional wildcards +This command selects a buffer visiting the file @var{filename}, +using an existing buffer if there is one, and otherwise creating a +new buffer and reading the file into it. It also returns that buffer. + +Aside from some technical details, the body of the @code{find-file} +function is basically equivalent to: + +@smallexample +(switch-to-buffer (find-file-noselect filename nil nil wildcards)) +@end smallexample + +@noindent +(See @code{switch-to-buffer} in @ref{Displaying Buffers}.) + +If @var{wildcards} is non-@code{nil}, which is always true in an +interactive call, then @code{find-file} expands wildcard characters in +@var{filename} and visits all the matching files. + +When @code{find-file} is called interactively, it prompts for +@var{filename} in the minibuffer. +@end deffn + +@defun find-file-noselect filename &optional nowarn rawfile wildcards +This function is the guts of all the file-visiting functions. It +returns a buffer visiting the file @var{filename}. You may make the +buffer current or display it in a window if you wish, but this +function does not do so. + +The function returns an existing buffer if there is one; otherwise it +creates a new buffer and reads the file into it. When +@code{find-file-noselect} uses an existing buffer, it first verifies +that the file has not changed since it was last visited or saved in +that buffer. If the file has changed, this function asks the user +whether to reread the changed file. If the user says @samp{yes}, any +edits previously made in the buffer are lost. + +Reading the file involves decoding the file's contents (@pxref{Coding +Systems}), including end-of-line conversion, and format conversion +(@pxref{Format Conversion}). If @var{wildcards} is non-@code{nil}, +then @code{find-file-noselect} expands wildcard characters in +@var{filename} and visits all the matching files. + +This function displays warning or advisory messages in various peculiar +cases, unless the optional argument @var{nowarn} is non-@code{nil}. For +example, if it needs to create a buffer, and there is no file named +@var{filename}, it displays the message @samp{(New file)} in the echo +area, and leaves the buffer empty. + +The @code{find-file-noselect} function normally calls +@code{after-find-file} after reading the file (@pxref{Subroutines of +Visiting}). That 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 +@code{find-file-hook}. + +If the optional argument @var{rawfile} is non-@code{nil}, then +@code{after-find-file} is not called, and the +@code{find-file-not-found-functions} are not run in case of failure. +What's more, a non-@code{nil} @var{rawfile} value suppresses coding +system conversion and format conversion. + +The @code{find-file-noselect} function usually returns the buffer that +is visiting the file @var{filename}. But, if wildcards are actually +used and expanded, it returns a list of buffers that are visiting the +various files. + +@example +@group +(find-file-noselect "/etc/fstab") + @result{} #<buffer fstab> +@end group +@end example +@end defun + +@deffn Command find-file-other-window filename &optional wildcards +This command selects a buffer visiting the file @var{filename}, but +does so in a window other than the selected window. It may use another +existing window or split a window; see @ref{Displaying Buffers}. + +When this command is called interactively, it prompts for +@var{filename}. +@end deffn + +@deffn Command find-file-read-only filename &optional wildcards +This command selects a buffer visiting the file @var{filename}, like +@code{find-file}, but it marks the buffer as read-only. @xref{Read Only +Buffers}, for related functions and variables. + +When this command is called interactively, it prompts for +@var{filename}. +@end deffn + +@deffn Command view-file filename +This command visits @var{filename} using View mode, returning to the +previous buffer when you exit View mode. View mode is a minor mode that +provides commands to skim rapidly through the file, but does not let you +modify the text. Entering View mode runs the normal hook +@code{view-mode-hook}. @xref{Hooks}. + +When @code{view-file} is called interactively, it prompts for +@var{filename}. +@end deffn + +@defopt find-file-wildcards +If this variable is non-@code{nil}, then the various @code{find-file} +commands check for wildcard characters and visit all the files that +match them (when invoked interactively or when their @var{wildcards} +argument is non-@code{nil}). If this option is @code{nil}, then +the @code{find-file} commands ignore their @var{wildcards} argument +and never treat wildcard characters specially. +@end defopt + +@defvar find-file-hook +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. + +This variable is a normal hook. @xref{Hooks}. +@end defvar + +@defvar find-file-not-found-functions +The value of this variable is a list of functions to be called when +@code{find-file} or @code{find-file-noselect} is passed a nonexistent +file name. @code{find-file-noselect} calls these functions as soon as +it detects a nonexistent file. It calls them in the order of the list, +until one of them returns non-@code{nil}. @code{buffer-file-name} is +already set up. + +This is not a normal hook because the values of the functions are +used, and in many cases only some of the functions are called. +@end defvar + +@node Subroutines of Visiting +@comment node-name, next, previous, up +@subsection Subroutines of Visiting + + The @code{find-file-noselect} function uses two important subroutines +which are sometimes useful in user Lisp code: @code{create-file-buffer} +and @code{after-find-file}. This section explains how to use them. + +@defun create-file-buffer filename +This function creates a suitably named buffer for visiting +@var{filename}, and returns it. It uses @var{filename} (sans directory) +as the name if that name is free; otherwise, it appends a string such as +@samp{<2>} to get an unused name. See also @ref{Creating Buffers}. + +@strong{Please note:} @code{create-file-buffer} does @emph{not} +associate the new buffer with a file and does not select the buffer. +It also does not use the default major mode. + +@example +@group +(create-file-buffer "foo") + @result{} #<buffer foo> +@end group +@group +(create-file-buffer "foo") + @result{} #<buffer foo<2>> +@end group +@group +(create-file-buffer "foo") + @result{} #<buffer foo<3>> +@end group +@end example + +This function is used by @code{find-file-noselect}. +It uses @code{generate-new-buffer} (@pxref{Creating Buffers}). +@end defun + +@defun after-find-file &optional error warn noauto after-find-file-from-revert-buffer nomodes +This function sets the buffer major mode, and parses local variables +(@pxref{Auto Major Mode}). It is called by @code{find-file-noselect} +and by the default revert function (@pxref{Reverting}). + +@cindex new file message +@cindex file open error +If reading the file got an error because the file does not exist, but +its directory does exist, the caller should pass a non-@code{nil} value +for @var{error}. In that case, @code{after-find-file} issues a warning: +@samp{(New file)}. For more serious errors, the caller should usually not +call @code{after-find-file}. + +If @var{warn} is non-@code{nil}, then this function issues a warning +if an auto-save file exists and is more recent than the visited file. + +If @var{noauto} is non-@code{nil}, that says not to enable or disable +Auto-Save mode. The mode remains enabled if it was enabled before. + +If @var{after-find-file-from-revert-buffer} is non-@code{nil}, that +means this call was from @code{revert-buffer}. This has no direct +effect, but some mode functions and hook functions check the value +of this variable. + +If @var{nomodes} is non-@code{nil}, that means don't alter the buffer's +major mode, don't process local variables specifications in the file, +and don't run @code{find-file-hook}. This feature is used by +@code{revert-buffer} in some cases. + +The last thing @code{after-find-file} does is call all the functions +in the list @code{find-file-hook}. +@end defun + +@node Saving Buffers +@section Saving Buffers +@cindex 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 @dfn{save} the buffer, which +means copying the contents of the buffer into the file. + +@deffn 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. + +@code{save-buffer} is responsible for making backup files. Normally, +@var{backup-option} is @code{nil}, and @code{save-buffer} makes a backup +file only if this is the first save since visiting the file. Other +values for @var{backup-option} request the making of backup files in +other circumstances: + +@itemize @bullet +@item +With an argument of 4 or 64, reflecting 1 or 3 @kbd{C-u}'s, the +@code{save-buffer} function marks this version of the file to be +backed up when the buffer is next saved. + +@item +With an argument of 16 or 64, reflecting 2 or 3 @kbd{C-u}'s, the +@code{save-buffer} function unconditionally backs up the previous +version of the file before saving it. + +@item +With an argument of 0, unconditionally do @emph{not} make any backup file. +@end itemize +@end deffn + +@deffn Command save-some-buffers &optional save-silently-p pred +@anchor{Definition of save-some-buffers} +This command saves some modified file-visiting buffers. Normally it +asks the user about each buffer. But if @var{save-silently-p} is +non-@code{nil}, it saves all the file-visiting buffers without querying +the user. + +The optional @var{pred} argument controls which buffers to ask about +(or to save silently if @var{save-silently-p} is non-@code{nil}). +If it is @code{nil}, that means to ask only about file-visiting buffers. +If it is @code{t}, that means also offer to save certain other non-file +buffers---those that have a non-@code{nil} buffer-local value of +@code{buffer-offer-save} (@pxref{Killing Buffers}). A user who says +@samp{yes} to saving a non-file buffer is asked to specify the file +name to use. The @code{save-buffers-kill-emacs} function passes the +value @code{t} for @var{pred}. + +If @var{pred} is neither @code{t} nor @code{nil}, then it should be +a function of no arguments. It will be called in each buffer to decide +whether to offer to save that buffer. If it returns a non-@code{nil} +value in a certain buffer, that means do offer to save that buffer. +@end deffn + +@deffn Command write-file filename &optional confirm +@anchor{Definition of write-file} +This function writes the current buffer into file @var{filename}, makes +the buffer visit that file, and marks it not modified. Then it renames +the buffer based on @var{filename}, appending a string like @samp{<2>} +if necessary to make a unique buffer name. It does most of this work by +calling @code{set-visited-file-name} (@pxref{Buffer File Name}) and +@code{save-buffer}. + +If @var{confirm} is non-@code{nil}, that means to ask for confirmation +before overwriting an existing file. Interactively, confirmation is +required, unless the user supplies a prefix argument. + +If @var{filename} is an existing directory, or a symbolic link to one, +@code{write-file} uses the name of the visited file, in directory +@var{filename}. If the buffer is not visiting a file, it uses the +buffer name instead. +@end deffn + + Saving a buffer runs several hooks. It also performs format +conversion (@pxref{Format Conversion}). + +@defvar write-file-functions +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-@code{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 a function in @code{write-file-functions} returns non-@code{nil}, it +is responsible for making a backup file (if that is appropriate). +To do so, execute the following code: + +@example +(or buffer-backed-up (backup-buffer)) +@end example + +You might wish to save the file modes value returned by +@code{backup-buffer} and use that (if non-@code{nil}) to set the mode +bits of the file that you write. This is what @code{save-buffer} +normally does. @xref{Making Backups,, Making Backup Files}. + +The hook functions in @code{write-file-functions} are also responsible +for encoding the data (if desired): they must choose a suitable coding +system and end-of-line conversion (@pxref{Lisp and Coding Systems}), +perform the encoding (@pxref{Explicit Encoding}), and set +@code{last-coding-system-used} to the coding system that was used +(@pxref{Encoding and I/O}). + +If you set this hook locally in a buffer, it is assumed to be +associated with the file or the way the contents of the buffer were +obtained. Thus the variable is marked as a permanent local, so that +changing the major mode does not alter a buffer-local value. On the +other hand, calling @code{set-visited-file-name} will reset it. +If this is not what you want, you might like to use +@code{write-contents-functions} instead. + +Even though this is not a normal hook, you can use @code{add-hook} and +@code{remove-hook} to manipulate the list. @xref{Hooks}. +@end defvar + +@c Emacs 19 feature +@defvar write-contents-functions +This works just like @code{write-file-functions}, but it is intended +for hooks that pertain to the buffer's contents, not to the particular +visited file or its location. Such hooks are usually set up by major +modes, as buffer-local bindings for this variable. This variable +automatically becomes buffer-local whenever it is set; switching to a +new major mode always resets this variable, but calling +@code{set-visited-file-name} does not. + +If any of the functions in this hook returns non-@code{nil}, the file +is considered already written and the rest are not called and neither +are the functions in @code{write-file-functions}. +@end defvar + +@defopt before-save-hook +This normal hook runs before a buffer is saved in its visited file, +regardless of whether that is done normally or by one of the hooks +described above. For instance, the @file{copyright.el} program uses +this hook to make sure the file you are saving has the current year in +its copyright notice. +@end defopt + +@c Emacs 19 feature +@defopt after-save-hook +This normal hook runs after a buffer has been saved in its visited file. +One use of this hook is in Fast Lock mode; it uses this hook to save the +highlighting information in a cache file. +@end defopt + +@defopt file-precious-flag +If this variable is non-@code{nil}, then @code{save-buffer} protects +against I/O errors while saving by writing the new file to a temporary +name instead of the name it is supposed to have, and then renaming it to +the intended name after it is clear there are no errors. This procedure +prevents problems such as a lack of disk space from resulting in an +invalid file. + +As a side effect, backups are necessarily made by copying. @xref{Rename +or Copy}. Yet, at the same time, saving a precious file always breaks +all hard links between the file you save and other file names. + +Some modes give this variable a non-@code{nil} buffer-local value +in particular buffers. +@end defopt + +@defopt require-final-newline +This variable determines whether files may be written out that do +@emph{not} end with a newline. If the value of the variable is +@code{t}, then @code{save-buffer} silently adds 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-@code{nil}, but not @code{t}, then +@code{save-buffer} asks the user whether to add a newline each time the +case arises. + +If the value of the variable is @code{nil}, then @code{save-buffer} +doesn't add newlines at all. @code{nil} is the default value, but a few +major modes set it to @code{t} in particular buffers. +@end defopt + + See also the function @code{set-visited-file-name} (@pxref{Buffer File +Name}). + +@node Reading from Files +@comment node-name, next, previous, up +@section Reading from Files +@cindex reading from files + + You can copy a file from the disk and insert it into a buffer +using the @code{insert-file-contents} function. Don't use the user-level +command @code{insert-file} in a Lisp program, as that sets the mark. + +@defun insert-file-contents filename &optional visit beg end replace +This function inserts the contents of file @var{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 +@var{filename} is not the name of a file that can be read. + +The function @code{insert-file-contents} checks the file contents +against the defined file formats, and converts the file contents if +appropriate and also calls the functions in +the list @code{after-insert-file-functions}. @xref{Format Conversion}. +Normally, one of the functions in the +@code{after-insert-file-functions} list determines the coding system +(@pxref{Coding Systems}) used for decoding the file's contents, +including end-of-line conversion. + +If @var{visit} is non-@code{nil}, this function additionally marks the +buffer as unmodified and sets up various fields in the buffer so that it +is visiting the file @var{filename}: these include the buffer's visited +file name and its last save file modtime. This feature is used by +@code{find-file-noselect} and you probably should not use it yourself. + +If @var{beg} and @var{end} are non-@code{nil}, they should be integers +specifying the portion of the file to insert. In this case, @var{visit} +must be @code{nil}. For example, + +@example +(insert-file-contents filename nil 0 500) +@end example + +@noindent +inserts the first 500 characters of a file. + +If the argument @var{replace} is non-@code{nil}, it means to replace the +contents of the buffer (actually, just the accessible portion) with the +contents of the file. This is better than simply deleting the buffer +contents and inserting the whole file, because (1) it preserves some +marker positions and (2) it puts less data in the undo list. + +It is possible to read a special file (such as a FIFO or an I/O device) +with @code{insert-file-contents}, as long as @var{replace} and +@var{visit} are @code{nil}. +@end defun + +@defun insert-file-contents-literally filename &optional visit beg end replace +This function works like @code{insert-file-contents} except that it does +not do format decoding (@pxref{Format Conversion}), does not do +character code conversion (@pxref{Coding Systems}), does not run +@code{find-file-hook}, does not perform automatic uncompression, and so +on. +@end defun + +If you want to pass a file name to another process so that another +program can read the file, use the function @code{file-local-copy}; see +@ref{Magic File Names}. + +@node Writing to Files +@comment node-name, next, previous, up +@section Writing to Files +@cindex writing to files + + You can write the contents of a buffer, or part of a buffer, directly +to a file on disk using the @code{append-to-file} and +@code{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. + +@deffn Command append-to-file start end filename +This function appends the contents of the region delimited by +@var{start} and @var{end} in the current buffer to the end of file +@var{filename}. If that file does not exist, it is created. This +function returns @code{nil}. + +An error is signaled if @var{filename} specifies a nonwritable file, +or a nonexistent file in a directory where files cannot be created. + +When called from Lisp, this function is completely equivalent to: + +@example +(write-region start end filename t) +@end example +@end deffn + +@deffn Command write-region start end filename &optional append visit lockname mustbenew +This function writes the region delimited by @var{start} and @var{end} +in the current buffer into the file specified by @var{filename}. + +If @var{start} is @code{nil}, then the command writes the entire buffer +contents (@emph{not} just the accessible portion) to the file and +ignores @var{end}. + +@c Emacs 19 feature +If @var{start} is a string, then @code{write-region} writes or appends +that string, rather than text from the buffer. @var{end} is ignored in +this case. + +If @var{append} is non-@code{nil}, then the specified text is appended +to the existing file contents (if any). If @var{append} is an +integer, @code{write-region} seeks to that byte offset from the start +of the file and writes the data from there. + +If @var{mustbenew} is non-@code{nil}, then @code{write-region} asks +for confirmation if @var{filename} names an existing file. If +@var{mustbenew} is the symbol @code{excl}, then @code{write-region} +does not ask for confirmation, but instead it signals an error +@code{file-already-exists} if the file already exists. + +The test for an existing file, when @var{mustbenew} is @code{excl}, uses +a special system feature. At least for files on a local disk, there is +no chance that some other program could create a file of the same name +before Emacs does, without Emacs's noticing. + +If @var{visit} is @code{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 +@var{filename}'s modtime, and marks the buffer as not modified. This +feature is used by @code{save-buffer}, but you probably should not use +it yourself. + +@c Emacs 19 feature +If @var{visit} is a string, it specifies the file name to visit. This +way, you can write the data to one file (@var{filename}) while recording +the buffer as visiting another file (@var{visit}). The argument +@var{visit} is used in the echo area message and also for file locking; +@var{visit} is stored in @code{buffer-file-name}. This feature is used +to implement @code{file-precious-flag}; don't use it yourself unless you +really know what you're doing. + +The optional argument @var{lockname}, if non-@code{nil}, specifies the +file name to use for purposes of locking and unlocking, overriding +@var{filename} and @var{visit} for that purpose. + +The function @code{write-region} converts the data which it writes to +the appropriate file formats specified by @code{buffer-file-format} +and also calls the functions in the list +@code{write-region-annotate-functions}. +@xref{Format Conversion}. + +Normally, @code{write-region} displays the message @samp{Wrote +@var{filename}} in the echo area. If @var{visit} is neither @code{t} +nor @code{nil} nor a string, then this message is inhibited. This +feature is useful for programs that use files for internal purposes, +files that the user does not need to know about. +@end deffn + +@defmac with-temp-file file body@dots{} +@anchor{Definition of with-temp-file} +The @code{with-temp-file} macro evaluates the @var{body} forms with a +temporary buffer as the current buffer; then, at the end, it writes the +buffer contents into file @var{file}. It kills the temporary buffer +when finished, restoring the buffer that was current before the +@code{with-temp-file} form. Then it returns the value of the last form +in @var{body}. + +The current buffer is restored even in case of an abnormal exit via +@code{throw} or error (@pxref{Nonlocal Exits}). + +See also @code{with-temp-buffer} in @ref{Definition of +with-temp-buffer,, The Current Buffer}. +@end defmac + +@node File Locks +@section File Locks +@cindex file locks +@cindex lock file + + 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 @dfn{file lock} when a file is being +modified. (File locks are not implemented on Microsoft systems.) +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. +The file lock is really a file, a symbolic link with a special name, +stored in the same directory as the file you are editing. + + When you access files using NFS, there may be a small probability that +you and another user will both lock the same file ``simultaneously.'' +If this happens, it is possible for the two users to make changes +simultaneously, but Emacs will still 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 +@ref{Modification Time}. + +@defun file-locked-p filename +This function returns @code{nil} if the file @var{filename} is not +locked. It returns @code{t} if it is locked by this Emacs process, and +it returns the name of the user who has locked it if it is locked by +some other job. + +@example +@group +(file-locked-p "foo") + @result{} nil +@end group +@end example +@end defun + +@defun lock-buffer &optional filename +This function locks the file @var{filename}, if the current buffer is +modified. The argument @var{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, or if the system does not support locking. +@end defun + +@defun 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, or if the +system does not support locking. +@end defun + + File locking is not supported on some systems. On systems that do not +support it, the functions @code{lock-buffer}, @code{unlock-buffer} and +@code{file-locked-p} do nothing and return @code{nil}. + +@defun ask-user-about-lock file other-user +This function is called when the user tries to modify @var{file}, but it +is locked by another user named @var{other-user}. The default +definition of this function asks the user to say what to do. The value +this function returns determines what Emacs does next: + +@itemize @bullet +@item +A value of @code{t} says to grab the lock on the file. Then +this user may edit the file and @var{other-user} loses the lock. + +@item +A value of @code{nil} says to ignore the lock and let this +user edit the file anyway. + +@item +@kindex file-locked +This function may instead signal a @code{file-locked} error, in which +case the change that the user was about to make does not take place. + +The error message for this error looks like this: + +@example +@error{} File is locked: @var{file} @var{other-user} +@end example + +@noindent +where @code{file} is the name of the file and @var{other-user} is the +name of the user who has locked the file. +@end itemize + +If you wish, you can replace the @code{ask-user-about-lock} function +with your own version that makes the decision in another way. The code +for its usual definition is in @file{userlock.el}. +@end defun + +@node Information about Files +@section Information about Files +@cindex file, information about + + The functions described in this section all operate on strings that +designate file names. With a few exceptions, all the functions have +names that begin with the word @samp{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. + +@menu +* Testing Accessibility:: Is a given file readable? Writable? +* Kinds of Files:: Is it a directory? A symbolic link? +* Truenames:: Eliminating symbolic links from a file name. +* File Attributes:: How large is it? Any other names? Etc. +* Locating Files:: How to find a file in standard places. +@end menu + +@node Testing Accessibility +@comment node-name, next, previous, up +@subsection Testing Accessibility +@cindex accessibility of a file +@cindex file accessibility + + These functions test for permission to access a file in specific +ways. Unless explicitly stated otherwise, they recursively follow +symbolic links for their file name arguments, at all levels (at the +level of the file itself and at all levels of parent directories). + +@defun file-exists-p filename +This function returns @code{t} if a file named @var{filename} appears +to exist. This does not mean you can necessarily read the file, only +that you can find out its attributes. (On Unix and GNU/Linux, 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 @code{nil}. + +Directories are files, so @code{file-exists-p} returns @code{t} when +given a directory name. However, symbolic links are treated +specially; @code{file-exists-p} returns @code{t} for a symbolic link +name only if the target file exists. +@end defun + +@defun file-readable-p filename +This function returns @code{t} if a file named @var{filename} exists +and you can read it. It returns @code{nil} otherwise. + +@example +@group +(file-readable-p "files.texi") + @result{} t +@end group +@group +(file-exists-p "/usr/spool/mqueue") + @result{} t +@end group +@group +(file-readable-p "/usr/spool/mqueue") + @result{} nil +@end group +@end example +@end defun + +@c Emacs 19 feature +@defun file-executable-p filename +This function returns @code{t} if a file named @var{filename} exists and +you can execute it. It returns @code{nil} otherwise. On Unix and +GNU/Linux, if the file is a directory, execute permission means you can +check the existence and attributes of files inside the directory, and +open those files if their modes permit. +@end defun + +@defun file-writable-p filename +This function returns @code{t} if the file @var{filename} can be written +or created by you, and @code{nil} otherwise. A file is writable if the +file exists and you can write it. It is creatable if it does not exist, +but the specified directory does exist and you can write in that +directory. + +In the third example below, @file{foo} is not writable because the +parent directory does not exist, even though the user could create such +a directory. + +@example +@group +(file-writable-p "~/foo") + @result{} t +@end group +@group +(file-writable-p "/foo") + @result{} nil +@end group +@group +(file-writable-p "~/no-such-dir/foo") + @result{} nil +@end group +@end example +@end defun + +@c Emacs 19 feature +@defun file-accessible-directory-p dirname +This function returns @code{t} if you have permission to open existing +files in the directory whose name as a file is @var{dirname}; +otherwise (or if there is no such directory), it returns @code{nil}. +The value of @var{dirname} may be either a directory name (such as +@file{/foo/}) or the file name of a file which is a directory +(such as @file{/foo}, without the final slash). + +Example: after the following, + +@example +(file-accessible-directory-p "/foo") + @result{} nil +@end example + +@noindent +we can deduce that any attempt to read a file in @file{/foo/} will +give an error. +@end defun + +@defun access-file filename string +This function opens file @var{filename} for reading, then closes it and +returns @code{nil}. However, if the open fails, it signals an error +using @var{string} as the error message text. +@end defun + +@defun file-ownership-preserved-p filename +This function returns @code{t} if deleting the file @var{filename} and +then creating it anew would keep the file's owner unchanged. It also +returns @code{t} for nonexistent files. + +If @var{filename} is a symbolic link, then, unlike the other functions +discussed here, @code{file-ownership-preserved-p} does @emph{not} +replace @var{filename} with its target. However, it does recursively +follow symbolic links at all levels of parent directories. +@end defun + +@defun file-newer-than-file-p filename1 filename2 +@cindex file age +@cindex file modification time +This function returns @code{t} if the file @var{filename1} is +newer than file @var{filename2}. If @var{filename1} does not +exist, it returns @code{nil}. If @var{filename1} does exist, but +@var{filename2} does not, it returns @code{t}. + +In the following example, assume that the file @file{aug-19} was written +on the 19th, @file{aug-20} was written on the 20th, and the file +@file{no-file} doesn't exist at all. + +@example +@group +(file-newer-than-file-p "aug-19" "aug-20") + @result{} nil +@end group +@group +(file-newer-than-file-p "aug-20" "aug-19") + @result{} t +@end group +@group +(file-newer-than-file-p "aug-19" "no-file") + @result{} t +@end group +@group +(file-newer-than-file-p "no-file" "aug-19") + @result{} nil +@end group +@end example + +You can use @code{file-attributes} to get a file's last modification +time as a list of two numbers. @xref{File Attributes}. +@end defun + +@node Kinds of Files +@comment node-name, next, previous, up +@subsection Distinguishing Kinds of Files + + This section describes how to distinguish various kinds of files, such +as directories, symbolic links, and ordinary files. + +@defun file-symlink-p filename +@cindex file symbolic links +If the file @var{filename} is a symbolic link, the +@code{file-symlink-p} function returns the (non-recursive) link target +as a string. (Determining the file name that the link points to from +the target is nontrivial.) First, this function recursively follows +symbolic links at all levels of parent directories. + +If the file @var{filename} is not a symbolic link (or there is no such file), +@code{file-symlink-p} returns @code{nil}. + +@example +@group +(file-symlink-p "foo") + @result{} nil +@end group +@group +(file-symlink-p "sym-link") + @result{} "foo" +@end group +@group +(file-symlink-p "sym-link2") + @result{} "sym-link" +@end group +@group +(file-symlink-p "/bin") + @result{} "/pub/bin" +@end group +@end example + +@c !!! file-symlink-p: should show output of ls -l for comparison +@end defun + +The next two functions recursively follow symbolic links at +all levels for @var{filename}. + +@defun file-directory-p filename +This function returns @code{t} if @var{filename} is the name of an +existing directory, @code{nil} otherwise. + +@example +@group +(file-directory-p "~rms") + @result{} t +@end group +@group +(file-directory-p "~rms/lewis/files.texi") + @result{} nil +@end group +@group +(file-directory-p "~rms/lewis/no-such-file") + @result{} nil +@end group +@group +(file-directory-p "$HOME") + @result{} nil +@end group +@group +(file-directory-p + (substitute-in-file-name "$HOME")) + @result{} t +@end group +@end example +@end defun + +@defun file-regular-p filename +This function returns @code{t} if the file @var{filename} exists and is +a regular file (not a directory, named pipe, terminal, or +other I/O device). +@end defun + +@node Truenames +@subsection Truenames +@cindex truename (of file) + +@c Emacs 19 features + The @dfn{truename} of a file is the name that you get by following +symbolic links at all levels until none remain, then simplifying away +@samp{.}@: and @samp{..}@: appearing as name components. This results +in a sort of canonical name for the file. A file does not always have a +unique truename; the number of distinct truenames a file has is equal to +the number of hard links to the file. However, truenames are useful +because they eliminate symbolic links as a cause of name variation. + +@defun file-truename filename +The function @code{file-truename} returns the truename of the file +@var{filename}. The argument must be an absolute file name. + +This function does not expand environment variables. Only +@code{substitute-in-file-name} does that. @xref{Definition of +substitute-in-file-name}. + +If you may need to follow symbolic links preceding @samp{..}@: +appearing as a name component, you should make sure to call +@code{file-truename} without prior direct or indirect calls to +@code{expand-file-name}, as otherwise the file name component +immediately preceding @samp{..} will be ``simplified away'' before +@code{file-truename} is called. To eliminate the need for a call to +@code{expand-file-name}, @code{file-truename} handles @samp{~} in the +same way that @code{expand-file-name} does. @xref{File Name +Expansion,, Functions that Expand Filenames}. +@end defun + +@defun file-chase-links filename &optional limit +This function follows symbolic links, starting with @var{filename}, +until it finds a file name which is not the name of a symbolic link. +Then it returns that file name. This function does @emph{not} follow +symbolic links at the level of parent directories. + +If you specify a number for @var{limit}, then after chasing through +that many links, the function just returns what it has even if that is +still a symbolic link. +@end defun + + To illustrate the difference between @code{file-chase-links} and +@code{file-truename}, suppose that @file{/usr/foo} is a symbolic link to +the directory @file{/home/foo}, and @file{/home/foo/hello} is an +ordinary file (or at least, not a symbolic link) or nonexistent. Then +we would have: + +@example +(file-chase-links "/usr/foo/hello") + ;; @r{This does not follow the links in the parent directories.} + @result{} "/usr/foo/hello" +(file-truename "/usr/foo/hello") + ;; @r{Assuming that @file{/home} is not a symbolic link.} + @result{} "/home/foo/hello" +@end example + + @xref{Buffer File Name}, for related information. + +@node File Attributes +@comment node-name, next, previous, up +@subsection 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. + +@defun file-modes filename +@cindex permission +@cindex file attributes +This function returns the mode bits of @var{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 @acronym{SUID} bit +is set for both others and group, and that the sticky bit is set. + +If @var{filename} does not exist, @code{file-modes} returns @code{nil}. + +This function recursively follows symbolic links at all levels. + +@example +@group +(file-modes "~/junk/diffs") + @result{} 492 ; @r{Decimal integer.} +@end group +@group +(format "%o" 492) + @result{} "754" ; @r{Convert to octal.} +@end group + +@group +(set-file-modes "~/junk/diffs" 438) + @result{} nil +@end group + +@group +(format "%o" 438) + @result{} "666" ; @r{Convert to octal.} +@end group + +@group +% ls -l diffs + -rw-rw-rw- 1 lewis 0 3063 Oct 30 16:00 diffs +@end group +@end example +@end defun + +If the @var{filename} argument to the next two functions is a symbolic +link, then these function do @emph{not} replace it with its target. +However, they both recursively follow symbolic links at all levels of +parent directories. + +@defun file-nlinks filename +This functions returns the number of names (i.e., hard links) that +file @var{filename} has. If the file does not exist, then this function +returns @code{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. + +@example +@group +% 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 +@end group + +@group +(file-nlinks "foo") + @result{} 2 +@end group +@group +(file-nlinks "doesnt-exist") + @result{} nil +@end group +@end example +@end defun + +@defun file-attributes filename &optional id-format +@anchor{Definition of file-attributes} +This function returns a list of attributes of file @var{filename}. If +the specified file cannot be opened, it returns @code{nil}. +The optional parameter @var{id-format} specifies the preferred format +of attributes @acronym{UID} and @acronym{GID} (see below)---the +valid values are @code{'string} and @code{'integer}. The latter is +the default, but we plan to change that, so you should specify a +non-@code{nil} value for @var{id-format} if you use the returned +@acronym{UID} or @acronym{GID}. + +The elements of the list, in order, are: + +@enumerate 0 +@item +@code{t} for a directory, a string for a symbolic link (the name +linked to), or @code{nil} for a text file. + +@c Wordy so as to prevent an overfull hbox. --rjc 15mar92 +@item +The number of names the file has. Alternate names, also known as hard +links, can be created by using the @code{add-name-to-file} function +(@pxref{Changing Files}). + +@item +The file's @acronym{UID}, normally as a string. However, if it does +not correspond to a named user, the value is an integer or a floating +point number. + +@item +The file's @acronym{GID}, likewise. + +@item +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. (This is similar to the +value of @code{current-time}; see @ref{Time of Day}.) + +@item +The time of last modification as a list of two integers (as above). +@cindex modification time of file + +@item +The time of last status change as a list of two integers (as above). + +@item +The size of the file in bytes. If the size is too large to fit in a +Lisp integer, this is a floating point number. + +@item +The file's modes, as a string of ten letters or dashes, +as in @samp{ls -l}. + +@item +@code{t} if the file's @acronym{GID} would change if file were +deleted and recreated; @code{nil} otherwise. + +@item +The file's inode number. If possible, this is an integer. If the inode +number is too large to be represented as an integer in Emacs Lisp, then +the value has the form @code{(@var{high} . @var{low})}, where @var{low} +holds the low 16 bits. + +@item +The file system number of the file system that the file is in. +Depending on the magnitude of the value, this can be either an integer +or a cons cell, in the same manner as the inode number. This element +and the file's inode number together give enough information to +distinguish any two files on the system---no two files can have the same +values for both of these numbers. +@end enumerate + +For example, here are the file attributes for @file{files.texi}: + +@example +@group +(file-attributes "files.texi" 'string) + @result{} (nil 1 "lh" "users" + (8489 20284) + (8489 20284) + (8489 20285) + 14906 "-rw-rw-rw-" + nil 129500 -32252) +@end group +@end example + +@noindent +and here is how the result is interpreted: + +@table @code +@item nil +is neither a directory nor a symbolic link. + +@item 1 +has only one name (the name @file{files.texi} in the current default +directory). + +@item "lh" +is owned by the user with name "lh". + +@item "users" +is in the group with name "users". + +@item (8489 20284) +was last accessed on Aug 19 00:09. + +@item (8489 20284) +was last modified on Aug 19 00:09. + +@item (8489 20285) +last had its inode changed on Aug 19 00:09. + +@item 14906 +is 14906 bytes long. (It may not contain 14906 characters, though, +if some of the bytes belong to multibyte sequences.) + +@item "-rw-rw-rw-" +has a mode of read and write access for the owner, group, and world. + +@item nil +would retain the same @acronym{GID} if it were recreated. + +@item 129500 +has an inode number of 129500. +@item -32252 +is on file system number -32252. +@end table +@end defun + +@node Locating Files +@subsection How to Locate Files in Standard Places +@cindex locate file in path +@cindex find file in path + + This section explains how to search for a file in a list of +directories (a @dfn{path}). One example is when you need to look for +a program's executable file, e.g., to find out whether a given program +is installed on the user's system. Another example is the search for +Lisp libraries (@pxref{Library Search}). Such searches generally need +to try various possible file name extensions, in addition to various +possible directories. Emacs provides a function for such a +generalized search for a file. + +@defun locate-file filename path &optional suffixes predicate +This function searches for a file whose name is @var{filename} in a +list of directories given by @var{path}, trying the suffixes in +@var{suffixes}. If it finds such a file, it returns the full +@dfn{absolute file name} of the file (@pxref{Relative File Names}); +otherwise it returns @code{nil}. + +The optional argument @var{suffixes} gives the list of file-name +suffixes to append to @var{filename} when searching. +@code{locate-file} tries each possible directory with each of these +suffixes. If @var{suffixes} is @code{nil}, or @code{("")}, then there +are no suffixes, and @var{filename} is used only as-is. Typical +values of @var{suffixes} are @code{exec-suffixes} (@pxref{Subprocess +Creation, exec-suffixes}), @code{load-suffixes}, +@code{load-file-rep-suffixes} and the return value of the function +@code{get-load-suffixes} (@pxref{Load Suffixes}). + +Typical values for @var{path} are @code{exec-path} (@pxref{Subprocess +Creation, exec-path}) when looking for executable programs or +@code{load-path} (@pxref{Library Search, load-path}) when looking for +Lisp files. If @var{filename} is absolute, @var{path} has no effect, +but the suffixes in @var{suffixes} are still tried. + +The optional argument @var{predicate}, if non-@code{nil}, specifies +the predicate function to use for testing whether a candidate file is +suitable. The predicate function is passed the candidate file name as +its single argument. If @var{predicate} is @code{nil} or unspecified, +@code{locate-file} uses @code{file-readable-p} as the default +predicate. Useful non-default predicates include +@code{file-executable-p}, @code{file-directory-p}, and other +predicates described in @ref{Kinds of Files}. + +For compatibility, @var{predicate} can also be one of the symbols +@code{executable}, @code{readable}, @code{writable}, @code{exists}, or +a list of one or more of these symbols. +@end defun + +@defun executable-find program +This function searches for the executable file of the named +@var{program} and returns the full absolute name of the executable, +including its file-name extensions, if any. It returns @code{nil} if +the file is not found. The functions searches in all the directories +in @code{exec-path} and tries all the file-name extensions in +@code{exec-suffixes}. +@end defun + +@node Changing Files +@section Changing File Names and Attributes +@c @cindex renaming files Duplicates rename-file +@cindex copying files +@cindex deleting files +@cindex linking files +@cindex setting modes of files + + The functions in this section rename, copy, delete, link, and set the +modes of files. + + In the functions that have an argument @var{newname}, if a file by the +name of @var{newname} already exists, the actions taken depend on the +value of the argument @var{ok-if-already-exists}: + +@itemize @bullet +@item +Signal a @code{file-already-exists} error if +@var{ok-if-already-exists} is @code{nil}. + +@item +Request confirmation if @var{ok-if-already-exists} is a number. + +@item +Replace the old file without confirmation if @var{ok-if-already-exists} +is any other value. +@end itemize + +The next four commands all recursively follow symbolic links at all +levels of parent directories for their first argument, but, if that +argument is itself a symbolic link, then only @code{copy-file} +replaces it with its (recursive) target. + +@deffn Command add-name-to-file oldname newname &optional ok-if-already-exists +@cindex file with multiple names +@cindex file hard link +This function gives the file named @var{oldname} the additional name +@var{newname}. This means that @var{newname} becomes a new ``hard +link'' to @var{oldname}. + +In the first part of the following example, we list two files, +@file{foo} and @file{foo3}. + +@example +@group +% ls -li fo* +81908 -rw-rw-rw- 1 rms 29 Aug 18 20:32 foo +84302 -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3 +@end group +@end example + +Now we create a hard link, by calling @code{add-name-to-file}, then list +the files again. This shows two names for one file, @file{foo} and +@file{foo2}. + +@example +@group +(add-name-to-file "foo" "foo2") + @result{} nil +@end group + +@group +% ls -li fo* +81908 -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo +81908 -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo2 +84302 -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3 +@end group +@end example + +Finally, we evaluate the following: + +@example +(add-name-to-file "foo" "foo3" t) +@end example + +@noindent +and list the files again. Now there are three names +for one file: @file{foo}, @file{foo2}, and @file{foo3}. The old +contents of @file{foo3} are lost. + +@example +@group +(add-name-to-file "foo1" "foo3") + @result{} nil +@end group + +@group +% ls -li fo* +81908 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo +81908 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo2 +81908 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo3 +@end group +@end example + +This function is meaningless on operating systems where multiple names +for one file are not allowed. Some systems implement multiple names +by copying the file instead. + +See also @code{file-nlinks} in @ref{File Attributes}. +@end deffn + +@deffn Command rename-file filename newname &optional ok-if-already-exists +This command renames the file @var{filename} as @var{newname}. + +If @var{filename} has additional names aside from @var{filename}, it +continues to have those names. In fact, adding the name @var{newname} +with @code{add-name-to-file} and then deleting @var{filename} has the +same effect as renaming, aside from momentary intermediate states. +@end deffn + +@deffn Command copy-file oldname newname &optional ok-if-exists time preserve-uid-gid +This command copies the file @var{oldname} to @var{newname}. An +error is signaled if @var{oldname} does not exist. If @var{newname} +names a directory, it copies @var{oldname} into that directory, +preserving its final name component. + +If @var{time} is non-@code{nil}, then this function gives the new file +the same last-modified time that the old one has. (This works on only +some operating systems.) If setting the time gets an error, +@code{copy-file} signals a @code{file-date-error} error. In an +interactive call, a prefix argument specifies a non-@code{nil} value +for @var{time}. + +This function copies the file modes, too. + +If argument @var{preserve-uid-gid} is @code{nil}, we let the operating +system decide the user and group ownership of the new file (this is +usually set to the user running Emacs). If @var{preserve-uid-gid} is +non-@code{nil}, we attempt to copy the user and group ownership of the +file. This works only on some operating systems, and only if you have +the correct permissions to do so. +@end deffn + +@deffn Command make-symbolic-link filename newname &optional ok-if-exists +@pindex ln +@kindex file-already-exists +This command makes a symbolic link to @var{filename}, named +@var{newname}. This is like the shell command @samp{ln -s +@var{filename} @var{newname}}. + +This function is not available on systems that don't support symbolic +links. +@end deffn + +@deffn Command delete-file filename +@pindex rm +This command deletes the file @var{filename}, like the shell command +@samp{rm @var{filename}}. If the file has multiple names, it continues +to exist under the other names. + +A suitable kind of @code{file-error} error is signaled if the file does +not exist, or is not deletable. (On Unix and GNU/Linux, a file is +deletable if its directory is writable.) + +If @var{filename} is a symbolic link, @code{delete-file} does not +replace it with its target, but it does follow symbolic links at all +levels of parent directories. + +See also @code{delete-directory} in @ref{Create/Delete Dirs}. +@end deffn + +@defun define-logical-name varname string +This function defines the logical name @var{varname} to have the value +@var{string}. It is available only on VMS. +@end defun + +@defun set-file-modes filename mode +This function sets mode bits of @var{filename} to @var{mode} (which +must be an integer). Only the low 12 bits of @var{mode} are used. +This function recursively follows symbolic links at all levels for +@var{filename}. +@end defun + +@c Emacs 19 feature +@defun set-default-file-modes mode +@cindex umask +This function sets the default file protection for new files created by +Emacs and its subprocesses. Every file created with Emacs initially has +this protection, or a subset of it (@code{write-region} will not give a +file execute permission even if the default file protection allows +execute permission). On Unix and GNU/Linux, the default protection is +the bitwise complement of the ``umask'' value. + +The argument @var{mode} must be an integer. On most systems, only the +low 9 bits of @var{mode} are meaningful. You can use the Lisp construct +for octal character codes to enter @var{mode}; for example, + +@example +(set-default-file-modes ?\644) +@end example + +Saving a modified version of an existing file does not count as creating +the file; it preserves the existing file's mode, whatever that is. So +the default file protection has no effect. +@end defun + +@defun default-file-modes +This function returns the current default protection value. +@end defun + +@defun set-file-times filename &optional time +This function sets the access and modification times of @var{filename} +to @var{time}. The return value is @code{t} if the times are successfully +set, otherwise it is @code{nil}. @var{time} defaults to the current +time and must be in the format returned by @code{current-time} +(@pxref{Time of Day}). +@end defun + +@cindex MS-DOS and file modes +@cindex file modes and MS-DOS + On MS-DOS, there is no such thing as an ``executable'' file mode bit. +So Emacs considers a file executable if its name ends in one of the +standard executable extensions, such as @file{.com}, @file{.bat}, +@file{.exe}, and some others. Files that begin with the Unix-standard +@samp{#!} signature, such as shell and Perl scripts, are also considered +as executable files. This is reflected in the values returned by +@code{file-modes} and @code{file-attributes}. Directories are also +reported with executable bit set, for compatibility with Unix. + +@node File Names +@section File Names +@cindex 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 file 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 MS-DOS and MS-Windows, these functions (like the function that +actually operate on files) accept MS-DOS or MS-Windows file-name syntax, +where backslashes separate the components, as well as Unix syntax; but +they always return Unix syntax. On VMS, these functions (and the ones +that operate on files) understand both VMS file-name syntax and Unix +syntax. This enables Lisp programs to specify file names in Unix syntax +and work properly on all systems without change. + +@menu +* File Name Components:: The directory part of a file name, and the rest. +* Relative File Names:: Some file names are relative to a current directory. +* Directory Names:: A directory's name as a directory + is different from its name as a file. +* File Name Expansion:: Converting relative file names to absolute ones. +* Unique File Names:: Generating names for temporary files. +* File Name Completion:: Finding the completions for a given file name. +* Standard File Names:: If your package uses a fixed file name, + how to handle various operating systems simply. +@end menu + +@node File Name Components +@subsection File Name Components +@cindex directory part (of file name) +@cindex nondirectory part (of file name) +@cindex version number (in file name) + + The operating system groups files into directories. To specify a +file, you must specify the directory and the file's name within that +directory. Therefore, Emacs considers a file name as having two main +parts: the @dfn{directory name} part, and the @dfn{nondirectory} part +(or @dfn{file name within the directory}). Either part may be empty. +Concatenating these two parts reproduces the original file name. + + On most systems, the directory part is everything up to and including +the last slash (backslash is also allowed in input on MS-DOS or +MS-Windows); 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 proper and the @dfn{version number}. On most systems, 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, so that version numbers in Emacs are +found mostly in directory lists. + +@defun file-name-directory filename +This function returns the directory part of @var{filename}, as a +directory name (@pxref{Directory Names}), or @code{nil} if +@var{filename} does not include a directory part. + +On GNU and Unix systems, a string returned by this function always +ends in a slash. On MS-DOS it can also end in a colon. On VMS, it +returns a string ending in one of the three characters @samp{:}, +@samp{]}, or @samp{>}. + +@example +@group +(file-name-directory "lewis/foo") ; @r{Unix example} + @result{} "lewis/" +@end group +@group +(file-name-directory "foo") ; @r{Unix example} + @result{} nil +@end group +@group +(file-name-directory "[X]FOO.TMP") ; @r{VMS example} + @result{} "[X]" +@end group +@end example +@end defun + +@defun file-name-nondirectory filename +This function returns the nondirectory part of @var{filename}. + +@example +@group +(file-name-nondirectory "lewis/foo") + @result{} "foo" +@end group +@group +(file-name-nondirectory "foo") + @result{} "foo" +@end group +@group +(file-name-nondirectory "lewis/") + @result{} "" +@end group +@group +;; @r{The following example is accurate only on VMS.} +(file-name-nondirectory "[X]FOO.TMP") + @result{} "FOO.TMP" +@end group +@end example +@end defun + +@defun file-name-sans-versions filename &optional keep-backup-version +This function returns @var{filename} with any file version numbers, +backup version numbers, or trailing tildes discarded. + +If @var{keep-backup-version} is non-@code{nil}, then true file version +numbers understood as such by the file system are discarded from the +return value, but backup version numbers are kept. + +@example +@group +(file-name-sans-versions "~rms/foo.~1~") + @result{} "~rms/foo" +@end group +@group +(file-name-sans-versions "~rms/foo~") + @result{} "~rms/foo" +@end group +@group +(file-name-sans-versions "~rms/foo") + @result{} "~rms/foo" +@end group +@group +;; @r{The following example applies to VMS only.} +(file-name-sans-versions "foo;23") + @result{} "foo" +@end group +@end example +@end defun + +@defun file-name-extension filename &optional period +This function returns @var{filename}'s final ``extension,'' if any, +after applying @code{file-name-sans-versions} to remove any +version/backup part. The extension, in a file name, is the part that +starts with the last @samp{.} in the last name component (minus +any version/backup part). + +This function returns @code{nil} for extensionless file names such as +@file{foo}. It returns @code{""} for null extensions, as in +@file{foo.}. If the last component of a file name begins with a +@samp{.}, that @samp{.} doesn't count as the beginning of an +extension. Thus, @file{.emacs}'s ``extension'' is @code{nil}, not +@samp{.emacs}. + +If @var{period} is non-@code{nil}, then the returned value includes +the period that delimits the extension, and if @var{filename} has no +extension, the value is @code{""}. +@end defun + +@defun file-name-sans-extension filename +This function returns @var{filename} minus its extension, if any. The +version/backup part, if present, is only removed if the file has an +extension. For example, + +@example +(file-name-sans-extension "foo.lose.c") + @result{} "foo.lose" +(file-name-sans-extension "big.hack/foo") + @result{} "big.hack/foo" +(file-name-sans-extension "/my/home/.emacs") + @result{} "/my/home/.emacs" +(file-name-sans-extension "/my/home/.emacs.el") + @result{} "/my/home/.emacs" +(file-name-sans-extension "~/foo.el.~3~") + @result{} "~/foo" +(file-name-sans-extension "~/foo.~3~") + @result{} "~/foo.~3~" +@end example + +Note that the @samp{.~3~} in the two last examples is the backup part, +not an extension. +@end defun + +@ignore +Andrew Innes says that this + +@c @defvar directory-sep-char +This variable holds the character that Emacs normally uses to separate +file name components. The default value is @code{?/}, but on MS-Windows +you can set it to @code{?\\}; then the functions that transform file names +use backslashes in their output. + +File names using backslashes work as input to Lisp primitives even on +MS-DOS and MS-Windows, even if @code{directory-sep-char} has its default +value of @code{?/}. +@end defvar +@end ignore + +@node Relative File Names +@subsection Absolute and Relative File Names +@cindex absolute file name +@cindex relative file name + + 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 @dfn{absolute} +file name. Or it can specify the position of the file in the tree +relative to a default directory; then it is called a @dfn{relative} file +name. On Unix and GNU/Linux, an absolute file name starts with a slash +or a tilde (@samp{~}), and a relative one does not. On MS-DOS and +MS-Windows, an absolute file name starts with a slash or a backslash, or +with a drive specification @samp{@var{x}:/}, where @var{x} is the +@dfn{drive letter}. The rules on VMS are complicated. + +@defun file-name-absolute-p filename +This function returns @code{t} if file @var{filename} is an absolute +file name, @code{nil} otherwise. On VMS, this function understands both +Unix syntax and VMS syntax. + +@example +@group +(file-name-absolute-p "~rms/foo") + @result{} t +@end group +@group +(file-name-absolute-p "rms/foo") + @result{} nil +@end group +@group +(file-name-absolute-p "/user/rms/foo") + @result{} t +@end group +@end example +@end defun + + Given a possibly relative file name, you can convert it to an +absolute name using @code{expand-file-name} (@pxref{File Name +Expansion}). This function converts absolute file names to relative +names: + +@defun file-relative-name filename &optional directory +This function tries to return a relative name that is equivalent to +@var{filename}, assuming the result will be interpreted relative to +@var{directory} (an absolute directory name or directory file name). +If @var{directory} is omitted or @code{nil}, it defaults to the +current buffer's default directory. + +On some operating systems, an absolute file name begins with a device +name. On such systems, @var{filename} has no relative equivalent based +on @var{directory} if they start with two different device names. In +this case, @code{file-relative-name} returns @var{filename} in absolute +form. + +@example +(file-relative-name "/foo/bar" "/foo/") + @result{} "bar" +(file-relative-name "/foo/bar" "/hack/") + @result{} "../foo/bar" +@end example +@end defun + +@node Directory Names +@comment node-name, next, previous, up +@subsection Directory Names +@cindex directory name +@cindex file name of directory + + A @dfn{directory name} is the name of a directory. A directory is +actually a kind of file, so 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 GNU and +Unix systems, this is simple: a directory name ends in a slash, +whereas the directory's name as a file lacks that slash. On MS-DOS and +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. When @code{file-name-directory} returns a string, that is +always a directory name. + + The following two functions convert between directory names and file +names. They do nothing special with environment variable substitutions +such as @samp{$HOME}, and the constructs @samp{~}, @samp{.} and @samp{..}. + +@defun file-name-as-directory filename +This function returns a string representing @var{filename} in a form +that the operating system will interpret as the name of a directory. On +most systems, this means appending a slash to the string (if it does not +already end in one). On VMS, the function converts a string of the form +@file{[X]Y.DIR.1} to the form @file{[X.Y]}. + +@example +@group +(file-name-as-directory "~rms/lewis") + @result{} "~rms/lewis/" +@end group +@end example +@end defun + +@defun directory-file-name dirname +This function returns a string representing @var{dirname} in a form that +the operating system will interpret as the name of a file. On most +systems, this means removing the final slash (or backslash) from the +string. On VMS, the function converts a string of the form @file{[X.Y]} +to @file{[X]Y.DIR.1}. + +@example +@group +(directory-file-name "~lewis/") + @result{} "~lewis" +@end group +@end example +@end defun + + Given a directory name, you can combine it with a relative file name +using @code{concat}: + +@example +(concat @var{dirname} @var{relfile}) +@end example + +@noindent +Be sure to verify that the file name is relative before doing that. +If you use an absolute file name, the results could be syntactically +invalid or refer to the wrong file. + + If you want to use a directory file name in making such a +combination, you must first convert it to a directory name using +@code{file-name-as-directory}: + +@example +(concat (file-name-as-directory @var{dirfile}) @var{relfile}) +@end example + +@noindent +Don't try concatenating a slash by hand, as in + +@example +;;; @r{Wrong!} +(concat @var{dirfile} "/" @var{relfile}) +@end example + +@noindent +because this is not portable. Always use +@code{file-name-as-directory}. + +@cindex directory name abbreviation + Directory name abbreviations are useful for directories that are +normally accessed through symbolic links. Sometimes the users recognize +primarily the link's name as ``the name'' of the directory, and find it +annoying to see the directory's ``real'' name. If you define the link +name as an abbreviation for the ``real'' name, Emacs shows users the +abbreviation instead. + +@defvar directory-abbrev-alist +The variable @code{directory-abbrev-alist} contains an alist of +abbreviations to use for file directories. Each element has the form +@code{(@var{from} . @var{to})}, and says to replace @var{from} with +@var{to} when it appears in a directory name. The @var{from} string is +actually a regular expression; it should always start with @samp{^}. +The @var{to} string should be an ordinary absolute directory name. Do +not use @samp{~} to stand for a home directory in that string. The +function @code{abbreviate-file-name} performs these substitutions. + +You can set this variable in @file{site-init.el} to describe the +abbreviations appropriate for your site. + +Here's an example, from a system on which file system @file{/home/fsf} +and so on are normally accessed through symbolic links named @file{/fsf} +and so on. + +@example +(("^/home/fsf" . "/fsf") + ("^/home/gp" . "/gp") + ("^/home/gd" . "/gd")) +@end example +@end defvar + + To convert a directory name to its abbreviation, use this +function: + +@defun abbreviate-file-name filename +@anchor{Definition of abbreviate-file-name} +This function applies abbreviations from @code{directory-abbrev-alist} +to its argument, and substitutes @samp{~} for the user's home +directory. You can use it for directory names and for file names, +because it recognizes abbreviations even as part of the name. +@end defun + +@node File Name Expansion +@subsection Functions that Expand Filenames +@cindex expansion of file names + + @dfn{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 simplifies file names by eliminating +redundancies such as @file{./} and @file{@var{name}/../}. + +@defun expand-file-name filename &optional directory +This function converts @var{filename} to an absolute file name. If +@var{directory} is supplied, it is the default directory to start with +if @var{filename} is relative. (The value of @var{directory} should +itself be an absolute directory name or directory file name; it may +start with @samp{~}.) Otherwise, the current buffer's value of +@code{default-directory} is used. For example: + +@example +@group +(expand-file-name "foo") + @result{} "/xcssun/users/rms/lewis/foo" +@end group +@group +(expand-file-name "../foo") + @result{} "/xcssun/users/rms/foo" +@end group +@group +(expand-file-name "foo" "/usr/spool/") + @result{} "/usr/spool/foo" +@end group +@group +(expand-file-name "$HOME/foo") + @result{} "/xcssun/users/rms/lewis/$HOME/foo" +@end group +@end example + +If the part of the combined file name before the first slash is +@samp{~}, it expands to the value of the @env{HOME} environment +variable (usually your home directory). If the part before the first +slash is @samp{~@var{user}} and if @var{user} is a valid login name, +it expands to @var{user}'s home directory. + +Filenames containing @samp{.} or @samp{..} are simplified to their +canonical form: + +@example +@group +(expand-file-name "bar/../foo") + @result{} "/xcssun/users/rms/lewis/foo" +@end group +@end example + +In some cases, a leading @samp{..} component can remain in the output: + +@example +@group +(expand-file-name "../home" "/") + @result{} "/../home" +@end group +@end example + +@noindent +This is for the sake of filesystems that have the concept of a +``superroot'' above the root directory @file{/}. On other filesystems, +@file{/../} is interpreted exactly the same as @file{/}. + +Note that @code{expand-file-name} does @emph{not} expand environment +variables; only @code{substitute-in-file-name} does that. + +Note also that @code{expand-file-name} does not follow symbolic links +at any level. This results in a difference between the way +@code{file-truename} and @code{expand-file-name} treat @samp{..}. +Assuming that @samp{/tmp/bar} is a symbolic link to the directory +@samp{/tmp/foo/bar} we get: + +@example +@group +(file-truename "/tmp/bar/../myfile") + @result{} "/tmp/foo/myfile" +@end group +@group +(expand-file-name "/tmp/bar/../myfile") + @result{} "/tmp/myfile" +@end group +@end example + +If you may need to follow symbolic links preceding @samp{..}, you +should make sure to call @code{file-truename} without prior direct or +indirect calls to @code{expand-file-name}. @xref{Truenames}. +@end defun + +@defvar default-directory +The value of this buffer-local variable is the default directory for the +current buffer. It should be an absolute directory name; it may start +with @samp{~}. This variable is buffer-local in every buffer. + +@code{expand-file-name} uses the default directory when its second +argument is @code{nil}. + +Aside from VMS, the value is always a string ending with a slash. + +@example +@group +default-directory + @result{} "/user/lewis/manual/" +@end group +@end example +@end defvar + +@defun substitute-in-file-name filename +@anchor{Definition of substitute-in-file-name} +This function replaces environment variable references in +@var{filename} with the environment variable values. Following +standard Unix shell syntax, @samp{$} is the prefix to substitute an +environment variable value. If the input contains @samp{$$}, that is +converted to @samp{$}; this gives the user a way to ``quote'' a +@samp{$}. + +The environment variable name is the series of alphanumeric characters +(including underscores) that follow the @samp{$}. If the character following +the @samp{$} is a @samp{@{}, then the variable name is everything up to the +matching @samp{@}}. + +Calling @code{substitute-in-file-name} on output produced by +@code{substitute-in-file-name} tends to give incorrect results. For +instance, use of @samp{$$} to quote a single @samp{$} won't work +properly, and @samp{$} in an environment variable's value could lead +to repeated substitution. Therefore, programs that call this function +and put the output where it will be passed to this function need to +double all @samp{$} characters to prevent subsequent incorrect +results. + +@c Wordy to avoid overfull hbox. --rjc 15mar92 +Here we assume that the environment variable @code{HOME}, which holds +the user's home directory name, has value @samp{/xcssun/users/rms}. + +@example +@group +(substitute-in-file-name "$HOME/foo") + @result{} "/xcssun/users/rms/foo" +@end group +@end example + +After substitution, if a @samp{~} or a @samp{/} appears immediately +after another @samp{/}, the function discards everything before it (up +through the immediately preceding @samp{/}). + +@example +@group +(substitute-in-file-name "bar/~/foo") + @result{} "~/foo" +@end group +@group +(substitute-in-file-name "/usr/local/$HOME/foo") + @result{} "/xcssun/users/rms/foo" + ;; @r{@file{/usr/local/} has been discarded.} +@end group +@end example + +On VMS, @samp{$} substitution is not done, so this function does nothing +on VMS except discard superfluous initial components as shown above. +@end defun + +@node Unique File Names +@subsection Generating Unique File Names + + Some programs need to write temporary files. Here is the usual way to +construct a name for such a file: + +@example +(make-temp-file @var{name-of-application}) +@end example + +@noindent +The job of @code{make-temp-file} is to prevent two different users or +two different jobs from trying to use the exact same file name. + +@defun make-temp-file prefix &optional dir-flag suffix +This function creates a temporary file and returns its name. Emacs +creates the temporary file's name by adding to @var{prefix} some +random characters that are different in each Emacs job. The result is +guaranteed to be a newly created empty file. On MS-DOS, this function +can truncate the @var{string} prefix to fit into the 8+3 file-name +limits. If @var{prefix} is a relative file name, it is expanded +against @code{temporary-file-directory}. + +@example +@group +(make-temp-file "foo") + @result{} "/tmp/foo232J6v" +@end group +@end example + +When @code{make-temp-file} returns, the file has been created and is +empty. At that point, you should write the intended contents into the +file. + +If @var{dir-flag} is non-@code{nil}, @code{make-temp-file} creates an +empty directory instead of an empty file. It returns the file name, +not the directory name, of that directory. @xref{Directory Names}. + +If @var{suffix} is non-@code{nil}, @code{make-temp-file} adds it at +the end of the file name. + +To prevent conflicts among different libraries running in the same +Emacs, each Lisp program that uses @code{make-temp-file} should have its +own @var{prefix}. The number added to the end of @var{prefix} +distinguishes between the same application running in different Emacs +jobs. Additional added characters permit a large number of distinct +names even in one Emacs job. +@end defun + + The default directory for temporary files is controlled by the +variable @code{temporary-file-directory}. This variable gives the user +a uniform way to specify the directory for all temporary files. Some +programs use @code{small-temporary-file-directory} instead, if that is +non-@code{nil}. To use it, you should expand the prefix against +the proper directory before calling @code{make-temp-file}. + + In older Emacs versions where @code{make-temp-file} does not exist, +you should use @code{make-temp-name} instead: + +@example +(make-temp-name + (expand-file-name @var{name-of-application} + temporary-file-directory)) +@end example + +@defun make-temp-name string +This function generates a string that can be used as a unique file +name. The name starts with @var{string}, and has several random +characters appended to it, which are different in each Emacs job. It +is like @code{make-temp-file} except that it just constructs a name, +and does not create a file. Another difference is that @var{string} +should be an absolute file name. On MS-DOS, this function can +truncate the @var{string} prefix to fit into the 8+3 file-name limits. +@end defun + +@defvar temporary-file-directory +@cindex @code{TMPDIR} environment variable +@cindex @code{TMP} environment variable +@cindex @code{TEMP} environment variable +This variable specifies the directory name for creating temporary files. +Its value should be a directory name (@pxref{Directory Names}), but it +is good for Lisp programs to cope if the value is a directory's file +name instead. Using the value as the second argument to +@code{expand-file-name} is a good way to achieve that. + +The default value is determined in a reasonable way for your operating +system; it is based on the @code{TMPDIR}, @code{TMP} and @code{TEMP} +environment variables, with a fall-back to a system-dependent name if +none of these variables is defined. + +Even if you do not use @code{make-temp-file} to create the temporary +file, you should still use this variable to decide which directory to +put the file in. However, if you expect the file to be small, you +should use @code{small-temporary-file-directory} first if that is +non-@code{nil}. +@end defvar + +@defvar small-temporary-file-directory +This variable specifies the directory name for +creating certain temporary files, which are likely to be small. + +If you want to write a temporary file which is likely to be small, you +should compute the directory like this: + +@example +(make-temp-file + (expand-file-name @var{prefix} + (or small-temporary-file-directory + temporary-file-directory))) +@end example +@end defvar + +@node File Name Completion +@subsection File Name Completion +@cindex file name completion subroutines +@cindex completion, file name + + This section describes low-level subroutines for completing a file +name. For higher level functions, see @ref{Reading File Names}. + +@defun file-name-all-completions partial-filename directory +This function returns a list of all possible completions for a file +whose name starts with @var{partial-filename} in directory +@var{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 @var{partial-filename} must be a file name containing no +directory part and no slash (or backslash on some systems). The current +buffer's default directory is prepended to @var{directory}, if +@var{directory} is not absolute. + +In the following example, suppose that @file{~rms/lewis} is the current +default directory, and has five files whose names begin with @samp{f}: +@file{foo}, @file{file~}, @file{file.c}, @file{file.c.~1~}, and +@file{file.c.~2~}.@refill + +@example +@group +(file-name-all-completions "f" "") + @result{} ("foo" "file~" "file.c.~2~" + "file.c.~1~" "file.c") +@end group + +@group +(file-name-all-completions "fo" "") + @result{} ("foo") +@end group +@end example +@end defun + +@defun file-name-completion filename directory &optional predicate +This function completes the file name @var{filename} in directory +@var{directory}. It returns the longest prefix common to all file names +in directory @var{directory} that start with @var{filename}. If +@var{predicate} is non-@code{nil} then it ignores possible completions +that don't satisfy @var{predicate}, after calling that function +with one argument, the expanded absolute file name. + +If only one match exists and @var{filename} matches it exactly, the +function returns @code{t}. The function returns @code{nil} if directory +@var{directory} contains no name starting with @var{filename}. + +In the following example, suppose that the current default directory +has five files whose names begin with @samp{f}: @file{foo}, +@file{file~}, @file{file.c}, @file{file.c.~1~}, and +@file{file.c.~2~}.@refill + +@example +@group +(file-name-completion "fi" "") + @result{} "file" +@end group + +@group +(file-name-completion "file.c.~1" "") + @result{} "file.c.~1~" +@end group + +@group +(file-name-completion "file.c.~1~" "") + @result{} t +@end group + +@group +(file-name-completion "file.c.~3" "") + @result{} nil +@end group +@end example +@end defun + +@defopt completion-ignored-extensions +@code{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. This variable has no effect +on @code{file-name-all-completions}.@refill + +A typical value might look like this: + +@example +@group +completion-ignored-extensions + @result{} (".o" ".elc" "~" ".dvi") +@end group +@end example + +If an element of @code{completion-ignored-extensions} ends in a slash +@samp{/}, it signals a directory. The elements which do @emph{not} end +in a slash will never match a directory; thus, the above value will not +filter out a directory named @file{foo.elc}. +@end defopt + +@node Standard File Names +@subsection Standard File Names + + Most of the file names used in Lisp programs are entered by the user. +But occasionally a Lisp program needs to specify a standard file name +for a particular use---typically, to hold customization information +about each user. For example, abbrev definitions are stored (by +default) in the file @file{~/.abbrev_defs}; the @code{completion} +package stores completions in the file @file{~/.completions}. These are +two of the many standard file names used by parts of Emacs for certain +purposes. + + Various operating systems have their own conventions for valid file +names and for which file names to use for user profile data. A Lisp +program which reads a file using a standard file name ought to use, on +each type of system, a file name suitable for that system. The function +@code{convert-standard-filename} makes this easy to do. + +@defun convert-standard-filename filename +This function alters the file name @var{filename} to fit the conventions +of the operating system in use, and returns the result as a new string. +@end defun + + The recommended way to specify a standard file name in a Lisp program +is to choose a name which fits the conventions of GNU and Unix systems, +usually with a nondirectory part that starts with a period, and pass it +to @code{convert-standard-filename} instead of using it directly. Here +is an example from the @code{completion} package: + +@example +(defvar save-completions-file-name + (convert-standard-filename "~/.completions") + "*The file name to save completions to.") +@end example + + On GNU and Unix systems, and on some other systems as well, +@code{convert-standard-filename} returns its argument unchanged. On +some other systems, it alters the name to fit the system's conventions. + + For example, on MS-DOS the alterations made by this function include +converting a leading @samp{.} to @samp{_}, converting a @samp{_} in the +middle of the name to @samp{.} if there is no other @samp{.}, inserting +a @samp{.} after eight characters if there is none, and truncating to +three characters after the @samp{.}. (It makes other changes as well.) +Thus, @file{.abbrev_defs} becomes @file{_abbrev.def}, and +@file{.completions} becomes @file{_complet.ion}. + +@node Contents of Directories +@section Contents of Directories +@cindex directory-oriented functions +@cindex file names in directory + + 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 @code{ls} shell command. In +the latter case, it can optionally display information about each file, +depending on the options passed to the @code{ls} command. + +@defun directory-files directory &optional full-name match-regexp nosort +This function returns a list of the names of the files in the directory +@var{directory}. By default, the list is in alphabetical order. + +If @var{full-name} is non-@code{nil}, the function returns the files' +absolute file names. Otherwise, it returns the names relative to +the specified directory. + +If @var{match-regexp} is non-@code{nil}, this function returns only +those file names that contain a match for that regular expression---the +other file names are excluded from the list. On case-insensitive +filesystems, the regular expression matching is case-insensitive. + +@c Emacs 19 feature +If @var{nosort} is non-@code{nil}, @code{directory-files} does not sort +the list, so you get the file names in no particular order. Use this if +you want the utmost possible speed and don't care what order the files +are processed in. If the order of processing is visible to the user, +then the user will probably be happier if you do sort the names. + +@example +@group +(directory-files "~lewis") + @result{} ("#foo#" "#foo.el#" "." ".." + "dired-mods.el" "files.texi" + "files.texi.~1~") +@end group +@end example + +An error is signaled if @var{directory} is not the name of a directory +that can be read. +@end defun + +@defun directory-files-and-attributes directory &optional full-name match-regexp nosort id-format +This is similar to @code{directory-files} in deciding which files +to report on and how to report their names. However, instead +of returning a list of file names, it returns for each file a +list @code{(@var{filename} . @var{attributes})}, where @var{attributes} +is what @code{file-attributes} would return for that file. +The optional argument @var{id-format} has the same meaning as the +corresponding argument to @code{file-attributes} (@pxref{Definition +of file-attributes}). +@end defun + +@defun file-name-all-versions file dirname +This function returns a list of all versions of the file named +@var{file} in directory @var{dirname}. It is only available on VMS. +@end defun + +@defun file-expand-wildcards pattern &optional full +This function expands the wildcard pattern @var{pattern}, returning +a list of file names that match it. + +If @var{pattern} is written as an absolute file name, +the values are absolute also. + +If @var{pattern} is written as a relative file name, it is interpreted +relative to the current default directory. The file names returned are +normally also relative to the current default directory. However, if +@var{full} is non-@code{nil}, they are absolute. +@end defun + +@defun insert-directory file switches &optional wildcard full-directory-p +This function inserts (in the current buffer) a directory listing for +directory @var{file}, formatted with @code{ls} according to +@var{switches}. It leaves point after the inserted text. +@var{switches} may be a string of options, or a list of strings +representing individual options. + +The argument @var{file} may be either a directory name or a file +specification including wildcard characters. If @var{wildcard} is +non-@code{nil}, that means treat @var{file} as a file specification with +wildcards. + +If @var{full-directory-p} is non-@code{nil}, that means the directory +listing is expected to show the full contents of a directory. You +should specify @code{t} when @var{file} is a directory and switches do +not contain @samp{-d}. (The @samp{-d} option to @code{ls} says to +describe a directory itself as a file, rather than showing its +contents.) + +On most systems, this function works by running a directory listing +program whose name is in the variable @code{insert-directory-program}. +If @var{wildcard} is non-@code{nil}, it also runs the shell specified by +@code{shell-file-name}, to expand the wildcards. + +MS-DOS and MS-Windows systems usually lack the standard Unix program +@code{ls}, so this function emulates the standard Unix program @code{ls} +with Lisp code. + +As a technical detail, when @var{switches} contains the long +@samp{--dired} option, @code{insert-directory} treats it specially, +for the sake of dired. However, the normally equivalent short +@samp{-D} option is just passed on to @code{insert-directory-program}, +as any other option. +@end defun + +@defvar insert-directory-program +This variable's value is the program to run to generate a directory listing +for the function @code{insert-directory}. It is ignored on systems +which generate the listing with Lisp code. +@end defvar + +@node Create/Delete Dirs +@section Creating and Deleting Directories +@cindex creating and deleting directories +@c Emacs 19 features + + Most Emacs Lisp file-manipulation functions get errors when used on +files that are directories. For example, you cannot delete a directory +with @code{delete-file}. These special functions exist to create and +delete directories. + +@defun make-directory dirname &optional parents +This function creates a directory named @var{dirname}. +If @var{parents} is non-@code{nil}, as is always the case in an +interactive call, that means to create the parent directories first, +if they don't already exist. +@end defun + +@defun delete-directory dirname +This function deletes the directory named @var{dirname}. The function +@code{delete-file} does not work for files that are directories; you +must use @code{delete-directory} for them. If the directory contains +any files, @code{delete-directory} signals an error. + +This function only follows symbolic links at the level of parent +directories. +@end defun + +@node Magic File Names +@section Making Certain File Names ``Magic'' +@cindex magic file names + +@c Emacs 19 feature + You can implement special handling for certain file names. This is +called making those names @dfn{magic}. The principal use for this +feature is in implementing remote file names (@pxref{Remote Files,, +Remote Files, emacs, The GNU Emacs Manual}). + + To define a kind of magic file name, you must supply a regular +expression to define the class of names (all those that match the +regular expression), plus a handler that implements all the primitive +Emacs file operations for file names that do match. + + The variable @code{file-name-handler-alist} holds a list of handlers, +together with regular expressions that determine when to apply each +handler. Each element has this form: + +@example +(@var{regexp} . @var{handler}) +@end example + +@noindent +All the Emacs primitives for file access and file name transformation +check the given file name against @code{file-name-handler-alist}. If +the file name matches @var{regexp}, the primitives handle that file by +calling @var{handler}. + + The first argument given to @var{handler} is the name of the +primitive, as a symbol; the remaining arguments are the arguments that +were passed to that primitive. (The first of these arguments is most +often the file name itself.) For example, if you do this: + +@example +(file-exists-p @var{filename}) +@end example + +@noindent +and @var{filename} has handler @var{handler}, then @var{handler} is +called like this: + +@example +(funcall @var{handler} 'file-exists-p @var{filename}) +@end example + + When a function takes two or more arguments that must be file names, +it checks each of those names for a handler. For example, if you do +this: + +@example +(expand-file-name @var{filename} @var{dirname}) +@end example + +@noindent +then it checks for a handler for @var{filename} and then for a handler +for @var{dirname}. In either case, the @var{handler} is called like +this: + +@example +(funcall @var{handler} 'expand-file-name @var{filename} @var{dirname}) +@end example + +@noindent +The @var{handler} then needs to figure out whether to handle +@var{filename} or @var{dirname}. + + If the specified file name matches more than one handler, the one +whose match starts last in the file name gets precedence. This rule +is chosen so that handlers for jobs such as uncompression are handled +first, before handlers for jobs such as remote file access. + + Here are the operations that a magic file name handler gets to handle: + +@ifnottex +@noindent +@code{access-file}, @code{add-name-to-file}, +@code{byte-compiler-base-file-name},@* +@code{copy-file}, @code{delete-directory}, +@code{delete-file}, +@code{diff-latest-backup-file}, +@code{directory-file-name}, +@code{directory-files}, +@code{directory-files-and-attributes}, +@code{dired-compress-file}, @code{dired-uncache},@* +@code{expand-file-name}, +@code{file-accessible-directory-p}, +@code{file-attributes}, +@code{file-directory-p}, +@code{file-executable-p}, @code{file-exists-p}, +@code{file-local-copy}, @code{file-remote-p}, +@code{file-modes}, @code{file-name-all-completions}, +@code{file-name-as-directory}, +@code{file-name-completion}, +@code{file-name-directory}, +@code{file-name-nondirectory}, +@code{file-name-sans-versions}, @code{file-newer-than-file-p}, +@code{file-ownership-preserved-p}, +@code{file-readable-p}, @code{file-regular-p}, @code{file-symlink-p}, +@code{file-truename}, @code{file-writable-p}, +@code{find-backup-file-name}, +@code{find-file-noselect},@* +@code{get-file-buffer}, +@code{insert-directory}, +@code{insert-file-contents},@* +@code{load}, +@code{make-auto-save-file-name}, +@code{make-directory}, +@code{make-directory-internal}, +@code{make-symbolic-link},@* +@code{process-file}, +@code{rename-file}, @code{set-file-modes}, @code{set-file-times}, +@code{set-visited-file-modtime}, @code{shell-command}, +@code{start-file-process}, +@code{substitute-in-file-name},@* +@code{unhandled-file-name-directory}, +@code{vc-registered}, +@code{verify-visited-file-modtime},@* +@code{write-region}. +@end ifnottex +@iftex +@noindent +@flushleft +@code{access-file}, @code{add-name-to-file}, +@code{byte-com@discretionary{}{}{}piler-base-file-name}, +@code{copy-file}, @code{delete-directory}, +@code{delete-file}, +@code{diff-latest-backup-file}, +@code{directory-file-name}, +@code{directory-files}, +@code{directory-files-and-at@discretionary{}{}{}tributes}, +@code{dired-compress-file}, @code{dired-uncache}, +@code{expand-file-name}, +@code{file-accessible-direc@discretionary{}{}{}tory-p}, +@code{file-attributes}, +@code{file-direct@discretionary{}{}{}ory-p}, +@code{file-executable-p}, @code{file-exists-p}, +@code{file-local-copy}, @code{file-remote-p}, +@code{file-modes}, @code{file-name-all-completions}, +@code{file-name-as-directory}, +@code{file-name-completion}, +@code{file-name-directory}, +@code{file-name-nondirec@discretionary{}{}{}tory}, +@code{file-name-sans-versions}, @code{file-newer-than-file-p}, +@code{file-ownership-pre@discretionary{}{}{}served-p}, +@code{file-readable-p}, @code{file-regular-p}, @code{file-symlink-p}, +@code{file-truename}, @code{file-writable-p}, +@code{find-backup-file-name}, +@code{find-file-noselect}, +@code{get-file-buffer}, +@code{insert-directory}, +@code{insert-file-contents}, +@code{load}, @code{make-direc@discretionary{}{}{}tory}, +@code{make-direc@discretionary{}{}{}tory-internal}, +@code{make-symbolic-link}, +@code{process-file}, +@code{rename-file}, @code{set-file-modes}, +@code{set-visited-file-modtime}, @code{shell-command}, +@code{start-file-process}, +@code{substitute-in-file-name}, +@code{unhandled-file-name-directory}, +@code{vc-regis@discretionary{}{}{}tered}, +@code{verify-visited-file-modtime}, +@code{write-region}. +@end flushleft +@end iftex + + Handlers for @code{insert-file-contents} typically need to clear the +buffer's modified flag, with @code{(set-buffer-modified-p nil)}, if the +@var{visit} argument is non-@code{nil}. This also has the effect of +unlocking the buffer if it is locked. + + The handler function must handle all of the above operations, and +possibly others to be added in the future. It need not implement all +these operations itself---when it has nothing special to do for a +certain operation, it can reinvoke the primitive, to handle the +operation ``in the usual way.'' It should always reinvoke the primitive +for an operation it does not recognize. Here's one way to do this: + +@smallexample +(defun my-file-handler (operation &rest args) + ;; @r{First check for the specific operations} + ;; @r{that we have special handling for.} + (cond ((eq operation 'insert-file-contents) @dots{}) + ((eq operation 'write-region) @dots{}) + @dots{} + ;; @r{Handle any operation we don't know about.} + (t (let ((inhibit-file-name-handlers + (cons 'my-file-handler + (and (eq inhibit-file-name-operation operation) + inhibit-file-name-handlers))) + (inhibit-file-name-operation operation)) + (apply operation args))))) +@end smallexample + + When a handler function decides to call the ordinary Emacs primitive for +the operation at hand, it needs to prevent the primitive from calling +the same handler once again, thus leading to an infinite recursion. The +example above shows how to do this, with the variables +@code{inhibit-file-name-handlers} and +@code{inhibit-file-name-operation}. Be careful to use them exactly as +shown above; the details are crucial for proper behavior in the case of +multiple handlers, and for operations that have two file names that may +each have handlers. + +@kindex safe-magic (@r{property}) + Handlers that don't really do anything special for actual access to the +file---such as the ones that implement completion of host names for +remote file names---should have a non-@code{nil} @code{safe-magic} +property. For instance, Emacs normally ``protects'' directory names +it finds in @code{PATH} from becoming magic, if they look like magic +file names, by prefixing them with @samp{/:}. But if the handler that +would be used for them has a non-@code{nil} @code{safe-magic} +property, the @samp{/:} is not added. + +@kindex operations (@r{property}) + A file name handler can have an @code{operations} property to +declare which operations it handles in a nontrivial way. If this +property has a non-@code{nil} value, it should be a list of +operations; then only those operations will call the handler. This +avoids inefficiency, but its main purpose is for autoloaded handler +functions, so that they won't be loaded except when they have real +work to do. + + Simply deferring all operations to the usual primitives does not +work. For instance, if the file name handler applies to +@code{file-exists-p}, then it must handle @code{load} itself, because +the usual @code{load} code won't work properly in that case. However, +if the handler uses the @code{operations} property to say it doesn't +handle @code{file-exists-p}, then it need not handle @code{load} +nontrivially. + +@defvar inhibit-file-name-handlers +This variable holds a list of handlers whose use is presently inhibited +for a certain operation. +@end defvar + +@defvar inhibit-file-name-operation +The operation for which certain handlers are presently inhibited. +@end defvar + +@defun find-file-name-handler file operation +This function returns the handler function for file name @var{file}, +or @code{nil} if there is none. The argument @var{operation} should +be the operation to be performed on the file---the value you will pass +to the handler as its first argument when you call it. If +@var{operation} equals @code{inhibit-file-name-operation}, or if it is +not found in the @code{operations} property of the handler, this +function returns @code{nil}. +@end defun + +@defun file-local-copy filename +This function copies file @var{filename} to an ordinary non-magic file +on the local machine, if it isn't on the local machine already. Magic +file names should handle the @code{file-local-copy} operation if they +refer to files on other machines. A magic file name that is used for +other purposes than remote file access should not handle +@code{file-local-copy}; then this function will treat the file as +local. + +If @var{filename} is local, whether magic or not, this function does +nothing and returns @code{nil}. Otherwise it returns the file name +of the local copy file. +@end defun + +@defun file-remote-p filename &optional identification connected +This function tests whether @var{filename} is a remote file. If +@var{filename} is local (not remote), the return value is @code{nil}. +If @var{filename} is indeed remote, the return value is a string that +identifies the remote system. + +This identifier string can include a host name and a user name, as +well as characters designating the method used to access the remote +system. For example, the remote identifier string for the filename +@code{/sudo::/some/file} is @code{/sudo:root@@localhost:}. + +If @code{file-remote-p} returns the same identifier for two different +filenames, that means they are stored on the same file system and can +be accessed locally with respect to each other. This means, for +example, that it is possible to start a remote process accessing both +files at the same time. Implementors of file handlers need to ensure +this principle is valid. + +@var{identification} specifies which part of the identifier shall be +returned as string. @var{identification} can be the symbol +@code{method}, @code{user} or @code{host}; any other value is handled +like @code{nil} and means to return the complete identifier string. +In the example above, the remote @code{user} identifier string would +be @code{root}. + +If @var{connected} is non-@code{nil}, this function returns @code{nil} +even if @var{filename} is remote, if Emacs has no network connection +to its host. This is useful when you want to avoid the delay of +making connections when they don't exist. +@end defun + +@defun unhandled-file-name-directory filename +This function returns the name of a directory that is not magic. It +uses the directory part of @var{filename} if that is not magic. For a +magic file name, it invokes the file name handler, which therefore +decides what value to return. + +This is useful for running a subprocess; every subprocess must have a +non-magic directory to serve as its current directory, and this function +is a good way to come up with one. +@end defun + +@node Format Conversion +@section File Format Conversion + +@cindex file format conversion +@cindex encoding file formats +@cindex decoding file formats +@cindex text properties in files +@cindex saving text properties + Emacs performs several steps to convert the data in a buffer (text, +text properties, and possibly other information) to and from a +representation suitable for storing into a file. This section describes +the fundamental functions that perform this @dfn{format conversion}, +namely @code{insert-file-contents} for reading a file into a buffer, +and @code{write-region} for writing a buffer into a file. + +@menu +* Overview: Format Conversion Overview. @code{insert-file-contents} and @code{write-region} +* Round-Trip: Format Conversion Round-Trip. Using @code{format-alist}. +* Piecemeal: Format Conversion Piecemeal. Specifying non-paired conversion. +@end menu + +@node Format Conversion Overview +@subsection Overview +@noindent +The function @code{insert-file-contents}: + +@itemize +@item initially, inserts bytes from the file into the buffer; +@item decodes bytes to characters as appropriate; +@item processes formats as defined by entries in @code{format-alist}; and +@item calls functions in @code{after-insert-file-functions}. +@end itemize + +@noindent +The function @code{write-region}: + +@itemize +@item initially, calls functions in @code{write-region-annotate-functions}; +@item processes formats as defined by entries in @code{format-alist}; +@item encodes characters to bytes as appropriate; and +@item modifies the file with the bytes. +@end itemize + + This shows the symmetry of the lowest-level operations; reading and +writing handle things in opposite order. The rest of this section +describes the two facilities surrounding the three variables named +above, as well as some related functions. @ref{Coding Systems}, for +details on character encoding and decoding. + +@node Format Conversion Round-Trip +@subsection Round-Trip Specification + + The most general of the two facilities is controlled by the variable +@code{format-alist}, a list of @dfn{file format} specifications, which +describe textual representations used in files for the data in an Emacs +buffer. The descriptions for reading and writing are paired, which is +why we call this ``round-trip'' specification +(@pxref{Format Conversion Piecemeal}, for non-paired specification). + +@defvar format-alist +This list contains one format definition for each defined file format. +Each format definition is a list of this form: + +@example +(@var{name} @var{doc-string} @var{regexp} @var{from-fn} @var{to-fn} @var{modify} @var{mode-fn}) +@end example +@end defvar + +@cindex format definition +@noindent +Here is what the elements in a format definition mean: + +@table @var +@item name +The name of this format. + +@item doc-string +A documentation string for the format. + +@item regexp +A regular expression which is used to recognize files represented in +this format. + +@item from-fn +A shell command or function to decode data in this format (to convert +file data into the usual Emacs data representation). + +A shell command is represented as a string; Emacs runs the command as a +filter to perform the conversion. + +If @var{from-fn} is a function, it is called with two arguments, @var{begin} +and @var{end}, which specify the part of the buffer it should convert. +It should convert the text by editing it in place. Since this can +change the length of the text, @var{from-fn} should return the modified +end position. + +One responsibility of @var{from-fn} is to make sure that the beginning +of the file no longer matches @var{regexp}. Otherwise it is likely to +get called again. + +@item to-fn +A shell command or function to encode data in this format---that is, to +convert the usual Emacs data representation into this format. + +If @var{to-fn} is a string, it is a shell command; Emacs runs the +command as a filter to perform the conversion. + +If @var{to-fn} is a function, it is called with three arguments: +@var{begin} and @var{end}, which specify the part of the buffer it +should convert, and @var{buffer}, which specifies which buffer. There +are two ways it can do the conversion: + +@itemize @bullet +@item +By editing the buffer in place. In this case, @var{to-fn} should +return the end-position of the range of text, as modified. + +@item +By returning a list of annotations. This is a list of elements of the +form @code{(@var{position} . @var{string})}, where @var{position} is an +integer specifying the relative position in the text to be written, and +@var{string} is the annotation to add there. The list must be sorted in +order of position when @var{to-fn} returns it. + +When @code{write-region} actually writes the text from the buffer to the +file, it intermixes the specified annotations at the corresponding +positions. All this takes place without modifying the buffer. +@end itemize + +@item modify +A flag, @code{t} if the encoding function modifies the buffer, and +@code{nil} if it works by returning a list of annotations. + +@item mode-fn +A minor-mode function to call after visiting a file converted from this +format. The function is called with one argument, the integer 1; +that tells a minor-mode function to enable the mode. +@end table + +The function @code{insert-file-contents} automatically recognizes file +formats when it reads the specified file. It checks the text of the +beginning of the file against the regular expressions of the format +definitions, and if it finds a match, it calls the decoding function for +that format. Then it checks all the known formats over again. +It keeps checking them until none of them is applicable. + +Visiting a file, with @code{find-file-noselect} or the commands that use +it, performs conversion likewise (because it calls +@code{insert-file-contents}); it also calls the mode function for each +format that it decodes. It stores a list of the format names in the +buffer-local variable @code{buffer-file-format}. + +@defvar buffer-file-format +This variable states the format of the visited file. More precisely, +this is a list of the file format names that were decoded in the course +of visiting the current buffer's file. It is always buffer-local in all +buffers. +@end defvar + +When @code{write-region} writes data into a file, it first calls the +encoding functions for the formats listed in @code{buffer-file-format}, +in the order of appearance in the list. + +@deffn Command format-write-file file format &optional confirm +This command writes the current buffer contents into the file +@var{file} in format @var{format}, and makes that format the default +for future saves of the buffer. The argument @var{format} is a list +of format names. Except for the @var{format} argument, this command +is similar to @code{write-file}. In particular, @var{confirm} has the +same meaning and interactive treatment as the corresponding argument +to @code{write-file}. @xref{Definition of write-file}. +@end deffn + +@deffn Command format-find-file file format +This command finds the file @var{file}, converting it according to +format @var{format}. It also makes @var{format} the default if the +buffer is saved later. + +The argument @var{format} is a list of format names. If @var{format} is +@code{nil}, no conversion takes place. Interactively, typing just +@key{RET} for @var{format} specifies @code{nil}. +@end deffn + +@deffn Command format-insert-file file format &optional beg end +This command inserts the contents of file @var{file}, converting it +according to format @var{format}. If @var{beg} and @var{end} are +non-@code{nil}, they specify which part of the file to read, as in +@code{insert-file-contents} (@pxref{Reading from Files}). + +The return value is like what @code{insert-file-contents} returns: a +list of the absolute file name and the length of the data inserted +(after conversion). + +The argument @var{format} is a list of format names. If @var{format} is +@code{nil}, no conversion takes place. Interactively, typing just +@key{RET} for @var{format} specifies @code{nil}. +@end deffn + +@defvar buffer-auto-save-file-format +This variable specifies the format to use for auto-saving. Its value is +a list of format names, just like the value of +@code{buffer-file-format}; however, it is used instead of +@code{buffer-file-format} for writing auto-save files. If the value +is @code{t}, the default, auto-saving uses the same format as a +regular save in the same buffer. This variable is always buffer-local +in all buffers. +@end defvar + +@node Format Conversion Piecemeal +@subsection Piecemeal Specification + + In contrast to the round-trip specification described in the previous +subsection (@pxref{Format Conversion Round-Trip}), you can use the variables +@code{after-insert-file-functions} and @code{write-region-annotate-functions} +to separately control the respective reading and writing conversions. + + Conversion starts with one representation and produces another +representation. When there is only one conversion to do, there is no +conflict about what to start with. However, when there are multiple +conversions involved, conflict may arise when two conversions need to +start with the same data. + + This situation is best understood in the context of converting text +properties during @code{write-region}. For example, the character at +position 42 in a buffer is @samp{X} with a text property @code{foo}. If +the conversion for @code{foo} is done by inserting into the buffer, say, +@samp{FOO:}, then that changes the character at position 42 from +@samp{X} to @samp{F}. The next conversion will start with the wrong +data straight away. + + To avoid conflict, cooperative conversions do not modify the buffer, +but instead specify @dfn{annotations}, a list of elements of the form +@code{(@var{position} . @var{string})}, sorted in order of increasing +@var{position}. + + If there is more than one conversion, @code{write-region} merges their +annotations destructively into one sorted list. Later, when the text +from the buffer is actually written to the file, it intermixes the +specified annotations at the corresponding positions. All this takes +place without modifying the buffer. + +@c ??? What about ``overriding'' conversions like those allowed +@c ??? for `write-region-annotate-functions', below? --ttn + + In contrast, when reading, the annotations intermixed with the text +are handled immediately. @code{insert-file-contents} sets point to the +beginning of some text to be converted, then calls the conversion +functions with the length of that text. These functions should always +return with point at the beginning of the inserted text. This approach +makes sense for reading because annotations removed by the first +converter can't be mistakenly processed by a later converter. + + Each conversion function should scan for the annotations it +recognizes, remove the annotation, modify the buffer text (to set a text +property, for example), and return the updated length of the text, as it +stands after those changes. The value returned by one function becomes +the argument to the next function. + +@defvar write-region-annotate-functions +A list of functions for @code{write-region} to call. Each function in +the list is called with two arguments: the start and end of the region +to be written. These functions should not alter the contents of the +buffer. Instead, they should return annotations. + +@c ??? Following adapted from comment in `build_annotations' (fileio.c). +@c ??? Perhaps this is intended for internal use only? +@c ??? Someone who understands this, please reword it. --ttn +As a special case, if a function returns with a different buffer +current, Emacs takes it to mean the current buffer contains altered text +to be output, and discards all previous annotations because they should +have been dealt with by this function. +@end defvar + +@defvar after-insert-file-functions +Each function in this list is called by @code{insert-file-contents} +with one argument, the number of characters inserted, and with point +at the beginning of the inserted text. Each function should leave +point unchanged, and return the new character count describing the +inserted text as modified by the function. +@c ??? The docstring mentions a handler from `file-name-handler-alist' +@c "intercepting" `insert-file-contents'. Hmmm. --ttn +@end defvar + + We invite users to write Lisp programs to store and retrieve text +properties in files, using these hooks, and thus to experiment with +various data formats and find good ones. Eventually we hope users +will produce good, general extensions we can install in Emacs. + + We suggest not trying to handle arbitrary Lisp objects as text property +names or values---because a program that general is probably difficult +to write, and slow. Instead, choose a set of possible data types that +are reasonably flexible, and not too hard to encode. + +@ignore + arch-tag: 141f74ce-6ae3-40dc-a6c4-ef83fc4ec35c +@end ignore diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi new file mode 100644 index 00000000000..7d2ea7cf70e --- /dev/null +++ b/doc/lispref/frames.texi @@ -0,0 +1,2208 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/frames +@node Frames, Positions, Windows, Top +@chapter Frames +@cindex frame + + In Emacs editing, A @dfn{frame} is a screen object that contains one +or more Emacs windows. It's the kind of object that is called a +``window'' in the terminology of graphical environments; but we can't +call it a ``window'' here, because Emacs uses that word in a different +way. + + A frame initially contains a single main window and/or a minibuffer +window; you can subdivide the main window vertically or horizontally +into smaller windows. In Emacs Lisp, a @dfn{frame object} is a Lisp +object that represents a frame on the screen. + +@cindex terminal frame + When Emacs runs on a text-only terminal, it starts with one +@dfn{terminal frame}. If you create additional ones, Emacs displays +one and only one at any given time---on the terminal screen, of course. + +@cindex window frame + When Emacs communicates directly with a supported window system, such +as X, it does not have a terminal frame; instead, it starts with +a single @dfn{window frame}, but you can create more, and Emacs can +display several such frames at once as is usual for window systems. + +@defun framep object +This predicate returns a non-@code{nil} value if @var{object} is a +frame, and @code{nil} otherwise. For a frame, the value indicates which +kind of display the frame uses: + +@table @code +@item x +The frame is displayed in an X window. +@item t +A terminal frame on a character display. +@item mac +The frame is displayed on a Macintosh. +@item w32 +The frame is displayed on MS-Windows 9X/NT. +@item pc +The frame is displayed on an MS-DOS terminal. +@end table +@end defun + +@menu +* Creating Frames:: Creating additional frames. +* Multiple Displays:: Creating frames on other displays. +* Frame Parameters:: Controlling frame size, position, font, etc. +* Frame Titles:: Automatic updating of frame titles. +* Deleting Frames:: Frames last until explicitly deleted. +* Finding All Frames:: How to examine all existing frames. +* Frames and Windows:: A frame contains windows; + display of text always works through windows. +* Minibuffers and Frames:: How a frame finds the minibuffer to use. +* Input Focus:: Specifying the selected frame. +* Visibility of Frames:: Frames may be visible or invisible, or icons. +* Raising and Lowering:: Raising a frame makes it hide other windows; + lowering it makes the others hide it. +* Frame Configurations:: Saving the state of all frames. +* Mouse Tracking:: Getting events that say when the mouse moves. +* Mouse Position:: Asking where the mouse is, or moving it. +* Pop-Up Menus:: Displaying a menu for the user to select from. +* Dialog Boxes:: Displaying a box to ask yes or no. +* Pointer Shape:: Specifying the shape of the mouse pointer. +* Window System Selections:: Transferring text to and from other X clients. +* Drag and Drop:: Internals of Drag-and-Drop implementation. +* Color Names:: Getting the definitions of color names. +* Text Terminal Colors:: Defining colors for text-only terminals. +* Resources:: Getting resource values from the server. +* Display Feature Testing:: Determining the features of a terminal. +@end menu + + @xref{Display}, for information about the related topic of +controlling Emacs redisplay. + +@node Creating Frames +@section Creating Frames + +To create a new frame, call the function @code{make-frame}. + +@defun make-frame &optional alist +This function creates and returns a new frame, displaying the current +buffer. If you are using a supported window system, it makes a window +frame; otherwise, it makes a terminal frame. + +The argument is an alist specifying frame parameters. Any parameters +not mentioned in @var{alist} default according to the value of the +variable @code{default-frame-alist}; parameters not specified even there +default from the standard X resources or whatever is used instead on +your system. + +The set of possible parameters depends in principle on what kind of +window system Emacs uses to display its frames. @xref{Window Frame +Parameters}, for documentation of individual parameters you can specify. + +This function itself does not make the new frame the selected frame. +@xref{Input Focus}. The previously selected frame remains selected. +However, the window system may select the new frame for its own reasons, +for instance if the frame appears under the mouse pointer and your +setup is for focus to follow the pointer. +@end defun + +@defvar before-make-frame-hook +A normal hook run by @code{make-frame} before it actually creates the +frame. +@end defvar + +@defvar after-make-frame-functions +An abnormal hook run by @code{make-frame} after it creates the frame. +Each function in @code{after-make-frame-functions} receives one argument, the +frame just created. +@end defvar + +@node Multiple Displays +@section Multiple Displays +@cindex multiple X displays +@cindex displays, multiple + + A single Emacs can talk to more than one X display. +Initially, Emacs uses just one display---the one chosen with the +@code{DISPLAY} environment variable or with the @samp{--display} option +(@pxref{Initial Options,,, emacs, The GNU Emacs Manual}). To connect to +another display, use the command @code{make-frame-on-display} or specify +the @code{display} frame parameter when you create the frame. + + Emacs treats each X server as a separate terminal, giving each one its +own selected frame and its own minibuffer windows. However, only one of +those frames is ``@emph{the} selected frame'' at any given moment, see +@ref{Input Focus}. + + A few Lisp variables are @dfn{terminal-local}; that is, they have a +separate binding for each terminal. The binding in effect at any time +is the one for the terminal that the currently selected frame belongs +to. These variables include @code{default-minibuffer-frame}, +@code{defining-kbd-macro}, @code{last-kbd-macro}, and +@code{system-key-alist}. They are always terminal-local, and can never +be buffer-local (@pxref{Buffer-Local Variables}) or frame-local. + + A single X server can handle more than one screen. A display name +@samp{@var{host}:@var{server}.@var{screen}} has three parts; the last +part specifies the screen number for a given server. When you use two +screens belonging to one server, Emacs knows by the similarity in their +names that they share a single keyboard, and it treats them as a single +terminal. + + Note that some graphical terminals can output to more than a one +monitor (or other output device) at the same time. On these +``multi-monitor'' setups, a single @var{display} value controls the +output to all the physical monitors. In this situation, there is +currently no platform-independent way for Emacs to distinguish between +the different physical monitors. + +@deffn Command make-frame-on-display display &optional parameters +This creates and returns a new frame on display @var{display}, taking +the other frame parameters from @var{parameters}. Aside from the +@var{display} argument, it is like @code{make-frame} (@pxref{Creating +Frames}). +@end deffn + +@defun x-display-list +This returns a list that indicates which X displays Emacs has a +connection to. The elements of the list are strings, and each one is +a display name. +@end defun + +@defun x-open-connection display &optional xrm-string must-succeed +This function opens a connection to the X display @var{display}. It +does not create a frame on that display, but it permits you to check +that communication can be established with that display. + +The optional argument @var{xrm-string}, if not @code{nil}, is a +string of resource names and values, in the same format used in the +@file{.Xresources} file. The values you specify override the resource +values recorded in the X server itself; they apply to all Emacs frames +created on this display. Here's an example of what this string might +look like: + +@example +"*BorderWidth: 3\n*InternalBorder: 2\n" +@end example + +@xref{X Resources,, X Resources, emacs, The GNU Emacs Manual}. + +If @var{must-succeed} is non-@code{nil}, failure to open the connection +terminates Emacs. Otherwise, it is an ordinary Lisp error. +@end defun + +@defun x-close-connection display +This function closes the connection to display @var{display}. Before +you can do this, you must first delete all the frames that were open on +that display (@pxref{Deleting Frames}). +@end defun + +@node Frame Parameters +@section Frame Parameters +@cindex frame parameters + + A frame has many parameters that control its appearance and behavior. +Just what parameters a frame has depends on what display mechanism it +uses. + + Frame parameters exist mostly for the sake of window systems. A +terminal frame has a few parameters, mostly for compatibility's sake; +only the @code{height}, @code{width}, @code{name}, @code{title}, +@code{menu-bar-lines}, @code{buffer-list} and @code{buffer-predicate} +parameters do something special. If the terminal supports colors, the +parameters @code{foreground-color}, @code{background-color}, +@code{background-mode} and @code{display-type} are also meaningful. + +@menu +* Parameter Access:: How to change a frame's parameters. +* Initial Parameters:: Specifying frame parameters when you make a frame. +* Window Frame Parameters:: List of frame parameters for window systems. +* Size and Position:: Changing the size and position of a frame. +* Geometry:: Parsing geometry specifications. +@end menu + +@node Parameter Access +@subsection Access to Frame Parameters + +These functions let you read and change the parameter values of a +frame. + +@defun frame-parameter frame parameter +This function returns the value of the parameter @var{parameter} (a +symbol) of @var{frame}. If @var{frame} is @code{nil}, it returns the +selected frame's parameter. If @var{frame} has no setting for +@var{parameter}, this function returns @code{nil}. +@end defun + +@defun frame-parameters &optional frame +The function @code{frame-parameters} returns an alist listing all the +parameters of @var{frame} and their values. If @var{frame} is +@code{nil} or omitted, this returns the selected frame's parameters +@end defun + +@defun modify-frame-parameters frame alist +This function alters the parameters of frame @var{frame} based on the +elements of @var{alist}. Each element of @var{alist} has the form +@code{(@var{parm} . @var{value})}, where @var{parm} is a symbol naming a +parameter. If you don't mention a parameter in @var{alist}, its value +doesn't change. If @var{frame} is @code{nil}, it defaults to the selected +frame. +@end defun + +@defun modify-all-frames-parameters alist +This function alters the frame parameters of all existing frames +according to @var{alist}, then modifies @code{default-frame-alist} +(and, if necessary, @code{initial-frame-alist}) to apply the same +parameter values to frames that will be created henceforth. +@end defun + +@node Initial Parameters +@subsection Initial Frame Parameters + +You can specify the parameters for the initial startup frame +by setting @code{initial-frame-alist} in your init file (@pxref{Init File}). + +@defvar initial-frame-alist +This variable's value is an alist of parameter values used when creating +the initial window frame. You can set this variable to specify the +appearance of the initial frame without altering subsequent frames. +Each element has the form: + +@example +(@var{parameter} . @var{value}) +@end example + +Emacs creates the initial frame before it reads your init +file. After reading that file, Emacs checks @code{initial-frame-alist}, +and applies the parameter settings in the altered value to the already +created initial frame. + +If these settings affect the frame geometry and appearance, you'll see +the frame appear with the wrong ones and then change to the specified +ones. If that bothers you, you can specify the same geometry and +appearance with X resources; those do take effect before the frame is +created. @xref{X Resources,, X Resources, emacs, The GNU Emacs Manual}. + +X resource settings typically apply to all frames. If you want to +specify some X resources solely for the sake of the initial frame, and +you don't want them to apply to subsequent frames, here's how to achieve +this. Specify parameters in @code{default-frame-alist} to override the +X resources for subsequent frames; then, to prevent these from affecting +the initial frame, specify the same parameters in +@code{initial-frame-alist} with values that match the X resources. +@end defvar + +If these parameters specify a separate minibuffer-only frame with +@code{(minibuffer . nil)}, and you have not created one, Emacs creates +one for you. + +@defvar minibuffer-frame-alist +This variable's value is an alist of parameter values used when creating +an initial minibuffer-only frame---if such a frame is needed, according +to the parameters for the main initial frame. +@end defvar + +@defvar default-frame-alist +This is an alist specifying default values of frame parameters for all +Emacs frames---the first frame, and subsequent frames. When using the X +Window System, you can get the same results by means of X resources +in many cases. + +Setting this variable does not affect existing frames. +@end defvar + +See also @code{special-display-frame-alist}. @xref{Definition of +special-display-frame-alist}. + +If you use options that specify window appearance when you invoke Emacs, +they take effect by adding elements to @code{default-frame-alist}. One +exception is @samp{-geometry}, which adds the specified position to +@code{initial-frame-alist} instead. @xref{Emacs Invocation,, Command +Line Arguments for Emacs Invocation, emacs, The GNU Emacs Manual}. + +@node Window Frame Parameters +@subsection Window Frame Parameters + + Just what parameters a frame has depends on what display mechanism +it uses. This section describes the parameters that have special +meanings on some or all kinds of terminals. Of these, @code{name}, +@code{title}, @code{height}, @code{width}, @code{buffer-list} and +@code{buffer-predicate} provide meaningful information in terminal +frames, and @code{tty-color-mode} is meaningful @emph{only} in +terminal frames. + +@menu +* Basic Parameters:: Parameters that are fundamental. +* Position Parameters:: The position of the frame on the screen. +* Size Parameters:: Frame's size. +* Layout Parameters:: Size of parts of the frame, and + enabling or disabling some parts. +* Buffer Parameters:: Which buffers have been or should be shown. +* Management Parameters:: Communicating with the window manager. +* Cursor Parameters:: Controlling the cursor appearance. +* Color Parameters:: Colors of various parts of the frame. +@end menu + +@node Basic Parameters +@subsubsection Basic Parameters + + These frame parameters give the most basic information about the +frame. @code{title} and @code{name} are meaningful on all terminals. + +@table @code +@item display +The display on which to open this frame. It should be a string of the +form @code{"@var{host}:@var{dpy}.@var{screen}"}, just like the +@code{DISPLAY} environment variable. + +@item display-type +This parameter describes the range of possible colors that can be used +in this frame. Its value is @code{color}, @code{grayscale} or +@code{mono}. + +@item title +If a frame has a non-@code{nil} title, it appears in the window system's +border for the frame, and also in the mode line of windows in that frame +if @code{mode-line-frame-identification} uses @samp{%F} +(@pxref{%-Constructs}). This is normally the case when Emacs is not +using a window system, and can only display one frame at a time. +@xref{Frame Titles}. + +@item name +The name of the frame. The frame name serves as a default for the frame +title, if the @code{title} parameter is unspecified or @code{nil}. If +you don't specify a name, Emacs sets the frame name automatically +(@pxref{Frame Titles}). + +If you specify the frame name explicitly when you create the frame, the +name is also used (instead of the name of the Emacs executable) when +looking up X resources for the frame. + +@item display-environment-variable +The value of the @code{DISPLAY} environment variable for the frame. It +is passed to child processes. + +@item term-environment-variable +The value of the @code{TERM} environment variable for the frame. It +is passed to child processes. +@end table + +@node Position Parameters +@subsubsection Position Parameters + + Position parameters' values are normally measured in pixels, but on +text-only terminals they count characters or lines instead. + +@table @code +@item left +The screen position of the left edge, in pixels, with respect to the +left edge of the screen. The value may be a positive number @var{pos}, +or a list of the form @code{(+ @var{pos})} which permits specifying a +negative @var{pos} value. + +A negative number @minus{}@var{pos}, or a list of the form @code{(- +@var{pos})}, actually specifies the position of the right edge of the +window with respect to the right edge of the screen. A positive value +of @var{pos} counts toward the left. @strong{Reminder:} if the +parameter is a negative integer @minus{}@var{pos}, then @var{pos} is +positive. + +Some window managers ignore program-specified positions. If you want to +be sure the position you specify is not ignored, specify a +non-@code{nil} value for the @code{user-position} parameter as well. + +@item top +The screen position of the top edge, in pixels, with respect to the +top edge of the screen. It works just like @code{left}, except vertically +instead of horizontally. + +@item icon-left +The screen position of the left edge @emph{of the frame's icon}, in +pixels, counting from the left edge of the screen. This takes effect if +and when the frame is iconified. + +If you specify a value for this parameter, then you must also specify +a value for @code{icon-top} and vice versa. The window manager may +ignore these two parameters. + +@item icon-top +The screen position of the top edge @emph{of the frame's icon}, in +pixels, counting from the top edge of the screen. This takes effect if +and when the frame is iconified. + +@item user-position +When you create a frame and specify its screen position with the +@code{left} and @code{top} parameters, use this parameter to say whether +the specified position was user-specified (explicitly requested in some +way by a human user) or merely program-specified (chosen by a program). +A non-@code{nil} value says the position was user-specified. + +Window managers generally heed user-specified positions, and some heed +program-specified positions too. But many ignore program-specified +positions, placing the window in a default fashion or letting the user +place it with the mouse. Some window managers, including @code{twm}, +let the user specify whether to obey program-specified positions or +ignore them. + +When you call @code{make-frame}, you should specify a non-@code{nil} +value for this parameter if the values of the @code{left} and @code{top} +parameters represent the user's stated preference; otherwise, use +@code{nil}. +@end table + +@node Size Parameters +@subsubsection Size Parameters + + Size parameters' values are normally measured in pixels, but on +text-only terminals they count characters or lines instead. + +@table @code +@item height +The height of the frame contents, in characters. (To get the height in +pixels, call @code{frame-pixel-height}; see @ref{Size and Position}.) + +@item width +The width of the frame contents, in characters. (To get the height in +pixels, call @code{frame-pixel-width}; see @ref{Size and Position}.) + +@item user-size +This does for the size parameters @code{height} and @code{width} what +the @code{user-position} parameter (see above) does for the position +parameters @code{top} and @code{left}. + +@item fullscreen +Specify that width, height or both shall be set to the size of the screen. +The value @code{fullwidth} specifies that width shall be the size of the +screen. The value @code{fullheight} specifies that height shall be the +size of the screen. The value @code{fullboth} specifies that both the +width and the height shall be set to the size of the screen. +@end table + +@node Layout Parameters +@subsubsection Layout Parameters + + These frame parameters enable or disable various parts of the +frame, or control their sizes. + +@table @code +@item border-width +The width in pixels of the frame's border. + +@item internal-border-width +The distance in pixels between text (or fringe) and the frame's border. + +@item vertical-scroll-bars +Whether the frame has scroll bars for vertical scrolling, and which side +of the frame they should be on. The possible values are @code{left}, +@code{right}, and @code{nil} for no scroll bars. + +@ignore +@item horizontal-scroll-bars +Whether the frame has scroll bars for horizontal scrolling +(non-@code{nil} means yes). Horizontal scroll bars are not currently +implemented. +@end ignore + +@item scroll-bar-width +The width of vertical scroll bars, in pixels, or @code{nil} meaning to +use the default width. + +@item left-fringe +@itemx right-fringe +The default width of the left and right fringes of windows in this +frame (@pxref{Fringes}). If either of these is zero, that effectively +removes the corresponding fringe. A value of @code{nil} stands for +the standard fringe width, which is the width needed to display the +fringe bitmaps. + +The combined fringe widths must add up to an integral number of +columns, so the actual default fringe widths for the frame may be +larger than the specified values. The extra width needed to reach an +acceptable total is distributed evenly between the left and right +fringe. However, you can force one fringe or the other to a precise +width by specifying that width as a negative integer. If both widths are +negative, only the left fringe gets the specified width. + +@item menu-bar-lines +The number of lines to allocate at the top of the frame for a menu +bar. The default is 1. A value of @code{nil} means don't display a +menu bar. @xref{Menu Bar}. (The X toolkit and GTK allow at most one +menu bar line; they treat larger values as 1.) + +@item tool-bar-lines +The number of lines to use for the tool bar. A value of @code{nil} +means don't display a tool bar. (GTK allows at most one tool bar line; +it treats larger values as 1.) + +@item line-spacing +Additional space to leave below each text line, in pixels (a positive +integer). @xref{Line Height}, for more information. +@end table + +@node Buffer Parameters +@subsubsection Buffer Parameters + + These frame parameters, meaningful on all kinds of terminals, deal +with which buffers have been, or should, be displayed in the frame. + +@table @code +@item minibuffer +Whether this frame has its own minibuffer. The value @code{t} means +yes, @code{nil} means no, @code{only} means this frame is just a +minibuffer. If the value is a minibuffer window (in some other frame), +the new frame uses that minibuffer. + +@item buffer-predicate +The buffer-predicate function for this frame. The function +@code{other-buffer} uses this predicate (from the selected frame) to +decide which buffers it should consider, if the predicate is not +@code{nil}. It calls the predicate with one argument, a buffer, once for +each buffer; if the predicate returns a non-@code{nil} value, it +considers that buffer. + +@item buffer-list +A list of buffers that have been selected in this frame, +ordered most-recently-selected first. + +@item unsplittable +If non-@code{nil}, this frame's window is never split automatically. +@end table + +@node Management Parameters +@subsubsection Window Management Parameters +@cindex window manager, and frame parameters + + These frame parameters, meaningful only on window system displays, +interact with the window manager. + +@table @code +@item visibility +The state of visibility of the frame. There are three possibilities: +@code{nil} for invisible, @code{t} for visible, and @code{icon} for +iconified. @xref{Visibility of Frames}. + +@item auto-raise +Whether selecting the frame raises it (non-@code{nil} means yes). + +@item auto-lower +Whether deselecting the frame lowers it (non-@code{nil} means yes). + +@item icon-type +The type of icon to use for this frame when it is iconified. If the +value is a string, that specifies a file containing a bitmap to use. +Any other non-@code{nil} value specifies the default bitmap icon (a +picture of a gnu); @code{nil} specifies a text icon. + +@item icon-name +The name to use in the icon for this frame, when and if the icon +appears. If this is @code{nil}, the frame's title is used. + +@item window-id +The number of the window-system window used by the frame +to contain the actual Emacs windows. + +@item outer-window-id +The number of the outermost window-system window used for the whole frame. + +@item wait-for-wm +If non-@code{nil}, tell Xt to wait for the window manager to confirm +geometry changes. Some window managers, including versions of Fvwm2 +and KDE, fail to confirm, so Xt hangs. Set this to @code{nil} to +prevent hanging with those window managers. + +@ignore +@item parent-id +@c ??? Not yet working. +The X window number of the window that should be the parent of this one. +Specifying this lets you create an Emacs window inside some other +application's window. (It is not certain this will be implemented; try +it and see if it works.) +@end ignore +@end table + +@node Cursor Parameters +@subsubsection Cursor Parameters + + This frame parameter controls the way the cursor looks. + +@table @code +@item cursor-type +How to display the cursor. Legitimate values are: + +@table @code +@item box +Display a filled box. (This is the default.) +@item hollow +Display a hollow box. +@item nil +Don't display a cursor. +@item bar +Display a vertical bar between characters. +@item (bar . @var{width}) +Display a vertical bar @var{width} pixels wide between characters. +@item hbar +Display a horizontal bar. +@item (hbar . @var{height}) +Display a horizontal bar @var{height} pixels high. +@end table +@end table + +@vindex cursor-type +The buffer-local variable @code{cursor-type} overrides the value of +the @code{cursor-type} frame parameter, but if it is @code{t}, that +means to use the cursor specified for the frame. + +@defvar blink-cursor-alist +This variable specifies how to blink the cursor. Each element has the +form @code{(@var{on-state} . @var{off-state})}. Whenever the cursor +type equals @var{on-state} (comparing using @code{equal}), the +corresponding @var{off-state} specifies what the cursor looks like +when it blinks ``off.'' Both @var{on-state} and @var{off-state} +should be suitable values for the @code{cursor-type} frame parameter. + +There are various defaults for how to blink each type of cursor, if +the type is not mentioned as an @var{on-state} here. Changes in this +variable do not take effect immediately, because the variable is +examined only when you specify the @code{cursor-type} parameter. +@end defvar + +@node Color Parameters +@subsubsection Color Parameters + + These frame parameters control the use of colors. + +@table @code +@item background-mode +This parameter is either @code{dark} or @code{light}, according +to whether the background color is a light one or a dark one. + +@item tty-color-mode +@cindex standard colors for character terminals +This parameter overrides the terminal's color support as given by the +system's terminal capabilities database in that this parameter's value +specifies the color mode to use in terminal frames. The value can be +either a symbol or a number. A number specifies the number of colors +to use (and, indirectly, what commands to issue to produce each +color). For example, @code{(tty-color-mode . 8)} specifies use of the +ANSI escape sequences for 8 standard text colors. A value of -1 turns +off color support. + +If the parameter's value is a symbol, it specifies a number through +the value of @code{tty-color-mode-alist}, and the associated number is +used instead. + +@item screen-gamma +@cindex gamma correction +If this is a number, Emacs performs ``gamma correction'' which adjusts +the brightness of all colors. The value should be the screen gamma of +your display, a floating point number. + +Usual PC monitors have a screen gamma of 2.2, so color values in +Emacs, and in X windows generally, are calibrated to display properly +on a monitor with that gamma value. If you specify 2.2 for +@code{screen-gamma}, that means no correction is needed. Other values +request correction, designed to make the corrected colors appear on +your screen the way they would have appeared without correction on an +ordinary monitor with a gamma value of 2.2. + +If your monitor displays colors too light, you should specify a +@code{screen-gamma} value smaller than 2.2. This requests correction +that makes colors darker. A screen gamma value of 1.5 may give good +results for LCD color displays. +@end table + +These frame parameters are semi-obsolete in that they are automatically +equivalent to particular face attributes of particular faces. +@xref{Standard Faces,,, emacs, The Emacs Manual}. + +@table @code +@item font +The name of the font for displaying text in the frame. This is a +string, either a valid font name for your system or the name of an Emacs +fontset (@pxref{Fontsets}). It is equivalent to the @code{font} +attribute of the @code{default} face. + +@item foreground-color +The color to use for the image of a character. It is equivalent to +the @code{:foreground} attribute of the @code{default} face. + +@item background-color +The color to use for the background of characters. It is equivalent to +the @code{:background} attribute of the @code{default} face. + +@item mouse-color +The color for the mouse pointer. It is equivalent to the @code{:background} +attribute of the @code{mouse} face. + +@item cursor-color +The color for the cursor that shows point. It is equivalent to the +@code{:background} attribute of the @code{cursor} face. + +@item border-color +The color for the border of the frame. It is equivalent to the +@code{:background} attribute of the @code{border} face. + +@item scroll-bar-foreground +If non-@code{nil}, the color for the foreground of scroll bars. It is +equivalent to the @code{:foreground} attribute of the +@code{scroll-bar} face. + +@item scroll-bar-background +If non-@code{nil}, the color for the background of scroll bars. It is +equivalent to the @code{:background} attribute of the +@code{scroll-bar} face. +@end table + +@node Size and Position +@subsection Frame Size And Position +@cindex size of frame +@cindex screen size +@cindex frame size +@cindex resize frame + + You can read or change the size and position of a frame using the +frame parameters @code{left}, @code{top}, @code{height}, and +@code{width}. Whatever geometry parameters you don't specify are chosen +by the window manager in its usual fashion. + + Here are some special features for working with sizes and positions. +(For the precise meaning of ``selected frame'' used by these functions, +see @ref{Input Focus}.) + +@defun set-frame-position frame left top +This function sets the position of the top left corner of @var{frame} to +@var{left} and @var{top}. These arguments are measured in pixels, and +normally count from the top left corner of the screen. + +Negative parameter values position the bottom edge of the window up from +the bottom edge of the screen, or the right window edge to the left of +the right edge of the screen. It would probably be better if the values +were always counted from the left and top, so that negative arguments +would position the frame partly off the top or left edge of the screen, +but it seems inadvisable to change that now. +@end defun + +@defun frame-height &optional frame +@defunx frame-width &optional frame +These functions return the height and width of @var{frame}, measured in +lines and columns. If you don't supply @var{frame}, they use the +selected frame. +@end defun + +@defun screen-height +@defunx screen-width +These functions are old aliases for @code{frame-height} and +@code{frame-width}. When you are using a non-window terminal, the size +of the frame is normally the same as the size of the terminal screen. +@end defun + +@defun frame-pixel-height &optional frame +@defunx frame-pixel-width &optional frame +These functions return the height and width of @var{frame}, measured in +pixels. If you don't supply @var{frame}, they use the selected frame. +@end defun + +@defun frame-char-height &optional frame +@defunx frame-char-width &optional frame +These functions return the height and width of a character in +@var{frame}, measured in pixels. The values depend on the choice of +font. If you don't supply @var{frame}, these functions use the selected +frame. +@end defun + +@defun set-frame-size frame cols rows +This function sets the size of @var{frame}, measured in characters; +@var{cols} and @var{rows} specify the new width and height. + +To set the size based on values measured in pixels, use +@code{frame-char-height} and @code{frame-char-width} to convert +them to units of characters. +@end defun + +@defun set-frame-height frame lines &optional pretend +This function resizes @var{frame} to a height of @var{lines} lines. The +sizes of existing windows in @var{frame} are altered proportionally to +fit. + +If @var{pretend} is non-@code{nil}, then Emacs displays @var{lines} +lines of output in @var{frame}, but does not change its value for the +actual height of the frame. This is only useful for a terminal frame. +Using a smaller height than the terminal actually implements may be +useful to reproduce behavior observed on a smaller screen, or if the +terminal malfunctions when using its whole screen. Setting the frame +height ``for real'' does not always work, because knowing the correct +actual size may be necessary for correct cursor positioning on a +terminal frame. +@end defun + +@defun set-frame-width frame width &optional pretend +This function sets the width of @var{frame}, measured in characters. +The argument @var{pretend} has the same meaning as in +@code{set-frame-height}. +@end defun + +@findex set-screen-height +@findex set-screen-width + The older functions @code{set-screen-height} and +@code{set-screen-width} were used to specify the height and width of the +screen, in Emacs versions that did not support multiple frames. They +are semi-obsolete, but still work; they apply to the selected frame. + +@node Geometry +@subsection Geometry + + Here's how to examine the data in an X-style window geometry +specification: + +@defun x-parse-geometry geom +@cindex geometry specification +The function @code{x-parse-geometry} converts a standard X window +geometry string to an alist that you can use as part of the argument to +@code{make-frame}. + +The alist describes which parameters were specified in @var{geom}, and +gives the values specified for them. Each element looks like +@code{(@var{parameter} . @var{value})}. The possible @var{parameter} +values are @code{left}, @code{top}, @code{width}, and @code{height}. + +For the size parameters, the value must be an integer. The position +parameter names @code{left} and @code{top} are not totally accurate, +because some values indicate the position of the right or bottom edges +instead. These are the @var{value} possibilities for the position +parameters: + +@table @asis +@item an integer +A positive integer relates the left edge or top edge of the window to +the left or top edge of the screen. A negative integer relates the +right or bottom edge of the window to the right or bottom edge of the +screen. + +@item @code{(+ @var{position})} +This specifies the position of the left or top edge of the window +relative to the left or top edge of the screen. The integer +@var{position} may be positive or negative; a negative value specifies a +position outside the screen. + +@item @code{(- @var{position})} +This specifies the position of the right or bottom edge of the window +relative to the right or bottom edge of the screen. The integer +@var{position} may be positive or negative; a negative value specifies a +position outside the screen. +@end table + +Here is an example: + +@example +(x-parse-geometry "35x70+0-0") + @result{} ((height . 70) (width . 35) + (top - 0) (left . 0)) +@end example +@end defun + +@node Frame Titles +@section Frame Titles +@cindex frame title + + Every frame has a @code{name} parameter; this serves as the default +for the frame title which window systems typically display at the top of +the frame. You can specify a name explicitly by setting the @code{name} +frame property. + + Normally you don't specify the name explicitly, and Emacs computes the +frame name automatically based on a template stored in the variable +@code{frame-title-format}. Emacs recomputes the name each time the +frame is redisplayed. + +@defvar frame-title-format +This variable specifies how to compute a name for a frame when you have +not explicitly specified one. The variable's value is actually a mode +line construct, just like @code{mode-line-format}, except that the +@samp{%c} and @samp{%l} constructs are ignored. @xref{Mode Line +Data}. +@end defvar + +@defvar icon-title-format +This variable specifies how to compute the name for an iconified frame, +when you have not explicitly specified the frame title. This title +appears in the icon itself. +@end defvar + +@defvar multiple-frames +This variable is set automatically by Emacs. Its value is @code{t} when +there are two or more frames (not counting minibuffer-only frames or +invisible frames). The default value of @code{frame-title-format} uses +@code{multiple-frames} so as to put the buffer name in the frame title +only when there is more than one frame. + +The value of this variable is not guaranteed to be accurate except +while processing @code{frame-title-format} or +@code{icon-title-format}. +@end defvar + +@node Deleting Frames +@section Deleting Frames +@cindex deleting frames + +Frames remain potentially visible until you explicitly @dfn{delete} +them. A deleted frame cannot appear on the screen, but continues to +exist as a Lisp object until there are no references to it. + +@deffn Command delete-frame &optional frame force +@vindex delete-frame-functions +This function deletes the frame @var{frame}. Unless @var{frame} is a +tooltip, it first runs the hook @code{delete-frame-functions} (each +function gets one argument, @var{frame}). By default, @var{frame} is +the selected frame. + +A frame cannot be deleted if its minibuffer is used by other frames. +Normally, you cannot delete a frame if all other frames are invisible, +but if the @var{force} is non-@code{nil}, then you are allowed to do so. +@end deffn + +@defun frame-live-p frame +The function @code{frame-live-p} returns non-@code{nil} if the frame +@var{frame} has not been deleted. The possible non-@code{nil} return +values are like those of @code{framep}. @xref{Frames}. +@end defun + + Some window managers provide a command to delete a window. These work +by sending a special message to the program that operates the window. +When Emacs gets one of these commands, it generates a +@code{delete-frame} event, whose normal definition is a command that +calls the function @code{delete-frame}. @xref{Misc Events}. + +@node Finding All Frames +@section Finding All Frames +@cindex frames, scanning all + +@defun frame-list +The function @code{frame-list} returns a list of all the frames that +have not been deleted. It is analogous to @code{buffer-list} for +buffers, and includes frames on all terminals. The list that you get is +newly created, so modifying the list doesn't have any effect on the +internals of Emacs. +@end defun + +@defun visible-frame-list +This function returns a list of just the currently visible frames. +@xref{Visibility of Frames}. (Terminal frames always count as +``visible,'' even though only the selected one is actually displayed.) +@end defun + +@defun next-frame &optional frame minibuf +The function @code{next-frame} lets you cycle conveniently through all +the frames on the current display from an arbitrary starting point. It +returns the ``next'' frame after @var{frame} in the cycle. If +@var{frame} is omitted or @code{nil}, it defaults to the selected frame +(@pxref{Input Focus}). + +The second argument, @var{minibuf}, says which frames to consider: + +@table @asis +@item @code{nil} +Exclude minibuffer-only frames. +@item @code{visible} +Consider all visible frames. +@item 0 +Consider all visible or iconified frames. +@item a window +Consider only the frames using that particular window as their +minibuffer. +@item anything else +Consider all frames. +@end table +@end defun + +@defun previous-frame &optional frame minibuf +Like @code{next-frame}, but cycles through all frames in the opposite +direction. +@end defun + + See also @code{next-window} and @code{previous-window}, in @ref{Cyclic +Window Ordering}. + +@node Frames and Windows +@section Frames and Windows + + Each window is part of one and only one frame; you can get the frame +with @code{window-frame}. + +@defun window-frame window +This function returns the frame that @var{window} is on. +@end defun + + All the non-minibuffer windows in a frame are arranged in a cyclic +order. The order runs from the frame's top window, which is at the +upper left corner, down and to the right, until it reaches the window at +the lower right corner (always the minibuffer window, if the frame has +one), and then it moves back to the top. @xref{Cyclic Window Ordering}. + +@defun frame-first-window &optional frame +This returns the topmost, leftmost window of frame @var{frame}. +If omitted or @code{nil}, @var{frame} defaults to the selected frame. +@end defun + +At any time, exactly one window on any frame is @dfn{selected within the +frame}. The significance of this designation is that selecting the +frame also selects this window. You can get the frame's current +selected window with @code{frame-selected-window}. + +@defun frame-selected-window &optional frame +This function returns the window on @var{frame} that is selected +within @var{frame}. If omitted or @code{nil}, @var{frame} defaults to +the selected frame. +@end defun + +@defun set-frame-selected-window frame window +This sets the selected window of frame @var{frame} to @var{window}. +If @var{frame} is @code{nil}, it operates on the selected frame. If +@var{frame} is the selected frame, this makes @var{window} the +selected window. This function returns @var{window}. +@end defun + + Conversely, selecting a window for Emacs with @code{select-window} also +makes that window selected within its frame. @xref{Selecting Windows}. + + Another function that (usually) returns one of the windows in a given +frame is @code{minibuffer-window}. @xref{Definition of minibuffer-window}. + +@node Minibuffers and Frames +@section Minibuffers and Frames + +Normally, each frame has its own minibuffer window at the bottom, which +is used whenever that frame is selected. If the frame has a minibuffer, +you can get it with @code{minibuffer-window} (@pxref{Definition of +minibuffer-window}). + +However, you can also create a frame with no minibuffer. Such a frame +must use the minibuffer window of some other frame. When you create the +frame, you can specify explicitly the minibuffer window to use (in some +other frame). If you don't, then the minibuffer is found in the frame +which is the value of the variable @code{default-minibuffer-frame}. Its +value should be a frame that does have a minibuffer. + +If you use a minibuffer-only frame, you might want that frame to raise +when you enter the minibuffer. If so, set the variable +@code{minibuffer-auto-raise} to @code{t}. @xref{Raising and Lowering}. + +@defvar default-minibuffer-frame +This variable specifies the frame to use for the minibuffer window, by +default. It does not affect existing frames. It is always local to +the current terminal and cannot be buffer-local. @xref{Multiple +Displays}. +@end defvar + +@node Input Focus +@section Input Focus +@cindex input focus +@c @cindex selected frame Duplicates selected-frame + +At any time, one frame in Emacs is the @dfn{selected frame}. The selected +window always resides on the selected frame. + +When Emacs displays its frames on several terminals (@pxref{Multiple +Displays}), each terminal has its own selected frame. But only one of +these is ``@emph{the} selected frame'': it's the frame that belongs to +the terminal from which the most recent input came. That is, when Emacs +runs a command that came from a certain terminal, the selected frame is +the one of that terminal. Since Emacs runs only a single command at any +given time, it needs to consider only one selected frame at a time; this +frame is what we call @dfn{the selected frame} in this manual. The +display on which the selected frame is displayed is the @dfn{selected +frame's display}. + +@defun selected-frame +This function returns the selected frame. +@end defun + +Some window systems and window managers direct keyboard input to the +window object that the mouse is in; others require explicit clicks or +commands to @dfn{shift the focus} to various window objects. Either +way, Emacs automatically keeps track of which frame has the focus. To +switch to a different frame from a Lisp function, call +@code{select-frame-set-input-focus}. + +Lisp programs can also switch frames ``temporarily'' by calling the +function @code{select-frame}. This does not alter the window system's +concept of focus; rather, it escapes from the window manager's control +until that control is somehow reasserted. + +When using a text-only terminal, only one frame can be displayed at a +time on the terminal, so after a call to @code{select-frame}, the next +redisplay actually displays the newly selected frame. This frame +remains selected until a subsequent call to @code{select-frame} or +@code{select-frame-set-input-focus}. Each terminal frame has a number +which appears in the mode line before the buffer name (@pxref{Mode +Line Variables}). + +@defun select-frame-set-input-focus frame +This function makes @var{frame} the selected frame, raises it (should +it happen to be obscured by other frames) and tries to give it the X +server's focus. On a text-only terminal, the next redisplay displays +the new frame on the entire terminal screen. The return value of this +function is not significant. +@end defun + +@c ??? This is not yet implemented properly. +@defun select-frame frame +This function selects frame @var{frame}, temporarily disregarding the +focus of the X server if any. The selection of @var{frame} lasts until +the next time the user does something to select a different frame, or +until the next time this function is called. (If you are using a +window system, the previously selected frame may be restored as the +selected frame after return to the command loop, because it still may +have the window system's input focus.) The specified @var{frame} +becomes the selected frame, as explained above, and the terminal that +@var{frame} is on becomes the selected terminal. This function +returns @var{frame}, or @code{nil} if @var{frame} has been deleted. + +In general, you should never use @code{select-frame} in a way that could +switch to a different terminal without switching back when you're done. +@end defun + +Emacs cooperates with the window system by arranging to select frames as +the server and window manager request. It does so by generating a +special kind of input event, called a @dfn{focus} event, when +appropriate. The command loop handles a focus event by calling +@code{handle-switch-frame}. @xref{Focus Events}. + +@deffn Command handle-switch-frame frame +This function handles a focus event by selecting frame @var{frame}. + +Focus events normally do their job by invoking this command. +Don't call it for any other reason. +@end deffn + +@defun redirect-frame-focus frame &optional focus-frame +This function redirects focus from @var{frame} to @var{focus-frame}. +This means that @var{focus-frame} will receive subsequent keystrokes and +events intended for @var{frame}. After such an event, the value of +@code{last-event-frame} will be @var{focus-frame}. Also, switch-frame +events specifying @var{frame} will instead select @var{focus-frame}. + +If @var{focus-frame} is omitted or @code{nil}, that cancels any existing +redirection for @var{frame}, which therefore once again receives its own +events. + +One use of focus redirection is for frames that don't have minibuffers. +These frames use minibuffers on other frames. Activating a minibuffer +on another frame redirects focus to that frame. This puts the focus on +the minibuffer's frame, where it belongs, even though the mouse remains +in the frame that activated the minibuffer. + +Selecting a frame can also change focus redirections. Selecting frame +@code{bar}, when @code{foo} had been selected, changes any redirections +pointing to @code{foo} so that they point to @code{bar} instead. This +allows focus redirection to work properly when the user switches from +one frame to another using @code{select-window}. + +This means that a frame whose focus is redirected to itself is treated +differently from a frame whose focus is not redirected. +@code{select-frame} affects the former but not the latter. + +The redirection lasts until @code{redirect-frame-focus} is called to +change it. +@end defun + +@defopt focus-follows-mouse +This option is how you inform Emacs whether the window manager transfers +focus when the user moves the mouse. Non-@code{nil} says that it does. +When this is so, the command @code{other-frame} moves the mouse to a +position consistent with the new selected frame. (This option has no +effect on MS-Windows, where the mouse pointer is always automatically +moved by the OS to the selected frame.) +@end defopt + +@node Visibility of Frames +@section Visibility of Frames +@cindex visible frame +@cindex invisible frame +@cindex iconified frame +@cindex frame visibility + +A window frame may be @dfn{visible}, @dfn{invisible}, or +@dfn{iconified}. If it is visible, you can see its contents, unless +other windows cover it. If it is iconified, the frame's contents do +not appear on the screen, but an icon does. If the frame is +invisible, it doesn't show on the screen, not even as an icon. + +Visibility is meaningless for terminal frames, since only the selected +one is actually displayed in any case. + +@deffn Command make-frame-visible &optional frame +This function makes frame @var{frame} visible. If you omit +@var{frame}, it makes the selected frame visible. This does not raise +the frame, but you can do that with @code{raise-frame} if you wish +(@pxref{Raising and Lowering}). +@end deffn + +@deffn Command make-frame-invisible &optional frame force +This function makes frame @var{frame} invisible. If you omit +@var{frame}, it makes the selected frame invisible. + +Unless @var{force} is non-@code{nil}, this function refuses to make +@var{frame} invisible if all other frames are invisible.. +@end deffn + +@deffn Command iconify-frame &optional frame +This function iconifies frame @var{frame}. If you omit @var{frame}, it +iconifies the selected frame. +@end deffn + +@defun frame-visible-p frame +This returns the visibility status of frame @var{frame}. The value is +@code{t} if @var{frame} is visible, @code{nil} if it is invisible, and +@code{icon} if it is iconified. + +On a text-only terminal, all frames are considered visible, whether +they are currently being displayed or not, and this function returns +@code{t} for all frames. +@end defun + + The visibility status of a frame is also available as a frame +parameter. You can read or change it as such. @xref{Management +Parameters}. + + The user can iconify and deiconify frames with the window manager. +This happens below the level at which Emacs can exert any control, but +Emacs does provide events that you can use to keep track of such +changes. @xref{Misc Events}. + +@node Raising and Lowering +@section Raising and Lowering Frames + + Most window systems use a desktop metaphor. Part of this metaphor is +the idea that windows are stacked in a notional third dimension +perpendicular to the screen surface, and thus ordered from ``highest'' +to ``lowest.'' Where two windows overlap, the one higher up covers +the one underneath. Even a window at the bottom of the stack can be +seen if no other window overlaps it. + +@c @cindex raising a frame redundant with raise-frame +@cindex lowering a frame + A window's place in this ordering is not fixed; in fact, users tend +to change the order frequently. @dfn{Raising} a window means moving +it ``up,'' to the top of the stack. @dfn{Lowering} a window means +moving it to the bottom of the stack. This motion is in the notional +third dimension only, and does not change the position of the window +on the screen. + + You can raise and lower Emacs frame Windows with these functions: + +@deffn Command raise-frame &optional frame +This function raises frame @var{frame} (default, the selected frame). +If @var{frame} is invisible or iconified, this makes it visible. +@end deffn + +@deffn Command lower-frame &optional frame +This function lowers frame @var{frame} (default, the selected frame). +@end deffn + +@defopt minibuffer-auto-raise +If this is non-@code{nil}, activation of the minibuffer raises the frame +that the minibuffer window is in. +@end defopt + +You can also enable auto-raise (raising automatically when a frame is +selected) or auto-lower (lowering automatically when it is deselected) +for any frame using frame parameters. @xref{Management Parameters}. + +@node Frame Configurations +@section Frame Configurations +@cindex frame configuration + + A @dfn{frame configuration} records the current arrangement of frames, +all their properties, and the window configuration of each one. +(@xref{Window Configurations}.) + +@defun current-frame-configuration +This function returns a frame configuration list that describes +the current arrangement of frames and their contents. +@end defun + +@defun set-frame-configuration configuration &optional nodelete +This function restores the state of frames described in +@var{configuration}. However, this function does not restore deleted +frames. + +Ordinarily, this function deletes all existing frames not listed in +@var{configuration}. But if @var{nodelete} is non-@code{nil}, the +unwanted frames are iconified instead. +@end defun + +@node Mouse Tracking +@section Mouse Tracking +@cindex mouse tracking +@c @cindex tracking the mouse Duplicates track-mouse + + Sometimes it is useful to @dfn{track} the mouse, which means to display +something to indicate where the mouse is and move the indicator as the +mouse moves. For efficient mouse tracking, you need a way to wait until +the mouse actually moves. + + The convenient way to track the mouse is to ask for events to represent +mouse motion. Then you can wait for motion by waiting for an event. In +addition, you can easily handle any other sorts of events that may +occur. That is useful, because normally you don't want to track the +mouse forever---only until some other event, such as the release of a +button. + +@defspec track-mouse body@dots{} +This special form executes @var{body}, with generation of mouse motion +events enabled. Typically @var{body} would use @code{read-event} to +read the motion events and modify the display accordingly. @xref{Motion +Events}, for the format of mouse motion events. + +The value of @code{track-mouse} is that of the last form in @var{body}. +You should design @var{body} to return when it sees the up-event that +indicates the release of the button, or whatever kind of event means +it is time to stop tracking. +@end defspec + +The usual purpose of tracking mouse motion is to indicate on the screen +the consequences of pushing or releasing a button at the current +position. + +In many cases, you can avoid the need to track the mouse by using +the @code{mouse-face} text property (@pxref{Special Properties}). +That works at a much lower level and runs more smoothly than +Lisp-level mouse tracking. + +@ignore +@c These are not implemented yet. + +These functions change the screen appearance instantaneously. The +effect is transient, only until the next ordinary Emacs redisplay. That +is OK for mouse tracking, since it doesn't make sense for mouse tracking +to change the text, and the body of @code{track-mouse} normally reads +the events itself and does not do redisplay. + +@defun x-contour-region window beg end +This function draws lines to make a box around the text from @var{beg} +to @var{end}, in window @var{window}. +@end defun + +@defun x-uncontour-region window beg end +This function erases the lines that would make a box around the text +from @var{beg} to @var{end}, in window @var{window}. Use it to remove +a contour that you previously made by calling @code{x-contour-region}. +@end defun + +@defun x-draw-rectangle frame left top right bottom +This function draws a hollow rectangle on frame @var{frame} with the +specified edge coordinates, all measured in pixels from the inside top +left corner. It uses the cursor color, the one used for indicating the +location of point. +@end defun + +@defun x-erase-rectangle frame left top right bottom +This function erases a hollow rectangle on frame @var{frame} with the +specified edge coordinates, all measured in pixels from the inside top +left corner. Erasure means redrawing the text and background that +normally belong in the specified rectangle. +@end defun +@end ignore + +@node Mouse Position +@section Mouse Position +@cindex mouse position +@cindex position of mouse + + The functions @code{mouse-position} and @code{set-mouse-position} +give access to the current position of the mouse. + +@defun mouse-position +This function returns a description of the position of the mouse. The +value looks like @code{(@var{frame} @var{x} . @var{y})}, where @var{x} +and @var{y} are integers giving the position in characters relative to +the top left corner of the inside of @var{frame}. +@end defun + +@defvar mouse-position-function +If non-@code{nil}, the value of this variable is a function for +@code{mouse-position} to call. @code{mouse-position} calls this +function just before returning, with its normal return value as the +sole argument, and it returns whatever this function returns to it. + +This abnormal hook exists for the benefit of packages like +@file{xt-mouse.el} that need to do mouse handling at the Lisp level. +@end defvar + +@defun set-mouse-position frame x y +This function @dfn{warps the mouse} to position @var{x}, @var{y} in +frame @var{frame}. The arguments @var{x} and @var{y} are integers, +giving the position in characters relative to the top left corner of the +inside of @var{frame}. If @var{frame} is not visible, this function +does nothing. The return value is not significant. +@end defun + +@defun mouse-pixel-position +This function is like @code{mouse-position} except that it returns +coordinates in units of pixels rather than units of characters. +@end defun + +@defun set-mouse-pixel-position frame x y +This function warps the mouse like @code{set-mouse-position} except that +@var{x} and @var{y} are in units of pixels rather than units of +characters. These coordinates are not required to be within the frame. + +If @var{frame} is not visible, this function does nothing. The return +value is not significant. +@end defun + +@need 3000 + +@node Pop-Up Menus +@section Pop-Up Menus + + When using a window system, a Lisp program can pop up a menu so that +the user can choose an alternative with the mouse. + +@defun x-popup-menu position menu +This function displays a pop-up menu and returns an indication of +what selection the user makes. + +The argument @var{position} specifies where on the screen to put the +top left corner of the menu. It can be either a mouse button event +(which says to put the menu where the user actuated the button) or a +list of this form: + +@example +((@var{xoffset} @var{yoffset}) @var{window}) +@end example + +@noindent +where @var{xoffset} and @var{yoffset} are coordinates, measured in +pixels, counting from the top left corner of @var{window}. @var{window} +may be a window or a frame. + +If @var{position} is @code{t}, it means to use the current mouse +position. If @var{position} is @code{nil}, it means to precompute the +key binding equivalents for the keymaps specified in @var{menu}, +without actually displaying or popping up the menu. + +The argument @var{menu} says what to display in the menu. It can be a +keymap or a list of keymaps (@pxref{Menu Keymaps}). In this case, the +return value is the list of events corresponding to the user's choice. +(This list has more than one element if the choice occurred in a +submenu.) Note that @code{x-popup-menu} does not actually execute the +command bound to that sequence of events. + +Alternatively, @var{menu} can have the following form: + +@example +(@var{title} @var{pane1} @var{pane2}...) +@end example + +@noindent +where each pane is a list of form + +@example +(@var{title} @var{item1} @var{item2}...) +@end example + +Each item should normally be a cons cell @code{(@var{line} . @var{value})}, +where @var{line} is a string, and @var{value} is the value to return if +that @var{line} is chosen. An item can also be a string; this makes a +non-selectable line in the menu. + +If the user gets rid of the menu without making a valid choice, for +instance by clicking the mouse away from a valid choice or by typing +keyboard input, then this normally results in a quit and +@code{x-popup-menu} does not return. But if @var{position} is a mouse +button event (indicating that the user invoked the menu with the +mouse) then no quit occurs and @code{x-popup-menu} returns @code{nil}. +@end defun + + @strong{Usage note:} Don't use @code{x-popup-menu} to display a menu +if you could do the job with a prefix key defined with a menu keymap. +If you use a menu keymap to implement a menu, @kbd{C-h c} and @kbd{C-h +a} can see the individual items in that menu and provide help for them. +If instead you implement the menu by defining a command that calls +@code{x-popup-menu}, the help facilities cannot know what happens inside +that command, so they cannot give any help for the menu's items. + + The menu bar mechanism, which lets you switch between submenus by +moving the mouse, cannot look within the definition of a command to see +that it calls @code{x-popup-menu}. Therefore, if you try to implement a +submenu using @code{x-popup-menu}, it cannot work with the menu bar in +an integrated fashion. This is why all menu bar submenus are +implemented with menu keymaps within the parent menu, and never with +@code{x-popup-menu}. @xref{Menu Bar}. + + If you want a menu bar submenu to have contents that vary, you should +still use a menu keymap to implement it. To make the contents vary, add +a hook function to @code{menu-bar-update-hook} to update the contents of +the menu keymap as necessary. + +@node Dialog Boxes +@section Dialog Boxes +@cindex dialog boxes + + A dialog box is a variant of a pop-up menu---it looks a little +different, it always appears in the center of a frame, and it has just +one level and one or more buttons. The main use of dialog boxes is +for asking questions that the user can answer with ``yes,'' ``no,'' +and a few other alternatives. With a single button, they can also +force the user to acknowledge important information. The functions +@code{y-or-n-p} and @code{yes-or-no-p} use dialog boxes instead of the +keyboard, when called from commands invoked by mouse clicks. + +@defun x-popup-dialog position contents &optional header +This function displays a pop-up dialog box and returns an indication of +what selection the user makes. The argument @var{contents} specifies +the alternatives to offer; it has this format: + +@example +(@var{title} (@var{string} . @var{value})@dots{}) +@end example + +@noindent +which looks like the list that specifies a single pane for +@code{x-popup-menu}. + +The return value is @var{value} from the chosen alternative. + +As for @code{x-popup-menu}, an element of the list may be just a +string instead of a cons cell @code{(@var{string} . @var{value})}. +That makes a box that cannot be selected. + +If @code{nil} appears in the list, it separates the left-hand items from +the right-hand items; items that precede the @code{nil} appear on the +left, and items that follow the @code{nil} appear on the right. If you +don't include a @code{nil} in the list, then approximately half the +items appear on each side. + +Dialog boxes always appear in the center of a frame; the argument +@var{position} specifies which frame. The possible values are as in +@code{x-popup-menu}, but the precise coordinates or the individual +window don't matter; only the frame matters. + +If @var{header} is non-@code{nil}, the frame title for the box is +@samp{Information}, otherwise it is @samp{Question}. The former is used +for @code{message-box} (@pxref{message-box}). + +In some configurations, Emacs cannot display a real dialog box; so +instead it displays the same items in a pop-up menu in the center of the +frame. + +If the user gets rid of the dialog box without making a valid choice, +for instance using the window manager, then this produces a quit and +@code{x-popup-dialog} does not return. +@end defun + +@node Pointer Shape +@section Pointer Shape +@cindex pointer shape +@cindex mouse pointer shape + + You can specify the mouse pointer style for particular text or +images using the @code{pointer} text property, and for images with the +@code{:pointer} and @code{:map} image properties. The values you can +use in these properties are @code{text} (or @code{nil}), @code{arrow}, +@code{hand}, @code{vdrag}, @code{hdrag}, @code{modeline}, and +@code{hourglass}. @code{text} stands for the usual mouse pointer +style used over text. + + Over void parts of the window (parts that do not correspond to any +of the buffer contents), the mouse pointer usually uses the +@code{arrow} style, but you can specify a different style (one of +those above) by setting @code{void-text-area-pointer}. + +@defvar void-text-area-pointer +This variable specifies the mouse pointer style for void text areas. +These include the areas after the end of a line or below the last line +in the buffer. The default is to use the @code{arrow} (non-text) +pointer style. +@end defvar + + You can specify what the @code{text} pointer style really looks like +by setting the variable @code{x-pointer-shape}. + +@defvar x-pointer-shape +This variable specifies the pointer shape to use ordinarily in the +Emacs frame, for the @code{text} pointer style. +@end defvar + +@defvar x-sensitive-text-pointer-shape +This variable specifies the pointer shape to use when the mouse +is over mouse-sensitive text. +@end defvar + + These variables affect newly created frames. They do not normally +affect existing frames; however, if you set the mouse color of a +frame, that also installs the current value of those two variables. +@xref{Color Parameters}. + + The values you can use, to specify either of these pointer shapes, are +defined in the file @file{lisp/term/x-win.el}. Use @kbd{M-x apropos +@key{RET} x-pointer @key{RET}} to see a list of them. + +@node Window System Selections +@section Window System Selections +@cindex selection (for window systems) + +The X server records a set of @dfn{selections} which permit transfer of +data between application programs. The various selections are +distinguished by @dfn{selection types}, represented in Emacs by +symbols. X clients including Emacs can read or set the selection for +any given type. + +@deffn Command x-set-selection type data +This function sets a ``selection'' in the X server. It takes two +arguments: a selection type @var{type}, and the value to assign to it, +@var{data}. If @var{data} is @code{nil}, it means to clear out the +selection. Otherwise, @var{data} may be a string, a symbol, an integer +(or a cons of two integers or list of two integers), an overlay, or a +cons of two markers pointing to the same buffer. An overlay or a pair +of markers stands for text in the overlay or between the markers. + +The argument @var{data} may also be a vector of valid non-vector +selection values. + +Each possible @var{type} has its own selection value, which changes +independently. The usual values of @var{type} are @code{PRIMARY}, +@code{SECONDARY} and @code{CLIPBOARD}; these are symbols with upper-case +names, in accord with X Window System conventions. If @var{type} is +@code{nil}, that stands for @code{PRIMARY}. + +This function returns @var{data}. +@end deffn + +@defun x-get-selection &optional type data-type +This function accesses selections set up by Emacs or by other X +clients. It takes two optional arguments, @var{type} and +@var{data-type}. The default for @var{type}, the selection type, is +@code{PRIMARY}. + +The @var{data-type} argument specifies the form of data conversion to +use, to convert the raw data obtained from another X client into Lisp +data. Meaningful values include @code{TEXT}, @code{STRING}, +@code{UTF8_STRING}, @code{TARGETS}, @code{LENGTH}, @code{DELETE}, +@code{FILE_NAME}, @code{CHARACTER_POSITION}, @code{NAME}, +@code{LINE_NUMBER}, @code{COLUMN_NUMBER}, @code{OWNER_OS}, +@code{HOST_NAME}, @code{USER}, @code{CLASS}, @code{ATOM}, and +@code{INTEGER}. (These are symbols with upper-case names in accord +with X conventions.) The default for @var{data-type} is +@code{STRING}. +@end defun + +@cindex cut buffer +The X server also has a set of eight numbered @dfn{cut buffers} which can +store text or other data being moved between applications. Cut buffers +are considered obsolete, but Emacs supports them for the sake of X +clients that still use them. Cut buffers are numbered from 0 to 7. + +@defun x-get-cut-buffer &optional n +This function returns the contents of cut buffer number @var{n}. +If omitted @var{n} defaults to 0. +@end defun + +@defun x-set-cut-buffer string &optional push +@anchor{Definition of x-set-cut-buffer} +This function stores @var{string} into the first cut buffer (cut buffer +0). If @var{push} is @code{nil}, only the first cut buffer is changed. +If @var{push} is non-@code{nil}, that says to move the values down +through the series of cut buffers, much like the way successive kills in +Emacs move down the kill ring. In other words, the previous value of +the first cut buffer moves into the second cut buffer, and the second to +the third, and so on through all eight cut buffers. +@end defun + +@defvar selection-coding-system +This variable specifies the coding system to use when reading and +writing selections or the clipboard. @xref{Coding +Systems}. The default is @code{compound-text-with-extensions}, which +converts to the text representation that X11 normally uses. +@end defvar + +@cindex clipboard support (for MS-Windows) +When Emacs runs on MS-Windows, it does not implement X selections in +general, but it does support the clipboard. @code{x-get-selection} +and @code{x-set-selection} on MS-Windows support the text data type +only; if the clipboard holds other types of data, Emacs treats the +clipboard as empty. + +@cindex scrap support (for Mac OS) +On Mac OS, selection-like data transfer between applications is +performed through a mechanism called @dfn{scraps}. The clipboard is a +particular scrap named @code{com.apple.scrap.clipboard}. Types of scrap +data are called @dfn{scrap flavor types}, which are identified by +four-char codes such as @code{TEXT}. Emacs associates a selection with +a scrap, and a selection type with a scrap flavor type via +@code{mac-scrap-name} and @code{mac-ostype} properties, respectively. + +@example +(get 'CLIPBOARD 'mac-scrap-name) + @result{} "com.apple.scrap.clipboard" +(get 'com.apple.traditional-mac-plain-text 'mac-ostype) + @result{} "TEXT" +@end example + +Conventionally, selection types for scrap flavor types on Mac OS have +the form of @acronym{UTI, Uniform Type Identifier} such as +@code{com.apple.traditional-mac-plain-text}, +@code{public.utf16-plain-text}, and @code{public.file-url}. + +@defopt x-select-enable-clipboard +If this is non-@code{nil}, the Emacs yank functions consult the +clipboard before the primary selection, and the kill functions store in +the clipboard as well as the primary selection. Otherwise they do not +access the clipboard at all. The default is @code{nil} on most systems, +but @code{t} on MS-Windows and Mac. +@end defopt + +@node Drag and Drop +@section Drag and Drop + +@vindex x-dnd-test-function +@vindex x-dnd-known-types + When a user drags something from another application over Emacs, that other +application expects Emacs to tell it if Emacs can handle the data that is +dragged. The variable @code{x-dnd-test-function} is used by Emacs to determine +what to reply. The default value is @code{x-dnd-default-test-function} +which accepts drops if the type of the data to be dropped is present in +@code{x-dnd-known-types}. You can customize @code{x-dnd-test-function} and/or +@code{x-dnd-known-types} if you want Emacs to accept or reject drops based +on some other criteria. + +@vindex x-dnd-types-alist + If you want to change the way Emacs handles drop of different types +or add a new type, customize @code{x-dnd-types-alist}. This requires +detailed knowledge of what types other applications use for drag and +drop. + +@vindex dnd-protocol-alist + When an URL is dropped on Emacs it may be a file, but it may also be +another URL type (ftp, http, etc.). Emacs first checks +@code{dnd-protocol-alist} to determine what to do with the URL. If +there is no match there and if @code{browse-url-browser-function} is +an alist, Emacs looks for a match there. If no match is found the +text for the URL is inserted. If you want to alter Emacs behavior, +you can customize these variables. + +@node Color Names +@section Color Names + +@cindex color names +@cindex specify color +@cindex numerical RGB color specification + A color name is text (usually in a string) that specifies a color. +Symbolic names such as @samp{black}, @samp{white}, @samp{red}, etc., +are allowed; use @kbd{M-x list-colors-display} to see a list of +defined names. You can also specify colors numerically in forms such +as @samp{#@var{rgb}} and @samp{RGB:@var{r}/@var{g}/@var{b}}, where +@var{r} specifies the red level, @var{g} specifies the green level, +and @var{b} specifies the blue level. You can use either one, two, +three, or four hex digits for @var{r}; then you must use the same +number of hex digits for all @var{g} and @var{b} as well, making +either 3, 6, 9 or 12 hex digits in all. (See the documentation of the +X Window System for more details about numerical RGB specification of +colors.) + + These functions provide a way to determine which color names are +valid, and what they look like. In some cases, the value depends on the +@dfn{selected frame}, as described below; see @ref{Input Focus}, for the +meaning of the term ``selected frame.'' + +@defun color-defined-p color &optional frame +This function reports whether a color name is meaningful. It returns +@code{t} if so; otherwise, @code{nil}. The argument @var{frame} says +which frame's display to ask about; if @var{frame} is omitted or +@code{nil}, the selected frame is used. + +Note that this does not tell you whether the display you are using +really supports that color. When using X, you can ask for any defined +color on any kind of display, and you will get some result---typically, +the closest it can do. To determine whether a frame can really display +a certain color, use @code{color-supported-p} (see below). + +@findex x-color-defined-p +This function used to be called @code{x-color-defined-p}, +and that name is still supported as an alias. +@end defun + +@defun defined-colors &optional frame +This function returns a list of the color names that are defined +and supported on frame @var{frame} (default, the selected frame). +If @var{frame} does not support colors, the value is @code{nil}. + +@findex x-defined-colors +This function used to be called @code{x-defined-colors}, +and that name is still supported as an alias. +@end defun + +@defun color-supported-p color &optional frame background-p +This returns @code{t} if @var{frame} can really display the color +@var{color} (or at least something close to it). If @var{frame} is +omitted or @code{nil}, the question applies to the selected frame. + +Some terminals support a different set of colors for foreground and +background. If @var{background-p} is non-@code{nil}, that means you are +asking whether @var{color} can be used as a background; otherwise you +are asking whether it can be used as a foreground. + +The argument @var{color} must be a valid color name. +@end defun + +@defun color-gray-p color &optional frame +This returns @code{t} if @var{color} is a shade of gray, as defined on +@var{frame}'s display. If @var{frame} is omitted or @code{nil}, the +question applies to the selected frame. If @var{color} is not a valid +color name, this function returns @code{nil}. +@end defun + +@defun color-values color &optional frame +@cindex rgb value +This function returns a value that describes what @var{color} should +ideally look like on @var{frame}. If @var{color} is defined, the +value is a list of three integers, which give the amount of red, the +amount of green, and the amount of blue. Each integer ranges in +principle from 0 to 65535, but some displays may not use the full +range. This three-element list is called the @dfn{rgb values} of the +color. + +If @var{color} is not defined, the value is @code{nil}. + +@example +(color-values "black") + @result{} (0 0 0) +(color-values "white") + @result{} (65280 65280 65280) +(color-values "red") + @result{} (65280 0 0) +(color-values "pink") + @result{} (65280 49152 51968) +(color-values "hungry") + @result{} nil +@end example + +The color values are returned for @var{frame}'s display. If +@var{frame} is omitted or @code{nil}, the information is returned for +the selected frame's display. If the frame cannot display colors, the +value is @code{nil}. + +@findex x-color-values +This function used to be called @code{x-color-values}, +and that name is still supported as an alias. +@end defun + +@node Text Terminal Colors +@section Text Terminal Colors +@cindex colors on text-only terminals + + Text-only terminals usually support only a small number of colors, +and the computer uses small integers to select colors on the terminal. +This means that the computer cannot reliably tell what the selected +color looks like; instead, you have to inform your application which +small integers correspond to which colors. However, Emacs does know +the standard set of colors and will try to use them automatically. + + The functions described in this section control how terminal colors +are used by Emacs. + + Several of these functions use or return @dfn{rgb values}, described +in @ref{Color Names}. + + These functions accept a display (either a frame or the name of a +terminal) as an optional argument. We hope in the future to make Emacs +support more than one text-only terminal at one time; then this argument +will specify which terminal to operate on (the default being the +selected frame's terminal; @pxref{Input Focus}). At present, though, +the @var{frame} argument has no effect. + +@defun tty-color-define name number &optional rgb frame +This function associates the color name @var{name} with +color number @var{number} on the terminal. + +The optional argument @var{rgb}, if specified, is an rgb value, a list +of three numbers that specify what the color actually looks like. +If you do not specify @var{rgb}, then this color cannot be used by +@code{tty-color-approximate} to approximate other colors, because +Emacs will not know what it looks like. +@end defun + +@defun tty-color-clear &optional frame +This function clears the table of defined colors for a text-only terminal. +@end defun + +@defun tty-color-alist &optional frame +This function returns an alist recording the known colors supported by a +text-only terminal. + +Each element has the form @code{(@var{name} @var{number} . @var{rgb})} +or @code{(@var{name} @var{number})}. Here, @var{name} is the color +name, @var{number} is the number used to specify it to the terminal. +If present, @var{rgb} is a list of three color values (for red, green, +and blue) that says what the color actually looks like. +@end defun + +@defun tty-color-approximate rgb &optional frame +This function finds the closest color, among the known colors +supported for @var{display}, to that described by the rgb value +@var{rgb} (a list of color values). The return value is an element of +@code{tty-color-alist}. +@end defun + +@defun tty-color-translate color &optional frame +This function finds the closest color to @var{color} among the known +colors supported for @var{display} and returns its index (an integer). +If the name @var{color} is not defined, the value is @code{nil}. +@end defun + +@node Resources +@section X Resources + +@defun x-get-resource attribute class &optional component subclass +The function @code{x-get-resource} retrieves a resource value from the X +Window defaults database. + +Resources are indexed by a combination of a @dfn{key} and a @dfn{class}. +This function searches using a key of the form +@samp{@var{instance}.@var{attribute}} (where @var{instance} is the name +under which Emacs was invoked), and using @samp{Emacs.@var{class}} as +the class. + +The optional arguments @var{component} and @var{subclass} add to the key +and the class, respectively. You must specify both of them or neither. +If you specify them, the key is +@samp{@var{instance}.@var{component}.@var{attribute}}, and the class is +@samp{Emacs.@var{class}.@var{subclass}}. +@end defun + +@defvar x-resource-class +This variable specifies the application name that @code{x-get-resource} +should look up. The default value is @code{"Emacs"}. You can examine X +resources for application names other than ``Emacs'' by binding this +variable to some other string, around a call to @code{x-get-resource}. +@end defvar + +@defvar x-resource-name +This variable specifies the instance name that @code{x-get-resource} +should look up. The default value is the name Emacs was invoked with, +or the value specified with the @samp{-name} or @samp{-rn} switches. +@end defvar + +To illustrate some of the above, suppose that you have the line: + +@example +xterm.vt100.background: yellow +@end example + +@noindent +in your X resources file (whose name is usually @file{~/.Xdefaults} +or @file{~/.Xresources}). Then: + +@example +@group +(let ((x-resource-class "XTerm") (x-resource-name "xterm")) + (x-get-resource "vt100.background" "VT100.Background")) + @result{} "yellow" +@end group +@group +(let ((x-resource-class "XTerm") (x-resource-name "xterm")) + (x-get-resource "background" "VT100" "vt100" "Background")) + @result{} "yellow" +@end group +@end example + + @xref{X Resources,, X Resources, emacs, The GNU Emacs Manual}. + +@node Display Feature Testing +@section Display Feature Testing +@cindex display feature testing + + The functions in this section describe the basic capabilities of a +particular display. Lisp programs can use them to adapt their behavior +to what the display can do. For example, a program that ordinarily uses +a popup menu could use the minibuffer if popup menus are not supported. + + The optional argument @var{display} in these functions specifies which +display to ask the question about. It can be a display name, a frame +(which designates the display that frame is on), or @code{nil} (which +refers to the selected frame's display, @pxref{Input Focus}). + + @xref{Color Names}, @ref{Text Terminal Colors}, for other functions to +obtain information about displays. + +@defun display-popup-menus-p &optional display +This function returns @code{t} if popup menus are supported on +@var{display}, @code{nil} if not. Support for popup menus requires that +the mouse be available, since the user cannot choose menu items without +a mouse. +@end defun + +@defun display-graphic-p &optional display +This function returns @code{t} if @var{display} is a graphic display +capable of displaying several frames and several different fonts at +once. This is true for displays that use a window system such as X, and +false for text-only terminals. +@end defun + +@defun display-mouse-p &optional display +@cindex mouse, availability +This function returns @code{t} if @var{display} has a mouse available, +@code{nil} if not. +@end defun + +@defun display-color-p &optional display +@findex x-display-color-p +This function returns @code{t} if the screen is a color screen. +It used to be called @code{x-display-color-p}, and that name +is still supported as an alias. +@end defun + +@defun display-grayscale-p &optional display +This function returns @code{t} if the screen can display shades of gray. +(All color displays can do this.) +@end defun + +@defun display-supports-face-attributes-p attributes &optional display +@anchor{Display Face Attribute Testing} +This function returns non-@code{nil} if all the face attributes in +@var{attributes} are supported (@pxref{Face Attributes}). + +The definition of `supported' is somewhat heuristic, but basically +means that a face containing all the attributes in @var{attributes}, +when merged with the default face for display, can be represented in a +way that's + +@enumerate +@item +different in appearance than the default face, and + +@item +`close in spirit' to what the attributes specify, if not exact. +@end enumerate + +Point (2) implies that a @code{:weight black} attribute will be +satisfied by any display that can display bold, as will +@code{:foreground "yellow"} as long as some yellowish color can be +displayed, but @code{:slant italic} will @emph{not} be satisfied by +the tty display code's automatic substitution of a `dim' face for +italic. +@end defun + +@defun display-selections-p &optional display +This function returns @code{t} if @var{display} supports selections. +Windowed displays normally support selections, but they may also be +supported in some other cases. +@end defun + +@defun display-images-p &optional display +This function returns @code{t} if @var{display} can display images. +Windowed displays ought in principle to handle images, but some +systems lack the support for that. On a display that does not support +images, Emacs cannot display a tool bar. +@end defun + +@defun display-screens &optional display +This function returns the number of screens associated with the display. +@end defun + +@defun display-pixel-height &optional display +This function returns the height of the screen in pixels. +On a character terminal, it gives the height in characters. + +For graphical terminals, note that on ``multi-monitor'' setups this +refers to the pixel width for all physical monitors associated with +@var{display}. @xref{Multiple Displays}. +@end defun + +@defun display-pixel-width &optional display +This function returns the width of the screen in pixels. +On a character terminal, it gives the width in characters. + +For graphical terminals, note that on ``multi-monitor'' setups this +refers to the pixel width for all physical monitors associated with +@var{display}. @xref{Multiple Displays}. +@end defun + +@defun display-mm-height &optional display +This function returns the height of the screen in millimeters, +or @code{nil} if Emacs cannot get that information. +@end defun + +@defun display-mm-width &optional display +This function returns the width of the screen in millimeters, +or @code{nil} if Emacs cannot get that information. +@end defun + +@defvar display-mm-dimensions-alist +This variable allows the user to specify the dimensions of graphical +displays returned by @code{display-mm-height} and +@code{display-mm-width} in case the system provides incorrect values. +@end defvar + +@defun display-backing-store &optional display +This function returns the backing store capability of the display. +Backing store means recording the pixels of windows (and parts of +windows) that are not exposed, so that when exposed they can be +displayed very quickly. + +Values can be the symbols @code{always}, @code{when-mapped}, or +@code{not-useful}. The function can also return @code{nil} +when the question is inapplicable to a certain kind of display. +@end defun + +@defun display-save-under &optional display +This function returns non-@code{nil} if the display supports the +SaveUnder feature. That feature is used by pop-up windows +to save the pixels they obscure, so that they can pop down +quickly. +@end defun + +@defun display-planes &optional display +This function returns the number of planes the display supports. +This is typically the number of bits per pixel. +For a tty display, it is log to base two of the number of colors supported. +@end defun + +@defun display-visual-class &optional display +This function returns the visual class for the screen. The value is one +of the symbols @code{static-gray}, @code{gray-scale}, +@code{static-color}, @code{pseudo-color}, @code{true-color}, and +@code{direct-color}. +@end defun + +@defun display-color-cells &optional display +This function returns the number of color cells the screen supports. +@end defun + + These functions obtain additional information specifically +about X displays. + +@defun x-server-version &optional display +This function returns the list of version numbers of the X server +running the display. The value is a list of three integers: the major +and minor version numbers of the X protocol, and the +distributor-specific release number of the X server software itself. +@end defun + +@defun x-server-vendor &optional display +This function returns the ``vendor'' that provided the X server +software (as a string). Really this means whoever distributes the X +server. + +When the developers of X labelled software distributors as +``vendors,'' they showed their false assumption that no system could +ever be developed and distributed noncommercially. +@end defun + +@ignore +@defvar x-no-window-manager +This variable's value is @code{t} if no X window manager is in use. +@end defvar +@end ignore + +@ignore +@item +The functions @code{x-pixel-width} and @code{x-pixel-height} return the +width and height of an X Window frame, measured in pixels. +@end ignore + +@ignore + arch-tag: 94977df6-3dca-4730-b57b-c6329e9282ba +@end ignore diff --git a/doc/lispref/front-cover-1.texi b/doc/lispref/front-cover-1.texi new file mode 100644 index 00000000000..5c9f4351f42 --- /dev/null +++ b/doc/lispref/front-cover-1.texi @@ -0,0 +1,56 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header +@setfilename front1.info +@settitle GNU Emacs Lisp Reference Manual +@smallbook +@comment %**end of header + +@titlepage +. +@sp 2 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19.29 +@center for Unix Users +@center Edition 2.4, June 1995 +@sp 2 +@center @titlefont{Volume 1} +@sp 2 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group +@page +. +@sp 5 +@center @titlefont{The} +@sp 1 +@center @titlefont{GNU} +@sp 1 +@center @titlefont{Emacs Lisp} +@sp 1 +@center @titlefont{Reference} +@sp 1 +@center @titlefont{Manual} +@sp 2 +@center GNU Emacs Version 19.29 +@center for Unix Users +@center Edition 2.4, June 1995 +@sp 2 +@center @titlefont{Volume 2} +@sp 2 +@center by Bil Lewis, Dan LaLiberte, +@center and the GNU Manual Group + +@end titlepage +@bye + +@ignore + arch-tag: 5182b306-c403-4e4f-ba24-e1911bc6da9d +@end ignore diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi new file mode 100644 index 00000000000..eedfa8c124f --- /dev/null +++ b/doc/lispref/functions.texi @@ -0,0 +1,1374 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/functions +@node Functions, Macros, Variables, Top +@chapter 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. + +@menu +* What Is a Function:: Lisp functions vs. primitives; terminology. +* Lambda Expressions:: How functions are expressed as Lisp objects. +* Function Names:: A symbol can serve as the name of a function. +* Defining Functions:: Lisp expressions for defining functions. +* Calling Functions:: How to use an existing function. +* Mapping Functions:: Applying a function to each element of a list, etc. +* Anonymous Functions:: Lambda expressions are functions with no names. +* Function Cells:: Accessing or setting the function definition + of a symbol. +* Obsolete Functions:: Declaring functions obsolete. +* Inline Functions:: Defining functions that the compiler will open code. +* Function Safety:: Determining whether a function is safe to call. +* Related Topics:: Cross-references to specific Lisp primitives + that have a special bearing on how functions work. +@end menu + +@node What Is a Function +@section What Is a Function? + + In a general sense, a function is a rule for carrying on a computation +given several values called @dfn{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. + +@table @dfn +@item function +@cindex function +In Emacs Lisp, a @dfn{function} is anything that can be applied to +arguments in a Lisp program. In some cases, we use it more +specifically to mean a function written in Lisp. Special forms and +macros are not functions. + +@item primitive +@cindex primitive +@cindex subr +@cindex built-in function +A @dfn{primitive} is a function callable from Lisp that is written in C, +such as @code{car} or @code{append}. These functions are also called +@dfn{built-in functions}, or @dfn{subrs}. (Special forms are also +considered primitives.) + +Usually the reason we implement a function as a primitive is either +because it is fundamental, because it provides a low-level interface +to operating system services, or because it needs to run fast. +Primitives can be modified or added only by changing the C sources and +recompiling the editor. See @ref{Writing Emacs Primitives}. + +@item lambda expression +A @dfn{lambda expression} is a function written in Lisp. +These are described in the following section. +@ifnottex +@xref{Lambda Expressions}. +@end ifnottex + +@item special form +A @dfn{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 @ref{Control +Structures}. + +@item macro +@cindex macro +A @dfn{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. Macros enable Lisp programmers to do the sorts of +things that special forms can do. @xref{Macros}, for how to define and +use macros. + +@item command +@cindex command +A @dfn{command} is an object that @code{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 (@pxref{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. + +Keyboard macros (strings and vectors) 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 @kbd{M-x}. +The symbol is a function as well if the definition is a function. +@xref{Interactive Call}. + +@item keystroke command +@cindex keystroke command +A @dfn{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 Lisp programs, the distinction is normally unimportant. + +@item byte-code function +A @dfn{byte-code function} is a function that has been compiled by the +byte compiler. @xref{Byte-Code Type}. +@end table + +@defun functionp object +This function returns @code{t} if @var{object} is any kind of +function, or a special form, or, recursively, a symbol whose function +definition is a function or special form. (This does not include +macros.) +@end defun + +Unlike @code{functionp}, the next three functions do @emph{not} +treat a symbol as its function definition. + +@defun subrp object +This function returns @code{t} if @var{object} is a built-in function +(i.e., a Lisp primitive). + +@example +@group +(subrp 'message) ; @r{@code{message} is a symbol,} + @result{} nil ; @r{not a subr object.} +@end group +@group +(subrp (symbol-function 'message)) + @result{} t +@end group +@end example +@end defun + +@defun byte-code-function-p object +This function returns @code{t} if @var{object} is a byte-code +function. For example: + +@example +@group +(byte-code-function-p (symbol-function 'next-line)) + @result{} t +@end group +@end example +@end defun + +@defun subr-arity subr +This function provides information about the argument list of a +primitive, @var{subr}. The returned value is a pair +@code{(@var{min} . @var{max})}. @var{min} is the minimum number of +args. @var{max} is the maximum number or the symbol @code{many}, for a +function with @code{&rest} arguments, or the symbol @code{unevalled} if +@var{subr} is a special form. +@end defun + +@node Lambda Expressions +@section Lambda Expressions +@cindex lambda expression + + A function written in Lisp is a list that looks like this: + +@example +(lambda (@var{arg-variables}@dots{}) + @r{[}@var{documentation-string}@r{]} + @r{[}@var{interactive-declaration}@r{]} + @var{body-forms}@dots{}) +@end example + +@noindent +Such a list is called a @dfn{lambda expression}. In Emacs Lisp, it +actually is valid as an expression---it evaluates to itself. In some +other Lisp dialects, a lambda expression is not a valid expression at +all. In either case, its main use is not to be evaluated as an +expression, but to be called as a function. + +@menu +* Lambda Components:: The parts of a lambda expression. +* Simple Lambda:: A simple example. +* Argument List:: Details and special features of argument lists. +* Function Documentation:: How to put documentation in a function. +@end menu + +@node Lambda Components +@subsection Components of a Lambda Expression + +@ifnottex + + A function written in Lisp (a ``lambda expression'') is a list that +looks like this: + +@example +(lambda (@var{arg-variables}@dots{}) + [@var{documentation-string}] + [@var{interactive-declaration}] + @var{body-forms}@dots{}) +@end example +@end ifnottex + +@cindex lambda list + The first element of a lambda expression is always the symbol +@code{lambda}. This indicates that the list represents a function. The +reason functions are defined to start with @code{lambda} is so that +other lists, intended for other uses, will not accidentally be valid as +functions. + + The second element is a list of symbols---the argument variable names. +This is called the @dfn{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. +@xref{Local Variables}. + + The documentation string is a Lisp string object placed within the +function definition to describe the function for the Emacs help +facilities. @xref{Function Documentation}. + + The interactive declaration is a list of the form @code{(interactive +@var{code-string})}. This declares how to provide arguments if the +function is used interactively. Functions with this declaration are called +@dfn{commands}; they can be called using @kbd{M-x} or bound to a key. +Functions not intended to be called in this way should not have interactive +declarations. @xref{Defining Commands}, for how to write an interactive +declaration. + +@cindex body of function + The rest of the elements are the @dfn{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. + +@node Simple Lambda +@subsection A Simple Lambda-Expression Example + + Consider for example the following function: + +@example +(lambda (a b c) (+ a b c)) +@end example + +@noindent +We can call this function by writing it as the @sc{car} of an +expression, like this: + +@example +@group +((lambda (a b c) (+ a b c)) + 1 2 3) +@end group +@end example + +@noindent +This call evaluates the body of the lambda expression with the variable +@code{a} bound to 1, @code{b} bound to 2, and @code{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: + +@example +@group +((lambda (a b c) (+ a b c)) + 1 (* 2 3) (- 5 4)) +@end group +@end example + +@noindent +This evaluates the arguments @code{1}, @code{(* 2 3)}, and @code{(- 5 +4)} from left to right. Then it applies the lambda expression 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 @sc{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 @code{let} +(@pxref{Local Variables}). And @code{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 (@pxref{Anonymous Functions}). + + However, calls to explicit lambda expressions were very useful in the +old days of Lisp, before the special form @code{let} was invented. At +that time, they were the only way to bind and initialize local +variables. + +@node Argument List +@subsection Other Features of Argument Lists +@kindex wrong-number-of-arguments +@cindex argument binding +@cindex binding arguments +@cindex argument lists, features + + Our simple sample function, @code{(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 get a @code{wrong-number-of-arguments} error. + + It is often convenient to write a function that allows certain +arguments to be omitted. For example, the function @code{substring} +accepts three arguments---a string, the start index and the end +index---but the third argument defaults to the @var{length} of the +string if you omit it. It is also convenient for certain functions to +accept an indefinite number of arguments, as the functions @code{list} +and @code{+} do. + +@cindex optional arguments +@cindex rest arguments +@kindex &optional +@kindex &rest + To specify optional arguments that may be omitted when a function +is called, simply include the keyword @code{&optional} before the optional +arguments. To specify a list of zero or more extra arguments, include the +keyword @code{&rest} before one final argument. + + Thus, the complete syntax for an argument list is as follows: + +@example +@group +(@var{required-vars}@dots{} + @r{[}&optional @var{optional-vars}@dots{}@r{]} + @r{[}&rest @var{rest-var}@r{]}) +@end group +@end example + +@noindent +The square brackets indicate that the @code{&optional} and @code{&rest} +clauses, and the variables that follow them, are optional. + + A call to the function requires one actual argument for each of the +@var{required-vars}. There may be actual arguments for zero or more of +the @var{optional-vars}, and there cannot be any actual arguments beyond +that unless the lambda list uses @code{&rest}. 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 @code{nil}. There is no way for the +function to distinguish between an explicit argument of @code{nil} and +an omitted argument. However, the body of the function is free to +consider @code{nil} an abbreviation for some other meaningful value. +This is what @code{substring} does; @code{nil} as the third argument to +@code{substring} means to use the length of the string supplied. + +@cindex CL note---default optional arg +@quotation +@b{Common Lisp note:} Common Lisp allows the function to specify what +default value to use when an optional argument is omitted; Emacs Lisp +always uses @code{nil}. Emacs Lisp does not support ``supplied-p'' +variables that tell you whether an argument was explicitly passed. +@end quotation + + For example, an argument list that looks like this: + +@example +(a b &optional c d &rest e) +@end example + +@noindent +binds @code{a} and @code{b} to the first two actual arguments, which are +required. If one or two more arguments are provided, @code{c} and +@code{d} are bound to them respectively; any arguments after the first +four are collected into a list and @code{e} is bound to that list. If +there are only two arguments, @code{c} is @code{nil}; if two or three +arguments, @code{d} is @code{nil}; if four arguments or fewer, @code{e} +is @code{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 @code{c} in the example were optional and @code{d} were required. +Suppose three actual arguments are given; which variable would the +third argument be for? Would it be used for the @var{c}, or for +@var{d}? One can argue for both possibilities. Similarly, it makes +no sense to have any more arguments (either required or optional) +after a @code{&rest} argument. + + Here are some examples of argument lists and proper calls: + +@smallexample +((lambda (n) (1+ n)) ; @r{One required:} + 1) ; @r{requires exactly one argument.} + @result{} 2 +((lambda (n &optional n1) ; @r{One required and one optional:} + (if n1 (+ n n1) (1+ n))) ; @r{1 or 2 arguments.} + 1 2) + @result{} 3 +((lambda (n &rest ns) ; @r{One required and one rest:} + (+ n (apply '+ ns))) ; @r{1 or more arguments.} + 1 2 3 4 5) + @result{} 15 +@end smallexample + +@node Function Documentation +@subsection Documentation Strings of Functions +@cindex documentation of function + + A lambda expression may optionally have a @dfn{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. @xref{Documentation}, for how the @var{documentation-string} is +accessed. + + It is a good idea to provide documentation strings for all the +functions in your program, even those that are called only from within +your program. Documentation strings are like comments, except that they +are easier to access. + + The first line of the documentation string should stand on its own, +because @code{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 in the +source file, 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 in the program source. @emph{That 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. + + The last line of the documentation string can specify calling +conventions different from the actual function arguments. Write +text like this: + +@example +\(fn @var{arglist}) +@end example + +@noindent +following a blank line, at the beginning of the line, with no newline +following it inside the documentation string. (The @samp{\} is used +to avoid confusing the Emacs motion commands.) The calling convention +specified in this way appears in help messages in place of the one +derived from the actual arguments of the function. + + This feature is particularly useful for macro definitions, since the +arguments written in a macro definition often do not correspond to the +way users think of the parts of the macro call. + +@node Function Names +@section Naming a Function +@cindex function definition +@cindex named function +@cindex function name + + 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 +@code{lambda}, a byte-code function object, 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 @dfn{function cell} +(@pxref{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 @dfn{function definition}. The procedure of using a +symbol's function definition in place of the symbol is called +@dfn{symbol function indirection}; see @ref{Function Indirection}. + + In practice, nearly all functions are given names in this way and +referred to through their names. For example, the symbol @code{car} works +as a function and does what it does because the primitive subr-object +@code{#<subr car>} is stored in its function cell. + + We give functions names because it is convenient to refer to them by +their names in Lisp expressions. For primitive subr-objects such as +@code{#<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). + + We often identify functions with the symbols used to name them. For +example, we often speak of ``the function @code{car},'' not +distinguishing between the symbol @code{car} and the primitive +subr-object that is its function definition. For most purposes, the +distinction is not important. + + Even so, keep in mind that a function need not have a unique name. While +a given function object @emph{usually} appears in the function cell of only +one symbol, this is just a matter of convenience. It is easy to store +it in several symbols using @code{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. (Some Lisp +dialects, such as Scheme, do not distinguish between a symbol's value +and its function definition; a symbol's value as a variable is also its +function definition.) If you have not given a symbol a function +definition, you cannot use it as a function; whether the symbol has a +value as a variable makes no difference to this. + +@node Defining Functions +@section Defining Functions +@cindex defining a function + + We usually give a name to a function when it is first created. This +is called @dfn{defining a function}, and it is done with the +@code{defun} special form. + +@defspec defun name argument-list body-forms +@code{defun} is the usual way to define new Lisp functions. It +defines the symbol @var{name} as a function that looks like this: + +@example +(lambda @var{argument-list} . @var{body-forms}) +@end example + +@code{defun} stores this lambda expression in the function cell of +@var{name}. It returns the value @var{name}, but usually we ignore this +value. + +As described previously, @var{argument-list} is a list of argument +names and may include the keywords @code{&optional} and @code{&rest} +(@pxref{Lambda Expressions}). Also, the first two of the +@var{body-forms} may be a documentation string and an interactive +declaration. + +There is no conflict if the same symbol @var{name} is also used as a +variable, since the symbol's value cell is independent of the function +cell. @xref{Symbol Components}. + +Here are some examples: + +@example +@group +(defun foo () 5) + @result{} foo +@end group +@group +(foo) + @result{} 5 +@end group + +@group +(defun bar (a &optional b &rest c) + (list a b c)) + @result{} bar +@end group +@group +(bar 1 2 3 4 5) + @result{} (1 2 (3 4 5)) +@end group +@group +(bar 1) + @result{} (1 nil nil) +@end group +@group +(bar) +@error{} Wrong number of arguments. +@end group + +@group +(defun capitalize-backwards () + "Upcase the last letter of a word." + (interactive) + (backward-word 1) + (forward-word 1) + (backward-char 1) + (capitalize-word 1)) + @result{} capitalize-backwards +@end group +@end example + +Be careful not to redefine existing functions unintentionally. +@code{defun} redefines even primitive functions such as @code{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. +@end defspec + +@cindex function aliases +@defun defalias name definition &optional docstring +@anchor{Definition of defalias} +This special form defines the symbol @var{name} as a function, with +definition @var{definition} (which can be any valid Lisp function). +It returns @var{definition}. + +If @var{docstring} is non-@code{nil}, it becomes the function +documentation of @var{name}. Otherwise, any documentation provided by +@var{definition} is used. + +The proper place to use @code{defalias} is where a specific function +name is being defined---especially where that name appears explicitly in +the source file being loaded. This is because @code{defalias} records +which file defined the function, just like @code{defun} +(@pxref{Unloading}). + +By contrast, in programs that manipulate function definitions for other +purposes, it is better to use @code{fset}, which does not keep such +records. @xref{Function Cells}. +@end defun + + You cannot create a new primitive function with @code{defun} or +@code{defalias}, but you can use them to change the function definition of +any symbol, even one such as @code{car} or @code{x-popup-menu} whose +normal definition is a primitive. However, this is risky: for +instance, it is next to impossible to redefine @code{car} without +breaking Lisp completely. Redefining an obscure function such as +@code{x-popup-menu} is less dangerous, but it still may not work as +you expect. If there are calls to the primitive from C code, they +call the primitive's C definition directly, so changing the symbol's +definition will have no effect on them. + + See also @code{defsubst}, which defines a function like @code{defun} +and tells the Lisp compiler to open-code it. @xref{Inline Functions}. + +@node Calling Functions +@section Calling Functions +@cindex function invocation +@cindex calling a function + + Defining functions is only half the battle. Functions don't do +anything until you @dfn{call} them, i.e., tell them to run. Calling a +function is also known as @dfn{invocation}. + + The most common way of invoking a function is by evaluating a list. +For example, evaluating the list @code{(concat "a" "b")} calls the +function @code{concat} with arguments @code{"a"} and @code{"b"}. +@xref{Evaluation}, for a description of evaluation. + + When you write a list as an expression in your program, you specify +which function to call, and how many arguments to give it, in the text +of the program. Usually that's just what you want. Occasionally you +need to compute at run time which function to call. To do that, use +the function @code{funcall}. When you also need to determine at run +time how many arguments to pass, use @code{apply}. + +@defun funcall function &rest arguments +@code{funcall} calls @var{function} with @var{arguments}, and returns +whatever @var{function} returns. + +Since @code{funcall} is a function, all of its arguments, including +@var{function}, are evaluated before @code{funcall} is called. This +means that you can use any expression to obtain the function to be +called. It also means that @code{funcall} does not see the +expressions you write for the @var{arguments}, only their values. +These values are @emph{not} evaluated a second time in the act of +calling @var{function}; the operation of @code{funcall} is like the +normal procedure for calling a function, once its arguments have +already been evaluated. + +The argument @var{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. @code{funcall} cannot provide these because, as we saw +above, it never knows them in the first place. + +@example +@group +(setq f 'list) + @result{} list +@end group +@group +(funcall f 'x 'y 'z) + @result{} (x y z) +@end group +@group +(funcall f 'x 'y '(z)) + @result{} (x y (z)) +@end group +@group +(funcall 'and t nil) +@error{} Invalid function: #<subr and> +@end group +@end example + +Compare these examples with the examples of @code{apply}. +@end defun + +@defun apply function &rest arguments +@code{apply} calls @var{function} with @var{arguments}, just like +@code{funcall} but with one difference: the last of @var{arguments} is a +list of objects, which are passed to @var{function} as separate +arguments, rather than a single list. We say that @code{apply} +@dfn{spreads} this list so that each individual element becomes an +argument. + +@code{apply} returns the result of calling @var{function}. As with +@code{funcall}, @var{function} must either be a Lisp function or a +primitive function; special forms and macros do not make sense in +@code{apply}. + +@example +@group +(setq f 'list) + @result{} list +@end group +@group +(apply f 'x 'y 'z) +@error{} Wrong type argument: listp, z +@end group +@group +(apply '+ 1 2 '(3 4)) + @result{} 10 +@end group +@group +(apply '+ '(1 2 3 4)) + @result{} 10 +@end group + +@group +(apply 'append '((a b c) nil (x y z) nil)) + @result{} (a b c x y z) +@end group +@end example + +For an interesting example of using @code{apply}, see @ref{Definition +of mapcar}. +@end defun + +@cindex functionals + 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 @code{funcall} or @code{apply}. Functions +that accept function arguments are often called @dfn{functionals}. + + Sometimes, when you call a functional, it is useful to supply a no-op +function as the argument. Here are two different kinds of no-op +function: + +@defun identity arg +This function returns @var{arg} and has no side effects. +@end defun + +@defun ignore &rest args +This function ignores any arguments and returns @code{nil}. +@end defun + +@node Mapping Functions +@section Mapping Functions +@cindex mapping functions + + A @dfn{mapping function} applies a given function (@emph{not} a +special form or macro) to each element of a list or other collection. +Emacs Lisp has several such functions; @code{mapcar} and +@code{mapconcat}, which scan a list, are described here. +@xref{Definition of mapatoms}, for the function @code{mapatoms} which +maps over the symbols in an obarray. @xref{Definition of maphash}, +for the function @code{maphash} which maps over key/value associations +in a hash table. + + These mapping functions do not allow char-tables because a char-table +is a sparse array whose nominal range of indices is very large. To map +over a char-table in a way that deals properly with its sparse nature, +use the function @code{map-char-table} (@pxref{Char-Tables}). + +@defun mapcar function sequence +@anchor{Definition of mapcar} +@code{mapcar} applies @var{function} to each element of @var{sequence} +in turn, and returns a list of the results. + +The argument @var{sequence} can be any kind of sequence except a +char-table; that is, a list, a vector, a bool-vector, or a string. The +result is always a list. The length of the result is the same as the +length of @var{sequence}. For example: + +@smallexample +@group +(mapcar 'car '((a b) (c d) (e f))) + @result{} (a c e) +(mapcar '1+ [1 2 3]) + @result{} (2 3 4) +(mapcar 'char-to-string "abc") + @result{} ("a" "b" "c") +@end group + +@group +;; @r{Call each function in @code{my-hooks}.} +(mapcar 'funcall my-hooks) +@end group + +@group +(defun mapcar* (function &rest args) + "Apply FUNCTION to successive cars of all ARGS. +Return the list of results." + ;; @r{If no list is exhausted,} + (if (not (memq nil args)) + ;; @r{apply function to @sc{car}s.} + (cons (apply function (mapcar 'car args)) + (apply 'mapcar* function + ;; @r{Recurse for rest of elements.} + (mapcar 'cdr args))))) +@end group + +@group +(mapcar* 'cons '(a b c) '(1 2 3 4)) + @result{} ((a . 1) (b . 2) (c . 3)) +@end group +@end smallexample +@end defun + +@defun mapc function sequence +@code{mapc} is like @code{mapcar} except that @var{function} is used for +side-effects only---the values it returns are ignored, not collected +into a list. @code{mapc} always returns @var{sequence}. +@end defun + +@defun mapconcat function sequence separator +@code{mapconcat} applies @var{function} to each element of +@var{sequence}: the results, which must be strings, are concatenated. +Between each pair of result strings, @code{mapconcat} inserts the string +@var{separator}. Usually @var{separator} contains a space or comma or +other suitable punctuation. + +The argument @var{function} must be a function that can take one +argument and return a string. The argument @var{sequence} can be any +kind of sequence except a char-table; that is, a list, a vector, a +bool-vector, or a string. + +@smallexample +@group +(mapconcat 'symbol-name + '(The cat in the hat) + " ") + @result{} "The cat in the hat" +@end group + +@group +(mapconcat (function (lambda (x) (format "%c" (1+ x)))) + "HAL-8000" + "") + @result{} "IBM.9111" +@end group +@end smallexample +@end defun + +@node Anonymous Functions +@section Anonymous Functions +@cindex anonymous function + + In Lisp, a function is a list that starts with @code{lambda}, a +byte-code function compiled from such a list, or alternatively a +primitive subr-object; names are ``extra.'' Although usually functions +are defined with @code{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: + +@smallexample +@group +(setq silly (append '(lambda (x)) (list (list '+ (* 3 4) 'x)))) +@result{} (lambda (x) (+ 12 x)) +@end group +@end smallexample + +@noindent +This computes a list that looks like @code{(lambda (x) (+ 12 x))} and +makes it the value (@emph{not} the function definition!) of +@code{silly}. + + Here is how we might call this function: + +@example +@group +(funcall silly 1) +@result{} 13 +@end group +@end example + +@noindent +(It does @emph{not} work to write @code{(silly 1)}, because this function +is not the @emph{function definition} of @code{silly}. We have not given +@code{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 @code{mapcar}, which applies any given function to each +element of a list. + + Here we define a function @code{change-property} which +uses a function as its third argument: + +@example +@group +(defun change-property (symbol prop function) + (let ((value (get symbol prop))) + (put symbol prop (funcall function value)))) +@end group +@end example + +@noindent +Here we define a function that uses @code{change-property}, +passing it a function to double a number: + +@example +@group +(defun double-property (symbol prop) + (change-property symbol prop '(lambda (x) (* 2 x)))) +@end group +@end example + +@noindent +In such cases, we usually use the special form @code{function} instead +of simple quotation to quote the anonymous function, like this: + +@example +@group +(defun double-property (symbol prop) + (change-property symbol prop + (function (lambda (x) (* 2 x))))) +@end group +@end example + +Using @code{function} instead of @code{quote} makes a difference if you +compile the function @code{double-property}. For example, if you +compile the second definition of @code{double-property}, the anonymous +function is compiled as well. By contrast, if you compile the first +definition which uses ordinary @code{quote}, the argument passed to +@code{change-property} is the precise list shown: + +@example +(lambda (x) (* x 2)) +@end example + +@noindent +The Lisp compiler cannot assume this list is a function, even though it +looks like one, since it does not know what @code{change-property} will +do with the list. Perhaps it will check whether the @sc{car} of the third +element is the symbol @code{*}! Using @code{function} tells the +compiler it is safe to go ahead and compile the constant function. + + Nowadays it is possible to omit @code{function} entirely, like this: + +@example +@group +(defun double-property (symbol prop) + (change-property symbol prop (lambda (x) (* 2 x)))) +@end group +@end example + +@noindent +This is because @code{lambda} itself implies @code{function}. + + We sometimes write @code{function} instead of @code{quote} when +quoting the name of a function, but this usage is just a sort of +comment: + +@example +(function @var{symbol}) @equiv{} (quote @var{symbol}) @equiv{} '@var{symbol} +@end example + +@cindex @samp{#'} syntax + The read syntax @code{#'} is a short-hand for using @code{function}. +For example, + +@example +#'(lambda (x) (* x x)) +@end example + +@noindent +is equivalent to + +@example +(function (lambda (x) (* x x))) +@end example + +@defspec function function-object +@cindex function quoting +This special form returns @var{function-object} without evaluating it. +In this, it is equivalent to @code{quote}. However, it serves as a +note to the Emacs Lisp compiler that @var{function-object} is intended +to be used only as a function, and therefore can safely be compiled. +Contrast this with @code{quote}, in @ref{Quoting}. +@end defspec + + @xref{describe-symbols example}, for a realistic example using +@code{function} and an anonymous function. + +@node Function Cells +@section Accessing Function Cell Contents + + The @dfn{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. + + See also the function @code{indirect-function}. @xref{Definition of +indirect-function}. + +@defun symbol-function symbol +@kindex void-function +This returns the object in the function cell of @var{symbol}. If the +symbol's function cell is void, a @code{void-function} error is +signaled. + +This function does not check that the returned object is a legitimate +function. + +@example +@group +(defun bar (n) (+ n 2)) + @result{} bar +@end group +@group +(symbol-function 'bar) + @result{} (lambda (n) (+ n 2)) +@end group +@group +(fset 'baz 'bar) + @result{} bar +@end group +@group +(symbol-function 'baz) + @result{} bar +@end group +@end example +@end defun + +@cindex void function cell + If you have never given a symbol any function definition, we say that +that symbol's function cell is @dfn{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 @code{void-function} error. + + Note that void is not the same as @code{nil} or the symbol +@code{void}. The symbols @code{nil} and @code{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 +@code{defun}). A void function cell contains no object whatsoever. + + You can test the voidness of a symbol's function definition with +@code{fboundp}. After you have given a symbol a function definition, you +can make it void once more using @code{fmakunbound}. + +@defun fboundp symbol +This function returns @code{t} if the symbol has an object in its +function cell, @code{nil} otherwise. It does not check that the object +is a legitimate function. +@end defun + +@defun fmakunbound symbol +This function makes @var{symbol}'s function cell void, so that a +subsequent attempt to access this cell will cause a +@code{void-function} error. It returns @var{symbol}. (See also +@code{makunbound}, in @ref{Void Variables}.) + +@example +@group +(defun foo (x) x) + @result{} foo +@end group +@group +(foo 1) + @result{}1 +@end group +@group +(fmakunbound 'foo) + @result{} foo +@end group +@group +(foo 1) +@error{} Symbol's function definition is void: foo +@end group +@end example +@end defun + +@defun fset symbol definition +This function stores @var{definition} in the function cell of +@var{symbol}. The result is @var{definition}. Normally +@var{definition} should be a function or the name of a function, but +this is not checked. The argument @var{symbol} is an ordinary evaluated +argument. + +There are three normal uses of this function: + +@itemize @bullet +@item +Copying one symbol's function definition to another---in other words, +making an alternate name for a function. (If you think of this as the +definition of the new name, you should use @code{defalias} instead of +@code{fset}; see @ref{Definition of defalias}.) + +@item +Giving a symbol a function definition that is not a list and therefore +cannot be made with @code{defun}. For example, you can use @code{fset} +to give a symbol @code{s1} a function definition which is another symbol +@code{s2}; then @code{s1} serves as an alias for whatever definition +@code{s2} presently has. (Once again use @code{defalias} instead of +@code{fset} if you think of this as the definition of @code{s1}.) + +@item +In constructs for defining or altering functions. If @code{defun} +were not a primitive, it could be written in Lisp (as a macro) using +@code{fset}. +@end itemize + +Here are examples of these uses: + +@example +@group +;; @r{Save @code{foo}'s definition in @code{old-foo}.} +(fset 'old-foo (symbol-function 'foo)) +@end group + +@group +;; @r{Make the symbol @code{car} the function definition of @code{xfirst}.} +;; @r{(Most likely, @code{defalias} would be better than @code{fset} here.)} +(fset 'xfirst 'car) + @result{} car +@end group +@group +(xfirst '(1 2 3)) + @result{} 1 +@end group +@group +(symbol-function 'xfirst) + @result{} car +@end group +@group +(symbol-function (symbol-function 'xfirst)) + @result{} #<subr car> +@end group + +@group +;; @r{Define a named keyboard macro.} +(fset 'kill-two-lines "\^u2\^k") + @result{} "\^u2\^k" +@end group + +@group +;; @r{Here is a function that alters other functions.} +(defun copy-function-definition (new old) + "Define NEW with the same function definition as OLD." + (fset new (symbol-function old))) +@end group +@end example +@end defun + + @code{fset} is sometimes used to save the old definition of a +function before redefining it. That permits the new definition to +invoke the old definition. But it is unmodular and unclean for a Lisp +file to redefine a function defined elsewhere. If you want to modify +a function defined by another package, it is cleaner to use +@code{defadvice} (@pxref{Advising Functions}). + +@node Obsolete Functions +@section Declaring Functions Obsolete + +You can use @code{make-obsolete} to declare a function obsolete. This +indicates that the function may be removed at some stage in the future. + +@defun make-obsolete obsolete-name current-name &optional when +This function makes the byte compiler warn that the function +@var{obsolete-name} is obsolete. If @var{current-name} is a symbol, the +warning message says to use @var{current-name} instead of +@var{obsolete-name}. @var{current-name} does not need to be an alias for +@var{obsolete-name}; it can be a different function with similar +functionality. If @var{current-name} is a string, it is the warning +message. + +If provided, @var{when} should be a string indicating when the function +was first made obsolete---for example, a date or a release number. +@end defun + +You can define a function as an alias and declare it obsolete at the +same time using the macro @code{define-obsolete-function-alias}. + +@defmac define-obsolete-function-alias obsolete-name current-name &optional when docstring +This macro marks the function @var{obsolete-name} obsolete and also +defines it as an alias for the function @var{current-name}. It is +equivalent to the following: + +@example +(defalias @var{obsolete-name} @var{current-name} @var{docstring}) +(make-obsolete @var{obsolete-name} @var{current-name} @var{when}) +@end example +@end defmac + +@node Inline Functions +@section Inline Functions +@cindex inline functions + +@findex defsubst +You can define an @dfn{inline function} by using @code{defsubst} instead +of @code{defun}. An inline function works just like an ordinary +function except for one thing: when you compile a call to the function, +the function's definition is open-coded into the caller. + +Making a function inline makes explicit calls run faster. But it also +has disadvantages. For one thing, it reduces flexibility; if you +change the definition of the function, calls already inlined still use +the old definition until you recompile them. + +Another disadvantage is that making a large function inline can increase +the size of compiled code both in files and in memory. Since the speed +advantage of inline functions is greatest for small functions, you +generally should not make large functions inline. + +Also, inline functions do not behave well with respect to debugging, +tracing, and advising (@pxref{Advising Functions}). Since ease of +debugging and the flexibility of redefining functions are important +features of Emacs, you should not make a function inline, even if it's +small, unless its speed is really crucial, and you've timed the code +to verify that using @code{defun} actually has performance problems. + +It's possible to define a macro to expand into the same code that an +inline function would execute. (@xref{Macros}.) But the macro would be +limited to direct use in expressions---a macro cannot be called with +@code{apply}, @code{mapcar} and so on. Also, it takes some work to +convert an ordinary function into a macro. To convert it into an inline +function is very easy; simply replace @code{defun} with @code{defsubst}. +Since each argument of an inline function is evaluated exactly once, you +needn't worry about how many times the body uses the arguments, as you +do for macros. (@xref{Argument Evaluation}.) + +Inline functions can be used and open-coded later on in the same file, +following the definition, just like macros. + +@node Function Safety +@section Determining whether a Function is Safe to Call +@cindex function safety +@cindex safety of functions + +Some major modes such as SES call functions that are stored in user +files. (@inforef{Top, ,ses}, for more information on SES.) User +files sometimes have poor pedigrees---you can get a spreadsheet from +someone you've just met, or you can get one through email from someone +you've never met. So it is risky to call a function whose source code +is stored in a user file until you have determined that it is safe. + +@defun unsafep form &optional unsafep-vars +Returns @code{nil} if @var{form} is a @dfn{safe} Lisp expression, or +returns a list that describes why it might be unsafe. The argument +@var{unsafep-vars} is a list of symbols known to have temporary +bindings at this point; it is mainly used for internal recursive +calls. The current buffer is an implicit argument, which provides a +list of buffer-local bindings. +@end defun + +Being quick and simple, @code{unsafep} does a very light analysis and +rejects many Lisp expressions that are actually safe. There are no +known cases where @code{unsafep} returns @code{nil} for an unsafe +expression. However, a ``safe'' Lisp expression can return a string +with a @code{display} property, containing an associated Lisp +expression to be executed after the string is inserted into a buffer. +This associated expression can be a virus. In order to be safe, you +must delete properties from all strings calculated by user code before +inserting them into buffers. + +@ignore +What is a safe Lisp expression? Basically, it's an expression that +calls only built-in functions with no side effects (or only innocuous +ones). Innocuous side effects include displaying messages and +altering non-risky buffer-local variables (but not global variables). + +@table @dfn +@item Safe expression +@itemize +@item +An atom or quoted thing. +@item +A call to a safe function (see below), if all its arguments are +safe expressions. +@item +One of the special forms @code{and}, @code{catch}, @code{cond}, +@code{if}, @code{or}, @code{prog1}, @code{prog2}, @code{progn}, +@code{while}, and @code{unwind-protect}], if all its arguments are +safe. +@item +A form that creates temporary bindings (@code{condition-case}, +@code{dolist}, @code{dotimes}, @code{lambda}, @code{let}, or +@code{let*}), if all args are safe and the symbols to be bound are not +explicitly risky (see @pxref{File Local Variables}). +@item +An assignment using @code{add-to-list}, @code{setq}, @code{push}, or +@code{pop}, if all args are safe and the symbols to be assigned are +not explicitly risky and they already have temporary or buffer-local +bindings. +@item +One of [apply, mapc, mapcar, mapconcat] if the first argument is a +safe explicit lambda and the other args are safe expressions. +@end itemize + +@item Safe function +@itemize +@item +A lambda containing safe expressions. +@item +A symbol on the list @code{safe-functions}, so the user says it's safe. +@item +A symbol with a non-@code{nil} @code{side-effect-free} property. +@item +A symbol with a non-@code{nil} @code{safe-function} property. Value t +indicates a function that is safe but has innocuous side effects. +Other values will someday indicate functions with classes of side +effects that are not always safe. +@end itemize + +The @code{side-effect-free} and @code{safe-function} properties are +provided for built-in functions and for low-level functions and macros +defined in @file{subr.el}. You can assign these properties for the +functions you write. +@end table +@end ignore + +@node Related Topics +@section Other Topics Related to Functions + + Here is a table of several functions that do things related to +function calling and function definitions. They are documented +elsewhere, but we provide cross references here. + +@table @code +@item apply +See @ref{Calling Functions}. + +@item autoload +See @ref{Autoload}. + +@item call-interactively +See @ref{Interactive Call}. + +@item commandp +See @ref{Interactive Call}. + +@item documentation +See @ref{Accessing Documentation}. + +@item eval +See @ref{Eval}. + +@item funcall +See @ref{Calling Functions}. + +@item function +See @ref{Anonymous Functions}. + +@item ignore +See @ref{Calling Functions}. + +@item indirect-function +See @ref{Function Indirection}. + +@item interactive +See @ref{Using Interactive}. + +@item interactive-p +See @ref{Interactive Call}. + +@item mapatoms +See @ref{Creating Symbols}. + +@item mapcar +See @ref{Mapping Functions}. + +@item map-char-table +See @ref{Char-Tables}. + +@item mapconcat +See @ref{Mapping Functions}. + +@item undefined +See @ref{Functions for Key Lookup}. +@end table + +@ignore + arch-tag: 39100cdf-8a55-4898-acba-595db619e8e2 +@end ignore diff --git a/doc/lispref/gpl.texi b/doc/lispref/gpl.texi new file mode 100644 index 00000000000..e9f7218ede9 --- /dev/null +++ b/doc/lispref/gpl.texi @@ -0,0 +1,727 @@ +@c -*-texinfo-*- +@setfilename ../info/gpl + +@node GPL, Tips, GNU Free Documentation License, Top +@comment node-name, next, previous, up +@appendix GNU General Public License +@c The GNU General Public License. +@center Version 3, 29 June 2007 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. +@end display + +@heading Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program---to make sure it remains +free software for all its users. We, the Free Software Foundation, +use the GNU General Public License for most of our software; it +applies also to any other work released this way by its authors. You +can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, +receive or can get the source code. And you must show them these +terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +@heading TERMS AND CONDITIONS + +@enumerate 0 +@item Definitions. + +``This License'' refers to version 3 of the GNU General Public License. + +``Copyright'' also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +``The Program'' refers to any copyrightable work licensed under this +License. Each licensee is addressed as ``you''. ``Licensees'' and +``recipients'' may be individuals or organizations. + +To ``modify'' a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a ``modified version'' of +the earlier work or a work ``based on'' the earlier work. + +A ``covered work'' means either the unmodified Program or a work based +on the Program. + +To ``propagate'' a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To ``convey'' a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays ``Appropriate Legal Notices'' to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +@item Source Code. + +The ``source code'' for a work means the preferred form of the work for +making modifications to it. ``Object code'' means any non-source form +of a work. + +A ``Standard Interface'' means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The ``System Libraries'' of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +``Major Component'', in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The ``Corresponding Source'' for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +@item Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +@item Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +@item Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +@item Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +@enumerate a +@item +The work must carry prominent notices stating that you modified it, +and giving a relevant date. + +@item +The work must carry prominent notices stating that it is released +under this License and any conditions added under section 7. This +requirement modifies the requirement in section 4 to ``keep intact all +notices''. + +@item +You must license the entire work, as a whole, under this License to +anyone who comes into possession of a copy. This License will +therefore apply, along with any applicable section 7 additional terms, +to the whole of the work, and all its parts, regardless of how they +are packaged. This License gives no permission to license the work in +any other way, but it does not invalidate such permission if you have +separately received it. + +@item +If the work has interactive user interfaces, each must display +Appropriate Legal Notices; however, if the Program has interactive +interfaces that do not display Appropriate Legal Notices, your work +need not make them do so. +@end enumerate + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +``aggregate'' if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +@item Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +@enumerate a +@item +Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by the +Corresponding Source fixed on a durable physical medium customarily +used for software interchange. + +@item +Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by a written +offer, valid for at least three years and valid for as long as you +offer spare parts or customer support for that product model, to give +anyone who possesses the object code either (1) a copy of the +Corresponding Source for all the software in the product that is +covered by this License, on a durable physical medium customarily used +for software interchange, for a price no more than your reasonable +cost of physically performing this conveying of source, or (2) access +to copy the Corresponding Source from a network server at no charge. + +@item +Convey individual copies of the object code with a copy of the written +offer to provide the Corresponding Source. This alternative is +allowed only occasionally and noncommercially, and only if you +received the object code with such an offer, in accord with subsection +6b. + +@item +Convey the object code by offering access from a designated place +(gratis or for a charge), and offer equivalent access to the +Corresponding Source in the same way through the same place at no +further charge. You need not require recipients to copy the +Corresponding Source along with the object code. If the place to copy +the object code is a network server, the Corresponding Source may be +on a different server (operated by you or a third party) that supports +equivalent copying facilities, provided you maintain clear directions +next to the object code saying where to find the Corresponding Source. +Regardless of what server hosts the Corresponding Source, you remain +obligated to ensure that it is available for as long as needed to +satisfy these requirements. + +@item +Convey the object code using peer-to-peer transmission, provided you +inform other peers where the object code and Corresponding Source of +the work are being offered to the general public at no charge under +subsection 6d. + +@end enumerate + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A ``User Product'' is either (1) a ``consumer product'', which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +``normally used'' refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +``Installation Information'' for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +@item Additional Terms. + +``Additional permissions'' are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +@enumerate a +@item +Disclaiming warranty or limiting liability differently from the terms +of sections 15 and 16 of this License; or + +@item +Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices +displayed by works containing it; or + +@item +Prohibiting misrepresentation of the origin of that material, or +requiring that modified versions of such material be marked in +reasonable ways as different from the original version; or + +@item +Limiting the use for publicity purposes of names of licensors or +authors of the material; or + +@item +Declining to grant rights under trademark law for use of some trade +names, trademarks, or service marks; or + +@item +Requiring indemnification of licensors and authors of that material by +anyone who conveys the material (or modified versions of it) with +contractual assumptions of liability to the recipient, for any +liability that these contractual assumptions directly impose on those +licensors and authors. +@end enumerate + +All other non-permissive additional terms are considered ``further +restrictions'' within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +@item Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +@item Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +@item Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An ``entity transaction'' is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +@item Patents. + +A ``contributor'' is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's ``contributor version''. + +A contributor's ``essential patent claims'' are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, ``control'' includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a ``patent license'' is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To ``grant'' such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. ``Knowingly relying'' means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is ``discriminatory'' if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +@item No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey +a covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree +to terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +@item Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +@item Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If +the Program does not specify a version number of the GNU General +Public License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +@item Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``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 PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +@item Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +@item Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +@end enumerate + +@heading END OF TERMS AND CONDITIONS + +@heading How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the ``copyright'' line and a pointer to where the full notice is found. + +@smallexample +@var{one line to give the program's name and a brief idea of what it does.} +Copyright (C) @var{year} @var{name of author} + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see @url{http://www.gnu.org/licenses/}. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + +@smallexample +@var{program} Copyright (C) @var{year} @var{name of author} +This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. +This is free software, and you are welcome to redistribute it +under certain conditions; type @samp{show c} for details. +@end smallexample + +The hypothetical commands @samp{show w} and @samp{show c} should show +the appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an ``about box''. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a ``copyright disclaimer'' for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +@url{http://www.gnu.org/licenses/}. + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use +the GNU Lesser General Public License instead of this License. But +first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. + +@ignore + arch-tag: d00ac830-e120-41fb-bbc5-7ca3eeaa227f +@end ignore diff --git a/doc/lispref/hash.texi b/doc/lispref/hash.texi new file mode 100644 index 00000000000..c5b68e26d91 --- /dev/null +++ b/doc/lispref/hash.texi @@ -0,0 +1,337 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1999, 2001, 2002, 2003, 2004, 2005, +@c 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/hash +@node Hash Tables, Symbols, Sequences Arrays Vectors, Top +@chapter Hash Tables +@cindex hash tables +@cindex lookup tables + + A hash table is a very fast kind of lookup table, somewhat like an +alist (@pxref{Association Lists}) in that it maps keys to +corresponding values. It differs from an alist in these ways: + +@itemize @bullet +@item +Lookup in a hash table is extremely fast for large tables---in fact, the +time required is essentially @emph{independent} of how many elements are +stored in the table. For smaller tables (a few tens of elements) +alists may still be faster because hash tables have a more-or-less +constant overhead. + +@item +The correspondences in a hash table are in no particular order. + +@item +There is no way to share structure between two hash tables, +the way two alists can share a common tail. +@end itemize + + Emacs Lisp provides a general-purpose hash table data type, along +with a series of functions for operating on them. Hash tables have no +read syntax, and print in hash notation, like this: + +@example +(make-hash-table) + @result{} #<hash-table 'eql nil 0/65 0x83af980> +@end example + +@noindent +(The term ``hash notation'' refers to the initial @samp{#} +character---@pxref{Printed Representation}---and has nothing to do with +the term ``hash table.'') + + Obarrays are also a kind of hash table, but they are a different type +of object and are used only for recording interned symbols +(@pxref{Creating Symbols}). + +@menu +* Creating Hash:: Functions to create hash tables. +* Hash Access:: Reading and writing the hash table contents. +* Defining Hash:: Defining new comparison methods +* Other Hash:: Miscellaneous. +@end menu + +@node Creating Hash +@section Creating Hash Tables +@cindex creating hash tables + + The principal function for creating a hash table is +@code{make-hash-table}. + +@defun make-hash-table &rest keyword-args +This function creates a new hash table according to the specified +arguments. The arguments should consist of alternating keywords +(particular symbols recognized specially) and values corresponding to +them. + +Several keywords make sense in @code{make-hash-table}, but the only two +that you really need to know about are @code{:test} and @code{:weakness}. + +@table @code +@item :test @var{test} +This specifies the method of key lookup for this hash table. The +default is @code{eql}; @code{eq} and @code{equal} are other +alternatives: + +@table @code +@item eql +Keys which are numbers are ``the same'' if they are @code{equal}, that +is, if they are equal in value and either both are integers or both +are floating point numbers; otherwise, two distinct objects are never +``the same.'' + +@item eq +Any two distinct Lisp objects are ``different'' as keys. + +@item equal +Two Lisp objects are ``the same,'' as keys, if they are equal +according to @code{equal}. +@end table + +You can use @code{define-hash-table-test} (@pxref{Defining Hash}) to +define additional possibilities for @var{test}. + +@item :weakness @var{weak} +The weakness of a hash table specifies whether the presence of a key or +value in the hash table preserves it from garbage collection. + +The value, @var{weak}, must be one of @code{nil}, @code{key}, +@code{value}, @code{key-or-value}, @code{key-and-value}, or @code{t} +which is an alias for @code{key-and-value}. If @var{weak} is @code{key} +then the hash table does not prevent its keys from being collected as +garbage (if they are not referenced anywhere else); if a particular key +does get collected, the corresponding association is removed from the +hash table. + +If @var{weak} is @code{value}, then the hash table does not prevent +values from being collected as garbage (if they are not referenced +anywhere else); if a particular value does get collected, the +corresponding association is removed from the hash table. + +If @var{weak} is @code{key-and-value} or @code{t}, both the key and +the value must be live in order to preserve the association. Thus, +the hash table does not protect either keys or values from garbage +collection; if either one is collected as garbage, that removes the +association. + +If @var{weak} is @code{key-or-value}, either the key or +the value can preserve the association. Thus, associations are +removed from the hash table when both their key and value would be +collected as garbage (if not for references from weak hash tables). + +The default for @var{weak} is @code{nil}, so that all keys and values +referenced in the hash table are preserved from garbage collection. + +@item :size @var{size} +This specifies a hint for how many associations you plan to store in the +hash table. If you know the approximate number, you can make things a +little more efficient by specifying it this way. If you specify too +small a size, the hash table will grow automatically when necessary, but +doing that takes some extra time. + +The default size is 65. + +@item :rehash-size @var{rehash-size} +When you add an association to a hash table and the table is ``full,'' +it grows automatically. This value specifies how to make the hash table +larger, at that time. + +If @var{rehash-size} is an integer, it should be positive, and the hash +table grows by adding that much to the nominal size. If +@var{rehash-size} is a floating point number, it had better be greater +than 1, and the hash table grows by multiplying the old size by that +number. + +The default value is 1.5. + +@item :rehash-threshold @var{threshold} +This specifies the criterion for when the hash table is ``full'' (so +it should be made larger). The value, @var{threshold}, should be a +positive floating point number, no greater than 1. The hash table is +``full'' whenever the actual number of entries exceeds this fraction +of the nominal size. The default for @var{threshold} is 0.8. +@end table +@end defun + +@defun makehash &optional test +This is equivalent to @code{make-hash-table}, but with a different style +argument list. The argument @var{test} specifies the method +of key lookup. + +This function is obsolete. Use @code{make-hash-table} instead. +@end defun + +@node Hash Access +@section Hash Table Access + + This section describes the functions for accessing and storing +associations in a hash table. In general, any Lisp object can be used +as a hash key, unless the comparison method imposes limits. Any Lisp +object can also be used as the value. + +@defun gethash key table &optional default +This function looks up @var{key} in @var{table}, and returns its +associated @var{value}---or @var{default}, if @var{key} has no +association in @var{table}. +@end defun + +@defun puthash key value table +This function enters an association for @var{key} in @var{table}, with +value @var{value}. If @var{key} already has an association in +@var{table}, @var{value} replaces the old associated value. +@end defun + +@defun remhash key table +This function removes the association for @var{key} from @var{table}, if +there is one. If @var{key} has no association, @code{remhash} does +nothing. + +@b{Common Lisp note:} In Common Lisp, @code{remhash} returns +non-@code{nil} if it actually removed an association and @code{nil} +otherwise. In Emacs Lisp, @code{remhash} always returns @code{nil}. +@end defun + +@defun clrhash table +This function removes all the associations from hash table @var{table}, +so that it becomes empty. This is also called @dfn{clearing} the hash +table. + +@b{Common Lisp note:} In Common Lisp, @code{clrhash} returns the empty +@var{table}. In Emacs Lisp, it returns @code{nil}. +@end defun + +@defun maphash function table +@anchor{Definition of maphash} +This function calls @var{function} once for each of the associations in +@var{table}. The function @var{function} should accept two +arguments---a @var{key} listed in @var{table}, and its associated +@var{value}. @code{maphash} returns @code{nil}. +@end defun + +@node Defining Hash +@section Defining Hash Comparisons +@cindex hash code +@cindex define hash comparisons + + You can define new methods of key lookup by means of +@code{define-hash-table-test}. In order to use this feature, you need +to understand how hash tables work, and what a @dfn{hash code} means. + + You can think of a hash table conceptually as a large array of many +slots, each capable of holding one association. To look up a key, +@code{gethash} first computes an integer, the hash code, from the key. +It reduces this integer modulo the length of the array, to produce an +index in the array. Then it looks in that slot, and if necessary in +other nearby slots, to see if it has found the key being sought. + + Thus, to define a new method of key lookup, you need to specify both a +function to compute the hash code from a key, and a function to compare +two keys directly. + +@defun define-hash-table-test name test-fn hash-fn +This function defines a new hash table test, named @var{name}. + +After defining @var{name} in this way, you can use it as the @var{test} +argument in @code{make-hash-table}. When you do that, the hash table +will use @var{test-fn} to compare key values, and @var{hash-fn} to compute +a ``hash code'' from a key value. + +The function @var{test-fn} should accept two arguments, two keys, and +return non-@code{nil} if they are considered ``the same.'' + +The function @var{hash-fn} should accept one argument, a key, and return +an integer that is the ``hash code'' of that key. For good results, the +function should use the whole range of integer values for hash codes, +including negative integers. + +The specified functions are stored in the property list of @var{name} +under the property @code{hash-table-test}; the property value's form is +@code{(@var{test-fn} @var{hash-fn})}. +@end defun + +@defun sxhash obj +This function returns a hash code for Lisp object @var{obj}. +This is an integer which reflects the contents of @var{obj} +and the other Lisp objects it points to. + +If two objects @var{obj1} and @var{obj2} are equal, then @code{(sxhash +@var{obj1})} and @code{(sxhash @var{obj2})} are the same integer. + +If the two objects are not equal, the values returned by @code{sxhash} +are usually different, but not always; once in a rare while, by luck, +you will encounter two distinct-looking objects that give the same +result from @code{sxhash}. +@end defun + + This example creates a hash table whose keys are strings that are +compared case-insensitively. + +@example +(defun case-fold-string= (a b) + (compare-strings a nil nil b nil nil t)) +(defun case-fold-string-hash (a) + (sxhash (upcase a))) + +(define-hash-table-test 'case-fold + 'case-fold-string= 'case-fold-string-hash) + +(make-hash-table :test 'case-fold) +@end example + + Here is how you could define a hash table test equivalent to the +predefined test value @code{equal}. The keys can be any Lisp object, +and equal-looking objects are considered the same key. + +@example +(define-hash-table-test 'contents-hash 'equal 'sxhash) + +(make-hash-table :test 'contents-hash) +@end example + +@node Other Hash +@section Other Hash Table Functions + + Here are some other functions for working with hash tables. + +@defun hash-table-p table +This returns non-@code{nil} if @var{table} is a hash table object. +@end defun + +@defun copy-hash-table table +This function creates and returns a copy of @var{table}. Only the table +itself is copied---the keys and values are shared. +@end defun + +@defun hash-table-count table +This function returns the actual number of entries in @var{table}. +@end defun + +@defun hash-table-test table +This returns the @var{test} value that was given when @var{table} was +created, to specify how to hash and compare keys. See +@code{make-hash-table} (@pxref{Creating Hash}). +@end defun + +@defun hash-table-weakness table +This function returns the @var{weak} value that was specified for hash +table @var{table}. +@end defun + +@defun hash-table-rehash-size table +This returns the rehash size of @var{table}. +@end defun + +@defun hash-table-rehash-threshold table +This returns the rehash threshold of @var{table}. +@end defun + +@defun hash-table-size table +This returns the current nominal size of @var{table}. +@end defun + +@ignore + arch-tag: 3b5107f9-d2f0-47d5-ad61-3498496bea0e +@end ignore diff --git a/doc/lispref/help.texi b/doc/lispref/help.texi new file mode 100644 index 00000000000..dd56aa872b7 --- /dev/null +++ b/doc/lispref/help.texi @@ -0,0 +1,699 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/help +@node Documentation, Files, Modes, Top +@chapter Documentation +@cindex documentation strings + + 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. + + For commands to display documentation strings, see @ref{Help, , +Help, emacs, The GNU Emacs Manual}. For the conventions for writing +documentation strings, see @ref{Documentation Tips}. + +@menu +* Documentation Basics:: Good style for doc strings. + Where to put them. How Emacs stores them. +* Accessing Documentation:: How Lisp programs can access doc strings. +* Keys in Documentation:: Substituting current key bindings. +* Describing Characters:: Making printable descriptions of + non-printing characters and key sequences. +* Help Functions:: Subroutines used by Emacs help facilities. +@end menu + +@node Documentation Basics +@comment node-name, next, previous, up +@section Documentation Basics +@cindex documentation conventions +@cindex writing a documentation string +@cindex string, writing a doc string + + 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 @code{apropos}, show only the first line of a multi-line +documentation string. Also, you should not indent the second line of +a documentation string, if it has one, because that looks odd when you +use @kbd{C-h f} (@code{describe-function}) or @kbd{C-h v} +(@code{describe-variable}) to view the documentation string. There +are many other conventions for doc strings; see @ref{Documentation +Tips}. + + Documentation strings can 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. (@xref{Keys in Documentation}.) + +@vindex emacs-lisp-docstring-fill-column + Emacs Lisp mode fills documentation strings to the width +specified by @code{emacs-lisp-docstring-fill-column}. + + In Emacs Lisp, a documentation string is accessible through the +function or variable that it describes: + +@itemize @bullet +@item +@kindex function-documentation +The documentation for a function is usually stored in the function +definition itself (@pxref{Lambda Expressions}). The function +@code{documentation} knows how to extract it. You can also put +function documentation in the @code{function-documentation} property +of the function name. That is useful with definitions such as +keyboard macros that can't hold a documentation string. + +@item +@kindex variable-documentation +The documentation for a variable is stored in the variable's property +list under the property name @code{variable-documentation}. The +function @code{documentation-property} knows how to retrieve it. +@end itemize + +@cindex @file{DOC-@var{version}} (documentation) file +To save space, the documentation for preloaded functions and variables +(including primitive functions and autoloaded functions) is stored in +the file @file{emacs/etc/DOC-@var{version}}---not inside Emacs. The +documentation strings for functions and variables loaded during the +Emacs session from byte-compiled files are stored in those files +(@pxref{Docs and Compilation}). + +The data structure inside Emacs has an integer offset into the file, or +a list containing a file name and an integer, in place of the +documentation string. The functions @code{documentation} and +@code{documentation-property} use that information to fetch the +documentation string from the appropriate file; this is transparent to +the user. + +@c Wordy to prevent overfull hbox. --rjc 15mar92 + The @file{emacs/lib-src} directory contains two utilities that you can +use to print nice-looking hardcopy for the file +@file{emacs/etc/DOC-@var{version}}. These are @file{sorted-doc} and +@file{digest-doc}. + +@node Accessing Documentation +@section Access to Documentation Strings + +@defun documentation-property symbol property &optional verbatim +This function returns the documentation string that is recorded in +@var{symbol}'s property list under property @var{property}. It +retrieves the text from a file if the value calls for that. If the +property value isn't @code{nil}, isn't a string, and doesn't refer to +text in a file, then it is evaluated to obtain a string. + +The last thing this function does is pass the string through +@code{substitute-command-keys} to substitute actual key bindings, +unless @var{verbatim} is non-@code{nil}. + +@smallexample +@group +(documentation-property 'command-line-processed + 'variable-documentation) + @result{} "Non-nil once command line has been processed" +@end group +@group +(symbol-plist 'command-line-processed) + @result{} (variable-documentation 188902) +@end group +@group +(documentation-property 'emacs 'group-documentation) + @result{} "Customization of the One True Editor." +@end group +@end smallexample +@end defun + +@defun documentation function &optional verbatim +This function returns the documentation string of @var{function}. +@code{documentation} handles macros, named keyboard macros, and +special forms, as well as ordinary functions. + +If @var{function} is a symbol, this function first looks for the +@code{function-documentation} property of that symbol; if that has a +non-@code{nil} value, the documentation comes from that value (if the +value is not a string, it is evaluated). If @var{function} is not a +symbol, or if it has no @code{function-documentation} property, then +@code{documentation} extracts the documentation string from the actual +function definition, reading it from a file if called for. + +Finally, unless @var{verbatim} is non-@code{nil}, it calls +@code{substitute-command-keys} so as to return a value containing the +actual (current) key bindings. + +The function @code{documentation} signals a @code{void-function} error +if @var{function} has no function definition. However, it is OK if +the function definition has no documentation string. In that case, +@code{documentation} returns @code{nil}. +@end defun + +@defun face-documentation face +This function returns the documentation string of @var{face} as a +face. +@end defun + +@c Wordy to prevent overfull hboxes. --rjc 15mar92 +Here is an example of using the two functions, @code{documentation} and +@code{documentation-property}, to display the documentation strings for +several symbols in a @samp{*Help*} buffer. + +@anchor{describe-symbols example} +@smallexample +@group +(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) +@end group +@group + ;; @r{Print description of symbol.} + (if (fboundp s) ; @r{It is a function.} + (princ + (format "%s\t%s\n%s\n\n" s + (if (commandp s) + (let ((keys (where-is-internal s))) + (if keys + (concat + "Keys: " + (mapconcat 'key-description + keys " ")) + "Keys: none")) + "Function") +@end group +@group + (or (documentation s) + "not documented")))) + + (if (boundp s) ; @r{It is a variable.} +@end group +@group + (princ + (format "%s\t%s\n%s\n\n" s + (if (user-variable-p s) + "Option " "Variable") +@end group +@group + (or (documentation-property + s 'variable-documentation) + "not documented"))))))) + sym-list) +@end group + +@group + ;; @r{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)))))) +@end group + +@group + ;; @r{Display the data.} + (with-output-to-temp-buffer "*Help*" + (mapcar describe-func (sort sym-list 'string<)) + (print-help-return-message)))) +@end group +@end smallexample + + The @code{describe-symbols} function works like @code{apropos}, +but provides more information. + +@smallexample +@group +(describe-symbols "goal") + +---------- Buffer: *Help* ---------- +goal-column Option +*Semipermanent goal column for vertical motion, as set by @dots{} +@end group +@c Do not blithely break or fill these lines. +@c That makes them incorrect. + +@group +set-goal-column Keys: C-x C-n +Set the current horizontal position as a goal for C-n and C-p. +@end group +@c DO NOT put a blank line here! That is factually inaccurate! +@group +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. +The goal column is stored in the variable `goal-column'. +@end group + +@group +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. +When the `track-eol' feature is doing its job, the value is 9999. +---------- Buffer: *Help* ---------- +@end group +@end smallexample + +The asterisk @samp{*} as the first character of a variable's doc string, +as shown above for the @code{goal-column} variable, means that it is a +user option; see the description of @code{defvar} in @ref{Defining +Variables}. + +@defun Snarf-documentation filename +@anchor{Definition of Snarf-documentation} +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 @var{filename}, and records +them in the in-core function definitions and variable property lists in +place of the actual strings. @xref{Building Emacs}. + +Emacs reads the file @var{filename} from the @file{emacs/etc} directory. +When the dumped Emacs is later executed, the same file will be looked +for in the directory @code{doc-directory}. Usually @var{filename} is +@code{"DOC-@var{version}"}. +@end defun + +@c Emacs 19 feature +@defvar doc-directory +This variable holds the name of the directory which should contain the +file @code{"DOC-@var{version}"} that contains documentation strings for +built-in and preloaded functions and variables. + +In most cases, this is the same as @code{data-directory}. They may be +different when you run Emacs from the directory where you built it, +without actually installing it. @xref{Definition of data-directory}. + +In older Emacs versions, @code{exec-directory} was used for this. +@end defvar + +@node Keys in Documentation +@section Substituting Key Bindings in Documentation +@cindex documentation, keys in +@cindex keys in documentation strings +@cindex substituting keys in documentation + + When documentation strings refer to key sequences, they should use the +current, actual key bindings. They can do so using certain special text +sequences described below. Accessing documentation strings in the usual +way substitutes current key binding information for these special +sequences. This works by calling @code{substitute-command-keys}. You +can also call that function yourself. + + Here is a list of the special sequences and what they mean: + +@table @code +@item \[@var{command}] +stands for a key sequence that will invoke @var{command}, or @samp{M-x +@var{command}} if @var{command} has no key bindings. + +@item \@{@var{mapvar}@} +stands for a summary of the keymap which is the value of the variable +@var{mapvar}. The summary is made using @code{describe-bindings}. + +@item \<@var{mapvar}> +stands for no text itself. It is used only for a side effect: it +specifies @var{mapvar}'s value as the keymap for any following +@samp{\[@var{command}]} sequences in this documentation string. + +@item \= +quotes the following character and is discarded; thus, @samp{\=\[} puts +@samp{\[} into the output, and @samp{\=\=} puts @samp{\=} into the +output. +@end table + +@strong{Please note:} Each @samp{\} must be doubled when written in a +string in Emacs Lisp. + +@defun substitute-command-keys string +This function scans @var{string} for the above special sequences and +replaces them by what they stand for, returning the result as a string. +This permits display of documentation that refers accurately to the +user's own customized key bindings. +@end defun + + Here are examples of the special sequences: + +@smallexample +@group +(substitute-command-keys + "To abort recursive edit, type: \\[abort-recursive-edit]") +@result{} "To abort recursive edit, type: C-]" +@end group + +@group +(substitute-command-keys + "The keys that are defined for the minibuffer here are: + \\@{minibuffer-local-must-match-map@}") +@result{} "The keys that are defined for the minibuffer here are: +@end group + +? minibuffer-completion-help +SPC minibuffer-complete-word +TAB minibuffer-complete +C-j minibuffer-complete-and-exit +RET minibuffer-complete-and-exit +C-g abort-recursive-edit +" + +@group +(substitute-command-keys + "To abort a recursive edit from the minibuffer, type\ +\\<minibuffer-local-must-match-map>\\[abort-recursive-edit].") +@result{} "To abort a recursive edit from the minibuffer, type C-g." +@end group +@end smallexample + + There are other special conventions for the text in documentation +strings---for instance, you can refer to functions, variables, and +sections of this manual. @xref{Documentation Tips}, for details. + +@node Describing Characters +@section Describing Characters for Help Messages +@cindex describe characters and events + + These functions convert events, key sequences, or characters to +textual descriptions. These descriptions are useful for including +arbitrary text characters or key sequences in messages, because they +convert non-printing and whitespace characters to sequences of printing +characters. The description of a non-whitespace printing character is +the character itself. + +@defun key-description sequence &optional prefix +@cindex Emacs event standard notation +This function returns a string containing the Emacs standard notation +for the input events in @var{sequence}. If @var{prefix} is +non-@code{nil}, it is a sequence of input events leading up to +@var{sequence} and is included in the return value. Both arguments +may be strings, vectors or lists. @xref{Input Events}, for more +information about valid events. + +@smallexample +@group +(key-description [?\M-3 delete]) + @result{} "M-3 <delete>" +@end group +@group +(key-description [delete] "\M-3") + @result{} "M-3 <delete>" +@end group +@end smallexample + + See also the examples for @code{single-key-description}, below. +@end defun + +@defun single-key-description event &optional no-angles +@cindex event printing +@cindex character printing +@cindex control character printing +@cindex meta character printing +This function returns a string describing @var{event} in the standard +Emacs notation for keyboard input. A normal printing character +appears as itself, but a control character turns into a string +starting with @samp{C-}, a meta character turns into a string starting +with @samp{M-}, and space, tab, etc.@: appear as @samp{SPC}, +@samp{TAB}, etc. A function key symbol appears inside angle brackets +@samp{<@dots{}>}. An event that is a list appears as the name of the +symbol in the @sc{car} of the list, inside angle brackets. + +If the optional argument @var{no-angles} is non-@code{nil}, the angle +brackets around function keys and event symbols are omitted; this is +for compatibility with old versions of Emacs which didn't use the +brackets. + +@smallexample +@group +(single-key-description ?\C-x) + @result{} "C-x" +@end group +@group +(key-description "\C-x \M-y \n \t \r \f123") + @result{} "C-x SPC M-y SPC C-j SPC TAB SPC RET SPC C-l 1 2 3" +@end group +@group +(single-key-description 'delete) + @result{} "<delete>" +@end group +@group +(single-key-description 'C-mouse-1) + @result{} "<C-mouse-1>" +@end group +@group +(single-key-description 'C-mouse-1 t) + @result{} "C-mouse-1" +@end group +@end smallexample +@end defun + +@defun text-char-description character +This function returns a string describing @var{character} in the +standard Emacs notation for characters that appear in text---like +@code{single-key-description}, except that control characters are +represented with a leading caret (which is how control characters in +Emacs buffers are usually displayed). Another difference is that +@code{text-char-description} recognizes the 2**7 bit as the Meta +character, whereas @code{single-key-description} uses the 2**27 bit +for Meta. + +@smallexample +@group +(text-char-description ?\C-c) + @result{} "^C" +@end group +@group +(text-char-description ?\M-m) + @result{} "\xed" +@end group +@group +(text-char-description ?\C-\M-m) + @result{} "\x8d" +@end group +@group +(text-char-description (+ 128 ?m)) + @result{} "M-m" +@end group +@group +(text-char-description (+ 128 ?\C-m)) + @result{} "M-^M" +@end group +@end smallexample +@end defun + +@defun read-kbd-macro string &optional need-vector +This function is used mainly for operating on keyboard macros, but it +can also be used as a rough inverse for @code{key-description}. You +call it with a string containing key descriptions, separated by spaces; +it returns a string or vector containing the corresponding events. +(This may or may not be a single valid key sequence, depending on what +events you use; @pxref{Key Sequences}.) If @var{need-vector} is +non-@code{nil}, the return value is always a vector. +@end defun + +@node Help Functions +@section Help Functions + + Emacs provides a variety of on-line help functions, all accessible to +the user as subcommands of the prefix @kbd{C-h}. For more information +about them, see @ref{Help, , Help, emacs, The GNU Emacs Manual}. Here +we describe some program-level interfaces to the same information. + +@deffn Command apropos pattern &optional do-all +This function finds all ``meaningful'' symbols whose names contain a +match for the apropos pattern @var{pattern}. An apropos pattern is +either a word to match, a space-separated list of words of which at +least two must match, or a regular expression (if any special regular +expression characters occur). A symbol is ``meaningful'' if it has a +definition as a function, variable, or face, or has properties. + +The function returns a list of elements that look like this: + +@example +(@var{symbol} @var{score} @var{fn-doc} @var{var-doc} + @var{plist-doc} @var{widget-doc} @var{face-doc} @var{group-doc}) +@end example + +Here, @var{score} is an integer measure of how important the symbol +seems to be as a match, and the remaining elements are documentation +strings for @var{symbol}'s various roles (or @code{nil}). + +It also displays the symbols in a buffer named @samp{*Apropos*}, each +with a one-line description taken from the beginning of its +documentation string. + +@c Emacs 19 feature +If @var{do-all} is non-@code{nil}, or if the user option +@code{apropos-do-all} is non-@code{nil}, then @code{apropos} also +shows key bindings for the functions that are found; it also shows +@emph{all} interned symbols, not just meaningful ones (and it lists +them in the return value as well). +@end deffn + +@defvar help-map +The value of this variable is a local keymap for characters following the +Help key, @kbd{C-h}. +@end defvar + +@deffn {Prefix Command} help-command +This symbol is not a function; its function definition cell holds the +keymap known as @code{help-map}. It is defined in @file{help.el} as +follows: + +@smallexample +@group +(define-key global-map (char-to-string help-char) 'help-command) +(fset 'help-command help-map) +@end group +@end smallexample +@end deffn + +@defun print-help-return-message &optional function +This function builds a string that explains how to restore the previous +state of the windows after a help command. After building the message, +it applies @var{function} to it if @var{function} is non-@code{nil}. +Otherwise it calls @code{message} to display it in the echo area. + +This function expects to be called inside a +@code{with-output-to-temp-buffer} special form, and expects +@code{standard-output} to have the value bound by that special form. +For an example of its use, see the long example in @ref{Accessing +Documentation}. +@end defun + +@defvar help-char +The value of this variable is the help character---the character that +Emacs recognizes as meaning Help. By default, its value is 8, which +stands for @kbd{C-h}. When Emacs reads this character, if +@code{help-form} is a non-@code{nil} Lisp expression, it evaluates that +expression, and displays the result in a window if it is a string. + +Usually the value of @code{help-form} is @code{nil}. Then the +help character has no special meaning at the level of command input, and +it becomes part of a key sequence in the normal way. The standard key +binding of @kbd{C-h} is a prefix key for several general-purpose help +features. + +The help character is special after prefix keys, too. If it has no +binding as a subcommand of the prefix key, it runs +@code{describe-prefix-bindings}, which displays a list of all the +subcommands of the prefix key. +@end defvar + +@defvar help-event-list +The value of this variable is a list of event types that serve as +alternative ``help characters.'' These events are handled just like the +event specified by @code{help-char}. +@end defvar + +@defvar help-form +If this variable is non-@code{nil}, its value is a form to evaluate +whenever the character @code{help-char} is read. If evaluating the form +produces a string, that string is displayed. + +A command that calls @code{read-event} or @code{read-char} probably +should bind @code{help-form} to a non-@code{nil} expression while it +does input. (The time when you should not do this is when @kbd{C-h} has +some other meaning.) Evaluating this expression should result in a +string that explains what the input is for and how to enter it properly. + +Entry to the minibuffer binds this variable to the value of +@code{minibuffer-help-form} (@pxref{Definition of minibuffer-help-form}). +@end defvar + +@defvar prefix-help-command +This variable holds a function to print help for a prefix key. The +function is called when the user types a prefix key followed by the help +character, and the help character has no binding after that prefix. The +variable's default value is @code{describe-prefix-bindings}. +@end defvar + +@defun describe-prefix-bindings +This function calls @code{describe-bindings} to display a list of all +the subcommands of the prefix key of the most recent key sequence. The +prefix described consists of all but the last event of that key +sequence. (The last event is, presumably, the help character.) +@end defun + + The following two functions are meant for modes that want to provide +help without relinquishing control, such as the ``electric'' modes. +Their names begin with @samp{Helper} to distinguish them from the +ordinary help functions. + +@deffn 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 @code{describe-bindings}. +@end deffn + +@deffn Command Helper-help +This command provides help for the current mode. It prompts the user +in the minibuffer with the message @samp{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 @code{nil}. + +This can be customized by changing the map @code{Helper-help-map}. +@end deffn + +@c Emacs 19 feature +@defvar data-directory +@anchor{Definition of data-directory} +This variable holds the name of the directory in which Emacs finds +certain documentation and text files that come with Emacs. In older +Emacs versions, @code{exec-directory} was used for this. +@end defvar + +@c Emacs 19 feature +@defmac make-help-screen fname help-line help-text help-map +This macro defines a help command named @var{fname} that acts like a +prefix key that shows a list of the subcommands it offers. + +When invoked, @var{fname} displays @var{help-text} in a window, then +reads and executes a key sequence according to @var{help-map}. The +string @var{help-text} should describe the bindings available in +@var{help-map}. + +The command @var{fname} is defined to handle a few events itself, by +scrolling the display of @var{help-text}. When @var{fname} reads one of +those special events, it does the scrolling and then reads another +event. When it reads an event that is not one of those few, and which +has a binding in @var{help-map}, it executes that key's binding and +then returns. + +The argument @var{help-line} should be a single-line summary of the +alternatives in @var{help-map}. In the current version of Emacs, this +argument is used only if you set the option @code{three-step-help} to +@code{t}. + +This macro is used in the command @code{help-for-help} which is the +binding of @kbd{C-h C-h}. +@end defmac + +@defopt three-step-help +If this variable is non-@code{nil}, commands defined with +@code{make-help-screen} display their @var{help-line} strings in the +echo area at first, and display the longer @var{help-text} strings only +if the user types the help character again. +@end defopt + +@ignore + arch-tag: ba36b4c2-e60f-49e2-bc25-61158fdcd815 +@end ignore diff --git a/doc/lispref/hooks.texi b/doc/lispref/hooks.texi new file mode 100644 index 00000000000..572d3b79d93 --- /dev/null +++ b/doc/lispref/hooks.texi @@ -0,0 +1,338 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1998, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/hooks +@node Standard Hooks, Index, Standard Keymaps, Top +@appendix Standard Hooks +@cindex standard hooks +@cindex hook variables, list of + +The following is a list of hook variables that let you provide +functions to be called from within Emacs on suitable occasions. + +Most of these variables have names ending with @samp{-hook}. They are +@dfn{normal hooks}, run by means of @code{run-hooks}. The value of such +a hook is a list of functions; the functions are called with no +arguments and their values are completely ignored. The recommended way +to put a new function on such a hook is to call @code{add-hook}. +@xref{Hooks}, for more information about using hooks. + +Every major mode defines a mode hook named +@samp{@var{modename}-mode-hook}. The major mode command runs this +normal hook with @code{run-mode-hooks} as the very last thing it does. +@xref{Mode Hooks}. Most minor modes have mode hooks too. Mode hooks +are omitted in the list below. + +The variables whose names end in @samp{-hooks} or @samp{-functions} are +usually @dfn{abnormal hooks}; their values are lists of functions, but +these functions are called in a special way (they are passed arguments, +or their values are used). The variables whose names end in +@samp{-function} have single functions as their values. + +@c We need to xref to where each hook is documented or else document +@c it here. + +@table @code +@item activate-mark-hook +@xref{The Mark}. + +@item after-change-functions +@xref{Change Hooks}. + +@item after-change-major-mode-hook +@xref{Mode Hooks}. + +@item after-init-hook +@xref{Init File}. + +@item after-insert-file-functions +@xref{Format Conversion}. + +@item after-make-frame-functions +@xref{Creating Frames}. + +@item after-revert-hook +@xref{Reverting}. + +@item after-save-hook +@xref{Saving Buffers}. + +@item auto-fill-function +@xref{Auto Filling}. + +@item auto-save-hook +@xref{Auto-Saving}. + +@item before-change-functions +@xref{Change Hooks}. + +@item before-init-hook +@xref{Init File}. + +@item before-make-frame-hook +@xref{Creating Frames}. + +@item before-revert-hook +@xref{Reverting}. + +@item before-save-hook +@xref{Saving Buffers}. + +@item blink-paren-function +@xref{Blinking}. + +@item buffer-access-fontify-functions +@xref{Lazy Properties}. + +@item calendar-load-hook +@iftex +@inforef{Calendar Customizing,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Calendar Customizing,,, emacs}. +@end ifnottex + + +@item change-major-mode-hook +@xref{Creating Buffer-Local}. + +@item command-line-functions +@xref{Command-Line Arguments}. + +@item comment-indent-function +@xref{Options for Comments,, Options Controlling Comments, emacs, the +GNU Emacs Manual}. + +@item compilation-finish-functions +Functions to call when a compilation process finishes. + +@item custom-define-hook +Hook called after defining each customize option. + +@item deactivate-mark-hook +@xref{The Mark}. + +@item desktop-after-read-hook +Normal hook run after a successful @code{desktop-read}. May be used +to show a buffer list. @xref{Saving Emacs Sessions,, Saving Emacs +Sessions, emacs, the GNU Emacs Manual}. + +@item desktop-no-desktop-file-hook +Normal hook run when @code{desktop-read} can't find a desktop file. +May be used to show a dired buffer. @xref{Saving Emacs Sessions,, +Saving Emacs Sessions, emacs, the GNU Emacs Manual}. + +@item desktop-save-hook +Normal hook run before the desktop is saved in a desktop file. This +is useful for truncating history lists, for example. @xref{Saving +Emacs Sessions,, Saving Emacs Sessions, emacs, the GNU Emacs Manual}. + +@item diary-display-hook +@iftex +@inforef{Fancy Diary Display,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Fancy Diary Display,,, emacs}. +@end ifnottex + +@item diary-hook +List of functions called after the display of the diary. Can be used +for appointment notification. + +@item disabled-command-function +@xref{Disabling Commands}. + +@item echo-area-clear-hook +@xref{Echo Area Customization}. + +@item emacs-startup-hook +@xref{Init File}. + +@item find-file-hook +@xref{Visiting Functions}. + +@item find-file-not-found-functions +@xref{Visiting Functions}. + +@item first-change-hook +@xref{Change Hooks}. + +@item font-lock-beginning-of-syntax-function +@xref{Syntactic Font Lock}. + +@item font-lock-fontify-buffer-function +@xref{Other Font Lock Variables}. + +@item font-lock-fontify-region-function +@xref{Other Font Lock Variables}. + +@item font-lock-mark-block-function +@xref{Other Font Lock Variables}. + +@item font-lock-syntactic-face-function +@xref{Syntactic Font Lock}. + +@item font-lock-unfontify-buffer-function +@xref{Other Font Lock Variables}. + +@item font-lock-unfontify-region-function +@xref{Other Font Lock Variables}. + +@item initial-calendar-window-hook +@iftex +@inforef{Calendar Customizing,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Calendar Customizing,,, emacs}. +@end ifnottex + +@item kbd-macro-termination-hook +@xref{Keyboard Macros}. + +@item kill-buffer-hook +@xref{Killing Buffers}. + +@item kill-buffer-query-functions +@xref{Killing Buffers}. + +@item kill-emacs-hook +@xref{Killing Emacs}. + +@item kill-emacs-query-functions +@xref{Killing Emacs}. + +@item lisp-indent-function + +@item list-diary-entries-hook +@iftex +@inforef{Fancy Diary Display,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Fancy Diary Display,,, emacs}. +@end ifnottex + +@item mail-setup-hook +@xref{Mail Mode Misc,, Mail Mode Miscellany, emacs, the GNU Emacs +Manual}. + +@item mark-diary-entries-hook +@iftex +@inforef{Fancy Diary Display,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Fancy Diary Display,,, emacs}. +@end ifnottex + +@item menu-bar-update-hook +@xref{Menu Bar}. + +@item minibuffer-setup-hook +@xref{Minibuffer Misc}. + +@item minibuffer-exit-hook +@xref{Minibuffer Misc}. + +@item mouse-position-function +@xref{Mouse Position}. + +@item nongregorian-diary-listing-hook +@iftex +@inforef{Hebrew/Islamic Entries,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Hebrew/Islamic Entries,,, emacs}. +@end ifnottex + +@item nongregorian-diary-marking-hook +@iftex +@inforef{Hebrew/Islamic Entries,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Hebrew/Islamic Entries,,, emacs}. +@end ifnottex + +@item occur-hook + +@item post-command-hook +@xref{Command Overview}. + +@item pre-abbrev-expand-hook +@xref{Abbrev Expansion}. + +@item pre-command-hook +@xref{Command Overview}. + +@item print-diary-entries-hook +@iftex +@inforef{Diary Customizing,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Diary Customizing,,, emacs}. +@end ifnottex + +@item redisplay-end-trigger-functions +@xref{Window Hooks}. + +@item scheme-indent-function + +@item suspend-hook +@xref{Suspending Emacs}. + +@item suspend-resume-hook +@xref{Suspending Emacs}. + +@item temp-buffer-setup-hook +@xref{Temporary Displays}. + +@item temp-buffer-show-function +@xref{Temporary Displays}. + +@item temp-buffer-show-hook +@xref{Temporary Displays}. + +@item term-setup-hook +@xref{Terminal-Specific}. + +@item today-visible-calendar-hook +@iftex +@inforef{Calendar Customizing,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Calendar Customizing,,, emacs}. +@end ifnottex + +@item today-invisible-calendar-hook +@iftex +@inforef{Calendar Customizing,, emacs-xtra}. +@end iftex +@ifnottex +@xref{Calendar Customizing,,, emacs}. +@end ifnottex + +@item window-configuration-change-hook +@xref{Window Hooks}. + +@item window-scroll-functions +@xref{Window Hooks}. + +@item window-setup-hook +@xref{Window Systems}. + +@item window-size-change-functions +@xref{Window Hooks}. + +@item write-contents-functions +@xref{Saving Buffers}. + +@item write-file-functions +@xref{Saving Buffers}. + +@item write-region-annotate-functions +@xref{Format Conversion}. +@end table + +@ignore + arch-tag: 55fd0296-d906-4551-b300-979d3846aa88 +@end ignore diff --git a/doc/lispref/index.texi b/doc/lispref/index.texi new file mode 100644 index 00000000000..cfa8f25e126 --- /dev/null +++ b/doc/lispref/index.texi @@ -0,0 +1,29 @@ +@c -*-texinfo-*- +@setfilename ../info/index + +@c Indexing guidelines + +@c I assume that all indexes will be combined. +@c Therefore, if a generated findex and permutations +@c cover the ways an index user would look up the entry, +@c then no cindex is added. +@c Concept index (cindex) entries will also be permuted. Therefore, they +@c have no commas and few irrelevant connectives in them. + +@c I tried to include words in a cindex that give the context of the entry, +@c particularly if there is more than one entry for the same concept. +@c For example, "nil in keymap" +@c Similarly for explicit findex and vindex entries, e.g. "print example". + +@c Error codes are given cindex entries, e.g. "end-of-file error". + +@c pindex is used for .el files and Unix programs + +@node Index, , Standard Hooks, Top +@unnumbered Index + +@c Print the indices + +@printindex fn + + diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi new file mode 100644 index 00000000000..3cd42ed69ff --- /dev/null +++ b/doc/lispref/internals.texi @@ -0,0 +1,1522 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1998, 1999, 2001, 2002, 2003, +@c 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/internals +@node GNU Emacs Internals, Standard Errors, Tips, Top +@comment node-name, next, previous, up +@appendix 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. + +@menu +* Building Emacs:: How the dumped Emacs is made. +* Pure Storage:: A kludge to make preloaded Lisp functions sharable. +* Garbage Collection:: Reclaiming space for Lisp objects no longer used. +* Memory Usage:: Info about total size of Lisp objects made so far. +* Writing Emacs Primitives:: Writing C code for Emacs. +* Object Internals:: Data formats of buffers, windows, processes. +@end menu + +@node Building Emacs +@appendixsec Building Emacs +@cindex building Emacs +@pindex temacs + + This section explains the steps involved in building the Emacs +executable. You don't have to know this material to build and install +Emacs, since the makefiles do all these things automatically. This +information is pertinent to Emacs maintenance. + + Compilation of the C source files in the @file{src} directory +produces an executable file called @file{temacs}, also called a +@dfn{bare impure Emacs}. It contains the Emacs Lisp interpreter and I/O +routines, but not the editing commands. + +@cindex @file{loadup.el} + The command @w{@samp{temacs -l loadup}} uses @file{temacs} to create +the real runnable Emacs executable. These arguments direct +@file{temacs} to evaluate the Lisp files specified in the file +@file{loadup.el}. These files set up the normal Emacs editing +environment, resulting in an Emacs that is still impure but no longer +bare. + +@cindex dumping Emacs + It takes a substantial time to load the standard Lisp files. Luckily, +you don't have to do this each time you run Emacs; @file{temacs} can +dump out an executable program called @file{emacs} that has these files +preloaded. @file{emacs} starts more quickly because it does not need to +load the files. This is the Emacs executable that is normally +installed. + + To create @file{emacs}, use the command @samp{temacs -batch -l loadup +dump}. The purpose of @samp{-batch} here is to prevent @file{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. +The argument @samp{dump} tells @file{loadup.el} to dump a new executable +named @file{emacs}. + + Some operating systems don't support dumping. On those systems, you +must start Emacs with the @samp{temacs -l loadup} command each time you +use it. This takes a substantial time, but since you need to start +Emacs once a day at most---or once a week if you never log out---the +extra time is not too severe a problem. + +@cindex @file{site-load.el} + + You can specify additional files to preload by writing a library named +@file{site-load.el} that loads them. You may need to add a definition + +@example +#define SITELOAD_PURESIZE_EXTRA @var{n} +@end example + +@noindent +to make @var{n} added bytes of pure space to hold the additional files. +(Try adding increments of 20000 until it is big enough.) However, the +advantage of preloading additional files decreases as machines get +faster. On modern machines, it is usually not advisable. + + After @file{loadup.el} reads @file{site-load.el}, it finds the +documentation strings for primitive and preloaded functions (and +variables) in the file @file{etc/DOC} where they are stored, by +calling @code{Snarf-documentation} (@pxref{Definition of +Snarf-documentation,, Accessing Documentation}). + +@cindex @file{site-init.el} +@cindex preloading additional functions and variables + You can specify other Lisp expressions to execute just before dumping +by putting them in a library named @file{site-init.el}. This file is +executed after the documentation strings are found. + + If you want to preload function or variable definitions, there are +three ways you can do this and make their documentation strings +accessible when you subsequently run Emacs: + +@itemize @bullet +@item +Arrange to scan these files when producing the @file{etc/DOC} file, +and load them with @file{site-load.el}. + +@item +Load the files with @file{site-init.el}, then copy the files into the +installation directory for Lisp files when you install Emacs. + +@item +Specify a non-@code{nil} value for +@code{byte-compile-dynamic-docstrings} as a local variable in each of these +files, and load them with either @file{site-load.el} or +@file{site-init.el}. (This method has the drawback that the +documentation strings take up space in Emacs all the time.) +@end itemize + + It is not advisable to put anything in @file{site-load.el} or +@file{site-init.el} that would alter any of the features that users +expect in an ordinary unmodified Emacs. If you feel you must override +normal features for your site, do it with @file{default.el}, so that +users can override your changes if they wish. @xref{Startup Summary}. + + In a package that can be preloaded, it is sometimes useful to +specify a computation to be done when Emacs subsequently starts up. +For this, use @code{eval-at-startup}: + +@defmac eval-at-startup body@dots{} +This evaluates the @var{body} forms, either immediately if running in +an Emacs that has already started up, or later when Emacs does start +up. Since the value of the @var{body} forms is not necessarily +available when the @code{eval-at-startup} form is run, that form +always returns @code{nil}. +@end defmac + +@defun dump-emacs to-file from-file +@cindex unexec +This function dumps the current state of Emacs into an executable file +@var{to-file}. It takes symbols from @var{from-file} (this is normally +the executable file @file{temacs}). + +If you want to use this function in an Emacs that was already dumped, +you must run Emacs with @samp{-batch}. +@end defun + +@node Pure Storage +@appendixsec Pure Storage +@cindex pure storage + + Emacs Lisp uses two kinds of storage for user-created Lisp objects: +@dfn{normal storage} and @dfn{pure storage}. Normal storage is where +all the new data created during an Emacs session are 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 @file{temacs} is loading the +standard preloaded Lisp libraries. In the file @file{emacs}, it is +marked as read-only (on operating systems that 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, @file{temacs} allocates dynamic memory for +the part that didn't fit. If that happens, you should increase the +compilation parameter @code{PURESIZE} in the file +@file{src/puresize.h} and rebuild Emacs, even though the resulting +image will work: garbage collection is disabled in this situation, +causing a memory leak. Such an overflow normally won't happen unless you +try to preload additional libraries or add features to the standard +ones. Emacs will display a warning about the overflow when it +starts. + +@defun purecopy object +This function makes a copy in pure storage of @var{object}, and returns +it. It copies a string by simply making a new string with the same +characters, but without text properties, in pure storage. It +recursively copies the contents of vectors and cons cells. It does +not make copies of other objects such as symbols, but just returns +them unchanged. It signals an error if asked to copy markers. + +This function is a no-op except while Emacs is being built and dumped; +it is usually called only in the file @file{emacs/lisp/loaddefs.el}, but +a few packages call it just in case you decide to preload them. +@end defun + +@defvar 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. +@end defvar + +@defvar purify-flag +This variable determines whether @code{defun} should make a copy of the +function definition in pure storage. If it is non-@code{nil}, then the +function definition is copied into pure storage. + +This flag is @code{t} while loading all of the basic functions for +building Emacs initially (allowing those functions to be sharable and +non-collectible). Dumping Emacs as an executable always writes +@code{nil} in this variable, regardless of the value it actually has +before and after dumping. + +You should not change this flag in a running Emacs. +@end defvar + +@node Garbage Collection +@appendixsec Garbage Collection +@cindex garbage collection + +@cindex memory allocation + When a program creates a list or the user defines a new function (such +as by loading a library), 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, long strings, +buffers and certain other editing types, which are fairly large, are +allocated in individual blocks, one per object, while small 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 @dfn{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 finding and marking all Lisp objects +that are still accessible to Lisp programs. To begin with, it assumes +all the symbols, their values and associated function definitions, and +any data presently on the stack, are accessible. Any objects that can +be reached indirectly through other accessible objects are also +accessible. + + When marking is finished, all objects still unmarked 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 miss them. The second +(``sweep'') phase of the garbage collector arranges to reuse them. + +@c ??? Maybe add something describing weak hash tables here? + +@cindex free list + The sweep phase puts unused cons cells onto a @dfn{free list} +for future allocation; likewise for symbols and markers. It compacts +the accessible strings so they occupy fewer 8k blocks; then it frees the +other 8k blocks. Vectors, buffers, windows, and other large objects are +individually allocated and freed using @code{malloc} and @code{free}. + +@cindex CL note---allocate more storage +@quotation +@b{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 @code{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). +@end quotation + +@deffn 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 @code{gc-cons-threshold} bytes of +Lisp data since the previous garbage collection.) + +@code{garbage-collect} returns a list containing the following +information: + +@example +@group +((@var{used-conses} . @var{free-conses}) + (@var{used-syms} . @var{free-syms}) +@end group + (@var{used-miscs} . @var{free-miscs}) + @var{used-string-chars} + @var{used-vector-slots} + (@var{used-floats} . @var{free-floats}) + (@var{used-intervals} . @var{free-intervals}) + (@var{used-strings} . @var{free-strings})) +@end example + +Here is an example: + +@example +@group +(garbage-collect) + @result{} ((106886 . 13184) (9769 . 0) + (7731 . 4651) 347543 121628 + (31 . 94) (1273 . 168) + (25474 . 3569)) +@end group +@end example + +Here is a table explaining each element: + +@table @var +@item used-conses +The number of cons cells in use. + +@item free-conses +The number of cons cells for which space has been obtained from the +operating system, but that are not currently being used. + +@item used-syms +The number of symbols in use. + +@item free-syms +The number of symbols for which space has been obtained from the +operating system, but that are not currently being used. + +@item used-miscs +The number of miscellaneous objects in use. These include markers and +overlays, plus certain objects not visible to users. + +@item free-miscs +The number of miscellaneous objects for which space has been obtained +from the operating system, but that are not currently being used. + +@item used-string-chars +The total size of all strings, in characters. + +@item used-vector-slots +The total number of elements of existing vectors. + +@item used-floats +@c Emacs 19 feature +The number of floats in use. + +@item free-floats +@c Emacs 19 feature +The number of floats for which space has been obtained from the +operating system, but that are not currently being used. + +@item used-intervals +The number of intervals in use. Intervals are an internal +data structure used for representing text properties. + +@item free-intervals +The number of intervals for which space has been obtained +from the operating system, but that are not currently being used. + +@item used-strings +The number of strings in use. + +@item free-strings +The number of string headers for which the space was obtained from the +operating system, but which are currently not in use. (A string +object consists of a header and the storage for the string text +itself; the latter is only allocated when the string is created.) +@end table + +If there was overflow in pure space (see the previous section), +@code{garbage-collect} returns @code{nil}, because a real garbage +collection can not be done in this situation. +@end deffn + +@defopt garbage-collection-messages +If this variable is non-@code{nil}, Emacs displays a message at the +beginning and end of garbage collection. The default value is +@code{nil}, meaning there are no such messages. +@end defopt + +@defvar post-gc-hook +This is a normal hook that is run at the end of garbage collection. +Garbage collection is inhibited while the hook functions run, so be +careful writing them. +@end defvar + +@defopt 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 +trigger 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 subsequent 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 400,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 that 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 +@code{garbage-collect} will set the threshold back to 10,000. +@end defopt + +@defopt gc-cons-percentage +The value of this variable specifies the amount of consing before a +garbage collection occurs, as a fraction of the current heap size. +This criterion and @code{gc-cons-threshold} apply in parallel, and +garbage collection occurs only when both criteria are satisfied. + +As the heap size increases, the time to perform a garbage collection +increases. Thus, it can be desirable to do them less frequently in +proportion. +@end defopt + + The value returned by @code{garbage-collect} describes the amount of +memory used by Lisp data, broken down by data type. By contrast, the +function @code{memory-limit} provides information on the total amount of +memory Emacs is currently using. + +@c Emacs 19 feature +@defun memory-limit +This function returns the address of the last byte Emacs has allocated, +divided by 1024. We divide the value by 1024 to make sure it fits in a +Lisp integer. + +You can use this to get a general idea of how your actions affect the +memory usage. +@end defun + +@defvar memory-full +This variable is @code{t} if Emacs is close to out of memory for Lisp +objects, and @code{nil} otherwise. +@end defvar + +@defun memory-use-counts +This returns a list of numbers that count the number of objects +created in this Emacs session. Each of these counters increments for +a certain kind of object. See the documentation string for details. +@end defun + +@defvar gcs-done +This variable contains the total number of garbage collections +done so far in this Emacs session. +@end defvar + +@defvar gc-elapsed +This variable contains the total number of seconds of elapsed time +during garbage collection so far in this Emacs session, as a floating +point number. +@end defvar + +@node Memory Usage +@section Memory Usage +@cindex memory usage + + These functions and variables give information about the total amount +of memory allocation that Emacs has done, broken down by data type. +Note the difference between these and the values returned by +@code{(garbage-collect)}; those count objects that currently exist, but +these count the number or size of all allocations, including those for +objects that have since been freed. + +@defvar cons-cells-consed +The total number of cons cells that have been allocated so far +in this Emacs session. +@end defvar + +@defvar floats-consed +The total number of floats that have been allocated so far +in this Emacs session. +@end defvar + +@defvar vector-cells-consed +The total number of vector cells that have been allocated so far +in this Emacs session. +@end defvar + +@defvar symbols-consed +The total number of symbols that have been allocated so far +in this Emacs session. +@end defvar + +@defvar string-chars-consed +The total number of string characters that have been allocated so far +in this Emacs session. +@end defvar + +@defvar misc-objects-consed +The total number of miscellaneous objects that have been allocated so +far in this Emacs session. These include markers and overlays, plus +certain objects not visible to users. +@end defvar + +@defvar intervals-consed +The total number of intervals that have been allocated so far +in this Emacs session. +@end defvar + +@defvar strings-consed +The total number of strings that have been allocated so far in this +Emacs session. +@end defvar + +@node Writing Emacs Primitives +@appendixsec Writing Emacs Primitives +@cindex primitive function internals +@cindex 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 @code{or}, from +@file{eval.c}. (An ordinary function would have the same general +appearance.) + +@cindex garbage collection protection +@smallexample +@group +DEFUN ("or", For, Sor, 0, UNEVALLED, 0, + doc: /* Eval args until one of them yields non-nil, then return that +value. The remaining args are not evalled at all. +If all args return nil, return nil. +@end group +@group +usage: (or CONDITIONS ...) */) + (args) + Lisp_Object args; +@{ + register Lisp_Object val = Qnil; + struct gcpro gcpro1; +@end group + +@group + GCPRO1 (args); +@end group + +@group + while (CONSP (args)) + @{ + val = Feval (XCAR (args)); + if (!NILP (val)) + break; + args = XCDR (args); + @} +@end group + +@group + UNGCPRO; + return val; +@} +@end group +@end smallexample + +@cindex @code{DEFUN}, C macro to define Lisp primitives + Let's start with a precise explanation of the arguments to the +@code{DEFUN} macro. Here is a template for them: + +@example +DEFUN (@var{lname}, @var{fname}, @var{sname}, @var{min}, @var{max}, @var{interactive}, @var{doc}) +@end example + +@table @var +@item lname +This is the name of the Lisp symbol to define as the function name; in +the example above, it is @code{or}. + +@item fname +This 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, @samp{F} prepended to the Lisp name, with all dashes +(@samp{-}) in the Lisp name changed to underscores. Thus, to call this +function from C code, call @code{For}. Remember that the arguments must +be of type @code{Lisp_Object}; various macros and functions for creating +values of type @code{Lisp_Object} are declared in the file +@file{lisp.h}. + +@item sname +This 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 always @var{fname} with @samp{F} replaced with +@samp{S}. + +@item min +This is the minimum number of arguments that the function requires. The +function @code{or} allows a minimum of zero arguments. + +@item max +This is the maximum number of arguments that the function accepts, if +there is a fixed maximum. Alternatively, it can be @code{UNEVALLED}, +indicating a special form that receives unevaluated arguments, or +@code{MANY}, indicating an unlimited number of evaluated arguments (the +equivalent of @code{&rest}). Both @code{UNEVALLED} and @code{MANY} are +macros. If @var{max} is a number, it may not be less than @var{min} and +it may not be greater than eight. + +@item interactive +This is an interactive specification, a string such as might be used as +the argument of @code{interactive} in a Lisp function. In the case of +@code{or}, it is 0 (a null pointer), indicating that @code{or} cannot be +called interactively. A value of @code{""} indicates a function that +should receive no arguments when called interactively. + +@item doc +This is the documentation string. It uses C comment syntax rather +than C string syntax because comment syntax requires nothing special +to include multiple lines. The @samp{doc:} identifies the comment +that follows as the documentation string. The @samp{/*} and @samp{*/} +delimiters that begin and end the comment are not part of the +documentation string. + +If the last line of the documentation string begins with the keyword +@samp{usage:}, the rest of the line is treated as the argument list +for documentation purposes. This way, you can use different argument +names in the documentation string from the ones used in the C code. +@samp{usage:} is required if the function has an unlimited number of +arguments. + +All the usual rules for documentation strings in Lisp code +(@pxref{Documentation Tips}) apply to C code documentation strings +too. +@end table + + After the call to the @code{DEFUN} macro, you must write the argument +name list that every C function must have, followed by ordinary C +declarations for the arguments. For a function with a fixed maximum +number of arguments, declare a C argument for each Lisp argument, and +give them all type @code{Lisp_Object}. When a Lisp function has no +upper limit on the number of arguments, its implementation in C actually +receives exactly two arguments: the first is the number of Lisp +arguments, and the second is the address of a block containing their +values. They have types @code{int} and @w{@code{Lisp_Object *}}. + +@cindex @code{GCPRO} and @code{UNGCPRO} +@cindex protect C variables from garbage collection + Within the function @code{For} itself, note the use of the macros +@code{GCPRO1} and @code{UNGCPRO}. @code{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. GC protection is necessary whenever you call +@code{Feval} or anything that can directly or indirectly call +@code{Feval}. At such a time, any Lisp object that this function may +refer to again must be protected somehow. + + It suffices to ensure that at least one pointer to each object is +GC-protected; that way, the object cannot be recycled, so all pointers +to it remain valid. Thus, a particular local variable can do without +protection if it is certain that the object it points to will be +preserved by some other pointer (such as another local variable which +has a @code{GCPRO})@footnote{Formerly, strings were a special +exception; in older Emacs versions, every local variable that might +point to a string needed a @code{GCPRO}.}. Otherwise, the local +variable needs a @code{GCPRO}. + + The macro @code{GCPRO1} protects just one local variable. If you +want to protect two variables, use @code{GCPRO2} instead; repeating +@code{GCPRO1} will not work. Macros @code{GCPRO3}, @code{GCPRO4}, +@code{GCPRO5}, and @code{GCPRO6} also exist. All these macros +implicitly use local variables such as @code{gcpro1}; you must declare +these explicitly, with type @code{struct gcpro}. Thus, if you use +@code{GCPRO2}, you must declare @code{gcpro1} and @code{gcpro2}. +Alas, we can't explain all the tricky details here. + + @code{UNGCPRO} cancels the protection of the variables that are +protected in the current function. It is necessary to do this +explicitly. + + Built-in functions that take a variable number of arguments actually +accept two arguments at the C level: the number of Lisp arguments, and +a @code{Lisp_Object *} pointer to a C vector containing those Lisp +arguments. This C vector may be part of a Lisp vector, but it need +not be. The responsibility for using @code{GCPRO} to protect the Lisp +arguments from GC if necessary rests with the caller in this case, +since the caller allocated or found the storage for them. + + You must not use C initializers for static or global variables unless +the variables are never written once Emacs is dumped. These variables +with initializers are allocated in an area of memory that becomes +read-only (on certain operating systems) as a result of dumping Emacs. +@xref{Pure Storage}. + + Do not use static variables within functions---place all static +variables at top level in the file. This is necessary because Emacs on +some operating systems defines the keyword @code{static} as a null +macro. (This definition is used because those systems put all variables +declared static in a place that becomes read-only after dumping, whether +they have initializers or not.) + +@cindex @code{defsubr}, Lisp symbol for a primitive + Defining the C function is not enough to make a Lisp primitive +available; you must also create the Lisp symbol for the primitive and +store a suitable subr object in its function cell. The code looks like +this: + +@example +defsubr (&@var{subr-structure-name}); +@end example + +@noindent +Here @var{subr-structure-name} is the name you used as the third +argument to @code{DEFUN}. + + If you add a new primitive to a file that already has Lisp primitives +defined in it, find the function (near the end of the file) named +@code{syms_of_@var{something}}, and add the call to @code{defsubr} +there. If the file doesn't have this function, or if you create a new +file, add to it a @code{syms_of_@var{filename}} (e.g., +@code{syms_of_myfile}). Then find the spot in @file{emacs.c} where all +of these functions are called, and add a call to +@code{syms_of_@var{filename}} there. + +@anchor{Defining Lisp variables in C} +@vindex byte-boolean-vars +@cindex defining Lisp variables in C +@cindex @code{DEFVAR_INT}, @code{DEFVAR_LISP}, @code{DEFVAR_BOOL} + The function @code{syms_of_@var{filename}} is also the place to define +any C variables that are to be visible as Lisp variables. +@code{DEFVAR_LISP} makes a C variable of type @code{Lisp_Object} visible +in Lisp. @code{DEFVAR_INT} makes a C variable of type @code{int} +visible in Lisp with a value that is always an integer. +@code{DEFVAR_BOOL} makes a C variable of type @code{int} visible in Lisp +with a value that is either @code{t} or @code{nil}. Note that variables +defined with @code{DEFVAR_BOOL} are automatically added to the list +@code{byte-boolean-vars} used by the byte compiler. + +@cindex @code{staticpro}, protection from GC + If you define a file-scope C variable of type @code{Lisp_Object}, +you must protect it from garbage-collection by calling @code{staticpro} +in @code{syms_of_@var{filename}}, like this: + +@example +staticpro (&@var{variable}); +@end example + + Here is another example function, with more complicated arguments. +This comes from the code in @file{window.c}, and it demonstrates the use +of macros and functions to manipulate Lisp objects. + +@smallexample +@group +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 COORDINATES is in WINDOW.\n\ +COORDINATES is a cons of the form (X . Y), X and Y being distances\n\ +... +@end group +@group +If they are on the border between WINDOW and its right sibling,\n\ + `vertical-line' is returned.") + (coordinates, window) + register Lisp_Object coordinates, window; +@{ + int x, y; +@end group + +@group + CHECK_LIVE_WINDOW (window, 0); + CHECK_CONS (coordinates, 1); + x = XINT (Fcar (coordinates)); + y = XINT (Fcdr (coordinates)); +@end group + +@group + switch (coordinates_in_window (XWINDOW (window), &x, &y)) + @{ + case 0: /* NOT in window at all. */ + return Qnil; +@end group + +@group + case 1: /* In text part of window. */ + return Fcons (make_number (x), make_number (y)); +@end group + +@group + case 2: /* In mode line of window. */ + return Qmode_line; +@end group + +@group + case 3: /* On right border of window. */ + return Qvertical_line; +@end group + +@group + default: + abort (); + @} +@} +@end group +@end smallexample + + Note that C code cannot call functions by name unless they are defined +in C. The way to call a function written in Lisp is to use +@code{Ffuncall}, which embodies the Lisp function @code{funcall}. Since +the Lisp function @code{funcall} accepts an unlimited number of +arguments, in C it takes two: the number of Lisp-level arguments, and a +one-dimensional array containing their values. The first Lisp-level +argument is the Lisp function to call, and the rest are the arguments to +pass to it. Since @code{Ffuncall} can call the evaluator, you must +protect pointers from garbage collection around the call to +@code{Ffuncall}. + + The C functions @code{call0}, @code{call1}, @code{call2}, and so on, +provide handy ways to call a Lisp function conveniently with a fixed +number of arguments. They work by calling @code{Ffuncall}. + + @file{eval.c} is a very good file to look through for examples; +@file{lisp.h} contains the definitions for some important macros and +functions. + + If you define a function which is side-effect free, update the code +in @file{byte-opt.el} which binds @code{side-effect-free-fns} and +@code{side-effect-and-error-free-fns} so that the compiler optimizer +knows about it. + +@node Object Internals +@appendixsec Object Internals +@cindex 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-nine bits are used to address the +object, and the remaining three bits are used for the tag that +identifies the object's type. + + Because Lisp objects are represented as tagged pointers, it is always +possible to determine the Lisp data type of any object. The C data type +@code{Lisp_Object} can hold any Lisp object of any data type. Ordinary +variables have type @code{Lisp_Object}, which means they can hold any +type of Lisp value; you can determine the actual data type only at run +time. The same is true for function arguments; if you want a function +to accept only a certain type of argument, you must check the type +explicitly using a suitable predicate (@pxref{Type Predicates}). +@cindex type checking internals + +@menu +* Buffer Internals:: Components of a buffer structure. +* Window Internals:: Components of a window structure. +* Process Internals:: Components of a process structure. +@end menu + +@node Buffer Internals +@appendixsubsec Buffer Internals +@cindex internals, of buffer +@cindex 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. + +Two structures are used to represent buffers in C. The +@code{buffer_text} structure contains fields describing the text of a +buffer; the @code{buffer} structure holds other fields. In the case +of indirect buffers, two or more @code{buffer} structures reference +the same @code{buffer_text} structure. + +Here is a list of the @code{struct buffer_text} fields: + +@table @code +@item beg +This field contains the actual address of the buffer contents. + +@item gpt +This holds the character position of the gap in the buffer. +@xref{Buffer Gap}. + +@item z +This field contains the character position of the end of the buffer +text. + +@item gpt_byte +Contains the byte position of the gap. + +@item z_byte +Holds the byte position of the end of the buffer text. + +@item gap_size +Contains the size of buffer's gap. @xref{Buffer Gap}. + +@item modiff +This field counts buffer-modification events for this buffer. It is +incremented for each such event, and never otherwise changed. + +@item save_modiff +Contains the previous value of @code{modiff}, as of the last time a +buffer was visited or saved in a file. + +@item overlay_modiff +Counts modifications to overlays analogous to @code{modiff}. + +@item beg_unchanged +Holds the number of characters at the start of the text that are known +to be unchanged since the last redisplay that finished. + +@item end_unchanged +Holds the number of characters at the end of the text that are known to +be unchanged since the last redisplay that finished. + +@item unchanged_modified +Contains the value of @code{modiff} at the time of the last redisplay +that finished. If this value matches @code{modiff}, +@code{beg_unchanged} and @code{end_unchanged} contain no useful +information. + +@item overlay_unchanged_modified +Contains the value of @code{overlay_modiff} at the time of the last +redisplay that finished. If this value matches @code{overlay_modiff}, +@code{beg_unchanged} and @code{end_unchanged} contain no useful +information. + +@item markers +The markers that refer to this buffer. This is actually a single +marker, and successive elements in its marker @code{chain} are the other +markers referring to this buffer text. + +@item intervals +Contains the interval tree which records the text properties of this +buffer. +@end table + +The fields of @code{struct buffer} are: + +@table @code +@item next +Points to the next buffer, in the chain of all buffers including killed +buffers. This chain is used only for garbage collection, in order to +collect killed buffers properly. Note that vectors, and most kinds of +objects allocated as vectors, are all on one chain, but buffers are on a +separate chain of their own. + +@item own_text +This is a @code{struct buffer_text} structure. In an ordinary buffer, +it holds the buffer contents. In indirect buffers, this field is not +used. + +@item text +This points to the @code{buffer_text} structure that is used for this +buffer. In an ordinary buffer, this is the @code{own_text} field above. +In an indirect buffer, this is the @code{own_text} field of the base +buffer. + +@item pt +Contains the character position of point in a buffer. + +@item pt_byte +Contains the byte position of point in a buffer. + +@item begv +This field contains the character position of the beginning of the +accessible range of text in the buffer. + +@item begv_byte +This field contains the byte position of the beginning of the +accessible range of text in the buffer. + +@item zv +This field contains the character position of the end of the +accessible range of text in the buffer. + +@item zv_byte +This field contains the byte position of the end of the +accessible range of text in the buffer. + +@item base_buffer +In an indirect buffer, this points to the base buffer. In an ordinary +buffer, it is null. + +@item local_var_flags +This field contains flags indicating that certain variables are local in +this buffer. Such variables are declared in the C code using +@code{DEFVAR_PER_BUFFER}, and their buffer-local bindings are stored in +fields in the buffer structure itself. (Some of these fields are +described in this table.) + +@item modtime +This field contains the modification time of the visited file. It is +set when the file is written or read. Before writing the buffer into a +file, this field is compared to the modification time of the file to see +if the file has changed on disk. @xref{Buffer Modification}. + +@item auto_save_modified +This field contains the time when the buffer was last auto-saved. + +@item auto_save_failure_time +The time at which we detected a failure to auto-save, or -1 if we didn't +have a failure. + +@item last_window_start +This field contains the @code{window-start} position in the buffer as of +the last time the buffer was displayed in a window. + +@item clip_changed +This flag is set when narrowing changes in a buffer. + +@item prevent_redisplay_optimizations_p +this flag indicates that redisplay optimizations should not be used +to display this buffer. + +@item undo_list +This field points to the buffer's undo list. @xref{Undo}. + +@item name +The buffer name is a string that names the buffer. It is guaranteed to +be unique. @xref{Buffer Names}. + +@item filename +The name of the file visited in this buffer, or @code{nil}. + +@item directory +The directory for expanding relative file names. + +@item save_length +Length of the file this buffer is visiting, when last read or saved. +This and other fields concerned with saving are not kept in the +@code{buffer_text} structure because indirect buffers are never saved. + +@item auto_save_file_name +File name used for auto-saving this buffer. This is not in the +@code{buffer_text} because it's not used in indirect buffers at all. + +@item read_only +Non-@code{nil} means this buffer is read-only. + +@item mark +This field contains the mark for the buffer. The mark is a marker, +hence it is also included on the list @code{markers}. @xref{The Mark}. + +@item local_var_alist +This field contains the association list describing the buffer-local +variable bindings of this buffer, not including the built-in +buffer-local bindings that have special slots in the buffer object. +(Those slots are omitted from this table.) @xref{Buffer-Local +Variables}. + +@item major_mode +Symbol naming the major mode of this buffer, e.g., @code{lisp-mode}. + +@item mode_name +Pretty name of major mode, e.g., @code{"Lisp"}. + +@item mode_line_format +Mode line element that controls the format of the mode line. If this +is @code{nil}, no mode line will be displayed. + +@item header_line_format +This field is analogous to @code{mode_line_format} for the mode +line displayed at the top of windows. + +@item keymap +This field holds the buffer's local keymap. @xref{Keymaps}. + +@item abbrev_table +This buffer's local abbrevs. + +@item syntax_table +This field contains the syntax table for the buffer. @xref{Syntax Tables}. + +@item category_table +This field contains the category table for the buffer. + +@item case_fold_search +The value of @code{case-fold-search} in this buffer. + +@item tab_width +The value of @code{tab-width} in this buffer. + +@item fill_column +The value of @code{fill-column} in this buffer. + +@item left_margin +The value of @code{left-margin} in this buffer. + +@item auto_fill_function +The value of @code{auto-fill-function} in this buffer. + +@item downcase_table +This field contains the conversion table for converting text to lower case. +@xref{Case Tables}. + +@item upcase_table +This field contains the conversion table for converting text to upper case. +@xref{Case Tables}. + +@item case_canon_table +This field contains the conversion table for canonicalizing text for +case-folding search. @xref{Case Tables}. + +@item case_eqv_table +This field contains the equivalence table for case-folding search. +@xref{Case Tables}. + +@item truncate_lines +The value of @code{truncate-lines} in this buffer. + +@item ctl_arrow +The value of @code{ctl-arrow} in this buffer. + +@item selective_display +The value of @code{selective-display} in this buffer. + +@item selective_display_ellipsis +The value of @code{selective-display-ellipsis} in this buffer. + +@item minor_modes +An alist of the minor modes of this buffer. + +@item overwrite_mode +The value of @code{overwrite_mode} in this buffer. + +@item abbrev_mode +The value of @code{abbrev-mode} in this buffer. + +@item display_table +This field contains the buffer's display table, or @code{nil} if it doesn't +have one. @xref{Display Tables}. + +@item save_modified +This field contains the time when the buffer was last saved, as an integer. +@xref{Buffer Modification}. + +@item mark_active +This field is non-@code{nil} if the buffer's mark is active. + +@item overlays_before +This field holds a list of the overlays in this buffer that end at or +before the current overlay center position. They are sorted in order of +decreasing end position. + +@item overlays_after +This field holds a list of the overlays in this buffer that end after +the current overlay center position. They are sorted in order of +increasing beginning position. + +@item overlay_center +This field holds the current overlay center position. @xref{Overlays}. + +@item enable_multibyte_characters +This field holds the buffer's local value of +@code{enable-multibyte-characters}---either @code{t} or @code{nil}. + +@item buffer_file_coding_system +The value of @code{buffer-file-coding-system} in this buffer. + +@item file_format +The value of @code{buffer-file-format} in this buffer. + +@item auto_save_file_format +The value of @code{buffer-auto-save-file-format} in this buffer. + +@item pt_marker +In an indirect buffer, or a buffer that is the base of an indirect +buffer, this holds a marker that records point for this buffer when the +buffer is not current. + +@item begv_marker +In an indirect buffer, or a buffer that is the base of an indirect +buffer, this holds a marker that records @code{begv} for this buffer +when the buffer is not current. + +@item zv_marker +In an indirect buffer, or a buffer that is the base of an indirect +buffer, this holds a marker that records @code{zv} for this buffer when +the buffer is not current. + +@item file_truename +The truename of the visited file, or @code{nil}. + +@item invisibility_spec +The value of @code{buffer-invisibility-spec} in this buffer. + +@item last_selected_window +This is the last window that was selected with this buffer in it, or @code{nil} +if that window no longer displays this buffer. + +@item display_count +This field is incremented each time the buffer is displayed in a window. + +@item left_margin_width +The value of @code{left-margin-width} in this buffer. + +@item right_margin_width +The value of @code{right-margin-width} in this buffer. + +@item indicate_empty_lines +Non-@code{nil} means indicate empty lines (lines with no text) with a +small bitmap in the fringe, when using a window system that can do it. + +@item display_time +This holds a time stamp that is updated each time this buffer is +displayed in a window. + +@item scroll_up_aggressively +The value of @code{scroll-up-aggressively} in this buffer. + +@item scroll_down_aggressively +The value of @code{scroll-down-aggressively} in this buffer. +@end table + +@node Window Internals +@appendixsubsec Window Internals +@cindex internals, of window +@cindex window internals + + Windows have the following accessible fields: + +@table @code +@item frame +The frame that this window is on. + +@item mini_p +Non-@code{nil} if this window is a minibuffer window. + +@item parent +Internally, Emacs arranges windows in a tree; each group of siblings has +a parent window whose area includes all the siblings. This field points +to a window's parent. + +Parent windows do not display buffers, and play little role in display +except to shape their child windows. Emacs Lisp programs usually have +no access to the parent windows; they operate on the windows at the +leaves of the tree, which actually display buffers. + +The following four fields also describe the window tree structure. + +@item hchild +In a window subdivided horizontally by child windows, the leftmost child. +Otherwise, @code{nil}. + +@item vchild +In a window subdivided vertically by child windows, the topmost child. +Otherwise, @code{nil}. + +@item next +The next sibling of this window. It is @code{nil} in a window that is +the rightmost or bottommost of a group of siblings. + +@item prev +The previous sibling of this window. It is @code{nil} in a window that +is the leftmost or topmost of a group of siblings. + +@item left +This is the left-hand edge of the window, measured in columns. (The +leftmost column on the screen is @w{column 0}.) + +@item top +This is the top edge of the window, measured in lines. (The top line on +the screen is @w{line 0}.) + +@item height +The height of the window, measured in lines. + +@item width +The width of the window, measured in columns. This width includes the +scroll bar and fringes, and/or the separator line on the right of the +window (if any). + +@item buffer +The buffer that the window is displaying. This may change often during +the life of the window. + +@item start +The position in the buffer that is the first character to be displayed +in the window. + +@item pointm +@cindex window point internals +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. + +@item force_start +If this flag is non-@code{nil}, it says that the window has been +scrolled explicitly by the Lisp program. This affects what the next +redisplay does if point is off the screen: instead of scrolling the +window to show the text around point, it moves point to a location that +is on the screen. + +@item frozen_window_start_p +This field is set temporarily to 1 to indicate to redisplay that +@code{start} of this window should not be changed, even if point +gets invisible. + +@item start_at_line_beg +Non-@code{nil} means current value of @code{start} was the beginning of a line +when it was chosen. + +@item too_small_ok +Non-@code{nil} means don't delete this window for becoming ``too small.'' + +@item height_fixed_p +This field is temporarily set to 1 to fix the height of the selected +window when the echo area is resized. + +@item use_time +This is the last time that the window was selected. The function +@code{get-lru-window} uses this field. + +@item sequence_number +A unique number assigned to this window when it was created. + +@item last_modified +The @code{modiff} field of the window's buffer, as of the last time +a redisplay completed in this window. + +@item last_overlay_modified +The @code{overlay_modiff} field of the window's buffer, as of the last +time a redisplay completed in this window. + +@item last_point +The buffer's value of point, as of the last time a redisplay completed +in this window. + +@item last_had_star +A non-@code{nil} value means the window's buffer was ``modified'' when the +window was last updated. + +@item vertical_scroll_bar +This window's vertical scroll bar. + +@item left_margin_width +The width of the left margin in this window, or @code{nil} not to +specify it (in which case the buffer's value of @code{left-margin-width} +is used. + +@item right_margin_width +Likewise for the right margin. + +@ignore +@item last_mark_x +@item last_mark_y +???Not used. +@end ignore + +@item window_end_pos +This is computed as @code{z} minus the buffer position of the last glyph +in the current matrix of the window. The value is only valid if +@code{window_end_valid} is not @code{nil}. + +@item window_end_bytepos +The byte position corresponding to @code{window_end_pos}. + +@item window_end_vpos +The window-relative vertical position of the line containing +@code{window_end_pos}. + +@item window_end_valid +This field is set to a non-@code{nil} value if @code{window_end_pos} is truly +valid. This is @code{nil} if nontrivial redisplay is preempted since in that +case the display that @code{window_end_pos} was computed for did not get +onto the screen. + +@item redisplay_end_trigger +If redisplay in this window goes beyond this buffer position, it runs +the @code{redisplay-end-trigger-hook}. + +@ignore +@item orig_height +@item orig_top +??? Are temporary storage areas. +@end ignore + +@item cursor +A structure describing where the cursor is in this window. + +@item last_cursor +The value of @code{cursor} as of the last redisplay that finished. + +@item phys_cursor +A structure describing where the cursor of this window physically is. + +@item phys_cursor_type +The type of cursor that was last displayed on this window. + +@item phys_cursor_on_p +This field is non-zero if the cursor is physically on. + +@item cursor_off_p +Non-zero means the cursor in this window is logically on. + +@item last_cursor_off_p +This field contains the value of @code{cursor_off_p} as of the time of +the last redisplay. + +@item must_be_updated_p +This is set to 1 during redisplay when this window must be updated. + +@item hscroll +This is the number of columns that the display in the window is scrolled +horizontally to the left. Normally, this is 0. + +@item vscroll +Vertical scroll amount, in pixels. Normally, this is 0. + +@item dedicated +Non-@code{nil} if this window is dedicated to its buffer. + +@item display_table +The window's display table, or @code{nil} if none is specified for it. + +@item update_mode_line +Non-@code{nil} means this window's mode line needs to be updated. + +@item base_line_number +The line number of a certain position in the buffer, or @code{nil}. +This is used for displaying the line number of point in the mode line. + +@item base_line_pos +The position in the buffer for which the line number is known, or +@code{nil} meaning none is known. + +@item region_showing +If the region (or part of it) is highlighted in this window, this field +holds the mark position that made one end of that region. Otherwise, +this field is @code{nil}. + +@item column_number_displayed +The column number currently displayed in this window's mode line, or @code{nil} +if column numbers are not being displayed. + +@item current_matrix +A glyph matrix describing the current display of this window. + +@item desired_matrix +A glyph matrix describing the desired display of this window. +@end table + +@node Process Internals +@appendixsubsec Process Internals +@cindex internals, of process +@cindex process internals + + The fields of a process are: + +@table @code +@item name +A string, the name of the process. + +@item command +A list containing the command arguments that were used to start this +process. + +@item filter +A function used to accept output from the process instead of a buffer, +or @code{nil}. + +@item sentinel +A function called whenever the process receives a signal, or @code{nil}. + +@item buffer +The associated buffer of the process. + +@item pid +An integer, the operating system's process @acronym{ID}. + +@item childp +A flag, non-@code{nil} if this is really a child process. +It is @code{nil} for a network connection. + +@item mark +A marker indicating the position of the end of the last output from this +process inserted into the buffer. This is often but not always the end +of the buffer. + +@item kill_without_query +If this is non-@code{nil}, killing Emacs while this process is still +running does not ask for confirmation about killing the process. + +@item raw_status_low +@itemx raw_status_high +These two fields record 16 bits each of the process status returned by +the @code{wait} system call. + +@item status +The process status, as @code{process-status} should return it. + +@item tick +@itemx update_tick +If these two fields are not equal, a change in the status of the process +needs to be reported, either by running the sentinel or by inserting a +message in the process buffer. + +@item pty_flag +Non-@code{nil} if communication with the subprocess uses a @acronym{PTY}; +@code{nil} if it uses a pipe. + +@item infd +The file descriptor for input from the process. + +@item outfd +The file descriptor for output to the process. + +@item subtty +The file descriptor for the terminal that the subprocess is using. (On +some systems, there is no need to record this, so the value is +@code{nil}.) + +@item tty_name +The name of the terminal that the subprocess is using, +or @code{nil} if it is using pipes. + +@item decode_coding_system +Coding-system for decoding the input from this process. + +@item decoding_buf +A working buffer for decoding. + +@item decoding_carryover +Size of carryover in decoding. + +@item encode_coding_system +Coding-system for encoding the output to this process. + +@item encoding_buf +A working buffer for encoding. + +@item encoding_carryover +Size of carryover in encoding. + +@item inherit_coding_system_flag +Flag to set @code{coding-system} of the process buffer from the +coding system used to decode process output. +@end table + +@ignore + arch-tag: 4b2c33bc-d7e4-43f5-bc20-27c0db52a53e +@end ignore diff --git a/doc/lispref/intro.texi b/doc/lispref/intro.texi new file mode 100644 index 00000000000..ed0fd1c0699 --- /dev/null +++ b/doc/lispref/intro.texi @@ -0,0 +1,560 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/intro + +@node Introduction, Lisp Data Types, Top, Top +@comment node-name, next, previous, up +@chapter 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 attempts to be a full description of Emacs Lisp. For a +beginner's introduction to Emacs Lisp, see @cite{An Introduction to +Emacs Lisp Programming}, by Bob Chassell, also published by the Free +Software Foundation. This manual presumes considerable familiarity with +the use of Emacs for editing; see @cite{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 @value{VERSION} of the GNU Emacs Lisp Reference +Manual, corresponding to Emacs version @value{EMACSVER}. + +@menu +* Caveats:: Flaws and a request for help. +* Lisp History:: Emacs Lisp is descended from Maclisp. +* Conventions:: How the manual is formatted. +* Version Info:: Which Emacs version is running? +* Acknowledgements:: The authors, editors, and sponsors of this manual. +@end menu + +@node Caveats +@section Caveats +@cindex bugs in this manual + + This manual has gone through numerous drafts. It is nearly complete +but not flawless. There are a few topics that are not covered, 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 information about usage on VMS. + + 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. + +@iftex + As you use this manual, we ask that you mark pages with corrections so +you can later look them up and send them to us. 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 chapter name, section name, and function name, as appropriate, since +page numbers and chapter and section numbers will change and we may have +trouble finding the text you are talking about. Also state the number +of the edition you are criticizing. +@end iftex +@ifnottex + +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. Also state the number of the edition +you are criticizing. +@end ifnottex + +@cindex bugs +@cindex suggestions +Please mail comments and corrections to + +@example +bug-lisp-manual@@gnu.org +@end example + +@noindent +We let mail to this list accumulate unread until someone decides to +apply the corrections. Months, and sometimes years, go by between +updates. So please attach no significance to the lack of a reply---your +mail @emph{will} be acted on in due time. If you want to contact the +Emacs maintainers more quickly, send mail to +@code{bug-gnu-emacs@@gnu.org}. + +@node Lisp History +@section Lisp History +@cindex 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 ideal +for other purposes as well, such as writing editing commands. + +@cindex Maclisp +@cindex Common Lisp + 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 1960s at MIT's Project MAC. Eventually the +implementors of the descendants of Maclisp came together and developed a +standard for Lisp systems, called Common Lisp. In the meantime, Gerry +Sussman and Guy Steele at MIT developed a simplified but very powerful +dialect of Lisp, called Scheme. + + 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 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. + +@pindex cl + A certain amount of Common Lisp emulation is available via the +@file{cl} library. @inforef{Top, Overview, cl}. + + Emacs Lisp is not at all influenced by Scheme; but the GNU project has +an implementation of Scheme, called Guile. We use Guile in all new GNU +software that calls for extensibility. + +@node Conventions +@section 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. + +@menu +* Some Terms:: Explanation of terms we use in this manual. +* nil and t:: How the symbols @code{nil} and @code{t} are used. +* Evaluation Notation:: The format we use for examples of evaluation. +* Printing Notation:: The format we use when examples print text. +* Error Messages:: The format we use for examples of errors. +* Buffer Text Notation:: The format we use for buffer contents in examples. +* Format of Descriptions:: Notation for describing functions, variables, etc. +@end menu + +@node Some Terms +@subsection Some Terms + + Throughout this manual, the phrases ``the Lisp reader'' and ``the Lisp +printer'' refer to those routines in Lisp that convert textual +representations of Lisp objects into actual Lisp objects, and vice +versa. @xref{Printed Representation}, for more details. You, the +person reading this manual, are thought of as ``the programmer'' and are +addressed as ``you.'' ``The user'' is the person who uses Lisp +programs, including those you write. + +@cindex fonts in this manual + Examples of Lisp code are formatted like this: @code{(list 1 2 3)}. +Names that represent metasyntactic variables, or arguments to a function +being described, are formatted like this: @var{first-number}. + +@node nil and t +@subsection @code{nil} and @code{t} +@cindex truth value +@cindex boolean + +@cindex @code{nil} +@cindex false + In Lisp, the symbol @code{nil} has three separate meanings: it +is a symbol with the name @samp{nil}; it is the logical truth value +@var{false}; and it is the empty list---the list of zero elements. +When used as a variable, @code{nil} always has the value @code{nil}. + + As far as the Lisp reader is concerned, @samp{()} and @samp{nil} are +identical: they stand for the same object, the symbol @code{nil}. The +different ways of writing the symbol are intended entirely for human +readers. After the Lisp reader has read either @samp{()} or @samp{nil}, +there is no way to determine which representation was actually written +by the programmer. + + In this manual, we write @code{()} when we wish to emphasize that it +means the empty list, and we write @code{nil} when we wish to emphasize +that it means the truth value @var{false}. That is a good convention to use +in Lisp programs also. + +@example +(cons 'foo ()) ; @r{Emphasize the empty list} +(setq foo-flag nil) ; @r{Emphasize the truth value @var{false}} +@end example + +@cindex @code{t} +@cindex true + In contexts where a truth value is expected, any non-@code{nil} value +is considered to be @var{true}. However, @code{t} is the preferred way +to represent the truth value @var{true}. When you need to choose a +value which represents @var{true}, and there is no other basis for +choosing, use @code{t}. The symbol @code{t} always has the value +@code{t}. + + In Emacs Lisp, @code{nil} and @code{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 @code{setting-constant} error. @xref{Constant +Variables}. + +@defun booleanp object +Return non-nil if @var{object} is one of the two canonical boolean +values: @code{t} or @code{nil}. +@end defun + +@node Evaluation Notation +@subsection Evaluation Notation +@cindex evaluation notation +@cindex documentation notation +@cindex notation + + A Lisp expression that you can evaluate is called a @dfn{form}. +Evaluating a form always produces a result, which is a Lisp object. In +the examples in this manual, this is indicated with @samp{@result{}}: + +@example +(car '(1 2)) + @result{} 1 +@end example + +@noindent +You can read this as ``@code{(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 +@samp{@expansion{}}. We may or may not show the result of the +evaluation of the expanded form. + +@example +(third '(a b c)) + @expansion{} (car (cdr (cdr '(a b c)))) + @result{} c +@end example + + Sometimes to help describe one form we show another form that +produces identical results. The exact equivalence of two forms is +indicated with @samp{@equiv{}}. + +@example +(make-sparse-keymap) @equiv{} (list 'keymap) +@end example + +@node Printing Notation +@subsection Printing Notation +@cindex printing notation + + Many of the examples in this manual print text when they are +evaluated. If you execute example code in a Lisp Interaction buffer +(such as the buffer @samp{*scratch*}), the printed text is inserted into +the buffer. If you execute the example by other means (such as by +evaluating the function @code{eval-region}), the printed text is +displayed in the echo area. + + Examples in this manual indicate printed text with @samp{@print{}}, +irrespective of where that text goes. The value returned by +evaluating the form (here @code{bar}) follows on a separate line with +@samp{@result{}}. + +@example +@group +(progn (prin1 'foo) (princ "\n") (prin1 'bar)) + @print{} foo + @print{} bar + @result{} bar +@end group +@end example + +@node Error Messages +@subsection Error Messages +@cindex error message notation + + Some examples signal errors. This normally displays an error message +in the echo area. We show the error message on a line starting with +@samp{@error{}}. Note that @samp{@error{}} itself does not appear in +the echo area. + +@example +(+ 23 'x) +@error{} Wrong type argument: number-or-marker-p, x +@end example + +@node Buffer Text Notation +@subsection Buffer Text Notation +@cindex buffer text notation + + Some examples describe modifications to the contents of a buffer, by +showing the ``before'' and ``after'' versions of the text. These +examples show the contents of the buffer in question between two lines +of dashes containing the buffer name. In addition, @samp{@point{}} +indicates the location of point. (The symbol for point, of course, is +not part of the text in the buffer; it indicates the place +@emph{between} two characters where point is currently located.) + +@example +---------- Buffer: foo ---------- +This is the @point{}contents of foo. +---------- Buffer: foo ---------- + +(insert "changed ") + @result{} nil +---------- Buffer: foo ---------- +This is the changed @point{}contents of foo. +---------- Buffer: foo ---------- +@end example + +@node Format of Descriptions +@subsection Format of Descriptions +@cindex description format + + 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. +@ifnottex +The category---function, variable, or whatever---appears at the +beginning of the line. +@end ifnottex +@iftex +The category---function, variable, or whatever---is printed next to the +right margin. +@end iftex +The description follows on succeeding lines, sometimes with examples. + +@menu +* A Sample Function Description:: A description of an imaginary + function, @code{foo}. +* A Sample Variable Description:: A description of an imaginary + variable, + @code{electric-future-map}. +@end menu + +@node A Sample Function Description +@subsubsection A Sample Function Description +@cindex function descriptions +@cindex command descriptions +@cindex macro descriptions +@cindex special form descriptions + + In a function description, the name of the function being described +appears first. It is followed on the same line by a list of argument +names. These names are also used in the body of the description, to +stand for the values of the arguments. + + The appearance of the keyword @code{&optional} in the argument list +indicates that the subsequent arguments may be omitted (omitted +arguments default to @code{nil}). Do not write @code{&optional} when +you call the function. + + The keyword @code{&rest} (which must be followed by a single +argument name) indicates that any number of arguments can follow. The +single argument name following @code{&rest} will receive, as its +value, a list of all the remaining arguments passed to the function. +Do not write @code{&rest} when you call the function. + + Here is a description of an imaginary function @code{foo}: + +@defun foo integer1 &optional integer2 &rest integers +The function @code{foo} subtracts @var{integer1} from @var{integer2}, +then adds all the rest of the arguments to the result. If @var{integer2} +is not supplied, then the number 19 is used by default. + +@example +(foo 1 5 3 9) + @result{} 16 +(foo 5) + @result{} 14 +@end example + +@need 1500 +More generally, + +@example +(foo @var{w} @var{x} @var{y}@dots{}) +@equiv{} +(+ (- @var{x} @var{w}) @var{y}@dots{}) +@end example +@end defun + + Any argument whose name contains the name of a type (e.g., +@var{integer}, @var{integer1} or @var{buffer}) is expected to be of that +type. A plural of a type (such as @var{buffers}) often means a list of +objects of that type. Arguments named @var{object} may be of any type. +(@xref{Lisp Data Types}, for a list of Emacs object types.) Arguments +with other sorts of names (e.g., @var{new-file}) are discussed +specifically in the description of the function. In some sections, +features common to the arguments of several functions are described at +the beginning. + + @xref{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 arguments because they can break the argument +list down into separate arguments in more complicated ways. +@samp{@r{[}@var{optional-arg}@r{]}} means that @var{optional-arg} is +optional and @samp{@var{repeated-args}@dots{}} stands for zero or more +arguments. Parentheses are used when several arguments are grouped into +additional levels of list structure. Here is an example: + +@defspec count-loop (@var{var} [@var{from} @var{to} [@var{inc}]]) @var{body}@dots{} +This imaginary special form implements a loop that executes the +@var{body} forms and then increments the variable @var{var} on each +iteration. On the first iteration, the variable has the value +@var{from}; on subsequent iterations, it is incremented by one (or by +@var{inc} if that is given). The loop exits before executing @var{body} +if @var{var} equals @var{to}. Here is an example: + +@example +(count-loop (i 0 10) + (prin1 i) (princ " ") + (prin1 (aref vector i)) + (terpri)) +@end example + +If @var{from} and @var{to} are omitted, @var{var} is bound to +@code{nil} before the loop begins, and the loop exits if @var{var} is +non-@code{nil} at the beginning of an iteration. Here is an example: + +@example +(count-loop (done) + (if (pending) + (fixit) + (setq done t))) +@end example + +In this special form, the arguments @var{from} and @var{to} are +optional, but must both be present or both absent. If they are present, +@var{inc} may optionally be specified as well. These arguments are +grouped with the argument @var{var} into a list, to distinguish them +from @var{body}, which includes all remaining elements of the form. +@end defspec + +@node A Sample Variable Description +@subsubsection A Sample Variable Description +@cindex variable descriptions +@cindex option descriptions + + A @dfn{variable} is a name that can hold a value. Although nearly +all variables can be set by the user, certain variables exist +specifically so that users can change them; these are called @dfn{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 @code{electric-future-map} +variable.@refill + +@defvar electric-future-map +The value of this variable is a full keymap used by Electric Command +Future mode. The functions in this map allow you to edit commands you +have not yet thought about executing. +@end defvar + + User option descriptions have the same format, but `Variable' is +replaced by `User Option'. + +@node Version Info +@section Version Information + + These facilities provide information about which version of Emacs is +in use. + +@deffn Command emacs-version &optional here +This function returns a string describing the version of Emacs that is +running. It is useful to include this string in bug reports. + +@smallexample +@group +(emacs-version) + @result{} "GNU Emacs 20.3.5 (i486-pc-linux-gnulibc1, X toolkit) + of Sat Feb 14 1998 on psilocin.gnu.org" +@end group +@end smallexample + +If @var{here} is non-@code{nil}, it inserts the text in the buffer +before point, and returns @code{nil}. Called interactively, the +function prints the same information in the echo area, but giving a +prefix argument makes @var{here} non-@code{nil}. +@end deffn + +@defvar emacs-build-time +The value of this variable indicates the time at which Emacs was built +at the local site. It is a list of three integers, like the value +of @code{current-time} (@pxref{Time of Day}). + +@example +@group +emacs-build-time + @result{} (13623 62065 344633) +@end group +@end example +@end defvar + +@defvar emacs-version +The value of this variable is the version of Emacs being run. It is a +string such as @code{"20.3.1"}. The last number in this string is not +really part of the Emacs release version number; it is incremented each +time you build Emacs in any given directory. A value with four numeric +components, such as @code{"20.3.9.1"}, indicates an unreleased test +version. +@end defvar + + The following two variables have existed since Emacs version 19.23: + +@defvar emacs-major-version +The major version number of Emacs, as an integer. For Emacs version +20.3, the value is 20. +@end defvar + +@defvar emacs-minor-version +The minor version number of Emacs, as an integer. For Emacs version +20.3, the value is 3. +@end defvar + +@node Acknowledgements +@section Acknowledgements + + This manual was written by Robert Krawitz, Bil Lewis, Dan LaLiberte, +Richard@tie{}M. Stallman and Chris Welty, the volunteers of the GNU +manual group, in an effort extending over several years. +Robert@tie{}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@tie{}A. Hunt, Jr.@: of Computational Logic, +Inc. + + Corrections were supplied by Karl Berry, Jim Blandy, Bard Bloom, +Stephane Boucher, David Boyes, Alan Carroll, Richard Davis, Lawrence +R. Dodd, Peter Doornbosch, David A. Duff, Chris Eich, Beverly +Erlebacher, David Eckelkamp, Ralf Fassel, Eirik Fuller, Stephen Gildea, +Bob Glickstein, Eric Hanchrow, George Hartzell, Nathan Hess, Masayuki +Ida, Dan Jacobson, Jak Kirman, Bob Knighten, Frederick M. Korz, Joe +Lammens, Glenn M. Lewis, K. Richard Magill, Brian Marick, Roland +McGrath, Skip Montanaro, John Gardiner Myers, Thomas A. Peterson, +Francesco Potorti, Friedrich Pukelsheim, Arnold D. Robbins, Raul +Rockwell, Per Starb@"ack, Shinichirou Sugou, Kimmo Suominen, Edward Tharp, +Bill Trost, Rickard Westman, Jean White, Matthew Wilding, Carl Witty, +Dale Worley, Rusty Wright, and David D. Zuhn. + +@ignore + arch-tag: d156593f-82f8-4708-a844-204e48f7f2aa +@end ignore diff --git a/doc/lispref/keymaps.texi b/doc/lispref/keymaps.texi new file mode 100644 index 00000000000..bf20680dd81 --- /dev/null +++ b/doc/lispref/keymaps.texi @@ -0,0 +1,2785 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998, 1999, 2000, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/keymaps +@node Keymaps, Modes, Command Loop, Top +@chapter Keymaps +@cindex keymap + + The command bindings of input events are recorded in data structures +called @dfn{keymaps}. Each entry in a keymap associates (or +@dfn{binds}) an individual event type, either to another keymap or to +a command. When an event type is bound to a keymap, that keymap is +used to look up the next input event; this continues until a command +is found. The whole process is called @dfn{key lookup}. + +@menu +* Key Sequences:: Key sequences as Lisp objects. +* Keymap Basics:: Basic concepts of keymaps. +* Format of Keymaps:: What a keymap looks like as a Lisp object. +* Creating Keymaps:: Functions to create and copy keymaps. +* Inheritance and Keymaps:: How one keymap can inherit the bindings + of another keymap. +* Prefix Keys:: Defining a key with a keymap as its definition. +* Active Keymaps:: How Emacs searches the active keymaps + for a key binding. +* Searching Keymaps:: A pseudo-Lisp summary of searching active maps. +* Controlling Active Maps:: Each buffer has a local keymap + to override the standard (global) bindings. + A minor mode can also override them. +* Key Lookup:: Finding a key's binding in one keymap. +* Functions for Key Lookup:: How to request key lookup. +* Changing Key Bindings:: Redefining a key in a keymap. +* Remapping Commands:: A keymap can translate one command to another. +* Translation Keymaps:: Keymaps for translating sequences of events. +* Key Binding Commands:: Interactive interfaces for redefining keys. +* Scanning Keymaps:: Looking through all keymaps, for printing help. +* Menu Keymaps:: Defining a menu as a keymap. +@end menu + +@node Key Sequences +@section Key Sequences +@cindex key +@cindex keystroke +@cindex key sequence + + A @dfn{key sequence}, or @dfn{key} for short, is a sequence of one +or more input events that form a unit. Input events include +characters, function keys, and mouse actions (@pxref{Input Events}). +The Emacs Lisp representation for a key sequence is a string or +vector. Unless otherwise stated, any Emacs Lisp function that accepts +a key sequence as an argument can handle both representations. + + In the string representation, alphanumeric characters ordinarily +stand for themselves; for example, @code{"a"} represents @kbd{a} +and @code{"2"} represents @kbd{2}. Control character events are +prefixed by the substring @code{"\C-"}, and meta characters by +@code{"\M-"}; for example, @code{"\C-x"} represents the key @kbd{C-x}. +In addition, the @key{TAB}, @key{RET}, @key{ESC}, and @key{DEL} events +are represented by @code{"\t"}, @code{"\r"}, @code{"\e"}, and +@code{"\d"} respectively. The string representation of a complete key +sequence is the concatenation of the string representations of the +constituent events; thus, @code{"\C-xl"} represents the key sequence +@kbd{C-x l}. + + Key sequences containing function keys, mouse button events, or +non-ASCII characters such as @kbd{C-=} or @kbd{H-a} cannot be +represented as strings; they have to be represented as vectors. + + In the vector representation, each element of the vector represents +an input event, in its Lisp form. @xref{Input Events}. For example, +the vector @code{[?\C-x ?l]} represents the key sequence @kbd{C-x l}. + + For examples of key sequences written in string and vector +representations, @ref{Init Rebinding,,, emacs, The GNU Emacs Manual}. + +@defmac kbd keyseq-text +This macro converts the text @var{keyseq-text} (a string constant) +into a key sequence (a string or vector constant). The contents of +@var{keyseq-text} should describe the key sequence using almost the same +syntax used in this manual. More precisely, it uses the same syntax +that Edit Macro mode uses for editing keyboard macros (@pxref{Edit +Keyboard Macro,,, emacs, The GNU Emacs Manual}); you must surround +function key names with @samp{<@dots{}>}. + +@example +(kbd "C-x") @result{} "\C-x" +(kbd "C-x C-f") @result{} "\C-x\C-f" +(kbd "C-x 4 C-f") @result{} "\C-x4\C-f" +(kbd "X") @result{} "X" +(kbd "RET") @result{} "\^M" +(kbd "C-c SPC") @result{} "\C-c@ " +(kbd "<f1> SPC") @result{} [f1 32] +(kbd "C-M-<down>") @result{} [C-M-down] +@end example + +This macro is not meant for use with arguments that vary---only +with string constants. +@end defmac + +@node Keymap Basics +@section Keymap Basics +@cindex key binding +@cindex binding of a key +@cindex complete key +@cindex undefined key + + A keymap is a Lisp data structure that specifies @dfn{key bindings} +for various key sequences. + + A single keymap directly specifies definitions for individual +events. When a key sequence consists of a single event, its binding +in a keymap is the keymap's definition for that event. The binding of +a longer key sequence is found by an iterative process: first find the +definition of the first event (which must itself be a keymap); then +find the second event's definition in that keymap, and so on until all +the events in the key sequence have been processed. + + If the binding of a key sequence is a keymap, we call the key sequence +a @dfn{prefix key}. Otherwise, we call it a @dfn{complete key} (because +no more events can be added to it). If the binding is @code{nil}, +we call the key @dfn{undefined}. Examples of prefix keys are @kbd{C-c}, +@kbd{C-x}, and @kbd{C-x 4}. Examples of defined complete keys are +@kbd{X}, @key{RET}, and @kbd{C-x 4 C-f}. Examples of undefined complete +keys are @kbd{C-x C-g}, and @kbd{C-c 3}. @xref{Prefix Keys}, for more +details. + + The rule for finding the binding of a key sequence assumes that the +intermediate bindings (found for the events before the last) are all +keymaps; if this is not so, the sequence of events does not form a +unit---it is not really one key sequence. In other words, removing one +or more events from the end of any valid key sequence must always yield +a prefix key. For example, @kbd{C-f C-n} is not a key sequence; +@kbd{C-f} is not a prefix key, so a longer sequence starting with +@kbd{C-f} cannot be a key sequence. + + The set of possible multi-event 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-event sequence +is always a key sequence, because it does not depend on any prefix keys +for its well-formedness. + + At any time, several primary keymaps are @dfn{active}---that is, in +use for finding key bindings. These are the @dfn{global map}, which is +shared by all buffers; the @dfn{local keymap}, which is usually +associated with a specific major mode; and zero or more @dfn{minor mode +keymaps}, which belong to currently enabled minor modes. (Not all minor +modes have keymaps.) The local keymap bindings shadow (i.e., take +precedence over) the corresponding global bindings. The minor mode +keymaps shadow both local and global keymaps. @xref{Active Keymaps}, +for details. + +@node Format of Keymaps +@section Format of Keymaps +@cindex format of keymaps +@cindex keymap format +@cindex full keymap +@cindex sparse keymap + + Each keymap is a list whose @sc{car} is the symbol @code{keymap}. The +remaining elements of the list define the key bindings of the keymap. +A symbol whose function definition is a keymap is also a keymap. Use +the function @code{keymapp} (see below) to test whether an object is a +keymap. + + Several kinds of elements may appear in a keymap, after the symbol +@code{keymap} that begins it: + +@table @code +@item (@var{type} .@: @var{binding}) +This specifies one binding, for events of type @var{type}. Each +ordinary binding applies to events of a particular @dfn{event type}, +which is always a character or a symbol. @xref{Classifying Events}. +In this kind of binding, @var{binding} is a command. + +@item (@var{type} @var{item-name} @r{[}@var{cache}@r{]} .@: @var{binding}) +This specifies a binding which is also a simple menu item that +displays as @var{item-name} in the menu. @var{cache}, if present, +caches certain information for display in the menu. @xref{Simple Menu +Items}. + +@item (@var{type} @var{item-name} @var{help-string} @r{[}@var{cache}@r{]} .@: @var{binding}) +This is a simple menu item with help string @var{help-string}. + +@item (@var{type} menu-item .@: @var{details}) +This specifies a binding which is also an extended menu item. This +allows use of other features. @xref{Extended Menu Items}. + +@item (t .@: @var{binding}) +@cindex default key binding +This specifies a @dfn{default key binding}; any event not bound by other +elements of the keymap is given @var{binding} as its binding. Default +bindings allow a keymap to bind all possible event types without having +to enumerate all of them. A keymap that has a default binding +completely masks any lower-precedence keymap, except for events +explicitly bound to @code{nil} (see below). + +@item @var{char-table} +If an element of a keymap is a char-table, it counts as holding +bindings for all character events with no modifier bits +(@pxref{modifier bits}): element @var{n} is the binding for the +character with code @var{n}. This is a compact way to record lots of +bindings. A keymap with such a char-table is called a @dfn{full +keymap}. Other keymaps are called @dfn{sparse keymaps}. + +@item @var{string} +@cindex keymap prompt string +@cindex overall prompt string +@cindex prompt string of keymap +Aside from elements that specify bindings for keys, a keymap can also +have a string as an element. This is called the @dfn{overall prompt +string} and makes it possible to use the keymap as a menu. +@xref{Defining Menus}. +@end table + +When the binding is @code{nil}, it doesn't constitute a definition +but it does take precedence over a default binding or a binding in the +parent keymap. On the other hand, a binding of @code{nil} does +@emph{not} override lower-precedence keymaps; thus, if the local map +gives a binding of @code{nil}, Emacs uses the binding from the +global map. + +@cindex meta characters lookup + Keymaps do not directly record bindings for the meta characters. +Instead, meta characters are regarded for purposes of key lookup as +sequences of two characters, the first of which is @key{ESC} (or +whatever is currently the value of @code{meta-prefix-char}). Thus, the +key @kbd{M-a} is internally represented as @kbd{@key{ESC} a}, and its +global binding is found at the slot for @kbd{a} in @code{esc-map} +(@pxref{Prefix Keys}). + + This conversion applies only to characters, not to function keys or +other input events; thus, @kbd{M-@key{end}} has nothing to do with +@kbd{@key{ESC} @key{end}}. + + Here as an example is the local keymap for Lisp mode, a sparse +keymap. It defines bindings for @key{DEL} and @key{TAB}, plus @kbd{C-c +C-l}, @kbd{M-C-q}, and @kbd{M-C-x}. + +@example +@group +lisp-mode-map +@result{} +@end group +@group +(keymap + (3 keymap + ;; @kbd{C-c C-z} + (26 . run-lisp)) +@end group +@group + (27 keymap + ;; @r{@kbd{M-C-x}, treated as @kbd{@key{ESC} C-x}} + (24 . lisp-send-defun) + keymap + ;; @r{@kbd{M-C-q}, treated as @kbd{@key{ESC} C-q}} + (17 . indent-sexp)) +@end group +@group + ;; @r{This part is inherited from @code{lisp-mode-shared-map}.} + keymap + ;; @key{DEL} + (127 . backward-delete-char-untabify) +@end group +@group + (27 keymap + ;; @r{@kbd{M-C-q}, treated as @kbd{@key{ESC} C-q}} + (17 . indent-sexp)) + (9 . lisp-indent-line)) +@end group +@end example + +@defun keymapp object +This function returns @code{t} if @var{object} is a keymap, @code{nil} +otherwise. More precisely, this function tests for a list whose +@sc{car} is @code{keymap}, or for a symbol whose function definition +satisfies @code{keymapp}. + +@example +@group +(keymapp '(keymap)) + @result{} t +@end group +@group +(fset 'foo '(keymap)) +(keymapp 'foo) + @result{} t +@end group +@group +(keymapp (current-global-map)) + @result{} t +@end group +@end example +@end defun + +@node Creating Keymaps +@section Creating Keymaps +@cindex creating keymaps + + Here we describe the functions for creating keymaps. + +@defun make-sparse-keymap &optional prompt +This function creates and returns a new sparse keymap with no entries. +(A sparse keymap is the kind of keymap you usually want.) The new +keymap does not contain a char-table, unlike @code{make-keymap}, and +does not bind any events. + +@example +@group +(make-sparse-keymap) + @result{} (keymap) +@end group +@end example + +If you specify @var{prompt}, that becomes the overall prompt string +for the keymap. You should specify this only for menu keymaps +(@pxref{Defining Menus}). A keymap with an overall prompt string will +always present a mouse menu or a keyboard menu if it is active for +looking up the next input event. Don't specify an overall prompt string +for the main map of a major or minor mode, because that would cause +the command loop to present a keyboard menu every time. +@end defun + +@defun make-keymap &optional prompt +This function creates and returns a new full keymap. That keymap +contains a char-table (@pxref{Char-Tables}) with slots for all +characters without modifiers. The new keymap initially binds all +these characters to @code{nil}, and does not bind any other kind of +event. The argument @var{prompt} specifies a +prompt string, as in @code{make-sparse-keymap}. + +@example +@group +(make-keymap) + @result{} (keymap #^[t nil nil nil @dots{} nil nil keymap]) +@end group +@end example + +A full keymap is more efficient than a sparse keymap when it holds +lots of bindings; for just a few, the sparse keymap is better. +@end defun + +@defun copy-keymap keymap +This function returns a copy of @var{keymap}. Any keymaps that +appear directly as bindings in @var{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. +@c Emacs 19 feature + +@example +@group +(setq map (copy-keymap (current-local-map))) +@result{} (keymap +@end group +@group + ;; @r{(This implements meta characters.)} + (27 keymap + (83 . center-paragraph) + (115 . center-line)) + (9 . tab-to-tab-stop)) +@end group + +@group +(eq map (current-local-map)) + @result{} nil +@end group +@group +(equal map (current-local-map)) + @result{} t +@end group +@end example +@end defun + +@node Inheritance and Keymaps +@section Inheritance and Keymaps +@cindex keymap inheritance +@cindex inheriting a keymap's bindings + + A keymap can inherit the bindings of another keymap, which we call the +@dfn{parent keymap}. Such a keymap looks like this: + +@example +(keymap @var{elements}@dots{} . @var{parent-keymap}) +@end example + +@noindent +The effect is that this keymap inherits all the bindings of +@var{parent-keymap}, whatever they may be at the time a key is looked up, +but can add to them or override them with @var{elements}. + +If you change the bindings in @var{parent-keymap} using +@code{define-key} or other key-binding functions, these changed +bindings are visible in the inheriting keymap, unless shadowed by the +bindings made by @var{elements}. The converse is not true: if you use +@code{define-key} to change bindings in the inheriting keymap, these +changes are recorded in @var{elements}, but have no effect on +@var{parent-keymap}. + +The proper way to construct a keymap with a parent is to use +@code{set-keymap-parent}; if you have code that directly constructs a +keymap with a parent, please convert the program to use +@code{set-keymap-parent} instead. + +@defun keymap-parent keymap +This returns the parent keymap of @var{keymap}. If @var{keymap} +has no parent, @code{keymap-parent} returns @code{nil}. +@end defun + +@defun set-keymap-parent keymap parent +This sets the parent keymap of @var{keymap} to @var{parent}, and returns +@var{parent}. If @var{parent} is @code{nil}, this function gives +@var{keymap} no parent at all. + +If @var{keymap} has submaps (bindings for prefix keys), they too receive +new parent keymaps that reflect what @var{parent} specifies for those +prefix keys. +@end defun + + Here is an example showing how to make a keymap that inherits +from @code{text-mode-map}: + +@example +(let ((map (make-sparse-keymap))) + (set-keymap-parent map text-mode-map) + map) +@end example + + A non-sparse keymap can have a parent too, but this is not very +useful. A non-sparse keymap always specifies something as the binding +for every numeric character code without modifier bits, even if it is +@code{nil}, so these character's bindings are never inherited from +the parent keymap. + +@node Prefix Keys +@section Prefix Keys +@cindex prefix key + + A @dfn{prefix key} is a key sequence whose binding is a keymap. The +keymap defines what to do with key sequences that extend the prefix key. +For example, @kbd{C-x} is a prefix key, and it uses a keymap that is +also stored in the variable @code{ctl-x-map}. This keymap defines +bindings for key sequences starting with @kbd{C-x}. + + Some of the standard Emacs prefix keys use keymaps that are +also found in Lisp variables: + +@itemize @bullet +@item +@vindex esc-map +@findex ESC-prefix +@code{esc-map} is the global keymap for the @key{ESC} prefix key. Thus, +the global definitions of all meta characters are actually found here. +This map is also the function definition of @code{ESC-prefix}. + +@item +@cindex @kbd{C-h} +@code{help-map} is the global keymap for the @kbd{C-h} prefix key. + +@item +@cindex @kbd{C-c} +@vindex mode-specific-map +@code{mode-specific-map} is the global keymap for the prefix key +@kbd{C-c}. This map is actually global, not mode-specific, but its name +provides useful information about @kbd{C-c} in the output of @kbd{C-h b} +(@code{display-bindings}), since the main use of this prefix key is for +mode-specific bindings. + +@item +@cindex @kbd{C-x} +@vindex ctl-x-map +@findex Control-X-prefix +@code{ctl-x-map} is the global keymap used for the @kbd{C-x} prefix key. +This map is found via the function cell of the symbol +@code{Control-X-prefix}. + +@item +@cindex @kbd{C-x @key{RET}} +@vindex mule-keymap +@code{mule-keymap} is the global keymap used for the @kbd{C-x @key{RET}} +prefix key. + +@item +@cindex @kbd{C-x 4} +@vindex ctl-x-4-map +@code{ctl-x-4-map} is the global keymap used for the @kbd{C-x 4} prefix +key. + +@c Emacs 19 feature +@item +@cindex @kbd{C-x 5} +@vindex ctl-x-5-map +@code{ctl-x-5-map} is the global keymap used for the @kbd{C-x 5} prefix +key. + +@c Emacs 19 feature +@item +@cindex @kbd{C-x 6} +@vindex 2C-mode-map +@code{2C-mode-map} is the global keymap used for the @kbd{C-x 6} prefix +key. + +@item +@cindex @kbd{C-x v} +@vindex vc-prefix-map +@code{vc-prefix-map} is the global keymap used for the @kbd{C-x v} prefix +key. + +@item +@cindex @kbd{M-o} +@vindex facemenu-keymap +@code{facemenu-keymap} is the global keymap used for the @kbd{M-o} +prefix key. + +@c Emacs 19 feature +@item +The other Emacs prefix keys are @kbd{M-g}, @kbd{C-x @@}, @kbd{C-x a i}, +@kbd{C-x @key{ESC}} and @kbd{@key{ESC} @key{ESC}}. They use keymaps +that have no special names. +@end itemize + + The keymap binding of a prefix key is used for looking up the event +that follows 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 @kbd{C-x} is the +symbol @code{Control-X-prefix}, whose function cell holds the keymap +for @kbd{C-x} commands. (The same keymap is also the value of +@code{ctl-x-map}.) + + Prefix key definitions can appear in any active keymap. The +definitions of @kbd{C-c}, @kbd{C-x}, @kbd{C-h} and @key{ESC} as prefix +keys appear in the global map, so these prefix keys are always +available. Major and minor modes can redefine a key as a prefix by +putting a prefix key definition for it in the local map or the minor +mode's map. @xref{Active Keymaps}. + + If a key is defined as a prefix in more than one active map, then its +various definitions are in effect merged: the commands defined in the +minor mode keymaps come first, followed by those in the local map's +prefix definition, and then by those from the global map. + + In the following example, we make @kbd{C-p} a prefix key in the local +keymap, in such a way that @kbd{C-p} is identical to @kbd{C-x}. Then +the binding for @kbd{C-p C-f} is the function @code{find-file}, just +like @kbd{C-x C-f}. The key sequence @kbd{C-p 6} is not found in any +active keymap. + +@example +@group +(use-local-map (make-sparse-keymap)) + @result{} nil +@end group +@group +(local-set-key "\C-p" ctl-x-map) + @result{} nil +@end group +@group +(key-binding "\C-p\C-f") + @result{} find-file +@end group + +@group +(key-binding "\C-p6") + @result{} nil +@end group +@end example + +@defun define-prefix-command symbol &optional mapvar prompt +@cindex prefix command +@anchor{Definition of define-prefix-command} +This function prepares @var{symbol} for use as a prefix key's binding: +it creates a sparse keymap and stores it as @var{symbol}'s function +definition. Subsequently binding a key sequence to @var{symbol} will +make that key sequence into a prefix key. The return value is @code{symbol}. + +This function also sets @var{symbol} as a variable, with the keymap as +its value. But if @var{mapvar} is non-@code{nil}, it sets @var{mapvar} +as a variable instead. + +If @var{prompt} is non-@code{nil}, that becomes the overall prompt +string for the keymap. The prompt string should be given for menu keymaps +(@pxref{Defining Menus}). +@end defun + +@node Active Keymaps +@section Active Keymaps +@cindex active keymap +@cindex global keymap +@cindex local keymap + + Emacs normally contains many keymaps; at any given time, just a few +of them are @dfn{active}, meaning that they participate in the +interpretation of user input. All the active keymaps are used +together to determine what command to execute when a key is entered. + + Normally the active keymaps are the @code{keymap} property keymap, +the keymaps of any enabled minor modes, the current buffer's local +keymap, and the global keymap, in that order. Emacs searches for each +input key sequence in all these keymaps. @xref{Searching Keymaps}, +for more details of this procedure. + + When the key sequence starts with a mouse event (optionally preceded +by a symbolic prefix), the active keymaps are determined based on the +position in that event. If the event happened on a string embedded +with a @code{display}, @code{before-string}, or @code{after-string} +property (@pxref{Special Properties}), the non-@code{nil} map +properties of the string override those of the buffer. + + The @dfn{global keymap} holds the bindings of keys that are defined +regardless of the current buffer, such as @kbd{C-f}. The variable +@code{global-map} holds this keymap, which is always active. + + Each buffer may have another keymap, its @dfn{local keymap}, which +may contain new or overriding definitions for keys. The current +buffer's local keymap is always active except when +@code{overriding-local-map} overrides it. The @code{local-map} text +or overlay property can specify an alternative local keymap for certain +parts of the buffer; see @ref{Special Properties}. + + Each minor mode can have a keymap; if it does, the keymap is active +when the minor mode is enabled. Modes for emulation can specify +additional active keymaps through the variable +@code{emulation-mode-map-alists}. + + The highest precedence normal keymap comes from the @code{keymap} +text or overlay property. If that is non-@code{nil}, it is the first +keymap to be processed, in normal circumstances. + + However, there are also special ways for programs to substitute +other keymaps for some of those. The variable +@code{overriding-local-map}, if non-@code{nil}, specifies a keymap +that replaces all the usual active keymaps except the global keymap. +Another way to do this is with @code{overriding-terminal-local-map}; +it operates on a per-terminal basis. These variables are documented +below. + +@cindex major mode keymap + Since every buffer that uses the same major mode normally uses the +same local keymap, you can think of the keymap as local to the mode. A +change to the local keymap of a buffer (using @code{local-set-key}, for +example) is seen also in the other buffers that share that keymap. + + The local keymaps that are used for Lisp mode and some other major +modes exist even if they have not yet been used. These local keymaps are +the values of variables such as @code{lisp-mode-map}. For most major +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. @xref{Intro to Minibuffers}. + + Emacs has other keymaps that are used in a different way---translating +events within @code{read-key-sequence}. @xref{Translation Keymaps}. + + @xref{Standard Keymaps}, for a list of standard keymaps. + +@defun current-active-maps &optional olp position +This returns the list of active keymaps that would be used by the +command loop in the current circumstances to look up a key sequence. +Normally it ignores @code{overriding-local-map} and +@code{overriding-terminal-local-map}, but if @var{olp} is non-@code{nil} +then it pays attention to them. @var{position} can optionally be either +an event position as returned by @code{event-start} or a buffer +position, and may change the keymaps as described for +@code{key-binding}. +@end defun + +@defun key-binding key &optional accept-defaults no-remap position +This function returns the binding for @var{key} according to the +current active keymaps. The result is @code{nil} if @var{key} is +undefined in the keymaps. + +The argument @var{accept-defaults} controls checking for default +bindings, as in @code{lookup-key} (@pxref{Functions for Key Lookup}). + +When commands are remapped (@pxref{Remapping Commands}), +@code{key-binding} normally processes command remappings so as to +returns the remapped command that will actually be executed. However, +if @var{no-remap} is non-@code{nil}, @code{key-binding} ignores +remappings and returns the binding directly specified for @var{key}. + +If @var{key} starts with a mouse event (perhaps following a prefix +event), the maps to be consulted are determined based on the event's +position. Otherwise, they are determined based on the value of point. +However, you can override either of them by specifying @var{position}. +If @var{position} is non-@code{nil}, it should be either a buffer +position or an event position like the value of @code{event-start}. +Then the maps consulted are determined based on @var{position}. + +An error is signaled if @var{key} is not a string or a vector. + +@example +@group +(key-binding "\C-x\C-f") + @result{} find-file +@end group +@end example +@end defun + +@node Searching Keymaps +@section Searching the Active Keymaps +@cindex searching active keymaps for keys + + After translation of event subsequences (@pxref{Translation +Keymaps}) Emacs looks for them in the active keymaps. Here is a +pseudo-Lisp description of the order and conditions for searching +them: + +@lisp +(or (if overriding-terminal-local-map + (@var{find-in} overriding-terminal-local-map) + (if overriding-local-map + (@var{find-in} overriding-local-map) + (or (@var{find-in} (get-char-property (point) 'keymap)) + (@var{find-in-any} emulation-mode-map-alists) + (@var{find-in-any} minor-mode-overriding-map-alist) + (@var{find-in-any} minor-mode-map-alist) + (if (get-text-property (point) 'local-map) + (@var{find-in} (get-char-property (point) 'local-map)) + (@var{find-in} (current-local-map)))))) + (@var{find-in} (current-global-map))) +@end lisp + +@noindent +The @var{find-in} and @var{find-in-any} are pseudo functions that +search in one keymap and in an alist of keymaps, respectively. +(Searching a single keymap for a binding is called @dfn{key lookup}; +see @ref{Key Lookup}.) If the key sequence starts with a mouse event, +or a symbolic prefix event followed by a mouse event, that event's +position is used instead of point and the current buffer. Mouse +events on an embedded string use non-@code{nil} text properties from +that string instead of the buffer. + +@enumerate +@item +The function finally found may be remapped +(@pxref{Remapping Commands}). + +@item +Characters that are bound to @code{self-insert-command} are translated +according to @code{translation-table-for-input} before insertion. + +@item +@code{current-active-maps} returns a list of the +currently active keymaps at point. + +@item +When a match is found (@pxref{Key Lookup}), if the binding in the +keymap is a function, the search is over. However if the keymap entry +is a symbol with a value or a string, Emacs replaces the input key +sequences with the variable's value or the string, and restarts the +search of the active keymaps. +@end enumerate + +@node Controlling Active Maps +@section Controlling the Active Keymaps + +@defvar global-map +This variable contains the default global keymap that maps Emacs +keyboard input to commands. The global keymap is normally this +keymap. The default global keymap is a full keymap that binds +@code{self-insert-command} to all of the printing characters. + +It is normal practice to change the bindings in the global keymap, but you +should not assign this variable any value other than the keymap it starts +out with. +@end defvar + +@defun current-global-map +This function returns the current global keymap. This is the +same as the value of @code{global-map} unless you change one or the +other. + +@example +@group +(current-global-map) +@result{} (keymap [set-mark-command beginning-of-line @dots{} + delete-backward-char]) +@end group +@end example +@end defun + +@defun current-local-map +This function returns the current buffer's local keymap, or @code{nil} +if it has none. In the following example, the keymap for the +@samp{*scratch*} buffer (using Lisp Interaction mode) is a sparse keymap +in which the entry for @key{ESC}, @acronym{ASCII} code 27, is another sparse +keymap. + +@example +@group +(current-local-map) +@result{} (keymap + (10 . eval-print-last-sexp) + (9 . lisp-indent-line) + (127 . backward-delete-char-untabify) +@end group +@group + (27 keymap + (24 . eval-defun) + (17 . indent-sexp))) +@end group +@end example +@end defun + +@defun current-minor-mode-maps +This function returns a list of the keymaps of currently enabled minor modes. +@end defun + +@defun use-global-map keymap +This function makes @var{keymap} the new current global keymap. It +returns @code{nil}. + +It is very unusual to change the global keymap. +@end defun + +@defun use-local-map keymap +This function makes @var{keymap} the new local keymap of the current +buffer. If @var{keymap} is @code{nil}, then the buffer has no local +keymap. @code{use-local-map} returns @code{nil}. Most major mode +commands use this function. +@end defun + +@c Emacs 19 feature +@defvar minor-mode-map-alist +@anchor{Definition of minor-mode-map-alist} +This variable is an alist describing keymaps that may or may not be +active according to the values of certain variables. Its elements look +like this: + +@example +(@var{variable} . @var{keymap}) +@end example + +The keymap @var{keymap} is active whenever @var{variable} has a +non-@code{nil} value. Typically @var{variable} is the variable that +enables or disables a minor mode. @xref{Keymaps and Minor Modes}. + +Note that elements of @code{minor-mode-map-alist} do not have the same +structure as elements of @code{minor-mode-alist}. The map must be the +@sc{cdr} of the element; a list with the map as the second element will +not do. The @sc{cdr} can be either a keymap (a list) or a symbol whose +function definition is a keymap. + +When more than one minor mode keymap is active, the earlier one in +@code{minor-mode-map-alist} takes priority. But you should design +minor modes so that they don't interfere with each other. If you do +this properly, the order will not matter. + +See @ref{Keymaps and Minor Modes}, for more information about minor +modes. See also @code{minor-mode-key-binding} (@pxref{Functions for Key +Lookup}). +@end defvar + +@defvar minor-mode-overriding-map-alist +This variable allows major modes to override the key bindings for +particular minor modes. The elements of this alist look like the +elements of @code{minor-mode-map-alist}: @code{(@var{variable} +. @var{keymap})}. + +If a variable appears as an element of +@code{minor-mode-overriding-map-alist}, the map specified by that +element totally replaces any map specified for the same variable in +@code{minor-mode-map-alist}. + +@code{minor-mode-overriding-map-alist} is automatically buffer-local in +all buffers. +@end defvar + +@defvar overriding-local-map +If non-@code{nil}, this variable holds a keymap to use instead of the +buffer's local keymap, any text property or overlay keymaps, and any +minor mode keymaps. This keymap, if specified, overrides all other +maps that would have been active, except for the current global map. +@end defvar + +@defvar overriding-terminal-local-map +If non-@code{nil}, this variable holds a keymap to use instead of +@code{overriding-local-map}, the buffer's local keymap, text property +or overlay keymaps, and all the minor mode keymaps. + +This variable is always local to the current terminal and cannot be +buffer-local. @xref{Multiple Displays}. It is used to implement +incremental search mode. +@end defvar + +@defvar overriding-local-map-menu-flag +If this variable is non-@code{nil}, the value of +@code{overriding-local-map} or @code{overriding-terminal-local-map} can +affect the display of the menu bar. The default value is @code{nil}, so +those map variables have no effect on the menu bar. + +Note that these two map variables do affect the execution of key +sequences entered using the menu bar, even if they do not affect the +menu bar display. So if a menu bar key sequence comes in, you should +clear the variables before looking up and executing that key sequence. +Modes that use the variables would typically do this anyway; normally +they respond to events that they do not handle by ``unreading'' them and +exiting. +@end defvar + +@defvar special-event-map +This variable holds a keymap for special events. If an event type has a +binding in this keymap, then it is special, and the binding for the +event is run directly by @code{read-event}. @xref{Special Events}. +@end defvar + +@defvar emulation-mode-map-alists +This variable holds a list of keymap alists to use for emulations +modes. It is intended for modes or packages using multiple minor-mode +keymaps. Each element is a keymap alist which has the same format and +meaning as @code{minor-mode-map-alist}, or a symbol with a variable +binding which is such an alist. The ``active'' keymaps in each alist +are used before @code{minor-mode-map-alist} and +@code{minor-mode-overriding-map-alist}. +@end defvar + +@node Key Lookup +@section Key Lookup +@cindex key lookup +@cindex keymap entry + + @dfn{Key lookup} is the process of finding the binding of a key +sequence from a given keymap. The execution or use of the binding is +not part of key lookup. + + Key lookup uses just the event type of each event in the key sequence; +the rest of the event is ignored. In fact, a key sequence used for key +lookup may designate a mouse event with just its types (a symbol) +instead of the entire event (a list). @xref{Input Events}. Such +a ``key sequence'' is insufficient for @code{command-execute} to run, +but it is sufficient for looking up or rebinding a key. + + When the key sequence consists of multiple events, key lookup +processes the events sequentially: the binding of the first event is +found, and must be a keymap; then the second event's binding is found in +that keymap, and so on until all the events in the key sequence are used +up. (The binding thus found for the last event 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 event in a keymap. How that is +done depends on the type of object associated with the event in that +keymap. + + Let's use the term @dfn{keymap entry} to describe the value found by +looking up an event type in a keymap. (This doesn't include the item +string and other extra elements in a keymap element for a menu item, because +@code{lookup-key} and other key lookup functions don't include them in +the returned value.) While any Lisp object may be stored in a keymap +as a keymap entry, not all make sense for key lookup. Here is a table +of the meaningful types of keymap entries: + +@table @asis +@item @code{nil} +@cindex @code{nil} in keymap +@code{nil} means that the events used so far in the lookup form an +undefined key. When a keymap fails to mention an event type at all, and +has no default binding, that is equivalent to a binding of @code{nil} +for that event type. + +@item @var{command} +@cindex command in keymap +The events used so far in the lookup form a complete key, +and @var{command} is its binding. @xref{What Is a Function}. + +@item @var{array} +@cindex string in keymap +The array (either a string or a vector) is a keyboard macro. The events +used so far in the lookup form a complete key, and the array is its +binding. See @ref{Keyboard Macros}, for more information. + +@item @var{keymap} +@cindex keymap in keymap +The events used so far in the lookup form a prefix key. The next +event of the key sequence is looked up in @var{keymap}. + +@item @var{list} +@cindex list in keymap +The meaning of a list depends on what it contains: + +@itemize @bullet +@item +If the @sc{car} of @var{list} is the symbol @code{keymap}, then the list +is a keymap, and is treated as a keymap (see above). + +@item +@cindex @code{lambda} in keymap +If the @sc{car} of @var{list} is @code{lambda}, then the list is a +lambda expression. This is presumed to be a function, and is treated +as such (see above). In order to execute properly as a key binding, +this function must be a command---it must have an @code{interactive} +specification. @xref{Defining Commands}. + +@item +If the @sc{car} of @var{list} is a keymap and the @sc{cdr} is an event +type, then this is an @dfn{indirect entry}: + +@example +(@var{othermap} . @var{othertype}) +@end example + +When key lookup encounters an indirect entry, it looks up instead the +binding of @var{othertype} in @var{othermap} and uses that. + +This feature permits you to define one key as an alias for another key. +For example, an entry whose @sc{car} is the keymap called @code{esc-map} +and whose @sc{cdr} is 32 (the code for @key{SPC}) means, ``Use the global +binding of @kbd{Meta-@key{SPC}}, whatever that may be.'' +@end itemize + +@item @var{symbol} +@cindex symbol in keymap +The function definition of @var{symbol} is used in place of +@var{symbol}. If that too is a symbol, then this process is repeated, +any number of times. Ultimately this should lead to an object that is +a keymap, a command, or a keyboard macro. 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 keyboard macros (strings and vectors) are not +valid functions, so a symbol with a keymap, string, or vector as its +function definition is invalid as a function. It is, however, valid as +a key binding. If the definition is a keyboard macro, then the symbol +is also valid as an argument to @code{command-execute} +(@pxref{Interactive Call}). + +@cindex @code{undefined} in keymap +The symbol @code{undefined} is worth special mention: it means to treat +the key as undefined. Strictly speaking, the key is defined, and its +binding is the command @code{undefined}; but that command does the same +thing that is done automatically for an undefined key: it rings the bell +(by calling @code{ding}) but does not signal an error. + +@cindex preventing prefix key +@code{undefined} is used in local keymaps to override a global key +binding and make the key ``undefined'' locally. A local binding of +@code{nil} would fail to do this because it would not override the +global binding. + +@item @var{anything else} +If any other type of object is found, the events used so far in the +lookup form a complete key, and the object is its binding, but the +binding is not executable as a command. +@end table + + In short, a keymap entry may be a keymap, a command, a keyboard macro, +a symbol that leads to one of them, or an indirection or @code{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 @code{emacs-lisp-mode-map}. Note that 9 is the code for @key{TAB}, +127 for @key{DEL}, 27 for @key{ESC}, 17 for @kbd{C-q} and 24 for +@kbd{C-x}. + +@example +@group +(keymap (9 . lisp-indent-line) + (127 . backward-delete-char-untabify) + (27 keymap (17 . indent-sexp) (24 . eval-defun))) +@end group +@end example + +@node Functions for Key Lookup +@section Functions for Key Lookup + + Here are the functions and variables pertaining to key lookup. + +@defun lookup-key keymap key &optional accept-defaults +This function returns the definition of @var{key} in @var{keymap}. All +the other functions described in this chapter that look up keys use +@code{lookup-key}. Here are examples: + +@example +@group +(lookup-key (current-global-map) "\C-x\C-f") + @result{} find-file +@end group +@group +(lookup-key (current-global-map) (kbd "C-x C-f")) + @result{} find-file +@end group +@group +(lookup-key (current-global-map) "\C-x\C-f12345") + @result{} 2 +@end group +@end example + +If the string or vector @var{key} is not a valid key sequence according +to the prefix keys specified in @var{keymap}, it must be ``too long'' +and have extra events at the end that do not fit into a single key +sequence. Then the value is a number, the number of events at the front +of @var{key} that compose a complete key. + +@c Emacs 19 feature +If @var{accept-defaults} is non-@code{nil}, then @code{lookup-key} +considers default bindings as well as bindings for the specific events +in @var{key}. Otherwise, @code{lookup-key} reports only bindings for +the specific sequence @var{key}, ignoring default bindings except when +you explicitly ask about them. (To do this, supply @code{t} as an +element of @var{key}; see @ref{Format of Keymaps}.) + +If @var{key} contains a meta character (not a function key), that +character is implicitly replaced by a two-character sequence: the value +of @code{meta-prefix-char}, followed by the corresponding non-meta +character. Thus, the first example below is handled by conversion into +the second example. + +@example +@group +(lookup-key (current-global-map) "\M-f") + @result{} forward-word +@end group +@group +(lookup-key (current-global-map) "\ef") + @result{} forward-word +@end group +@end example + +Unlike @code{read-key-sequence}, this function does not modify the +specified events in ways that discard information (@pxref{Key Sequence +Input}). In particular, it does not convert letters to lower case and +it does not change drag events to clicks. +@end defun + +@deffn Command undefined +Used in keymaps to undefine keys. It calls @code{ding}, but does +not cause an error. +@end deffn + +@defun local-key-binding key &optional accept-defaults +This function returns the binding for @var{key} in the current +local keymap, or @code{nil} if it is undefined there. + +@c Emacs 19 feature +The argument @var{accept-defaults} controls checking for default bindings, +as in @code{lookup-key} (above). +@end defun + +@defun global-key-binding key &optional accept-defaults +This function returns the binding for command @var{key} in the +current global keymap, or @code{nil} if it is undefined there. + +@c Emacs 19 feature +The argument @var{accept-defaults} controls checking for default bindings, +as in @code{lookup-key} (above). +@end defun + +@c Emacs 19 feature +@defun minor-mode-key-binding key &optional accept-defaults +This function returns a list of all the active minor mode bindings of +@var{key}. More precisely, it returns an alist of pairs +@code{(@var{modename} . @var{binding})}, where @var{modename} is the +variable that enables the minor mode, and @var{binding} is @var{key}'s +binding in that mode. If @var{key} has no minor-mode bindings, the +value is @code{nil}. + +If the first binding found is not a prefix definition (a keymap or a +symbol defined as a keymap), all subsequent bindings from other minor +modes are omitted, since they would be completely shadowed. Similarly, +the list omits non-prefix bindings that follow prefix bindings. + +The argument @var{accept-defaults} controls checking for default +bindings, as in @code{lookup-key} (above). +@end defun + +@defvar meta-prefix-char +@cindex @key{ESC} +This variable is the meta-prefix character code. It is used for +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 event (@pxref{Prefix Keys}). The default value is 27, which is +the @acronym{ASCII} code for @key{ESC}. + +As long as the value of @code{meta-prefix-char} remains 27, key lookup +translates @kbd{M-b} into @kbd{@key{ESC} b}, which is normally defined +as the @code{backward-word} command. However, if you were to set +@code{meta-prefix-char} to 24, the code for @kbd{C-x}, then Emacs will +translate @kbd{M-b} into @kbd{C-x b}, whose standard binding is the +@code{switch-to-buffer} command. (Don't actually do this!) Here is an +illustration of what would happen: + +@smallexample +@group +meta-prefix-char ; @r{The default value.} + @result{} 27 +@end group +@group +(key-binding "\M-b") + @result{} backward-word +@end group +@group +?\C-x ; @r{The print representation} + @result{} 24 ; @r{of a character.} +@end group +@group +(setq meta-prefix-char 24) + @result{} 24 +@end group +@group +(key-binding "\M-b") + @result{} switch-to-buffer ; @r{Now, typing @kbd{M-b} is} + ; @r{like typing @kbd{C-x b}.} + +(setq meta-prefix-char 27) ; @r{Avoid confusion!} + @result{} 27 ; @r{Restore the default value!} +@end group +@end smallexample + +This translation of one event into two happens only for characters, not +for other kinds of input events. Thus, @kbd{M-@key{F1}}, a function +key, is not converted into @kbd{@key{ESC} @key{F1}}. +@end defvar + +@node Changing Key Bindings +@section Changing Key Bindings +@cindex changing key bindings +@cindex rebinding + + The way to rebind a key is to change its entry in a keymap. If you +change a binding in the global keymap, the change is effective in all +buffers (though it has no direct effect in buffers that shadow the +global binding with a local one). If you change the current buffer's +local map, that usually affects all buffers using the same major mode. +The @code{global-set-key} and @code{local-set-key} functions are +convenient interfaces for these operations (@pxref{Key Binding +Commands}). You can also use @code{define-key}, a more general +function; then you must specify explicitly the map to change. + + When choosing the key sequences for Lisp programs to rebind, please +follow the Emacs conventions for use of various keys (@pxref{Key +Binding Conventions}). + +@cindex meta character key constants +@cindex control character key constants + In writing the key sequence to rebind, it is good to use the special +escape sequences for control and meta characters (@pxref{String Type}). +The syntax @samp{\C-} means that the following character is a control +character and @samp{\M-} means that the following character is a meta +character. Thus, the string @code{"\M-x"} is read as containing a +single @kbd{M-x}, @code{"\C-f"} is read as containing a single +@kbd{C-f}, and @code{"\M-\C-x"} and @code{"\C-\M-x"} are both read as +containing a single @kbd{C-M-x}. You can also use this escape syntax in +vectors, as well as others that aren't allowed in strings; one example +is @samp{[?\C-\H-x home]}. @xref{Character Type}. + + The key definition and lookup functions accept an alternate syntax for +event types in a key sequence that is a vector: you can use a list +containing modifier names plus one base event (a character or function +key name). For example, @code{(control ?a)} is equivalent to +@code{?\C-a} and @code{(hyper control left)} is equivalent to +@code{C-H-left}. One advantage of such lists is that the precise +numeric codes for the modifier bits don't appear in compiled files. + + The functions below signal an error if @var{keymap} is not a keymap, +or if @var{key} is not a string or vector representing a key sequence. +You can use event types (symbols) as shorthand for events that are +lists. The @code{kbd} macro (@pxref{Key Sequences}) is a convenient +way to specify the key sequence. + +@defun define-key keymap key binding +This function sets the binding for @var{key} in @var{keymap}. (If +@var{key} is more than one event long, the change is actually made +in another keymap reached from @var{keymap}.) The argument +@var{binding} can be any Lisp object, but only certain types are +meaningful. (For a list of meaningful types, see @ref{Key Lookup}.) +The value returned by @code{define-key} is @var{binding}. + +If @var{key} is @code{[t]}, this sets the default binding in +@var{keymap}. When an event has no binding of its own, the Emacs +command loop uses the keymap's default binding, if there is one. + +@cindex invalid prefix key error +@cindex key sequence error +Every prefix of @var{key} must be a prefix key (i.e., bound to a keymap) +or undefined; otherwise an error is signaled. If some prefix of +@var{key} is undefined, then @code{define-key} defines it as a prefix +key so that the rest of @var{key} can be defined as specified. + +If there was previously no binding for @var{key} in @var{keymap}, the +new binding is added at the beginning of @var{keymap}. The order of +bindings in a keymap makes no difference for keyboard input, but it +does matter for menu keymaps (@pxref{Menu Keymaps}). +@end defun + + This example creates a sparse keymap and makes a number of +bindings in it: + +@smallexample +@group +(setq map (make-sparse-keymap)) + @result{} (keymap) +@end group +@group +(define-key map "\C-f" 'forward-char) + @result{} forward-char +@end group +@group +map + @result{} (keymap (6 . forward-char)) +@end group + +@group +;; @r{Build sparse submap for @kbd{C-x} and bind @kbd{f} in that.} +(define-key map (kbd "C-x f") 'forward-word) + @result{} forward-word +@end group +@group +map +@result{} (keymap + (24 keymap ; @kbd{C-x} + (102 . forward-word)) ; @kbd{f} + (6 . forward-char)) ; @kbd{C-f} +@end group + +@group +;; @r{Bind @kbd{C-p} to the @code{ctl-x-map}.} +(define-key map (kbd "C-p") ctl-x-map) +;; @code{ctl-x-map} +@result{} [nil @dots{} find-file @dots{} backward-kill-sentence] +@end group + +@group +;; @r{Bind @kbd{C-f} to @code{foo} in the @code{ctl-x-map}.} +(define-key map (kbd "C-p C-f") 'foo) +@result{} 'foo +@end group +@group +map +@result{} (keymap ; @r{Note @code{foo} in @code{ctl-x-map}.} + (16 keymap [nil @dots{} foo @dots{} backward-kill-sentence]) + (24 keymap + (102 . forward-word)) + (6 . forward-char)) +@end group +@end smallexample + +@noindent +Note that storing a new binding for @kbd{C-p C-f} actually works by +changing an entry in @code{ctl-x-map}, and this has the effect of +changing the bindings of both @kbd{C-p C-f} and @kbd{C-x C-f} in the +default global map. + + The function @code{substitute-key-definition} scans a keymap for +keys that have a certain binding and rebinds them with a different +binding. Another feature which is cleaner and can often produce the +same results to remap one command into another (@pxref{Remapping +Commands}). + +@defun substitute-key-definition olddef newdef keymap &optional oldmap +@cindex replace bindings +This function replaces @var{olddef} with @var{newdef} for any keys in +@var{keymap} that were bound to @var{olddef}. In other words, +@var{olddef} is replaced with @var{newdef} wherever it appears. The +function returns @code{nil}. + +For example, this redefines @kbd{C-x C-f}, if you do it in an Emacs with +standard bindings: + +@smallexample +@group +(substitute-key-definition + 'find-file 'find-file-read-only (current-global-map)) +@end group +@end smallexample + +@c Emacs 19 feature +If @var{oldmap} is non-@code{nil}, that changes the behavior of +@code{substitute-key-definition}: the bindings in @var{oldmap} determine +which keys to rebind. The rebindings still happen in @var{keymap}, not +in @var{oldmap}. Thus, you can change one map under the control of the +bindings in another. For example, + +@smallexample +(substitute-key-definition + 'delete-backward-char 'my-funny-delete + my-map global-map) +@end smallexample + +@noindent +puts the special deletion command in @code{my-map} for whichever keys +are globally bound to the standard deletion command. + +Here is an example showing a keymap before and after substitution: + +@smallexample +@group +(setq map '(keymap + (?1 . olddef-1) + (?2 . olddef-2) + (?3 . olddef-1))) +@result{} (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1)) +@end group + +@group +(substitute-key-definition 'olddef-1 'newdef map) +@result{} nil +@end group +@group +map +@result{} (keymap (49 . newdef) (50 . olddef-2) (51 . newdef)) +@end group +@end smallexample +@end defun + +@defun suppress-keymap keymap &optional nodigits +@cindex @code{self-insert-command} override +This function changes the contents of the full keymap @var{keymap} by +remapping @code{self-insert-command} to the command @code{undefined} +(@pxref{Remapping Commands}). This has the effect of undefining all +printing characters, thus making ordinary insertion of text impossible. +@code{suppress-keymap} returns @code{nil}. + +If @var{nodigits} is @code{nil}, then @code{suppress-keymap} defines +digits to run @code{digit-argument}, and @kbd{-} to run +@code{negative-argument}. Otherwise it makes them undefined like the +rest of the printing characters. + +@cindex yank suppression +@cindex @code{quoted-insert} suppression +The @code{suppress-keymap} function does not make it impossible to +modify a buffer, as it does not suppress commands such as @code{yank} +and @code{quoted-insert}. To prevent any modification of a buffer, make +it read-only (@pxref{Read Only Buffers}). + +Since this function modifies @var{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 @code{global-map} would make it impossible to use +most of Emacs. + +Most often, @code{suppress-keymap} is used to initialize 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 @file{emacs/lisp/dired.el}, showing how the local keymap for +Dired mode is set up: + +@smallexample +@group +(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) +@dots{} +@end group +@end smallexample +@end defun + +@node Remapping Commands +@section Remapping Commands +@cindex remapping commands + + A special kind of key binding, using a special ``key sequence'' +which includes a command name, has the effect of @dfn{remapping} that +command into another. Here's how it works. You make a key binding +for a key sequence that starts with the dummy event @code{remap}, +followed by the command name you want to remap. Specify the remapped +definition as the definition in this binding. The remapped definition +is usually a command name, but it can be any valid definition for +a key binding. + + Here's an example. Suppose that My mode uses special commands +@code{my-kill-line} and @code{my-kill-word}, which should be invoked +instead of @code{kill-line} and @code{kill-word}. It can establish +this by making these two command-remapping bindings in its keymap: + +@smallexample +(define-key my-mode-map [remap kill-line] 'my-kill-line) +(define-key my-mode-map [remap kill-word] 'my-kill-word) +@end smallexample + +Whenever @code{my-mode-map} is an active keymap, if the user types +@kbd{C-k}, Emacs will find the standard global binding of +@code{kill-line} (assuming nobody has changed it). But +@code{my-mode-map} remaps @code{kill-line} to @code{my-kill-line}, +so instead of running @code{kill-line}, Emacs runs +@code{my-kill-line}. + +Remapping only works through a single level. In other words, + +@smallexample +(define-key my-mode-map [remap kill-line] 'my-kill-line) +(define-key my-mode-map [remap my-kill-line] 'my-other-kill-line) +@end smallexample + +@noindent +does not have the effect of remapping @code{kill-line} into +@code{my-other-kill-line}. If an ordinary key binding specifies +@code{kill-line}, this keymap will remap it to @code{my-kill-line}; +if an ordinary binding specifies @code{my-kill-line}, this keymap will +remap it to @code{my-other-kill-line}. + +@defun command-remapping command &optional position keymaps +This function returns the remapping for @var{command} (a symbol), +given the current active keymaps. If @var{command} is not remapped +(which is the usual situation), or not a symbol, the function returns +@code{nil}. @code{position} can optionally specify a buffer position +or an event position to determine the keymaps to use, as in +@code{key-binding}. + +If the optional argument @code{keymaps} is non-@code{nil}, it +specifies a list of keymaps to search in. This argument is ignored if +@code{position} is non-@code{nil}. +@end defun + +@node Translation Keymaps +@section Keymaps for Translating Sequences of Events +@cindex keymaps for translating events + + This section describes keymaps that are used during reading a key +sequence, to translate certain event sequences into others. +@code{read-key-sequence} checks every subsequence of the key sequence +being read, as it is read, against @code{function-key-map} and then +against @code{key-translation-map}. + +@defvar function-key-map +This variable holds a keymap that describes the character sequences sent +by function keys on an ordinary character terminal. This keymap has the +same structure as other keymaps, but is used differently: it specifies +translations to make while reading key sequences, rather than bindings +for key sequences. + +If @code{function-key-map} ``binds'' a key sequence @var{k} to a vector +@var{v}, then when @var{k} appears as a subsequence @emph{anywhere} in a +key sequence, it is replaced with the events in @var{v}. + +For example, VT100 terminals send @kbd{@key{ESC} O P} when the +keypad @key{PF1} key is pressed. Therefore, we want Emacs to translate +that sequence of events into the single event @code{pf1}. We accomplish +this by ``binding'' @kbd{@key{ESC} O P} to @code{[pf1]} in +@code{function-key-map}, when using a VT100. + +Thus, typing @kbd{C-c @key{PF1}} sends the character sequence @kbd{C-c +@key{ESC} O P}; later the function @code{read-key-sequence} translates +this back into @kbd{C-c @key{PF1}}, which it returns as the vector +@code{[?\C-c pf1]}. + +Entries in @code{function-key-map} are ignored if they conflict with +bindings made in the minor mode, local, or global keymaps. The intent +is that the character sequences that function keys send should not have +command bindings in their own right---but if they do, the ordinary +bindings take priority. + +The value of @code{function-key-map} is usually set up automatically +according to the terminal's Terminfo or Termcap entry, but sometimes +those need help from terminal-specific Lisp files. Emacs comes with +terminal-specific files for many common terminals; their main purpose is +to make entries in @code{function-key-map} beyond those that can be +deduced from Termcap and Terminfo. @xref{Terminal-Specific}. +@end defvar + +@defvar key-translation-map +This variable is another keymap used just like @code{function-key-map} +to translate input events into other events. It differs from +@code{function-key-map} in two ways: + +@itemize @bullet +@item +@code{key-translation-map} goes to work after @code{function-key-map} is +finished; it receives the results of translation by +@code{function-key-map}. + +@item +Non-prefix bindings in @code{key-translation-map} override actual key +bindings. For example, if @kbd{C-x f} has a non-prefix binding in +@code{key-translation-map}, that translation takes effect even though +@kbd{C-x f} also has a key binding in the global map. +@end itemize + +Note however that actual key bindings can have an effect on +@code{key-translation-map}, even though they are overridden by it. +Indeed, actual key bindings override @code{function-key-map} and thus +may alter the key sequence that @code{key-translation-map} receives. +Clearly, it is better to avoid this type of situation. + +The intent of @code{key-translation-map} is for users to map one +character set to another, including ordinary characters normally bound +to @code{self-insert-command}. +@end defvar + +@cindex key translation function +You can use @code{function-key-map} or @code{key-translation-map} for +more than simple aliases, by using a function, instead of a key +sequence, as the ``translation'' of a key. Then this function is called +to compute the translation of that key. + +The key translation function receives one argument, which is the prompt +that was specified in @code{read-key-sequence}---or @code{nil} if the +key sequence is being read by the editor command loop. In most cases +you can ignore the prompt value. + +If the function reads input itself, it can have the effect of altering +the event that follows. For example, here's how to define @kbd{C-c h} +to turn the character that follows into a Hyper character: + +@example +@group +(defun hyperify (prompt) + (let ((e (read-event))) + (vector (if (numberp e) + (logior (lsh 1 24) e) + (if (memq 'hyper (event-modifiers e)) + e + (add-event-modifier "H-" e)))))) + +(defun add-event-modifier (string e) + (let ((symbol (if (symbolp e) e (car e)))) + (setq symbol (intern (concat string + (symbol-name symbol)))) +@end group +@group + (if (symbolp e) + symbol + (cons symbol (cdr e))))) + +(define-key function-key-map "\C-ch" 'hyperify) +@end group +@end example + + If you have enabled keyboard character set decoding using +@code{set-keyboard-coding-system}, decoding is done after the +translations listed above. @xref{Terminal I/O Encoding}. However, in +future Emacs versions, character set decoding may be done at an +earlier stage. + +@node Key Binding Commands +@section Commands for Binding Keys + + This section describes some convenient interactive interfaces for +changing key bindings. They work by calling @code{define-key}. + + People often use @code{global-set-key} in their init files +(@pxref{Init File}) for simple customization. For example, + +@smallexample +(global-set-key (kbd "C-x C-\\") 'next-line) +@end smallexample + +@noindent +or + +@smallexample +(global-set-key [?\C-x ?\C-\\] 'next-line) +@end smallexample + +@noindent +or + +@smallexample +(global-set-key [(control ?x) (control ?\\)] 'next-line) +@end smallexample + +@noindent +redefines @kbd{C-x C-\} to move down a line. + +@smallexample +(global-set-key [M-mouse-1] 'mouse-set-point) +@end smallexample + +@noindent +redefines the first (leftmost) mouse button, entered with the Meta key, to +set point where you click. + +@cindex non-@acronym{ASCII} text in keybindings + Be careful when using non-@acronym{ASCII} text characters in Lisp +specifications of keys to bind. If these are read as multibyte text, as +they usually will be in a Lisp file (@pxref{Loading Non-ASCII}), you +must type the keys as multibyte too. For instance, if you use this: + +@smallexample +(global-set-key "@"o" 'my-function) ; bind o-umlaut +@end smallexample + +@noindent +or + +@smallexample +(global-set-key ?@"o 'my-function) ; bind o-umlaut +@end smallexample + +@noindent +and your language environment is multibyte Latin-1, these commands +actually bind the multibyte character with code 2294, not the unibyte +Latin-1 character with code 246 (@kbd{M-v}). In order to use this +binding, you need to enter the multibyte Latin-1 character as keyboard +input. One way to do this is by using an appropriate input method +(@pxref{Input Methods, , Input Methods, emacs, The GNU Emacs Manual}). + + If you want to use a unibyte character in the key binding, you can +construct the key sequence string using @code{multibyte-char-to-unibyte} +or @code{string-make-unibyte} (@pxref{Converting Representations}). + +@deffn Command global-set-key key binding +This function sets the binding of @var{key} in the current global map +to @var{binding}. + +@smallexample +@group +(global-set-key @var{key} @var{binding}) +@equiv{} +(define-key (current-global-map) @var{key} @var{binding}) +@end group +@end smallexample +@end deffn + +@deffn Command global-unset-key key +@cindex unbinding keys +This function removes the binding of @var{key} from the current +global map. + +One use of this function is in preparation for defining a longer key +that uses @var{key} as a prefix---which would not be allowed if +@var{key} has a non-prefix binding. For example: + +@smallexample +@group +(global-unset-key "\C-l") + @result{} nil +@end group +@group +(global-set-key "\C-l\C-l" 'redraw-display) + @result{} nil +@end group +@end smallexample + +This function is implemented simply using @code{define-key}: + +@smallexample +@group +(global-unset-key @var{key}) +@equiv{} +(define-key (current-global-map) @var{key} nil) +@end group +@end smallexample +@end deffn + +@deffn Command local-set-key key binding +This function sets the binding of @var{key} in the current local +keymap to @var{binding}. + +@smallexample +@group +(local-set-key @var{key} @var{binding}) +@equiv{} +(define-key (current-local-map) @var{key} @var{binding}) +@end group +@end smallexample +@end deffn + +@deffn Command local-unset-key key +This function removes the binding of @var{key} from the current +local map. + +@smallexample +@group +(local-unset-key @var{key}) +@equiv{} +(define-key (current-local-map) @var{key} nil) +@end group +@end smallexample +@end deffn + +@node Scanning Keymaps +@section Scanning Keymaps + + This section describes functions used to scan all the current keymaps +for the sake of printing help information. + +@defun accessible-keymaps keymap &optional prefix +This function returns a list of all the keymaps that can be reached (via +zero or more prefix keys) from @var{keymap}. The value is an +association list with elements of the form @code{(@var{key} .@: +@var{map})}, where @var{key} is a prefix key whose definition in +@var{keymap} is @var{map}. + +The elements of the alist are ordered so that the @var{key} increases +in length. The first element is always @code{([] .@: @var{keymap})}, +because the specified keymap is accessible from itself with a prefix of +no events. + +If @var{prefix} is given, it should be a prefix key sequence; then +@code{accessible-keymaps} includes only the submaps whose prefixes start +with @var{prefix}. These elements look just as they do in the value of +@code{(accessible-keymaps)}; the only difference is that some elements +are omitted. + +In the example below, the returned alist indicates that the key +@key{ESC}, which is displayed as @samp{^[}, is a prefix key whose +definition is the sparse keymap @code{(keymap (83 .@: center-paragraph) +(115 .@: foo))}. + +@smallexample +@group +(accessible-keymaps (current-local-map)) +@result{}(([] keymap + (27 keymap ; @r{Note this keymap for @key{ESC} is repeated below.} + (83 . center-paragraph) + (115 . center-line)) + (9 . tab-to-tab-stop)) +@end group + +@group + ("^[" keymap + (83 . center-paragraph) + (115 . foo))) +@end group +@end smallexample + +In the following example, @kbd{C-h} is a prefix key that uses a sparse +keymap starting with @code{(keymap (118 . describe-variable)@dots{})}. +Another prefix, @kbd{C-x 4}, uses a keymap which is also the value of +the variable @code{ctl-x-4-map}. The event @code{mode-line} is one of +several dummy events used as prefixes for mouse actions in special parts +of a window. + +@smallexample +@group +(accessible-keymaps (current-global-map)) +@result{} (([] keymap [set-mark-command beginning-of-line @dots{} + delete-backward-char]) +@end group +@group + ("^H" keymap (118 . describe-variable) @dots{} + (8 . help-for-help)) +@end group +@group + ("^X" keymap [x-flush-mouse-queue @dots{} + backward-kill-sentence]) +@end group +@group + ("^[" keymap [mark-sexp backward-sexp @dots{} + backward-kill-word]) +@end group + ("^X4" keymap (15 . display-buffer) @dots{}) +@group + ([mode-line] keymap + (S-mouse-2 . mouse-split-window-horizontally) @dots{})) +@end group +@end smallexample + +@noindent +These are not all the keymaps you would see in actuality. +@end defun + +@defun map-keymap function keymap +The function @code{map-keymap} calls @var{function} once +for each binding in @var{keymap}. It passes two arguments, +the event type and the value of the binding. If @var{keymap} +has a parent, the parent's bindings are included as well. +This works recursively: if the parent has itself a parent, then the +grandparent's bindings are also included and so on. + +This function is the cleanest way to examine all the bindings +in a keymap. +@end defun + +@defun where-is-internal command &optional keymap firstonly noindirect no-remap +This function is a subroutine used by the @code{where-is} command +(@pxref{Help, , Help, emacs,The GNU Emacs Manual}). It returns a list +of all key sequences (of any length) that are bound to @var{command} in a +set of keymaps. + +The argument @var{command} can be any object; it is compared with all +keymap entries using @code{eq}. + +If @var{keymap} is @code{nil}, then the maps used are the current active +keymaps, disregarding @code{overriding-local-map} (that is, pretending +its value is @code{nil}). If @var{keymap} is a keymap, then the +maps searched are @var{keymap} and the global keymap. If @var{keymap} +is a list of keymaps, only those keymaps are searched. + +Usually it's best to use @code{overriding-local-map} as the expression +for @var{keymap}. Then @code{where-is-internal} searches precisely the +keymaps that are active. To search only the global map, pass +@code{(keymap)} (an empty keymap) as @var{keymap}. + +If @var{firstonly} is @code{non-ascii}, then the value is a single +vector representing the first key sequence found, rather than a list of +all possible key sequences. If @var{firstonly} is @code{t}, then the +value is the first key sequence, except that key sequences consisting +entirely of @acronym{ASCII} characters (or meta variants of @acronym{ASCII} +characters) are preferred to all other key sequences and that the +return value can never be a menu binding. + +If @var{noindirect} is non-@code{nil}, @code{where-is-internal} doesn't +follow indirect keymap bindings. This makes it possible to search for +an indirect definition itself. + +When command remapping is in effect (@pxref{Remapping Commands}), +@code{where-is-internal} figures out when a command will be run due to +remapping and reports keys accordingly. It also returns @code{nil} if +@var{command} won't really be run because it has been remapped to some +other command. However, if @var{no-remap} is non-@code{nil}. +@code{where-is-internal} ignores remappings. + +@smallexample +@group +(where-is-internal 'describe-function) + @result{} ([8 102] [f1 102] [help 102] + [menu-bar help-menu describe describe-function]) +@end group +@end smallexample +@end defun + +@deffn Command describe-bindings &optional prefix buffer-or-name +This function creates a listing of all current key bindings, and +displays it in a buffer named @samp{*Help*}. The text is grouped by +modes---minor modes first, then the major mode, then global bindings. + +If @var{prefix} is non-@code{nil}, it should be a prefix key; then the +listing includes only keys that start with @var{prefix}. + +The listing describes meta characters as @key{ESC} followed by the +corresponding non-meta character. + +When several characters with consecutive @acronym{ASCII} codes have the +same definition, they are shown together, as +@samp{@var{firstchar}..@var{lastchar}}. In this instance, you need to +know the @acronym{ASCII} codes to understand which characters this means. +For example, in the default global map, the characters @samp{@key{SPC} +..@: ~} are described by a single line. @key{SPC} is @acronym{ASCII} 32, +@kbd{~} is @acronym{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 @code{self-insert-command}. + +If @var{buffer-or-name} is non-@code{nil}, it should be a buffer or a +buffer name. Then @code{describe-bindings} lists that buffer's bindings, +instead of the current buffer's. +@end deffn + +@node Menu Keymaps +@section Menu Keymaps +@cindex menu keymaps + +A keymap can operate as a menu as well as defining bindings for +keyboard keys and mouse buttons. Menus are usually actuated with the +mouse, but they can function with the keyboard also. If a menu keymap +is active for the next input event, that activates the keyboard menu +feature. + +@menu +* Defining Menus:: How to make a keymap that defines a menu. +* Mouse Menus:: How users actuate the menu with the mouse. +* Keyboard Menus:: How users actuate the menu with the keyboard. +* Menu Example:: Making a simple menu. +* Menu Bar:: How to customize the menu bar. +* Tool Bar:: A tool bar is a row of images. +* Modifying Menus:: How to add new items to a menu. +@end menu + +@node Defining Menus +@subsection Defining Menus +@cindex defining menus +@cindex menu prompt string +@cindex prompt string (of menu) + +A keymap acts as a menu if it has an @dfn{overall prompt string}, +which is a string that appears as an element of the keymap. +(@xref{Format of Keymaps}.) The string should describe the purpose of +the menu's commands. Emacs displays the overall prompt string as the +menu title in some cases, depending on the toolkit (if any) used for +displaying menus.@footnote{It is required for menus which do not use a +toolkit, e.g.@: under MS-DOS.} Keyboard menus also display the +overall prompt string. + +The easiest way to construct a keymap with a prompt string is to +specify the string as an argument when you call @code{make-keymap}, +@code{make-sparse-keymap} (@pxref{Creating Keymaps}), or +@code{define-prefix-command} (@pxref{Definition of +define-prefix-command}). If you do not want the keymap to operate as +a menu, don't specify a prompt string for it. + +@defun keymap-prompt keymap +This function returns the overall prompt string of @var{keymap}, +or @code{nil} if it has none. +@end defun + +The menu's items are the bindings in the keymap. Each binding +associates an event type to a definition, but the event types have no +significance for the menu appearance. (Usually we use pseudo-events, +symbols that the keyboard cannot generate, as the event types for menu +item bindings.) The menu is generated entirely from the bindings that +correspond in the keymap to these events. + +The order of items in the menu is the same as the order of bindings in +the keymap. Since @code{define-key} puts new bindings at the front, you +should define the menu items starting at the bottom of the menu and +moving to the top, if you care about the order. When you add an item to +an existing menu, you can specify its position in the menu using +@code{define-key-after} (@pxref{Modifying Menus}). + +@menu +* Simple Menu Items:: A simple kind of menu key binding, + limited in capabilities. +* Extended Menu Items:: More powerful menu item definitions + let you specify keywords to enable + various features. +* Menu Separators:: Drawing a horizontal line through a menu. +* Alias Menu Items:: Using command aliases in menu items. +@end menu + +@node Simple Menu Items +@subsubsection Simple Menu Items + + The simpler (and original) way to define a menu item is to bind some +event type (it doesn't matter what event type) to a binding like this: + +@example +(@var{item-string} . @var{real-binding}) +@end example + +@noindent +The @sc{car}, @var{item-string}, is the string to be displayed in the +menu. It should be short---preferably one to three words. It should +describe the action of the command it corresponds to. Note that it is +not generally possible to display non-@acronym{ASCII} text in menus. It will +work for keyboard menus and will work to a large extent when Emacs is +built with the Gtk+ toolkit.@footnote{In this case, the text is first +encoded using the @code{utf-8} coding system and then rendered by the +toolkit as it sees fit.} + + You can also supply a second string, called the help string, as follows: + +@example +(@var{item-string} @var{help} . @var{real-binding}) +@end example + +@noindent +@var{help} specifies a ``help-echo'' string to display while the mouse +is on that item in the same way as @code{help-echo} text properties +(@pxref{Help display}). + + As far as @code{define-key} is concerned, @var{item-string} and +@var{help-string} are part of the event's binding. However, +@code{lookup-key} returns just @var{real-binding}, and only +@var{real-binding} is used for executing the key. + + If @var{real-binding} is @code{nil}, then @var{item-string} appears in +the menu but cannot be selected. + + If @var{real-binding} is a symbol and has a non-@code{nil} +@code{menu-enable} property, that property is an expression that +controls whether the menu item is enabled. Every time the keymap is +used to display a menu, Emacs evaluates the expression, and it enables +the menu item only if the expression's value is non-@code{nil}. When a +menu item is disabled, it is displayed in a ``fuzzy'' fashion, and +cannot be selected. + + The menu bar does not recalculate which items are enabled every time you +look at a menu. This is because the X toolkit requires the whole tree +of menus in advance. To force recalculation of the menu bar, call +@code{force-mode-line-update} (@pxref{Mode Line Format}). + + You've probably noticed that menu items show the equivalent keyboard key +sequence (if any) to invoke the same command. To save time on +recalculation, menu display caches this information in a sublist in the +binding, like this: + +@c This line is not too long--rms. +@example +(@var{item-string} @r{[}@var{help}@r{]} (@var{key-binding-data}) . @var{real-binding}) +@end example + +@noindent +Don't put these sublists in the menu item yourself; menu display +calculates them automatically. Don't mention keyboard equivalents in +the item strings themselves, since that is redundant. + +@node Extended Menu Items +@subsubsection Extended Menu Items +@kindex menu-item + + An extended-format menu item is a more flexible and also cleaner +alternative to the simple format. You define an event type with a +binding that's a list starting with the symbol @code{menu-item}. +For a non-selectable string, the binding looks like this: + +@example +(menu-item @var{item-name}) +@end example + +@noindent +A string starting with two or more dashes specifies a separator line; +see @ref{Menu Separators}. + + To define a real menu item which can be selected, the extended format +binding looks like this: + +@example +(menu-item @var{item-name} @var{real-binding} + . @var{item-property-list}) +@end example + +@noindent +Here, @var{item-name} is an expression which evaluates to the menu item +string. Thus, the string need not be a constant. The third element, +@var{real-binding}, is the command to execute. The tail of the list, +@var{item-property-list}, has the form of a property list which contains +other information. + + When an equivalent keyboard key binding is cached, the extended menu +item binding looks like this: + +@example +(menu-item @var{item-name} @var{real-binding} (@var{key-binding-data}) + . @var{item-property-list}) +@end example + + Here is a table of the properties that are supported: + +@table @code +@item :enable @var{form} +The result of evaluating @var{form} determines whether the item is +enabled (non-@code{nil} means yes). If the item is not enabled, +you can't really click on it. + +@item :visible @var{form} +The result of evaluating @var{form} determines whether the item should +actually appear in the menu (non-@code{nil} means yes). If the item +does not appear, then the menu is displayed as if this item were +not defined at all. + +@item :help @var{help} +The value of this property, @var{help}, specifies a ``help-echo'' string +to display while the mouse is on that item. This is displayed in the +same way as @code{help-echo} text properties (@pxref{Help display}). +Note that this must be a constant string, unlike the @code{help-echo} +property for text and overlays. + +@item :button (@var{type} . @var{selected}) +This property provides a way to define radio buttons and toggle buttons. +The @sc{car}, @var{type}, says which: it should be @code{:toggle} or +@code{:radio}. The @sc{cdr}, @var{selected}, should be a form; the +result of evaluating it says whether this button is currently selected. + +A @dfn{toggle} is a menu item which is labeled as either ``on'' or ``off'' +according to the value of @var{selected}. The command itself should +toggle @var{selected}, setting it to @code{t} if it is @code{nil}, +and to @code{nil} if it is @code{t}. Here is how the menu item +to toggle the @code{debug-on-error} flag is defined: + +@example +(menu-item "Debug on Error" toggle-debug-on-error + :button (:toggle + . (and (boundp 'debug-on-error) + debug-on-error))) +@end example + +@noindent +This works because @code{toggle-debug-on-error} is defined as a command +which toggles the variable @code{debug-on-error}. + +@dfn{Radio buttons} are a group of menu items, in which at any time one +and only one is ``selected.'' There should be a variable whose value +says which one is selected at any time. The @var{selected} form for +each radio button in the group should check whether the variable has the +right value for selecting that button. Clicking on the button should +set the variable so that the button you clicked on becomes selected. + +@item :key-sequence @var{key-sequence} +This property specifies which key sequence is likely to be bound to the +same command invoked by this menu item. If you specify the right key +sequence, that makes preparing the menu for display run much faster. + +If you specify the wrong key sequence, it has no effect; before Emacs +displays @var{key-sequence} in the menu, it verifies that +@var{key-sequence} is really equivalent to this menu item. + +@item :key-sequence nil +This property indicates that there is normally no key binding which is +equivalent to this menu item. Using this property saves time in +preparing the menu for display, because Emacs does not need to search +the keymaps for a keyboard equivalent for this menu item. + +However, if the user has rebound this item's definition to a key +sequence, Emacs ignores the @code{:keys} property and finds the keyboard +equivalent anyway. + +@item :keys @var{string} +This property specifies that @var{string} is the string to display +as the keyboard equivalent for this menu item. You can use +the @samp{\\[...]} documentation construct in @var{string}. + +@item :filter @var{filter-fn} +This property provides a way to compute the menu item dynamically. +The property value @var{filter-fn} should be a function of one argument; +when it is called, its argument will be @var{real-binding}. The +function should return the binding to use instead. + +Emacs can call this function at any time that it does redisplay or +operates on menu data structures, so you should write it so it can +safely be called at any time. +@end table + +@node Menu Separators +@subsubsection Menu Separators +@cindex menu separators + + A menu separator is a kind of menu item that doesn't display any +text---instead, it divides the menu into subparts with a horizontal line. +A separator looks like this in the menu keymap: + +@example +(menu-item @var{separator-type}) +@end example + +@noindent +where @var{separator-type} is a string starting with two or more dashes. + + In the simplest case, @var{separator-type} consists of only dashes. +That specifies the default kind of separator. (For compatibility, +@code{""} and @code{-} also count as separators.) + + Certain other values of @var{separator-type} specify a different +style of separator. Here is a table of them: + +@table @code +@item "--no-line" +@itemx "--space" +An extra vertical space, with no actual line. + +@item "--single-line" +A single line in the menu's foreground color. + +@item "--double-line" +A double line in the menu's foreground color. + +@item "--single-dashed-line" +A single dashed line in the menu's foreground color. + +@item "--double-dashed-line" +A double dashed line in the menu's foreground color. + +@item "--shadow-etched-in" +A single line with a 3D sunken appearance. This is the default, +used separators consisting of dashes only. + +@item "--shadow-etched-out" +A single line with a 3D raised appearance. + +@item "--shadow-etched-in-dash" +A single dashed line with a 3D sunken appearance. + +@item "--shadow-etched-out-dash" +A single dashed line with a 3D raised appearance. + +@item "--shadow-double-etched-in" +Two lines with a 3D sunken appearance. + +@item "--shadow-double-etched-out" +Two lines with a 3D raised appearance. + +@item "--shadow-double-etched-in-dash" +Two dashed lines with a 3D sunken appearance. + +@item "--shadow-double-etched-out-dash" +Two dashed lines with a 3D raised appearance. +@end table + + You can also give these names in another style, adding a colon after +the double-dash and replacing each single dash with capitalization of +the following word. Thus, @code{"--:singleLine"}, is equivalent to +@code{"--single-line"}. + + Some systems and display toolkits don't really handle all of these +separator types. If you use a type that isn't supported, the menu +displays a similar kind of separator that is supported. + +@node Alias Menu Items +@subsubsection Alias Menu Items + + Sometimes it is useful to make menu items that use the ``same'' +command but with different enable conditions. The best way to do this +in Emacs now is with extended menu items; before that feature existed, +it could be done by defining alias commands and using them in menu +items. Here's an example that makes two aliases for +@code{toggle-read-only} and gives them different enable conditions: + +@example +(defalias 'make-read-only 'toggle-read-only) +(put 'make-read-only 'menu-enable '(not buffer-read-only)) +(defalias 'make-writable 'toggle-read-only) +(put 'make-writable 'menu-enable 'buffer-read-only) +@end example + +When using aliases in menus, often it is useful to display the +equivalent key bindings for the ``real'' command name, not the aliases +(which typically don't have any key bindings except for the menu +itself). To request this, give the alias symbol a non-@code{nil} +@code{menu-alias} property. Thus, + +@example +(put 'make-read-only 'menu-alias t) +(put 'make-writable 'menu-alias t) +@end example + +@noindent +causes menu items for @code{make-read-only} and @code{make-writable} to +show the keyboard bindings for @code{toggle-read-only}. + +@node Mouse Menus +@subsection Menus and the Mouse + + The usual way to make a menu keymap produce a menu is to make it the +definition of a prefix key. (A Lisp program can explicitly pop up a +menu and receive the user's choice---see @ref{Pop-Up Menus}.) + + If the prefix key ends with a mouse event, Emacs handles the menu keymap +by popping up a visible menu, so that the user can select a choice with +the mouse. When the user clicks on a menu item, the event generated is +whatever character or symbol has the binding that brought about that +menu item. (A menu item may generate a series of events if the menu has +multiple levels or comes from the menu bar.) + + It's often best to use a button-down event to trigger the menu. Then +the user can select a menu item by releasing the button. + + A single keymap can appear as multiple menu panes, if you explicitly +arrange for this. The way to do this is to make a keymap for each pane, +then create a binding for each of those maps in the main keymap of the +menu. Give each of these bindings an item string that starts with +@samp{@@}. The rest of the item string becomes the name of the pane. +See the file @file{lisp/mouse.el} for an example of this. Any ordinary +bindings with @samp{@@}-less item strings are grouped into one pane, +which appears along with the other panes explicitly created for the +submaps. + + X toolkit menus don't have panes; instead, they can have submenus. +Every nested keymap becomes a submenu, whether the item string starts +with @samp{@@} or not. In a toolkit version of Emacs, the only thing +special about @samp{@@} at the beginning of an item string is that the +@samp{@@} doesn't appear in the menu item. + + Multiple keymaps that define the same menu prefix key produce +separate panes or separate submenus. + +@node Keyboard Menus +@subsection Menus and the Keyboard + + When a prefix key ending with a keyboard event (a character or +function key) has a definition that is a menu keymap, the keymap +operates as a keyboard menu; the user specifies the next event by +choosing a menu item with the keyboard. + + Emacs displays the keyboard menu with the map's overall prompt +string, followed by the alternatives (the item strings of the map's +bindings), in the echo area. If the bindings don't all fit at once, +the user can type @key{SPC} to see the next line of alternatives. +Successive uses of @key{SPC} eventually get to the end of the menu and +then cycle around to the beginning. (The variable +@code{menu-prompt-more-char} specifies which character is used for +this; @key{SPC} is the default.) + + When the user has found the desired alternative from the menu, he or +she should type the corresponding character---the one whose binding is +that alternative. + +@ignore +In a menu intended for keyboard use, each menu item must clearly +indicate what character to type. The best convention to use is to make +the character the first letter of the item string---that is something +users will understand without being told. We plan to change this; by +the time you read this manual, keyboard menus may explicitly name the +key for each alternative. +@end ignore + + This way of using menus in an Emacs-like editor was inspired by the +Hierarkey system. + +@defvar menu-prompt-more-char +This variable specifies the character to use to ask to see +the next line of a menu. Its initial value is 32, the code +for @key{SPC}. +@end defvar + +@node Menu Example +@subsection Menu Example +@cindex menu definition example + + Here is a complete example of defining a menu keymap. It is the +definition of the @samp{Replace} submenu in the @samp{Edit} menu in +the menu bar, and it uses the extended menu item format +(@pxref{Extended Menu Items}). First we create the keymap, and give +it a name: + +@smallexample +(defvar menu-bar-replace-menu (make-sparse-keymap "Replace")) +@end smallexample + +@noindent +Next we define the menu items: + +@smallexample +(define-key menu-bar-replace-menu [tags-repl-continue] + '(menu-item "Continue Replace" tags-loop-continue + :help "Continue last tags replace operation")) +(define-key menu-bar-replace-menu [tags-repl] + '(menu-item "Replace in tagged files" tags-query-replace + :help "Interactively replace a regexp in all tagged files")) +(define-key menu-bar-replace-menu [separator-replace-tags] + '(menu-item "--")) +;; @r{@dots{}} +@end smallexample + +@noindent +Note the symbols which the bindings are ``made for''; these appear +inside square brackets, in the key sequence being defined. In some +cases, this symbol is the same as the command name; sometimes it is +different. These symbols are treated as ``function keys,'' but they are +not real function keys on the keyboard. They do not affect the +functioning of the menu itself, but they are ``echoed'' in the echo area +when the user selects from the menu, and they appear in the output of +@code{where-is} and @code{apropos}. + + The menu in this example is intended for use with the mouse. If a +menu is intended for use with the keyboard, that is, if it is bound to +a key sequence ending with a keyboard event, then the menu items +should be bound to characters or ``real'' function keys, that can be +typed with the keyboard. + + The binding whose definition is @code{("--")} is a separator line. +Like a real menu item, the separator has a key symbol, in this case +@code{separator-replace-tags}. If one menu has two separators, they +must have two different key symbols. + + Here is how we make this menu appear as an item in the parent menu: + +@example +(define-key menu-bar-edit-menu [replace] + (list 'menu-item "Replace" menu-bar-replace-menu)) +@end example + +@noindent +Note that this incorporates the submenu keymap, which is the value of +the variable @code{menu-bar-replace-menu}, rather than the symbol +@code{menu-bar-replace-menu} itself. Using that symbol in the parent +menu item would be meaningless because @code{menu-bar-replace-menu} is +not a command. + + If you wanted to attach the same replace menu to a mouse click, you +can do it this way: + +@example +(define-key global-map [C-S-down-mouse-1] + menu-bar-replace-menu) +@end example + +@node Menu Bar +@subsection The Menu Bar +@cindex menu bar + + Most window systems allow each frame to have a @dfn{menu bar}---a +permanently displayed menu stretching horizontally across the top of the +frame. The items of the menu bar are the subcommands of the fake +``function key'' @code{menu-bar}, as defined in the active keymaps. + + To add an item to the menu bar, invent a fake ``function key'' of your +own (let's call it @var{key}), and make a binding for the key sequence +@code{[menu-bar @var{key}]}. Most often, the binding is a menu keymap, +so that pressing a button on the menu bar item leads to another menu. + + When more than one active keymap defines the same fake function key +for the menu bar, the item appears just once. If the user clicks on +that menu bar item, it brings up a single, combined menu containing +all the subcommands of that item---the global subcommands, the local +subcommands, and the minor mode subcommands. + + The variable @code{overriding-local-map} is normally ignored when +determining the menu bar contents. That is, the menu bar is computed +from the keymaps that would be active if @code{overriding-local-map} +were @code{nil}. @xref{Active Keymaps}. + + In order for a frame to display a menu bar, its @code{menu-bar-lines} +parameter must be greater than zero. Emacs uses just one line for the +menu bar itself; if you specify more than one line, the other lines +serve to separate the menu bar from the windows in the frame. We +recommend 1 or 2 as the value of @code{menu-bar-lines}. @xref{Layout +Parameters}. + + Here's an example of setting up a menu bar item: + +@example +@group +(modify-frame-parameters (selected-frame) + '((menu-bar-lines . 2))) +@end group + +@group +;; @r{Make a menu keymap (with a prompt string)} +;; @r{and make it the menu bar item's definition.} +(define-key global-map [menu-bar words] + (cons "Words" (make-sparse-keymap "Words"))) +@end group + +@group +;; @r{Define specific subcommands in this menu.} +(define-key global-map + [menu-bar words forward] + '("Forward word" . forward-word)) +@end group +@group +(define-key global-map + [menu-bar words backward] + '("Backward word" . backward-word)) +@end group +@end example + + A local keymap can cancel a menu bar item made by the global keymap by +rebinding the same fake function key with @code{undefined} as the +binding. For example, this is how Dired suppresses the @samp{Edit} menu +bar item: + +@example +(define-key dired-mode-map [menu-bar edit] 'undefined) +@end example + +@noindent +@code{edit} is the fake function key used by the global map for the +@samp{Edit} menu bar item. The main reason to suppress a global +menu bar item is to regain space for mode-specific items. + +@defvar menu-bar-final-items +Normally the menu bar shows global items followed by items defined by the +local maps. + +This variable holds a list of fake function keys for items to display at +the end of the menu bar rather than in normal sequence. The default +value is @code{(help-menu)}; thus, the @samp{Help} menu item normally appears +at the end of the menu bar, following local menu items. +@end defvar + +@defvar menu-bar-update-hook +This normal hook is run by redisplay to update the menu bar contents, +before redisplaying the menu bar. You can use it to update submenus +whose contents should vary. Since this hook is run frequently, we +advise you to ensure that the functions it calls do not take much time +in the usual case. +@end defvar + +@node Tool Bar +@subsection Tool bars +@cindex tool bar + + A @dfn{tool bar} is a row of icons at the top of a frame, that execute +commands when you click on them---in effect, a kind of graphical menu +bar. + + The frame parameter @code{tool-bar-lines} (X resource @samp{toolBar}) +controls how many lines' worth of height to reserve for the tool bar. A +zero value suppresses the tool bar. If the value is nonzero, and +@code{auto-resize-tool-bars} is non-@code{nil}, the tool bar expands and +contracts automatically as needed to hold the specified contents. + + If the value of @code{auto-resize-tool-bars} is @code{grow-only}, +the tool bar expands automatically, but does not contract automatically. +To contract the tool bar, the user has to redraw the frame by entering +@kbd{C-l}. + + The tool bar contents are controlled by a menu keymap attached to a +fake ``function key'' called @code{tool-bar} (much like the way the menu +bar is controlled). So you define a tool bar item using +@code{define-key}, like this: + +@example +(define-key global-map [tool-bar @var{key}] @var{item}) +@end example + +@noindent +where @var{key} is a fake ``function key'' to distinguish this item from +other items, and @var{item} is a menu item key binding (@pxref{Extended +Menu Items}), which says how to display this item and how it behaves. + + The usual menu keymap item properties, @code{:visible}, +@code{:enable}, @code{:button}, and @code{:filter}, are useful in +tool bar bindings and have their normal meanings. The @var{real-binding} +in the item must be a command, not a keymap; in other words, it does not +work to define a tool bar icon as a prefix key. + + The @code{:help} property specifies a ``help-echo'' string to display +while the mouse is on that item. This is displayed in the same way as +@code{help-echo} text properties (@pxref{Help display}). + + In addition, you should use the @code{:image} property; +this is how you specify the image to display in the tool bar: + +@table @code +@item :image @var{image} +@var{images} is either a single image specification or a vector of four +image specifications. If you use a vector of four, +one of them is used, depending on circumstances: + +@table @asis +@item item 0 +Used when the item is enabled and selected. +@item item 1 +Used when the item is enabled and deselected. +@item item 2 +Used when the item is disabled and selected. +@item item 3 +Used when the item is disabled and deselected. +@end table +@end table + +If @var{image} is a single image specification, Emacs draws the tool bar +button in disabled state by applying an edge-detection algorithm to the +image. + +The default tool bar is defined so that items specific to editing do not +appear for major modes whose command symbol has a @code{mode-class} +property of @code{special} (@pxref{Major Mode Conventions}). Major +modes may add items to the global bar by binding @code{[tool-bar +@var{foo}]} in their local map. It makes sense for some major modes to +replace the default tool bar items completely, since not many can be +accommodated conveniently, and the default bindings make this easy by +using an indirection through @code{tool-bar-map}. + +@defvar tool-bar-map +By default, the global map binds @code{[tool-bar]} as follows: +@example +(global-set-key [tool-bar] + '(menu-item "tool bar" ignore + :filter (lambda (ignore) tool-bar-map))) +@end example +@noindent +Thus the tool bar map is derived dynamically from the value of variable +@code{tool-bar-map} and you should normally adjust the default (global) +tool bar by changing that map. Major modes may replace the global bar +completely by making @code{tool-bar-map} buffer-local and set to a +keymap containing only the desired items. Info mode provides an +example. +@end defvar + +There are two convenience functions for defining tool bar items, as +follows. + +@defun tool-bar-add-item icon def key &rest props +This function adds an item to the tool bar by modifying +@code{tool-bar-map}. The image to use is defined by @var{icon}, which +is the base name of an XPM, XBM or PBM image file to be located by +@code{find-image}. Given a value @samp{"exit"}, say, @file{exit.xpm}, +@file{exit.pbm} and @file{exit.xbm} would be searched for in that order +on a color display. On a monochrome display, the search order is +@samp{.pbm}, @samp{.xbm} and @samp{.xpm}. The binding to use is the +command @var{def}, and @var{key} is the fake function key symbol in the +prefix keymap. The remaining arguments @var{props} are additional +property list elements to add to the menu item specification. + +To define items in some local map, bind @code{tool-bar-map} with +@code{let} around calls of this function: +@example +(defvar foo-tool-bar-map + (let ((tool-bar-map (make-sparse-keymap))) + (tool-bar-add-item @dots{}) + @dots{} + tool-bar-map)) +@end example +@end defun + +@defun tool-bar-add-item-from-menu command icon &optional map &rest props +This function is a convenience for defining tool bar items which are +consistent with existing menu bar bindings. The binding of +@var{command} is looked up in the menu bar in @var{map} (default +@code{global-map}) and modified to add an image specification for +@var{icon}, which is found in the same way as by +@code{tool-bar-add-item}. The resulting binding is then placed in +@code{tool-bar-map}, so use this function only for global tool bar +items. + +@var{map} must contain an appropriate keymap bound to +@code{[menu-bar]}. The remaining arguments @var{props} are additional +property list elements to add to the menu item specification. +@end defun + +@defun tool-bar-local-item-from-menu command icon in-map &optional from-map &rest props +This function is used for making non-global tool bar items. Use it +like @code{tool-bar-add-item-from-menu} except that @var{in-map} +specifies the local map to make the definition in. The argument +@var{from-map} is like the @var{map} argument of +@code{tool-bar-add-item-from-menu}. +@end defun + +@defvar auto-resize-tool-bar +If this variable is non-@code{nil}, the tool bar automatically resizes to +show all defined tool bar items---but not larger than a quarter of the +frame's height. + +If the value is @code{grow-only}, the tool bar expands automatically, +but does not contract automatically. To contract the tool bar, the +user has to redraw the frame by entering @kbd{C-l}. +@end defvar + +@defvar auto-raise-tool-bar-buttons +If this variable is non-@code{nil}, tool bar items display +in raised form when the mouse moves over them. +@end defvar + +@defvar tool-bar-button-margin +This variable specifies an extra margin to add around tool bar items. +The value is an integer, a number of pixels. The default is 4. +@end defvar + +@defvar tool-bar-button-relief +This variable specifies the shadow width for tool bar items. +The value is an integer, a number of pixels. The default is 1. +@end defvar + +@defvar tool-bar-border +This variable specifies the height of the border drawn below the tool +bar area. An integer value specifies height as a number of pixels. +If the value is one of @code{internal-border-width} (the default) or +@code{border-width}, the tool bar border height corresponds to the +corresponding frame parameter. +@end defvar + + You can define a special meaning for clicking on a tool bar item with +the shift, control, meta, etc., modifiers. You do this by setting up +additional items that relate to the original item through the fake +function keys. Specifically, the additional items should use the +modified versions of the same fake function key used to name the +original item. + + Thus, if the original item was defined this way, + +@example +(define-key global-map [tool-bar shell] + '(menu-item "Shell" shell + :image (image :type xpm :file "shell.xpm"))) +@end example + +@noindent +then here is how you can define clicking on the same tool bar image with +the shift modifier: + +@example +(define-key global-map [tool-bar S-shell] 'some-command) +@end example + +@xref{Function Keys}, for more information about how to add modifiers to +function keys. + +@node Modifying Menus +@subsection Modifying Menus + + When you insert a new item in an existing menu, you probably want to +put it in a particular place among the menu's existing items. If you +use @code{define-key} to add the item, it normally goes at the front of +the menu. To put it elsewhere in the menu, use @code{define-key-after}: + +@defun define-key-after map key binding &optional after +Define a binding in @var{map} for @var{key}, with value @var{binding}, +just like @code{define-key}, but position the binding in @var{map} after +the binding for the event @var{after}. The argument @var{key} should be +of length one---a vector or string with just one element. But +@var{after} should be a single event type---a symbol or a character, not +a sequence. The new binding goes after the binding for @var{after}. If +@var{after} is @code{t} or is omitted, then the new binding goes last, at +the end of the keymap. However, new bindings are added before any +inherited keymap. + +Here is an example: + +@example +(define-key-after my-menu [drink] + '("Drink" . drink-command) 'eat) +@end example + +@noindent +makes a binding for the fake function key @key{DRINK} and puts it +right after the binding for @key{EAT}. + +Here is how to insert an item called @samp{Work} in the @samp{Signals} +menu of Shell mode, after the item @code{break}: + +@example +(define-key-after + (lookup-key shell-mode-map [menu-bar signals]) + [work] '("Work" . work-command) 'break) +@end example +@end defun + +@ignore + arch-tag: cfb87287-9364-4e46-9e93-6c2f7f6ae794 +@end ignore diff --git a/doc/lispref/lay-flat.texi b/doc/lispref/lay-flat.texi new file mode 100644 index 00000000000..1677058d7ca --- /dev/null +++ b/doc/lispref/lay-flat.texi @@ -0,0 +1,48 @@ +\input texinfo @c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +@c Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@c +@comment %**start of header +@setfilename inner-covers.info +@settitle Inner Covers +@smallbook +@comment %**end of header + +@headings off + +@w{ } +@sp 4 +@tex +\center {\secfonts \rm Lay-Flat Binding} +@end tex +@sp 2 + +We have bound this manual using a new @dfn{lay-flat} binding +technology. This type of binding allows you to open a soft cover book +so that it ``lays flat'' on a table without creasing the binding. + +In order to make the book lay flat properly, you need to ``crack'' the +binding. To do this, divide the book into two sections and bend it so +that the front and back covers meet. Do not worry; the pages are +sewn and glued to the binding, and will not fall out easily. +The outer cardboard binding itself is designed so that it will not +break or crease as an ordinary paperback binding will. Bend the book +several times in this manner, dividing it in a different place each +time and pressing the pages flat and open. With use, the binding will +become flexible and the pages will lay flat without needing to be +pushed or held down. + +@page + + +@tex +\center {\secfonts \rm Notes} +@end tex + +@bye + +@ignore + arch-tag: 9e03a1c7-6f62-4346-85d9-ed5b79386e07 +@end ignore diff --git a/doc/lispref/lists.texi b/doc/lispref/lists.texi new file mode 100644 index 00000000000..ffe4df2413d --- /dev/null +++ b/doc/lispref/lists.texi @@ -0,0 +1,1904 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/lists +@node Lists, Sequences Arrays Vectors, Strings and Characters, Top +@chapter Lists +@cindex lists +@cindex element (of list) + + A @dfn{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. + +@menu +* Cons Cells:: How lists are made out of cons cells. +* List-related Predicates:: Is this object a list? Comparing two lists. +* List Elements:: Extracting the pieces of a list. +* Building Lists:: Creating list structure. +* List Variables:: Modifying lists stored in variables. +* Modifying Lists:: Storing new pieces into an existing list. +* Sets And Lists:: A list can represent a finite mathematical set. +* Association Lists:: A list can represent a finite relation or mapping. +* Rings:: Managing a fixed-size ring of objects. +@end menu + +@node Cons Cells +@section Lists and Cons Cells +@cindex lists and cons cells + + Lists in Lisp are not a primitive data type; they are built up from +@dfn{cons cells}. A cons cell is a data object that represents an +ordered pair. That is, it has two slots, and each slot @dfn{holds}, or +@dfn{refers to}, some Lisp object. One slot is known as the @sc{car}, +and the other is known as the @sc{cdr}. (These names are traditional; +see @ref{Cons Cell Type}.) @sc{cdr} is pronounced ``could-er.'' + + We say that ``the @sc{car} of this cons cell is'' whatever object +its @sc{car} slot currently holds, and likewise for the @sc{cdr}. + + A list is a series of cons cells ``chained together,'' so that each +cell refers to the next one. There is one cons cell for each element of +the list. By convention, the @sc{car}s of the cons cells hold the +elements of the list, and the @sc{cdr}s are used to chain the list: the +@sc{cdr} slot of each cons cell refers to the following cons cell. The +@sc{cdr} of the last cons cell is @code{nil}. This asymmetry between +the @sc{car} and the @sc{cdr} is entirely a matter of convention; at the +level of cons cells, the @sc{car} and @sc{cdr} slots have the same +characteristics. + +@cindex true list + Since @code{nil} is the conventional value to put in the @sc{cdr} of +the last cons cell in the list, we call that case a @dfn{true list}. + + In Lisp, we consider the symbol @code{nil} a list as well as a +symbol; it is the list with no elements. For convenience, the symbol +@code{nil} is considered to have @code{nil} as its @sc{cdr} (and also +as its @sc{car}). Therefore, the @sc{cdr} of a true list is always a +true list. + +@cindex dotted list +@cindex circular list + If the @sc{cdr} of a list's last cons cell is some other value, +neither @code{nil} nor another cons cell, we call the structure a +@dfn{dotted list}, since its printed representation would use +@samp{.}. There is one other possibility: some cons cell's @sc{cdr} +could point to one of the previous cons cells in the list. We call +that structure a @dfn{circular list}. + + For some purposes, it does not matter whether a list is true, +circular or dotted. If the program doesn't look far enough down the +list to see the @sc{cdr} of the final cons cell, it won't care. +However, some functions that operate on lists demand true lists and +signal errors if given a dotted list. Most functions that try to find +the end of a list enter infinite loops if given a circular list. + +@cindex list structure + Because most cons cells are used as part of lists, the phrase +@dfn{list structure} has come to mean any structure made out of cons +cells. + + The @sc{cdr} of any nonempty true list @var{l} is a list containing all the +elements of @var{l} except the first. + + @xref{Cons Cell Type}, for the read and print syntax of cons cells and +lists, and for ``box and arrow'' illustrations of lists. + +@node List-related Predicates +@section Predicates on Lists + + The following predicates test whether a Lisp object is an atom, +whether it is a cons cell or is a list, or whether it is the +distinguished object @code{nil}. (Many of these predicates can be +defined in terms of the others, but they are used so often that it is +worth having all of them.) + +@defun consp object +This function returns @code{t} if @var{object} is a cons cell, @code{nil} +otherwise. @code{nil} is not a cons cell, although it @emph{is} a list. +@end defun + +@defun atom object +This function returns @code{t} if @var{object} is an atom, @code{nil} +otherwise. All objects except cons cells are atoms. The symbol +@code{nil} is an atom and is also a list; it is the only Lisp object +that is both. + +@example +(atom @var{object}) @equiv{} (not (consp @var{object})) +@end example +@end defun + +@defun listp object +This function returns @code{t} if @var{object} is a cons cell or +@code{nil}. Otherwise, it returns @code{nil}. + +@example +@group +(listp '(1)) + @result{} t +@end group +@group +(listp '()) + @result{} t +@end group +@end example +@end defun + +@defun nlistp object +This function is the opposite of @code{listp}: it returns @code{t} if +@var{object} is not a list. Otherwise, it returns @code{nil}. + +@example +(listp @var{object}) @equiv{} (not (nlistp @var{object})) +@end example +@end defun + +@defun null object +This function returns @code{t} if @var{object} is @code{nil}, and +returns @code{nil} otherwise. This function is identical to @code{not}, +but as a matter of clarity we use @code{null} when @var{object} is +considered a list and @code{not} when it is considered a truth value +(see @code{not} in @ref{Combining Conditions}). + +@example +@group +(null '(1)) + @result{} nil +@end group +@group +(null '()) + @result{} t +@end group +@end example +@end defun + + +@node List Elements +@section Accessing Elements of Lists +@cindex list elements + +@defun car cons-cell +This function returns the value referred to by the first slot of the +cons cell @var{cons-cell}. Expressed another way, this function +returns the @sc{car} of @var{cons-cell}. + +As a special case, if @var{cons-cell} is @code{nil}, then @code{car} +is defined to return @code{nil}; therefore, any list is a valid argument +for @code{car}. An error is signaled if the argument is not a cons cell +or @code{nil}. + +@example +@group +(car '(a b c)) + @result{} a +@end group +@group +(car '()) + @result{} nil +@end group +@end example +@end defun + +@defun cdr cons-cell +This function returns the value referred to by the second slot of +the cons cell @var{cons-cell}. Expressed another way, this function +returns the @sc{cdr} of @var{cons-cell}. + +As a special case, if @var{cons-cell} is @code{nil}, then @code{cdr} +is defined to return @code{nil}; therefore, any list is a valid argument +for @code{cdr}. An error is signaled if the argument is not a cons cell +or @code{nil}. + +@example +@group +(cdr '(a b c)) + @result{} (b c) +@end group +@group +(cdr '()) + @result{} nil +@end group +@end example +@end defun + +@defun car-safe object +This function lets you take the @sc{car} of a cons cell while avoiding +errors for other data types. It returns the @sc{car} of @var{object} if +@var{object} is a cons cell, @code{nil} otherwise. This is in contrast +to @code{car}, which signals an error if @var{object} is not a list. + +@example +@group +(car-safe @var{object}) +@equiv{} +(let ((x @var{object})) + (if (consp x) + (car x) + nil)) +@end group +@end example +@end defun + +@defun cdr-safe object +This function lets you take the @sc{cdr} of a cons cell while +avoiding errors for other data types. It returns the @sc{cdr} of +@var{object} if @var{object} is a cons cell, @code{nil} otherwise. +This is in contrast to @code{cdr}, which signals an error if +@var{object} is not a list. + +@example +@group +(cdr-safe @var{object}) +@equiv{} +(let ((x @var{object})) + (if (consp x) + (cdr x) + nil)) +@end group +@end example +@end defun + +@defmac pop listname +This macro is a way of examining the @sc{car} of a list, +and taking it off the list, all at once. + +It operates on the list which is stored in the symbol @var{listname}. +It removes this element from the list by setting @var{listname} +to the @sc{cdr} of its old value---but it also returns the @sc{car} +of that list, which is the element being removed. + +@example +x + @result{} (a b c) +(pop x) + @result{} a +x + @result{} (b c) +@end example +@end defmac + +@defun nth n list +@anchor{Definition of nth} +This function returns the @var{n}th element of @var{list}. Elements +are numbered starting with zero, so the @sc{car} of @var{list} is +element number zero. If the length of @var{list} is @var{n} or less, +the value is @code{nil}. + +If @var{n} is negative, @code{nth} returns the first element of +@var{list}. + +@example +@group +(nth 2 '(1 2 3 4)) + @result{} 3 +@end group +@group +(nth 10 '(1 2 3 4)) + @result{} nil +@end group +@group +(nth -3 '(1 2 3 4)) + @result{} 1 + +(nth n x) @equiv{} (car (nthcdr n x)) +@end group +@end example + +The function @code{elt} is similar, but applies to any kind of sequence. +For historical reasons, it takes its arguments in the opposite order. +@xref{Sequence Functions}. +@end defun + +@defun nthcdr n list +This function returns the @var{n}th @sc{cdr} of @var{list}. In other +words, it skips past the first @var{n} links of @var{list} and returns +what follows. + +If @var{n} is zero or negative, @code{nthcdr} returns all of +@var{list}. If the length of @var{list} is @var{n} or less, +@code{nthcdr} returns @code{nil}. + +@example +@group +(nthcdr 1 '(1 2 3 4)) + @result{} (2 3 4) +@end group +@group +(nthcdr 10 '(1 2 3 4)) + @result{} nil +@end group +@group +(nthcdr -3 '(1 2 3 4)) + @result{} (1 2 3 4) +@end group +@end example +@end defun + +@defun last list &optional n +This function returns the last link of @var{list}. The @code{car} of +this link is the list's last element. If @var{list} is null, +@code{nil} is returned. If @var{n} is non-@code{nil}, the +@var{n}th-to-last link is returned instead, or the whole of @var{list} +if @var{n} is bigger than @var{list}'s length. +@end defun + +@defun safe-length list +@anchor{Definition of safe-length} +This function returns the length of @var{list}, with no risk of either +an error or an infinite loop. It generally returns the number of +distinct cons cells in the list. However, for circular lists, +the value is just an upper bound; it is often too large. + +If @var{list} is not @code{nil} or a cons cell, @code{safe-length} +returns 0. +@end defun + + The most common way to compute the length of a list, when you are not +worried that it may be circular, is with @code{length}. @xref{Sequence +Functions}. + +@defun caar cons-cell +This is the same as @code{(car (car @var{cons-cell}))}. +@end defun + +@defun cadr cons-cell +This is the same as @code{(car (cdr @var{cons-cell}))} +or @code{(nth 1 @var{cons-cell})}. +@end defun + +@defun cdar cons-cell +This is the same as @code{(cdr (car @var{cons-cell}))}. +@end defun + +@defun cddr cons-cell +This is the same as @code{(cdr (cdr @var{cons-cell}))} +or @code{(nthcdr 2 @var{cons-cell})}. +@end defun + +@defun butlast x &optional n +This function returns the list @var{x} with the last element, +or the last @var{n} elements, removed. If @var{n} is greater +than zero it makes a copy of the list so as not to damage the +original list. In general, @code{(append (butlast @var{x} @var{n}) +(last @var{x} @var{n}))} will return a list equal to @var{x}. +@end defun + +@defun nbutlast x &optional n +This is a version of @code{butlast} that works by destructively +modifying the @code{cdr} of the appropriate element, rather than +making a copy of the list. +@end defun + +@node Building Lists +@comment node-name, next, previous, up +@section Building Cons Cells and Lists +@cindex cons cells +@cindex building lists + + Many functions build lists, as lists reside at the very heart of Lisp. +@code{cons} is the fundamental list-building function; however, it is +interesting to note that @code{list} is used more times in the source +code for Emacs than @code{cons}. + +@defun cons object1 object2 +This function is the most basic function for building new list +structure. It creates a new cons cell, making @var{object1} the +@sc{car}, and @var{object2} the @sc{cdr}. It then returns the new +cons cell. The arguments @var{object1} and @var{object2} may be any +Lisp objects, but most often @var{object2} is a list. + +@example +@group +(cons 1 '(2)) + @result{} (1 2) +@end group +@group +(cons 1 '()) + @result{} (1) +@end group +@group +(cons 1 2) + @result{} (1 . 2) +@end group +@end example + +@cindex consing +@code{cons} is often used to add a single element to the front of a +list. This is called @dfn{consing the element onto the list}. +@footnote{There is no strictly equivalent way to add an element to +the end of a list. You can use @code{(append @var{listname} (list +@var{newelt}))}, which creates a whole new list by copying @var{listname} +and adding @var{newelt} to its end. Or you can use @code{(nconc +@var{listname} (list @var{newelt}))}, which modifies @var{listname} +by following all the @sc{cdr}s and then replacing the terminating +@code{nil}. Compare this to adding an element to the beginning of a +list with @code{cons}, which neither copies nor modifies the list.} +For example: + +@example +(setq list (cons newelt list)) +@end example + +Note that there is no conflict between the variable named @code{list} +used in this example and the function named @code{list} described below; +any symbol can serve both purposes. +@end defun + +@defun list &rest objects +This function creates a list with @var{objects} as its elements. The +resulting list is always @code{nil}-terminated. If no @var{objects} +are given, the empty list is returned. + +@example +@group +(list 1 2 3 4 5) + @result{} (1 2 3 4 5) +@end group +@group +(list 1 2 '(3 4 5) 'foo) + @result{} (1 2 (3 4 5) foo) +@end group +@group +(list) + @result{} nil +@end group +@end example +@end defun + +@defun make-list length object +This function creates a list of @var{length} elements, in which each +element is @var{object}. Compare @code{make-list} with +@code{make-string} (@pxref{Creating Strings}). + +@example +@group +(make-list 3 'pigs) + @result{} (pigs pigs pigs) +@end group +@group +(make-list 0 'pigs) + @result{} nil +@end group +@group +(setq l (make-list 3 '(a b)) + @result{} ((a b) (a b) (a b)) +(eq (car l) (cadr l)) + @result{} t +@end group +@end example +@end defun + +@defun append &rest sequences +@cindex copying lists +This function returns a list containing all the elements of +@var{sequences}. The @var{sequences} may be lists, vectors, +bool-vectors, or strings, but the last one should usually be a list. +All arguments except the last one are copied, so none of the arguments +is altered. (See @code{nconc} in @ref{Rearrangement}, for a way to join +lists with no copying.) + +More generally, the final argument to @code{append} may be any Lisp +object. The final argument is not copied or converted; it becomes the +@sc{cdr} of the last cons cell in the new list. If the final argument +is itself a list, then its elements become in effect elements of the +result list. If the final element is not a list, the result is a +dotted list since its final @sc{cdr} is not @code{nil} as required +in a true list. + +In Emacs 20 and before, the @code{append} function also allowed +integers as (non last) arguments. It converted them to strings of +digits, making up the decimal print representation of the integer, and +then used the strings instead of the original integers. This obsolete +usage no longer works. The proper way to convert an integer to a +decimal number in this way is with @code{format} (@pxref{Formatting +Strings}) or @code{number-to-string} (@pxref{String Conversion}). +@end defun + + Here is an example of using @code{append}: + +@example +@group +(setq trees '(pine oak)) + @result{} (pine oak) +(setq more-trees (append '(maple birch) trees)) + @result{} (maple birch pine oak) +@end group + +@group +trees + @result{} (pine oak) +more-trees + @result{} (maple birch pine oak) +@end group +@group +(eq trees (cdr (cdr more-trees))) + @result{} t +@end group +@end example + + You can see how @code{append} works by looking at a box diagram. The +variable @code{trees} is set to the list @code{(pine oak)} and then the +variable @code{more-trees} is set to the list @code{(maple birch pine +oak)}. However, the variable @code{trees} continues to refer to the +original list: + +@smallexample +@group +more-trees trees +| | +| --- --- --- --- -> --- --- --- --- + --> | | |--> | | |--> | | |--> | | |--> nil + --- --- --- --- --- --- --- --- + | | | | + | | | | + --> maple -->birch --> pine --> oak +@end group +@end smallexample + + An empty sequence contributes nothing to the value returned by +@code{append}. As a consequence of this, a final @code{nil} argument +forces a copy of the previous argument: + +@example +@group +trees + @result{} (pine oak) +@end group +@group +(setq wood (append trees nil)) + @result{} (pine oak) +@end group +@group +wood + @result{} (pine oak) +@end group +@group +(eq wood trees) + @result{} nil +@end group +@end example + +@noindent +This once was the usual way to copy a list, before the function +@code{copy-sequence} was invented. @xref{Sequences Arrays Vectors}. + + Here we show the use of vectors and strings as arguments to @code{append}: + +@example +@group +(append [a b] "cd" nil) + @result{} (a b 99 100) +@end group +@end example + + With the help of @code{apply} (@pxref{Calling Functions}), we can append +all the lists in a list of lists: + +@example +@group +(apply 'append '((a b c) nil (x y z) nil)) + @result{} (a b c x y z) +@end group +@end example + + If no @var{sequences} are given, @code{nil} is returned: + +@example +@group +(append) + @result{} nil +@end group +@end example + + Here are some examples where the final argument is not a list: + +@example +(append '(x y) 'z) + @result{} (x y . z) +(append '(x y) [z]) + @result{} (x y . [z]) +@end example + +@noindent +The second example shows that when the final argument is a sequence but +not a list, the sequence's elements do not become elements of the +resulting list. Instead, the sequence becomes the final @sc{cdr}, like +any other non-list final argument. + +@defun reverse list +This function creates a new list whose elements are the elements of +@var{list}, but in reverse order. The original argument @var{list} is +@emph{not} altered. + +@example +@group +(setq x '(1 2 3 4)) + @result{} (1 2 3 4) +@end group +@group +(reverse x) + @result{} (4 3 2 1) +x + @result{} (1 2 3 4) +@end group +@end example +@end defun + +@defun copy-tree tree &optional vecp +This function returns a copy of the tree @code{tree}. If @var{tree} is a +cons cell, this makes a new cons cell with the same @sc{car} and +@sc{cdr}, then recursively copies the @sc{car} and @sc{cdr} in the +same way. + +Normally, when @var{tree} is anything other than a cons cell, +@code{copy-tree} simply returns @var{tree}. However, if @var{vecp} is +non-@code{nil}, it copies vectors too (and operates recursively on +their elements). +@end defun + +@defun number-sequence from &optional to separation +This returns a list of numbers starting with @var{from} and +incrementing by @var{separation}, and ending at or just before +@var{to}. @var{separation} can be positive or negative and defaults +to 1. If @var{to} is @code{nil} or numerically equal to @var{from}, +the value is the one-element list @code{(@var{from})}. If @var{to} is +less than @var{from} with a positive @var{separation}, or greater than +@var{from} with a negative @var{separation}, the value is @code{nil} +because those arguments specify an empty sequence. + +If @var{separation} is 0 and @var{to} is neither @code{nil} nor +numerically equal to @var{from}, @code{number-sequence} signals an +error, since those arguments specify an infinite sequence. + +All arguments can be integers or floating point numbers. However, +floating point arguments can be tricky, because floating point +arithmetic is inexact. For instance, depending on the machine, it may +quite well happen that @code{(number-sequence 0.4 0.6 0.2)} returns +the one element list @code{(0.4)}, whereas +@code{(number-sequence 0.4 0.8 0.2)} returns a list with three +elements. The @var{n}th element of the list is computed by the exact +formula @code{(+ @var{from} (* @var{n} @var{separation}))}. Thus, if +one wants to make sure that @var{to} is included in the list, one can +pass an expression of this exact type for @var{to}. Alternatively, +one can replace @var{to} with a slightly larger value (or a slightly +more negative value if @var{separation} is negative). + +Some examples: + +@example +(number-sequence 4 9) + @result{} (4 5 6 7 8 9) +(number-sequence 9 4 -1) + @result{} (9 8 7 6 5 4) +(number-sequence 9 4 -2) + @result{} (9 7 5) +(number-sequence 8) + @result{} (8) +(number-sequence 8 5) + @result{} nil +(number-sequence 5 8 -1) + @result{} nil +(number-sequence 1.5 6 2) + @result{} (1.5 3.5 5.5) +@end example +@end defun + +@node List Variables +@section Modifying List Variables + + These functions, and one macro, provide convenient ways +to modify a list which is stored in a variable. + +@defmac push newelt listname +This macro provides an alternative way to write +@code{(setq @var{listname} (cons @var{newelt} @var{listname}))}. + +@example +(setq l '(a b)) + @result{} (a b) +(push 'c l) + @result{} (c a b) +l + @result{} (c a b) +@end example +@end defmac + + Two functions modify lists that are the values of variables. + +@defun add-to-list symbol element &optional append compare-fn +This function sets the variable @var{symbol} by consing @var{element} +onto the old value, if @var{element} is not already a member of that +value. It returns the resulting list, whether updated or not. The +value of @var{symbol} had better be a list already before the call. +@code{add-to-list} uses @var{compare-fn} to compare @var{element} +against existing list members; if @var{compare-fn} is @code{nil}, it +uses @code{equal}. + +Normally, if @var{element} is added, it is added to the front of +@var{symbol}, but if the optional argument @var{append} is +non-@code{nil}, it is added at the end. + +The argument @var{symbol} is not implicitly quoted; @code{add-to-list} +is an ordinary function, like @code{set} and unlike @code{setq}. Quote +the argument yourself if that is what you want. +@end defun + +Here's a scenario showing how to use @code{add-to-list}: + +@example +(setq foo '(a b)) + @result{} (a b) + +(add-to-list 'foo 'c) ;; @r{Add @code{c}.} + @result{} (c a b) + +(add-to-list 'foo 'b) ;; @r{No effect.} + @result{} (c a b) + +foo ;; @r{@code{foo} was changed.} + @result{} (c a b) +@end example + + An equivalent expression for @code{(add-to-list '@var{var} +@var{value})} is this: + +@example +(or (member @var{value} @var{var}) + (setq @var{var} (cons @var{value} @var{var}))) +@end example + +@defun add-to-ordered-list symbol element &optional order +This function sets the variable @var{symbol} by inserting +@var{element} into the old value, which must be a list, at the +position specified by @var{order}. If @var{element} is already a +member of the list, its position in the list is adjusted according +to @var{order}. Membership is tested using @code{eq}. +This function returns the resulting list, whether updated or not. + +The @var{order} is typically a number (integer or float), and the +elements of the list are sorted in non-decreasing numerical order. + +@var{order} may also be omitted or @code{nil}. Then the numeric order +of @var{element} stays unchanged if it already has one; otherwise, +@var{element} has no numeric order. Elements without a numeric list +order are placed at the end of the list, in no particular order. + +Any other value for @var{order} removes the numeric order of @var{element} +if it already has one; otherwise, it is equivalent to @code{nil}. + +The argument @var{symbol} is not implicitly quoted; +@code{add-to-ordered-list} is an ordinary function, like @code{set} +and unlike @code{setq}. Quote the argument yourself if that is what +you want. + +The ordering information is stored in a hash table on @var{symbol}'s +@code{list-order} property. +@end defun + +Here's a scenario showing how to use @code{add-to-ordered-list}: + +@example +(setq foo '()) + @result{} nil + +(add-to-ordered-list 'foo 'a 1) ;; @r{Add @code{a}.} + @result{} (a) + +(add-to-ordered-list 'foo 'c 3) ;; @r{Add @code{c}.} + @result{} (a c) + +(add-to-ordered-list 'foo 'b 2) ;; @r{Add @code{b}.} + @result{} (a b c) + +(add-to-ordered-list 'foo 'b 4) ;; @r{Move @code{b}.} + @result{} (a c b) + +(add-to-ordered-list 'foo 'd) ;; @r{Append @code{d}.} + @result{} (a c b d) + +(add-to-ordered-list 'foo 'e) ;; @r{Add @code{e}}. + @result{} (a c b e d) + +foo ;; @r{@code{foo} was changed.} + @result{} (a c b e d) +@end example + +@node Modifying Lists +@section Modifying Existing List Structure +@cindex destructive list operations + + You can modify the @sc{car} and @sc{cdr} contents of a cons cell with the +primitives @code{setcar} and @code{setcdr}. We call these ``destructive'' +operations because they change existing list structure. + +@cindex CL note---@code{rplaca} vs @code{setcar} +@quotation +@findex rplaca +@findex rplacd +@b{Common Lisp note:} Common Lisp uses functions @code{rplaca} and +@code{rplacd} to alter list structure; they change structure the same +way as @code{setcar} and @code{setcdr}, but the Common Lisp functions +return the cons cell while @code{setcar} and @code{setcdr} return the +new @sc{car} or @sc{cdr}. +@end quotation + +@menu +* Setcar:: Replacing an element in a list. +* Setcdr:: Replacing part of the list backbone. + This can be used to remove or add elements. +* Rearrangement:: Reordering the elements in a list; combining lists. +@end menu + +@node Setcar +@subsection Altering List Elements with @code{setcar} + + Changing the @sc{car} of a cons cell is done with @code{setcar}. When +used on a list, @code{setcar} replaces one element of a list with a +different element. + +@defun setcar cons object +This function stores @var{object} as the new @sc{car} of @var{cons}, +replacing its previous @sc{car}. In other words, it changes the +@sc{car} slot of @var{cons} to refer to @var{object}. It returns the +value @var{object}. For example: + +@example +@group +(setq x '(1 2)) + @result{} (1 2) +@end group +@group +(setcar x 4) + @result{} 4 +@end group +@group +x + @result{} (4 2) +@end group +@end example +@end defun + + When a cons cell is part of the shared structure of several lists, +storing a new @sc{car} into the cons changes one element of each of +these lists. Here is an example: + +@example +@group +;; @r{Create two lists that are partly shared.} +(setq x1 '(a b c)) + @result{} (a b c) +(setq x2 (cons 'z (cdr x1))) + @result{} (z b c) +@end group + +@group +;; @r{Replace the @sc{car} of a shared link.} +(setcar (cdr x1) 'foo) + @result{} foo +x1 ; @r{Both lists are changed.} + @result{} (a foo c) +x2 + @result{} (z foo c) +@end group + +@group +;; @r{Replace the @sc{car} of a link that is not shared.} +(setcar x1 'baz) + @result{} baz +x1 ; @r{Only one list is changed.} + @result{} (baz foo c) +x2 + @result{} (z foo c) +@end group +@end example + + Here is a graphical depiction of the shared structure of the two lists +in the variables @code{x1} and @code{x2}, showing why replacing @code{b} +changes them both: + +@example +@group + --- --- --- --- --- --- +x1---> | | |----> | | |--> | | |--> nil + --- --- --- --- --- --- + | --> | | + | | | | + --> a | --> b --> c + | + --- --- | +x2--> | | |-- + --- --- + | + | + --> z +@end group +@end example + + Here is an alternative form of box diagram, showing the same relationship: + +@example +@group +x1: + -------------- -------------- -------------- +| car | cdr | | car | cdr | | car | cdr | +| a | o------->| b | o------->| c | nil | +| | | -->| | | | | | + -------------- | -------------- -------------- + | +x2: | + -------------- | +| car | cdr | | +| z | o---- +| | | + -------------- +@end group +@end example + +@node Setcdr +@subsection Altering the CDR of a List + + The lowest-level primitive for modifying a @sc{cdr} is @code{setcdr}: + +@defun setcdr cons object +This function stores @var{object} as the new @sc{cdr} of @var{cons}, +replacing its previous @sc{cdr}. In other words, it changes the +@sc{cdr} slot of @var{cons} to refer to @var{object}. It returns the +value @var{object}. +@end defun + + Here is an example of replacing the @sc{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 @sc{car} of the list, and is not +reached via the @sc{cdr}. + +@example +@group +(setq x '(1 2 3)) + @result{} (1 2 3) +@end group +@group +(setcdr x '(4)) + @result{} (4) +@end group +@group +x + @result{} (1 4) +@end group +@end example + + You can delete elements from the middle of a list by altering the +@sc{cdr}s of the cons cells in the list. For example, here we delete +the second element, @code{b}, from the list @code{(a b c)}, by changing +the @sc{cdr} of the first cons cell: + +@example +@group +(setq x1 '(a b c)) + @result{} (a b c) +(setcdr x1 (cdr (cdr x1))) + @result{} (c) +x1 + @result{} (a c) +@end group +@end example + + Here is the result in box notation: + +@smallexample +@group + -------------------- + | | + -------------- | -------------- | -------------- +| car | cdr | | | car | cdr | -->| car | cdr | +| a | o----- | b | o-------->| c | nil | +| | | | | | | | | + -------------- -------------- -------------- +@end group +@end smallexample + +@noindent +The second cons cell, which previously held the element @code{b}, still +exists and its @sc{car} is still @code{b}, but it no longer forms part +of this list. + + It is equally easy to insert a new element by changing @sc{cdr}s: + +@example +@group +(setq x1 '(a b c)) + @result{} (a b c) +(setcdr x1 (cons 'd (cdr x1))) + @result{} (d b c) +x1 + @result{} (a d b c) +@end group +@end example + + Here is this result in box notation: + +@smallexample +@group + -------------- ------------- ------------- +| car | cdr | | car | cdr | | car | cdr | +| a | o | -->| b | o------->| c | nil | +| | | | | | | | | | | + --------- | -- | ------------- ------------- + | | + ----- -------- + | | + | --------------- | + | | car | cdr | | + -->| d | o------ + | | | + --------------- +@end group +@end smallexample + +@node Rearrangement +@subsection Functions that Rearrange Lists +@cindex rearrangement of lists +@cindex modification of lists + + Here are some functions that rearrange lists ``destructively'' by +modifying the @sc{cdr}s of their component cons cells. We call these +functions ``destructive'' because they chew up the original lists passed +to them as arguments, relinking their cons cells to form a new list that +is the returned value. + +@ifnottex + See @code{delq}, in @ref{Sets And Lists}, for another function +that modifies cons cells. +@end ifnottex +@iftex + The function @code{delq} in the following section is another example +of destructive list manipulation. +@end iftex + +@defun nconc &rest lists +@cindex concatenating lists +@cindex joining lists +This function returns a list containing all the elements of @var{lists}. +Unlike @code{append} (@pxref{Building Lists}), the @var{lists} are +@emph{not} copied. Instead, the last @sc{cdr} of each of the +@var{lists} is changed to refer to the following list. The last of the +@var{lists} is not altered. For example: + +@example +@group +(setq x '(1 2 3)) + @result{} (1 2 3) +@end group +@group +(nconc x '(4 5)) + @result{} (1 2 3 4 5) +@end group +@group +x + @result{} (1 2 3 4 5) +@end group +@end example + + Since the last argument of @code{nconc} is not itself modified, it is +reasonable to use a constant list, such as @code{'(4 5)}, as in the +above example. For the same reason, the last argument need not be a +list: + +@example +@group +(setq x '(1 2 3)) + @result{} (1 2 3) +@end group +@group +(nconc x 'z) + @result{} (1 2 3 . z) +@end group +@group +x + @result{} (1 2 3 . z) +@end group +@end example + +However, the other arguments (all but the last) must be lists. + +A common pitfall is to use a quoted constant list as a non-last +argument to @code{nconc}. If you do this, your program will change +each time you run it! Here is what happens: + +@smallexample +@group +(defun add-foo (x) ; @r{We want this function to add} + (nconc '(foo) x)) ; @r{@code{foo} to the front of its arg.} +@end group + +@group +(symbol-function 'add-foo) + @result{} (lambda (x) (nconc (quote (foo)) x)) +@end group + +@group +(setq xx (add-foo '(1 2))) ; @r{It seems to work.} + @result{} (foo 1 2) +@end group +@group +(setq xy (add-foo '(3 4))) ; @r{What happened?} + @result{} (foo 1 2 3 4) +@end group +@group +(eq xx xy) + @result{} t +@end group + +@group +(symbol-function 'add-foo) + @result{} (lambda (x) (nconc (quote (foo 1 2 3 4) x))) +@end group +@end smallexample +@end defun + +@defun nreverse list +@cindex reversing a list + This function reverses the order of the elements of @var{list}. +Unlike @code{reverse}, @code{nreverse} alters its argument by reversing +the @sc{cdr}s in the cons cells forming the list. The cons cell that +used to be the last one in @var{list} becomes the first cons cell of the +value. + + For example: + +@example +@group +(setq x '(a b c)) + @result{} (a b c) +@end group +@group +x + @result{} (a b c) +(nreverse x) + @result{} (c b a) +@end group +@group +;; @r{The cons cell that was first is now last.} +x + @result{} (a) +@end group +@end example + + To avoid confusion, we usually store the result of @code{nreverse} +back in the same variable which held the original list: + +@example +(setq x (nreverse x)) +@end example + + Here is the @code{nreverse} of our favorite example, @code{(a b c)}, +presented graphically: + +@smallexample +@group +@r{Original list head:} @r{Reversed list:} + ------------- ------------- ------------ +| car | cdr | | car | cdr | | car | cdr | +| a | nil |<-- | b | o |<-- | c | o | +| | | | | | | | | | | | | + ------------- | --------- | - | -------- | - + | | | | + ------------- ------------ +@end group +@end smallexample +@end defun + +@defun sort list predicate +@cindex stable sort +@cindex sorting lists +This function sorts @var{list} stably, though destructively, and +returns the sorted list. It compares elements using @var{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 @var{predicate} must be a function that accepts two +arguments. It is called with two elements of @var{list}. To get an +increasing order sort, the @var{predicate} should return non-@code{nil} if the +first element is ``less than'' the second, or @code{nil} if not. + +The comparison function @var{predicate} must give reliable results for +any given pair of arguments, at least within a single call to +@code{sort}. It must be @dfn{antisymmetric}; that is, if @var{a} is +less than @var{b}, @var{b} must not be less than @var{a}. It must be +@dfn{transitive}---that is, if @var{a} is less than @var{b}, and @var{b} +is less than @var{c}, then @var{a} must be less than @var{c}. If you +use a comparison function which does not meet these requirements, the +result of @code{sort} is unpredictable. + +The destructive aspect of @code{sort} is that it rearranges the cons +cells forming @var{list} by changing @sc{cdr}s. A nondestructive sort +function would create new cons cells to store the elements in their +sorted order. If you wish to make a sorted copy without destroying the +original, copy it first with @code{copy-sequence} and then sort. + +Sorting does not change the @sc{car}s of the cons cells in @var{list}; +the cons cell that originally contained the element @code{a} in +@var{list} still has @code{a} in its @sc{car} after sorting, but it now +appears in a different position in the list due to the change of +@sc{cdr}s. For example: + +@example +@group +(setq nums '(1 3 2 6 5 4 0)) + @result{} (1 3 2 6 5 4 0) +@end group +@group +(sort nums '<) + @result{} (0 1 2 3 4 5 6) +@end group +@group +nums + @result{} (1 2 3 4 5 6) +@end group +@end example + +@noindent +@strong{Warning}: Note that the list in @code{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 @code{sort} and use that. Most often we store the result back into +the variable that held the original list: + +@example +(setq nums (sort nums '<)) +@end example + +@xref{Sorting}, for more functions that perform sorting. +See @code{documentation} in @ref{Accessing Documentation}, for a +useful example of @code{sort}. +@end defun + +@node Sets And Lists +@section Using Lists as Sets +@cindex lists as sets +@cindex 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 @code{append} (as +long as you don't mind having duplicate elements). You can remove +@code{equal} duplicates using @code{delete-dups}. Other useful +functions for sets include @code{memq} and @code{delq}, and their +@code{equal} versions, @code{member} and @code{delete}. + +@cindex CL note---lack @code{union}, @code{intersection} +@quotation +@b{Common Lisp note:} Common Lisp has functions @code{union} (which +avoids duplicate elements) and @code{intersection} for set operations, +but GNU Emacs Lisp does not have them. You can write them in Lisp if +you wish. +@end quotation + +@defun memq object list +@cindex membership in a list +This function tests to see whether @var{object} is a member of +@var{list}. If it is, @code{memq} returns a list starting with the +first occurrence of @var{object}. Otherwise, it returns @code{nil}. +The letter @samp{q} in @code{memq} says that it uses @code{eq} to +compare @var{object} against the elements of the list. For example: + +@example +@group +(memq 'b '(a b c b a)) + @result{} (b c b a) +@end group +@group +(memq '(2) '((1) (2))) ; @r{@code{(2)} and @code{(2)} are not @code{eq}.} + @result{} nil +@end group +@end example +@end defun + +@defun delq object list +@cindex deleting list elements +This function destructively removes all elements @code{eq} to +@var{object} from @var{list}. The letter @samp{q} in @code{delq} says +that it uses @code{eq} to compare @var{object} against the elements of +the list, like @code{memq} and @code{remq}. +@end defun + +When @code{delq} deletes elements from the front of the list, it does so +simply by advancing down the list and returning a sublist that starts +after those elements: + +@example +@group +(delq 'a '(a b c)) @equiv{} (cdr '(a b c)) +@end group +@end example + +When an element to be deleted appears in the middle of the list, +removing it involves changing the @sc{cdr}s (@pxref{Setcdr}). + +@example +@group +(setq sample-list '(a b c (4))) + @result{} (a b c (4)) +@end group +@group +(delq 'a sample-list) + @result{} (b c (4)) +@end group +@group +sample-list + @result{} (a b c (4)) +@end group +@group +(delq 'c sample-list) + @result{} (a b (4)) +@end group +@group +sample-list + @result{} (a b (4)) +@end group +@end example + +Note that @code{(delq 'c sample-list)} modifies @code{sample-list} to +splice out the third element, but @code{(delq 'a sample-list)} does not +splice anything---it just returns a shorter list. Don't assume that a +variable which formerly held the argument @var{list} now has fewer +elements, or that it still holds the original list! Instead, save the +result of @code{delq} and use that. Most often we store the result back +into the variable that held the original list: + +@example +(setq flowers (delq 'rose flowers)) +@end example + +In the following example, the @code{(4)} that @code{delq} attempts to match +and the @code{(4)} in the @code{sample-list} are not @code{eq}: + +@example +@group +(delq '(4) sample-list) + @result{} (a c (4)) +@end group + +If you want to delete elements that are @code{equal} to a given value, +use @code{delete} (see below). +@end example + +@defun remq object list +This function returns a copy of @var{list}, with all elements removed +which are @code{eq} to @var{object}. The letter @samp{q} in @code{remq} +says that it uses @code{eq} to compare @var{object} against the elements +of @code{list}. + +@example +@group +(setq sample-list '(a b c a b c)) + @result{} (a b c a b c) +@end group +@group +(remq 'a sample-list) + @result{} (b c b c) +@end group +@group +sample-list + @result{} (a b c a b c) +@end group +@end example +@end defun + +@defun memql object list +The function @code{memql} tests to see whether @var{object} is a member +of @var{list}, comparing members with @var{object} using @code{eql}, +so floating point elements are compared by value. +If @var{object} is a member, @code{memql} returns a list starting with +its first occurrence in @var{list}. Otherwise, it returns @code{nil}. + +Compare this with @code{memq}: + +@example +@group +(memql 1.2 '(1.1 1.2 1.3)) ; @r{@code{1.2} and @code{1.2} are @code{eql}.} + @result{} (1.2 1.3) +@end group +@group +(memq 1.2 '(1.1 1.2 1.3)) ; @r{@code{1.2} and @code{1.2} are not @code{eq}.} + @result{} nil +@end group +@end example +@end defun + +The following three functions are like @code{memq}, @code{delq} and +@code{remq}, but use @code{equal} rather than @code{eq} to compare +elements. @xref{Equality Predicates}. + +@defun member object list +The function @code{member} tests to see whether @var{object} is a member +of @var{list}, comparing members with @var{object} using @code{equal}. +If @var{object} is a member, @code{member} returns a list starting with +its first occurrence in @var{list}. Otherwise, it returns @code{nil}. + +Compare this with @code{memq}: + +@example +@group +(member '(2) '((1) (2))) ; @r{@code{(2)} and @code{(2)} are @code{equal}.} + @result{} ((2)) +@end group +@group +(memq '(2) '((1) (2))) ; @r{@code{(2)} and @code{(2)} are not @code{eq}.} + @result{} nil +@end group +@group +;; @r{Two strings with the same contents are @code{equal}.} +(member "foo" '("foo" "bar")) + @result{} ("foo" "bar") +@end group +@end example +@end defun + +@defun delete object sequence +If @code{sequence} is a list, this function destructively removes all +elements @code{equal} to @var{object} from @var{sequence}. For lists, +@code{delete} is to @code{delq} as @code{member} is to @code{memq}: it +uses @code{equal} to compare elements with @var{object}, like +@code{member}; when it finds an element that matches, it cuts the +element out just as @code{delq} would. + +If @code{sequence} is a vector or string, @code{delete} returns a copy +of @code{sequence} with all elements @code{equal} to @code{object} +removed. + +For example: + +@example +@group +(setq l '((2) (1) (2))) +(delete '(2) l) + @result{} ((1)) +l + @result{} ((2) (1)) +;; @r{If you want to change @code{l} reliably,} +;; @r{write @code{(setq l (delete elt l))}.} +@end group +@group +(setq l '((2) (1) (2))) +(delete '(1) l) + @result{} ((2) (2)) +l + @result{} ((2) (2)) +;; @r{In this case, it makes no difference whether you set @code{l},} +;; @r{but you should do so for the sake of the other case.} +@end group +@group +(delete '(2) [(2) (1) (2)]) + @result{} [(1)] +@end group +@end example +@end defun + +@defun remove object sequence +This function is the non-destructive counterpart of @code{delete}. It +returns a copy of @code{sequence}, a list, vector, or string, with +elements @code{equal} to @code{object} removed. For example: + +@example +@group +(remove '(2) '((2) (1) (2))) + @result{} ((1)) +@end group +@group +(remove '(2) [(2) (1) (2)]) + @result{} [(1)] +@end group +@end example +@end defun + +@quotation +@b{Common Lisp note:} The functions @code{member}, @code{delete} and +@code{remove} in GNU Emacs Lisp are derived from Maclisp, not Common +Lisp. The Common Lisp versions do not use @code{equal} to compare +elements. +@end quotation + +@defun member-ignore-case object list +This function is like @code{member}, except that @var{object} should +be a string and that it ignores differences in letter-case and text +representation: upper-case and lower-case letters are treated as +equal, and unibyte strings are converted to multibyte prior to +comparison. +@end defun + +@defun delete-dups list +This function destructively removes all @code{equal} duplicates from +@var{list}, stores the result in @var{list} and returns it. Of +several @code{equal} occurrences of an element in @var{list}, +@code{delete-dups} keeps the first one. +@end defun + + See also the function @code{add-to-list}, in @ref{List Variables}, +for a way to add an element to a list stored in a variable and used as a +set. + +@node Association Lists +@section Association Lists +@cindex association list +@cindex alist + + An @dfn{association list}, or @dfn{alist} for short, records a mapping +from keys to values. It is a list of cons cells called +@dfn{associations}: the @sc{car} of each cons cell is the @dfn{key}, and the +@sc{cdr} is the @dfn{associated value}.@footnote{This usage of ``key'' +is not related to the term ``key sequence''; it means a value used to +look up an item in a table. In this case, the table is the alist, and +the alist associations are the items.} + + Here is an example of an alist. The key @code{pine} is associated with +the value @code{cones}; the key @code{oak} is associated with +@code{acorns}; and the key @code{maple} is associated with @code{seeds}. + +@example +@group +((pine . cones) + (oak . acorns) + (maple . seeds)) +@end group +@end example + + Both the values and the keys in an alist may be any Lisp objects. +For example, in the following alist, the symbol @code{a} is +associated with the number @code{1}, and the string @code{"b"} is +associated with the @emph{list} @code{(2 3)}, which is the @sc{cdr} of +the alist element: + +@example +((a . 1) ("b" 2 3)) +@end example + + Sometimes it is better to design an alist to store the associated +value in the @sc{car} of the @sc{cdr} of the element. Here is an +example of such an alist: + +@example +((rose red) (lily white) (buttercup yellow)) +@end example + +@noindent +Here we regard @code{red} as the value associated with @code{rose}. One +advantage of this kind of alist is that you can store other related +information---even a list of other items---in the @sc{cdr} of the +@sc{cdr}. One disadvantage is that you cannot use @code{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. + + The same alist shown above could be regarded as having the +associated value in the @sc{cdr} of the element; the value associated +with @code{rose} would be the list @code{(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 @emph{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. @xref{Property Lists}, for a comparison +of property lists and association lists. + +@defun assoc key alist +This function returns the first association for @var{key} in +@var{alist}, comparing @var{key} against the alist elements using +@code{equal} (@pxref{Equality Predicates}). It returns @code{nil} if no +association in @var{alist} has a @sc{car} @code{equal} to @var{key}. +For example: + +@smallexample +(setq trees '((pine . cones) (oak . acorns) (maple . seeds))) + @result{} ((pine . cones) (oak . acorns) (maple . seeds)) +(assoc 'oak trees) + @result{} (oak . acorns) +(cdr (assoc 'oak trees)) + @result{} acorns +(assoc 'birch trees) + @result{} nil +@end smallexample + +Here is another example, in which the keys and values are not symbols: + +@smallexample +(setq needles-per-cluster + '((2 "Austrian Pine" "Red Pine") + (3 "Pitch Pine") + (5 "White Pine"))) + +(cdr (assoc 3 needles-per-cluster)) + @result{} ("Pitch Pine") +(cdr (assoc 2 needles-per-cluster)) + @result{} ("Austrian Pine" "Red Pine") +@end smallexample +@end defun + + The function @code{assoc-string} is much like @code{assoc} except +that it ignores certain differences between strings. @xref{Text +Comparison}. + +@defun rassoc value alist +This function returns the first association with value @var{value} in +@var{alist}. It returns @code{nil} if no association in @var{alist} has +a @sc{cdr} @code{equal} to @var{value}. + +@code{rassoc} is like @code{assoc} except that it compares the @sc{cdr} of +each @var{alist} association instead of the @sc{car}. You can think of +this as ``reverse @code{assoc},'' finding the key for a given value. +@end defun + +@defun assq key alist +This function is like @code{assoc} in that it returns the first +association for @var{key} in @var{alist}, but it makes the comparison +using @code{eq} instead of @code{equal}. @code{assq} returns @code{nil} +if no association in @var{alist} has a @sc{car} @code{eq} to @var{key}. +This function is used more often than @code{assoc}, since @code{eq} is +faster than @code{equal} and most alists use symbols as keys. +@xref{Equality Predicates}. + +@smallexample +(setq trees '((pine . cones) (oak . acorns) (maple . seeds))) + @result{} ((pine . cones) (oak . acorns) (maple . seeds)) +(assq 'pine trees) + @result{} (pine . cones) +@end smallexample + +On the other hand, @code{assq} is not usually useful in alists where the +keys may not be symbols: + +@smallexample +(setq leaves + '(("simple leaves" . oak) + ("compound leaves" . horsechestnut))) + +(assq "simple leaves" leaves) + @result{} nil +(assoc "simple leaves" leaves) + @result{} ("simple leaves" . oak) +@end smallexample +@end defun + +@defun rassq value alist +This function returns the first association with value @var{value} in +@var{alist}. It returns @code{nil} if no association in @var{alist} has +a @sc{cdr} @code{eq} to @var{value}. + +@code{rassq} is like @code{assq} except that it compares the @sc{cdr} of +each @var{alist} association instead of the @sc{car}. You can think of +this as ``reverse @code{assq},'' finding the key for a given value. + +For example: + +@smallexample +(setq trees '((pine . cones) (oak . acorns) (maple . seeds))) + +(rassq 'acorns trees) + @result{} (oak . acorns) +(rassq 'spores trees) + @result{} nil +@end smallexample + +@code{rassq} cannot search for a value stored in the @sc{car} +of the @sc{cdr} of an element: + +@smallexample +(setq colors '((rose red) (lily white) (buttercup yellow))) + +(rassq 'white colors) + @result{} nil +@end smallexample + +In this case, the @sc{cdr} of the association @code{(lily white)} is not +the symbol @code{white}, but rather the list @code{(white)}. This +becomes clearer if the association is written in dotted pair notation: + +@smallexample +(lily white) @equiv{} (lily . (white)) +@end smallexample +@end defun + +@defun assoc-default key alist &optional test default +This function searches @var{alist} for a match for @var{key}. For each +element of @var{alist}, it compares the element (if it is an atom) or +the element's @sc{car} (if it is a cons) against @var{key}, by calling +@var{test} with two arguments: the element or its @sc{car}, and +@var{key}. The arguments are passed in that order so that you can get +useful results using @code{string-match} with an alist that contains +regular expressions (@pxref{Regexp Search}). If @var{test} is omitted +or @code{nil}, @code{equal} is used for comparison. + +If an alist element matches @var{key} by this criterion, +then @code{assoc-default} returns a value based on this element. +If the element is a cons, then the value is the element's @sc{cdr}. +Otherwise, the return value is @var{default}. + +If no alist element matches @var{key}, @code{assoc-default} returns +@code{nil}. +@end defun + +@defun copy-alist alist +@cindex copying alists +This function returns a two-level deep copy of @var{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. + +@smallexample +@group +(setq needles-per-cluster + '((2 . ("Austrian Pine" "Red Pine")) + (3 . ("Pitch Pine")) +@end group + (5 . ("White Pine")))) +@result{} +((2 "Austrian Pine" "Red Pine") + (3 "Pitch Pine") + (5 "White Pine")) + +(setq copy (copy-alist needles-per-cluster)) +@result{} +((2 "Austrian Pine" "Red Pine") + (3 "Pitch Pine") + (5 "White Pine")) + +(eq needles-per-cluster copy) + @result{} nil +(equal needles-per-cluster copy) + @result{} t +(eq (car needles-per-cluster) (car copy)) + @result{} nil +(cdr (car (cdr needles-per-cluster))) + @result{} ("Pitch Pine") +@group +(eq (cdr (car (cdr needles-per-cluster))) + (cdr (car (cdr copy)))) + @result{} t +@end group +@end smallexample + + This example shows how @code{copy-alist} makes it possible to change +the associations of one copy without affecting the other: + +@smallexample +@group +(setcdr (assq 3 copy) '("Martian Vacuum Pine")) +(cdr (assq 3 needles-per-cluster)) + @result{} ("Pitch Pine") +@end group +@end smallexample +@end defun + +@defun assq-delete-all key alist +This function deletes from @var{alist} all the elements whose @sc{car} +is @code{eq} to @var{key}, much as if you used @code{delq} to delete +each such element one by one. It returns the shortened alist, and +often modifies the original list structure of @var{alist}. For +correct results, use the return value of @code{assq-delete-all} rather +than looking at the saved value of @var{alist}. + +@example +(setq alist '((foo 1) (bar 2) (foo 3) (lose 4))) + @result{} ((foo 1) (bar 2) (foo 3) (lose 4)) +(assq-delete-all 'foo alist) + @result{} ((bar 2) (lose 4)) +alist + @result{} ((foo 1) (bar 2) (lose 4)) +@end example +@end defun + +@defun rassq-delete-all value alist +This function deletes from @var{alist} all the elements whose @sc{cdr} +is @code{eq} to @var{value}. It returns the shortened alist, and +often modifies the original list structure of @var{alist}. +@code{rassq-delete-all} is like @code{assq-delete-all} except that it +compares the @sc{cdr} of each @var{alist} association instead of the +@sc{car}. +@end defun + +@node Rings +@section Managing a Fixed-Size Ring of Objects + +@cindex ring data structure + This section describes functions for operating on rings. A +@dfn{ring} is a fixed-size data structure that supports insertion, +deletion, rotation, and modulo-indexed reference and traversal. + +@defun make-ring size +This returns a new ring capable of holding @var{size} objects. +@var{size} should be an integer. +@end defun + +@defun ring-p object +This returns @code{t} if @var{object} is a ring, @code{nil} otherwise. +@end defun + +@defun ring-size ring +This returns the maximum capacity of the @var{ring}. +@end defun + +@defun ring-length ring +This returns the number of objects that @var{ring} currently contains. +The value will never exceed that returned by @code{ring-size}. +@end defun + +@defun ring-elements ring +This returns a list of the objects in @var{ring}, in order, newest first. +@end defun + +@defun ring-copy ring +This returns a new ring which is a copy of @var{ring}. +The new ring contains the same (@code{eq}) objects as @var{ring}. +@end defun + +@defun ring-empty-p ring +This returns @code{t} if @var{ring} is empty, @code{nil} otherwise. +@end defun + + The newest element in the ring always has index 0. Higher indices +correspond to older elements. Indices are computed modulo the ring +length. Index @minus{}1 corresponds to the oldest element, @minus{}2 +to the next-oldest, and so forth. + +@defun ring-ref ring index +This returns the object in @var{ring} found at index @var{index}. +@var{index} may be negative or greater than the ring length. If +@var{ring} is empty, @code{ring-ref} signals an error. +@end defun + +@defun ring-insert ring object +This inserts @var{object} into @var{ring}, making it the newest +element, and returns @var{object}. + +If the ring is full, insertion removes the oldest element to +make room for the new element. +@end defun + +@defun ring-remove ring &optional index +Remove an object from @var{ring}, and return that object. The +argument @var{index} specifies which item to remove; if it is +@code{nil}, that means to remove the oldest item. If @var{ring} is +empty, @code{ring-remove} signals an error. +@end defun + +@defun ring-insert-at-beginning ring object +This inserts @var{object} into @var{ring}, treating it as the oldest +element. The return value is not significant. + +If the ring is full, this function removes the newest element to make +room for the inserted element. +@end defun + +@cindex fifo data structure + If you are careful not to exceed the ring size, you can +use the ring as a first-in-first-out queue. For example: + +@lisp +(let ((fifo (make-ring 5))) + (mapc (lambda (obj) (ring-insert fifo obj)) + '(0 one "two")) + (list (ring-remove fifo) t + (ring-remove fifo) t + (ring-remove fifo))) + @result{} (0 t one t "two") +@end lisp + +@ignore + arch-tag: 31fb8a4e-4aa8-4a74-a206-aa00451394d4 +@end ignore diff --git a/doc/lispref/loading.texi b/doc/lispref/loading.texi new file mode 100644 index 00000000000..058ed9c8984 --- /dev/null +++ b/doc/lispref/loading.texi @@ -0,0 +1,968 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/loading +@node Loading, Byte Compilation, Customization, Top +@chapter Loading +@cindex loading +@cindex library +@cindex Lisp library + + 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 @code{eval-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. + +@cindex top-level form + The loaded file must contain Lisp expressions, either as source code +or as byte-compiled code. Each form in the file is called a +@dfn{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 @dfn{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. + +@menu +* How Programs Do Loading:: The @code{load} function and others. +* Load Suffixes:: Details about the suffixes that @code{load} tries. +* Library Search:: Finding a library to load. +* Loading Non-ASCII:: Non-@acronym{ASCII} characters in Emacs Lisp files. +* Autoload:: Setting up a function to autoload. +* Repeated Loading:: Precautions about loading a file twice. +* Named Features:: Loading a library if it isn't already loaded. +* Where Defined:: Finding which file defined a certain symbol. +* Unloading:: How to "unload" a library that was loaded. +* Hooks for Loading:: Providing code to be run when + particular libraries are loaded. +@end menu + +@node How Programs Do Loading +@section How Programs Do Loading + + Emacs Lisp has several interfaces for loading. For example, +@code{autoload} creates a placeholder object for a function defined in a +file; trying to call the autoloading function loads the file to get the +function's real definition (@pxref{Autoload}). @code{require} loads a +file if it isn't already loaded (@pxref{Named Features}). Ultimately, +all these facilities call the @code{load} function to do the work. + +@defun load filename &optional missing-ok nomessage nosuffix must-suffix +This function finds and opens a file of Lisp code, evaluates all the +forms in it, and closes the file. + +To find the file, @code{load} first looks for a file named +@file{@var{filename}.elc}, that is, for a file whose name is +@var{filename} with the extension @samp{.elc} appended. If such a +file exists, it is loaded. If there is no file by that name, then +@code{load} looks for a file named @file{@var{filename}.el}. If that +file exists, it is loaded. Finally, if neither of those names is +found, @code{load} looks for a file named @var{filename} with nothing +appended, and loads it if it exists. (The @code{load} function is not +clever about looking at @var{filename}. In the perverse case of a +file named @file{foo.el.el}, evaluation of @code{(load "foo.el")} will +indeed find it.) + +If Auto Compression mode is enabled, as it is by default, then if +@code{load} can not find a file, it searches for a compressed version +of the file before trying other file names. It decompresses and loads +it if it exists. It looks for compressed versions by appending each +of the suffixes in @code{jka-compr-load-suffixes} to the file name. +The value of this variable must be a list of strings. Its standard +value is @code{(".gz")}. + +If the optional argument @var{nosuffix} is non-@code{nil}, then +@code{load} does not try the suffixes @samp{.elc} and @samp{.el}. In +this case, you must specify the precise file name you want, except +that, if Auto Compression mode is enabled, @code{load} will still use +@code{jka-compr-load-suffixes} to find compressed versions. By +specifying the precise file name and using @code{t} for +@var{nosuffix}, you can prevent perverse file names such as +@file{foo.el.el} from being tried. + +If the optional argument @var{must-suffix} is non-@code{nil}, then +@code{load} insists that the file name used must end in either +@samp{.el} or @samp{.elc} (possibly extended with a compression +suffix), unless it contains an explicit directory name. + +If @var{filename} is a relative file name, such as @file{foo} or +@file{baz/foo.bar}, @code{load} searches for the file using the variable +@code{load-path}. It appends @var{filename} to each of the directories +listed in @code{load-path}, and loads the first file it finds whose name +matches. The current default directory is tried only if it is specified +in @code{load-path}, where @code{nil} stands for the default directory. +@code{load} tries all three possible suffixes in the first directory in +@code{load-path}, then all three suffixes in the second directory, and +so on. @xref{Library Search}. + +If you get a warning that @file{foo.elc} is older than @file{foo.el}, it +means you should consider recompiling @file{foo.el}. @xref{Byte +Compilation}. + +When loading a source file (not compiled), @code{load} performs +character set translation just as Emacs would do when visiting the file. +@xref{Coding Systems}. + +Messages like @samp{Loading foo...} and @samp{Loading foo...done} appear +in the echo area during loading unless @var{nomessage} is +non-@code{nil}. + +@cindex load errors +Any unhandled errors while loading a file terminate loading. If the +load was done for the sake of @code{autoload}, any function definitions +made during the loading are undone. + +@kindex file-error +If @code{load} can't find the file to load, then normally it signals the +error @code{file-error} (with @samp{Cannot open load file +@var{filename}}). But if @var{missing-ok} is non-@code{nil}, then +@code{load} just returns @code{nil}. + +You can use the variable @code{load-read-function} to specify a function +for @code{load} to use instead of @code{read} for reading expressions. +See below. + +@code{load} returns @code{t} if the file loads successfully. +@end defun + +@deffn Command load-file filename +This command loads the file @var{filename}. If @var{filename} is a +relative file name, then the current default directory is assumed. +This command does not use @code{load-path}, and does not append +suffixes. However, it does look for compressed versions (if Auto +Compression Mode is enabled). Use this command if you wish to specify +precisely the file name to load. +@end deffn + +@deffn Command load-library library +This command loads the library named @var{library}. It is equivalent to +@code{load}, except in how it reads its argument interactively. +@end deffn + +@defvar load-in-progress +This variable is non-@code{nil} if Emacs is in the process of loading a +file, and it is @code{nil} otherwise. +@end defvar + +@defvar load-read-function +@anchor{Definition of load-read-function} +@c do not allow page break at anchor; work around Texinfo deficiency. +This variable specifies an alternate expression-reading function for +@code{load} and @code{eval-region} to use instead of @code{read}. +The function should accept one argument, just as @code{read} does. + +Normally, the variable's value is @code{nil}, which means those +functions should use @code{read}. + +Instead of using this variable, it is cleaner to use another, newer +feature: to pass the function as the @var{read-function} argument to +@code{eval-region}. @xref{Definition of eval-region,, Eval}. +@end defvar + + For information about how @code{load} is used in building Emacs, see +@ref{Building Emacs}. + +@node Load Suffixes +@section Load Suffixes +We now describe some technical details about the exact suffixes that +@code{load} tries. + +@defvar load-suffixes +This is a list of suffixes indicating (compiled or source) Emacs Lisp +files. It should not include the empty string. @code{load} uses +these suffixes in order when it appends Lisp suffixes to the specified +file name. The standard value is @code{(".elc" ".el")} which produces +the behavior described in the previous section. +@end defvar + +@defvar load-file-rep-suffixes +This is a list of suffixes that indicate representations of the same +file. This list should normally start with the empty string. +When @code{load} searches for a file it appends the suffixes in this +list, in order, to the file name, before searching for another file. + +Enabling Auto Compression mode appends the suffixes in +@code{jka-compr-load-suffixes} to this list and disabling Auto +Compression mode removes them again. The standard value of +@code{load-file-rep-suffixes} if Auto Compression mode is disabled is +@code{("")}. Given that the standard value of +@code{jka-compr-load-suffixes} is @code{(".gz")}, the standard value +of @code{load-file-rep-suffixes} if Auto Compression mode is enabled +is @code{("" ".gz")}. +@end defvar + +@defun get-load-suffixes +This function returns the list of all suffixes that @code{load} should +try, in order, when its @var{must-suffix} argument is non-@code{nil}. +This takes both @code{load-suffixes} and @code{load-file-rep-suffixes} +into account. If @code{load-suffixes}, @code{jka-compr-load-suffixes} +and @code{load-file-rep-suffixes} all have their standard values, this +function returns @code{(".elc" ".elc.gz" ".el" ".el.gz")} if Auto +Compression mode is enabled and @code{(".elc" ".el")} if Auto +Compression mode is disabled. +@end defun + +To summarize, @code{load} normally first tries the suffixes in the +value of @code{(get-load-suffixes)} and then those in +@code{load-file-rep-suffixes}. If @var{nosuffix} is non-@code{nil}, +it skips the former group, and if @var{must-suffix} is non-@code{nil}, +it skips the latter group. + +@node Library Search +@section Library Search +@cindex library search +@cindex find library + + When Emacs loads a Lisp library, it searches for the library +in a list of directories specified by the variable @code{load-path}. + +@defopt load-path +@cindex @code{EMACSLOADPATH} environment variable +The value of this variable is a list of directories to search when +loading files with @code{load}. Each element is a string (which must be +a directory name) or @code{nil} (which stands for the current working +directory). +@end defopt + + The value of @code{load-path} is initialized from the environment +variable @code{EMACSLOADPATH}, if that exists; otherwise its default +value is specified in @file{emacs/src/epaths.h} when Emacs is built. +Then the list is expanded by adding subdirectories of the directories +in the list. + + The syntax of @code{EMACSLOADPATH} is the same as used for @code{PATH}; +@samp{:} (or @samp{;}, according to the operating system) separates +directory names, and @samp{.} is used for the current default directory. +Here is an example of how to set your @code{EMACSLOADPATH} variable from +a @code{csh} @file{.login} file: + +@smallexample +setenv EMACSLOADPATH .:/user/bil/emacs:/usr/local/share/emacs/20.3/lisp +@end smallexample + + Here is how to set it using @code{sh}: + +@smallexample +export EMACSLOADPATH +EMACSLOADPATH=.:/user/bil/emacs:/usr/local/share/emacs/20.3/lisp +@end smallexample + + Here is an example of code you can place in your init file (@pxref{Init +File}) to add several directories to the front of your default +@code{load-path}: + +@smallexample +@group +(setq load-path + (append (list nil "/user/bil/emacs" + "/usr/local/lisplib" + "~/emacs") + load-path)) +@end group +@end smallexample + +@c Wordy to rid us of an overfull hbox. --rjc 15mar92 +@noindent +In this example, the path searches the current working directory first, +followed then by the @file{/user/bil/emacs} directory, the +@file{/usr/local/lisplib} directory, and the @file{~/emacs} directory, +which are then followed by the standard directories for Lisp code. + + Dumping Emacs uses a special value of @code{load-path}. If the value of +@code{load-path} at the end of dumping is unchanged (that is, still the +same special value), the dumped Emacs switches to the ordinary +@code{load-path} value when it starts up, as described above. But if +@code{load-path} has any other value at the end of dumping, that value +is used for execution of the dumped Emacs also. + + Therefore, if you want to change @code{load-path} temporarily for +loading a few libraries in @file{site-init.el} or @file{site-load.el}, +you should bind @code{load-path} locally with @code{let} around the +calls to @code{load}. + + The default value of @code{load-path}, when running an Emacs which has +been installed on the system, includes two special directories (and +their subdirectories as well): + +@smallexample +"/usr/local/share/emacs/@var{version}/site-lisp" +@end smallexample + +@noindent +and + +@smallexample +"/usr/local/share/emacs/site-lisp" +@end smallexample + +@noindent +The first one is for locally installed packages for a particular Emacs +version; the second is for locally installed packages meant for use with +all installed Emacs versions. + + There are several reasons why a Lisp package that works well in one +Emacs version can cause trouble in another. Sometimes packages need +updating for incompatible changes in Emacs; sometimes they depend on +undocumented internal Emacs data that can change without notice; +sometimes a newer Emacs version incorporates a version of the package, +and should be used only with that version. + + Emacs finds these directories' subdirectories and adds them to +@code{load-path} when it starts up. Both immediate subdirectories and +subdirectories multiple levels down are added to @code{load-path}. + + Not all subdirectories are included, though. Subdirectories whose +names do not start with a letter or digit are excluded. Subdirectories +named @file{RCS} or @file{CVS} are excluded. Also, a subdirectory which +contains a file named @file{.nosearch} is excluded. You can use these +methods to prevent certain subdirectories of the @file{site-lisp} +directories from being searched. + + If you run Emacs from the directory where it was built---that is, an +executable that has not been formally installed---then @code{load-path} +normally contains two additional directories. These are the @code{lisp} +and @code{site-lisp} subdirectories of the main build directory. (Both +are represented as absolute file names.) + +@deffn Command locate-library library &optional nosuffix path interactive-call +This command finds the precise file name for library @var{library}. It +searches for the library in the same way @code{load} does, and the +argument @var{nosuffix} has the same meaning as in @code{load}: don't +add suffixes @samp{.elc} or @samp{.el} to the specified name +@var{library}. + +If the @var{path} is non-@code{nil}, that list of directories is used +instead of @code{load-path}. + +When @code{locate-library} is called from a program, it returns the file +name as a string. When the user runs @code{locate-library} +interactively, the argument @var{interactive-call} is @code{t}, and this +tells @code{locate-library} to display the file name in the echo area. +@end deffn + +@node Loading Non-ASCII +@section Loading Non-@acronym{ASCII} Characters + + When Emacs Lisp programs contain string constants with non-@acronym{ASCII} +characters, these can be represented within Emacs either as unibyte +strings or as multibyte strings (@pxref{Text Representations}). Which +representation is used depends on how the file is read into Emacs. If +it is read with decoding into multibyte representation, the text of the +Lisp program will be multibyte text, and its string constants will be +multibyte strings. If a file containing Latin-1 characters (for +example) is read without decoding, the text of the program will be +unibyte text, and its string constants will be unibyte strings. +@xref{Coding Systems}. + + To make the results more predictable, Emacs always performs decoding +into the multibyte representation when loading Lisp files, even if it +was started with the @samp{--unibyte} option. This means that string +constants with non-@acronym{ASCII} characters translate into multibyte +strings. The only exception is when a particular file specifies no +decoding. + + The reason Emacs is designed this way is so that Lisp programs give +predictable results, regardless of how Emacs was started. In addition, +this enables programs that depend on using multibyte text to work even +in a unibyte Emacs. Of course, such programs should be designed to +notice whether the user prefers unibyte or multibyte text, by checking +@code{default-enable-multibyte-characters}, and convert representations +appropriately. + + In most Emacs Lisp programs, the fact that non-@acronym{ASCII} strings are +multibyte strings should not be noticeable, since inserting them in +unibyte buffers converts them to unibyte automatically. However, if +this does make a difference, you can force a particular Lisp file to be +interpreted as unibyte by writing @samp{-*-unibyte: t;-*-} in a +comment on the file's first line. With that designator, the file will +unconditionally be interpreted as unibyte, even in an ordinary +multibyte Emacs session. This can matter when making keybindings to +non-@acronym{ASCII} characters written as @code{?v@var{literal}}. + +@node Autoload +@section Autoload +@cindex autoload + + The @dfn{autoload} facility allows you to make a function or macro +known in Lisp, but put off loading the file that defines it. The first +call to the function automatically reads the proper file to install the +real definition and other associated code, then runs the real definition +as if it had been loaded all along. + + There are two ways to set up an autoloaded function: by calling +@code{autoload}, and by writing a special ``magic'' comment in the +source before the real definition. @code{autoload} is the low-level +primitive for autoloading; any Lisp program can call @code{autoload} at +any time. Magic comments are the most convenient way to make a function +autoload, for packages installed along with Emacs. These comments do +nothing on their own, but they serve as a guide for the command +@code{update-file-autoloads}, which constructs calls to @code{autoload} +and arranges to execute them when Emacs is built. + +@defun autoload function filename &optional docstring interactive type +This function defines the function (or macro) named @var{function} so as +to load automatically from @var{filename}. The string @var{filename} +specifies the file to load to get the real definition of @var{function}. + +If @var{filename} does not contain either a directory name, or the +suffix @code{.el} or @code{.elc}, then @code{autoload} insists on adding +one of these suffixes, and it will not load from a file whose name is +just @var{filename} with no added suffix. (The variable +@code{load-suffixes} specifies the exact required suffixes.) + +The argument @var{docstring} is the documentation string for the +function. Specifying the documentation string in the call to +@code{autoload} makes it possible to look at the documentation without +loading the function's real definition. Normally, this should be +identical to the documentation string in the function definition +itself. If it isn't, the function definition's documentation string +takes effect when it is loaded. + +If @var{interactive} is non-@code{nil}, that says @var{function} can be +called interactively. This lets completion in @kbd{M-x} work without +loading @var{function}'s real definition. The complete interactive +specification is not given here; it's not needed unless the user +actually calls @var{function}, and when that happens, it's time to load +the real definition. + +You can autoload macros and keymaps as well as ordinary functions. +Specify @var{type} as @code{macro} if @var{function} is really a macro. +Specify @var{type} as @code{keymap} if @var{function} is really a +keymap. Various parts of Emacs need to know this information without +loading the real definition. + +An autoloaded keymap loads automatically during key lookup when a prefix +key's binding is the symbol @var{function}. Autoloading does not occur +for other kinds of access to the keymap. In particular, it does not +happen when a Lisp program gets the keymap from the value of a variable +and calls @code{define-key}; not even if the variable name is the same +symbol @var{function}. + +@cindex function cell in autoload +If @var{function} already has a non-void function definition that is not +an autoload object, @code{autoload} does nothing and returns @code{nil}. +If the function cell of @var{function} is void, or is already an autoload +object, then it is defined as an autoload object like this: + +@example +(autoload @var{filename} @var{docstring} @var{interactive} @var{type}) +@end example + +For example, + +@example +@group +(symbol-function 'run-prolog) + @result{} (autoload "prolog" 169681 t nil) +@end group +@end example + +@noindent +In this case, @code{"prolog"} is the name of the file to load, 169681 +refers to the documentation string in the +@file{emacs/etc/DOC-@var{version}} file (@pxref{Documentation Basics}), +@code{t} means the function is interactive, and @code{nil} that it is +not a macro or a keymap. +@end defun + +@cindex autoload errors + The autoloaded file usually contains 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 its contents), any function +definitions or @code{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 be defined by the +aborted load, but fail to work properly for the lack of certain +subroutines not loaded successfully because they come later in the file. + + If the autoloaded file fails to define the desired Lisp function or +macro, then an error is signaled with data @code{"Autoloading failed to +define function @var{function-name}"}. + +@findex update-file-autoloads +@findex update-directory-autoloads +@cindex magic autoload comment +@cindex autoload cookie +@anchor{autoload cookie} + A magic autoload comment (often called an @dfn{autoload cookie}) +consists of @samp{;;;###autoload}, on a line by itself, +just before the real definition of the function in its +autoloadable source file. The command @kbd{M-x update-file-autoloads} +writes a corresponding @code{autoload} call into @file{loaddefs.el}. +Building Emacs loads @file{loaddefs.el} and thus calls @code{autoload}. +@kbd{M-x update-directory-autoloads} is even more powerful; it updates +autoloads for all files in the current directory. + + The same magic comment can copy any kind of form into +@file{loaddefs.el}. If the form following the magic comment is not a +function-defining form or a @code{defcustom} form, it is copied +verbatim. ``Function-defining forms'' include @code{define-skeleton}, +@code{define-derived-mode}, @code{define-generic-mode} and +@code{define-minor-mode} as well as @code{defun} and +@code{defmacro}. To save space, a @code{defcustom} form is converted to +a @code{defvar} in @file{loaddefs.el}, with some additional information +if it uses @code{:require}. + + You can also use a magic comment to execute a form at build time +@emph{without} executing it when the file itself is loaded. To do this, +write the form @emph{on the same line} as the magic comment. Since it +is in a comment, it does nothing when you load the source file; but +@kbd{M-x update-file-autoloads} copies it to @file{loaddefs.el}, where +it is executed while building Emacs. + + The following example shows how @code{doctor} is prepared for +autoloading with a magic comment: + +@smallexample +;;;###autoload +(defun doctor () + "Switch to *doctor* buffer and start giving psychotherapy." + (interactive) + (switch-to-buffer "*doctor*") + (doctor-mode)) +@end smallexample + +@noindent +Here's what that produces in @file{loaddefs.el}: + +@smallexample +(autoload (quote doctor) "doctor" "\ +Switch to *doctor* buffer and start giving psychotherapy. + +\(fn)" t nil) +@end smallexample + +@noindent +@cindex @code{fn} in function's documentation string +The backslash and newline immediately following the double-quote are a +convention used only in the preloaded uncompiled Lisp files such as +@file{loaddefs.el}; they tell @code{make-docfile} to put the +documentation string in the @file{etc/DOC} file. @xref{Building Emacs}. +See also the commentary in @file{lib-src/make-docfile.c}. @samp{(fn)} +in the usage part of the documentation string is replaced with the +function's name when the various help functions (@pxref{Help +Functions}) display it. + + If you write a function definition with an unusual macro that is not +one of the known and recognized function definition methods, use of an +ordinary magic autoload comment would copy the whole definition into +@code{loaddefs.el}. That is not desirable. You can put the desired +@code{autoload} call into @code{loaddefs.el} instead by writing this: + +@smallexample +;;;###autoload (autoload 'foo "myfile") +(mydefunmacro foo + ...) +@end smallexample + +@node Repeated Loading +@section Repeated Loading +@cindex repeated loading + + You can load a given 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 it came from. + + When you load or reload files, bear in mind that the @code{load} and +@code{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, you need to byte-compile the new +version; otherwise Emacs will load the older, byte-compiled file instead +of your newer, non-compiled file! If that happens, the message +displayed when loading the file includes, @samp{(compiled; note, source is +newer)}, to remind you to recompile it. + + When writing the forms in a Lisp library file, keep in mind that the +file might be loaded more than once. For example, think about whether +each variable should be reinitialized when you reload the library; +@code{defvar} does not change the value if the variable is already +initialized. (@xref{Defining Variables}.) + + The simplest way to add an element to an alist is like this: + +@example +(push '(leif-mode " Leif") minor-mode-alist) +@end example + +@noindent +But this would add multiple elements if the library is reloaded. +To avoid the problem, write this: + +@example +(or (assq 'leif-mode minor-mode-alist) + (push '(leif-mode " Leif") minor-mode-alist)) +@end example + +@noindent +or this: + +@example +(add-to-list '(leif-mode " Leif") minor-mode-alist) +@end example + + Occasionally you will want to test explicitly whether a library has +already been loaded. Here's one way to test, in a library, whether it +has been loaded before: + +@example +(defvar foo-was-loaded nil) + +(unless foo-was-loaded + @var{execute-first-time-only} + (setq foo-was-loaded t)) +@end example + +@noindent +If the library uses @code{provide} to provide a named feature, you can +use @code{featurep} earlier in the file to test whether the +@code{provide} call has been executed before. +@ifnottex +@xref{Named Features}. +@end ifnottex + +@node Named Features +@section Features +@cindex features +@cindex requiring features +@cindex providing features + + @code{provide} and @code{require} are an alternative to +@code{autoload} for loading files automatically. They work in terms of +named @dfn{features}. Autoloading is triggered by calling a specific +function, but a feature is loaded the first time another program asks +for it by name. + + A feature name is a symbol that stands for a collection of functions, +variables, etc. The file that defines them should @dfn{provide} the +feature. Another program that uses them may ensure they are defined by +@dfn{requiring} the feature. This loads the file of definitions if it +hasn't been loaded already. + + To require the presence of a feature, call @code{require} with the +feature name as argument. @code{require} looks in the global variable +@code{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 @code{provide} at the top level to add the feature to +@code{features}; if it fails to do so, @code{require} signals an error. +@cindex load error with require + + For example, in @file{emacs/lisp/prolog.el}, +the definition for @code{run-prolog} includes the following code: + +@smallexample +(defun run-prolog () + "Run an inferior Prolog process, with I/O via buffer *prolog*." + (interactive) + (require 'comint) + (switch-to-buffer (make-comint "prolog" prolog-program-name)) + (inferior-prolog-mode)) +@end smallexample + +@noindent +The expression @code{(require 'comint)} loads the file @file{comint.el} +if it has not yet been loaded. This ensures that @code{make-comint} is +defined. Features are normally named after the files that provide them, +so that @code{require} need not be given the file name. + +The @file{comint.el} file contains the following top-level expression: + +@smallexample +(provide 'comint) +@end smallexample + +@noindent +This adds @code{comint} to the global @code{features} list, so that +@code{(require 'comint)} will henceforth know that nothing needs to be +done. + +@cindex byte-compiling @code{require} + When @code{require} is used at top level in a file, it takes effect +when you byte-compile that file (@pxref{Byte Compilation}) as well as +when you load it. This is in case the required package contains macros +that the byte compiler must know about. It also avoids byte-compiler +warnings for functions and variables defined in the file loaded with +@code{require}. + + Although top-level calls to @code{require} are evaluated during +byte compilation, @code{provide} calls are not. Therefore, you can +ensure that a file of definitions is loaded before it is byte-compiled +by including a @code{provide} followed by a @code{require} for the same +feature, as in the following example. + +@smallexample +@group +(provide 'my-feature) ; @r{Ignored by byte compiler,} + ; @r{evaluated by @code{load}.} +(require 'my-feature) ; @r{Evaluated by byte compiler.} +@end group +@end smallexample + +@noindent +The compiler ignores the @code{provide}, then processes the +@code{require} by loading the file in question. Loading the file does +execute the @code{provide} call, so the subsequent @code{require} call +does nothing when the file is loaded. + +@defun provide feature &optional subfeatures +This function announces that @var{feature} is now loaded, or being +loaded, into the current Emacs session. This means that the facilities +associated with @var{feature} are or will be available for other Lisp +programs. + +The direct effect of calling @code{provide} is to add @var{feature} to +the front of the list @code{features} if it is not already in the list. +The argument @var{feature} must be a symbol. @code{provide} returns +@var{feature}. + +If provided, @var{subfeatures} should be a list of symbols indicating +a set of specific subfeatures provided by this version of +@var{feature}. You can test the presence of a subfeature using +@code{featurep}. The idea of subfeatures is that you use them when a +package (which is one @var{feature}) is complex enough to make it +useful to give names to various parts or functionalities of the +package, which might or might not be loaded, or might or might not be +present in a given version. @xref{Network Feature Testing}, for +an example. + +@smallexample +features + @result{} (bar bish) + +(provide 'foo) + @result{} foo +features + @result{} (foo bar bish) +@end smallexample + +When a file is loaded to satisfy an autoload, and it stops due to an +error in the evaluation of its contents, any function definitions or +@code{provide} calls that occurred during the load are undone. +@xref{Autoload}. +@end defun + +@defun require feature &optional filename noerror +This function checks whether @var{feature} is present in the current +Emacs session (using @code{(featurep @var{feature})}; see below). The +argument @var{feature} must be a symbol. + +If the feature is not present, then @code{require} loads @var{filename} +with @code{load}. If @var{filename} is not supplied, then the name of +the symbol @var{feature} is used as the base file name to load. +However, in this case, @code{require} insists on finding @var{feature} +with an added @samp{.el} or @samp{.elc} suffix (possibly extended with +a compression suffix); a file whose name is just @var{feature} won't +be used. (The variable @code{load-suffixes} specifies the exact +required Lisp suffixes.) + +If @var{noerror} is non-@code{nil}, that suppresses errors from actual +loading of the file. In that case, @code{require} returns @code{nil} +if loading the file fails. Normally, @code{require} returns +@var{feature}. + +If loading the file succeeds but does not provide @var{feature}, +@code{require} signals an error, @samp{Required feature @var{feature} +was not provided}. +@end defun + +@defun featurep feature &optional subfeature +This function returns @code{t} if @var{feature} has been provided in +the current Emacs session (i.e.@:, if @var{feature} is a member of +@code{features}.) If @var{subfeature} is non-@code{nil}, then the +function returns @code{t} only if that subfeature is provided as well +(i.e.@: if @var{subfeature} is a member of the @code{subfeature} +property of the @var{feature} symbol.) +@end defun + +@defvar 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 @code{provide}. The order of the elements in the +@code{features} list is not significant. +@end defvar + +@node Where Defined +@section Which File Defined a Certain Symbol + +@defun symbol-file symbol &optional type +This function returns the name of the file that defined @var{symbol}. +If @var{type} is @code{nil}, then any kind of definition is +acceptable. If @var{type} is @code{defun} or @code{defvar}, that +specifies function definition only or variable definition only. + +The value is normally an absolute file name. It can also be +@code{nil}, if the definition is not associated with any file. +@end defun + + The basis for @code{symbol-file} is the data in the variable +@code{load-history}. + +@defvar load-history +This variable's value is an alist connecting library file names with the +names of functions and variables they define, the features they provide, +and the features they require. + +Each element is a list and describes one library. The @sc{car} of the +list is the absolute file name of the library, as a string. The rest +of the list elements have these forms: + +@table @code +@item @var{var} +The symbol @var{var} was defined as a variable. +@item (defun . @var{fun}) +The function @var{fun} was defined. +@item (t . @var{fun}) +The function @var{fun} was previously an autoload before this library +redefined it as a function. The following element is always +@code{(defun . @var{fun})}, which represents defining @var{fun} as a +function. +@item (autoload . @var{fun}) +The function @var{fun} was defined as an autoload. +@item (require . @var{feature}) +The feature @var{feature} was required. +@item (provide . @var{feature}) +The feature @var{feature} was provided. +@end table + +The value of @code{load-history} may have one element whose @sc{car} is +@code{nil}. This element describes definitions made with +@code{eval-buffer} on a buffer that is not visiting a file. +@end defvar + + The command @code{eval-region} updates @code{load-history}, but does so +by adding the symbols defined to the element for the file being visited, +rather than replacing that element. @xref{Eval}. + +@node Unloading +@section Unloading +@cindex unloading packages + +@c Emacs 19 feature + You can discard the functions and variables loaded by a library to +reclaim memory for other Lisp objects. To do this, use the function +@code{unload-feature}: + +@deffn Command unload-feature feature &optional force +This command unloads the library that provided feature @var{feature}. +It undefines all functions, macros, and variables defined in that +library with @code{defun}, @code{defalias}, @code{defsubst}, +@code{defmacro}, @code{defconst}, @code{defvar}, and @code{defcustom}. +It then restores any autoloads formerly associated with those symbols. +(Loading saves these in the @code{autoload} property of the symbol.) + +@vindex unload-feature-special-hooks +Before restoring the previous definitions, @code{unload-feature} runs +@code{remove-hook} to remove functions in the library from certain +hooks. These hooks include variables whose names end in @samp{hook} +or @samp{-hooks}, plus those listed in +@code{unload-feature-special-hooks}. This is to prevent Emacs from +ceasing to function because important hooks refer to functions that +are no longer defined. + +@vindex @var{feature}-unload-hook +If these measures are not sufficient to prevent malfunction, a library +can define an explicit unload hook. If @code{@var{feature}-unload-hook} +is defined, it is run as a normal hook before restoring the previous +definitions, @emph{instead of} the usual hook-removing actions. The +unload hook ought to undo all the global state changes made by the +library that might cease to work once the library is unloaded. +@code{unload-feature} can cause problems with libraries that fail to do +this, so it should be used with caution. + +Ordinarily, @code{unload-feature} refuses to unload a library on which +other loaded libraries depend. (A library @var{a} depends on library +@var{b} if @var{a} contains a @code{require} for @var{b}.) If the +optional argument @var{force} is non-@code{nil}, dependencies are +ignored and you can unload any library. +@end deffn + + The @code{unload-feature} function is written in Lisp; its actions are +based on the variable @code{load-history}. + +@defvar unload-feature-special-hooks +This variable holds a list of hooks to be scanned before unloading a +library, to remove functions defined in the library. +@end defvar + +@node Hooks for Loading +@section Hooks for Loading +@cindex loading hooks +@cindex hooks for loading + +You can ask for code to be executed if and when a particular library is +loaded, by calling @code{eval-after-load}. + +@defun eval-after-load library form +This function arranges to evaluate @var{form} at the end of loading +the file @var{library}, each time @var{library} is loaded. If +@var{library} is already loaded, it evaluates @var{form} right away. +Don't forget to quote @var{form}! + +You don't need to give a directory or extension in the file name +@var{library}---normally you just give a bare file name, like this: + +@example +(eval-after-load "edebug" '(def-edebug-spec c-point t)) +@end example + +To restrict which files can trigger the evaluation, include a +directory or an extension or both in @var{library}. Only a file whose +absolute true name (i.e., the name with all symbolic links chased out) +matches all the given name components will match. In the following +example, @file{my_inst.elc} or @file{my_inst.elc.gz} in some directory +@code{..../foo/bar} will trigger the evaluation, but not +@file{my_inst.el}: + +@example +(eval-after-load "foo/bar/my_inst.elc" @dots{}) +@end example + +@var{library} can also be a feature (i.e.@: a symbol), in which case +@var{form} is evaluated when @code{(provide @var{library})} is called. + +An error in @var{form} does not undo the load, but does prevent +execution of the rest of @var{form}. +@end defun + +In general, well-designed Lisp programs should not use this feature. +The clean and modular ways to interact with a Lisp library are (1) +examine and set the library's variables (those which are meant for +outside use), and (2) call the library's functions. If you wish to +do (1), you can do it immediately---there is no need to wait for when +the library is loaded. To do (2), you must load the library (preferably +with @code{require}). + +But it is OK to use @code{eval-after-load} in your personal +customizations if you don't feel they must meet the design standards for +programs meant for wider use. + +@defvar after-load-alist +This variable, an alist built by @code{eval-after-load}, holds the +expressions to evaluate when particular libraries are loaded. Each +element looks like this: + +@example +(@var{regexp-or-feature} @var{forms}@dots{}) +@end example + +The key @var{regexp-or-feature} is either a regular expression or a +symbol, and the value is a list of forms. The forms are evaluated when +the key matches the absolute true name of the file being +@code{load}ed or the symbol being @code{provide}d. +@end defvar + +@ignore + arch-tag: df731f89-0900-4389-a436-9105241b6f7a +@end ignore diff --git a/doc/lispref/locals.texi b/doc/lispref/locals.texi new file mode 100644 index 00000000000..4edbc2a815f --- /dev/null +++ b/doc/lispref/locals.texi @@ -0,0 +1,232 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/locals +@node Standard Buffer-Local Variables, Standard Keymaps, Standard Errors, Top +@appendix Buffer-Local Variables +@c The title "Standard Buffer-Local Variables" is too long for +@c smallbook. --rjc 30mar92 +@cindex buffer-local variables, general-purpose +@cindex standard buffer-local variables + + The table below lists the general-purpose Emacs variables that +automatically become buffer-local in each buffer. Most become +buffer-local only when set; a few of them are always local in every +buffer. Many Lisp packages define such variables for their internal +use, but we don't try to list them all here. + + Every buffer-specific minor mode defines a buffer-local variable +named @samp{@var{modename}-mode}. @xref{Minor Mode Conventions}. +Minor mode variables will not be listed here. + +@table @code +@item auto-fill-function +@xref{Auto Filling}. + +@item buffer-auto-save-file-format +@xref{Format Conversion}. + +@item buffer-auto-save-file-name +@xref{Auto-Saving}. + +@item buffer-backed-up +@xref{Making Backups}. + +@item buffer-display-count +@xref{Buffers and Windows}. + +@item buffer-display-table +@xref{Active Display Table}. + +@item buffer-display-time +@xref{Buffers and Windows}. + +@item buffer-file-coding-system +@xref{Encoding and I/O}. + +@item buffer-file-format +@xref{Format Conversion}. + +@item buffer-file-name +@xref{Buffer File Name}. + +@item buffer-file-number +@xref{Buffer File Name}. + +@item buffer-file-truename +@xref{Buffer File Name}. + +@item buffer-file-type +@xref{MS-DOS File Types}. + +@item buffer-invisibility-spec +@xref{Invisible Text}. + +@item buffer-offer-save +@xref{Killing Buffers}. + +@item buffer-save-without-query +@xref{Killing Buffers}. + +@item buffer-read-only +@xref{Read Only Buffers}. + +@item buffer-saved-size +@xref{Auto-Saving}. + +@item buffer-undo-list +@xref{Undo}. + +@item cache-long-line-scans +@xref{Truncation}. + +@item case-fold-search +@xref{Searching and Case}. + +@item ctl-arrow +@xref{Usual Display}. + +@item cursor-type +@xref{Cursor Parameters}. + +@item cursor-in-non-selected-windows +@xref{Basic Windows}. + +@item comment-column +@xref{Comments,,, emacs, The GNU Emacs Manual}. + +@item default-directory +@xref{File Name Expansion}. + +@item defun-prompt-regexp +@xref{List Motion}. + +@item desktop-save-buffer +@xref{Desktop Save Mode}. + +@ignore +@item direction-reversed +Does not work yet. +@end ignore + +@item enable-multibyte-characters +@ref{Text Representations}. + +@item fill-column +@xref{Margins}. + +@item fill-prefix +@xref{Margins}. + +@item font-lock-defaults +@xref{Font Lock Basics}. + +@item fringe-cursor-alist +@xref{Fringe Cursors}. + +@item fringe-indicator-alist +@xref{Fringe Indicators}. + +@item fringes-outside-margins +@xref{Fringes}. + +@item goal-column +@xref{Moving Point,,, emacs, The GNU Emacs Manual}. + +@item header-line-format +@xref{Header Lines}. + +@item indicate-buffer-boundaries +@xref{Usual Display}. + +@item indicate-empty-lines +@xref{Usual Display}. + +@item left-fringe-width +@xref{Fringe Size/Pos}. + +@item left-margin +@xref{Margins}. + +@item left-margin-width +@xref{Display Margins}. + +@item line-spacing +@xref{Line Height}. + +@item local-abbrev-table +@xref{Standard Abbrev Tables}. + +@item major-mode +@xref{Mode Help}. + +@item mark-active +@xref{The Mark}. + +@item mark-ring +@xref{The Mark}. + +@item mode-line-buffer-identification +@xref{Mode Line Variables}. + +@item mode-line-format +@xref{Mode Line Data}. + +@item mode-line-modified +@xref{Mode Line Variables}. + +@item mode-line-process +@xref{Mode Line Variables}. + +@item mode-name +@xref{Mode Line Variables}. + +@item point-before-scroll +Used for communication between mouse commands and scroll-bar commands. + +@item right-fringe-width +@xref{Fringe Size/Pos}. + +@item right-margin-width +@xref{Display Margins}. + +@item save-buffer-coding-system +@xref{Encoding and I/O}. + +@item scroll-bar-width +@xref{Scroll Bars}. + +@item scroll-down-aggressively +@xref{Textual Scrolling}. + +@item scroll-up-aggressively +@xref{Textual Scrolling}. + +@item selective-display +@xref{Selective Display}. + +@item selective-display-ellipses +@xref{Selective Display}. + +@item tab-width +@xref{Usual Display}. + +@item truncate-lines +@xref{Truncation}. + +@item vertical-scroll-bar +@xref{Scroll Bars}. + +@item window-size-fixed +@xref{Resizing Windows}. + +@item write-contents-functions +@xref{Saving Buffers}. +@end table + + +@ignore + arch-tag: 6baae835-b667-4447-91e2-9829ae1cf543 +@end ignore diff --git a/doc/lispref/macros.texi b/doc/lispref/macros.texi new file mode 100644 index 00000000000..b62c8b99d74 --- /dev/null +++ b/doc/lispref/macros.texi @@ -0,0 +1,752 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 2001, 2002, +@c 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/macros +@node Macros, Customization, Functions, Top +@chapter Macros +@cindex macros + + @dfn{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 @dfn{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. + + If you are using a macro to do something an ordinary function could +do, just for the sake of speed, consider using an inline function +instead. @xref{Inline Functions}. + +@menu +* Simple Macro:: A basic example. +* Expansion:: How, when and why macros are expanded. +* Compiling Macros:: How macros are expanded by the compiler. +* Defining Macros:: How to write a macro definition. +* Backquote:: Easier construction of list structure. +* Problems with Macros:: Don't evaluate the macro arguments too many times. + Don't hide the user's variables. +* Indenting Macros:: Specifying how to indent macro calls. +@end menu + +@node Simple Macro +@section A Simple Example of a Macro + + Suppose we would like to define a Lisp construct to increment a +variable value, much like the @code{++} operator in C. We would like to +write @code{(inc x)} and have the effect of @code{(setq x (1+ x))}. +Here's a macro definition that does the job: + +@findex inc +@example +@group +(defmacro inc (var) + (list 'setq var (list '1+ var))) +@end group +@end example + + When this is called with @code{(inc x)}, the argument @var{var} is the +symbol @code{x}---@emph{not} the @emph{value} of @code{x}, as it would +be in a function. The body of the macro uses this to construct the +expansion, which is @code{(setq x (1+ x))}. Once the macro definition +returns this expansion, Lisp proceeds to evaluate it, thus incrementing +@code{x}. + +@node Expansion +@section Expansion of a Macro Call +@cindex expansion of macros +@cindex 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 @code{&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 @dfn{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 +@code{macroexpand}. + +@defun macroexpand form &optional environment +@cindex macro expansion +This function expands @var{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 +@code{macroexpand}. If @var{form} is not a macro call to begin with, it +is returned as given. + +Note that @code{macroexpand} does not look at the subexpressions of +@var{form} (although some macro definitions may do so). Even if they +are macro calls themselves, @code{macroexpand} does not expand them. + +The function @code{macroexpand} does not expand calls to inline functions. +Normally there is no need for that, since a call to an inline function is +no harder to understand than a call to an ordinary function. + +If @var{environment} is provided, it specifies an alist of macro +definitions that shadow the currently defined macros. Byte compilation +uses this feature. + +@smallexample +@group +(defmacro inc (var) + (list 'setq var (list '1+ var))) + @result{} inc +@end group + +@group +(macroexpand '(inc r)) + @result{} (setq r (1+ r)) +@end group + +@group +(defmacro inc2 (var1 var2) + (list 'progn (list 'inc var1) (list 'inc var2))) + @result{} inc2 +@end group + +@group +(macroexpand '(inc2 r s)) + @result{} (progn (inc r) (inc s)) ; @r{@code{inc} not expanded here.} +@end group +@end smallexample +@end defun + + +@defun macroexpand-all form &optional environment +@code{macroexpand-all} expands macros like @code{macroexpand}, but +will look for and expand all macros in @var{form}, not just at the +top-level. If no macros are expanded, the return value is @code{eq} +to @var{form}. + +Repeating the example used for @code{macroexpand} above with +@code{macroexpand-all}, we see that @code{macroexpand-all} @emph{does} +expand the embedded calls to @code{inc}: + +@smallexample +(macroexpand-all '(inc2 r s)) + @result{} (progn (setq r (1+ r)) (setq s (1+ s))) +@end smallexample + +@end defun + +@node Compiling Macros +@section Macros and Byte Compilation +@cindex byte-compiling macros + + 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 the 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 +already 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 @code{defmacro} form, the macro is defined +temporarily for the rest of the compilation of that file. To make this +feature work, you must put the @code{defmacro} in the same file where it +is used, and before its first use. + + Byte-compiling a file executes any @code{require} calls at top-level +in the file. This is in case the file needs the required packages for +proper compilation. One way to ensure that necessary macro definitions +are available during compilation is to require the files that define +them (@pxref{Named Features}). To avoid loading the macro definition files +when someone @emph{runs} the compiled program, write +@code{eval-when-compile} around the @code{require} calls (@pxref{Eval +During Compile}). + +@node Defining Macros +@section Defining Macros + + A Lisp macro is a list whose @sc{car} is @code{macro}. Its @sc{cdr} should +be a function; expansion of the macro works by applying the function +(with @code{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 functionals such as @code{mapcar}. In practice, +all Lisp macros have names, and they are usually defined with the +special form @code{defmacro}. + +@defspec defmacro name argument-list body-forms@dots{} +@code{defmacro} defines the symbol @var{name} as a macro that looks +like this: + +@example +(macro lambda @var{argument-list} . @var{body-forms}) +@end example + +(Note that the @sc{cdr} of this list is a function---a lambda expression.) +This macro object is stored in the function cell of @var{name}. The +value returned by evaluating the @code{defmacro} form is @var{name}, but +usually we ignore this value. + +The shape and meaning of @var{argument-list} is the same as in a +function, and the keywords @code{&rest} and @code{&optional} may be used +(@pxref{Argument List}). Macros may have a documentation string, but +any @code{interactive} declaration is ignored since macros cannot be +called interactively. +@end defspec + + The body of the macro definition can include a @code{declare} form, +which can specify how @key{TAB} should indent macro calls, and how to +step through them for Edebug. + +@defmac declare @var{specs}@dots{} +@anchor{Definition of declare} +A @code{declare} form is used in a macro definition to specify various +additional information about it. Two kinds of specification are +currently supported: + +@table @code +@item (debug @var{edebug-form-spec}) +Specify how to step through macro calls for Edebug. +@xref{Instrumenting Macro Calls}. + +@item (indent @var{indent-spec}) +Specify how to indent calls to this macro. @xref{Indenting Macros}, +for more details. +@end table + +A @code{declare} form only has its special effect in the body of a +@code{defmacro} form if it immediately follows the documentation +string, if present, or the argument list otherwise. (Strictly +speaking, @emph{several} @code{declare} forms can follow the +documentation string or argument list, but since a @code{declare} form +can have several @var{specs}, they can always be combined into a +single form.) When used at other places in a @code{defmacro} form, or +outside a @code{defmacro} form, @code{declare} just returns @code{nil} +without evaluating any @var{specs}. +@end defmac + + No macro absolutely needs a @code{declare} form, because that form +has no effect on how the macro expands, on what the macro means in the +program. It only affects secondary features: indentation and Edebug. + +@node Backquote +@section Backquote +@cindex backquote (list substitution) +@cindex ` (list substitution) +@findex ` + + Macros often need to construct large list structures from a mixture of +constants and nonconstant parts. To make this easier, use the @samp{`} +syntax (usually called @dfn{backquote}). + + 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 @code{quote} (@pxref{Quoting}). For example, these +two forms yield identical results: + +@example +@group +`(a list of (+ 2 3) elements) + @result{} (a list of (+ 2 3) elements) +@end group +@group +'(a list of (+ 2 3) elements) + @result{} (a list of (+ 2 3) elements) +@end group +@end example + +@findex , @r{(with backquote)} +The special marker @samp{,} inside of the argument to backquote +indicates a value that isn't constant. Backquote evaluates the +argument of @samp{,} and puts the value in the list structure: + +@example +@group +(list 'a 'list 'of (+ 2 3) 'elements) + @result{} (a list of 5 elements) +@end group +@group +`(a list of ,(+ 2 3) elements) + @result{} (a list of 5 elements) +@end group +@end example + + Substitution with @samp{,} is allowed at deeper levels of the list +structure also. For example: + +@example +@group +(defmacro t-becomes-nil (variable) + `(if (eq ,variable t) + (setq ,variable nil))) +@end group + +@group +(t-becomes-nil foo) + @equiv{} (if (eq foo t) (setq foo nil)) +@end group +@end example + +@findex ,@@ @r{(with backquote)} +@cindex splicing (with backquote) + You can also @dfn{splice} an evaluated value into the resulting list, +using the special marker @samp{,@@}. 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 @samp{`} is often unreadable. +Here are some examples: + +@example +@group +(setq some-list '(2 3)) + @result{} (2 3) +@end group +@group +(cons 1 (append some-list '(4) some-list)) + @result{} (1 2 3 4 2 3) +@end group +@group +`(1 ,@@some-list 4 ,@@some-list) + @result{} (1 2 3 4 2 3) +@end group + +@group +(setq list '(hack foo bar)) + @result{} (hack foo bar) +@end group +@group +(cons 'use + (cons 'the + (cons 'words (append (cdr list) '(as elements))))) + @result{} (use the words foo bar as elements) +@end group +@group +`(use the words ,@@(cdr list) as elements) + @result{} (use the words foo bar as elements) +@end group +@end example + +In old Emacs versions, before version 19.29, @samp{`} used a different +syntax which required an extra level of parentheses around the entire +backquote construct. Likewise, each @samp{,} or @samp{,@@} substitution +required an extra level of parentheses surrounding both the @samp{,} or +@samp{,@@} and the following expression. The old syntax required +whitespace between the @samp{`}, @samp{,} or @samp{,@@} and the +following expression. + +This syntax is still accepted, for compatibility with old Emacs +versions, but support for it will soon disappear. + +@node Problems with Macros +@section Common Problems Using Macros + + The basic facts of macro expansion have counterintuitive consequences. +This section describes some important consequences that can lead to +trouble, and rules to follow to avoid trouble. + +@menu +* Wrong Time:: Do the work in the expansion, not in the macro. +* Argument Evaluation:: The expansion should evaluate each macro arg once. +* Surprising Local Vars:: Local variable bindings in the expansion + require special care. +* Eval During Expansion:: Don't evaluate them; put them in the expansion. +* Repeated Expansion:: Avoid depending on how many times expansion is done. +@end menu + +@node Wrong Time +@subsection Wrong Time + + The most common problem in writing macros is doing some of the +real work prematurely---while expanding the macro, rather than in the +expansion itself. For instance, one real package had this macro +definition: + +@example +(defmacro my-set-buffer-multibyte (arg) + (if (fboundp 'set-buffer-multibyte) + (set-buffer-multibyte arg))) +@end example + +With this erroneous macro definition, the program worked fine when +interpreted but failed when compiled. This macro definition called +@code{set-buffer-multibyte} during compilation, which was wrong, and +then did nothing when the compiled package was run. The definition +that the programmer really wanted was this: + +@example +(defmacro my-set-buffer-multibyte (arg) + (if (fboundp 'set-buffer-multibyte) + `(set-buffer-multibyte ,arg))) +@end example + +@noindent +This macro expands, if appropriate, into a call to +@code{set-buffer-multibyte} that will be executed when the compiled +program is actually run. + +@node Argument Evaluation +@subsection Evaluating Macro Arguments Repeatedly + + 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. + +@findex for +@smallexample +@group +(defmacro for (var from init to final do &rest body) + "Execute a simple \"for\" loop. +For example, (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))))))) +@end group +@result{} for + +@group +(for i from 1 to 3 do + (setq square (* i i)) + (princ (format "\n%d %d" i square))) +@expansion{} +@end group +@group +(let ((i 1)) + (while (<= i 3) + (setq square (* i i)) + (princ (format "\n%d %d" i square)) + (inc i))) +@end group +@group + + @print{}1 1 + @print{}2 4 + @print{}3 9 +@result{} nil +@end group +@end smallexample + +@noindent +The arguments @code{from}, @code{to}, and @code{do} in this macro are +``syntactic sugar''; they are entirely ignored. The idea is that you +will write noise words (such as @code{from}, @code{to}, and @code{do}) +in those positions in the macro call. + +Here's an equivalent definition simplified through use of backquote: + +@smallexample +@group +(defmacro for (var from init to final do &rest body) + "Execute a simple \"for\" loop. +For example, (for i from 1 to 10 do (print i))." + `(let ((,var ,init)) + (while (<= ,var ,final) + ,@@body + (inc ,var)))) +@end group +@end smallexample + +Both forms of this definition (with backquote and without) suffer from +the defect that @var{final} is evaluated on every iteration. If +@var{final} is a constant, this is not a problem. If it is a more +complex form, say @code{(long-complex-calculation x)}, this can slow +down the execution significantly. If @var{final} has side effects, +executing it more than once is probably incorrect. + +@cindex macro argument evaluation +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 @code{for} macro: + +@smallexample +@group +(let ((i 1) + (max 3)) + (while (<= i max) + (setq square (* i i)) + (princ (format "%d %d" i square)) + (inc i))) +@end group +@end smallexample + +Here is a macro definition that creates this expansion: + +@smallexample +@group +(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)))) +@end group +@end smallexample + + Unfortunately, this fix introduces another problem, +described in the following section. + +@node Surprising Local Vars +@subsection Local Variables in Macro Expansions + +@ifnottex + In the previous section, the definition of @code{for} was fixed as +follows to make the expansion evaluate the macro arguments the proper +number of times: + +@smallexample +@group +(defmacro for (var from init to final do &rest body) + "Execute a simple for loop: (for i from 1 to 10 do (print i))." +@end group +@group + `(let ((,var ,init) + (max ,final)) + (while (<= ,var max) + ,@@body + (inc ,var)))) +@end group +@end smallexample +@end ifnottex + + The new definition of @code{for} has a new problem: it introduces a +local variable named @code{max} which the user does not expect. This +causes trouble in examples such as the following: + +@smallexample +@group +(let ((max 0)) + (for x from 0 to 10 do + (let ((this (frob x))) + (if (< max this) + (setq max this))))) +@end group +@end smallexample + +@noindent +The references to @code{max} inside the body of the @code{for}, which +are supposed to refer to the user's binding of @code{max}, really access +the binding made by @code{for}. + +The way to correct this is to use an uninterned symbol instead of +@code{max} (@pxref{Creating Symbols}). The uninterned symbol can be +bound and referred to just like any other symbol, but since it is +created by @code{for}, we know that it cannot already 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 never appear anywhere except +where put by @code{for}. Here is a definition of @code{for} that works +this way: + +@smallexample +@group +(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))))) +@end group +@end smallexample + +@noindent +This creates an uninterned symbol named @code{max} and puts it in the +expansion instead of the usual interned symbol @code{max} that appears +in expressions ordinarily. + +@node Eval During Expansion +@subsection Evaluating Macro Arguments in Expansion + + Another problem can happen if the macro definition itself +evaluates any of the macro argument expressions, such as by calling +@code{eval} (@pxref{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 do refer to +it. Here is an example: + +@example +@group +(defmacro foo (a) + (list 'setq (eval a) t)) + @result{} foo +@end group +@group +(setq x 'b) +(foo x) @expansion{} (setq b t) + @result{} t ; @r{and @code{b} has been set.} +;; @r{but} +(setq a 'c) +(foo a) @expansion{} (setq a t) + @result{} t ; @r{but this set @code{a}, not @code{c}.} + +@end group +@end example + + It makes a difference whether the user's variable is named @code{a} or +@code{x}, because @code{a} conflicts with the macro argument variable +@code{a}. + + Another problem with calling @code{eval} in a macro definition is that +it probably won't do what you intend in a compiled program. The +byte-compiler runs macro definitions while compiling the program, when +the program's own computations (which you might have wished to access +with @code{eval}) don't occur and its local variable bindings don't +exist. + + To avoid these problems, @strong{don't evaluate an argument expression +while computing the macro expansion}. Instead, substitute the +expression into the macro expansion, so that its value will be computed +as part of executing the expansion. This is how the other examples in +this chapter work. + +@node Repeated Expansion +@subsection 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. + + Therefore, you should avoid side effects in computation of the +macro expansion, unless you really know what you are doing. + + One special kind of side effect can't be avoided: constructing Lisp +objects. Almost all macro expansions include constructed lists; that is +the whole point of most macros. This is usually safe; there is just one +case where you must be careful: when the object you construct is part of a +quoted constant in the macro expansion. + + If the macro is expanded just once, in compilation, then the object is +constructed just once, during compilation. But in interpreted +execution, the macro is expanded each time the macro call runs, and this +means a new object is constructed each time. + + In most clean Lisp code, this difference won't matter. It can matter +only if you perform side-effects on the objects constructed by the macro +definition. Thus, to avoid trouble, @strong{avoid side effects on +objects constructed by macro definitions}. Here is an example of how +such side effects can get you into trouble: + +@lisp +@group +(defmacro empty-object () + (list 'quote (cons nil nil))) +@end group + +@group +(defun initialize (condition) + (let ((object (empty-object))) + (if condition + (setcar object condition)) + object)) +@end group +@end lisp + +@noindent +If @code{initialize} is interpreted, a new list @code{(nil)} is +constructed each time @code{initialize} is called. Thus, no side effect +survives between calls. If @code{initialize} is compiled, then the +macro @code{empty-object} is expanded during compilation, producing a +single ``constant'' @code{(nil)} that is reused and altered each time +@code{initialize} is called. + +One way to avoid pathological cases like this is to think of +@code{empty-object} as a funny kind of constant, not as a memory +allocation construct. You wouldn't use @code{setcar} on a constant such +as @code{'(nil)}, so naturally you won't use it on @code{(empty-object)} +either. + +@node Indenting Macros +@section Indenting Macros + + You can use the @code{declare} form in the macro definition to +specify how to @key{TAB} should indent indent calls to the macro. You +write it like this: + +@example +(declare (indent @var{indent-spec})) +@end example + +@noindent +Here are the possibilities for @var{indent-spec}: + +@table @asis +@item @code{nil} +This is the same as no property---use the standard indentation pattern. +@item @code{defun} +Handle this function like a @samp{def} construct: treat the second +line as the start of a @dfn{body}. +@item an integer, @var{number} +The first @var{number} arguments of the function are +@dfn{distinguished} arguments; the rest are considered the body +of the expression. A line in the expression is indented according to +whether the first argument on it is distinguished or not. If the +argument is part of the body, the line is indented @code{lisp-body-indent} +more columns than the open-parenthesis starting the containing +expression. If the argument is distinguished and is either the first +or second argument, it is indented @emph{twice} that many extra columns. +If the argument is distinguished and not the first or second argument, +the line uses the standard pattern. +@item a symbol, @var{symbol} +@var{symbol} should be a function name; that function is called to +calculate the indentation of a line within this expression. The +function receives two arguments: +@table @asis +@item @var{state} +The value returned by @code{parse-partial-sexp} (a Lisp primitive for +indentation and nesting computation) when it parses up to the +beginning of this line. +@item @var{pos} +The position at which the line being indented begins. +@end table +@noindent +It should return either a number, which is the number of columns of +indentation for that line, or a list whose car is such a number. The +difference between returning a number and returning a list is that a +number says that all following lines at the same nesting level should +be indented just like this one; a list says that following lines might +call for different indentations. This makes a difference when the +indentation is being computed by @kbd{C-M-q}; if the value is a +number, @kbd{C-M-q} need not recalculate indentation for the following +lines until the end of the list. +@end table + +@ignore + arch-tag: d4cce66d-1047-45c3-bfde-db6719d6e82b +@end ignore diff --git a/doc/lispref/makefile.w32-in b/doc/lispref/makefile.w32-in new file mode 100644 index 00000000000..7e35339d17f --- /dev/null +++ b/doc/lispref/makefile.w32-in @@ -0,0 +1,123 @@ +# -*- Makefile -*- for the GNU Emacs Lisp Reference Manual. + +# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + +# This file is part of GNU Emacs. + +# GNU Emacs is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. + +# GNU Emacs is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# Standard configure variables. +srcdir = . + +infodir = $(srcdir)/../info +usermanualdir = $(srcdir)/../man + +# Redefine `TEX' if `tex' does not invoke plain TeX. For example: +# TEX=platex +TEX=tex +INSTALL_INFO = install-info +MAKEINFO = makeinfo --force + +# The environment variable and its value to add $(srcdir) to the path +# searched for TeX input files. +texinputdir = $(srcdir)\..\nt\envadd.bat "TEXINPUTS=$(srcdir);$(TEXINPUTS)" /C + +# The name of the manual: +VERSION=2.9 +manual = elisp-manual-21-$(VERSION) + +# List of all the texinfo files in the manual: + +srcs = \ + $(srcdir)/abbrevs.texi \ + $(srcdir)/advice.texi \ + $(srcdir)/anti.texi \ + $(srcdir)/back.texi \ + $(srcdir)/backups.texi \ + $(srcdir)/buffers.texi \ + $(srcdir)/commands.texi \ + $(srcdir)/compile.texi \ + $(srcdir)/control.texi \ + $(srcdir)/customize.texi \ + $(srcdir)/debugging.texi \ + $(srcdir)/display.texi \ + $(srcdir)/edebug.texi \ + $(srcdir)/elisp.texi \ + $(srcdir)/errors.texi \ + $(srcdir)/eval.texi \ + $(srcdir)/files.texi \ + $(srcdir)/frames.texi \ + $(srcdir)/functions.texi \ + $(srcdir)/hash.texi \ + $(srcdir)/help.texi \ + $(srcdir)/hooks.texi \ + $(srcdir)/internals.texi \ + $(srcdir)/intro.texi \ + $(srcdir)/keymaps.texi \ + $(srcdir)/lists.texi \ + $(srcdir)/loading.texi \ + $(srcdir)/locals.texi \ + $(srcdir)/macros.texi \ + $(srcdir)/maps.texi \ + $(srcdir)/markers.texi \ + $(srcdir)/minibuf.texi \ + $(srcdir)/modes.texi \ + $(srcdir)/nonascii.texi \ + $(srcdir)/numbers.texi \ + $(srcdir)/objects.texi \ + $(srcdir)/os.texi \ + $(srcdir)/positions.texi \ + $(srcdir)/processes.texi \ + $(srcdir)/searching.texi \ + $(srcdir)/sequences.texi \ + $(srcdir)/streams.texi \ + $(srcdir)/strings.texi \ + $(srcdir)/symbols.texi \ + $(srcdir)/syntax.texi \ + $(srcdir)/text.texi \ + $(srcdir)/tips.texi \ + $(srcdir)/variables.texi \ + $(srcdir)/windows.texi \ + $(srcdir)/index.texi \ + $(srcdir)/gpl.texi \ + $(srcdir)/doclicense.texi + + +.PHONY: clean + +# The info file is named `elisp'. + +info: $(infodir)/elisp + +$(infodir)/dir: + $(INSTALL_INFO) --info-dir=$(infodir) $(infodir)/elisp + +$(infodir)/elisp: $(srcs) + $(MAKEINFO) -I. -I$(srcdir) -o $(infodir)/elisp $(srcdir)/elisp.texi + +elisp.dvi: $(srcs) + $(texinputdir) $(TEX) -I $(usermanualdir) $(srcdir)/elisp.texi + +clean: + - $(DEL) *.toc *.aux *.log *.cp *.cps *.fn *.fns *.tp *.tps \ + *.vr *.vrs *.pg *.pgs *.ky *.kys + - $(DEL) make.out core + - $(DEL) $(infodir)/elisp* + +distclean: clean + +maintainer-clean: distclean + - $(DEL) elisp elisp-? elisp-?? elisp.dvi elisp.oaux diff --git a/doc/lispref/maps.texi b/doc/lispref/maps.texi new file mode 100644 index 00000000000..724091970c3 --- /dev/null +++ b/doc/lispref/maps.texi @@ -0,0 +1,230 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/maps +@node Standard Keymaps, Standard Hooks, Standard Buffer-Local Variables, Top +@appendix Standard Keymaps +@cindex standard keymaps + +The following symbols are used as the names for various keymaps. +Some of these exist when Emacs is first started, others are +loaded only when their respective mode is used. This is not +an exhaustive list. + +Several keymaps are used in the minibuffer. @xref{Completion Commands}. + +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. + +@table @code +@item apropos-mode-map +@vindex apropos-mode-map +A sparse keymap for @code{apropos} buffers. + +@item Buffer-menu-mode-map +@vindex Buffer-menu-mode-map +A full keymap used by Buffer Menu mode. + +@item c-mode-map +@vindex c-mode-map +A sparse keymap used by C mode. + +@item command-history-map +@vindex command-history-map +A full keymap used by Command History mode. + +@item ctl-x-4-map +A sparse keymap for subcommands of the prefix @kbd{C-x 4}. + +@item ctl-x-5-map +A sparse keymap for subcommands of the prefix @kbd{C-x 5}. + +@item ctl-x-map +A full keymap for @kbd{C-x} commands. + +@item custom-mode-map +A full keymap for Custom mode. + +@item debugger-mode-map +@vindex debugger-mode-map +A full keymap used by Debugger mode. + +@item dired-mode-map +@vindex dired-mode-map +A full keymap for @code{dired-mode} buffers. + +@item edit-abbrevs-map +@vindex edit-abbrevs-map +A sparse keymap used in @code{edit-abbrevs}. + +@item edit-tab-stops-map +@vindex edit-tab-stops-map +A sparse keymap used in @code{edit-tab-stops}. + +@item electric-buffer-menu-mode-map +@vindex electric-buffer-menu-mode-map +A full keymap used by Electric Buffer Menu mode. + +@item electric-history-map +@vindex electric-history-map +A full keymap used by Electric Command History mode. + +@item emacs-lisp-mode-map +@vindex emacs-lisp-mode-map +A sparse keymap used by Emacs Lisp mode. + +@item esc-map +A full keymap for @kbd{ESC} (or @kbd{Meta}) commands. + +@item facemenu-menu +@vindex facemenu-menu +The sparse keymap that displays the Text Properties menu. + +@item facemenu-background-menu +@vindex facemenu-background-menu +The sparse keymap that displays the Background Color submenu of the Text +Properties menu. + +@item facemenu-face-menu +@vindex facemenu-face-menu +The sparse keymap that displays the Face submenu of the Text Properties menu. + +@item facemenu-foreground-menu +@vindex facemenu-foreground-menu +The sparse keymap that displays the Foreground Color submenu of the Text +Properties menu. + +@item facemenu-indentation-menu +@vindex facemenu-indentation-menu +The sparse keymap that displays the Indentation submenu of the Text +Properties menu. + +@item facemenu-justification-menu +@vindex facemenu-justification-menu +The sparse keymap that displays the Justification submenu of the Text +Properties menu. + +@item facemenu-special-menu +@vindex facemenu-special-menu +The sparse keymap that displays the Special Props submenu of the Text +Properties menu. + +@item function-key-map +The keymap for translating keypad and function keys.@* +If there are none, then it contains an empty sparse keymap. +@xref{Translation Keymaps}. + +@item fundamental-mode-map +@vindex fundamental-mode-map +The sparse keymap for Fundamental mode.@* +It is empty and should not be changed. + +@item global-map +The full keymap containing default global key bindings.@* +Modes should not modify the Global map. + +@item grep-mode-map +@vindex grep-mode-map +The keymap for @code{grep-mode} buffers. + +@item help-map +The sparse keymap for the keys that follow the help character @kbd{C-h}. + +@item help-mode-map +@vindex help-mode-map +The sparse keymap for Help mode. + +@item Helper-help-map +@vindex 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. + +@item Info-edit-map +@vindex Info-edit-map +A sparse keymap used by the @kbd{e} command of Info. + +@item Info-mode-map +@vindex Info-mode-map +A sparse keymap containing Info commands. + +@item isearch-mode-map +@vindex isearch-mode-map +A keymap that defines the characters you can type within incremental +search. + +@item key-translation-map +A keymap for translating keys. This one overrides ordinary key +bindings, unlike @code{function-key-map}. @xref{Translation Keymaps}. + +@item kmacro-map +@vindex kmacro-map +A sparse keymap for keys that follows the @kbd{C-x C-k} prefix +search. + +@item lisp-interaction-mode-map +@vindex lisp-interaction-mode-map +A sparse keymap used by Lisp Interaction mode. + +@item lisp-mode-map +@vindex lisp-mode-map +A sparse keymap used by Lisp mode. + +@item menu-bar-edit-menu +@vindex menu-bar-edit-menu +The keymap which displays the Edit menu in the menu bar. + +@item menu-bar-files-menu +@vindex menu-bar-files-menu +The keymap which displays the Files menu in the menu bar. + +@item menu-bar-help-menu +@vindex menu-bar-help-menu +The keymap which displays the Help menu in the menu bar. + +@item menu-bar-mule-menu +@vindex menu-bar-mule-menu +The keymap which displays the Mule menu in the menu bar. + +@item menu-bar-search-menu +@vindex menu-bar-search-menu +The keymap which displays the Search menu in the menu bar. + +@item menu-bar-tools-menu +@vindex menu-bar-tools-menu +The keymap which displays the Tools menu in the menu bar. + +@item mode-specific-map +The keymap for characters following @kbd{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 @kbd{C-h b} (@code{display-bindings}), +where it describes the main use of the @kbd{C-c} prefix key. + +@item occur-mode-map +@vindex occur-mode-map +A sparse keymap used by Occur mode. + +@item query-replace-map +A sparse keymap used for responses in @code{query-replace} and related +commands; also for @code{y-or-n-p} and @code{map-y-or-n-p}. The functions +that use this map do not support prefix keys; they look up one event at a +time. + +@item text-mode-map +@vindex text-mode-map +A sparse keymap used by Text mode. + +@item tool-bar-map +The keymap defining the contents of the tool bar. + +@item view-mode-map +@vindex view-mode-map +A full keymap used by View mode. +@end table + +@ignore + arch-tag: b741253c-7e23-4a02-b3fa-cffd9e4d72b9 +@end ignore diff --git a/doc/lispref/markers.texi b/doc/lispref/markers.texi new file mode 100644 index 00000000000..519b8a1316a --- /dev/null +++ b/doc/lispref/markers.texi @@ -0,0 +1,664 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/markers +@node Markers, Text, Positions, Top +@chapter Markers +@cindex markers + + A @dfn{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. + +@menu +* Overview of Markers:: The components of a marker, and how it relocates. +* Predicates on Markers:: Testing whether an object is a marker. +* Creating Markers:: Making empty markers or markers at certain places. +* Information from Markers:: Finding the marker's buffer or character position. +* Marker Insertion Types:: Two ways a marker can relocate when you + insert where it points. +* Moving Markers:: Moving the marker to a new buffer or position. +* The Mark:: How "the mark" is implemented with a marker. +* The Region:: How to access "the region". +@end menu + +@node Overview of Markers +@section 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. In that case, the +marker's buffer is normally ignored. Of course, a marker used in this +way usually points to a position in the buffer that the function +operates on, but that is entirely the programmer's responsibility. +@xref{Positions}, for a complete description of positions. + + A marker has three attributes: the marker position, the marker +buffer, and the insertion type. The marker position is an integer +that is equivalent (at a given time) to the marker as a position in +that buffer. But the marker's position value can change often during +the life of the marker. Insertion and deletion of text in the buffer +relocate the marker. The idea is that a marker positioned between two +characters remains between those two characters despite insertion and +deletion elsewhere in the buffer. Relocation changes the integer +equivalent of the marker. + +@cindex marker relocation + Deleting text around a marker's position leaves the marker between the +characters immediately before and after the deleted text. Inserting +text at the position of a marker normally leaves the marker either in +front of or after the new text, depending on the marker's @dfn{insertion +type} (@pxref{Marker Insertion Types})---unless the insertion is done +with @code{insert-before-markers} (@pxref{Insertion}). + +@cindex marker garbage collection + Insertion and deletion in a buffer must check all the markers and +relocate them 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 are garbage collected eventually, but until then +will continue to use time if they do point somewhere. + +@cindex markers as numbers + Because it is common to perform arithmetic operations on a marker +position, most of the arithmetic operations (including @code{+} and +@code{-}) accept markers as arguments. In such cases, the marker +stands for its current position. + +Here are examples of creating markers, setting markers, and moving point +to markers: + +@example +@group +;; @r{Make a new marker that initially does not point anywhere:} +(setq m1 (make-marker)) + @result{} #<marker in no buffer> +@end group + +@group +;; @r{Set @code{m1} to point between the 99th and 100th characters} +;; @r{in the current buffer:} +(set-marker m1 100) + @result{} #<marker at 100 in markers.texi> +@end group + +@group +;; @r{Now insert one character at the beginning of the buffer:} +(goto-char (point-min)) + @result{} 1 +(insert "Q") + @result{} nil +@end group + +@group +;; @r{@code{m1} is updated appropriately.} +m1 + @result{} #<marker at 101 in markers.texi> +@end group + +@group +;; @r{Two markers that point to the same position} +;; @r{are not @code{eq}, but they are @code{equal}.} +(setq m2 (copy-marker m1)) + @result{} #<marker at 101 in markers.texi> +(eq m1 m2) + @result{} nil +(equal m1 m2) + @result{} t +@end group + +@group +;; @r{When you are finished using a marker, make it point nowhere.} +(set-marker m1 nil) + @result{} #<marker in no buffer> +@end group +@end example + +@node Predicates on Markers +@section 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 in connection +with the arithmetic functions that work with both markers and integers. + +@defun markerp object +This function returns @code{t} if @var{object} is a marker, @code{nil} +otherwise. Note that integers are not markers, even though many +functions will accept either a marker or an integer. +@end defun + +@defun integer-or-marker-p object +This function returns @code{t} if @var{object} is an integer or a marker, +@code{nil} otherwise. +@end defun + +@defun number-or-marker-p object +This function returns @code{t} if @var{object} is a number (either +integer or floating point) or a marker, @code{nil} otherwise. +@end defun + +@node Creating Markers +@section 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. + +The next four functions all return markers with insertion type +@code{nil}. @xref{Marker Insertion Types}. + +@defun make-marker +This function returns a newly created marker that does not point +anywhere. + +@example +@group +(make-marker) + @result{} #<marker in no buffer> +@end group +@end example +@end defun + +@defun point-marker +This function returns a new marker that points to the present position +of point in the current buffer. @xref{Point}. For an example, see +@code{copy-marker}, below. +@end defun + +@defun 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. @xref{Narrowing}. +@end defun + +@defun 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. @xref{Narrowing}. + +Here are examples of this function and @code{point-min-marker}, shown in +a buffer containing a version of the source file for the text of this +chapter. + +@example +@group +(point-min-marker) + @result{} #<marker at 1 in markers.texi> +(point-max-marker) + @result{} #<marker at 15573 in markers.texi> +@end group + +@group +(narrow-to-region 100 200) + @result{} nil +@end group +@group +(point-min-marker) + @result{} #<marker at 100 in markers.texi> +@end group +@group +(point-max-marker) + @result{} #<marker at 200 in markers.texi> +@end group +@end example +@end defun + +@defun copy-marker marker-or-integer &optional insertion-type +If passed a marker as its argument, @code{copy-marker} returns a +new marker that points to the same place and the same buffer as does +@var{marker-or-integer}. If passed an integer as its argument, +@code{copy-marker} returns a new marker that points to position +@var{marker-or-integer} in the current buffer. + +The new marker's insertion type is specified by the argument +@var{insertion-type}. @xref{Marker Insertion Types}. + +If passed an integer argument less than 1, @code{copy-marker} returns a +new marker that points to the beginning of the current buffer. If +passed an integer argument greater than the length of the buffer, +@code{copy-marker} returns a new marker that points to the end of the +buffer. + +@example +@group +(copy-marker 0) + @result{} #<marker at 1 in markers.texi> +@end group + +@group +(copy-marker 20000) + @result{} #<marker at 7572 in markers.texi> +@end group +@end example + +An error is signaled if @var{marker} is neither a marker nor an +integer. +@end defun + + Two distinct markers are considered @code{equal} (even though not +@code{eq}) to each other if they have the same position and buffer, or +if they both point nowhere. + +@example +@group +(setq p (point-marker)) + @result{} #<marker at 2139 in markers.texi> +@end group + +@group +(setq q (copy-marker p)) + @result{} #<marker at 2139 in markers.texi> +@end group + +@group +(eq p q) + @result{} nil +@end group + +@group +(equal p q) + @result{} t +@end group +@end example + +@node Information from Markers +@section Information from Markers + + This section describes the functions for accessing the components of a +marker object. + +@defun marker-position marker +This function returns the position that @var{marker} points to, or +@code{nil} if it points nowhere. +@end defun + +@defun marker-buffer marker +This function returns the buffer that @var{marker} points into, or +@code{nil} if it points nowhere. + +@example +@group +(setq m (make-marker)) + @result{} #<marker in no buffer> +@end group +@group +(marker-position m) + @result{} nil +@end group +@group +(marker-buffer m) + @result{} nil +@end group + +@group +(set-marker m 3770 (current-buffer)) + @result{} #<marker at 3770 in markers.texi> +@end group +@group +(marker-buffer m) + @result{} #<buffer markers.texi> +@end group +@group +(marker-position m) + @result{} 3770 +@end group +@end example +@end defun + +@defun buffer-has-markers-at position +This function returns @code{t} if one or more markers +point at position @var{position} in the current buffer. +@end defun + +@node Marker Insertion Types +@section Marker Insertion Types + +@cindex insertion type of a marker + When you insert text directly at the place where a marker points, +there are two possible ways to relocate that marker: it can point before +the inserted text, or point after it. You can specify which one a given +marker should do by setting its @dfn{insertion type}. Note that use of +@code{insert-before-markers} ignores markers' insertion types, always +relocating a marker to point after the inserted text. + +@defun set-marker-insertion-type marker type +This function sets the insertion type of marker @var{marker} to +@var{type}. If @var{type} is @code{t}, @var{marker} will advance when +text is inserted at its position. If @var{type} is @code{nil}, +@var{marker} does not advance when text is inserted there. +@end defun + +@defun marker-insertion-type marker +This function reports the current insertion type of @var{marker}. +@end defun + +Most functions that create markers, without an argument allowing to +specify the insertion type, create them with insertion type +@code{nil}. Also, the mark has, by default, insertion type +@code{nil}. + +@node Moving Markers +@section Moving Marker Positions + + 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. + +@defun set-marker marker position &optional buffer +This function moves @var{marker} to @var{position} +in @var{buffer}. If @var{buffer} is not provided, it defaults to +the current buffer. + +If @var{position} is less than 1, @code{set-marker} moves @var{marker} +to the beginning of the buffer. If @var{position} is greater than the +size of the buffer, @code{set-marker} moves marker to the end of the +buffer. If @var{position} is @code{nil} or a marker that points +nowhere, then @var{marker} is set to point nowhere. + +The value returned is @var{marker}. + +@example +@group +(setq m (point-marker)) + @result{} #<marker at 4714 in markers.texi> +@end group +@group +(set-marker m 55) + @result{} #<marker at 55 in markers.texi> +@end group +@group +(setq b (get-buffer "foo")) + @result{} #<buffer foo> +@end group +@group +(set-marker m 0 b) + @result{} #<marker at 1 in foo> +@end group +@end example +@end defun + +@defun move-marker marker position &optional buffer +This is another name for @code{set-marker}. +@end defun + +@node The Mark +@section The Mark +@cindex mark, the +@cindex mark ring + + One special marker in each buffer is designated @dfn{the mark}. It +specifies a position to bound a range of text for commands such as +@code{kill-region} and @code{indent-rigidly}. 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 +@code{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 to operate on the text between point and +the mark when called interactively. If you are writing such a +command, don't examine the mark directly; instead, use +@code{interactive} with the @samp{r} specification. This provides the +values of point and the mark as arguments to the command in an +interactive call, but permits other Lisp programs to specify arguments +explicitly. @xref{Interactive Codes}. + + Each buffer has a marker which represents the value of the mark in +that buffer, independent of any other buffer. When a buffer is newly +created, this marker exists but does not point anywhere. That means +the mark ``doesn't exist'' in that buffer as yet. + + Once the mark ``exists'' in a buffer, it normally never ceases to +exist. However, it may become @dfn{inactive}, if Transient Mark mode is +enabled. The variable @code{mark-active}, which is always buffer-local +in all buffers, indicates whether the mark is active: non-@code{nil} +means yes. A command can request deactivation of the mark upon return +to the editor command loop by setting @code{deactivate-mark} to a +non-@code{nil} value (but this causes deactivation only if Transient +Mark mode is enabled). + + The main motivation for using Transient Mark mode is that this mode +also enables highlighting of the region when the mark is active. +@xref{Display}. + + In addition to the mark, each buffer has a @dfn{mark ring} which is a +list of markers containing 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 variable @code{mark-ring-max} specifies the +maximum number of entries in the mark ring; once the list becomes this +long, adding a new element deletes the last element. + + There is also a separate global mark ring, but that is used only in a +few particular user-level commands, and is not relevant to Lisp +programming. So we do not describe it here. + +@defun mark &optional force +@cindex current buffer mark +This function returns the current buffer's mark position as an integer, +or @code{nil} if no mark has ever been set in this buffer. + +If Transient Mark mode is enabled, and @code{mark-even-if-inactive} is +@code{nil}, @code{mark} signals an error if the mark is inactive. +However, if @var{force} is non-@code{nil}, then @code{mark} disregards +inactivity of the mark, and returns the mark position anyway (or +@code{nil}). +@end defun + +@defun mark-marker +This function returns the marker that represents the current buffer's +mark. It is not a copy, it is the marker used internally. Therefore, +changing this marker's position will directly affect the buffer's +mark. Don't do that unless that is the effect you want. + +@example +@group +(setq m (mark-marker)) + @result{} #<marker at 3420 in markers.texi> +@end group +@group +(set-marker m 100) + @result{} #<marker at 100 in markers.texi> +@end group +@group +(mark-marker) + @result{} #<marker at 100 in markers.texi> +@end group +@end example + +Like any marker, this marker can be set to point at any buffer you +like. If you make it point at any buffer other than the one of which +it is the mark, it will yield perfectly consistent, but rather odd, +results. We recommend that you not do it! +@end defun + +@ignore +@deffn Command set-mark-command jump +If @var{jump} is @code{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 @samp{Mark set} is also displayed in the echo area. + +If @var{jump} is not @code{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 @emph{only} intended for interactive use. +@end deffn +@end ignore + +@defun set-mark position +This function sets the mark to @var{position}, and activates the mark. +The old value of the mark is @emph{not} pushed onto the mark ring. + +@strong{Please 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 +@code{mark-ring}. For this reason, most applications should use +@code{push-mark} and @code{pop-mark}, not @code{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: + +@example +@group +(let ((beg (point))) + (forward-line 1) + (delete-region beg (point))). +@end group +@end example +@end defun + +@c for interactive use only +@ignore +@deffn Command exchange-point-and-mark +This function exchanges the positions of point and the mark. +It is intended for interactive use. +@end deffn +@end ignore + +@defun push-mark &optional position nomsg activate +This function sets the current buffer's mark to @var{position}, and +pushes a copy of the previous mark onto @code{mark-ring}. If +@var{position} is @code{nil}, then the value of point is used. +@code{push-mark} returns @code{nil}. + +The function @code{push-mark} normally @emph{does not} activate the +mark. To do that, specify @code{t} for the argument @var{activate}. + +A @samp{Mark set} message is displayed unless @var{nomsg} is +non-@code{nil}. +@end defun + +@defun pop-mark +This function pops off the top element of @code{mark-ring} and makes +that mark become the buffer's actual mark. This does not move point in +the buffer, and it does nothing if @code{mark-ring} is empty. It +deactivates the mark. + +The return value is not meaningful. +@end defun + +@defopt transient-mark-mode +@c @cindex Transient Mark mode Redundant +This variable if non-@code{nil} enables Transient Mark mode, in which +every buffer-modifying primitive sets @code{deactivate-mark}. The +consequence of this is that commands that modify the buffer normally +make the mark inactive. + +Lisp programs can set @code{transient-mark-mode} to @code{only} to +enable Transient Mark mode for the following command only. During +that following command, the value of @code{transient-mark-mode} is +@code{identity}. If it is still @code{identity} at the end of the +command, it changes to @code{nil}. +@end defopt + +@defopt mark-even-if-inactive +If this is non-@code{nil}, Lisp programs and the Emacs user can use the +mark even when it is inactive. This option affects the behavior of +Transient Mark mode. When the option is non-@code{nil}, deactivation of +the mark turns off region highlighting, but commands that use the mark +behave as if the mark were still active. +@end defopt + +@defvar deactivate-mark +If an editor command sets this variable non-@code{nil}, then the editor +command loop deactivates the mark after the command returns (if +Transient Mark mode is enabled). All the primitives that change the +buffer set @code{deactivate-mark}, to deactivate the mark when the +command is finished. + +To write Lisp code that modifies the buffer without causing +deactivation of the mark at the end of the command, bind +@code{deactivate-mark} to @code{nil} around the code that does the +modification. For example: + +@example +(let (deactivate-mark) + (insert " ")) +@end example +@end defvar + +@defun deactivate-mark +This function deactivates the mark, if Transient Mark mode is enabled. +Otherwise it does nothing. +@end defun + +@defvar mark-active +The mark is active when this variable is non-@code{nil}. This variable +is always buffer-local in each buffer. +@end defvar + +@defvar activate-mark-hook +@defvarx deactivate-mark-hook +These normal hooks are run, respectively, when the mark becomes active +and when it becomes inactive. The hook @code{activate-mark-hook} is +also run at the end of a command if the mark is active and it is +possible that the region may have changed. +@end defvar + +@defvar mark-ring +The value of this buffer-local variable is the list of saved former +marks of the current buffer, most recent first. + +@example +@group +mark-ring +@result{} (#<marker at 11050 in markers.texi> + #<marker at 10832 in markers.texi> + @dots{}) +@end group +@end example +@end defvar + +@defopt mark-ring-max +The value of this variable is the maximum size of @code{mark-ring}. If +more marks than this are pushed onto the @code{mark-ring}, +@code{push-mark} discards an old mark when it adds a new one. +@end defopt + +@node The Region +@section The Region +@cindex region (between point and mark) + + The text between point and the mark is known as @dfn{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. + +The next two functions signal an error if the mark does not point +anywhere. If Transient Mark mode is enabled and +@code{mark-even-if-inactive} is @code{nil}, they also signal an error +if the mark is inactive. + +@defun 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. +@end defun + +@defun 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. +@end defun + + Few programs need to use the @code{region-beginning} and +@code{region-end} functions. A command designed to operate on a region +should normally use @code{interactive} with the @samp{r} specification +to find the beginning and end of the region. This lets other Lisp +programs specify the bounds explicitly as arguments. (@xref{Interactive +Codes}.) + +@ignore + arch-tag: b1ba2e7a-a0f3-4c5e-875c-7d8e22d73299 +@end ignore diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi new file mode 100644 index 00000000000..98901df87f8 --- /dev/null +++ b/doc/lispref/minibuf.texi @@ -0,0 +1,1964 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, 2002, +@c 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/minibuf +@node Minibuffers, Command Loop, Read and Print, Top +@chapter Minibuffers +@cindex arguments, reading +@cindex complex arguments +@cindex minibuffer + + A @dfn{minibuffer} is a special buffer that Emacs commands use to +read arguments more complicated than the single numeric prefix +argument. These arguments include file names, buffer names, and +command names (as in @kbd{M-x}). The minibuffer is displayed on the +bottom line of the frame, in the same place as the echo area +(@pxref{The Echo Area}), but only while it is in use for reading an +argument. + +@menu +* Intro to Minibuffers:: Basic information about minibuffers. +* Text from Minibuffer:: How to read a straight text string. +* Object from Minibuffer:: How to read a Lisp object or expression. +* Minibuffer History:: Recording previous minibuffer inputs + so the user can reuse them. +* Initial Input:: Specifying initial contents for the minibuffer. +* Completion:: How to invoke and customize completion. +* Yes-or-No Queries:: Asking a question with a simple answer. +* Multiple Queries:: Asking a series of similar questions. +* Reading a Password:: Reading a password from the terminal. +* Minibuffer Commands:: Commands used as key bindings in minibuffers. +* Minibuffer Contents:: How such commands access the minibuffer text. +* Minibuffer Windows:: Operating on the special minibuffer windows. +* Recursive Mini:: Whether recursive entry to minibuffer is allowed. +* Minibuffer Misc:: Various customization hooks and variables. +@end menu + +@node Intro to Minibuffers +@section Introduction to Minibuffers + + In most ways, a minibuffer is a normal Emacs buffer. Most operations +@emph{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 @w{@samp{ +*Minibuf-@var{number}*}}, and it cannot be changed. Minibuffers are +displayed only in special windows used only for minibuffers; these +windows always appear at the bottom of a frame. (Sometimes frames have +no minibuffer window, and sometimes a special kind of frame contains +nothing but a minibuffer window; see @ref{Minibuffers and Frames}.) + + The text in the minibuffer always starts with the @dfn{prompt string}, +the text that was specified by the program that is using the minibuffer +to tell the user what sort of input to type. This text is marked +read-only so you won't accidentally delete or change it. It is also +marked as a field (@pxref{Fields}), so that certain motion functions, +including @code{beginning-of-line}, @code{forward-word}, +@code{forward-sentence}, and @code{forward-paragraph}, stop at the +boundary between the prompt and the actual text. (In older Emacs +versions, the prompt was displayed using a special mechanism and was not +part of the buffer contents.) + + The minibuffer's window is normally a single line; it grows +automatically if necessary if the contents require more space. You can +explicitly resize it temporarily with the window sizing commands; it +reverts to its normal size when the minibuffer is exited. You can +resize it permanently by using the window sizing commands in the frame's +other window, when the minibuffer is not active. If the frame contains +just a minibuffer, you can change the minibuffer's size by changing the +frame's size. + + Use of the minibuffer reads input events, and that alters the values +of variables such as @code{this-command} and @code{last-command} +(@pxref{Command Loop Info}). Your program should bind them around the +code that uses the minibuffer, if you do not want that to change them. + + If a command uses a minibuffer while there is an active minibuffer, +this is called a @dfn{recursive minibuffer}. The first minibuffer is +named @w{@samp{ *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. We usually call this ``the'' minibuffer. You can +permit or forbid recursive minibuffers by setting the variable +@code{enable-recursive-minibuffers} or by putting properties of that +name on command symbols (@pxref{Recursive Mini}). + + Like other buffers, a minibuffer uses a local keymap +(@pxref{Keymaps}) to specify special key bindings. The function that +invokes the minibuffer also sets up its local map according to the job +to be done. @xref{Text from Minibuffer}, for the non-completion +minibuffer local maps. @xref{Completion Commands}, for the minibuffer +local maps for completion. + + When Emacs is running in batch mode, any request to read from the +minibuffer actually reads a line from the standard input descriptor that +was supplied when Emacs was started. + +@node Text from Minibuffer +@section Reading Text Strings with the Minibuffer + + Most often, the minibuffer is used to read text as a string. It can +also be used to read a Lisp object in textual form. The most basic +primitive for minibuffer input is @code{read-from-minibuffer}; it can do +either one. There are also specialized commands for reading +commands, variables, file names, etc. (@pxref{Completion}). + + In most cases, you should not call minibuffer input functions in the +middle of a Lisp function. Instead, do all minibuffer input as part of +reading the arguments for a command, in the @code{interactive} +specification. @xref{Defining Commands}. + +@defun read-from-minibuffer prompt-string &optional initial-contents keymap read hist default inherit-input-method +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 @var{read} is non-@code{nil}, then it uses +@code{read} to convert the text into a Lisp object (@pxref{Input +Functions}). + +The first thing this function does is to activate a minibuffer and +display it with @var{prompt-string} as the prompt. This value must be a +string. Then the user can edit text in the minibuffer. + +When the user types a command to exit the minibuffer, +@code{read-from-minibuffer} constructs the return value from the text in +the minibuffer. Normally it returns a string containing that text. +However, if @var{read} is non-@code{nil}, @code{read-from-minibuffer} +reads the text and returns the resulting Lisp object, unevaluated. +(@xref{Input Functions}, for information about reading.) + +The argument @var{default} specifies a default value to make available +through the history commands. It should be a string, or @code{nil}. +If non-@code{nil}, the user can access it using +@code{next-history-element}, usually bound in the minibuffer to +@kbd{M-n}. If @var{read} is non-@code{nil}, then @var{default} is +also used as the input to @code{read}, if the user enters empty input. +(If @var{read} is non-@code{nil} and @var{default} is @code{nil}, empty +input results in an @code{end-of-file} error.) However, in the usual +case (where @var{read} is @code{nil}), @code{read-from-minibuffer} +ignores @var{default} when the user enters empty input and returns an +empty string, @code{""}. In this respect, it is different from all +the other minibuffer input functions in this chapter. + +If @var{keymap} is non-@code{nil}, that keymap is the local keymap to +use in the minibuffer. If @var{keymap} is omitted or @code{nil}, the +value of @code{minibuffer-local-map} is used as the keymap. Specifying +a keymap is the most important way to customize the minibuffer for +various applications such as completion. + +The argument @var{hist} specifies which history list variable to use +for saving the input and for history commands used in the minibuffer. +It defaults to @code{minibuffer-history}. @xref{Minibuffer History}. + +If the variable @code{minibuffer-allow-text-properties} is +non-@code{nil}, then the string which is returned includes whatever text +properties were present in the minibuffer. Otherwise all the text +properties are stripped when the value is returned. + +If the argument @var{inherit-input-method} is non-@code{nil}, then the +minibuffer inherits the current input method (@pxref{Input Methods}) and +the setting of @code{enable-multibyte-characters} (@pxref{Text +Representations}) from whichever buffer was current before entering the +minibuffer. + +Use of @var{initial-contents} is mostly deprecated; we recommend using +a non-@code{nil} value only in conjunction with specifying a cons cell +for @var{hist}. @xref{Initial Input}. +@end defun + +@defun read-string prompt &optional initial history default inherit-input-method +This function reads a string from the minibuffer and returns it. The +arguments @var{prompt}, @var{initial}, @var{history} and +@var{inherit-input-method} are used as in @code{read-from-minibuffer}. +The keymap used is @code{minibuffer-local-map}. + +The optional argument @var{default} is used as in +@code{read-from-minibuffer}, except that, if non-@code{nil}, it also +specifies a default value to return if the user enters null input. As +in @code{read-from-minibuffer} it should be a string, or @code{nil}, +which is equivalent to an empty string. + +This function is a simplified interface to the +@code{read-from-minibuffer} function: + +@smallexample +@group +(read-string @var{prompt} @var{initial} @var{history} @var{default} @var{inherit}) +@equiv{} +(let ((value + (read-from-minibuffer @var{prompt} @var{initial} nil nil + @var{history} @var{default} @var{inherit}))) + (if (and (equal value "") @var{default}) + @var{default} + value)) +@end group +@end smallexample +@end defun + +@defvar minibuffer-allow-text-properties +If this variable is @code{nil}, then @code{read-from-minibuffer} strips +all text properties from the minibuffer input before returning it. +This variable also affects @code{read-string}. However, +@code{read-no-blanks-input} (see below), as well as +@code{read-minibuffer} and related functions (@pxref{Object from +Minibuffer,, Reading Lisp Objects With the Minibuffer}), and all +functions that do minibuffer input with completion, discard text +properties unconditionally, regardless of the value of this variable. +@end defvar + +@defvar minibuffer-local-map +This +@anchor{Definition of minibuffer-local-map} +@c avoid page break at anchor; work around Texinfo deficiency +is the default local keymap for reading from the minibuffer. By +default, it makes the following bindings: + +@table @asis +@item @kbd{C-j} +@code{exit-minibuffer} + +@item @key{RET} +@code{exit-minibuffer} + +@item @kbd{C-g} +@code{abort-recursive-edit} + +@item @kbd{M-n} +@itemx @key{DOWN} +@code{next-history-element} + +@item @kbd{M-p} +@itemx @key{UP} +@code{previous-history-element} + +@item @kbd{M-s} +@code{next-matching-history-element} + +@item @kbd{M-r} +@code{previous-matching-history-element} +@end table +@end defvar + +@c In version 18, initial is required +@c Emacs 19 feature +@defun read-no-blanks-input prompt &optional initial inherit-input-method +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 @var{prompt}, @var{initial}, and +@var{inherit-input-method} are used as in @code{read-from-minibuffer}. + +This is a simplified interface to the @code{read-from-minibuffer} +function, and passes the value of the @code{minibuffer-local-ns-map} +keymap as the @var{keymap} argument for that function. Since the keymap +@code{minibuffer-local-ns-map} does not rebind @kbd{C-q}, it @emph{is} +possible to put a space into the string, by quoting it. + +This function discards text properties, regardless of the value of +@code{minibuffer-allow-text-properties}. + +@smallexample +@group +(read-no-blanks-input @var{prompt} @var{initial}) +@equiv{} +(let (minibuffer-allow-text-properties) + (read-from-minibuffer @var{prompt} @var{initial} minibuffer-local-ns-map)) +@end group +@end smallexample +@end defun + +@defvar minibuffer-local-ns-map +This built-in variable is the keymap used as the minibuffer local keymap +in the function @code{read-no-blanks-input}. By default, it makes the +following bindings, in addition to those of @code{minibuffer-local-map}: + +@table @asis +@item @key{SPC} +@cindex @key{SPC} in minibuffer +@code{exit-minibuffer} + +@item @key{TAB} +@cindex @key{TAB} in minibuffer +@code{exit-minibuffer} + +@item @kbd{?} +@cindex @kbd{?} in minibuffer +@code{self-insert-and-exit} +@end table +@end defvar + +@node Object from Minibuffer +@section Reading Lisp Objects with the Minibuffer + + This section describes functions for reading Lisp objects with the +minibuffer. + +@defun read-minibuffer prompt &optional initial +This function reads a Lisp object using the minibuffer, and returns it +without evaluating it. The arguments @var{prompt} and @var{initial} are +used as in @code{read-from-minibuffer}. + +This is a simplified interface to the +@code{read-from-minibuffer} function: + +@smallexample +@group +(read-minibuffer @var{prompt} @var{initial}) +@equiv{} +(let (minibuffer-allow-text-properties) + (read-from-minibuffer @var{prompt} @var{initial} nil t)) +@end group +@end smallexample + +Here is an example in which we supply the string @code{"(testing)"} as +initial input: + +@smallexample +@group +(read-minibuffer + "Enter an expression: " (format "%s" '(testing))) + +;; @r{Here is how the minibuffer is displayed:} +@end group + +@group +---------- Buffer: Minibuffer ---------- +Enter an expression: (testing)@point{} +---------- Buffer: Minibuffer ---------- +@end group +@end smallexample + +@noindent +The user can type @key{RET} immediately to use the initial input as a +default, or can edit the input. +@end defun + +@defun eval-minibuffer prompt &optional initial +This function reads a Lisp expression using the minibuffer, evaluates +it, then returns the result. The arguments @var{prompt} and +@var{initial} are used as in @code{read-from-minibuffer}. + +This function simply evaluates the result of a call to +@code{read-minibuffer}: + +@smallexample +@group +(eval-minibuffer @var{prompt} @var{initial}) +@equiv{} +(eval (read-minibuffer @var{prompt} @var{initial})) +@end group +@end smallexample +@end defun + +@defun 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 +@code{eval-minibuffer} is that here the initial @var{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 +@code{prin1}, so if it is a string, double-quote characters (@samp{"}) +appear in the initial text. @xref{Output Functions}. + +The first thing @code{edit-and-eval-command} does is to activate the +minibuffer with @var{prompt} as the prompt. Then it inserts the printed +representation of @var{form} in the minibuffer, and lets the user edit it. +When the user exits the minibuffer, the edited text is read with +@code{read} and then evaluated. The resulting value becomes the value +of @code{edit-and-eval-command}. + +In the following example, we offer the user an expression with initial +text which is a valid form already: + +@smallexample +@group +(edit-and-eval-command "Please edit: " '(forward-word 1)) + +;; @r{After evaluation of the preceding expression,} +;; @r{the following appears in the minibuffer:} +@end group + +@group +---------- Buffer: Minibuffer ---------- +Please edit: (forward-word 1)@point{} +---------- Buffer: Minibuffer ---------- +@end group +@end smallexample + +@noindent +Typing @key{RET} right away would exit the minibuffer and evaluate the +expression, thus moving point forward one word. +@code{edit-and-eval-command} returns @code{nil} in this example. +@end defun + +@node Minibuffer History +@section Minibuffer History +@cindex minibuffer history +@cindex history list + + A @dfn{minibuffer history list} records previous minibuffer inputs so +the user can reuse them conveniently. A history list is actually a +symbol, not a list; it is a variable whose value is a list of strings +(previous inputs), most recent first. + + There are many separate history lists, used for different kinds of +inputs. It's the Lisp programmer's job to specify the right history +list for each use of the minibuffer. + + You specify the history list with the optional @var{hist} argument +to either @code{read-from-minibuffer} or @code{completing-read}. Here +are the possible values for it: + +@table @asis +@item @var{variable} +Use @var{variable} (a symbol) as the history list. + +@item (@var{variable} . @var{startpos}) +Use @var{variable} (a symbol) as the history list, and assume that the +initial history position is @var{startpos} (a nonnegative integer). + +Specifying 0 for @var{startpos} is equivalent to just specifying the +symbol @var{variable}. @code{previous-history-element} will display +the most recent element of the history list in the minibuffer. If you +specify a positive @var{startpos}, the minibuffer history functions +behave as if @code{(elt @var{variable} (1- @var{STARTPOS}))} were the +history element currently shown in the minibuffer. + +For consistency, you should also specify that element of the history +as the initial minibuffer contents, using the @var{initial} argument +to the minibuffer input function (@pxref{Initial Input}). +@end table + + If you don't specify @var{hist}, then the default history list +@code{minibuffer-history} is used. For other standard history lists, +see below. You can also create your own history list variable; just +initialize it to @code{nil} before the first use. + + Both @code{read-from-minibuffer} and @code{completing-read} add new +elements to the history list automatically, and provide commands to +allow the user to reuse items on the list. The only thing your program +needs to do to use a history list is to initialize it and to pass its +name to the input functions when you wish. But it is safe to modify the +list by hand when the minibuffer input functions are not using it. + + Emacs functions that add a new element to a history list can also +delete old elements if the list gets too long. The variable +@code{history-length} specifies the maximum length for most history +lists. To specify a different maximum length for a particular history +list, put the length in the @code{history-length} property of the +history list symbol. The variable @code{history-delete-duplicates} +specifies whether to delete duplicates in history. + +@defun add-to-history history-var newelt &optional maxelt keep-all +This function adds a new element @var{newelt}, if it isn't the empty +string, to the history list stored in the variable @var{history-var}, +and returns the updated history list. It limits the list length to +the value of @var{maxelt} (if non-@code{nil}) or @code{history-length} +(described below). The possible values of @var{maxelt} have the same +meaning as the values of @code{history-length}. + +Normally, @code{add-to-history} removes duplicate members from the +history list if @code{history-delete-duplicates} is non-@code{nil}. +However, if @var{keep-all} is non-@code{nil}, that says not to remove +duplicates, and to add @var{newelt} to the list even if it is empty. +@end defun + +@defvar history-add-new-input +If the value of this variable is @code{nil}, standard functions that +read from the minibuffer don't add new elements to the history list. +This lets Lisp programs explicitly manage input history by using +@code{add-to-history}. By default, @code{history-add-new-input} is +set to a non-@code{nil} value. +@end defvar + +@defvar history-length +The value of this variable specifies the maximum length for all +history lists that don't specify their own maximum lengths. If the +value is @code{t}, that means there no maximum (don't delete old +elements). The value of @code{history-length} property of the history +list variable's symbol, if set, overrides this variable for that +particular history list. +@end defvar + +@defvar history-delete-duplicates +If the value of this variable is @code{t}, that means when adding a +new history element, all previous identical elements are deleted. +@end defvar + + Here are some of the standard minibuffer history list variables: + +@defvar minibuffer-history +The default history list for minibuffer history input. +@end defvar + +@defvar query-replace-history +A history list for arguments to @code{query-replace} (and similar +arguments to other commands). +@end defvar + +@defvar file-name-history +A history list for file-name arguments. +@end defvar + +@defvar buffer-name-history +A history list for buffer-name arguments. +@end defvar + +@defvar regexp-history +A history list for regular expression arguments. +@end defvar + +@defvar extended-command-history +A history list for arguments that are names of extended commands. +@end defvar + +@defvar shell-command-history +A history list for arguments that are shell commands. +@end defvar + +@defvar read-expression-history +A history list for arguments that are Lisp expressions to evaluate. +@end defvar + +@node Initial Input +@section Initial Input + +Several of the functions for minibuffer input have an argument called +@var{initial} or @var{initial-contents}. This is a mostly-deprecated +feature for specifying that the minibuffer should start out with +certain text, instead of empty as usual. + +If @var{initial} is a string, the minibuffer starts out containing the +text of the string, with point at the end, when the user starts to +edit the text. If the user simply types @key{RET} to exit the +minibuffer, it will use the initial input string to determine the +value to return. + +@strong{We discourage use of a non-@code{nil} value for +@var{initial}}, because initial input is an intrusive interface. +History lists and default values provide a much more convenient method +to offer useful default inputs to the user. + +There is just one situation where you should specify a string for an +@var{initial} argument. This is when you specify a cons cell for the +@var{hist} or @var{history} argument. @xref{Minibuffer History}. + +@var{initial} can also be a cons cell of the form @code{(@var{string} +. @var{position})}. This means to insert @var{string} in the +minibuffer but put point at @var{position} within the string's text. + +As a historical accident, @var{position} was implemented +inconsistently in different functions. In @code{completing-read}, +@var{position}'s value is interpreted as origin-zero; that is, a value +of 0 means the beginning of the string, 1 means after the first +character, etc. In @code{read-minibuffer}, and the other +non-completion minibuffer input functions that support this argument, +1 means the beginning of the string 2 means after the first character, +etc. + +Use of a cons cell as the value for @var{initial} arguments is +deprecated in user code. + +@node Completion +@section Completion +@cindex completion + + @dfn{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 @kbd{C-x b} (@code{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 @key{TAB} (@code{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 @code{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 @code{completing-read} provides a higher-level interface +for completion. A call to @code{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. + +@menu +* Basic Completion:: Low-level functions for completing strings. + (These are too low level to use the minibuffer.) +* Minibuffer Completion:: Invoking the minibuffer with completion. +* Completion Commands:: Minibuffer commands that do completion. +* High-Level Completion:: Convenient special cases of completion + (reading buffer name, file name, etc.) +* Reading File Names:: Using completion to read file names. +* Programmed Completion:: Writing your own completion-function. +@end menu + +@node Basic Completion +@subsection Basic Completion Functions + + The completion functions @code{try-completion}, +@code{all-completions} and @code{test-completion} have nothing in +themselves to do with minibuffers. We describe them in this chapter +so as to keep them near the higher-level completion features that do +use the minibuffer. + + If you store a completion alist in a variable, you should mark the +variable as ``risky'' with a non-@code{nil} +@code{risky-local-variable} property. + +@defun try-completion string collection &optional predicate +This function returns the longest common substring of all possible +completions of @var{string} in @var{collection}. The value of +@var{collection} must be a list of strings or symbols, an alist, an +obarray, a hash table, or a function that implements a virtual set of +strings (see below). + +Completion compares @var{string} against each of the permissible +completions specified by @var{collection}; if the beginning of the +permissible completion equals @var{string}, it matches. If no permissible +completions match, @code{try-completion} returns @code{nil}. If only +one permissible completion matches, and the match is exact, then +@code{try-completion} returns @code{t}. Otherwise, the value is the +longest initial sequence common to all the permissible completions that +match. + +If @var{collection} is an alist (@pxref{Association Lists}), the +permissible completions are the elements of the alist that are either +strings, symbols, or conses whose @sc{car} is a string or symbol. +Symbols are converted to strings using @code{symbol-name}. Other +elements of the alist are ignored. (Remember that in Emacs Lisp, the +elements of alists do not @emph{have} to be conses.) In particular, a +list of strings or symbols is allowed, even though we usually do not +think of such lists as alists. + +@cindex obarray in completion +If @var{collection} is an obarray (@pxref{Creating Symbols}), the names +of all symbols in the obarray form the set of permissible completions. The +global variable @code{obarray} holds an obarray containing the names of +all interned Lisp symbols. + +Note that the only valid way to make a new obarray is to create it +empty and then add symbols to it one by one using @code{intern}. +Also, you cannot intern a given symbol in more than one obarray. + +If @var{collection} is a hash table, then the keys that are strings +are the possible completions. Other keys are ignored. + +You can also use a symbol that is a function as @var{collection}. Then +the function is solely responsible for performing completion; +@code{try-completion} returns whatever this function returns. The +function is called with three arguments: @var{string}, @var{predicate} +and @code{nil}. (The reason for the third argument is so that the same +function can be used in @code{all-completions} and do the appropriate +thing in either case.) @xref{Programmed Completion}. + +If the argument @var{predicate} is non-@code{nil}, then it must be a +function of one argument, unless @var{collection} is a hash table, in +which case it should be a function of two arguments. It is used to +test each possible match, and the match is accepted only if +@var{predicate} returns non-@code{nil}. The argument given to +@var{predicate} is either a string or a cons cell (the @sc{car} of +which is a string) from the alist, or a symbol (@emph{not} a symbol +name) from the obarray. If @var{collection} is a hash table, +@var{predicate} is called with two arguments, the string key and the +associated value. + +In addition, to be acceptable, a completion must also match all the +regular expressions in @code{completion-regexp-list}. (Unless +@var{collection} is a function, in which case that function has to +handle @code{completion-regexp-list} itself.) + +In the first of the following examples, the string @samp{foo} is +matched by three of the alist @sc{car}s. All of the matches begin with +the characters @samp{fooba}, so that is the result. In the second +example, there is only one possible match, and it is exact, so the value +is @code{t}. + +@smallexample +@group +(try-completion + "foo" + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))) + @result{} "fooba" +@end group + +@group +(try-completion "foo" '(("barfoo" 2) ("foo" 3))) + @result{} t +@end group +@end smallexample + +In the following example, numerous symbols begin with the characters +@samp{forw}, and all of them begin with the word @samp{forward}. In +most of the symbols, this is followed with a @samp{-}, but not in all, +so no more than @samp{forward} can be completed. + +@smallexample +@group +(try-completion "forw" obarray) + @result{} "forward" +@end group +@end smallexample + +Finally, in the following example, only two of the three possible +matches pass the predicate @code{test} (the string @samp{foobaz} is +too short). Both of those begin with the string @samp{foobar}. + +@smallexample +@group +(defun test (s) + (> (length (car s)) 6)) + @result{} test +@end group +@group +(try-completion + "foo" + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) + 'test) + @result{} "foobar" +@end group +@end smallexample +@end defun + +@defun all-completions string collection &optional predicate nospace +This function returns a list of all possible completions of +@var{string}. The arguments to this function (aside from +@var{nospace}) are the same as those of @code{try-completion}. Also, +this function uses @code{completion-regexp-list} in the same way that +@code{try-completion} does. The optional argument @var{nospace} only +matters if @var{string} is the empty string. In that case, if +@var{nospace} is non-@code{nil}, completions that start with a space +are ignored. + +If @var{collection} is a function, it is called with three arguments: +@var{string}, @var{predicate} and @code{t}; then @code{all-completions} +returns whatever the function returns. @xref{Programmed Completion}. + +Here is an example, using the function @code{test} shown in the +example for @code{try-completion}: + +@smallexample +@group +(defun test (s) + (> (length (car s)) 6)) + @result{} test +@end group + +@group +(all-completions + "foo" + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) + 'test) + @result{} ("foobar1" "foobar2") +@end group +@end smallexample +@end defun + +@defun test-completion string collection &optional predicate +@anchor{Definition of test-completion} +This function returns non-@code{nil} if @var{string} is a valid +completion possibility specified by @var{collection} and +@var{predicate}. The arguments are the same as in +@code{try-completion}. For instance, if @var{collection} is a list of +strings, this is true if @var{string} appears in the list and +@var{predicate} is satisfied. + +This function uses @code{completion-regexp-list} in the same +way that @code{try-completion} does. + +If @var{predicate} is non-@code{nil} and if @var{collection} contains +several strings that are equal to each other, as determined by +@code{compare-strings} according to @code{completion-ignore-case}, +then @var{predicate} should accept either all or none of them. +Otherwise, the return value of @code{test-completion} is essentially +unpredictable. + +If @var{collection} is a function, it is called with three arguments, +the values @var{string}, @var{predicate} and @code{lambda}; whatever +it returns, @code{test-completion} returns in turn. +@end defun + +@defvar completion-ignore-case +If the value of this variable is non-@code{nil}, Emacs does not +consider case significant in completion. +@end defvar + +@defvar completion-regexp-list +This is a list of regular expressions. The completion functions only +consider a completion acceptable if it matches all regular expressions +in this list, with @code{case-fold-search} (@pxref{Searching and Case}) +bound to the value of @code{completion-ignore-case}. +@end defvar + +@defmac lazy-completion-table var fun +This macro provides a way to initialize the variable @var{var} as a +collection for completion in a lazy way, not computing its actual +contents until they are first needed. You use this macro to produce a +value that you store in @var{var}. The actual computation of the +proper value is done the first time you do completion using @var{var}. +It is done by calling @var{fun} with no arguments. The +value @var{fun} returns becomes the permanent value of @var{var}. + +Here is an example of use: + +@smallexample +(defvar foo (lazy-completion-table foo make-my-alist)) +@end smallexample +@end defmac + +@node Minibuffer Completion +@subsection Completion and the Minibuffer +@cindex minibuffer completion +@cindex reading from minibuffer with completion + + This section describes the basic interface for reading from the +minibuffer with completion. + +@defun completing-read prompt collection &optional predicate require-match initial hist default inherit-input-method +This function reads a string in the minibuffer, assisting the user by +providing completion. It activates the minibuffer with prompt +@var{prompt}, which must be a string. + +The actual completion is done by passing @var{collection} and +@var{predicate} to the function @code{try-completion}. This happens +in certain commands bound in the local keymaps used for completion. +Some of these commands also call @code{test-completion}. Thus, if +@var{predicate} is non-@code{nil}, it should be compatible with +@var{collection} and @code{completion-ignore-case}. @xref{Definition +of test-completion}. + +If @var{require-match} is @code{nil}, the exit commands work regardless +of the input in the minibuffer. If @var{require-match} is @code{t}, the +usual minibuffer exit commands won't exit unless the input completes to +an element of @var{collection}. If @var{require-match} is neither +@code{nil} nor @code{t}, then the exit commands won't exit unless the +input already in the buffer matches an element of @var{collection}. + +However, empty input is always permitted, regardless of the value of +@var{require-match}; in that case, @code{completing-read} returns +@var{default}, or @code{""}, if @var{default} is @code{nil}. The +value of @var{default} (if non-@code{nil}) is also available to the +user through the history commands. + +The function @code{completing-read} uses +@code{minibuffer-local-completion-map} as the keymap if +@var{require-match} is @code{nil}, and uses +@code{minibuffer-local-must-match-map} if @var{require-match} is +non-@code{nil}. @xref{Completion Commands}. + +The argument @var{hist} specifies which history list variable to use for +saving the input and for minibuffer history commands. It defaults to +@code{minibuffer-history}. @xref{Minibuffer History}. + +The argument @var{initial} is mostly deprecated; we recommend using a +non-@code{nil} value only in conjunction with specifying a cons cell +for @var{hist}. @xref{Initial Input}. For default input, use +@var{default} instead. + +If the argument @var{inherit-input-method} is non-@code{nil}, then the +minibuffer inherits the current input method (@pxref{Input +Methods}) and the setting of @code{enable-multibyte-characters} +(@pxref{Text Representations}) from whichever buffer was current before +entering the minibuffer. + +If the built-in variable @code{completion-ignore-case} is +non-@code{nil}, completion ignores case when comparing the input +against the possible matches. @xref{Basic Completion}. In this mode +of operation, @var{predicate} must also ignore case, or you will get +surprising results. + +Here's an example of using @code{completing-read}: + +@smallexample +@group +(completing-read + "Complete a foo: " + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) + nil t "fo") +@end group + +@group +;; @r{After evaluation of the preceding expression,} +;; @r{the following appears in the minibuffer:} + +---------- Buffer: Minibuffer ---------- +Complete a foo: fo@point{} +---------- Buffer: Minibuffer ---------- +@end group +@end smallexample + +@noindent +If the user then types @kbd{@key{DEL} @key{DEL} b @key{RET}}, +@code{completing-read} returns @code{barfoo}. + +The @code{completing-read} function binds variables to pass +information to the commands that actually do completion. +They are described in the following section. +@end defun + +@node Completion Commands +@subsection Minibuffer Commands that Do Completion + + This section describes the keymaps, commands and user options used +in the minibuffer to do completion. The description refers to the +situation when Partial Completion mode is disabled (as it is by +default). When enabled, this minor mode uses its own alternatives to +some of the commands described below. @xref{Completion Options,,, +emacs, The GNU Emacs Manual}, for a short description of Partial +Completion mode. + +@defvar minibuffer-completion-table +The value of this variable is the collection used for completion in +the minibuffer. This is the global variable that contains what +@code{completing-read} passes to @code{try-completion}. It is used by +minibuffer completion commands such as @code{minibuffer-complete-word}. +@end defvar + +@defvar minibuffer-completion-predicate +This variable's value is the predicate that @code{completing-read} +passes to @code{try-completion}. The variable is also used by the other +minibuffer completion functions. +@end defvar + +@defvar minibuffer-completion-confirm +When the value of this variable is non-@code{nil}, Emacs asks for +confirmation of a completion before exiting the minibuffer. +@code{completing-read} binds this variable, and the function +@code{minibuffer-complete-and-exit} checks the value before exiting. +@end defvar + +@deffn Command minibuffer-complete-word +This function completes the minibuffer contents by at most a single +word. Even if the minibuffer contents have only one completion, +@code{minibuffer-complete-word} does not add any characters beyond the +first character that is not a word constituent. @xref{Syntax Tables}. +@end deffn + +@deffn Command minibuffer-complete +This function completes the minibuffer contents as far as possible. +@end deffn + +@deffn Command minibuffer-complete-and-exit +This function completes the minibuffer contents, and exits if +confirmation is not required, i.e., if +@code{minibuffer-completion-confirm} is @code{nil}. If confirmation +@emph{is} required, it is given by repeating this command +immediately---the command is programmed to work without confirmation +when run twice in succession. +@end deffn + +@deffn Command minibuffer-completion-help +This function creates a list of the possible completions of the +current minibuffer contents. It works by calling @code{all-completions} +using the value of the variable @code{minibuffer-completion-table} as +the @var{collection} argument, and the value of +@code{minibuffer-completion-predicate} as the @var{predicate} argument. +The list of completions is displayed as text in a buffer named +@samp{*Completions*}. +@end deffn + +@defun display-completion-list completions &optional common-substring +This function displays @var{completions} to the stream in +@code{standard-output}, usually a buffer. (@xref{Read and Print}, for more +information about streams.) The argument @var{completions} is normally +a list of completions just returned by @code{all-completions}, but it +does not have to be. Each element may be a symbol or a string, either +of which is simply printed. It can also be a list of two strings, +which is printed as if the strings were concatenated. The first of +the two strings is the actual completion, the second string serves as +annotation. + +The argument @var{common-substring} is the prefix that is common to +all the completions. With normal Emacs completion, it is usually the +same as the string that was completed. @code{display-completion-list} +uses this to highlight text in the completion list for better visual +feedback. This is not needed in the minibuffer; for minibuffer +completion, you can pass @code{nil}. + +This function is called by @code{minibuffer-completion-help}. The +most common way to use it is together with +@code{with-output-to-temp-buffer}, like this: + +@example +(with-output-to-temp-buffer "*Completions*" + (display-completion-list + (all-completions (buffer-string) my-alist) + (buffer-string))) +@end example +@end defun + +@defopt completion-auto-help +If this variable is non-@code{nil}, the completion commands +automatically display a list of possible completions whenever nothing +can be completed because the next character is not uniquely determined. +@end defopt + +@defvar minibuffer-local-completion-map +@code{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: + +@table @asis +@item @kbd{?} +@code{minibuffer-completion-help} + +@item @key{SPC} +@code{minibuffer-complete-word} + +@item @key{TAB} +@code{minibuffer-complete} +@end table + +@noindent +with other characters bound as in @code{minibuffer-local-map} +(@pxref{Definition of minibuffer-local-map}). +@end defvar + +@defvar minibuffer-local-must-match-map +@code{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 @code{exit-minibuffer}, the command that exits the +minibuffer unconditionally. By default, this keymap makes the following +bindings: + +@table @asis +@item @kbd{?} +@code{minibuffer-completion-help} + +@item @key{SPC} +@code{minibuffer-complete-word} + +@item @key{TAB} +@code{minibuffer-complete} + +@item @kbd{C-j} +@code{minibuffer-complete-and-exit} + +@item @key{RET} +@code{minibuffer-complete-and-exit} +@end table + +@noindent +with other characters bound as in @code{minibuffer-local-map}. +@end defvar + +@defvar minibuffer-local-filename-completion-map +This is like @code{minibuffer-local-completion-map} +except that it does not bind @key{SPC}. This keymap is used by the +function @code{read-file-name}. +@end defvar + +@defvar minibuffer-local-must-match-filename-map +This is like @code{minibuffer-local-must-match-map} +except that it does not bind @key{SPC}. This keymap is used by the +function @code{read-file-name}. +@end defvar + +@node High-Level Completion +@subsection High-Level Completion Functions + + This section describes the higher-level convenient functions for +reading certain sorts of names with completion. + + In most cases, you should not call these functions in the middle of a +Lisp function. When possible, do all minibuffer input as part of +reading the arguments for a command, in the @code{interactive} +specification. @xref{Defining Commands}. + +@defun read-buffer prompt &optional default existing +This function reads the name of a buffer and returns it as a string. +The argument @var{default} is the default name to use, the value to +return if the user exits with an empty minibuffer. If non-@code{nil}, +it should be a string or a buffer. It is mentioned in the prompt, but +is not inserted in the minibuffer as initial input. + +The argument @var{prompt} should be a string ending with a colon and a +space. If @var{default} is non-@code{nil}, the function inserts it in +@var{prompt} before the colon to follow the convention for reading from +the minibuffer with a default value (@pxref{Programming Tips}). + +If @var{existing} is non-@code{nil}, then the name specified must be +that of an existing buffer. The usual commands to exit the minibuffer +do not exit if the text is not valid, and @key{RET} does completion to +attempt to find a valid name. If @var{existing} is neither @code{nil} +nor @code{t}, confirmation is required after completion. (However, +@var{default} is not checked for validity; it is returned, whatever it +is, if the user exits with the minibuffer empty.) + +In the following example, the user enters @samp{minibuffer.t}, and +then types @key{RET}. The argument @var{existing} is @code{t}, and the +only buffer name starting with the given input is +@samp{minibuffer.texi}, so that name is the value. + +@example +(read-buffer "Buffer name: " "foo" t) +@group +;; @r{After evaluation of the preceding expression,} +;; @r{the following prompt appears,} +;; @r{with an empty minibuffer:} +@end group + +@group +---------- Buffer: Minibuffer ---------- +Buffer name (default foo): @point{} +---------- Buffer: Minibuffer ---------- +@end group + +@group +;; @r{The user types @kbd{minibuffer.t @key{RET}}.} + @result{} "minibuffer.texi" +@end group +@end example +@end defun + +@defvar read-buffer-function +This variable specifies how to read buffer names. For example, if you +set this variable to @code{iswitchb-read-buffer}, all Emacs commands +that call @code{read-buffer} to read a buffer name will actually use the +@code{iswitchb} package to read it. +@end defvar + +@defun read-command prompt &optional default +This function reads the name of a command and returns it as a Lisp +symbol. The argument @var{prompt} is used as in +@code{read-from-minibuffer}. Recall that a command is anything for +which @code{commandp} returns @code{t}, and a command name is a symbol +for which @code{commandp} returns @code{t}. @xref{Interactive Call}. + +The argument @var{default} specifies what to return if the user enters +null input. It can be a symbol or a string; if it is a string, +@code{read-command} interns it before returning it. If @var{default} is +@code{nil}, that means no default has been specified; then if the user +enters null input, the return value is @code{(intern "")}, that is, a +symbol whose name is an empty string. + +@example +(read-command "Command name? ") + +@group +;; @r{After evaluation of the preceding expression,} +;; @r{the following prompt appears with an empty minibuffer:} +@end group + +@group +---------- Buffer: Minibuffer ---------- +Command name? +---------- Buffer: Minibuffer ---------- +@end group +@end example + +@noindent +If the user types @kbd{forward-c @key{RET}}, then this function returns +@code{forward-char}. + +The @code{read-command} function is a simplified interface to +@code{completing-read}. It uses the variable @code{obarray} so as to +complete in the set of extant Lisp symbols, and it uses the +@code{commandp} predicate so as to accept only command names: + +@cindex @code{commandp} example +@example +@group +(read-command @var{prompt}) +@equiv{} +(intern (completing-read @var{prompt} obarray + 'commandp t nil)) +@end group +@end example +@end defun + +@defun read-variable prompt &optional default +@anchor{Definition of read-variable} +This function reads the name of a user variable and returns it as a +symbol. + +The argument @var{default} specifies what to return if the user enters +null input. It can be a symbol or a string; if it is a string, +@code{read-variable} interns it before returning it. If @var{default} +is @code{nil}, that means no default has been specified; then if the +user enters null input, the return value is @code{(intern "")}. + +@example +@group +(read-variable "Variable name? ") + +;; @r{After evaluation of the preceding expression,} +;; @r{the following prompt appears,} +;; @r{with an empty minibuffer:} +@end group + +@group +---------- Buffer: Minibuffer ---------- +Variable name? @point{} +---------- Buffer: Minibuffer ---------- +@end group +@end example + +@noindent +If the user then types @kbd{fill-p @key{RET}}, @code{read-variable} +returns @code{fill-prefix}. + +In general, @code{read-variable} is similar to @code{read-command}, +but uses the predicate @code{user-variable-p} instead of +@code{commandp}: + +@cindex @code{user-variable-p} example +@example +@group +(read-variable @var{prompt}) +@equiv{} +(intern + (completing-read @var{prompt} obarray + 'user-variable-p t nil)) +@end group +@end example +@end defun + + See also the functions @code{read-coding-system} and +@code{read-non-nil-coding-system}, in @ref{User-Chosen Coding Systems}, +and @code{read-input-method-name}, in @ref{Input Methods}. + +@node Reading File Names +@subsection Reading File Names +@cindex read file names +@cindex prompt for file name + + Here is another high-level completion function, designed for reading a +file name. It provides special features including automatic insertion +of the default directory. + +@defun read-file-name prompt &optional directory default existing initial predicate +This function reads a file name in the minibuffer, prompting with +@var{prompt} and providing completion. + +If @var{existing} is non-@code{nil}, then the user must specify the name +of an existing file; @key{RET} performs completion to make the name +valid if possible, and then refuses to exit if it is not valid. If the +value of @var{existing} is neither @code{nil} nor @code{t}, then +@key{RET} also requires confirmation after completion. If +@var{existing} is @code{nil}, then the name of a nonexistent file is +acceptable. + +@code{read-file-name} uses +@code{minibuffer-local-filename-completion-map} as the keymap if +@var{existing} is @code{nil}, and uses +@code{minibuffer-local-must-match-filename-map} if @var{existing} is +non-@code{nil}. @xref{Completion Commands}. + +The argument @var{directory} specifies the directory to use for +completion of relative file names. It should be an absolute directory +name. If @code{insert-default-directory} is non-@code{nil}, +@var{directory} is also inserted in the minibuffer as initial input. +It defaults to the current buffer's value of @code{default-directory}. + +@c Emacs 19 feature +If you specify @var{initial}, that is an initial file name to insert +in the buffer (after @var{directory}, if that is inserted). In this +case, point goes at the beginning of @var{initial}. The default for +@var{initial} is @code{nil}---don't insert any file name. To see what +@var{initial} does, try the command @kbd{C-x C-v}. @strong{Please +note:} we recommend using @var{default} rather than @var{initial} in +most cases. + +If @var{default} is non-@code{nil}, then the function returns +@var{default} if the user exits the minibuffer with the same non-empty +contents that @code{read-file-name} inserted initially. The initial +minibuffer contents are always non-empty if +@code{insert-default-directory} is non-@code{nil}, as it is by +default. @var{default} is not checked for validity, regardless of the +value of @var{existing}. However, if @var{existing} is +non-@code{nil}, the initial minibuffer contents should be a valid file +(or directory) name. Otherwise @code{read-file-name} attempts +completion if the user exits without any editing, and does not return +@var{default}. @var{default} is also available through the history +commands. + +If @var{default} is @code{nil}, @code{read-file-name} tries to find a +substitute default to use in its place, which it treats in exactly the +same way as if it had been specified explicitly. If @var{default} is +@code{nil}, but @var{initial} is non-@code{nil}, then the default is +the absolute file name obtained from @var{directory} and +@var{initial}. If both @var{default} and @var{initial} are @code{nil} +and the buffer is visiting a file, @code{read-file-name} uses the +absolute file name of that file as default. If the buffer is not +visiting a file, then there is no default. In that case, if the user +types @key{RET} without any editing, @code{read-file-name} simply +returns the pre-inserted contents of the minibuffer. + +If the user types @key{RET} in an empty minibuffer, this function +returns an empty string, regardless of the value of @var{existing}. +This is, for instance, how the user can make the current buffer visit +no file using @code{M-x set-visited-file-name}. + +If @var{predicate} is non-@code{nil}, it specifies a function of one +argument that decides which file names are acceptable completion +possibilities. A file name is an acceptable value if @var{predicate} +returns non-@code{nil} for it. + +@code{read-file-name} does not automatically expand file names. You +must call @code{expand-file-name} yourself if an absolute file name is +required. + +Here is an example: + +@example +@group +(read-file-name "The file is ") + +;; @r{After evaluation of the preceding expression,} +;; @r{the following appears in the minibuffer:} +@end group + +@group +---------- Buffer: Minibuffer ---------- +The file is /gp/gnu/elisp/@point{} +---------- Buffer: Minibuffer ---------- +@end group +@end example + +@noindent +Typing @kbd{manual @key{TAB}} results in the following: + +@example +@group +---------- Buffer: Minibuffer ---------- +The file is /gp/gnu/elisp/manual.texi@point{} +---------- Buffer: Minibuffer ---------- +@end group +@end example + +@c Wordy to avoid overfull hbox in smallbook mode. +@noindent +If the user types @key{RET}, @code{read-file-name} returns the file name +as the string @code{"/gp/gnu/elisp/manual.texi"}. +@end defun + +@defvar read-file-name-function +If non-@code{nil}, this should be a function that accepts the same +arguments as @code{read-file-name}. When @code{read-file-name} is +called, it calls this function with the supplied arguments instead of +doing its usual work. +@end defvar + +@defvar read-file-name-completion-ignore-case +If this variable is non-@code{nil}, @code{read-file-name} ignores case +when performing completion. +@end defvar + +@defun read-directory-name prompt &optional directory default existing initial +This function is like @code{read-file-name} but allows only directory +names as completion possibilities. + +If @var{default} is @code{nil} and @var{initial} is non-@code{nil}, +@code{read-directory-name} constructs a substitute default by +combining @var{directory} (or the current buffer's default directory +if @var{directory} is @code{nil}) and @var{initial}. If both +@var{default} and @var{initial} are @code{nil}, this function uses +@var{directory} as substitute default, or the current buffer's default +directory if @var{directory} is @code{nil}. +@end defun + +@defopt insert-default-directory +This variable is used by @code{read-file-name}, and thus, indirectly, +by most commands reading file names. (This includes all commands that +use the code letters @samp{f} or @samp{F} in their interactive form. +@xref{Interactive Codes,, Code Characters for interactive}.) Its +value controls whether @code{read-file-name} starts by placing the +name of the default directory in the minibuffer, plus the initial file +name if any. If the value of this variable is @code{nil}, then +@code{read-file-name} does not place any initial input in the +minibuffer (unless you specify initial input with the @var{initial} +argument). In that case, the default directory is still used for +completion of relative file names, but is not displayed. + +If this variable is @code{nil} and the initial minibuffer contents are +empty, the user may have to explicitly fetch the next history element +to access a default value. If the variable is non-@code{nil}, the +initial minibuffer contents are always non-empty and the user can +always request a default value by immediately typing @key{RET} in an +unedited minibuffer. (See above.) + +For example: + +@example +@group +;; @r{Here the minibuffer starts out with the default directory.} +(let ((insert-default-directory t)) + (read-file-name "The file is ")) +@end group + +@group +---------- Buffer: Minibuffer ---------- +The file is ~lewis/manual/@point{} +---------- Buffer: Minibuffer ---------- +@end group + +@group +;; @r{Here the minibuffer is empty and only the prompt} +;; @r{appears on its line.} +(let ((insert-default-directory nil)) + (read-file-name "The file is ")) +@end group + +@group +---------- Buffer: Minibuffer ---------- +The file is @point{} +---------- Buffer: Minibuffer ---------- +@end group +@end example +@end defopt + +@node Programmed Completion +@subsection Programmed Completion +@cindex 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 @dfn{programmed completion}. + + To use this feature, pass a symbol with a function definition as the +@var{collection} argument to @code{completing-read}. The function +@code{completing-read} arranges to pass your completion function along +to @code{try-completion} and @code{all-completions}, which will then let +your function do all the work. + + The completion function should accept three arguments: + +@itemize @bullet +@item +The string to be completed. + +@item +The predicate function to filter possible matches, or @code{nil} if +none. Your function should call the predicate for each possible match, +and ignore the possible match if the predicate returns @code{nil}. + +@item +A flag specifying the type of operation. +@end itemize + + There are three flag values for three operations: + +@itemize @bullet +@item +@code{nil} specifies @code{try-completion}. The completion function +should return the completion of the specified string, or @code{t} if the +string is a unique and exact match already, or @code{nil} if the string +matches no possibility. + +If the string is an exact match for one possibility, but also matches +other longer possibilities, the function should return the string, not +@code{t}. + +@item +@code{t} specifies @code{all-completions}. The completion function +should return a list of all possible completions of the specified +string. + +@item +@code{lambda} specifies @code{test-completion}. The completion +function should return @code{t} if the specified string is an exact +match for some possibility; @code{nil} otherwise. +@end itemize + + It would be consistent and clean for completion functions to allow +lambda expressions (lists that are functions) as well as function +symbols as @var{collection}, but this is impossible. Lists as +completion tables already have other meanings, and it would be +unreliable to treat one differently just because it is also a possible +function. So you must arrange for any function you wish to use for +completion to be encapsulated in a symbol. + + Emacs uses programmed completion when completing file names. +@xref{File Name Completion}. + +@defmac dynamic-completion-table function +This macro is a convenient way to write a function that can act as +programmed completion function. The argument @var{function} should be +a function that takes one argument, a string, and returns an alist of +possible completions of it. You can think of +@code{dynamic-completion-table} as a transducer between that interface +and the interface for programmed completion functions. +@end defmac + +@node Yes-or-No Queries +@section Yes-or-No Queries +@cindex asking the user questions +@cindex querying the user +@cindex yes-or-no questions + + This section describes functions used to ask the user a yes-or-no +question. The function @code{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. @code{yes-or-no-p} is suitable for +more momentous questions, since it requires three or four characters to +answer. + + If either of these functions is called in a command that was invoked +using the mouse---more precisely, if @code{last-nonmenu-event} +(@pxref{Command Loop Info}) is either @code{nil} or a list---then it +uses a dialog box or pop-up menu to ask the question. Otherwise, it +uses keyboard input. You can force use of the mouse or use of keyboard +input by binding @code{last-nonmenu-event} to a suitable value around +the call. + + Strictly speaking, @code{yes-or-no-p} uses the minibuffer and +@code{y-or-n-p} does not; but it seems best to describe them together. + +@defun y-or-n-p prompt +This function asks the user a question, expecting input in the echo +area. It returns @code{t} if the user types @kbd{y}, @code{nil} if the +user types @kbd{n}. This function also accepts @key{SPC} to mean yes +and @key{DEL} to mean no. It accepts @kbd{C-]} to mean ``quit,'' like +@kbd{C-g}, because the question might look like a minibuffer and for +that reason the user might try to use @kbd{C-]} to get out. The answer +is a single character, with no @key{RET} needed to terminate it. Upper +and lower case are equivalent. + +``Asking the question'' means printing @var{prompt} in the echo area, +followed by the string @w{@samp{(y or n) }}. If the input is not one of +the expected answers (@kbd{y}, @kbd{n}, @kbd{@key{SPC}}, +@kbd{@key{DEL}}, or something that quits), the function responds +@samp{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 (@pxref{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. + +The answers and their meanings, even @samp{y} and @samp{n}, are not +hardwired. The keymap @code{query-replace-map} specifies them. +@xref{Search and Replace}. + +In the following example, the user first types @kbd{q}, which is +invalid. At the next prompt the user types @kbd{y}. + +@smallexample +@group +(y-or-n-p "Do you need a lift? ") + +;; @r{After evaluation of the preceding expression,} +;; @r{the following prompt appears in the echo area:} +@end group + +@group +---------- Echo area ---------- +Do you need a lift? (y or n) +---------- Echo area ---------- +@end group + +;; @r{If the user then types @kbd{q}, the following appears:} + +@group +---------- Echo area ---------- +Please answer y or n. Do you need a lift? (y or n) +---------- Echo area ---------- +@end group + +;; @r{When the user types a valid answer,} +;; @r{it is displayed after the question:} + +@group +---------- Echo area ---------- +Do you need a lift? (y or n) y +---------- Echo area ---------- +@end group +@end smallexample + +@noindent +We show successive lines of echo area messages, but only one actually +appears on the screen at a time. +@end defun + +@defun y-or-n-p-with-timeout prompt seconds default-value +Like @code{y-or-n-p}, except that if the user fails to answer within +@var{seconds} seconds, this function stops waiting and returns +@var{default-value}. It works by setting up a timer; see @ref{Timers}. +The argument @var{seconds} may be an integer or a floating point number. +@end defun + +@defun yes-or-no-p prompt +This function asks the user a question, expecting input in the +minibuffer. It returns @code{t} if the user enters @samp{yes}, +@code{nil} if the user types @samp{no}. The user must type @key{RET} to +finalize the response. Upper and lower case are equivalent. + +@code{yes-or-no-p} starts by displaying @var{prompt} in the echo area, +followed by @w{@samp{(yes or no) }}. The user must type one of the +expected responses; otherwise, the function responds @samp{Please answer +yes or no.}, waits about two seconds and repeats the request. + +@code{yes-or-no-p} requires more work from the user than +@code{y-or-n-p} and is appropriate for more crucial decisions. + +Here is an example: + +@smallexample +@group +(yes-or-no-p "Do you really want to remove everything? ") + +;; @r{After evaluation of the preceding expression,} +;; @r{the following prompt appears,} +;; @r{with an empty minibuffer:} +@end group + +@group +---------- Buffer: minibuffer ---------- +Do you really want to remove everything? (yes or no) +---------- Buffer: minibuffer ---------- +@end group +@end smallexample + +@noindent +If the user first types @kbd{y @key{RET}}, which is invalid because this +function demands the entire word @samp{yes}, it responds by displaying +these prompts, with a brief pause between them: + +@smallexample +@group +---------- Buffer: minibuffer ---------- +Please answer yes or no. +Do you really want to remove everything? (yes or no) +---------- Buffer: minibuffer ---------- +@end group +@end smallexample +@end defun + +@node Multiple Queries +@section Asking Multiple Y-or-N Questions + + When you have a series of similar questions to ask, such as ``Do you +want to save this buffer'' for each buffer in turn, you should use +@code{map-y-or-n-p} to ask the collection of questions, rather than +asking each question individually. This gives the user certain +convenient facilities such as the ability to answer the whole series at +once. + +@defun map-y-or-n-p prompter actor list &optional help action-alist no-cursor-in-echo-area +This function asks the user a series of questions, reading a +single-character answer in the echo area for each one. + +The value of @var{list} specifies the objects to ask questions about. +It should be either a list of objects or a generator function. If it is +a function, it should expect no arguments, and should return either the +next object to ask about, or @code{nil} meaning stop asking questions. + +The argument @var{prompter} specifies how to ask each question. If +@var{prompter} is a string, the question text is computed like this: + +@example +(format @var{prompter} @var{object}) +@end example + +@noindent +where @var{object} is the next object to ask about (as obtained from +@var{list}). + +If not a string, @var{prompter} should be a function of one argument +(the next object to ask about) and should return the question text. If +the value is a string, that is the question to ask the user. The +function can also return @code{t} meaning do act on this object (and +don't ask the user), or @code{nil} meaning ignore this object (and don't +ask the user). + +The argument @var{actor} says how to act on the answers that the user +gives. It should be a function of one argument, and it is called with +each object that the user says yes for. Its argument is always an +object obtained from @var{list}. + +If the argument @var{help} is given, it should be a list of this form: + +@example +(@var{singular} @var{plural} @var{action}) +@end example + +@noindent +where @var{singular} is a string containing a singular noun that +describes the objects conceptually being acted on, @var{plural} is the +corresponding plural noun, and @var{action} is a transitive verb +describing what @var{actor} does. + +If you don't specify @var{help}, the default is @code{("object" +"objects" "act on")}. + +Each time a question is asked, the user may enter @kbd{y}, @kbd{Y}, or +@key{SPC} to act on that object; @kbd{n}, @kbd{N}, or @key{DEL} to skip +that object; @kbd{!} to act on all following objects; @key{ESC} or +@kbd{q} to exit (skip all following objects); @kbd{.} (period) to act on +the current object and then exit; or @kbd{C-h} to get help. These are +the same answers that @code{query-replace} accepts. The keymap +@code{query-replace-map} defines their meaning for @code{map-y-or-n-p} +as well as for @code{query-replace}; see @ref{Search and Replace}. + +You can use @var{action-alist} to specify additional possible answers +and what they mean. It is an alist of elements of the form +@code{(@var{char} @var{function} @var{help})}, each of which defines one +additional answer. In this element, @var{char} is a character (the +answer); @var{function} is a function of one argument (an object from +@var{list}); @var{help} is a string. + +When the user responds with @var{char}, @code{map-y-or-n-p} calls +@var{function}. If it returns non-@code{nil}, the object is considered +``acted upon,'' and @code{map-y-or-n-p} advances to the next object in +@var{list}. If it returns @code{nil}, the prompt is repeated for the +same object. + +Normally, @code{map-y-or-n-p} binds @code{cursor-in-echo-area} while +prompting. But if @var{no-cursor-in-echo-area} is non-@code{nil}, it +does not do that. + +If @code{map-y-or-n-p} is called in a command that was invoked using the +mouse---more precisely, if @code{last-nonmenu-event} (@pxref{Command +Loop Info}) is either @code{nil} or a list---then it uses a dialog box +or pop-up menu to ask the question. In this case, it does not use +keyboard input or the echo area. You can force use of the mouse or use +of keyboard input by binding @code{last-nonmenu-event} to a suitable +value around the call. + +The return value of @code{map-y-or-n-p} is the number of objects acted on. +@end defun + +@node Reading a Password +@section Reading a Password +@cindex passwords, reading + + To read a password to pass to another program, you can use the +function @code{read-passwd}. + +@defun read-passwd prompt &optional confirm default +This function reads a password, prompting with @var{prompt}. It does +not echo the password as the user types it; instead, it echoes @samp{.} +for each character in the password. + +The optional argument @var{confirm}, if non-@code{nil}, says to read the +password twice and insist it must be the same both times. If it isn't +the same, the user has to type it over and over until the last two +times match. + +The optional argument @var{default} specifies the default password to +return if the user enters empty input. If @var{default} is @code{nil}, +then @code{read-passwd} returns the null string in that case. +@end defun + +@node Minibuffer Commands +@section Minibuffer Commands + + This section describes some commands meant for use in the +minibuffer. + +@deffn Command exit-minibuffer +This command exits the active minibuffer. It is normally bound to +keys in minibuffer local keymaps. +@end deffn + +@deffn Command self-insert-and-exit +This command exits the active minibuffer after inserting the last +character typed on the keyboard (found in @code{last-command-char}; +@pxref{Command Loop Info}). +@end deffn + +@deffn Command previous-history-element n +This command replaces the minibuffer contents with the value of the +@var{n}th previous (older) history element. +@end deffn + +@deffn Command next-history-element n +This command replaces the minibuffer contents with the value of the +@var{n}th more recent history element. +@end deffn + +@deffn Command previous-matching-history-element pattern n +This command replaces the minibuffer contents with the value of the +@var{n}th previous (older) history element that matches @var{pattern} (a +regular expression). +@end deffn + +@deffn Command next-matching-history-element pattern n +This command replaces the minibuffer contents with the value of the +@var{n}th next (newer) history element that matches @var{pattern} (a +regular expression). +@end deffn + +@node Minibuffer Windows +@section Minibuffer Windows +@cindex minibuffer windows + + These functions access and select minibuffer windows +and test whether they are active. + +@defun active-minibuffer-window +This function returns the currently active minibuffer window, or +@code{nil} if none is currently active. +@end defun + +@defun minibuffer-window &optional frame +@anchor{Definition of minibuffer-window} +This function returns the minibuffer window used for frame @var{frame}. +If @var{frame} is @code{nil}, that stands for the current frame. Note +that the minibuffer window used by a frame need not be part of that +frame---a frame that has no minibuffer of its own necessarily uses some +other frame's minibuffer window. +@end defun + +@defun set-minibuffer-window window +This function specifies @var{window} as the minibuffer window to use. +This affects where the minibuffer is displayed if you put text in it +without invoking the usual minibuffer commands. It has no effect on +the usual minibuffer input functions because they all start by +choosing the minibuffer window according to the current frame. +@end defun + +@c Emacs 19 feature +@defun window-minibuffer-p &optional window +This function returns non-@code{nil} if @var{window} is a minibuffer +window. +@var{window} defaults to the selected window. +@end defun + +It is not correct to determine whether a given window is a minibuffer by +comparing it with the result of @code{(minibuffer-window)}, because +there can be more than one minibuffer window if there is more than one +frame. + +@defun minibuffer-window-active-p window +This function returns non-@code{nil} if @var{window}, assumed to be +a minibuffer window, is currently active. +@end defun + +@node Minibuffer Contents +@section Minibuffer Contents + + These functions access the minibuffer prompt and contents. + +@defun minibuffer-prompt +This function returns the prompt string of the currently active +minibuffer. If no minibuffer is active, it returns @code{nil}. +@end defun + +@defun minibuffer-prompt-end +This function returns the current +position of the end of the minibuffer prompt, if a minibuffer is +current. Otherwise, it returns the minimum valid buffer position. +@end defun + +@defun minibuffer-prompt-width +This function returns the current display-width of the minibuffer +prompt, if a minibuffer is current. Otherwise, it returns zero. +@end defun + +@defun minibuffer-contents +This function returns the editable +contents of the minibuffer (that is, everything except the prompt) as +a string, if a minibuffer is current. Otherwise, it returns the +entire contents of the current buffer. +@end defun + +@defun minibuffer-contents-no-properties +This is like @code{minibuffer-contents}, except that it does not copy text +properties, just the characters themselves. @xref{Text Properties}. +@end defun + +@defun minibuffer-completion-contents +This is like @code{minibuffer-contents}, except that it returns only +the contents before point. That is the part that completion commands +operate on. @xref{Minibuffer Completion}. +@end defun + +@defun delete-minibuffer-contents +This function erases the editable contents of the minibuffer (that is, +everything except the prompt), if a minibuffer is current. Otherwise, +it erases the entire current buffer. +@end defun + +@node Recursive Mini +@section Recursive Minibuffers +@cindex recursive minibuffers + + These functions and variables deal with recursive minibuffers +(@pxref{Recursive Editing}): + +@defun minibuffer-depth +This function returns the current depth of activations of the +minibuffer, a nonnegative integer. If no minibuffers are active, it +returns zero. +@end defun + +@defopt enable-recursive-minibuffers +If this variable is non-@code{nil}, you can invoke commands (such as +@code{find-file}) that use minibuffers even while the minibuffer window +is active. Such invocation produces a recursive editing level for a new +minibuffer. The outer-level minibuffer is invisible while you are +editing the inner one. + +If this variable is @code{nil}, you cannot invoke minibuffer +commands when the minibuffer window is active, not even if you switch to +another window to do it. +@end defopt + +@c Emacs 19 feature +If a command name has a property @code{enable-recursive-minibuffers} +that is non-@code{nil}, then the command can use the minibuffer to read +arguments even if it is invoked from the minibuffer. A command can +also achieve this by binding @code{enable-recursive-minibuffers} +to @code{t} in the interactive declaration (@pxref{Using Interactive}). +The minibuffer command @code{next-matching-history-element} (normally +@kbd{M-s} in the minibuffer) does the latter. + +@node Minibuffer Misc +@section Minibuffer Miscellany + +@defun minibufferp &optional buffer-or-name +This function returns non-@code{nil} if @var{buffer-or-name} is a +minibuffer. If @var{buffer-or-name} is omitted, it tests the current +buffer. +@end defun + +@defvar minibuffer-setup-hook +This is a normal hook that is run whenever the minibuffer is entered. +@xref{Hooks}. +@end defvar + +@defvar minibuffer-exit-hook +This is a normal hook that is run whenever the minibuffer is exited. +@xref{Hooks}. +@end defvar + +@defvar minibuffer-help-form +@anchor{Definition of minibuffer-help-form} +The current value of this variable is used to rebind @code{help-form} +locally inside the minibuffer (@pxref{Help Functions}). +@end defvar + +@defvar minibuffer-scroll-window +@anchor{Definition of minibuffer-scroll-window} +If the value of this variable is non-@code{nil}, it should be a window +object. When the function @code{scroll-other-window} is called in the +minibuffer, it scrolls this window. +@end defvar + +@defun minibuffer-selected-window +This function returns the window which was selected when the +minibuffer was entered. If selected window is not a minibuffer +window, it returns @code{nil}. +@end defun + +@defopt max-mini-window-height +This variable specifies the maximum height for resizing minibuffer +windows. If a float, it specifies a fraction of the height of the +frame. If an integer, it specifies a number of lines. +@end defopt + +@defun minibuffer-message string +This function displays @var{string} temporarily at the end of the +minibuffer text, for two seconds, or until the next input event +arrives, whichever comes first. +@end defun + +@ignore + arch-tag: bba7f945-9078-477f-a2ce-18818a6e1218 +@end ignore diff --git a/doc/lispref/mkinstalldirs b/doc/lispref/mkinstalldirs new file mode 100755 index 00000000000..f945dbf2bce --- /dev/null +++ b/doc/lispref/mkinstalldirs @@ -0,0 +1,38 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi new file mode 100644 index 00000000000..3d60756a901 --- /dev/null +++ b/doc/lispref/modes.texi @@ -0,0 +1,3271 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/modes +@node Modes, Documentation, Keymaps, Top +@chapter Major and Minor Modes +@cindex mode + + A @dfn{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: +@dfn{major modes}, which are mutually exclusive and used for editing +particular kinds of text, and @dfn{minor modes}, which provide features +that users can enable individually. + + This chapter describes how to write both major and minor modes, how to +indicate them in the mode line, and how they run hooks supplied by the +user. For related topics such as keymaps and syntax tables, see +@ref{Keymaps}, and @ref{Syntax Tables}. + +@menu +* Hooks:: How to use hooks; how to write code that provides hooks. +* Major Modes:: Defining major modes. +* Minor Modes:: Defining minor modes. +* Mode Line Format:: Customizing the text that appears in the mode line. +* Imenu:: How a mode can provide a menu + of definitions in the buffer. +* Font Lock Mode:: How modes can highlight text according to syntax. +* Desktop Save Mode:: How modes can have buffer state saved between + Emacs sessions. +@end menu + +@node Hooks +@section Hooks +@cindex hooks + + A @dfn{hook} is a variable where you can store a function or functions +to be called on a particular occasion by an existing program. Emacs +provides hooks for the sake of customization. Most often, hooks are set +up in the init file (@pxref{Init File}), but Lisp programs can set them also. +@xref{Standard Hooks}, for a list of standard hook variables. + +@cindex normal hook + Most of the hooks in Emacs are @dfn{normal hooks}. These variables +contain lists of functions to be called with no arguments. By +convention, whenever the hook name ends in @samp{-hook}, that tells +you it is normal. We try to make all hooks normal, as much as +possible, so that you can use them in a uniform way. + + Every major mode function is supposed to run a normal hook called +the @dfn{mode hook} as the one of the last steps of initialization. +This makes it easy for a user to customize the behavior of the mode, +by overriding the buffer-local variable assignments already made by +the mode. Most minor mode functions also run a mode hook at the end. +But hooks are used in other contexts too. For example, the hook +@code{suspend-hook} runs just before Emacs suspends itself +(@pxref{Suspending Emacs}). + + The recommended way to add a hook function to a normal hook is by +calling @code{add-hook} (see below). The hook functions may be any of +the valid kinds of functions that @code{funcall} accepts (@pxref{What +Is a Function}). Most normal hook variables are initially void; +@code{add-hook} knows how to deal with this. You can add hooks either +globally or buffer-locally with @code{add-hook}. + +@cindex abnormal hook + If the hook variable's name does not end with @samp{-hook}, that +indicates it is probably an @dfn{abnormal hook}. That means the hook +functions are called with arguments, or their return values are used +in some way. The hook's documentation says how the functions are +called. You can use @code{add-hook} to add a function to an abnormal +hook, but you must write the function to follow the hook's calling +convention. + + By convention, abnormal hook names end in @samp{-functions} or +@samp{-hooks}. If the variable's name ends in @samp{-function}, then +its value is just a single function, not a list of functions. + + Here's an example that uses a mode hook to turn on Auto Fill mode when +in Lisp Interaction mode: + +@example +(add-hook 'lisp-interaction-mode-hook 'turn-on-auto-fill) +@end example + + At the appropriate time, Emacs uses the @code{run-hooks} function to +run particular hooks. + +@defun run-hooks &rest hookvars +This function takes one or more normal hook variable names as +arguments, and runs each hook in turn. Each argument should be a +symbol that is a normal hook variable. These arguments are processed +in the order specified. + +If a hook variable has a non-@code{nil} value, that value should be a +list of functions. @code{run-hooks} calls all the functions, one by +one, with no arguments. + +The hook variable's value can also be a single function---either a +lambda expression or a symbol with a function definition---which +@code{run-hooks} calls. But this usage is obsolete. +@end defun + +@defun run-hook-with-args hook &rest args +This function is the way to run an abnormal hook and always call all +of the hook functions. It calls each of the hook functions one by +one, passing each of them the arguments @var{args}. +@end defun + +@defun run-hook-with-args-until-failure hook &rest args +This function is the way to run an abnormal hook until one of the hook +functions fails. It calls each of the hook functions, passing each of +them the arguments @var{args}, until some hook function returns +@code{nil}. It then stops and returns @code{nil}. If none of the +hook functions return @code{nil}, it returns a non-@code{nil} value. +@end defun + +@defun run-hook-with-args-until-success hook &rest args +This function is the way to run an abnormal hook until a hook function +succeeds. It calls each of the hook functions, passing each of them +the arguments @var{args}, until some hook function returns +non-@code{nil}. Then it stops, and returns whatever was returned by +the last hook function that was called. If all hook functions return +@code{nil}, it returns @code{nil} as well. +@end defun + +@defun add-hook hook function &optional append local +This function is the handy way to add function @var{function} to hook +variable @var{hook}. You can use it for abnormal hooks as well as for +normal hooks. @var{function} can be any Lisp function that can accept +the proper number of arguments for @var{hook}. For example, + +@example +(add-hook 'text-mode-hook 'my-text-hook-function) +@end example + +@noindent +adds @code{my-text-hook-function} to the hook called @code{text-mode-hook}. + +If @var{function} is already present in @var{hook} (comparing using +@code{equal}), then @code{add-hook} does not add it a second time. + +It is best to design your hook functions so that the order in which they +are executed does not matter. Any dependence on the order is ``asking +for trouble.'' However, the order is predictable: normally, +@var{function} goes at the front of the hook list, so it will be +executed first (barring another @code{add-hook} call). If the optional +argument @var{append} is non-@code{nil}, the new hook function goes at +the end of the hook list and will be executed last. + +@code{add-hook} can handle the cases where @var{hook} is void or its +value is a single function; it sets or changes the value to a list of +functions. + +If @var{local} is non-@code{nil}, that says to add @var{function} to +the buffer-local hook list instead of to the global hook list. If +needed, this makes the hook buffer-local and adds @code{t} to the +buffer-local value. The latter acts as a flag to run the hook +functions in the default value as well as in the local value. +@end defun + +@defun remove-hook hook function &optional local +This function removes @var{function} from the hook variable +@var{hook}. It compares @var{function} with elements of @var{hook} +using @code{equal}, so it works for both symbols and lambda +expressions. + +If @var{local} is non-@code{nil}, that says to remove @var{function} +from the buffer-local hook list instead of from the global hook list. +@end defun + +@node Major Modes +@section Major Modes +@cindex major mode + + Major modes specialize Emacs for editing particular kinds of text. +Each buffer has only one major mode at a time. For each major mode +there is a function to switch to that mode in the current buffer; its +name should end in @samp{-mode}. These functions work by setting +buffer-local variable bindings and other data associated with the +buffer, such as a local keymap. The effect lasts until you switch +to another major mode in the same buffer. + +@menu +* Major Mode Basics:: +* Major Mode Conventions:: Coding conventions for keymaps, etc. +* Auto Major Mode:: How Emacs chooses the major mode automatically. +* Mode Help:: Finding out how to use a mode. +* Derived Modes:: Defining a new major mode based on another major + mode. +* Generic Modes:: Defining a simple major mode that supports + comment syntax and Font Lock mode. +* Mode Hooks:: Hooks run at the end of major mode functions. +* Example Major Modes:: Text mode and Lisp modes. +@end menu + +@node Major Mode Basics +@subsection Major Mode Basics +@cindex Fundamental mode + + The least specialized major mode is called @dfn{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 +@kbd{C-j} (@code{eval-print-last-sexp}), @key{TAB} +(@code{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 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 the copy---or use @code{define-derived-mode} to +define a @dfn{derived mode} (@pxref{Derived Modes}). For example, +Rmail Edit mode is a major mode that is very similar to Text mode +except that it provides two additional commands. Its definition is +distinct from that of Text mode, but uses that of Text mode. + + Even if the new mode is not an obvious derivative of any other mode, +it is convenient to use @code{define-derived-mode} with a @code{nil} +parent argument, since it automatically enforces the most important +coding conventions for you. + + For a very simple programming language major mode that handles +comments and fontification, you can use @code{define-generic-mode}. +@xref{Generic Modes}. + + Rmail Edit mode offers an example of changing the major mode +temporarily for a buffer, so it can be edited in a different way (with +ordinary Emacs commands rather than Rmail commands). In such cases, the +temporary major mode usually provides 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 an +alternative major mode avoids this limitation. @xref{Recursive +Editing}. + + The standard GNU Emacs Lisp library directory tree contains the code +for several major modes, in files such as @file{text-mode.el}, +@file{texinfo.el}, @file{lisp-mode.el}, @file{c-mode.el}, and +@file{rmail.el}. They are found in various subdirectories of the +@file{lisp} directory. You can study these libraries to see how modes +are written. Text mode is perhaps the simplest major mode aside from +Fundamental mode. Rmail mode is a complicated and specialized mode. + +@node Major Mode Conventions +@subsection Major Mode Conventions +@cindex major mode conventions +@cindex conventions for writing major modes + + The code for existing major modes follows various coding conventions, +including conventions for local keymap and syntax table initialization, +global names, and hooks. Please follow these conventions when you +define a new major mode. (Fundamental mode is an exception to many +of these conventions, because its definition is to present the global +state of Emacs.) + + This list of conventions is only partial, because each major mode +should aim for consistency in general with other Emacs major modes. +This makes Emacs as a whole more coherent. It is impossible to list +here all the possible points where this issue might come up; if the +Emacs developers point out an area where your major mode deviates from +the usual conventions, please make it compatible. + +@itemize @bullet +@item +Define a command whose name ends in @samp{-mode}, with no arguments, +that switches to the new mode in the current buffer. This command +should set up the keymap, syntax table, and buffer-local variables in an +existing buffer, without changing the buffer's contents. + +@item +Write a documentation string for this command that describes the +special commands available in this mode. @kbd{C-h m} +(@code{describe-mode}) in your mode will display this string. + +The documentation string may include the special documentation +substrings, @samp{\[@var{command}]}, @samp{\@{@var{keymap}@}}, and +@samp{\<@var{keymap}>}, which enable the documentation to adapt +automatically to the user's own key bindings. @xref{Keys in +Documentation}. + +@item +The major mode command should start by calling +@code{kill-all-local-variables}. This runs the normal hook +@code{change-major-mode-hook}, then gets rid of the buffer-local +variables of the major mode previously in effect. @xref{Creating +Buffer-Local}. + +@item +The major mode command should set the variable @code{major-mode} to the +major mode command symbol. This is how @code{describe-mode} discovers +which documentation to print. + +@item +The major mode command should set the variable @code{mode-name} to the +``pretty'' name of the mode, as a string. This string appears in the +mode line. + +@item +@cindex functions in modes +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). @xref{Coding Conventions}. + +@item +In a major mode for editing some kind of structured text, such as a +programming language, indentation of text according to structure is +probably useful. So the mode should set @code{indent-line-function} +to a suitable function, and probably customize other variables +for indentation. + +@item +@cindex keymaps in modes +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 command should +call @code{use-local-map} to install this local map. @xref{Active +Keymaps}, for more information. + +This keymap should be stored permanently in a global variable named +@code{@var{modename}-mode-map}. Normally the library that defines the +mode sets this variable. + +@xref{Tips for Defining}, for advice about how to write the code to set +up the mode's keymap variable. + +@item +The key sequences bound in a major mode keymap should usually start with +@kbd{C-c}, followed by a control character, a digit, or @kbd{@{}, +@kbd{@}}, @kbd{<}, @kbd{>}, @kbd{:} or @kbd{;}. The other punctuation +characters are reserved for minor modes, and ordinary letters are +reserved for users. + +A major mode can also rebind the keys @kbd{M-n}, @kbd{M-p} and +@kbd{M-s}. The bindings for @kbd{M-n} and @kbd{M-p} should normally +be some kind of ``moving forward and backward,'' but this does not +necessarily mean cursor motion. + +It is legitimate for a major mode to rebind a standard key sequence if +it provides a command that does ``the same job'' in a way better +suited to the text this mode is used for. For example, a major mode +for editing a programming language might redefine @kbd{C-M-a} to +``move to the beginning of a function'' in a way that works better for +that language. + +It is also legitimate for a major mode to rebind a standard key +sequence whose standard meaning is rarely useful in that mode. For +instance, minibuffer modes rebind @kbd{M-r}, whose standard meaning is +rarely of any use in the minibuffer. Major modes such as Dired or +Rmail that do not allow self-insertion of text can reasonably redefine +letters and other printing characters as special commands. + +@item +Major modes modes for editing text should not define @key{RET} to do +anything other than insert a newline. However, it is ok for +specialized modes for text that users don't directly edit, such as +Dired and Info modes, to redefine @key{RET} to do something entirely +different. + +@item +Major modes should not alter options that are primarily a matter of user +preference, such as whether Auto-Fill mode is enabled. Leave this to +each user to decide. However, a major mode should customize other +variables so that Auto-Fill mode will work usefully @emph{if} the user +decides to use it. + +@item +@cindex syntax tables in modes +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 @code{@var{modename}-mode-syntax-table}. @xref{Syntax +Tables}. + +@item +If the mode handles a language that has a syntax for comments, it should +set the variables that define the comment syntax. @xref{Options for +Comments,, Options Controlling Comments, emacs, The GNU Emacs Manual}. + +@item +@cindex abbrev tables in modes +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 @code{@var{modename}-mode-abbrev-table}. If the +major mode command defines any abbrevs itself, it should pass @code{t} +for the @var{system-flag} argument to @code{define-abbrev}. +@xref{Defining Abbrevs}. + +@item +The mode should specify how to do highlighting for Font Lock mode, by +setting up a buffer-local value for the variable +@code{font-lock-defaults} (@pxref{Font Lock Mode}). + +@item +The mode should specify how Imenu should find the definitions or +sections of a buffer, by setting up a buffer-local value for the +variable @code{imenu-generic-expression}, for the two variables +@code{imenu-prev-index-position-function} and +@code{imenu-extract-index-name-function}, or for the variable +@code{imenu-create-index-function} (@pxref{Imenu}). + +@item +The mode can specify a local value for +@code{eldoc-documentation-function} to tell ElDoc mode how to handle +this mode. + +@item +Use @code{defvar} or @code{defcustom} to set mode-related variables, so +that they are not reinitialized if they already have a value. (Such +reinitialization could discard customizations made by the user.) + +@item +@cindex buffer-local variables in modes +To make a buffer-local binding for an Emacs customization variable, use +@code{make-local-variable} in the major mode command, not +@code{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. @xref{Buffer-Local Variables}. + +With rare exceptions, the only reasonable way to use +@code{make-variable-buffer-local} in a Lisp package is for a variable +which is used only within that package. Using it on a variable used by +other packages would interfere with them. + +@item +@cindex mode hook +@cindex major mode hook +Each major mode should have a normal @dfn{mode hook} named +@code{@var{modename}-mode-hook}. The very last thing the major mode command +should do is to call @code{run-mode-hooks}. This runs the mode hook, +and then runs the normal hook @code{after-change-major-mode-hook}. +@xref{Mode Hooks}. + +@item +The major mode command may start by calling some other major mode +command (called the @dfn{parent mode}) and then alter some of its +settings. A mode that does this is called a @dfn{derived mode}. The +recommended way to define one is to use @code{define-derived-mode}, +but this is not required. Such a mode should call the parent mode +command inside a @code{delay-mode-hooks} form. (Using +@code{define-derived-mode} does this automatically.) @xref{Derived +Modes}, and @ref{Mode Hooks}. + +@item +If something special should be done if the user switches a buffer from +this mode to any other major mode, this mode can set up a buffer-local +value for @code{change-major-mode-hook} (@pxref{Creating Buffer-Local}). + +@item +If this mode is appropriate only for specially-prepared text, then the +major mode command symbol should have a property named @code{mode-class} +with value @code{special}, put on as follows: + +@kindex mode-class @r{(property)} +@cindex @code{special} +@example +(put 'funny-mode 'mode-class 'special) +@end example + +@noindent +This tells Emacs that new buffers created while the current buffer is +in Funny mode should not inherit Funny mode, in case +@code{default-major-mode} is @code{nil}. Modes such as Dired, Rmail, +and Buffer List use this feature. + +@item +If you want to make the new mode the default for files with certain +recognizable names, add an element to @code{auto-mode-alist} to select +the mode for those file names (@pxref{Auto Major Mode}). If you +define the mode command to autoload, you should add this element in +the same file that calls @code{autoload}. If you use an autoload +cookie for the mode command, you can also use an autoload cookie for +the form that adds the element (@pxref{autoload cookie}). If you do +not autoload the mode command, it is sufficient to add the element in +the file that contains the mode definition. + +@item +In the comments that document the file, you should provide a sample +@code{autoload} form and an example of how to add to +@code{auto-mode-alist}, that users can include in their init files +(@pxref{Init File}). + +@item +@cindex mode loading +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. +@end itemize + +@node Auto Major Mode +@subsection How Emacs Chooses a Major Mode +@cindex major mode, automatic selection + + 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. It also processes local variables specified in the file text. + +@deffn 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 @code{fundamental-mode} function does @emph{not} +run any mode hooks; you're not supposed to customize it. (If you want Emacs +to behave differently in Fundamental mode, change the @emph{global} +state of Emacs.) +@end deffn + +@deffn Command normal-mode &optional find-file +This function establishes the proper major mode and buffer-local variable +bindings for the current buffer. First it calls @code{set-auto-mode} +(see below), then it runs @code{hack-local-variables} to parse, and +bind or evaluate as appropriate, the file's local variables +(@pxref{File Local Variables}). + +If the @var{find-file} argument to @code{normal-mode} is non-@code{nil}, +@code{normal-mode} assumes that the @code{find-file} function is calling +it. In this case, it may process local variables in the @samp{-*-} +line or at the end of the file. The variable +@code{enable-local-variables} controls whether to do so. @xref{File +Variables, , Local Variables in Files, emacs, The GNU Emacs Manual}, +for the syntax of the local variables section of a file. + +If you run @code{normal-mode} interactively, the argument +@var{find-file} is normally @code{nil}. In this case, +@code{normal-mode} unconditionally processes any file local variables. + +If @code{normal-mode} processes the local variables list and this list +specifies a major mode, that mode overrides any mode chosen by +@code{set-auto-mode}. If neither @code{set-auto-mode} nor +@code{hack-local-variables} specify a major mode, the buffer stays in +the major mode determined by @code{default-major-mode} (see below). + +@cindex file mode specification error +@code{normal-mode} uses @code{condition-case} around the call to the +major mode function, so errors are caught and reported as a @samp{File +mode specification error}, followed by the original error message. +@end deffn + +@defun set-auto-mode &optional keep-mode-if-same +@cindex visited file mode + This function selects the major mode that is appropriate for the +current buffer. It bases its decision (in order of precedence) on +the @w{@samp{-*-}} line, on the @w{@samp{#!}} line (using +@code{interpreter-mode-alist}), on the text at the beginning of the +buffer (using @code{magic-mode-alist}), and finally on the visited +file name (using @code{auto-mode-alist}). @xref{Choosing Modes, , How +Major Modes are Chosen, emacs, The GNU Emacs Manual}. However, this +function does not look for the @samp{mode:} local variable near the +end of a file; the @code{hack-local-variables} function does that. +If @code{enable-local-variables} is @code{nil}, @code{set-auto-mode} +does not check the @w{@samp{-*-}} line for a mode tag either. + +If @var{keep-mode-if-same} is non-@code{nil}, this function does not +call the mode command if the buffer is already in the proper major +mode. For instance, @code{set-visited-file-name} sets this to +@code{t} to avoid killing buffer local variables that the user may +have set. +@end defun + +@defopt default-major-mode +This variable holds the default major mode for new buffers. The +standard value is @code{fundamental-mode}. + +If the value of @code{default-major-mode} is @code{nil}, Emacs uses +the (previously) current buffer's major mode as the default major mode +of a new buffer. However, if that major mode symbol has a @code{mode-class} +property with value @code{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. +@end defopt + +@defun set-buffer-major-mode buffer +This function sets the major mode of @var{buffer} to the value of +@code{default-major-mode}; if that variable is @code{nil}, it uses the +current buffer's major mode (if that is suitable). As an exception, +if @var{buffer}'s name is @samp{*scratch*}, it sets the mode to +@code{initial-major-mode}. + +The low-level primitives for creating buffers do not use this function, +but medium-level commands such as @code{switch-to-buffer} and +@code{find-file-noselect} use it whenever they create buffers. +@end defun + +@defopt initial-major-mode +@cindex @samp{*scratch*} +The value of this variable determines the major mode of the initial +@samp{*scratch*} buffer. The value should be a symbol that is a major +mode command. The default value is @code{lisp-interaction-mode}. +@end defopt + +@defvar interpreter-mode-alist +This variable specifies major modes to use for scripts that specify a +command interpreter in a @samp{#!} line. Its value is an alist with +elements of the form @code{(@var{interpreter} . @var{mode})}; for +example, @code{("perl" . perl-mode)} is one element present by +default. The element says to use mode @var{mode} if the file +specifies an interpreter which matches @var{interpreter}. +@end defvar + +@defvar magic-mode-alist +This variable's value is an alist with elements of the form +@code{(@var{regexp} . @var{function})}, where @var{regexp} is a +regular expression and @var{function} is a function or @code{nil}. +After visiting a file, @code{set-auto-mode} calls @var{function} if +the text at the beginning of the buffer matches @var{regexp} and +@var{function} is non-@code{nil}; if @var{function} is @code{nil}, +@code{auto-mode-alist} gets to decide the mode. +@end defvar + +@defvar magic-fallback-mode-alist +This works like @code{magic-mode-alist}, except that it is handled +only if @code{auto-mode-alist} does not specify a mode for this file. +@end defvar + +@defvar auto-mode-alist +This variable contains an association list of file name patterns +(regular expressions) and corresponding major mode commands. Usually, +the file name patterns test for suffixes, such as @samp{.el} and +@samp{.c}, but this need not be the case. An ordinary element of the +alist looks like @code{(@var{regexp} . @var{mode-function})}. + +For example, + +@smallexample +@group +(("\\`/tmp/fol/" . text-mode) + ("\\.texinfo\\'" . texinfo-mode) + ("\\.texi\\'" . texinfo-mode) +@end group +@group + ("\\.el\\'" . emacs-lisp-mode) + ("\\.c\\'" . c-mode) + ("\\.h\\'" . c-mode) + @dots{}) +@end group +@end smallexample + +When you visit a file whose expanded file name (@pxref{File Name +Expansion}), with version numbers and backup suffixes removed using +@code{file-name-sans-versions} (@pxref{File Name Components}), matches +a @var{regexp}, @code{set-auto-mode} calls the corresponding +@var{mode-function}. This feature enables Emacs to select the proper +major mode for most files. + +If an element of @code{auto-mode-alist} has the form @code{(@var{regexp} +@var{function} t)}, then after calling @var{function}, Emacs searches +@code{auto-mode-alist} again for a match against the portion of the file +name that did not match before. This feature is useful for +uncompression packages: an entry of the form @code{("\\.gz\\'" +@var{function} t)} can uncompress the file and then put the uncompressed +file in the proper mode according to the name sans @samp{.gz}. + +Here is an example of how to prepend several pattern pairs to +@code{auto-mode-alist}. (You might use this sort of expression in your +init file.) + +@smallexample +@group +(setq auto-mode-alist + (append + ;; @r{File name (within directory) starts with a dot.} + '(("/\\.[^/]*\\'" . fundamental-mode) + ;; @r{File name has no dot.} + ("[^\\./]*\\'" . fundamental-mode) + ;; @r{File name ends in @samp{.C}.} + ("\\.C\\'" . c++-mode)) + auto-mode-alist)) +@end group +@end smallexample +@end defvar + +@node Mode Help +@subsection Getting Help about a Major Mode +@cindex mode help +@cindex help for major mode +@cindex documentation for major mode + + The @code{describe-mode} function is used to provide information +about major modes. It is normally called with @kbd{C-h m}. The +@code{describe-mode} function uses the value of @code{major-mode}, +which is why every major mode function needs to set the +@code{major-mode} variable. + +@deffn Command describe-mode +This function displays the documentation of the current major mode. + +The @code{describe-mode} function calls the @code{documentation} +function using the value of @code{major-mode} as an argument. Thus, it +displays the documentation string of the major mode function. +(@xref{Accessing Documentation}.) +@end deffn + +@defvar major-mode +This buffer-local variable holds the symbol for the current buffer's +major mode. This symbol should have a function definition that is the +command to switch to that major mode. The @code{describe-mode} +function uses the documentation string of the function as the +documentation of the major mode. +@end defvar + +@node Derived Modes +@subsection Defining Derived Modes +@cindex derived mode + + It's often useful to define a new major mode in terms of an existing +one. An easy way to do this is to use @code{define-derived-mode}. + +@defmac define-derived-mode variant parent name docstring keyword-args@dots{} body@dots{} +This construct defines @var{variant} as a major mode command, using +@var{name} as the string form of the mode name. @var{variant} and +@var{parent} should be unquoted symbols. + +The new command @var{variant} is defined to call the function +@var{parent}, then override certain aspects of that parent mode: + +@itemize @bullet +@item +The new mode has its own sparse keymap, named +@code{@var{variant}-map}. @code{define-derived-mode} +makes the parent mode's keymap the parent of the new map, unless +@code{@var{variant}-map} is already set and already has a parent. + +@item +The new mode has its own syntax table, kept in the variable +@code{@var{variant}-syntax-table}, unless you override this using the +@code{:syntax-table} keyword (see below). @code{define-derived-mode} +makes the parent mode's syntax-table the parent of +@code{@var{variant}-syntax-table}, unless the latter is already set +and already has a parent different from the standard syntax table. + +@item +The new mode has its own abbrev table, kept in the variable +@code{@var{variant}-abbrev-table}, unless you override this using the +@code{:abbrev-table} keyword (see below). + +@item +The new mode has its own mode hook, @code{@var{variant}-hook}. It +runs this hook, after running the hooks of its ancestor modes, with +@code{run-mode-hooks}, as the last thing it does. @xref{Mode Hooks}. +@end itemize + +In addition, you can specify how to override other aspects of +@var{parent} with @var{body}. The command @var{variant} +evaluates the forms in @var{body} after setting up all its usual +overrides, just before running the mode hooks. + +You can also specify @code{nil} for @var{parent}. This gives the new +mode no parent. Then @code{define-derived-mode} behaves as described +above, but, of course, omits all actions connected with @var{parent}. + +The argument @var{docstring} specifies the documentation string for +the new mode. @code{define-derived-mode} adds some general +information about the mode's hook, followed by the mode's keymap, at +the end of this docstring. If you omit @var{docstring}, +@code{define-derived-mode} generates a documentation string. + +The @var{keyword-args} are pairs of keywords and values. The values +are evaluated. The following keywords are currently supported: + +@table @code +@item :syntax-table +You can use this to explicitly specify a syntax table for the new +mode. If you specify a @code{nil} value, the new mode uses the same +syntax table as @var{parent}, or the standard syntax table if +@var{parent} is @code{nil}. (Note that this does @emph{not} follow +the convention used for non-keyword arguments that a @code{nil} value +is equivalent with not specifying the argument.) + +@item :abbrev-table +You can use this to explicitly specify an abbrev table for the new +mode. If you specify a @code{nil} value, the new mode uses the same +abbrev table as @var{parent}, or @code{fundamental-mode-abbrev-table} +if @var{parent} is @code{nil}. (Again, a @code{nil} value is +@emph{not} equivalent to not specifying this keyword.) + +@item :group +If this is specified, the value should be the customization group for +this mode. (Not all major modes have one.) Only the (still +experimental and unadvertised) command @code{customize-mode} currently +uses this. @code{define-derived-mode} does @emph{not} automatically +define the specified customization group. +@end table + +Here is a hypothetical example: + +@example +(define-derived-mode hypertext-mode + text-mode "Hypertext" + "Major mode for hypertext. +\\@{hypertext-mode-map@}" + (setq case-fold-search nil)) + +(define-key hypertext-mode-map + [down-mouse-3] 'do-hyper-link) +@end example + +Do not write an @code{interactive} spec in the definition; +@code{define-derived-mode} does that automatically. +@end defmac + +@node Generic Modes +@subsection Generic Modes +@cindex generic mode + + @dfn{Generic modes} are simple major modes with basic support for +comment syntax and Font Lock mode. To define a generic mode, use the +macro @code{define-generic-mode}. See the file @file{generic-x.el} +for some examples of the use of @code{define-generic-mode}. + +@defmac define-generic-mode mode comment-list keyword-list font-lock-list auto-mode-list function-list &optional docstring +This macro defines a generic mode command named @var{mode} (a symbol, +not quoted). The optional argument @var{docstring} is the +documentation for the mode command. If you do not supply it, +@code{define-generic-mode} generates one by default. + +The argument @var{comment-list} is a list in which each element is +either a character, a string of one or two characters, or a cons cell. +A character or a string is set up in the mode's syntax table as a +``comment starter.'' If the entry is a cons cell, the @sc{car} is set +up as a ``comment starter'' and the @sc{cdr} as a ``comment ender.'' +(Use @code{nil} for the latter if you want comments to end at the end +of the line.) Note that the syntax table mechanism has limitations +about what comment starters and enders are actually possible. +@xref{Syntax Tables}. + +The argument @var{keyword-list} is a list of keywords to highlight +with @code{font-lock-keyword-face}. Each keyword should be a string. +Meanwhile, @var{font-lock-list} is a list of additional expressions to +highlight. Each element of this list should have the same form as an +element of @code{font-lock-keywords}. @xref{Search-based +Fontification}. + +The argument @var{auto-mode-list} is a list of regular expressions to +add to the variable @code{auto-mode-alist}. They are added by the execution +of the @code{define-generic-mode} form, not by expanding the macro call. + +Finally, @var{function-list} is a list of functions for the mode +command to call for additional setup. It calls these functions just +before it runs the mode hook variable @code{@var{mode}-hook}. +@end defmac + +@node Mode Hooks +@subsection Mode Hooks + + Every major mode function should finish by running its mode hook and +the mode-independent normal hook @code{after-change-major-mode-hook}. +It does this by calling @code{run-mode-hooks}. If the major mode is a +derived mode, that is if it calls another major mode (the parent mode) +in its body, it should do this inside @code{delay-mode-hooks} so that +the parent won't run these hooks itself. Instead, the derived mode's +call to @code{run-mode-hooks} runs the parent's mode hook too. +@xref{Major Mode Conventions}. + + Emacs versions before Emacs 22 did not have @code{delay-mode-hooks}. +When user-implemented major modes have not been updated to use it, +they won't entirely follow these conventions: they may run the +parent's mode hook too early, or fail to run +@code{after-change-major-mode-hook}. If you encounter such a major +mode, please correct it to follow these conventions. + + When you defined a major mode using @code{define-derived-mode}, it +automatically makes sure these conventions are followed. If you +define a major mode ``by hand,'' not using @code{define-derived-mode}, +use the following functions to handle these conventions automatically. + +@defun run-mode-hooks &rest hookvars +Major modes should run their mode hook using this function. It is +similar to @code{run-hooks} (@pxref{Hooks}), but it also runs +@code{after-change-major-mode-hook}. + +When this function is called during the execution of a +@code{delay-mode-hooks} form, it does not run the hooks immediately. +Instead, it arranges for the next call to @code{run-mode-hooks} to run +them. +@end defun + +@defmac delay-mode-hooks body@dots{} +When one major mode command calls another, it should do so inside of +@code{delay-mode-hooks}. + +This macro executes @var{body}, but tells all @code{run-mode-hooks} +calls during the execution of @var{body} to delay running their hooks. +The hooks will actually run during the next call to +@code{run-mode-hooks} after the end of the @code{delay-mode-hooks} +construct. +@end defmac + +@defvar after-change-major-mode-hook +This is a normal hook run by @code{run-mode-hooks}. It is run at the +very end of every properly-written major mode function. +@end defvar + +@node Example Major Modes +@subsection Major Mode Examples + + Text mode is perhaps the simplest mode besides Fundamental mode. +Here are excerpts from @file{text-mode.el} that illustrate many of +the conventions listed above: + +@smallexample +@group +;; @r{Create the syntax table for this mode.} +(defvar text-mode-syntax-table + (let ((st (make-syntax-table))) + (modify-syntax-entry ?\" ". " st) + (modify-syntax-entry ?\\ ". " st) + ;; Add `p' so M-c on `hello' leads to `Hello', not `hello'. + (modify-syntax-entry ?' "w p" st) + st) + "Syntax table used while in `text-mode'.") +@end group + +;; @r{Create the keymap for this mode.} +@group +(defvar text-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\e\t" 'ispell-complete-word) + (define-key map "\es" 'center-line) + (define-key map "\eS" 'center-paragraph) + map) + "Keymap for `text-mode'. +Many other modes, such as Mail mode, Outline mode +and Indented Text mode, inherit all the commands +defined in this map.") +@end group +@end smallexample + + Here is how the actual mode command is defined now: + +@smallexample +@group +(define-derived-mode text-mode nil "Text" + "Major mode for editing text written for humans to read. +In this mode, paragraphs are delimited only by blank or white lines. +You can thus get the full benefit of adaptive filling + (see the variable `adaptive-fill-mode'). +\\@{text-mode-map@} +Turning on Text mode runs the normal hook `text-mode-hook'." +@end group +@group + (make-local-variable 'text-mode-variant) + (setq text-mode-variant t) + ;; @r{These two lines are a feature added recently.} + (set (make-local-variable 'require-final-newline) + mode-require-final-newline) + (set (make-local-variable 'indent-line-function) 'indent-relative)) +@end group +@end smallexample + +@noindent +(The last line is redundant nowadays, since @code{indent-relative} is +the default value, and we'll delete it in a future version.) + + Here is how it was defined formerly, before +@code{define-derived-mode} existed: + +@smallexample +@group +;; @r{This isn't needed nowadays, since @code{define-derived-mode} does it.} +(defvar text-mode-abbrev-table nil + "Abbrev table used while in text mode.") +(define-abbrev-table 'text-mode-abbrev-table ()) +@end group + +@group +(defun text-mode () + "Major mode for editing text intended for humans to read... + Special commands: \\@{text-mode-map@} +@end group +@group +Turning on text-mode runs the hook `text-mode-hook'." + (interactive) + (kill-all-local-variables) + (use-local-map text-mode-map) +@end group +@group + (setq local-abbrev-table text-mode-abbrev-table) + (set-syntax-table text-mode-syntax-table) +@end group +@group + ;; @r{These four lines are absent from the current version} + ;; @r{not because this is done some other way, but rather} + ;; @r{because nowadays Text mode uses the normal definition of paragraphs.} + (make-local-variable 'paragraph-start) + (setq paragraph-start (concat "[ \t]*$\\|" page-delimiter)) + (make-local-variable 'paragraph-separate) + (setq paragraph-separate paragraph-start) + (make-local-variable 'indent-line-function) + (setq indent-line-function 'indent-relative-maybe) +@end group +@group + (setq mode-name "Text") + (setq major-mode 'text-mode) + (run-mode-hooks 'text-mode-hook)) ; @r{Finally, this permits the user to} + ; @r{customize the mode with a hook.} +@end group +@end smallexample + +@cindex @file{lisp-mode.el} + 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 +@file{lisp-mode.el} that illustrate how these modes are written. + +@cindex syntax table example +@smallexample +@group +;; @r{Create mode-specific table variables.} +(defvar lisp-mode-syntax-table nil "") +(defvar lisp-mode-abbrev-table nil "") +@end group + +@group +(defvar emacs-lisp-mode-syntax-table + (let ((table (make-syntax-table))) + (let ((i 0)) +@end group + +@group + ;; @r{Set syntax of chars up to @samp{0} to say they are} + ;; @r{part of symbol names but not words.} + ;; @r{(The digit @samp{0} is @code{48} in the @acronym{ASCII} character set.)} + (while (< i ?0) + (modify-syntax-entry i "_ " table) + (setq i (1+ i))) + ;; @r{@dots{} similar code follows for other character ranges.} +@end group +@group + ;; @r{Then set the syntax codes for characters that are special in Lisp.} + (modify-syntax-entry ? " " table) + (modify-syntax-entry ?\t " " table) + (modify-syntax-entry ?\f " " table) + (modify-syntax-entry ?\n "> " table) +@end group +@group + ;; @r{Give CR the same syntax as newline, for selective-display.} + (modify-syntax-entry ?\^m "> " table) + (modify-syntax-entry ?\; "< " table) + (modify-syntax-entry ?` "' " table) + (modify-syntax-entry ?' "' " table) + (modify-syntax-entry ?, "' " table) +@end group +@group + ;; @r{@dots{}likewise for many other characters@dots{}} + (modify-syntax-entry ?\( "() " table) + (modify-syntax-entry ?\) ")( " table) + (modify-syntax-entry ?\[ "(] " table) + (modify-syntax-entry ?\] ")[ " table)) + table)) +@end group +@group +;; @r{Create an abbrev table for lisp-mode.} +(define-abbrev-table 'lisp-mode-abbrev-table ()) +@end group +@end smallexample + + The three modes for Lisp share much of their code. For instance, +each calls the following function to set various variables: + +@smallexample +@group +(defun lisp-mode-variables (lisp-syntax) + (when lisp-syntax + (set-syntax-table lisp-mode-syntax-table)) + (setq local-abbrev-table lisp-mode-abbrev-table) + @dots{} +@end group +@end smallexample + + In Lisp and most programming languages, we want the paragraph +commands to treat only blank lines as paragraph separators. And the +modes should understand the Lisp conventions for comments. The rest of +@code{lisp-mode-variables} sets this up: + +@smallexample +@group + (make-local-variable 'paragraph-start) + (setq paragraph-start (concat page-delimiter "\\|$" )) + (make-local-variable 'paragraph-separate) + (setq paragraph-separate paragraph-start) + @dots{} +@end group +@group + (make-local-variable 'comment-indent-function) + (setq comment-indent-function 'lisp-comment-indent)) + @dots{} +@end group +@end smallexample + + Each of the different Lisp modes has a slightly different keymap. For +example, Lisp mode binds @kbd{C-c C-z} to @code{run-lisp}, but the other +Lisp modes do not. However, all Lisp modes have some commands in +common. The following code sets up the common commands: + +@smallexample +@group +(defvar shared-lisp-mode-map () + "Keymap for commands shared by all sorts of Lisp modes.") + +;; @r{Putting this @code{if} after the @code{defvar} is an older style.} +(if shared-lisp-mode-map + () + (setq shared-lisp-mode-map (make-sparse-keymap)) + (define-key shared-lisp-mode-map "\e\C-q" 'indent-sexp) + (define-key shared-lisp-mode-map "\177" + 'backward-delete-char-untabify)) +@end group +@end smallexample + +@noindent +And here is the code to set up the keymap for Lisp mode: + +@smallexample +@group +(defvar lisp-mode-map () + "Keymap for ordinary Lisp mode...") + +(if lisp-mode-map + () + (setq lisp-mode-map (make-sparse-keymap)) + (set-keymap-parent lisp-mode-map shared-lisp-mode-map) + (define-key lisp-mode-map "\e\C-x" 'lisp-eval-defun) + (define-key lisp-mode-map "\C-c\C-z" 'run-lisp)) +@end group +@end smallexample + + Finally, here is the complete major mode function definition for +Lisp mode. + +@smallexample +@group +(defun lisp-mode () + "Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp. +Commands: +Delete converts tabs to spaces as it moves back. +Blank lines separate paragraphs. Semicolons start comments. +\\@{lisp-mode-map@} +Note that `run-lisp' may be used either to start an inferior Lisp job +or to switch back to an existing one. +@end group + +@group +Entry to this mode calls the value of `lisp-mode-hook' +if that value is non-nil." + (interactive) + (kill-all-local-variables) +@end group +@group + (use-local-map lisp-mode-map) ; @r{Select the mode's keymap.} + (setq major-mode 'lisp-mode) ; @r{This is how @code{describe-mode}} + ; @r{finds out what to describe.} + (setq mode-name "Lisp") ; @r{This goes into the mode line.} + (lisp-mode-variables t) ; @r{This defines various variables.} + (make-local-variable 'comment-start-skip) + (setq comment-start-skip + "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") + (make-local-variable 'font-lock-keywords-case-fold-search) + (setq font-lock-keywords-case-fold-search t) +@end group +@group + (setq imenu-case-fold-search t) + (set-syntax-table lisp-mode-syntax-table) + (run-mode-hooks 'lisp-mode-hook)) ; @r{This permits the user to use a} + ; @r{hook to customize the mode.} +@end group +@end smallexample + +@node Minor Modes +@section Minor Modes +@cindex minor mode + + A @dfn{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 +would be unwieldy. + + A minor mode is not usually meant as a variation of a single major mode. +Usually they are general and can apply to many major modes. For +example, Auto Fill mode works with 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 activate and deactivate +minor modes in any order. A minor mode should be able to have its +desired effect regardless of the major mode and regardless of the other +minor modes in effect. + + Often the biggest problem in implementing a minor mode is finding a +way to insert the necessary hook into the rest of Emacs. Minor mode +keymaps make this easier than it used to be. + +@defvar minor-mode-list +The value of this variable is a list of all minor mode commands. +@end defvar + +@menu +* Minor Mode Conventions:: Tips for writing a minor mode. +* Keymaps and Minor Modes:: How a minor mode can have its own keymap. +* Defining Minor Modes:: A convenient facility for defining minor modes. +@end menu + +@node Minor Mode Conventions +@subsection Conventions for Writing Minor Modes +@cindex minor mode conventions +@cindex 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, the use of a hook at the end of +the initialization function, and the use of keymaps and other tables. + + In addition, there are several conventions that are specific to +minor modes. (The easiest way to follow all the conventions is to use +the macro @code{define-minor-mode}; @ref{Defining Minor Modes}.) + +@itemize @bullet +@item +@cindex mode variable +Make a variable whose name ends in @samp{-mode} to control the minor +mode. We call this the @dfn{mode variable}. The minor mode command +should set this variable (@code{nil} to disable; anything else to +enable). + +If possible, implement the mode so that setting the variable +automatically enables or disables the mode. Then the minor mode command +does not need to do anything except set the variable. + +This variable is used in conjunction with the @code{minor-mode-alist} to +display the minor mode name in the mode line. It can also enable +or disable a minor mode keymap. Individual commands or hooks can also +check the variable's value. + +If you want the minor mode to be enabled separately in each buffer, +make the variable buffer-local. + +@item +Define a command whose name is the same as the mode variable. +Its job is to enable and disable the mode by setting the variable. + +The command should accept one optional argument. If the argument is +@code{nil}, it should toggle the mode (turn it on if it is off, and +off if it is on). It should turn the mode on if the argument is a +positive integer, the symbol @code{t}, or a list whose @sc{car} is one +of those. It should turn the mode off if the argument is a negative +integer or zero, the symbol @code{-}, or a list whose @sc{car} is a +negative integer or zero. The meaning of other arguments is not +specified. + +Here is an example taken from the definition of @code{transient-mark-mode}. +It shows the use of @code{transient-mark-mode} as a variable that enables or +disables the mode's behavior, and also shows the proper way to toggle, +enable or disable the minor mode based on the raw prefix argument value. + +@smallexample +@group +(setq transient-mark-mode + (if (null arg) (not transient-mark-mode) + (> (prefix-numeric-value arg) 0))) +@end group +@end smallexample + +@item +Add an element to @code{minor-mode-alist} for each minor mode +(@pxref{Definition of minor-mode-alist}), if you want to indicate the +minor mode in the mode line. This element should be a list of the +following form: + +@smallexample +(@var{mode-variable} @var{string}) +@end smallexample + +Here @var{mode-variable} is the variable that controls enabling of the +minor mode, and @var{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 @code{minor-mode-alist}, use @code{assq} to +check for an existing element, to avoid duplication. For example: + +@smallexample +@group +(unless (assq 'leif-mode minor-mode-alist) + (setq minor-mode-alist + (cons '(leif-mode " Leif") minor-mode-alist))) +@end group +@end smallexample + +@noindent +or like this, using @code{add-to-list} (@pxref{List Variables}): + +@smallexample +@group +(add-to-list 'minor-mode-alist '(leif-mode " Leif")) +@end group +@end smallexample +@end itemize + + Global minor modes distributed with Emacs should if possible support +enabling and disabling via Custom (@pxref{Customization}). To do this, +the first step is to define the mode variable with @code{defcustom}, and +specify @code{:type boolean}. + + If just setting the variable is not sufficient to enable the mode, you +should also specify a @code{:set} method which enables the mode by +invoking the mode command. Note in the variable's documentation string that +setting the variable other than via Custom may not take effect. + + Also mark the definition with an autoload cookie (@pxref{autoload cookie}), +and specify a @code{:require} so that customizing the variable will load +the library that defines the mode. This will copy suitable definitions +into @file{loaddefs.el} so that users can use @code{customize-option} to +enable the mode. For example: + +@smallexample +@group + +;;;###autoload +(defcustom msb-mode nil + "Toggle msb-mode. +Setting this variable directly does not take effect; +use either \\[customize] or the function `msb-mode'." + :set 'custom-set-minor-mode + :initialize 'custom-initialize-default + :version "20.4" + :type 'boolean + :group 'msb + :require 'msb) +@end group +@end smallexample + +@node Keymaps and Minor Modes +@subsection Keymaps and Minor Modes + + Each minor mode can have its own keymap, which is active when the mode +is enabled. To set up a keymap for a minor mode, add an element to the +alist @code{minor-mode-map-alist}. @xref{Definition of minor-mode-map-alist}. + +@cindex @code{self-insert-command}, minor modes + One use of minor mode keymaps is to modify the behavior of certain +self-inserting characters so that they do something else as well as +self-insert. In general, this is the only way to do that, since the +facilities for customizing @code{self-insert-command} are limited to +special cases (designed for abbrevs and Auto Fill mode). (Do not try +substituting your own definition of @code{self-insert-command} for the +standard one. The editor command loop handles this function specially.) + +The key sequences bound in a minor mode should consist of @kbd{C-c} +followed by one of @kbd{.,/?`'"[]\|~!#$%^&*()-_+=}. (The other +punctuation characters are reserved for major modes.) + +@node Defining Minor Modes +@subsection Defining Minor Modes + + The macro @code{define-minor-mode} offers a convenient way of +implementing a mode in one self-contained definition. + +@defmac define-minor-mode mode doc [init-value [lighter [keymap]]] keyword-args@dots{} body@dots{} +This macro defines a new minor mode whose name is @var{mode} (a +symbol). It defines a command named @var{mode} to toggle the minor +mode, with @var{doc} as its documentation string. It also defines a +variable named @var{mode}, which is set to @code{t} or @code{nil} by +enabling or disabling the mode. The variable is initialized to +@var{init-value}. Except in unusual circumstances (see below), this +value must be @code{nil}. + +The string @var{lighter} says what to display in the mode line +when the mode is enabled; if it is @code{nil}, the mode is not displayed +in the mode line. + +The optional argument @var{keymap} specifies the keymap for the minor mode. +It can be a variable name, whose value is the keymap, or it can be an alist +specifying bindings in this form: + +@example +(@var{key-sequence} . @var{definition}) +@end example + +The above three arguments @var{init-value}, @var{lighter}, and +@var{keymap} can be (partially) omitted when @var{keyword-args} are +used. The @var{keyword-args} consist of keywords followed by +corresponding values. A few keywords have special meanings: + +@table @code +@item :group @var{group} +Custom group name to use in all generated @code{defcustom} forms. +Defaults to @var{mode} without the possible trailing @samp{-mode}. +@strong{Warning:} don't use this default group name unless you have +written a @code{defgroup} to define that group properly. @xref{Group +Definitions}. + +@item :global @var{global} +If non-@code{nil}, this specifies that the minor mode should be global +rather than buffer-local. It defaults to @code{nil}. + +One of the effects of making a minor mode global is that the +@var{mode} variable becomes a customization variable. Toggling it +through the Custom interface turns the mode on and off, and its value +can be saved for future Emacs sessions (@pxref{Saving +Customizations,,, emacs, The GNU Emacs Manual}. For the saved +variable to work, you should ensure that the @code{define-minor-mode} +form is evaluated each time Emacs starts; for packages that are not +part of Emacs, the easiest way to do this is to specify a +@code{:require} keyword. + +@item :init-value @var{init-value} +This is equivalent to specifying @var{init-value} positionally. + +@item :lighter @var{lighter} +This is equivalent to specifying @var{lighter} positionally. + +@item :keymap @var{keymap} +This is equivalent to specifying @var{keymap} positionally. +@end table + +Any other keyword arguments are passed directly to the +@code{defcustom} generated for the variable @var{mode}. + +The command named @var{mode} first performs the standard actions such +as setting the variable named @var{mode} and then executes the +@var{body} forms, if any. It finishes by running the mode hook +variable @code{@var{mode}-hook}. +@end defmac + + The initial value must be @code{nil} except in cases where (1) the +mode is preloaded in Emacs, or (2) it is painless for loading to +enable the mode even though the user did not request it. For +instance, if the mode has no effect unless something else is enabled, +and will always be loaded by that time, enabling it by default is +harmless. But these are unusual circumstances. Normally, the +initial value must be @code{nil}. + +@findex easy-mmode-define-minor-mode + The name @code{easy-mmode-define-minor-mode} is an alias +for this macro. + + Here is an example of using @code{define-minor-mode}: + +@smallexample +(define-minor-mode hungry-mode + "Toggle Hungry mode. +With no argument, this command toggles the mode. +Non-null prefix argument turns on the mode. +Null prefix argument turns off the mode. + +When Hungry mode is enabled, the control delete key +gobbles all preceding whitespace except the last. +See the command \\[hungry-electric-delete]." + ;; The initial value. + nil + ;; The indicator for the mode line. + " Hungry" + ;; The minor mode bindings. + '(("\C-\^?" . hungry-electric-delete)) + :group 'hunger) +@end smallexample + +@noindent +This defines a minor mode named ``Hungry mode,'' a command named +@code{hungry-mode} to toggle it, a variable named @code{hungry-mode} +which indicates whether the mode is enabled, and a variable named +@code{hungry-mode-map} which holds the keymap that is active when the +mode is enabled. It initializes the keymap with a key binding for +@kbd{C-@key{DEL}}. It puts the variable @code{hungry-mode} into +custom group @code{hunger}. There are no @var{body} forms---many +minor modes don't need any. + + Here's an equivalent way to write it: + +@smallexample +(define-minor-mode hungry-mode + "Toggle Hungry mode. +With no argument, this command toggles the mode. +Non-null prefix argument turns on the mode. +Null prefix argument turns off the mode. + +When Hungry mode is enabled, the control delete key +gobbles all preceding whitespace except the last. +See the command \\[hungry-electric-delete]." + ;; The initial value. + :init-value nil + ;; The indicator for the mode line. + :lighter " Hungry" + ;; The minor mode bindings. + :keymap + '(("\C-\^?" . hungry-electric-delete) + ("\C-\M-\^?" + . (lambda () + (interactive) + (hungry-electric-delete t)))) + :group 'hunger) +@end smallexample + +@defmac define-globalized-minor-mode global-mode mode turn-on keyword-args@dots{} +This defines a global toggle named @var{global-mode} whose meaning is +to enable or disable the buffer-local minor mode @var{mode} in all +buffers. To turn on the minor mode in a buffer, it uses the function +@var{turn-on}; to turn off the minor mode, it calls @code{mode} with +@minus{}1 as argument. + +Globally enabling the mode also affects buffers subsequently created +by visiting files, and buffers that use a major mode other than +Fundamental mode; but it does not detect the creation of a new buffer +in Fundamental mode. + +This defines the customization option @var{global-mode} (@pxref{Customization}), +which can be toggled in the Custom interface to turn the minor mode on +and off. As with @code{define-minor-mode}, you should ensure that the +@code{define-globalized-minor-mode} form is evaluated each time Emacs +starts, for example by providing a @code{:require} keyword. + +Use @code{:group @var{group}} in @var{keyword-args} to specify the +custom group for the mode variable of the global minor mode. +@end defmac + +@node Mode Line Format +@section Mode-Line Format +@cindex mode line + + Each Emacs window (aside from minibuffer windows) typically has a mode +line at the bottom, 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 major and minor modes. A window can also have a @dfn{header +line}, which is much like the mode line but appears at the top of the +window. + + This section describes how to control the contents of the mode line +and header line. We include it in this chapter because much of the +information displayed in the mode line relates to the enabled major and +minor modes. + +@menu +* Base: Mode Line Basics. Basic ideas of mode line control. +* Data: Mode Line Data. The data structure that controls the mode line. +* Top: Mode Line Top. The top level variable, mode-line-format. +* Mode Line Variables:: Variables used in that data structure. +* %-Constructs:: Putting information into a mode line. +* Properties in Mode:: Using text properties in the mode line. +* Header Lines:: Like a mode line, but at the top. +* Emulating Mode Line:: Formatting text as the mode line would. +@end menu + +@node Mode Line Basics +@subsection Mode Line Basics + + @code{mode-line-format} is a buffer-local variable that holds a +@dfn{mode line construct}, a kind of template, which controls what is +displayed on the mode line of the current buffer. The value of +@code{header-line-format} specifies the buffer's header line in the +same way. All windows for the same buffer use the same +@code{mode-line-format} and @code{header-line-format}. + + For efficiency, Emacs does not continuously recompute the mode +line and header line of a window. It does so when circumstances +appear to call for it---for instance, if you change the window +configuration, switch buffers, narrow or widen the buffer, scroll, or +change the buffer's modification status. If you modify any of the +variables referenced by @code{mode-line-format} (@pxref{Mode Line +Variables}), or any other variables and data structures that affect +how text is displayed (@pxref{Display}), you may want to force an +update of the mode line so as to display the new information or +display it in the new way. + +@defun force-mode-line-update &optional all +Force redisplay of the current buffer's mode line and header line. +The next redisplay will update the mode line and header line based on +the latest values of all relevant variables. With optional +non-@code{nil} @var{all}, force redisplay of all mode lines and header +lines. + +This function also forces recomputation of the menu bar menus +and the frame title. +@end defun + + The selected window's mode line is usually displayed in a different +color using the face @code{mode-line}. Other windows' mode lines +appear in the face @code{mode-line-inactive} instead. @xref{Faces}. + +@node Mode Line Data +@subsection The Data Structure of the Mode Line +@cindex mode-line construct + + The mode-line contents are controlled by a data structure called a +@dfn{mode-line construct}, made up of lists, strings, symbols, and +numbers kept in buffer-local variables. Each data type has a specific +meaning for the mode-line appearance, as described below. The same +data structure is used for constructing frame titles (@pxref{Frame +Titles}) and header lines (@pxref{Header Lines}). + + A mode-line construct may be as simple as a fixed string of text, +but it usually specifies how to combine fixed strings with variables' +values to construct the text. Many of these variables are themselves +defined to have mode-line constructs as their values. + + Here are the meanings of various data types as mode-line constructs: + +@table @code +@cindex percent symbol in mode line +@item @var{string} +A string as a mode-line construct appears verbatim except for +@dfn{@code{%}-constructs} in it. These stand for substitution of +other data; see @ref{%-Constructs}. + +If parts of the string have @code{face} properties, they control +display of the text just as they would text in the buffer. Any +characters which have no @code{face} properties are displayed, by +default, in the face @code{mode-line} or @code{mode-line-inactive} +(@pxref{Standard Faces,,, emacs, The GNU Emacs Manual}). The +@code{help-echo} and @code{local-map} properties in @var{string} have +special meanings. @xref{Properties in Mode}. + +@item @var{symbol} +A symbol as a mode-line construct stands for its value. The value of +@var{symbol} is used as a mode-line construct, in place of @var{symbol}. +However, the symbols @code{t} and @code{nil} are ignored, as is any +symbol whose value is void. + +There is one exception: if the value of @var{symbol} is a string, it is +displayed verbatim: the @code{%}-constructs are not recognized. + +Unless @var{symbol} is marked as ``risky'' (i.e., it has a +non-@code{nil} @code{risky-local-variable} property), all text +properties specified in @var{symbol}'s value are ignored. This +includes the text properties of strings in @var{symbol}'s value, as +well as all @code{:eval} and @code{:propertize} forms in it. (The +reason for this is security: non-risky variables could be set +automatically from file variables without prompting the user.) + +@item (@var{string} @var{rest}@dots{}) +@itemx (@var{list} @var{rest}@dots{}) +A list whose first element is a string or list means to process all the +elements recursively and concatenate the results. This is the most +common form of mode-line construct. + +@item (:eval @var{form}) +A list whose first element is the symbol @code{:eval} says to evaluate +@var{form}, and use the result as a string to display. Make sure this +evaluation cannot load any files, as doing so could cause infinite +recursion. + +@item (:propertize @var{elt} @var{props}@dots{}) +A list whose first element is the symbol @code{:propertize} says to +process the mode-line construct @var{elt} recursively, then add the text +properties specified by @var{props} to the result. The argument +@var{props} should consist of zero or more pairs @var{text-property} +@var{value}. (This feature is new as of Emacs 22.1.) + +@item (@var{symbol} @var{then} @var{else}) +A list whose first element is a symbol that is not a keyword specifies +a conditional. Its meaning depends on the value of @var{symbol}. If +@var{symbol} has a non-@code{nil} value, the second element, +@var{then}, is processed recursively as a mode-line element. +Otherwise, the third element, @var{else}, is processed recursively. +You may omit @var{else}; then the mode-line element displays nothing +if the value of @var{symbol} is @code{nil} or void. + +@item (@var{width} @var{rest}@dots{}) +A list whose first element is an integer specifies truncation or +padding of the results of @var{rest}. The remaining elements +@var{rest} are processed recursively as mode-line constructs and +concatenated together. When @var{width} is positive, the result is +space filled on the right if its width is less than @var{width}. When +@var{width} is negative, the result is truncated on the right to +@minus{}@var{width} columns if its width exceeds @minus{}@var{width}. + +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: @code{(-3 "%p")}. +@end table + +@node Mode Line Top +@subsection The Top Level of Mode Line Control + + The variable in overall control of the mode line is +@code{mode-line-format}. + +@defvar mode-line-format +The value of this variable is a mode-line construct that controls the +contents of the mode-line. It is always buffer-local in all buffers. + +If you set this variable to @code{nil} in a buffer, that buffer does +not have a mode line. (A window that is just one line tall never +displays a mode line.) +@end defvar + + The default value of @code{mode-line-format} is designed to use the +values of other variables such as @code{mode-line-position} and +@code{mode-line-modes} (which in turn incorporates the values of the +variables @code{mode-name} and @code{minor-mode-alist}). Very few +modes need to alter @code{mode-line-format} itself. For most +purposes, it is sufficient to alter some of the variables that +@code{mode-line-format} either directly or indirectly refers to. + + If you do alter @code{mode-line-format} itself, the new value should +use the same variables that appear in the default value (@pxref{Mode +Line Variables}), rather than duplicating their contents or displaying +the information in another fashion. This way, customizations made by +the user or by Lisp programs (such as @code{display-time} and major +modes) via changes to those variables remain effective. + + Here is an example of a @code{mode-line-format} that might be +useful for @code{shell-mode}, since it contains the host name and default +directory. + +@example +@group +(setq mode-line-format + (list "-" + 'mode-line-mule-info + 'mode-line-modified + 'mode-line-frame-identification + "%b--" +@end group +@group + ;; @r{Note that this is evaluated while making the list.} + ;; @r{It makes a mode-line construct which is just a string.} + (getenv "HOST") +@end group + ":" + 'default-directory + " " + 'global-mode-string + " %[(" + '(:eval (mode-line-mode-name)) + 'mode-line-process + 'minor-mode-alist + "%n" + ")%]--" +@group + '(which-func-mode ("" which-func-format "--")) + '(line-number-mode "L%l--") + '(column-number-mode "C%c--") + '(-3 "%p") + "-%-")) +@end group +@end example + +@noindent +(The variables @code{line-number-mode}, @code{column-number-mode} +and @code{which-func-mode} enable particular minor modes; as usual, +these variable names are also the minor mode command names.) + +@node Mode Line Variables +@subsection Variables Used in the Mode Line + + This section describes variables incorporated by the standard value +of @code{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 +@code{mode-line-format}'s value were changed to use them. However, +various parts of Emacs set these variables on the understanding that +they will control parts of the mode line; therefore, practically +speaking, it is essential for the mode line to use them. + +@defvar mode-line-mule-info +This variable holds the value of the mode-line construct that displays +information about the language environment, buffer coding system, and +current input method. @xref{Non-ASCII Characters}. +@end defvar + +@defvar mode-line-modified +This variable holds the value of the mode-line construct that displays +whether the current buffer is modified. + +The default value of @code{mode-line-modified} is @code{("%1*%1+")}. +This means that the mode line displays @samp{**} if the buffer is +modified, @samp{--} if the buffer is not modified, @samp{%%} if the +buffer is read only, and @samp{%*} if the buffer is read only and +modified. + +Changing this variable does not force an update of the mode line. +@end defvar + +@defvar mode-line-frame-identification +This variable identifies the current frame. The default value is +@code{" "} if you are using a window system which can show multiple +frames, or @code{"-%F "} on an ordinary terminal which shows only one +frame at a time. +@end defvar + +@defvar mode-line-buffer-identification +This variable identifies the buffer being displayed in the window. Its +default value is @code{("%12b")}, which displays the buffer name, padded +with spaces to at least 12 columns. +@end defvar + +@defvar mode-line-position +This variable indicates the position in the buffer. Here is a +simplified version of its default value. The actual default value +also specifies addition of the @code{help-echo} text property. + +@example +@group +((-3 "%p") + (size-indication-mode (8 " of %I")) +@end group +@group + (line-number-mode + ((column-number-mode + (10 " (%l,%c)") + (6 " L%l"))) + ((column-number-mode + (5 " C%c"))))) +@end group +@end example + +This means that @code{mode-line-position} displays at least the buffer +percentage and possibly the buffer size, the line number and the column +number. +@end defvar + +@defvar vc-mode +The variable @code{vc-mode}, buffer-local in each buffer, records +whether the buffer's visited file is maintained with version control, +and, if so, which kind. Its value is a string that appears in the mode +line, or @code{nil} for no version control. +@end defvar + +@defvar mode-line-modes +This variable displays the buffer's major and minor modes. Here is a +simplified version of its default value. The real default value also +specifies addition of text properties. + +@example +@group +("%[(" mode-name + mode-line-process minor-mode-alist + "%n" ")%]--") +@end group +@end example + +So @code{mode-line-modes} normally also displays the recursive editing +level, information on the process status and whether narrowing is in +effect. +@end defvar + + The following three variables are used in @code{mode-line-modes}: + +@defvar 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. +@end defvar + +@defvar 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 @samp{*shell*} buffer is +@code{(":%s")}, which allows the shell to display its status along +with the major mode as: @samp{(Shell:run)}. Normally this variable +is @code{nil}. +@end defvar + +@defvar minor-mode-alist +@anchor{Definition of 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 @code{minor-mode-alist} should be a two-element list: + +@example +(@var{minor-mode-variable} @var{mode-line-string}) +@end example + +More generally, @var{mode-line-string} can be any mode-line spec. It +appears in the mode line when the value of @var{minor-mode-variable} +is non-@code{nil}, and not otherwise. These strings should begin with +spaces so that they don't run together. Conventionally, the +@var{minor-mode-variable} for a specific mode is set to a +non-@code{nil} value when that minor mode is activated. + +@code{minor-mode-alist} itself is not buffer-local. Each variable +mentioned in the alist should be buffer-local if its minor mode can be +enabled separately in each buffer. +@end defvar + +@defvar global-mode-string +This variable holds a mode-line spec that, by default, appears in the +mode line just after the @code{which-func-mode} minor mode if set, +else after @code{mode-line-modes}. The command @code{display-time} +sets @code{global-mode-string} to refer to the variable +@code{display-time-string}, which holds a string containing the time +and load information. + +The @samp{%M} construct substitutes the value of +@code{global-mode-string}, but that is obsolete, since the variable is +included in the mode line from @code{mode-line-format}. +@end defvar + + The variable @code{default-mode-line-format} is where +@code{mode-line-format} usually gets its value: + +@defvar default-mode-line-format +This variable holds the default @code{mode-line-format} for buffers +that do not override it. This is the same as @code{(default-value +'mode-line-format)}. + +Here is a simplified version of the default value of +@code{default-mode-line-format}. The real default value also +specifies addition of text properties. + +@example +@group +("-" + mode-line-mule-info + mode-line-modified + mode-line-frame-identification + mode-line-buffer-identification +@end group + " " + mode-line-position + (vc-mode vc-mode) + " " +@group + mode-line-modes + (which-func-mode ("" which-func-format "--")) + (global-mode-string ("--" global-mode-string)) + "-%-") +@end group +@end example +@end defvar + +@node %-Constructs +@subsection @code{%}-Constructs in the Mode Line + + Strings used as mode-line constructs can use certain +@code{%}-constructs to substitute various kinds of data. Here is a +list of the defined @code{%}-constructs, and what they mean. In any +construct except @samp{%%}, you can add a decimal integer after the +@samp{%} to specify a minimum field width. If the width is less, the +field is padded with spaces to the right. + +@table @code +@item %b +The current buffer name, obtained with the @code{buffer-name} function. +@xref{Buffer Names}. + +@item %c +The current column number of point. + +@item %e +When Emacs is nearly out of memory for Lisp objects, a brief message +saying so. Otherwise, this is empty. + +@item %f +The visited file name, obtained with the @code{buffer-file-name} +function. @xref{Buffer File Name}. + +@item %F +The title (only on a window system) or the name of the selected frame. +@xref{Basic Parameters}. + +@item %i +The size of the accessible part of the current buffer; basically +@code{(- (point-max) (point-min))}. + +@item %I +Like @samp{%i}, but the size is printed in a more readable way by using +@samp{k} for 10^3, @samp{M} for 10^6, @samp{G} for 10^9, etc., to +abbreviate. + +@item %l +The current line number of point, counting within the accessible portion +of the buffer. + +@item %n +@samp{Narrow} when narrowing is in effect; nothing otherwise (see +@code{narrow-to-region} in @ref{Narrowing}). + +@item %p +The percentage of the buffer text above the @strong{top} of window, or +@samp{Top}, @samp{Bottom} or @samp{All}. Note that the default +mode-line specification truncates this to three characters. + +@item %P +The percentage of the buffer text that is above the @strong{bottom} of +the window (which includes the text visible in the window, as well as +the text above the top), plus @samp{Top} if the top of the buffer is +visible on screen; or @samp{Bottom} or @samp{All}. + +@item %s +The status of the subprocess belonging to the current buffer, obtained with +@code{process-status}. @xref{Process Information}. + +@item %t +Whether the visited file is a text file or a binary file. This is a +meaningful distinction only on certain operating systems (@pxref{MS-DOS +File Types}). + +@item %z +The mnemonics of keyboard, terminal, and buffer coding systems. + +@item %Z +Like @samp{%z}, but including the end-of-line format. + +@item %* +@samp{%} if the buffer is read only (see @code{buffer-read-only}); @* +@samp{*} if the buffer is modified (see @code{buffer-modified-p}); @* +@samp{-} otherwise. @xref{Buffer Modification}. + +@item %+ +@samp{*} if the buffer is modified (see @code{buffer-modified-p}); @* +@samp{%} if the buffer is read only (see @code{buffer-read-only}); @* +@samp{-} otherwise. This differs from @samp{%*} only for a modified +read-only buffer. @xref{Buffer Modification}. + +@item %& +@samp{*} if the buffer is modified, and @samp{-} otherwise. + +@item %[ +An indication of the depth of recursive editing levels (not counting +minibuffer levels): one @samp{[} for each editing level. +@xref{Recursive Editing}. + +@item %] +One @samp{]} for each recursive editing level (not counting minibuffer +levels). + +@item %- +Dashes sufficient to fill the remainder of the mode line. + +@item %% +The character @samp{%}---this is how to include a literal @samp{%} in a +string in which @code{%}-constructs are allowed. +@end table + +The following two @code{%}-constructs are still supported, but they are +obsolete, since you can get the same results with the variables +@code{mode-name} and @code{global-mode-string}. + +@table @code +@item %m +The value of @code{mode-name}. + +@item %M +The value of @code{global-mode-string}. +@end table + +@node Properties in Mode +@subsection Properties in the Mode Line +@cindex text properties in the mode line + + Certain text properties are meaningful in the +mode line. The @code{face} property affects the appearance of text; the +@code{help-echo} property associates help strings with the text, and +@code{local-map} can make the text mouse-sensitive. + + There are four ways to specify text properties for text in the mode +line: + +@enumerate +@item +Put a string with a text property directly into the mode-line data +structure. + +@item +Put a text property on a mode-line %-construct such as @samp{%12b}; then +the expansion of the %-construct will have that same text property. + +@item +Use a @code{(:propertize @var{elt} @var{props}@dots{})} construct to +give @var{elt} a text property specified by @var{props}. + +@item +Use a list containing @code{:eval @var{form}} in the mode-line data +structure, and make @var{form} evaluate to a string that has a text +property. +@end enumerate + + You can use the @code{local-map} property to specify a keymap. This +keymap only takes real effect for mouse clicks; binding character keys +and function keys to it has no effect, since it is impossible to move +point into the mode line. + + When the mode line refers to a variable which does not have a +non-@code{nil} @code{risky-local-variable} property, any text +properties given or specified within that variable's values are +ignored. This is because such properties could otherwise specify +functions to be called, and those functions could come from file +local variables. + +@node Header Lines +@subsection Window Header Lines +@cindex header line (of a window) +@cindex window header line + + A window can have a @dfn{header line} at the +top, just as it can have a mode line at the bottom. The header line +feature works just like the mode-line feature, except that it's +controlled by different variables. + +@defvar header-line-format +This variable, local in every buffer, specifies how to display the +header line, for windows displaying the buffer. The format of the value +is the same as for @code{mode-line-format} (@pxref{Mode Line Data}). +@end defvar + +@defvar default-header-line-format +This variable holds the default @code{header-line-format} for buffers +that do not override it. This is the same as @code{(default-value +'header-line-format)}. + +It is normally @code{nil}, so that ordinary buffers have no header line. +@end defvar + + A window that is just one line tall never displays a header line. A +window that is two lines tall cannot display both a mode line and a +header line at once; if it has a mode line, then it does not display a +header line. + +@node Emulating Mode Line +@subsection Emulating Mode-Line Formatting + + You can use the function @code{format-mode-line} to compute +the text that would appear in a mode line or header line +based on a certain mode-line specification. + +@defun format-mode-line format &optional face window buffer +This function formats a line of text according to @var{format} as if +it were generating the mode line for @var{window}, but instead of +displaying the text in the mode line or the header line, it returns +the text as a string. The argument @var{window} defaults to the +selected window. If @var{buffer} is non-@code{nil}, all the +information used is taken from @var{buffer}; by default, it comes from +@var{window}'s buffer. + +The value string normally has text properties that correspond to the +faces, keymaps, etc., that the mode line would have. And any character +for which no @code{face} property is specified gets a default +value which is usually @var{face}. (If @var{face} is @code{t}, +that stands for either @code{mode-line} if @var{window} is selected, +otherwise @code{mode-line-inactive}. If @var{face} is @code{nil} or +omitted, that stands for no face property.) + +However, if @var{face} is an integer, the value has no text properties. + +For example, @code{(format-mode-line header-line-format)} returns the +text that would appear in the selected window's header line (@code{""} +if it has no header line). @code{(format-mode-line header-line-format +'header-line)} returns the same text, with each character +carrying the face that it will have in the header line itself. +@end defun + +@node Imenu +@section Imenu + +@cindex Imenu + @dfn{Imenu} is a feature that lets users select a definition or +section in the buffer, from a menu which lists all of them, to go +directly to that location in the buffer. Imenu works by constructing +a buffer index which lists the names and buffer positions of the +definitions, or other named portions of the buffer; then the user can +choose one of them and move point to it. Major modes can add a menu +bar item to use Imenu using @code{imenu-add-to-menubar}. + +@defun imenu-add-to-menubar name +This function defines a local menu bar item named @var{name} +to run Imenu. +@end defun + + The user-level commands for using Imenu are described in the Emacs +Manual (@pxref{Imenu,, Imenu, emacs, the Emacs Manual}). This section +explains how to customize Imenu's method of finding definitions or +buffer portions for a particular major mode. + + The usual and simplest way is to set the variable +@code{imenu-generic-expression}: + +@defvar imenu-generic-expression +This variable, if non-@code{nil}, is a list that specifies regular +expressions for finding definitions for Imenu. Simple elements of +@code{imenu-generic-expression} look like this: + +@example +(@var{menu-title} @var{regexp} @var{index}) +@end example + +Here, if @var{menu-title} is non-@code{nil}, it says that the matches +for this element should go in a submenu of the buffer index; +@var{menu-title} itself specifies the name for the submenu. If +@var{menu-title} is @code{nil}, the matches for this element go directly +in the top level of the buffer index. + +The second item in the list, @var{regexp}, is a regular expression +(@pxref{Regular Expressions}); anything in the buffer that it matches +is considered a definition, something to mention in the buffer index. +The third item, @var{index}, is a non-negative integer that indicates +which subexpression in @var{regexp} matches the definition's name. + +An element can also look like this: + +@example +(@var{menu-title} @var{regexp} @var{index} @var{function} @var{arguments}@dots{}) +@end example + +Each match for this element creates an index item, and when the index +item is selected by the user, it calls @var{function} with arguments +consisting of the item name, the buffer position, and @var{arguments}. + +For Emacs Lisp mode, @code{imenu-generic-expression} could look like +this: + +@c should probably use imenu-syntax-alist and \\sw rather than [-A-Za-z0-9+] +@example +@group +((nil "^\\s-*(def\\(un\\|subst\\|macro\\|advice\\)\ +\\s-+\\([-A-Za-z0-9+]+\\)" 2) +@end group +@group + ("*Vars*" "^\\s-*(def\\(var\\|const\\)\ +\\s-+\\([-A-Za-z0-9+]+\\)" 2) +@end group +@group + ("*Types*" + "^\\s-*\ +(def\\(type\\|struct\\|class\\|ine-condition\\)\ +\\s-+\\([-A-Za-z0-9+]+\\)" 2)) +@end group +@end example + +Setting this variable makes it buffer-local in the current buffer. +@end defvar + +@defvar imenu-case-fold-search +This variable controls whether matching against the regular +expressions in the value of @code{imenu-generic-expression} is +case-sensitive: @code{t}, the default, means matching should ignore +case. + +Setting this variable makes it buffer-local in the current buffer. +@end defvar + +@defvar imenu-syntax-alist +This variable is an alist of syntax table modifiers to use while +processing @code{imenu-generic-expression}, to override the syntax table +of the current buffer. Each element should have this form: + +@example +(@var{characters} . @var{syntax-description}) +@end example + +The @sc{car}, @var{characters}, can be either a character or a string. +The element says to give that character or characters the syntax +specified by @var{syntax-description}, which is passed to +@code{modify-syntax-entry} (@pxref{Syntax Table Functions}). + +This feature is typically used to give word syntax to characters which +normally have symbol syntax, and thus to simplify +@code{imenu-generic-expression} and speed up matching. +For example, Fortran mode uses it this way: + +@example +(setq imenu-syntax-alist '(("_$" . "w"))) +@end example + +The @code{imenu-generic-expression} regular expressions can then use +@samp{\\sw+} instead of @samp{\\(\\sw\\|\\s_\\)+}. Note that this +technique may be inconvenient when the mode needs to limit the initial +character of a name to a smaller set of characters than are allowed in +the rest of a name. + +Setting this variable makes it buffer-local in the current buffer. +@end defvar + + Another way to customize Imenu for a major mode is to set the +variables @code{imenu-prev-index-position-function} and +@code{imenu-extract-index-name-function}: + +@defvar imenu-prev-index-position-function +If this variable is non-@code{nil}, its value should be a function that +finds the next ``definition'' to put in the buffer index, scanning +backward in the buffer from point. It should return @code{nil} if it +doesn't find another ``definition'' before point. Otherwise it should +leave point at the place it finds a ``definition'' and return any +non-@code{nil} value. + +Setting this variable makes it buffer-local in the current buffer. +@end defvar + +@defvar imenu-extract-index-name-function +If this variable is non-@code{nil}, its value should be a function to +return the name for a definition, assuming point is in that definition +as the @code{imenu-prev-index-position-function} function would leave +it. + +Setting this variable makes it buffer-local in the current buffer. +@end defvar + + The last way to customize Imenu for a major mode is to set the +variable @code{imenu-create-index-function}: + +@defvar imenu-create-index-function +This variable specifies the function to use for creating a buffer +index. The function should take no arguments, and return an index +alist for the current buffer. It is called within +@code{save-excursion}, so where it leaves point makes no difference. + +The index alist can have three types of elements. Simple elements +look like this: + +@example +(@var{index-name} . @var{index-position}) +@end example + +Selecting a simple element has the effect of moving to position +@var{index-position} in the buffer. Special elements look like this: + +@example +(@var{index-name} @var{index-position} @var{function} @var{arguments}@dots{}) +@end example + +Selecting a special element performs: + +@example +(funcall @var{function} + @var{index-name} @var{index-position} @var{arguments}@dots{}) +@end example + +A nested sub-alist element looks like this: + +@example +(@var{menu-title} @var{sub-alist}) +@end example + +It creates the submenu @var{menu-title} specified by @var{sub-alist}. + +The default value of @code{imenu-create-index-function} is +@code{imenu-default-create-index-function}. This function calls the +value of @code{imenu-prev-index-position-function} and the value of +@code{imenu-extract-index-name-function} to produce the index alist. +However, if either of these two variables is @code{nil}, the default +function uses @code{imenu-generic-expression} instead. + +Setting this variable makes it buffer-local in the current buffer. +@end defvar + +@node Font Lock Mode +@section Font Lock Mode +@cindex Font Lock mode + + @dfn{Font Lock mode} is a feature that automatically attaches +@code{face} properties to certain parts of the buffer based on their +syntactic role. How it parses the buffer depends on the major mode; +most major modes define syntactic criteria for which faces to use in +which contexts. This section explains how to customize Font Lock for a +particular major mode. + + Font Lock mode finds text to highlight in two ways: through +syntactic parsing based on the syntax table, and through searching +(usually for regular expressions). Syntactic fontification happens +first; it finds comments and string constants and highlights them. +Search-based fontification happens second. + +@menu +* Font Lock Basics:: Overview of customizing Font Lock. +* Search-based Fontification:: Fontification based on regexps. +* Customizing Keywords:: Customizing search-based fontification. +* Other Font Lock Variables:: Additional customization facilities. +* Levels of Font Lock:: Each mode can define alternative levels + so that the user can select more or less. +* Precalculated Fontification:: How Lisp programs that produce the buffer + contents can also specify how to fontify it. +* Faces for Font Lock:: Special faces specifically for Font Lock. +* Syntactic Font Lock:: Fontification based on syntax tables. +* Setting Syntax Properties:: Defining character syntax based on context + using the Font Lock mechanism. +* Multiline Font Lock:: How to coerce Font Lock into properly + highlighting multiline constructs. +@end menu + +@node Font Lock Basics +@subsection Font Lock Basics + + There are several variables that control how Font Lock mode highlights +text. But major modes should not set any of these variables directly. +Instead, they should set @code{font-lock-defaults} as a buffer-local +variable. The value assigned to this variable is used, if and when Font +Lock mode is enabled, to set all the other variables. + +@defvar font-lock-defaults +This variable is set by major modes, as a buffer-local variable, to +specify how to fontify text in that mode. It automatically becomes +buffer-local when you set it. If its value is @code{nil}, Font-Lock +mode does no highlighting, and you can use the @samp{Faces} menu +(under @samp{Edit} and then @samp{Text Properties} in the menu bar) to +assign faces explicitly to text in the buffer. + +If non-@code{nil}, the value should look like this: + +@example +(@var{keywords} [@var{keywords-only} [@var{case-fold} + [@var{syntax-alist} [@var{syntax-begin} @var{other-vars}@dots{}]]]]) +@end example + +The first element, @var{keywords}, indirectly specifies the value of +@code{font-lock-keywords} which directs search-based fontification. +It can be a symbol, a variable or a function whose value is the list +to use for @code{font-lock-keywords}. It can also be a list of +several such symbols, one for each possible level of fontification. +The first symbol specifies how to do level 1 fontification, the second +symbol how to do level 2, and so on. @xref{Levels of Font Lock}. + +The second element, @var{keywords-only}, specifies the value of the +variable @code{font-lock-keywords-only}. If this is omitted or +@code{nil}, syntactic fontification (of strings and comments) is also +performed. If this is non-@code{nil}, such fontification is not +performed. @xref{Syntactic Font Lock}. + +The third element, @var{case-fold}, specifies the value of +@code{font-lock-keywords-case-fold-search}. If it is non-@code{nil}, +Font Lock mode ignores case when searching as directed by +@code{font-lock-keywords}. + +If the fourth element, @var{syntax-alist}, is non-@code{nil}, it +should be a list of cons cells of the form @code{(@var{char-or-string} +. @var{string})}. These are used to set up a syntax table for +syntactic fontification (@pxref{Syntax Table Functions}). The +resulting syntax table is stored in @code{font-lock-syntax-table}. + +The fifth element, @var{syntax-begin}, specifies the value of +@code{font-lock-beginning-of-syntax-function}. We recommend setting +this variable to @code{nil} and using @code{syntax-begin-function} +instead. + +All the remaining elements (if any) are collectively called +@var{other-vars}. Each of these elements should have the form +@code{(@var{variable} . @var{value})}---which means, make +@var{variable} buffer-local and then set it to @var{value}. You can +use these @var{other-vars} to set other variables that affect +fontification, aside from those you can control with the first five +elements. @xref{Other Font Lock Variables}. +@end defvar + + If your mode fontifies text explicitly by adding +@code{font-lock-face} properties, it can specify @code{(nil t)} for +@code{font-lock-defaults} to turn off all automatic fontification. +However, this is not required; it is possible to fontify some things +using @code{font-lock-face} properties and set up automatic +fontification for other parts of the text. + +@node Search-based Fontification +@subsection Search-based Fontification + + The most important variable for customizing Font Lock mode is +@code{font-lock-keywords}. It specifies the search criteria for +search-based fontification. You should specify the value of this +variable with @var{keywords} in @code{font-lock-defaults}. + +@defvar font-lock-keywords +This variable's value is a list of the keywords to highlight. Be +careful when composing regular expressions for this list; a poorly +written pattern can dramatically slow things down! +@end defvar + + Each element of @code{font-lock-keywords} specifies how to find +certain cases of text, and how to highlight those cases. Font Lock mode +processes the elements of @code{font-lock-keywords} one by one, and for +each element, it finds and handles all matches. Ordinarily, once +part of the text has been fontified already, this cannot be overridden +by a subsequent match in the same text; but you can specify different +behavior using the @var{override} element of a @var{subexp-highlighter}. + + Each element of @code{font-lock-keywords} should have one of these +forms: + +@table @code +@item @var{regexp} +Highlight all matches for @var{regexp} using +@code{font-lock-keyword-face}. For example, + +@example +;; @r{Highlight occurrences of the word @samp{foo}} +;; @r{using @code{font-lock-keyword-face}.} +"\\<foo\\>" +@end example + +The function @code{regexp-opt} (@pxref{Regexp Functions}) is useful +for calculating optimal regular expressions to match a number of +different keywords. + +@item @var{function} +Find text by calling @var{function}, and highlight the matches +it finds using @code{font-lock-keyword-face}. + +When @var{function} is called, it receives one argument, the limit of +the search; it should begin searching at point, and not search beyond the +limit. It should return non-@code{nil} if it succeeds, and set the +match data to describe the match that was found. Returning @code{nil} +indicates failure of the search. + +Fontification will call @var{function} repeatedly with the same limit, +and with point where the previous invocation left it, until +@var{function} fails. On failure, @var{function} need not reset point +in any particular way. + +@item (@var{matcher} . @var{subexp}) +In this kind of element, @var{matcher} is either a regular +expression or a function, as described above. The @sc{cdr}, +@var{subexp}, specifies which subexpression of @var{matcher} should be +highlighted (instead of the entire text that @var{matcher} matched). + +@example +;; @r{Highlight the @samp{bar} in each occurrence of @samp{fubar},} +;; @r{using @code{font-lock-keyword-face}.} +("fu\\(bar\\)" . 1) +@end example + +If you use @code{regexp-opt} to produce the regular expression +@var{matcher}, you can use @code{regexp-opt-depth} (@pxref{Regexp +Functions}) to calculate the value for @var{subexp}. + +@item (@var{matcher} . @var{facespec}) +In this kind of element, @var{facespec} is an expression whose value +specifies the face to use for highlighting. In the simplest case, +@var{facespec} is a Lisp variable (a symbol) whose value is a face +name. + +@example +;; @r{Highlight occurrences of @samp{fubar},} +;; @r{using the face which is the value of @code{fubar-face}.} +("fubar" . fubar-face) +@end example + +However, @var{facespec} can also evaluate to a list of this form: + +@example +(face @var{face} @var{prop1} @var{val1} @var{prop2} @var{val2}@dots{}) +@end example + +@noindent +to specify the face @var{face} and various additional text properties +to put on the text that matches. If you do this, be sure to add the +other text property names that you set in this way to the value of +@code{font-lock-extra-managed-props} so that the properties will also +be cleared out when they are no longer appropriate. Alternatively, +you can set the variable @code{font-lock-unfontify-region-function} to +a function that clears these properties. @xref{Other Font Lock +Variables}. + +@item (@var{matcher} . @var{subexp-highlighter}) +In this kind of element, @var{subexp-highlighter} is a list +which specifies how to highlight matches found by @var{matcher}. +It has the form: + +@example +(@var{subexp} @var{facespec} [[@var{override} [@var{laxmatch}]]) +@end example + +The @sc{car}, @var{subexp}, is an integer specifying which subexpression +of the match to fontify (0 means the entire matching text). The second +subelement, @var{facespec}, is an expression whose value specifies the +face, as described above. + +The last two values in @var{subexp-highlighter}, @var{override} and +@var{laxmatch}, are optional flags. If @var{override} is @code{t}, +this element can override existing fontification made by previous +elements of @code{font-lock-keywords}. If it is @code{keep}, then +each character is fontified if it has not been fontified already by +some other element. If it is @code{prepend}, the face specified by +@var{facespec} is added to the beginning of the @code{font-lock-face} +property. If it is @code{append}, the face is added to the end of the +@code{font-lock-face} property. + +If @var{laxmatch} is non-@code{nil}, it means there should be no error +if there is no subexpression numbered @var{subexp} in @var{matcher}. +Obviously, fontification of the subexpression numbered @var{subexp} will +not occur. However, fontification of other subexpressions (and other +regexps) will continue. If @var{laxmatch} is @code{nil}, and the +specified subexpression is missing, then an error is signaled which +terminates search-based fontification. + +Here are some examples of elements of this kind, and what they do: + +@smallexample +;; @r{Highlight occurrences of either @samp{foo} or @samp{bar}, using} +;; @r{@code{foo-bar-face}, even if they have already been highlighted.} +;; @r{@code{foo-bar-face} should be a variable whose value is a face.} +("foo\\|bar" 0 foo-bar-face t) + +;; @r{Highlight the first subexpression within each occurrence} +;; @r{that the function @code{fubar-match} finds,} +;; @r{using the face which is the value of @code{fubar-face}.} +(fubar-match 1 fubar-face) +@end smallexample + +@item (@var{matcher} . @var{anchored-highlighter}) +In this kind of element, @var{anchored-highlighter} specifies how to +highlight text that follows a match found by @var{matcher}. So a +match found by @var{matcher} acts as the anchor for further searches +specified by @var{anchored-highlighter}. @var{anchored-highlighter} +is a list of the following form: + +@example +(@var{anchored-matcher} @var{pre-form} @var{post-form} + @var{subexp-highlighters}@dots{}) +@end example + +Here, @var{anchored-matcher}, like @var{matcher}, is either a regular +expression or a function. After a match of @var{matcher} is found, +point is at the end of the match. Now, Font Lock evaluates the form +@var{pre-form}. Then it searches for matches of +@var{anchored-matcher} and uses @var{subexp-highlighters} to highlight +these. A @var{subexp-highlighter} is as described above. Finally, +Font Lock evaluates @var{post-form}. + +The forms @var{pre-form} and @var{post-form} can be used to initialize +before, and cleanup after, @var{anchored-matcher} is used. Typically, +@var{pre-form} is used to move point to some position relative to the +match of @var{matcher}, before starting with @var{anchored-matcher}. +@var{post-form} might be used to move back, before resuming with +@var{matcher}. + +After Font Lock evaluates @var{pre-form}, it does not search for +@var{anchored-matcher} beyond the end of the line. However, if +@var{pre-form} returns a buffer position that is greater than the +position of point after @var{pre-form} is evaluated, then the position +returned by @var{pre-form} is used as the limit of the search instead. +It is generally a bad idea to return a position greater than the end +of the line; in other words, the @var{anchored-matcher} search should +not span lines. + +For example, + +@smallexample +;; @r{Highlight occurrences of the word @samp{item} following} +;; @r{an occurrence of the word @samp{anchor} (on the same line)} +;; @r{in the value of @code{item-face}.} +("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face)) +@end smallexample + +Here, @var{pre-form} and @var{post-form} are @code{nil}. Therefore +searching for @samp{item} starts at the end of the match of +@samp{anchor}, and searching for subsequent instances of @samp{anchor} +resumes from where searching for @samp{item} concluded. + +@item (@var{matcher} @var{highlighters}@dots{}) +This sort of element specifies several @var{highlighter} lists for a +single @var{matcher}. A @var{highlighter} list can be of the type +@var{subexp-highlighter} or @var{anchored-highlighter} as described +above. + +For example, + +@smallexample +;; @r{Highlight occurrences of the word @samp{anchor} in the value} +;; @r{of @code{anchor-face}, and subsequent occurrences of the word} +;; @r{@samp{item} (on the same line) in the value of @code{item-face}.} +("\\<anchor\\>" (0 anchor-face) + ("\\<item\\>" nil nil (0 item-face))) +@end smallexample + +@item (eval . @var{form}) +Here @var{form} is an expression to be evaluated the first time +this value of @code{font-lock-keywords} is used in a buffer. +Its value should have one of the forms described in this table. +@end table + +@strong{Warning:} Do not design an element of @code{font-lock-keywords} +to match text which spans lines; this does not work reliably. +For details, see @xref{Multiline Font Lock}. + +You can use @var{case-fold} in @code{font-lock-defaults} to specify +the value of @code{font-lock-keywords-case-fold-search} which says +whether search-based fontification should be case-insensitive. + +@defvar font-lock-keywords-case-fold-search +Non-@code{nil} means that regular expression matching for the sake of +@code{font-lock-keywords} should be case-insensitive. +@end defvar + +@node Customizing Keywords +@subsection Customizing Search-Based Fontification + + You can use @code{font-lock-add-keywords} to add additional +search-based fontification rules to a major mode, and +@code{font-lock-remove-keywords} to removes rules. + +@defun font-lock-add-keywords mode keywords &optional how +This function adds highlighting @var{keywords}, for the current buffer +or for major mode @var{mode}. The argument @var{keywords} should be a +list with the same format as the variable @code{font-lock-keywords}. + +If @var{mode} is a symbol which is a major mode command name, such as +@code{c-mode}, the effect is that enabling Font Lock mode in +@var{mode} will add @var{keywords} to @code{font-lock-keywords}. +Calling with a non-@code{nil} value of @var{mode} is correct only in +your @file{~/.emacs} file. + +If @var{mode} is @code{nil}, this function adds @var{keywords} to +@code{font-lock-keywords} in the current buffer. This way of calling +@code{font-lock-add-keywords} is usually used in mode hook functions. + +By default, @var{keywords} are added at the beginning of +@code{font-lock-keywords}. If the optional argument @var{how} is +@code{set}, they are used to replace the value of +@code{font-lock-keywords}. If @var{how} is any other non-@code{nil} +value, they are added at the end of @code{font-lock-keywords}. + +Some modes provide specialized support you can use in additional +highlighting patterns. See the variables +@code{c-font-lock-extra-types}, @code{c++-font-lock-extra-types}, +and @code{java-font-lock-extra-types}, for example. + +@strong{Warning:} major mode functions must not call +@code{font-lock-add-keywords} under any circumstances, either directly +or indirectly, except through their mode hooks. (Doing so would lead +to incorrect behavior for some minor modes.) They should set up their +rules for search-based fontification by setting +@code{font-lock-keywords}. +@end defun + +@defun font-lock-remove-keywords mode keywords +This function removes @var{keywords} from @code{font-lock-keywords} +for the current buffer or for major mode @var{mode}. As in +@code{font-lock-add-keywords}, @var{mode} should be a major mode +command name or @code{nil}. All the caveats and requirements for +@code{font-lock-add-keywords} apply here too. +@end defun + + For example, this code + +@smallexample +(font-lock-add-keywords 'c-mode + '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend) + ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face))) +@end smallexample + +@noindent +adds two fontification patterns for C mode: one to fontify the word +@samp{FIXME}, even in comments, and another to fontify the words +@samp{and}, @samp{or} and @samp{not} as keywords. + +@noindent +That example affects only C mode proper. To add the same patterns to +C mode @emph{and} all modes derived from it, do this instead: + +@smallexample +(add-hook 'c-mode-hook + (lambda () + (font-lock-add-keywords nil + '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend) + ("\\<\\(and\\|or\\|not\\)\\>" . + font-lock-keyword-face))))) +@end smallexample + +@node Other Font Lock Variables +@subsection Other Font Lock Variables + + This section describes additional variables that a major mode can +set by means of @var{other-vars} in @code{font-lock-defaults} +(@pxref{Font Lock Basics}). + +@defvar font-lock-mark-block-function +If this variable is non-@code{nil}, it should be a function that is +called with no arguments, to choose an enclosing range of text for +refontification for the command @kbd{M-o M-o} +(@code{font-lock-fontify-block}). + +The function should report its choice by placing the region around it. +A good choice is a range of text large enough to give proper results, +but not too large so that refontification becomes slow. Typical values +are @code{mark-defun} for programming modes or @code{mark-paragraph} for +textual modes. +@end defvar + +@defvar font-lock-extra-managed-props +This variable specifies additional properties (other than +@code{font-lock-face}) that are being managed by Font Lock mode. It +is used by @code{font-lock-default-unfontify-region}, which normally +only manages the @code{font-lock-face} property. If you want Font +Lock to manage other properties as well, you must specify them in a +@var{facespec} in @code{font-lock-keywords} as well as add them to +this list. @xref{Search-based Fontification}. +@end defvar + +@defvar font-lock-fontify-buffer-function +Function to use for fontifying the buffer. The default value is +@code{font-lock-default-fontify-buffer}. +@end defvar + +@defvar font-lock-unfontify-buffer-function +Function to use for unfontifying the buffer. This is used when +turning off Font Lock mode. The default value is +@code{font-lock-default-unfontify-buffer}. +@end defvar + +@defvar font-lock-fontify-region-function +Function to use for fontifying a region. It should take two +arguments, the beginning and end of the region, and an optional third +argument @var{verbose}. If @var{verbose} is non-@code{nil}, the +function should print status messages. The default value is +@code{font-lock-default-fontify-region}. +@end defvar + +@defvar font-lock-unfontify-region-function +Function to use for unfontifying a region. It should take two +arguments, the beginning and end of the region. The default value is +@code{font-lock-default-unfontify-region}. +@end defvar + +@ignore +@defvar font-lock-inhibit-thing-lock +List of Font Lock mode related modes that should not be turned on. +Currently, valid mode names are @code{fast-lock-mode}, +@code{jit-lock-mode} and @code{lazy-lock-mode}. +@end defvar +@end ignore + +@node Levels of Font Lock +@subsection Levels of Font Lock + + Many major modes offer three different levels of fontification. You +can define multiple levels by using a list of symbols for @var{keywords} +in @code{font-lock-defaults}. Each symbol specifies one level of +fontification; it is up to the user to choose one of these levels. The +chosen level's symbol value is used to initialize +@code{font-lock-keywords}. + + Here are the conventions for how to define the levels of +fontification: + +@itemize @bullet +@item +Level 1: highlight function declarations, file directives (such as include or +import directives), strings and comments. The idea is speed, so only +the most important and top-level components are fontified. + +@item +Level 2: in addition to level 1, highlight all language keywords, +including type names that act like keywords, as well as named constant +values. The idea is that all keywords (either syntactic or semantic) +should be fontified appropriately. + +@item +Level 3: in addition to level 2, highlight the symbols being defined in +function and variable declarations, and all builtin function names, +wherever they appear. +@end itemize + +@node Precalculated Fontification +@subsection Precalculated Fontification + + In addition to using @code{font-lock-defaults} for search-based +fontification, you may use the special character property +@code{font-lock-face} (@pxref{Special Properties}). This property +acts just like the explicit @code{face} property, but its activation +is toggled when the user calls @kbd{M-x font-lock-mode}. Using +@code{font-lock-face} is especially convenient for special modes +which construct their text programmatically, such as +@code{list-buffers} and @code{occur}. + +If your mode does not use any of the other machinery of Font Lock +(i.e. it only uses the @code{font-lock-face} property), it should not +set the variable @code{font-lock-defaults}. + +@node Faces for Font Lock +@subsection Faces for Font Lock +@cindex faces for font lock +@cindex font lock faces + + You can make Font Lock mode use any face, but several faces are +defined specifically for Font Lock mode. Each of these symbols is both +a face name, and a variable whose default value is the symbol itself. +Thus, the default value of @code{font-lock-comment-face} is +@code{font-lock-comment-face}. This means you can write +@code{font-lock-comment-face} in a context such as +@code{font-lock-keywords} where a face-name-valued expression is used. + +@table @code +@item font-lock-comment-face +@vindex font-lock-comment-face +Used (typically) for comments. + +@item font-lock-comment-delimiter-face +@vindex font-lock-comment-delimiter-face +Used (typically) for comments delimiters. + +@item font-lock-doc-face +@vindex font-lock-doc-face +Used (typically) for documentation strings in the code. + +@item font-lock-string-face +@vindex font-lock-string-face +Used (typically) for string constants. + +@item font-lock-keyword-face +@vindex font-lock-keyword-face +Used (typically) for keywords---names that have special syntactic +significance, like @code{for} and @code{if} in C. + +@item font-lock-builtin-face +@vindex font-lock-builtin-face +Used (typically) for built-in function names. + +@item font-lock-function-name-face +@vindex font-lock-function-name-face +Used (typically) for the name of a function being defined or declared, +in a function definition or declaration. + +@item font-lock-variable-name-face +@vindex font-lock-variable-name-face +Used (typically) for the name of a variable being defined or declared, +in a variable definition or declaration. + +@item font-lock-type-face +@vindex font-lock-type-face +Used (typically) for names of user-defined data types, +where they are defined and where they are used. + +@item font-lock-constant-face +@vindex font-lock-constant-face +Used (typically) for constant names. + +@item font-lock-preprocessor-face +@vindex font-lock-preprocessor-face +Used (typically) for preprocessor commands. + +@item font-lock-negation-char-face +@vindex font-lock-negation-char-face +Used (typically) for easily-overlooked negation characters. + +@item font-lock-warning-face +@vindex font-lock-warning-face +Used (typically) for constructs that are peculiar, or that greatly +change the meaning of other text. For example, this is used for +@samp{;;;###autoload} cookies in Emacs Lisp, and for @code{#error} +directives in C. +@end table + +@node Syntactic Font Lock +@subsection Syntactic Font Lock +@cindex syntactic font lock + +Syntactic fontification uses the syntax table to find comments and +string constants (@pxref{Syntax Tables}). It highlights them using +@code{font-lock-comment-face} and @code{font-lock-string-face} +(@pxref{Faces for Font Lock}), or whatever +@code{font-lock-syntactic-face-function} chooses. There are several +variables that affect syntactic fontification; you should set them by +means of @code{font-lock-defaults} (@pxref{Font Lock Basics}). + +@defvar font-lock-keywords-only +Non-@code{nil} means Font Lock should not do syntactic fontification; +it should only fontify based on @code{font-lock-keywords}. The normal +way for a mode to set this variable to @code{t} is with +@var{keywords-only} in @code{font-lock-defaults}. +@end defvar + +@defvar font-lock-syntax-table +This variable holds the syntax table to use for fontification of +comments and strings. Specify it using @var{syntax-alist} in +@code{font-lock-defaults}. If this is @code{nil}, fontification uses +the buffer's syntax table. +@end defvar + +@defvar font-lock-beginning-of-syntax-function +If this variable is non-@code{nil}, it should be a function to move +point back to a position that is syntactically at ``top level'' and +outside of strings or comments. Font Lock uses this when necessary +to get the right results for syntactic fontification. + +This function is called with no arguments. It should leave point at +the beginning of any enclosing syntactic block. Typical values are +@code{beginning-of-line} (used when the start of the line is known to +be outside a syntactic block), or @code{beginning-of-defun} for +programming modes, or @code{backward-paragraph} for textual modes. + +If the value is @code{nil}, Font Lock uses +@code{syntax-begin-function} to move back outside of any comment, +string, or sexp. This variable is semi-obsolete; we recommend setting +@code{syntax-begin-function} instead. + +Specify this variable using @var{syntax-begin} in +@code{font-lock-defaults}. +@end defvar + +@defvar font-lock-syntactic-face-function +A function to determine which face to use for a given syntactic +element (a string or a comment). The function is called with one +argument, the parse state at point returned by +@code{parse-partial-sexp}, and should return a face. The default +value returns @code{font-lock-comment-face} for comments and +@code{font-lock-string-face} for strings. + +This can be used to highlighting different kinds of strings or +comments differently. It is also sometimes abused together with +@code{font-lock-syntactic-keywords} to highlight constructs that span +multiple lines, but this is too esoteric to document here. + +Specify this variable using @var{other-vars} in +@code{font-lock-defaults}. +@end defvar + +@node Setting Syntax Properties +@subsection Setting Syntax Properties + + Font Lock mode can be used to update @code{syntax-table} properties +automatically (@pxref{Syntax Properties}). This is useful in +languages for which a single syntax table by itself is not sufficient. + +@defvar font-lock-syntactic-keywords +This variable enables and controls updating @code{syntax-table} +properties by Font Lock. Its value should be a list of elements of +this form: + +@example +(@var{matcher} @var{subexp} @var{syntax} @var{override} @var{laxmatch}) +@end example + +The parts of this element have the same meanings as in the corresponding +sort of element of @code{font-lock-keywords}, + +@example +(@var{matcher} @var{subexp} @var{facespec} @var{override} @var{laxmatch}) +@end example + +However, instead of specifying the value @var{facespec} to use for the +@code{face} property, it specifies the value @var{syntax} to use for +the @code{syntax-table} property. Here, @var{syntax} can be a string +(as taken by @code{modify-syntax-entry}), a syntax table, a cons cell +(as returned by @code{string-to-syntax}), or an expression whose value +is one of those two types. @var{override} cannot be @code{prepend} or +@code{append}. + +For example, an element of the form: + +@example +("\\$\\(#\\)" 1 ".") +@end example + +highlights syntactically a hash character when following a dollar +character, with a SYNTAX of @code{"."} (meaning punctuation syntax). +Assuming that the buffer syntax table specifies hash characters to +have comment start syntax, the element will only highlight hash +characters that do not follow dollar characters as comments +syntactically. + +An element of the form: + +@example + ("\\('\\).\\('\\)" + (1 "\"") + (2 "\"")) +@end example + +highlights syntactically both single quotes which surround a single +character, with a SYNTAX of @code{"\""} (meaning string quote syntax). +Assuming that the buffer syntax table does not specify single quotes +to have quote syntax, the element will only highlight single quotes of +the form @samp{'@var{c}'} as strings syntactically. Other forms, such +as @samp{foo'bar} or @samp{'fubar'}, will not be highlighted as +strings. + +Major modes normally set this variable with @var{other-vars} in +@code{font-lock-defaults}. +@end defvar + +@node Multiline Font Lock +@subsection Multiline Font Lock Constructs +@cindex multiline font lock + + Normally, elements of @code{font-lock-keywords} should not match +across multiple lines; that doesn't work reliably, because Font Lock +usually scans just part of the buffer, and it can miss a multi-line +construct that crosses the line boundary where the scan starts. (The +scan normally starts at the beginning of a line.) + + Making elements that match multiline constructs work properly has +two aspects: correct @emph{identification} and correct +@emph{rehighlighting}. The first means that Font Lock finds all +multiline constructs. The second means that Font Lock will correctly +rehighlight all the relevant text when a multiline construct is +changed---for example, if some of the text that was previously part of +a multiline construct ceases to be part of it. The two aspects are +closely related, and often getting one of them to work will appear to +make the other also work. However, for reliable results you must +attend explicitly to both aspects. + + There are three ways to ensure correct identification of multiline +constructs: + +@itemize +@item +Add a function to @code{font-lock-extend-region-functions} that does +the @emph{identification} and extends the scan so that the scanned +text never starts or ends in the middle of a multiline construct. +@item +Use the @code{font-lock-fontify-region-function} hook similarly to +extend the scan so that the scanned text never starts or ends in the +middle of a multiline construct. +@item +Somehow identify the multiline construct right when it gets inserted +into the buffer (or at any point after that but before font-lock +tries to highlight it), and mark it with a @code{font-lock-multiline} +which will instruct font-lock not to start or end the scan in the +middle of the construct. +@end itemize + + There are three ways to do rehighlighting of multiline constructs: + +@itemize +@item +Place a @code{font-lock-multiline} property on the construct. This +will rehighlight the whole construct if any part of it is changed. In +some cases you can do this automatically by setting the +@code{font-lock-multiline} variable, which see. +@item +Make sure @code{jit-lock-contextually} is set and rely on it doing its +job. This will only rehighlight the part of the construct that +follows the actual change, and will do it after a short delay. +This only works if the highlighting of the various parts of your +multiline construct never depends on text in subsequent lines. +Since @code{jit-lock-contextually} is activated by default, this can +be an attractive solution. +@item +Place a @code{jit-lock-defer-multiline} property on the construct. +This works only if @code{jit-lock-contextually} is used, and with the +same delay before rehighlighting, but like @code{font-lock-multiline}, +it also handles the case where highlighting depends on +subsequent lines. +@end itemize + +@menu +* Font Lock Multiline:: Marking multiline chunks with a text property +* Region to Fontify:: Controlling which region gets refontified + after a buffer change. +@end menu + +@node Font Lock Multiline +@subsubsection Font Lock Multiline + + One way to ensure reliable rehighlighting of multiline Font Lock +constructs is to put on them the text property @code{font-lock-multiline}. +It should be present and non-@code{nil} for text that is part of a +multiline construct. + + When Font Lock is about to highlight a range of text, it first +extends the boundaries of the range as necessary so that they do not +fall within text marked with the @code{font-lock-multiline} property. +Then it removes any @code{font-lock-multiline} properties from the +range, and highlights it. The highlighting specification (mostly +@code{font-lock-keywords}) must reinstall this property each time, +whenever it is appropriate. + + @strong{Warning:} don't use the @code{font-lock-multiline} property +on large ranges of text, because that will make rehighlighting slow. + +@defvar font-lock-multiline +If the @code{font-lock-multiline} variable is set to @code{t}, Font +Lock will try to add the @code{font-lock-multiline} property +automatically on multiline constructs. This is not a universal +solution, however, since it slows down Font Lock somewhat. It can +miss some multiline constructs, or make the property larger or smaller +than necessary. + +For elements whose @var{matcher} is a function, the function should +ensure that submatch 0 covers the whole relevant multiline construct, +even if only a small subpart will be highlighted. It is often just as +easy to add the @code{font-lock-multiline} property by hand. +@end defvar + + The @code{font-lock-multiline} property is meant to ensure proper +refontification; it does not automatically identify new multiline +constructs. Identifying the requires that Font-Lock operate on large +enough chunks at a time. This will happen by accident on many cases, +which may give the impression that multiline constructs magically work. +If you set the @code{font-lock-multiline} variable non-@code{nil}, +this impression will be even stronger, since the highlighting of those +constructs which are found will be properly updated from then on. +But that does not work reliably. + + To find multiline constructs reliably, you must either manually +place the @code{font-lock-multiline} property on the text before +Font-Lock looks at it, or use +@code{font-lock-fontify-region-function}. + +@node Region to Fontify +@subsubsection Region to Fontify after a Buffer Change + + When a buffer is changed, the region that Font Lock refontifies is +by default the smallest sequence of whole lines that spans the change. +While this works well most of the time, sometimes it doesn't---for +example, when a change alters the syntactic meaning of text on an +earlier line. + + You can enlarge (or even reduce) the region to fontify by setting +one the following variables: + +@defvar font-lock-extend-after-change-region-function +This buffer-local variable is either @code{nil} or a function for +Font-Lock to call to determine the region to scan and fontify. + +The function is given three parameters, the standard @var{beg}, +@var{end}, and @var{old-len} from after-change-functions +(@pxref{Change Hooks}). It should return either a cons of the +beginning and end buffer positions (in that order) of the region to +fontify, or @code{nil} (which means choose the region in the standard +way). This function needs to preserve point, the match-data, and the +current restriction. The region it returns may start or end in the +middle of a line. + +Since this function is called after every buffer change, it should be +reasonably fast. +@end defvar + +@node Desktop Save Mode +@section Desktop Save Mode +@cindex desktop save mode + +@dfn{Desktop Save Mode} is a feature to save the state of Emacs from +one session to another. The user-level commands for using Desktop +Save Mode are described in the GNU Emacs Manual (@pxref{Saving Emacs +Sessions,,, emacs, the GNU Emacs Manual}). Modes whose buffers visit +a file, don't have to do anything to use this feature. + +For buffers not visiting a file to have their state saved, the major +mode must bind the buffer local variable @code{desktop-save-buffer} to +a non-@code{nil} value. + +@defvar desktop-save-buffer +If this buffer-local variable is non-@code{nil}, the buffer will have +its state saved in the desktop file at desktop save. If the value is +a function, it is called at desktop save with argument +@var{desktop-dirname}, and its value is saved in the desktop file along +with the state of the buffer for which it was called. When file names +are returned as part of the auxiliary information, they should be +formatted using the call + +@example +(desktop-file-name @var{file-name} @var{desktop-dirname}) +@end example + +@end defvar + +For buffers not visiting a file to be restored, the major mode must +define a function to do the job, and that function must be listed in +the alist @code{desktop-buffer-mode-handlers}. + +@defvar desktop-buffer-mode-handlers +Alist with elements + +@example +(@var{major-mode} . @var{restore-buffer-function}) +@end example + +The function @var{restore-buffer-function} will be called with +argument list + +@example +(@var{buffer-file-name} @var{buffer-name} @var{desktop-buffer-misc}) +@end example + +and it should return the restored buffer. +Here @var{desktop-buffer-misc} is the value returned by the function +optionally bound to @code{desktop-save-buffer}. +@end defvar + +@ignore + arch-tag: 4c7bff41-36e6-4da6-9e7f-9b9289e27c8e +@end ignore diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi new file mode 100644 index 00000000000..a8f45e9dd20 --- /dev/null +++ b/doc/lispref/nonascii.texi @@ -0,0 +1,1504 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, +@c 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/characters +@node Non-ASCII Characters, Searching and Matching, Text, Top +@chapter Non-@acronym{ASCII} Characters +@cindex multibyte characters +@cindex characters, multi-byte +@cindex non-@acronym{ASCII} characters + + This chapter covers the special issues relating to non-@acronym{ASCII} +characters and how they are stored in strings and buffers. + +@menu +* Text Representations:: Unibyte and multibyte representations +* Converting Representations:: Converting unibyte to multibyte and vice versa. +* Selecting a Representation:: Treating a byte sequence as unibyte or multi. +* Character Codes:: How unibyte and multibyte relate to + codes of individual characters. +* Character Sets:: The space of possible character codes + is divided into various character sets. +* Chars and Bytes:: More information about multibyte encodings. +* Splitting Characters:: Converting a character to its byte sequence. +* Scanning Charsets:: Which character sets are used in a buffer? +* Translation of Characters:: Translation tables are used for conversion. +* Coding Systems:: Coding systems are conversions for saving files. +* Input Methods:: Input methods allow users to enter various + non-ASCII characters without special keyboards. +* Locales:: Interacting with the POSIX locale. +@end menu + +@node Text Representations +@section Text Representations +@cindex text representations + + Emacs has two @dfn{text representations}---two ways to represent text +in a string or buffer. These are called @dfn{unibyte} and +@dfn{multibyte}. Each string, and each buffer, uses one of these two +representations. For most purposes, you can ignore the issue of +representations, because Emacs converts text between them as +appropriate. Occasionally in Lisp programming you will need to pay +attention to the difference. + +@cindex unibyte text + In unibyte representation, each character occupies one byte and +therefore the possible character codes range from 0 to 255. Codes 0 +through 127 are @acronym{ASCII} characters; the codes from 128 through 255 +are used for one non-@acronym{ASCII} character set (you can choose which +character set by setting the variable @code{nonascii-insert-offset}). + +@cindex leading code +@cindex multibyte text +@cindex trailing codes + In multibyte representation, a character may occupy more than one +byte, and as a result, the full range of Emacs character codes can be +stored. The first byte of a multibyte character is always in the range +128 through 159 (octal 0200 through 0237). These values are called +@dfn{leading codes}. The second and subsequent bytes of a multibyte +character are always in the range 160 through 255 (octal 0240 through +0377); these values are @dfn{trailing codes}. + + Some sequences of bytes are not valid in multibyte text: for example, +a single isolated byte in the range 128 through 159 is not allowed. But +character codes 128 through 159 can appear in multibyte text, +represented as two-byte sequences. All the character codes 128 through +255 are possible (though slightly abnormal) in multibyte text; they +appear in multibyte buffers and strings when you do explicit encoding +and decoding (@pxref{Explicit Encoding}). + + In a buffer, the buffer-local value of the variable +@code{enable-multibyte-characters} specifies the representation used. +The representation for a string is determined and recorded in the string +when the string is constructed. + +@defvar enable-multibyte-characters +This variable specifies the current buffer's text representation. +If it is non-@code{nil}, the buffer contains multibyte text; otherwise, +it contains unibyte text. + +You cannot set this variable directly; instead, use the function +@code{set-buffer-multibyte} to change a buffer's representation. +@end defvar + +@defvar default-enable-multibyte-characters +This variable's value is entirely equivalent to @code{(default-value +'enable-multibyte-characters)}, and setting this variable changes that +default value. Setting the local binding of +@code{enable-multibyte-characters} in a specific buffer is not allowed, +but changing the default value is supported, and it is a reasonable +thing to do, because it has no effect on existing buffers. + +The @samp{--unibyte} command line option does its job by setting the +default value to @code{nil} early in startup. +@end defvar + +@defun position-bytes position +Return the byte-position corresponding to buffer position +@var{position} in the current buffer. This is 1 at the start of the +buffer, and counts upward in bytes. If @var{position} is out of +range, the value is @code{nil}. +@end defun + +@defun byte-to-position byte-position +Return the buffer position corresponding to byte-position +@var{byte-position} in the current buffer. If @var{byte-position} is +out of range, the value is @code{nil}. +@end defun + +@defun multibyte-string-p string +Return @code{t} if @var{string} is a multibyte string. +@end defun + +@defun string-bytes string +@cindex string, number of bytes +This function returns the number of bytes in @var{string}. +If @var{string} is a multibyte string, this can be greater than +@code{(length @var{string})}. +@end defun + +@node Converting Representations +@section Converting Text Representations + + Emacs can convert unibyte text to multibyte; it can also convert +multibyte text to unibyte, though this conversion loses information. In +general these conversions happen when inserting text into a buffer, or +when putting text from several strings together in one string. You can +also explicitly convert a string's contents to either representation. + + Emacs chooses the representation for a string based on the text that +it is constructed from. The general rule is to convert unibyte text to +multibyte text when combining it with other multibyte text, because the +multibyte representation is more general and can hold whatever +characters the unibyte text has. + + When inserting text into a buffer, Emacs converts the text to the +buffer's representation, as specified by +@code{enable-multibyte-characters} in that buffer. In particular, when +you insert multibyte text into a unibyte buffer, Emacs converts the text +to unibyte, even though this conversion cannot in general preserve all +the characters that might be in the multibyte text. The other natural +alternative, to convert the buffer contents to multibyte, is not +acceptable because the buffer's representation is a choice made by the +user that cannot be overridden automatically. + + Converting unibyte text to multibyte text leaves @acronym{ASCII} characters +unchanged, and likewise character codes 128 through 159. It converts +the non-@acronym{ASCII} codes 160 through 255 by adding the value +@code{nonascii-insert-offset} to each character code. By setting this +variable, you specify which character set the unibyte characters +correspond to (@pxref{Character Sets}). For example, if +@code{nonascii-insert-offset} is 2048, which is @code{(- (make-char +'latin-iso8859-1) 128)}, then the unibyte non-@acronym{ASCII} characters +correspond to Latin 1. If it is 2688, which is @code{(- (make-char +'greek-iso8859-7) 128)}, then they correspond to Greek letters. + + Converting multibyte text to unibyte is simpler: it discards all but +the low 8 bits of each character code. If @code{nonascii-insert-offset} +has a reasonable value, corresponding to the beginning of some character +set, this conversion is the inverse of the other: converting unibyte +text to multibyte and back to unibyte reproduces the original unibyte +text. + +@defvar nonascii-insert-offset +This variable specifies the amount to add to a non-@acronym{ASCII} character +when converting unibyte text to multibyte. It also applies when +@code{self-insert-command} inserts a character in the unibyte +non-@acronym{ASCII} range, 128 through 255. However, the functions +@code{insert} and @code{insert-char} do not perform this conversion. + +The right value to use to select character set @var{cs} is @code{(- +(make-char @var{cs}) 128)}. If the value of +@code{nonascii-insert-offset} is zero, then conversion actually uses the +value for the Latin 1 character set, rather than zero. +@end defvar + +@defvar nonascii-translation-table +This variable provides a more general alternative to +@code{nonascii-insert-offset}. You can use it to specify independently +how to translate each code in the range of 128 through 255 into a +multibyte character. The value should be a char-table, or @code{nil}. +If this is non-@code{nil}, it overrides @code{nonascii-insert-offset}. +@end defvar + +The next three functions either return the argument @var{string}, or a +newly created string with no text properties. + +@defun string-make-unibyte string +This function converts the text of @var{string} to unibyte +representation, if it isn't already, and returns the result. If +@var{string} is a unibyte string, it is returned unchanged. Multibyte +character codes are converted to unibyte according to +@code{nonascii-translation-table} or, if that is @code{nil}, using +@code{nonascii-insert-offset}. If the lookup in the translation table +fails, this function takes just the low 8 bits of each character. +@end defun + +@defun string-make-multibyte string +This function converts the text of @var{string} to multibyte +representation, if it isn't already, and returns the result. If +@var{string} is a multibyte string or consists entirely of +@acronym{ASCII} characters, it is returned unchanged. In particular, +if @var{string} is unibyte and entirely @acronym{ASCII}, the returned +string is unibyte. (When the characters are all @acronym{ASCII}, +Emacs primitives will treat the string the same way whether it is +unibyte or multibyte.) If @var{string} is unibyte and contains +non-@acronym{ASCII} characters, the function +@code{unibyte-char-to-multibyte} is used to convert each unibyte +character to a multibyte character. +@end defun + +@defun string-to-multibyte string +This function returns a multibyte string containing the same sequence +of character codes as @var{string}. Unlike +@code{string-make-multibyte}, this function unconditionally returns a +multibyte string. If @var{string} is a multibyte string, it is +returned unchanged. +@end defun + +@defun multibyte-char-to-unibyte char +This convert the multibyte character @var{char} to a unibyte +character, based on @code{nonascii-translation-table} and +@code{nonascii-insert-offset}. +@end defun + +@defun unibyte-char-to-multibyte char +This convert the unibyte character @var{char} to a multibyte +character, based on @code{nonascii-translation-table} and +@code{nonascii-insert-offset}. +@end defun + +@node Selecting a Representation +@section Selecting a Representation + + Sometimes it is useful to examine an existing buffer or string as +multibyte when it was unibyte, or vice versa. + +@defun set-buffer-multibyte multibyte +Set the representation type of the current buffer. If @var{multibyte} +is non-@code{nil}, the buffer becomes multibyte. If @var{multibyte} +is @code{nil}, the buffer becomes unibyte. + +This function leaves the buffer contents unchanged when viewed as a +sequence of bytes. As a consequence, it can change the contents viewed +as characters; a sequence of two bytes which is treated as one character +in multibyte representation will count as two characters in unibyte +representation. Character codes 128 through 159 are an exception. They +are represented by one byte in a unibyte buffer, but when the buffer is +set to multibyte, they are converted to two-byte sequences, and vice +versa. + +This function sets @code{enable-multibyte-characters} to record which +representation is in use. It also adjusts various data in the buffer +(including overlays, text properties and markers) so that they cover the +same text as they did before. + +You cannot use @code{set-buffer-multibyte} on an indirect buffer, +because indirect buffers always inherit the representation of the +base buffer. +@end defun + +@defun string-as-unibyte string +This function returns a string with the same bytes as @var{string} but +treating each byte as a character. This means that the value may have +more characters than @var{string} has. + +If @var{string} is already a unibyte string, then the value is +@var{string} itself. Otherwise it is a newly created string, with no +text properties. If @var{string} is multibyte, any characters it +contains of charset @code{eight-bit-control} or @code{eight-bit-graphic} +are converted to the corresponding single byte. +@end defun + +@defun string-as-multibyte string +This function returns a string with the same bytes as @var{string} but +treating each multibyte sequence as one character. This means that the +value may have fewer characters than @var{string} has. + +If @var{string} is already a multibyte string, then the value is +@var{string} itself. Otherwise it is a newly created string, with no +text properties. If @var{string} is unibyte and contains any individual +8-bit bytes (i.e.@: not part of a multibyte form), they are converted to +the corresponding multibyte character of charset @code{eight-bit-control} +or @code{eight-bit-graphic}. +@end defun + +@node Character Codes +@section Character Codes +@cindex character codes + + The unibyte and multibyte text representations use different character +codes. The valid character codes for unibyte representation range from +0 to 255---the values that can fit in one byte. The valid character +codes for multibyte representation range from 0 to 524287, but not all +values in that range are valid. The values 128 through 255 are not +entirely proper in multibyte text, but they can occur if you do explicit +encoding and decoding (@pxref{Explicit Encoding}). Some other character +codes cannot occur at all in multibyte text. Only the @acronym{ASCII} codes +0 through 127 are completely legitimate in both representations. + +@defun char-valid-p charcode &optional genericp +This returns @code{t} if @var{charcode} is valid (either for unibyte +text or for multibyte text). + +@example +(char-valid-p 65) + @result{} t +(char-valid-p 256) + @result{} nil +(char-valid-p 2248) + @result{} t +@end example + +If the optional argument @var{genericp} is non-@code{nil}, this +function also returns @code{t} if @var{charcode} is a generic +character (@pxref{Splitting Characters}). +@end defun + +@node Character Sets +@section Character Sets +@cindex character sets + + Emacs classifies characters into various @dfn{character sets}, each of +which has a name which is a symbol. Each character belongs to one and +only one character set. + + In general, there is one character set for each distinct script. For +example, @code{latin-iso8859-1} is one character set, +@code{greek-iso8859-7} is another, and @code{ascii} is another. An +Emacs character set can hold at most 9025 characters; therefore, in some +cases, characters that would logically be grouped together are split +into several character sets. For example, one set of Chinese +characters, generally known as Big 5, is divided into two Emacs +character sets, @code{chinese-big5-1} and @code{chinese-big5-2}. + + @acronym{ASCII} characters are in character set @code{ascii}. The +non-@acronym{ASCII} characters 128 through 159 are in character set +@code{eight-bit-control}, and codes 160 through 255 are in character set +@code{eight-bit-graphic}. + +@defun charsetp object +Returns @code{t} if @var{object} is a symbol that names a character set, +@code{nil} otherwise. +@end defun + +@defvar charset-list +The value is a list of all defined character set names. +@end defvar + +@defun charset-list +This function returns the value of @code{charset-list}. It is only +provided for backward compatibility. +@end defun + +@defun char-charset character +This function returns the name of the character set that @var{character} +belongs to, or the symbol @code{unknown} if @var{character} is not a +valid character. +@end defun + +@defun charset-plist charset +This function returns the charset property list of the character set +@var{charset}. Although @var{charset} is a symbol, this is not the same +as the property list of that symbol. Charset properties are used for +special purposes within Emacs. +@end defun + +@deffn Command list-charset-chars charset +This command displays a list of characters in the character set +@var{charset}. +@end deffn + +@node Chars and Bytes +@section Characters and Bytes +@cindex bytes and characters + +@cindex introduction sequence (of character) +@cindex dimension (of character set) + In multibyte representation, each character occupies one or more +bytes. Each character set has an @dfn{introduction sequence}, which is +normally one or two bytes long. (Exception: the @code{ascii} character +set and the @code{eight-bit-graphic} character set have a zero-length +introduction sequence.) The introduction sequence is the beginning of +the byte sequence for any character in the character set. The rest of +the character's bytes distinguish it from the other characters in the +same character set. Depending on the character set, there are either +one or two distinguishing bytes; the number of such bytes is called the +@dfn{dimension} of the character set. + +@defun charset-dimension charset +This function returns the dimension of @var{charset}; at present, the +dimension is always 1 or 2. +@end defun + +@defun charset-bytes charset +This function returns the number of bytes used to represent a character +in character set @var{charset}. +@end defun + + This is the simplest way to determine the byte length of a character +set's introduction sequence: + +@example +(- (charset-bytes @var{charset}) + (charset-dimension @var{charset})) +@end example + +@node Splitting Characters +@section Splitting Characters +@cindex character as bytes + + The functions in this section convert between characters and the byte +values used to represent them. For most purposes, there is no need to +be concerned with the sequence of bytes used to represent a character, +because Emacs translates automatically when necessary. + +@defun split-char character +Return a list containing the name of the character set of +@var{character}, followed by one or two byte values (integers) which +identify @var{character} within that character set. The number of byte +values is the character set's dimension. + +If @var{character} is invalid as a character code, @code{split-char} +returns a list consisting of the symbol @code{unknown} and @var{character}. + +@example +(split-char 2248) + @result{} (latin-iso8859-1 72) +(split-char 65) + @result{} (ascii 65) +(split-char 128) + @result{} (eight-bit-control 128) +@end example +@end defun + +@cindex generate characters in charsets +@defun make-char charset &optional code1 code2 +This function returns the character in character set @var{charset} whose +position codes are @var{code1} and @var{code2}. This is roughly the +inverse of @code{split-char}. Normally, you should specify either one +or both of @var{code1} and @var{code2} according to the dimension of +@var{charset}. For example, + +@example +(make-char 'latin-iso8859-1 72) + @result{} 2248 +@end example + +Actually, the eighth bit of both @var{code1} and @var{code2} is zeroed +before they are used to index @var{charset}. Thus you may use, for +instance, an ISO 8859 character code rather than subtracting 128, as +is necessary to index the corresponding Emacs charset. +@end defun + +@cindex generic characters + If you call @code{make-char} with no @var{byte-values}, the result is +a @dfn{generic character} which stands for @var{charset}. A generic +character is an integer, but it is @emph{not} valid for insertion in the +buffer as a character. It can be used in @code{char-table-range} to +refer to the whole character set (@pxref{Char-Tables}). +@code{char-valid-p} returns @code{nil} for generic characters. +For example: + +@example +(make-char 'latin-iso8859-1) + @result{} 2176 +(char-valid-p 2176) + @result{} nil +(char-valid-p 2176 t) + @result{} t +(split-char 2176) + @result{} (latin-iso8859-1 0) +@end example + +The character sets @code{ascii}, @code{eight-bit-control}, and +@code{eight-bit-graphic} don't have corresponding generic characters. If +@var{charset} is one of them and you don't supply @var{code1}, +@code{make-char} returns the character code corresponding to the +smallest code in @var{charset}. + +@node Scanning Charsets +@section Scanning for Character Sets + + Sometimes it is useful to find out which character sets appear in a +part of a buffer or a string. One use for this is in determining which +coding systems (@pxref{Coding Systems}) are capable of representing all +of the text in question. + +@defun charset-after &optional pos +This function return the charset of a character in the current buffer +at position @var{pos}. If @var{pos} is omitted or @code{nil}, it +defaults to the current value of point. If @var{pos} is out of range, +the value is @code{nil}. +@end defun + +@defun find-charset-region beg end &optional translation +This function returns a list of the character sets that appear in the +current buffer between positions @var{beg} and @var{end}. + +The optional argument @var{translation} specifies a translation table to +be used in scanning the text (@pxref{Translation of Characters}). If it +is non-@code{nil}, then each character in the region is translated +through this table, and the value returned describes the translated +characters instead of the characters actually in the buffer. +@end defun + +@defun find-charset-string string &optional translation +This function returns a list of the character sets that appear in the +string @var{string}. It is just like @code{find-charset-region}, except +that it applies to the contents of @var{string} instead of part of the +current buffer. +@end defun + +@node Translation of Characters +@section Translation of Characters +@cindex character translation tables +@cindex translation tables + + A @dfn{translation table} is a char-table that specifies a mapping +of characters into characters. These tables are used in encoding and +decoding, and for other purposes. Some coding systems specify their +own particular translation tables; there are also default translation +tables which apply to all other coding systems. + + For instance, the coding-system @code{utf-8} has a translation table +that maps characters of various charsets (e.g., +@code{latin-iso8859-@var{x}}) into Unicode character sets. This way, +it can encode Latin-2 characters into UTF-8. Meanwhile, +@code{unify-8859-on-decoding-mode} operates by specifying +@code{standard-translation-table-for-decode} to translate +Latin-@var{x} characters into corresponding Unicode characters. + +@defun make-translation-table &rest translations +This function returns a translation table based on the argument +@var{translations}. Each element of @var{translations} should be a +list of elements of the form @code{(@var{from} . @var{to})}; this says +to translate the character @var{from} into @var{to}. + +The arguments and the forms in each argument are processed in order, +and if a previous form already translates @var{to} to some other +character, say @var{to-alt}, @var{from} is also translated to +@var{to-alt}. + +You can also map one whole character set into another character set with +the same dimension. To do this, you specify a generic character (which +designates a character set) for @var{from} (@pxref{Splitting Characters}). +In this case, if @var{to} is also a generic character, its character +set should have the same dimension as @var{from}'s. Then the +translation table translates each character of @var{from}'s character +set into the corresponding character of @var{to}'s character set. If +@var{from} is a generic character and @var{to} is an ordinary +character, then the translation table translates every character of +@var{from}'s character set into @var{to}. +@end defun + + In decoding, the translation table's translations are applied to the +characters that result from ordinary decoding. If a coding system has +property @code{translation-table-for-decode}, that specifies the +translation table to use. (This is a property of the coding system, +as returned by @code{coding-system-get}, not a property of the symbol +that is the coding system's name. @xref{Coding System Basics,, Basic +Concepts of Coding Systems}.) Otherwise, if +@code{standard-translation-table-for-decode} is non-@code{nil}, +decoding uses that table. + + In encoding, the translation table's translations are applied to the +characters in the buffer, and the result of translation is actually +encoded. If a coding system has property +@code{translation-table-for-encode}, that specifies the translation +table to use. Otherwise the variable +@code{standard-translation-table-for-encode} specifies the translation +table. + +@defvar standard-translation-table-for-decode +This is the default translation table for decoding, for +coding systems that don't specify any other translation table. +@end defvar + +@defvar standard-translation-table-for-encode +This is the default translation table for encoding, for +coding systems that don't specify any other translation table. +@end defvar + +@defvar translation-table-for-input +Self-inserting characters are translated through this translation +table before they are inserted. Search commands also translate their +input through this table, so they can compare more reliably with +what's in the buffer. + +@code{set-buffer-file-coding-system} sets this variable so that your +keyboard input gets translated into the character sets that the buffer +is likely to contain. This variable automatically becomes +buffer-local when set. +@end defvar + +@node Coding Systems +@section Coding Systems + +@cindex coding system + When Emacs reads or writes a file, and when Emacs sends text to a +subprocess or receives text from a subprocess, it normally performs +character code conversion and end-of-line conversion as specified +by a particular @dfn{coding system}. + + How to define a coding system is an arcane matter, and is not +documented here. + +@menu +* Coding System Basics:: Basic concepts. +* Encoding and I/O:: How file I/O functions handle coding systems. +* Lisp and Coding Systems:: Functions to operate on coding system names. +* User-Chosen Coding Systems:: Asking the user to choose a coding system. +* Default Coding Systems:: Controlling the default choices. +* Specifying Coding Systems:: Requesting a particular coding system + for a single file operation. +* Explicit Encoding:: Encoding or decoding text without doing I/O. +* Terminal I/O Encoding:: Use of encoding for terminal I/O. +* MS-DOS File Types:: How DOS "text" and "binary" files + relate to coding systems. +@end menu + +@node Coding System Basics +@subsection Basic Concepts of Coding Systems + +@cindex character code conversion + @dfn{Character code conversion} involves conversion between the encoding +used inside Emacs and some other encoding. Emacs supports many +different encodings, in that it can convert to and from them. For +example, it can convert text to or from encodings such as Latin 1, Latin +2, Latin 3, Latin 4, Latin 5, and several variants of ISO 2022. In some +cases, Emacs supports several alternative encodings for the same +characters; for example, there are three coding systems for the Cyrillic +(Russian) alphabet: ISO, Alternativnyj, and KOI8. + + Most coding systems specify a particular character code for +conversion, but some of them leave the choice unspecified---to be chosen +heuristically for each file, based on the data. + + In general, a coding system doesn't guarantee roundtrip identity: +decoding a byte sequence using coding system, then encoding the +resulting text in the same coding system, can produce a different byte +sequence. However, the following coding systems do guarantee that the +byte sequence will be the same as what you originally decoded: + +@quotation +chinese-big5 chinese-iso-8bit cyrillic-iso-8bit emacs-mule +greek-iso-8bit hebrew-iso-8bit iso-latin-1 iso-latin-2 iso-latin-3 +iso-latin-4 iso-latin-5 iso-latin-8 iso-latin-9 iso-safe +japanese-iso-8bit japanese-shift-jis korean-iso-8bit raw-text +@end quotation + + Encoding buffer text and then decoding the result can also fail to +reproduce the original text. For instance, if you encode Latin-2 +characters with @code{utf-8} and decode the result using the same +coding system, you'll get Unicode characters (of charset +@code{mule-unicode-0100-24ff}). If you encode Unicode characters with +@code{iso-latin-2} and decode the result with the same coding system, +you'll get Latin-2 characters. + +@cindex EOL conversion +@cindex end-of-line conversion +@cindex line end conversion + @dfn{End of line conversion} handles three different conventions used +on various systems for representing end of line in files. The Unix +convention is to use the linefeed character (also called newline). The +DOS convention is to use a carriage-return and a linefeed at the end of +a line. The Mac convention is to use just carriage-return. + +@cindex base coding system +@cindex variant coding system + @dfn{Base coding systems} such as @code{latin-1} leave the end-of-line +conversion unspecified, to be chosen based on the data. @dfn{Variant +coding systems} such as @code{latin-1-unix}, @code{latin-1-dos} and +@code{latin-1-mac} specify the end-of-line conversion explicitly as +well. Most base coding systems have three corresponding variants whose +names are formed by adding @samp{-unix}, @samp{-dos} and @samp{-mac}. + + The coding system @code{raw-text} is special in that it prevents +character code conversion, and causes the buffer visited with that +coding system to be a unibyte buffer. It does not specify the +end-of-line conversion, allowing that to be determined as usual by the +data, and has the usual three variants which specify the end-of-line +conversion. @code{no-conversion} is equivalent to @code{raw-text-unix}: +it specifies no conversion of either character codes or end-of-line. + + The coding system @code{emacs-mule} specifies that the data is +represented in the internal Emacs encoding. This is like +@code{raw-text} in that no code conversion happens, but different in +that the result is multibyte data. + +@defun coding-system-get coding-system property +This function returns the specified property of the coding system +@var{coding-system}. Most coding system properties exist for internal +purposes, but one that you might find useful is @code{mime-charset}. +That property's value is the name used in MIME for the character coding +which this coding system can read and write. Examples: + +@example +(coding-system-get 'iso-latin-1 'mime-charset) + @result{} iso-8859-1 +(coding-system-get 'iso-2022-cn 'mime-charset) + @result{} iso-2022-cn +(coding-system-get 'cyrillic-koi8 'mime-charset) + @result{} koi8-r +@end example + +The value of the @code{mime-charset} property is also defined +as an alias for the coding system. +@end defun + +@node Encoding and I/O +@subsection Encoding and I/O + + The principal purpose of coding systems is for use in reading and +writing files. The function @code{insert-file-contents} uses +a coding system for decoding the file data, and @code{write-region} +uses one to encode the buffer contents. + + You can specify the coding system to use either explicitly +(@pxref{Specifying Coding Systems}), or implicitly using a default +mechanism (@pxref{Default Coding Systems}). But these methods may not +completely specify what to do. For example, they may choose a coding +system such as @code{undefined} which leaves the character code +conversion to be determined from the data. In these cases, the I/O +operation finishes the job of choosing a coding system. Very often +you will want to find out afterwards which coding system was chosen. + +@defvar buffer-file-coding-system +This buffer-local variable records the coding system that was used to visit +the current buffer. It is used for saving the buffer, and for writing part +of the buffer with @code{write-region}. If the text to be written +cannot be safely encoded using the coding system specified by this +variable, these operations select an alternative encoding by calling +the function @code{select-safe-coding-system} (@pxref{User-Chosen +Coding Systems}). If selecting a different encoding requires to ask +the user to specify a coding system, @code{buffer-file-coding-system} +is updated to the newly selected coding system. + +@code{buffer-file-coding-system} does @emph{not} affect sending text +to a subprocess. +@end defvar + +@defvar save-buffer-coding-system +This variable specifies the coding system for saving the buffer (by +overriding @code{buffer-file-coding-system}). Note that it is not used +for @code{write-region}. + +When a command to save the buffer starts out to use +@code{buffer-file-coding-system} (or @code{save-buffer-coding-system}), +and that coding system cannot handle +the actual text in the buffer, the command asks the user to choose +another coding system (by calling @code{select-safe-coding-system}). +After that happens, the command also updates +@code{buffer-file-coding-system} to represent the coding system that +the user specified. +@end defvar + +@defvar last-coding-system-used +I/O operations for files and subprocesses set this variable to the +coding system name that was used. The explicit encoding and decoding +functions (@pxref{Explicit Encoding}) set it too. + +@strong{Warning:} Since receiving subprocess output sets this variable, +it can change whenever Emacs waits; therefore, you should copy the +value shortly after the function call that stores the value you are +interested in. +@end defvar + + The variable @code{selection-coding-system} specifies how to encode +selections for the window system. @xref{Window System Selections}. + +@defvar file-name-coding-system +The variable @code{file-name-coding-system} specifies the coding +system to use for encoding file names. Emacs encodes file names using +that coding system for all file operations. If +@code{file-name-coding-system} is @code{nil}, Emacs uses a default +coding system determined by the selected language environment. In the +default language environment, any non-@acronym{ASCII} characters in +file names are not encoded specially; they appear in the file system +using the internal Emacs representation. +@end defvar + + @strong{Warning:} if you change @code{file-name-coding-system} (or +the language environment) in the middle of an Emacs session, problems +can result if you have already visited files whose names were encoded +using the earlier coding system and are handled differently under the +new coding system. If you try to save one of these buffers under the +visited file name, saving may use the wrong file name, or it may get +an error. If such a problem happens, use @kbd{C-x C-w} to specify a +new file name for that buffer. + +@node Lisp and Coding Systems +@subsection Coding Systems in Lisp + + Here are the Lisp facilities for working with coding systems: + +@defun coding-system-list &optional base-only +This function returns a list of all coding system names (symbols). If +@var{base-only} is non-@code{nil}, the value includes only the +base coding systems. Otherwise, it includes alias and variant coding +systems as well. +@end defun + +@defun coding-system-p object +This function returns @code{t} if @var{object} is a coding system +name or @code{nil}. +@end defun + +@defun check-coding-system coding-system +This function checks the validity of @var{coding-system}. +If that is valid, it returns @var{coding-system}. +Otherwise it signals an error with condition @code{coding-system-error}. +@end defun + +@defun coding-system-eol-type coding-system +This function returns the type of end-of-line (a.k.a.@: @dfn{eol}) +conversion used by @var{coding-system}. If @var{coding-system} +specifies a certain eol conversion, the return value is an integer 0, +1, or 2, standing for @code{unix}, @code{dos}, and @code{mac}, +respectively. If @var{coding-system} doesn't specify eol conversion +explicitly, the return value is a vector of coding systems, each one +with one of the possible eol conversion types, like this: + +@lisp +(coding-system-eol-type 'latin-1) + @result{} [latin-1-unix latin-1-dos latin-1-mac] +@end lisp + +@noindent +If this function returns a vector, Emacs will decide, as part of the +text encoding or decoding process, what eol conversion to use. For +decoding, the end-of-line format of the text is auto-detected, and the +eol conversion is set to match it (e.g., DOS-style CRLF format will +imply @code{dos} eol conversion). For encoding, the eol conversion is +taken from the appropriate default coding system (e.g., +@code{default-buffer-file-coding-system} for +@code{buffer-file-coding-system}), or from the default eol conversion +appropriate for the underlying platform. +@end defun + +@defun coding-system-change-eol-conversion coding-system eol-type +This function returns a coding system which is like @var{coding-system} +except for its eol conversion, which is specified by @code{eol-type}. +@var{eol-type} should be @code{unix}, @code{dos}, @code{mac}, or +@code{nil}. If it is @code{nil}, the returned coding system determines +the end-of-line conversion from the data. + +@var{eol-type} may also be 0, 1 or 2, standing for @code{unix}, +@code{dos} and @code{mac}, respectively. +@end defun + +@defun coding-system-change-text-conversion eol-coding text-coding +This function returns a coding system which uses the end-of-line +conversion of @var{eol-coding}, and the text conversion of +@var{text-coding}. If @var{text-coding} is @code{nil}, it returns +@code{undecided}, or one of its variants according to @var{eol-coding}. +@end defun + +@defun find-coding-systems-region from to +This function returns a list of coding systems that could be used to +encode a text between @var{from} and @var{to}. All coding systems in +the list can safely encode any multibyte characters in that portion of +the text. + +If the text contains no multibyte characters, the function returns the +list @code{(undecided)}. +@end defun + +@defun find-coding-systems-string string +This function returns a list of coding systems that could be used to +encode the text of @var{string}. All coding systems in the list can +safely encode any multibyte characters in @var{string}. If the text +contains no multibyte characters, this returns the list +@code{(undecided)}. +@end defun + +@defun find-coding-systems-for-charsets charsets +This function returns a list of coding systems that could be used to +encode all the character sets in the list @var{charsets}. +@end defun + +@defun detect-coding-region start end &optional highest +This function chooses a plausible coding system for decoding the text +from @var{start} to @var{end}. This text should be a byte sequence +(@pxref{Explicit Encoding}). + +Normally this function returns a list of coding systems that could +handle decoding the text that was scanned. They are listed in order of +decreasing priority. But if @var{highest} is non-@code{nil}, then the +return value is just one coding system, the one that is highest in +priority. + +If the region contains only @acronym{ASCII} characters except for such +ISO-2022 control characters ISO-2022 as @code{ESC}, the value is +@code{undecided} or @code{(undecided)}, or a variant specifying +end-of-line conversion, if that can be deduced from the text. +@end defun + +@defun detect-coding-string string &optional highest +This function is like @code{detect-coding-region} except that it +operates on the contents of @var{string} instead of bytes in the buffer. +@end defun + + @xref{Coding systems for a subprocess,, Process Information}, in +particular the description of the functions +@code{process-coding-system} and @code{set-process-coding-system}, for +how to examine or set the coding systems used for I/O to a subprocess. + +@node User-Chosen Coding Systems +@subsection User-Chosen Coding Systems + +@cindex select safe coding system +@defun select-safe-coding-system from to &optional default-coding-system accept-default-p file +This function selects a coding system for encoding specified text, +asking the user to choose if necessary. Normally the specified text +is the text in the current buffer between @var{from} and @var{to}. If +@var{from} is a string, the string specifies the text to encode, and +@var{to} is ignored. + +If @var{default-coding-system} is non-@code{nil}, that is the first +coding system to try; if that can handle the text, +@code{select-safe-coding-system} returns that coding system. It can +also be a list of coding systems; then the function tries each of them +one by one. After trying all of them, it next tries the current +buffer's value of @code{buffer-file-coding-system} (if it is not +@code{undecided}), then the value of +@code{default-buffer-file-coding-system} and finally the user's most +preferred coding system, which the user can set using the command +@code{prefer-coding-system} (@pxref{Recognize Coding,, Recognizing +Coding Systems, emacs, The GNU Emacs Manual}). + +If one of those coding systems can safely encode all the specified +text, @code{select-safe-coding-system} chooses it and returns it. +Otherwise, it asks the user to choose from a list of coding systems +which can encode all the text, and returns the user's choice. + +@var{default-coding-system} can also be a list whose first element is +t and whose other elements are coding systems. Then, if no coding +system in the list can handle the text, @code{select-safe-coding-system} +queries the user immediately, without trying any of the three +alternatives described above. + +The optional argument @var{accept-default-p}, if non-@code{nil}, +should be a function to determine whether a coding system selected +without user interaction is acceptable. @code{select-safe-coding-system} +calls this function with one argument, the base coding system of the +selected coding system. If @var{accept-default-p} returns @code{nil}, +@code{select-safe-coding-system} rejects the silently selected coding +system, and asks the user to select a coding system from a list of +possible candidates. + +@vindex select-safe-coding-system-accept-default-p +If the variable @code{select-safe-coding-system-accept-default-p} is +non-@code{nil}, its value overrides the value of +@var{accept-default-p}. + +As a final step, before returning the chosen coding system, +@code{select-safe-coding-system} checks whether that coding system is +consistent with what would be selected if the contents of the region +were read from a file. (If not, this could lead to data corruption in +a file subsequently re-visited and edited.) Normally, +@code{select-safe-coding-system} uses @code{buffer-file-name} as the +file for this purpose, but if @var{file} is non-@code{nil}, it uses +that file instead (this can be relevant for @code{write-region} and +similar functions). If it detects an apparent inconsistency, +@code{select-safe-coding-system} queries the user before selecting the +coding system. +@end defun + + Here are two functions you can use to let the user specify a coding +system, with completion. @xref{Completion}. + +@defun read-coding-system prompt &optional default +This function reads a coding system using the minibuffer, prompting with +string @var{prompt}, and returns the coding system name as a symbol. If +the user enters null input, @var{default} specifies which coding system +to return. It should be a symbol or a string. +@end defun + +@defun read-non-nil-coding-system prompt +This function reads a coding system using the minibuffer, prompting with +string @var{prompt}, and returns the coding system name as a symbol. If +the user tries to enter null input, it asks the user to try again. +@xref{Coding Systems}. +@end defun + +@node Default Coding Systems +@subsection Default Coding Systems + + This section describes variables that specify the default coding +system for certain files or when running certain subprograms, and the +function that I/O operations use to access them. + + The idea of these variables is that you set them once and for all to the +defaults you want, and then do not change them again. To specify a +particular coding system for a particular operation in a Lisp program, +don't change these variables; instead, override them using +@code{coding-system-for-read} and @code{coding-system-for-write} +(@pxref{Specifying Coding Systems}). + +@defvar auto-coding-regexp-alist +This variable is an alist of text patterns and corresponding coding +systems. Each element has the form @code{(@var{regexp} +. @var{coding-system})}; a file whose first few kilobytes match +@var{regexp} is decoded with @var{coding-system} when its contents are +read into a buffer. The settings in this alist take priority over +@code{coding:} tags in the files and the contents of +@code{file-coding-system-alist} (see below). The default value is set +so that Emacs automatically recognizes mail files in Babyl format and +reads them with no code conversions. +@end defvar + +@defvar file-coding-system-alist +This variable is an alist that specifies the coding systems to use for +reading and writing particular files. Each element has the form +@code{(@var{pattern} . @var{coding})}, where @var{pattern} is a regular +expression that matches certain file names. The element applies to file +names that match @var{pattern}. + +The @sc{cdr} of the element, @var{coding}, should be either a coding +system, a cons cell containing two coding systems, or a function name (a +symbol with a function definition). If @var{coding} is a coding system, +that coding system is used for both reading the file and writing it. If +@var{coding} is a cons cell containing two coding systems, its @sc{car} +specifies the coding system for decoding, and its @sc{cdr} specifies the +coding system for encoding. + +If @var{coding} is a function name, the function should take one +argument, a list of all arguments passed to +@code{find-operation-coding-system}. It must return a coding system +or a cons cell containing two coding systems. This value has the same +meaning as described above. + +If @var{coding} (or what returned by the above function) is +@code{undecided}, the normal code-detection is performed. +@end defvar + +@defvar process-coding-system-alist +This variable is an alist specifying which coding systems to use for a +subprocess, depending on which program is running in the subprocess. It +works like @code{file-coding-system-alist}, except that @var{pattern} is +matched against the program name used to start the subprocess. The coding +system or systems specified in this alist are used to initialize the +coding systems used for I/O to the subprocess, but you can specify +other coding systems later using @code{set-process-coding-system}. +@end defvar + + @strong{Warning:} Coding systems such as @code{undecided}, which +determine the coding system from the data, do not work entirely reliably +with asynchronous subprocess output. This is because Emacs handles +asynchronous subprocess output in batches, as it arrives. If the coding +system leaves the character code conversion unspecified, or leaves the +end-of-line conversion unspecified, Emacs must try to detect the proper +conversion from one batch at a time, and this does not always work. + + Therefore, with an asynchronous subprocess, if at all possible, use a +coding system which determines both the character code conversion and +the end of line conversion---that is, one like @code{latin-1-unix}, +rather than @code{undecided} or @code{latin-1}. + +@defvar network-coding-system-alist +This variable is an alist that specifies the coding system to use for +network streams. It works much like @code{file-coding-system-alist}, +with the difference that the @var{pattern} in an element may be either a +port number or a regular expression. If it is a regular expression, it +is matched against the network service name used to open the network +stream. +@end defvar + +@defvar default-process-coding-system +This variable specifies the coding systems to use for subprocess (and +network stream) input and output, when nothing else specifies what to +do. + +The value should be a cons cell of the form @code{(@var{input-coding} +. @var{output-coding})}. Here @var{input-coding} applies to input from +the subprocess, and @var{output-coding} applies to output to it. +@end defvar + +@defvar auto-coding-functions +This variable holds a list of functions that try to determine a +coding system for a file based on its undecoded contents. + +Each function in this list should be written to look at text in the +current buffer, but should not modify it in any way. The buffer will +contain undecoded text of parts of the file. Each function should +take one argument, @var{size}, which tells it how many characters to +look at, starting from point. If the function succeeds in determining +a coding system for the file, it should return that coding system. +Otherwise, it should return @code{nil}. + +If a file has a @samp{coding:} tag, that takes precedence, so these +functions won't be called. +@end defvar + +@defun find-operation-coding-system operation &rest arguments +This function returns the coding system to use (by default) for +performing @var{operation} with @var{arguments}. The value has this +form: + +@example +(@var{decoding-system} . @var{encoding-system}) +@end example + +The first element, @var{decoding-system}, is the coding system to use +for decoding (in case @var{operation} does decoding), and +@var{encoding-system} is the coding system for encoding (in case +@var{operation} does encoding). + +The argument @var{operation} is a symbol, one of @code{write-region}, +@code{start-process}, @code{call-process}, @code{call-process-region}, +@code{insert-file-contents}, or @code{open-network-stream}. These are +the names of the Emacs I/O primitives that can do character code and +eol conversion. + +The remaining arguments should be the same arguments that might be given +to the corresponding I/O primitive. Depending on the primitive, one +of those arguments is selected as the @dfn{target}. For example, if +@var{operation} does file I/O, whichever argument specifies the file +name is the target. For subprocess primitives, the process name is the +target. For @code{open-network-stream}, the target is the service name +or port number. + +Depending on @var{operation}, this function looks up the target in +@code{file-coding-system-alist}, @code{process-coding-system-alist}, +or @code{network-coding-system-alist}. If the target is found in the +alist, @code{find-operation-coding-system} returns its association in +the alist; otherwise it returns @code{nil}. + +If @var{operation} is @code{insert-file-contents}, the argument +corresponding to the target may be a cons cell of the form +@code{(@var{filename} . @var{buffer})}). In that case, @var{filename} +is a file name to look up in @code{file-coding-system-alist}, and +@var{buffer} is a buffer that contains the file's contents (not yet +decoded). If @code{file-coding-system-alist} specifies a function to +call for this file, and that function needs to examine the file's +contents (as it usually does), it should examine the contents of +@var{buffer} instead of reading the file. +@end defun + +@node Specifying Coding Systems +@subsection Specifying a Coding System for One Operation + + You can specify the coding system for a specific operation by binding +the variables @code{coding-system-for-read} and/or +@code{coding-system-for-write}. + +@defvar coding-system-for-read +If this variable is non-@code{nil}, it specifies the coding system to +use for reading a file, or for input from a synchronous subprocess. + +It also applies to any asynchronous subprocess or network stream, but in +a different way: the value of @code{coding-system-for-read} when you +start the subprocess or open the network stream specifies the input +decoding method for that subprocess or network stream. It remains in +use for that subprocess or network stream unless and until overridden. + +The right way to use this variable is to bind it with @code{let} for a +specific I/O operation. Its global value is normally @code{nil}, and +you should not globally set it to any other value. Here is an example +of the right way to use the variable: + +@example +;; @r{Read the file with no character code conversion.} +;; @r{Assume @acronym{crlf} represents end-of-line.} +(let ((coding-system-for-read 'emacs-mule-dos)) + (insert-file-contents filename)) +@end example + +When its value is non-@code{nil}, this variable takes precedence over +all other methods of specifying a coding system to use for input, +including @code{file-coding-system-alist}, +@code{process-coding-system-alist} and +@code{network-coding-system-alist}. +@end defvar + +@defvar coding-system-for-write +This works much like @code{coding-system-for-read}, except that it +applies to output rather than input. It affects writing to files, +as well as sending output to subprocesses and net connections. + +When a single operation does both input and output, as do +@code{call-process-region} and @code{start-process}, both +@code{coding-system-for-read} and @code{coding-system-for-write} +affect it. +@end defvar + +@defvar inhibit-eol-conversion +When this variable is non-@code{nil}, no end-of-line conversion is done, +no matter which coding system is specified. This applies to all the +Emacs I/O and subprocess primitives, and to the explicit encoding and +decoding functions (@pxref{Explicit Encoding}). +@end defvar + +@node Explicit Encoding +@subsection Explicit Encoding and Decoding +@cindex encoding in coding systems +@cindex decoding in coding systems + + All the operations that transfer text in and out of Emacs have the +ability to use a coding system to encode or decode the text. +You can also explicitly encode and decode text using the functions +in this section. + + The result of encoding, and the input to decoding, are not ordinary +text. They logically consist of a series of byte values; that is, a +series of characters whose codes are in the range 0 through 255. In a +multibyte buffer or string, character codes 128 through 159 are +represented by multibyte sequences, but this is invisible to Lisp +programs. + + The usual way to read a file into a buffer as a sequence of bytes, so +you can decode the contents explicitly, is with +@code{insert-file-contents-literally} (@pxref{Reading from Files}); +alternatively, specify a non-@code{nil} @var{rawfile} argument when +visiting a file with @code{find-file-noselect}. These methods result in +a unibyte buffer. + + The usual way to use the byte sequence that results from explicitly +encoding text is to copy it to a file or process---for example, to write +it with @code{write-region} (@pxref{Writing to Files}), and suppress +encoding by binding @code{coding-system-for-write} to +@code{no-conversion}. + + Here are the functions to perform explicit encoding or decoding. The +encoding functions produce sequences of bytes; the decoding functions +are meant to operate on sequences of bytes. All of these functions +discard text properties. + +@deffn Command encode-coding-region start end coding-system +This command encodes the text from @var{start} to @var{end} according +to coding system @var{coding-system}. The encoded text replaces the +original text in the buffer. The result of encoding is logically a +sequence of bytes, but the buffer remains multibyte if it was multibyte +before. + +This command returns the length of the encoded text. +@end deffn + +@defun encode-coding-string string coding-system &optional nocopy +This function encodes the text in @var{string} according to coding +system @var{coding-system}. It returns a new string containing the +encoded text, except when @var{nocopy} is non-@code{nil}, in which +case the function may return @var{string} itself if the encoding +operation is trivial. The result of encoding is a unibyte string. +@end defun + +@deffn Command decode-coding-region start end coding-system +This command decodes the text from @var{start} to @var{end} according +to coding system @var{coding-system}. The decoded text replaces the +original text in the buffer. To make explicit decoding useful, the text +before decoding ought to be a sequence of byte values, but both +multibyte and unibyte buffers are acceptable. + +This command returns the length of the decoded text. +@end deffn + +@defun decode-coding-string string coding-system &optional nocopy +This function decodes the text in @var{string} according to coding +system @var{coding-system}. It returns a new string containing the +decoded text, except when @var{nocopy} is non-@code{nil}, in which +case the function may return @var{string} itself if the decoding +operation is trivial. To make explicit decoding useful, the contents +of @var{string} ought to be a sequence of byte values, but a multibyte +string is acceptable. +@end defun + +@defun decode-coding-inserted-region from to filename &optional visit beg end replace +This function decodes the text from @var{from} to @var{to} as if +it were being read from file @var{filename} using @code{insert-file-contents} +using the rest of the arguments provided. + +The normal way to use this function is after reading text from a file +without decoding, if you decide you would rather have decoded it. +Instead of deleting the text and reading it again, this time with +decoding, you can call this function. +@end defun + +@node Terminal I/O Encoding +@subsection Terminal I/O Encoding + + Emacs can decode keyboard input using a coding system, and encode +terminal output. This is useful for terminals that transmit or display +text using a particular encoding such as Latin-1. Emacs does not set +@code{last-coding-system-used} for encoding or decoding for the +terminal. + +@defun keyboard-coding-system +This function returns the coding system that is in use for decoding +keyboard input---or @code{nil} if no coding system is to be used. +@end defun + +@deffn Command set-keyboard-coding-system coding-system +This command specifies @var{coding-system} as the coding system to +use for decoding keyboard input. If @var{coding-system} is @code{nil}, +that means do not decode keyboard input. +@end deffn + +@defun terminal-coding-system +This function returns the coding system that is in use for encoding +terminal output---or @code{nil} for no encoding. +@end defun + +@deffn Command set-terminal-coding-system coding-system +This command specifies @var{coding-system} as the coding system to use +for encoding terminal output. If @var{coding-system} is @code{nil}, +that means do not encode terminal output. +@end deffn + +@node MS-DOS File Types +@subsection MS-DOS File Types +@cindex DOS file types +@cindex MS-DOS file types +@cindex Windows file types +@cindex file types on MS-DOS and Windows +@cindex text files and binary files +@cindex binary files and text files + + On MS-DOS and Microsoft Windows, Emacs guesses the appropriate +end-of-line conversion for a file by looking at the file's name. This +feature classifies files as @dfn{text files} and @dfn{binary files}. By +``binary file'' we mean a file of literal byte values that are not +necessarily meant to be characters; Emacs does no end-of-line conversion +and no character code conversion for them. On the other hand, the bytes +in a text file are intended to represent characters; when you create a +new file whose name implies that it is a text file, Emacs uses DOS +end-of-line conversion. + +@defvar buffer-file-type +This variable, automatically buffer-local in each buffer, records the +file type of the buffer's visited file. When a buffer does not specify +a coding system with @code{buffer-file-coding-system}, this variable is +used to determine which coding system to use when writing the contents +of the buffer. It should be @code{nil} for text, @code{t} for binary. +If it is @code{t}, the coding system is @code{no-conversion}. +Otherwise, @code{undecided-dos} is used. + +Normally this variable is set by visiting a file; it is set to +@code{nil} if the file was visited without any actual conversion. +@end defvar + +@defopt file-name-buffer-file-type-alist +This variable holds an alist for recognizing text and binary files. +Each element has the form (@var{regexp} . @var{type}), where +@var{regexp} is matched against the file name, and @var{type} may be +@code{nil} for text, @code{t} for binary, or a function to call to +compute which. If it is a function, then it is called with a single +argument (the file name) and should return @code{t} or @code{nil}. + +When running on MS-DOS or MS-Windows, Emacs checks this alist to decide +which coding system to use when reading a file. For a text file, +@code{undecided-dos} is used. For a binary file, @code{no-conversion} +is used. + +If no element in this alist matches a given file name, then +@code{default-buffer-file-type} says how to treat the file. +@end defopt + +@defopt default-buffer-file-type +This variable says how to handle files for which +@code{file-name-buffer-file-type-alist} says nothing about the type. + +If this variable is non-@code{nil}, then these files are treated as +binary: the coding system @code{no-conversion} is used. Otherwise, +nothing special is done for them---the coding system is deduced solely +from the file contents, in the usual Emacs fashion. +@end defopt + +@node Input Methods +@section Input Methods +@cindex input methods + + @dfn{Input methods} provide convenient ways of entering non-@acronym{ASCII} +characters from the keyboard. Unlike coding systems, which translate +non-@acronym{ASCII} characters to and from encodings meant to be read by +programs, input methods provide human-friendly commands. (@xref{Input +Methods,,, emacs, The GNU Emacs Manual}, for information on how users +use input methods to enter text.) How to define input methods is not +yet documented in this manual, but here we describe how to use them. + + Each input method has a name, which is currently a string; +in the future, symbols may also be usable as input method names. + +@defvar current-input-method +This variable holds the name of the input method now active in the +current buffer. (It automatically becomes local in each buffer when set +in any fashion.) It is @code{nil} if no input method is active in the +buffer now. +@end defvar + +@defopt default-input-method +This variable holds the default input method for commands that choose an +input method. Unlike @code{current-input-method}, this variable is +normally global. +@end defopt + +@deffn Command set-input-method input-method +This command activates input method @var{input-method} for the current +buffer. It also sets @code{default-input-method} to @var{input-method}. +If @var{input-method} is @code{nil}, this command deactivates any input +method for the current buffer. +@end deffn + +@defun read-input-method-name prompt &optional default inhibit-null +This function reads an input method name with the minibuffer, prompting +with @var{prompt}. If @var{default} is non-@code{nil}, that is returned +by default, if the user enters empty input. However, if +@var{inhibit-null} is non-@code{nil}, empty input signals an error. + +The returned value is a string. +@end defun + +@defvar input-method-alist +This variable defines all the supported input methods. +Each element defines one input method, and should have the form: + +@example +(@var{input-method} @var{language-env} @var{activate-func} + @var{title} @var{description} @var{args}...) +@end example + +Here @var{input-method} is the input method name, a string; +@var{language-env} is another string, the name of the language +environment this input method is recommended for. (That serves only for +documentation purposes.) + +@var{activate-func} is a function to call to activate this method. The +@var{args}, if any, are passed as arguments to @var{activate-func}. All +told, the arguments to @var{activate-func} are @var{input-method} and +the @var{args}. + +@var{title} is a string to display in the mode line while this method is +active. @var{description} is a string describing this method and what +it is good for. +@end defvar + + The fundamental interface to input methods is through the +variable @code{input-method-function}. @xref{Reading One Event}, +and @ref{Invoking the Input Method}. + +@node Locales +@section Locales +@cindex locale + + POSIX defines a concept of ``locales'' which control which language +to use in language-related features. These Emacs variables control +how Emacs interacts with these features. + +@defvar locale-coding-system +@cindex keyboard input decoding on X +This variable specifies the coding system to use for decoding system +error messages and---on X Window system only---keyboard input, for +encoding the format argument to @code{format-time-string}, and for +decoding the return value of @code{format-time-string}. +@end defvar + +@defvar system-messages-locale +This variable specifies the locale to use for generating system error +messages. Changing the locale can cause messages to come out in a +different language or in a different orthography. If the variable is +@code{nil}, the locale is specified by environment variables in the +usual POSIX fashion. +@end defvar + +@defvar system-time-locale +This variable specifies the locale to use for formatting time values. +Changing the locale can cause messages to appear according to the +conventions of a different language. If the variable is @code{nil}, the +locale is specified by environment variables in the usual POSIX fashion. +@end defvar + +@defun locale-info item +This function returns locale data @var{item} for the current POSIX +locale, if available. @var{item} should be one of these symbols: + +@table @code +@item codeset +Return the character set as a string (locale item @code{CODESET}). + +@item days +Return a 7-element vector of day names (locale items +@code{DAY_1} through @code{DAY_7}); + +@item months +Return a 12-element vector of month names (locale items @code{MON_1} +through @code{MON_12}). + +@item paper +Return a list @code{(@var{width} @var{height})} for the default paper +size measured in millimeters (locale items @code{PAPER_WIDTH} and +@code{PAPER_HEIGHT}). +@end table + +If the system can't provide the requested information, or if +@var{item} is not one of those symbols, the value is @code{nil}. All +strings in the return value are decoded using +@code{locale-coding-system}. @xref{Locales,,, libc, The GNU Libc Manual}, +for more information about locales and locale items. +@end defun + +@ignore + arch-tag: be705bf8-941b-4c35-84fc-ad7d20ddb7cb +@end ignore diff --git a/doc/lispref/numbers.texi b/doc/lispref/numbers.texi new file mode 100644 index 00000000000..4d7f3e7578a --- /dev/null +++ b/doc/lispref/numbers.texi @@ -0,0 +1,1211 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/numbers +@node Numbers, Strings and Characters, Lisp Data Types, Top +@chapter Numbers +@cindex integers +@cindex numbers + + GNU Emacs supports two numeric data types: @dfn{integers} and +@dfn{floating point numbers}. Integers are whole numbers such as +@minus{}3, 0, 7, 13, and 511. Their values are exact. Floating point +numbers are numbers with fractional parts, such as @minus{}4.5, 0.0, or +2.71828. They can also be expressed in exponential notation: 1.5e2 +equals 150; in this example, @samp{e2} stands for ten to the second +power, and that is multiplied by 1.5. Floating point values are not +exact; they have a fixed, limited amount of precision. + +@menu +* Integer Basics:: Representation and range of integers. +* Float Basics:: Representation and range of floating point. +* Predicates on Numbers:: Testing for numbers. +* Comparison of Numbers:: Equality and inequality predicates. +* Numeric Conversions:: Converting float to integer and vice versa. +* Arithmetic Operations:: How to add, subtract, multiply and divide. +* Rounding Operations:: Explicitly rounding floating point numbers. +* Bitwise Operations:: Logical and, or, not, shifting. +* Math Functions:: Trig, exponential and logarithmic functions. +* Random Numbers:: Obtaining random integers, predictable or not. +@end menu + +@node Integer Basics +@comment node-name, next, previous, up +@section Integer Basics + + The range of values for an integer depends on the machine. The +minimum range is @minus{}268435456 to 268435455 (29 bits; i.e., +@ifnottex +-2**28 +@end ifnottex +@tex +@math{-2^{28}} +@end tex +to +@ifnottex +2**28 - 1), +@end ifnottex +@tex +@math{2^{28}-1}), +@end tex +but some machines may provide a wider range. Many examples in this +chapter assume an integer has 29 bits. +@cindex overflow + + The Lisp reader reads an integer as a sequence of digits with optional +initial sign and optional final period. + +@example + 1 ; @r{The integer 1.} + 1. ; @r{The integer 1.} ++1 ; @r{Also the integer 1.} +-1 ; @r{The integer @minus{}1.} + 536870913 ; @r{Also the integer 1, due to overflow.} + 0 ; @r{The integer 0.} +-0 ; @r{The integer 0.} +@end example + +@cindex integers in specific radix +@cindex radix for reading an integer +@cindex base for reading an integer +@cindex hex numbers +@cindex octal numbers +@cindex reading numbers in hex, octal, and binary + The syntax for integers in bases other than 10 uses @samp{#} +followed by a letter that specifies the radix: @samp{b} for binary, +@samp{o} for octal, @samp{x} for hex, or @samp{@var{radix}r} to +specify radix @var{radix}. Case is not significant for the letter +that specifies the radix. Thus, @samp{#b@var{integer}} reads +@var{integer} in binary, and @samp{#@var{radix}r@var{integer}} reads +@var{integer} in radix @var{radix}. Allowed values of @var{radix} run +from 2 to 36. For example: + +@example +#b101100 @result{} 44 +#o54 @result{} 44 +#x2c @result{} 44 +#24r1k @result{} 44 +@end example + + To understand how various functions work on integers, especially the +bitwise operators (@pxref{Bitwise Operations}), it is often helpful to +view the numbers in their binary form. + + In 29-bit binary, the decimal integer 5 looks like this: + +@example +0 0000 0000 0000 0000 0000 0000 0101 +@end example + +@noindent +(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 @minus{}1 looks like this: + +@example +1 1111 1111 1111 1111 1111 1111 1111 +@end example + +@noindent +@cindex two's complement +@minus{}1 is represented as 29 ones. (This is called @dfn{two's +complement} notation.) + + The negative integer, @minus{}5, is creating by subtracting 4 from +@minus{}1. In binary, the decimal integer 4 is 100. Consequently, +@minus{}5 looks like this: + +@example +1 1111 1111 1111 1111 1111 1111 1011 +@end example + + In this implementation, the largest 29-bit binary integer value is +268,435,455 in decimal. In binary, it looks like this: + +@example +0 1111 1111 1111 1111 1111 1111 1111 +@end example + + Since the arithmetic functions do not check whether integers go +outside their range, when you add 1 to 268,435,455, the value is the +negative integer @minus{}268,435,456: + +@example +(+ 1 268435455) + @result{} -268435456 + @result{} 1 0000 0000 0000 0000 0000 0000 0000 +@end example + + Many of the functions described in this chapter accept markers for +arguments in place of numbers. (@xref{Markers}.) Since the actual +arguments to such functions may be either numbers or markers, we often +give these arguments the name @var{number-or-marker}. When the argument +value is a marker, its position value is used and its buffer is ignored. + +@defvar most-positive-fixnum +The value of this variable is the largest integer that Emacs Lisp +can handle. +@end defvar + +@defvar most-negative-fixnum +The value of this variable is the smallest integer that Emacs Lisp can +handle. It is negative. +@end defvar + +@node Float Basics +@section Floating Point Basics + + Floating point numbers are useful for representing numbers that are +not integral. The precise range of floating point numbers is +machine-specific; it is the same as the range of the C data type +@code{double} on the machine you are using. + + The read-syntax for floating point numbers requires either a decimal +point (with at least one digit following), an exponent, or both. For +example, @samp{1500.0}, @samp{15e2}, @samp{15.0e2}, @samp{1.5e3}, and +@samp{.15e4} are five ways of writing a floating point number whose +value is 1500. They are all equivalent. You can also use a minus sign +to write negative floating point numbers, as in @samp{-1.0}. + +@cindex @acronym{IEEE} floating point +@cindex positive infinity +@cindex negative infinity +@cindex infinity +@cindex NaN + Most modern computers support the @acronym{IEEE} floating point standard, +which provides for positive infinity and negative infinity as floating point +values. It also provides for a class of values called NaN or +``not-a-number''; numerical functions return such values in cases where +there is no correct answer. For example, @code{(/ 0.0 0.0)} returns a +NaN. For practical purposes, there's no significant difference between +different NaN values in Emacs Lisp, and there's no rule for precisely +which NaN value should be used in a particular case, so Emacs Lisp +doesn't try to distinguish them (but it does report the sign, if you +print it). Here are the read syntaxes for these special floating +point values: + +@table @asis +@item positive infinity +@samp{1.0e+INF} +@item negative infinity +@samp{-1.0e+INF} +@item Not-a-number +@samp{0.0e+NaN} or @samp{-0.0e+NaN}. +@end table + + To test whether a floating point value is a NaN, compare it with +itself using @code{=}. That returns @code{nil} for a NaN, and +@code{t} for any other floating point value. + + The value @code{-0.0} is distinguishable from ordinary zero in +@acronym{IEEE} floating point, but Emacs Lisp @code{equal} and +@code{=} consider them equal values. + + You can use @code{logb} to extract the binary exponent of a floating +point number (or estimate the logarithm of an integer): + +@defun logb number +This function returns the binary exponent of @var{number}. More +precisely, the value is the logarithm of @var{number} base 2, rounded +down to an integer. + +@example +(logb 10) + @result{} 3 +(logb 10.0e20) + @result{} 69 +@end example +@end defun + +@node Predicates on Numbers +@section Type Predicates for Numbers +@cindex predicates for numbers + + The functions in this section test for numbers, or for a specific +type of number. The functions @code{integerp} and @code{floatp} can +take any type of Lisp object as argument (they would not be of much +use otherwise), but the @code{zerop} predicate requires a number as +its argument. See also @code{integer-or-marker-p} and +@code{number-or-marker-p}, in @ref{Predicates on Markers}. + +@defun floatp object +This predicate tests whether its argument is a floating point +number and returns @code{t} if so, @code{nil} otherwise. + +@code{floatp} does not exist in Emacs versions 18 and earlier. +@end defun + +@defun integerp object +This predicate tests whether its argument is an integer, and returns +@code{t} if so, @code{nil} otherwise. +@end defun + +@defun numberp object +This predicate tests whether its argument is a number (either integer or +floating point), and returns @code{t} if so, @code{nil} otherwise. +@end defun + +@defun wholenump object +@cindex natural numbers +The @code{wholenump} predicate (whose name comes from the phrase +``whole-number-p'') tests to see whether its argument is a nonnegative +integer, and returns @code{t} if so, @code{nil} otherwise. 0 is +considered non-negative. + +@findex natnump +@code{natnump} is an obsolete synonym for @code{wholenump}. +@end defun + +@defun zerop number +This predicate tests whether its argument is zero, and returns @code{t} +if so, @code{nil} otherwise. The argument must be a number. + +@code{(zerop x)} is equivalent to @code{(= x 0)}. +@end defun + +@node Comparison of Numbers +@section Comparison of Numbers +@cindex number comparison +@cindex comparing numbers + + To test numbers for numerical equality, you should normally use +@code{=}, not @code{eq}. There can be many distinct floating point +number objects with the same numeric value. If you use @code{eq} to +compare them, then you test whether two values are the same +@emph{object}. By contrast, @code{=} compares only the numeric values +of the objects. + + At present, each integer value has a unique Lisp object in Emacs Lisp. +Therefore, @code{eq} is equivalent to @code{=} where integers are +concerned. It is sometimes convenient to use @code{eq} for comparing an +unknown value with an integer, because @code{eq} does not report an +error if the unknown value is not a number---it accepts arguments of any +type. By contrast, @code{=} signals an error if the arguments are not +numbers or markers. However, it is a good idea to use @code{=} if you +can, even for comparing integers, just in case we change the +representation of integers in a future Emacs version. + + Sometimes it is useful to compare numbers with @code{equal}; it +treats two numbers as equal if they have the same data type (both +integers, or both floating point) and the same value. By contrast, +@code{=} can treat an integer and a floating point number as equal. +@xref{Equality Predicates}. + + There is another wrinkle: because floating point arithmetic is not +exact, it is often a bad idea to check for equality of two floating +point values. Usually it is better to test for approximate equality. +Here's a function to do this: + +@example +(defvar fuzz-factor 1.0e-6) +(defun approx-equal (x y) + (or (and (= x 0) (= y 0)) + (< (/ (abs (- x y)) + (max (abs x) (abs y))) + fuzz-factor))) +@end example + +@cindex CL note---integers vrs @code{eq} +@quotation +@b{Common Lisp note:} Comparing numbers in Common Lisp always requires +@code{=} because Common Lisp implements multi-word integers, and two +distinct integer objects can have the same numeric value. Emacs Lisp +can have just one integer object for any given value because it has a +limited range of integer values. +@end quotation + +@defun = number-or-marker1 number-or-marker2 +This function tests whether its arguments are numerically equal, and +returns @code{t} if so, @code{nil} otherwise. +@end defun + +@defun eql value1 value2 +This function acts like @code{eq} except when both arguments are +numbers. It compares numbers by type and numeric value, so that +@code{(eql 1.0 1)} returns @code{nil}, but @code{(eql 1.0 1.0)} and +@code{(eql 1 1)} both return @code{t}. +@end defun + +@defun /= number-or-marker1 number-or-marker2 +This function tests whether its arguments are numerically equal, and +returns @code{t} if they are not, and @code{nil} if they are. +@end defun + +@defun < number-or-marker1 number-or-marker2 +This function tests whether its first argument is strictly less than +its second argument. It returns @code{t} if so, @code{nil} otherwise. +@end defun + +@defun <= number-or-marker1 number-or-marker2 +This function tests whether its first argument is less than or equal +to its second argument. It returns @code{t} if so, @code{nil} +otherwise. +@end defun + +@defun > number-or-marker1 number-or-marker2 +This function tests whether its first argument is strictly greater +than its second argument. It returns @code{t} if so, @code{nil} +otherwise. +@end defun + +@defun >= number-or-marker1 number-or-marker2 +This function tests whether its first argument is greater than or +equal to its second argument. It returns @code{t} if so, @code{nil} +otherwise. +@end defun + +@defun max number-or-marker &rest numbers-or-markers +This function returns the largest of its arguments. +If any of the arguments is floating-point, the value is returned +as floating point, even if it was given as an integer. + +@example +(max 20) + @result{} 20 +(max 1 2.5) + @result{} 2.5 +(max 1 3 2.5) + @result{} 3.0 +@end example +@end defun + +@defun min number-or-marker &rest numbers-or-markers +This function returns the smallest of its arguments. +If any of the arguments is floating-point, the value is returned +as floating point, even if it was given as an integer. + +@example +(min -4 1) + @result{} -4 +@end example +@end defun + +@defun abs number +This function returns the absolute value of @var{number}. +@end defun + +@node Numeric Conversions +@section Numeric Conversions +@cindex rounding in conversions +@cindex number conversions +@cindex converting numbers + +To convert an integer to floating point, use the function @code{float}. + +@defun float number +This returns @var{number} converted to floating point. +If @var{number} is already a floating point number, @code{float} returns +it unchanged. +@end defun + +There are four functions to convert floating point numbers to integers; +they differ in how they round. All accept an argument @var{number} +and an optional argument @var{divisor}. Both arguments may be +integers or floating point numbers. @var{divisor} may also be +@code{nil}. If @var{divisor} is @code{nil} or omitted, these +functions convert @var{number} to an integer, or return it unchanged +if it already is an integer. If @var{divisor} is non-@code{nil}, they +divide @var{number} by @var{divisor} and convert the result to an +integer. An @code{arith-error} results if @var{divisor} is 0. + +@defun truncate number &optional divisor +This returns @var{number}, converted to an integer by rounding towards +zero. + +@example +(truncate 1.2) + @result{} 1 +(truncate 1.7) + @result{} 1 +(truncate -1.2) + @result{} -1 +(truncate -1.7) + @result{} -1 +@end example +@end defun + +@defun floor number &optional divisor +This returns @var{number}, converted to an integer by rounding downward +(towards negative infinity). + +If @var{divisor} is specified, this uses the kind of division +operation that corresponds to @code{mod}, rounding downward. + +@example +(floor 1.2) + @result{} 1 +(floor 1.7) + @result{} 1 +(floor -1.2) + @result{} -2 +(floor -1.7) + @result{} -2 +(floor 5.99 3) + @result{} 1 +@end example +@end defun + +@defun ceiling number &optional divisor +This returns @var{number}, converted to an integer by rounding upward +(towards positive infinity). + +@example +(ceiling 1.2) + @result{} 2 +(ceiling 1.7) + @result{} 2 +(ceiling -1.2) + @result{} -1 +(ceiling -1.7) + @result{} -1 +@end example +@end defun + +@defun round number &optional divisor +This returns @var{number}, converted to an integer by rounding towards the +nearest integer. Rounding a value equidistant between two integers +may choose the integer closer to zero, or it may prefer an even integer, +depending on your machine. + +@example +(round 1.2) + @result{} 1 +(round 1.7) + @result{} 2 +(round -1.2) + @result{} -1 +(round -1.7) + @result{} -2 +@end example +@end defun + +@node Arithmetic Operations +@section Arithmetic Operations +@cindex arithmetic operations + + Emacs Lisp provides the traditional four arithmetic operations: +addition, subtraction, multiplication, and division. Remainder and modulus +functions supplement the division functions. The functions to +add or subtract 1 are provided because they are traditional in Lisp and +commonly used. + + All of these functions except @code{%} return a floating point value +if any argument is floating. + + It is important to note that in Emacs Lisp, arithmetic functions +do not check for overflow. Thus @code{(1+ 268435455)} may evaluate to +@minus{}268435456, depending on your hardware. + +@defun 1+ number-or-marker +This function returns @var{number-or-marker} plus 1. +For example, + +@example +(setq foo 4) + @result{} 4 +(1+ foo) + @result{} 5 +@end example + +This function is not analogous to the C operator @code{++}---it does not +increment a variable. It just computes a sum. Thus, if we continue, + +@example +foo + @result{} 4 +@end example + +If you want to increment the variable, you must use @code{setq}, +like this: + +@example +(setq foo (1+ foo)) + @result{} 5 +@end example +@end defun + +@defun 1- number-or-marker +This function returns @var{number-or-marker} minus 1. +@end defun + +@defun + &rest numbers-or-markers +This function adds its arguments together. When given no arguments, +@code{+} returns 0. + +@example +(+) + @result{} 0 +(+ 1) + @result{} 1 +(+ 1 2 3 4) + @result{} 10 +@end example +@end defun + +@defun - &optional number-or-marker &rest more-numbers-or-markers +The @code{-} function serves two purposes: negation and subtraction. +When @code{-} has a single argument, the value is the negative of the +argument. When there are multiple arguments, @code{-} subtracts each of +the @var{more-numbers-or-markers} from @var{number-or-marker}, +cumulatively. If there are no arguments, the result is 0. + +@example +(- 10 1 2 3 4) + @result{} 0 +(- 10) + @result{} -10 +(-) + @result{} 0 +@end example +@end defun + +@defun * &rest numbers-or-markers +This function multiplies its arguments together, and returns the +product. When given no arguments, @code{*} returns 1. + +@example +(*) + @result{} 1 +(* 1) + @result{} 1 +(* 1 2 3 4) + @result{} 24 +@end example +@end defun + +@defun / dividend divisor &rest divisors +This function divides @var{dividend} by @var{divisor} and returns the +quotient. If there are additional arguments @var{divisors}, then it +divides @var{dividend} by each divisor in turn. Each argument may be a +number or a marker. + +If all the arguments are integers, then the result is an integer too. +This means the result has to be rounded. On most machines, the result +is rounded towards zero after each division, but some machines may round +differently with negative arguments. This is because the Lisp function +@code{/} is implemented using the C division operator, which also +permits machine-dependent rounding. As a practical matter, all known +machines round in the standard fashion. + +@cindex @code{arith-error} in division +If you divide an integer by 0, an @code{arith-error} error is signaled. +(@xref{Errors}.) Floating point division by zero returns either +infinity or a NaN if your machine supports @acronym{IEEE} floating point; +otherwise, it signals an @code{arith-error} error. + +@example +@group +(/ 6 2) + @result{} 3 +@end group +(/ 5 2) + @result{} 2 +(/ 5.0 2) + @result{} 2.5 +(/ 5 2.0) + @result{} 2.5 +(/ 5.0 2.0) + @result{} 2.5 +(/ 25 3 2) + @result{} 4 +@group +(/ -17 6) + @result{} -2 @r{(could in theory be @minus{}3 on some machines)} +@end group +@end example +@end defun + +@defun % dividend divisor +@cindex remainder +This function returns the integer remainder after division of @var{dividend} +by @var{divisor}. The arguments must be integers or markers. + +For negative arguments, the remainder is in principle machine-dependent +since the quotient is; but in practice, all known machines behave alike. + +An @code{arith-error} results if @var{divisor} is 0. + +@example +(% 9 4) + @result{} 1 +(% -9 4) + @result{} -1 +(% 9 -4) + @result{} 1 +(% -9 -4) + @result{} -1 +@end example + +For any two integers @var{dividend} and @var{divisor}, + +@example +@group +(+ (% @var{dividend} @var{divisor}) + (* (/ @var{dividend} @var{divisor}) @var{divisor})) +@end group +@end example + +@noindent +always equals @var{dividend}. +@end defun + +@defun mod dividend divisor +@cindex modulus +This function returns the value of @var{dividend} modulo @var{divisor}; +in other words, the remainder after division of @var{dividend} +by @var{divisor}, but with the same sign as @var{divisor}. +The arguments must be numbers or markers. + +Unlike @code{%}, @code{mod} returns a well-defined result for negative +arguments. It also permits floating point arguments; it rounds the +quotient downward (towards minus infinity) to an integer, and uses that +quotient to compute the remainder. + +An @code{arith-error} results if @var{divisor} is 0. + +@example +@group +(mod 9 4) + @result{} 1 +@end group +@group +(mod -9 4) + @result{} 3 +@end group +@group +(mod 9 -4) + @result{} -3 +@end group +@group +(mod -9 -4) + @result{} -1 +@end group +@group +(mod 5.5 2.5) + @result{} .5 +@end group +@end example + +For any two numbers @var{dividend} and @var{divisor}, + +@example +@group +(+ (mod @var{dividend} @var{divisor}) + (* (floor @var{dividend} @var{divisor}) @var{divisor})) +@end group +@end example + +@noindent +always equals @var{dividend}, subject to rounding error if either +argument is floating point. For @code{floor}, see @ref{Numeric +Conversions}. +@end defun + +@node Rounding Operations +@section Rounding Operations +@cindex rounding without conversion + +The functions @code{ffloor}, @code{fceiling}, @code{fround}, and +@code{ftruncate} take a floating point argument and return a floating +point result whose value is a nearby integer. @code{ffloor} returns the +nearest integer below; @code{fceiling}, the nearest integer above; +@code{ftruncate}, the nearest integer in the direction towards zero; +@code{fround}, the nearest integer. + +@defun ffloor float +This function rounds @var{float} to the next lower integral value, and +returns that value as a floating point number. +@end defun + +@defun fceiling float +This function rounds @var{float} to the next higher integral value, and +returns that value as a floating point number. +@end defun + +@defun ftruncate float +This function rounds @var{float} towards zero to an integral value, and +returns that value as a floating point number. +@end defun + +@defun fround float +This function rounds @var{float} to the nearest integral value, +and returns that value as a floating point number. +@end defun + +@node Bitwise Operations +@section Bitwise Operations on Integers +@cindex bitwise arithmetic +@cindex logical arithmetic + + In a computer, an integer is represented as a binary number, a +sequence of @dfn{bits} (digits which are either zero or one). A bitwise +operation acts on the individual bits of such a sequence. For example, +@dfn{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. + +@defun lsh integer1 count +@cindex logical shift +@code{lsh}, which is an abbreviation for @dfn{logical shift}, shifts the +bits in @var{integer1} to the left @var{count} places, or to the right +if @var{count} is negative, bringing zeros into the vacated bits. If +@var{count} is negative, @code{lsh} shifts zeros into the leftmost +(most-significant) bit, producing a positive result even if +@var{integer1} is negative. Contrast this with @code{ash}, below. + +Here are two examples of @code{lsh}, shifting a pattern of bits one +place to the left. We show only the low-order eight bits of the binary +pattern; the rest are all zero. + +@example +@group +(lsh 5 1) + @result{} 10 +;; @r{Decimal 5 becomes decimal 10.} +00000101 @result{} 00001010 + +(lsh 7 1) + @result{} 14 +;; @r{Decimal 7 becomes decimal 14.} +00000111 @result{} 00001110 +@end group +@end example + +@noindent +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. + +Shifting a pattern of bits two places to the left produces results +like this (with 8-bit binary numbers): + +@example +@group +(lsh 3 2) + @result{} 12 +;; @r{Decimal 3 becomes decimal 12.} +00000011 @result{} 00001100 +@end group +@end example + +On the other hand, shifting one place to the right looks like this: + +@example +@group +(lsh 6 -1) + @result{} 3 +;; @r{Decimal 6 becomes decimal 3.} +00000110 @result{} 00000011 +@end group + +@group +(lsh 5 -1) + @result{} 2 +;; @r{Decimal 5 becomes decimal 2.} +00000101 @result{} 00000010 +@end group +@end example + +@noindent +As the example illustrates, shifting one place to the right divides the +value of a positive integer by two, rounding downward. + +The function @code{lsh}, like all Emacs Lisp arithmetic functions, does +not check for overflow, so shifting left can discard significant bits +and change the sign of the number. For example, left shifting +268,435,455 produces @minus{}2 on a 29-bit machine: + +@example +(lsh 268435455 1) ; @r{left shift} + @result{} -2 +@end example + +In binary, in the 29-bit implementation, the argument looks like this: + +@example +@group +;; @r{Decimal 268,435,455} +0 1111 1111 1111 1111 1111 1111 1111 +@end group +@end example + +@noindent +which becomes the following when left shifted: + +@example +@group +;; @r{Decimal @minus{}2} +1 1111 1111 1111 1111 1111 1111 1110 +@end group +@end example +@end defun + +@defun ash integer1 count +@cindex arithmetic shift +@code{ash} (@dfn{arithmetic shift}) shifts the bits in @var{integer1} +to the left @var{count} places, or to the right if @var{count} +is negative. + +@code{ash} gives the same results as @code{lsh} except when +@var{integer1} and @var{count} are both negative. In that case, +@code{ash} puts ones in the empty bit positions on the left, while +@code{lsh} puts zeros in those bit positions. + +Thus, with @code{ash}, shifting the pattern of bits one place to the right +looks like this: + +@example +@group +(ash -6 -1) @result{} -3 +;; @r{Decimal @minus{}6 becomes decimal @minus{}3.} +1 1111 1111 1111 1111 1111 1111 1010 + @result{} +1 1111 1111 1111 1111 1111 1111 1101 +@end group +@end example + +In contrast, shifting the pattern of bits one place to the right with +@code{lsh} looks like this: + +@example +@group +(lsh -6 -1) @result{} 268435453 +;; @r{Decimal @minus{}6 becomes decimal 268,435,453.} +1 1111 1111 1111 1111 1111 1111 1010 + @result{} +0 1111 1111 1111 1111 1111 1111 1101 +@end group +@end example + +Here are other examples: + +@c !!! Check if lined up in smallbook format! XDVI shows problem +@c with smallbook but not with regular book! --rjc 16mar92 +@smallexample +@group + ; @r{ 29-bit binary values} + +(lsh 5 2) ; 5 = @r{0 0000 0000 0000 0000 0000 0000 0101} + @result{} 20 ; = @r{0 0000 0000 0000 0000 0000 0001 0100} +@end group +@group +(ash 5 2) + @result{} 20 +(lsh -5 2) ; -5 = @r{1 1111 1111 1111 1111 1111 1111 1011} + @result{} -20 ; = @r{1 1111 1111 1111 1111 1111 1110 1100} +(ash -5 2) + @result{} -20 +@end group +@group +(lsh 5 -2) ; 5 = @r{0 0000 0000 0000 0000 0000 0000 0101} + @result{} 1 ; = @r{0 0000 0000 0000 0000 0000 0000 0001} +@end group +@group +(ash 5 -2) + @result{} 1 +@end group +@group +(lsh -5 -2) ; -5 = @r{1 1111 1111 1111 1111 1111 1111 1011} + @result{} 134217726 ; = @r{0 0111 1111 1111 1111 1111 1111 1110} +@end group +@group +(ash -5 -2) ; -5 = @r{1 1111 1111 1111 1111 1111 1111 1011} + @result{} -2 ; = @r{1 1111 1111 1111 1111 1111 1111 1110} +@end group +@end smallexample +@end defun + +@defun logand &rest ints-or-markers +This function returns the ``logical and'' of the arguments: the +@var{n}th bit is set in the result if, and only if, the @var{n}th 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. + +@noindent +Therefore, + +@example +@group +(logand 13 12) + @result{} 12 +@end group +@end example + +If @code{logand} is not passed any argument, it returns a value of +@minus{}1. This number is an identity element for @code{logand} +because its binary representation consists entirely of ones. If +@code{logand} is passed just one argument, it returns that argument. + +@smallexample +@group + ; @r{ 29-bit binary values} + +(logand 14 13) ; 14 = @r{0 0000 0000 0000 0000 0000 0000 1110} + ; 13 = @r{0 0000 0000 0000 0000 0000 0000 1101} + @result{} 12 ; 12 = @r{0 0000 0000 0000 0000 0000 0000 1100} +@end group + +@group +(logand 14 13 4) ; 14 = @r{0 0000 0000 0000 0000 0000 0000 1110} + ; 13 = @r{0 0000 0000 0000 0000 0000 0000 1101} + ; 4 = @r{0 0000 0000 0000 0000 0000 0000 0100} + @result{} 4 ; 4 = @r{0 0000 0000 0000 0000 0000 0000 0100} +@end group + +@group +(logand) + @result{} -1 ; -1 = @r{1 1111 1111 1111 1111 1111 1111 1111} +@end group +@end smallexample +@end defun + +@defun logior &rest ints-or-markers +This function returns the ``inclusive or'' of its arguments: the @var{n}th bit +is set in the result if, and only if, the @var{n}th 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 @code{logior} is +passed just one argument, it returns that argument. + +@smallexample +@group + ; @r{ 29-bit binary values} + +(logior 12 5) ; 12 = @r{0 0000 0000 0000 0000 0000 0000 1100} + ; 5 = @r{0 0000 0000 0000 0000 0000 0000 0101} + @result{} 13 ; 13 = @r{0 0000 0000 0000 0000 0000 0000 1101} +@end group + +@group +(logior 12 5 7) ; 12 = @r{0 0000 0000 0000 0000 0000 0000 1100} + ; 5 = @r{0 0000 0000 0000 0000 0000 0000 0101} + ; 7 = @r{0 0000 0000 0000 0000 0000 0000 0111} + @result{} 15 ; 15 = @r{0 0000 0000 0000 0000 0000 0000 1111} +@end group +@end smallexample +@end defun + +@defun logxor &rest ints-or-markers +This function returns the ``exclusive or'' of its arguments: the +@var{n}th bit is set in the result if, and only if, the @var{n}th bit is +set in an odd number of the arguments. If there are no arguments, the +result is 0, which is an identity element for this operation. If +@code{logxor} is passed just one argument, it returns that argument. + +@smallexample +@group + ; @r{ 29-bit binary values} + +(logxor 12 5) ; 12 = @r{0 0000 0000 0000 0000 0000 0000 1100} + ; 5 = @r{0 0000 0000 0000 0000 0000 0000 0101} + @result{} 9 ; 9 = @r{0 0000 0000 0000 0000 0000 0000 1001} +@end group + +@group +(logxor 12 5 7) ; 12 = @r{0 0000 0000 0000 0000 0000 0000 1100} + ; 5 = @r{0 0000 0000 0000 0000 0000 0000 0101} + ; 7 = @r{0 0000 0000 0000 0000 0000 0000 0111} + @result{} 14 ; 14 = @r{0 0000 0000 0000 0000 0000 0000 1110} +@end group +@end smallexample +@end defun + +@defun lognot integer +This function returns the logical complement of its argument: the @var{n}th +bit is one in the result if, and only if, the @var{n}th bit is zero in +@var{integer}, and vice-versa. + +@example +(lognot 5) + @result{} -6 +;; 5 = @r{0 0000 0000 0000 0000 0000 0000 0101} +;; @r{becomes} +;; -6 = @r{1 1111 1111 1111 1111 1111 1111 1010} +@end example +@end defun + +@node Math Functions +@section Standard Mathematical Functions +@cindex transcendental functions +@cindex mathematical functions +@cindex floating-point functions + + These mathematical functions allow integers as well as floating point +numbers as arguments. + +@defun sin arg +@defunx cos arg +@defunx tan arg +These are the ordinary trigonometric functions, with argument measured +in radians. +@end defun + +@defun asin arg +The value of @code{(asin @var{arg})} is a number between +@ifnottex +@minus{}pi/2 +@end ifnottex +@tex +@math{-\pi/2} +@end tex +and +@ifnottex +pi/2 +@end ifnottex +@tex +@math{\pi/2} +@end tex +(inclusive) whose sine is @var{arg}; if, however, @var{arg} is out of +range (outside [@minus{}1, 1]), it signals a @code{domain-error} error. +@end defun + +@defun acos arg +The value of @code{(acos @var{arg})} is a number between 0 and +@ifnottex +pi +@end ifnottex +@tex +@math{\pi} +@end tex +(inclusive) whose cosine is @var{arg}; if, however, @var{arg} is out +of range (outside [@minus{}1, 1]), it signals a @code{domain-error} error. +@end defun + +@defun atan y &optional x +The value of @code{(atan @var{y})} is a number between +@ifnottex +@minus{}pi/2 +@end ifnottex +@tex +@math{-\pi/2} +@end tex +and +@ifnottex +pi/2 +@end ifnottex +@tex +@math{\pi/2} +@end tex +(exclusive) whose tangent is @var{y}. If the optional second +argument @var{x} is given, the value of @code{(atan y x)} is the +angle in radians between the vector @code{[@var{x}, @var{y}]} and the +@code{X} axis. +@end defun + +@defun exp arg +This is the exponential function; it returns +@tex +@math{e} +@end tex +@ifnottex +@i{e} +@end ifnottex +to the power @var{arg}. +@tex +@math{e} +@end tex +@ifnottex +@i{e} +@end ifnottex +is a fundamental mathematical constant also called the base of natural +logarithms. +@end defun + +@defun log arg &optional base +This function returns the logarithm of @var{arg}, with base @var{base}. +If you don't specify @var{base}, the base +@tex +@math{e} +@end tex +@ifnottex +@i{e} +@end ifnottex +is used. If @var{arg} is negative, it signals a @code{domain-error} +error. +@end defun + +@ignore +@defun expm1 arg +This function returns @code{(1- (exp @var{arg}))}, but it is more +accurate than that when @var{arg} is negative and @code{(exp @var{arg})} +is close to 1. +@end defun + +@defun log1p arg +This function returns @code{(log (1+ @var{arg}))}, but it is more +accurate than that when @var{arg} is so small that adding 1 to it would +lose accuracy. +@end defun +@end ignore + +@defun log10 arg +This function returns the logarithm of @var{arg}, with base 10. If +@var{arg} is negative, it signals a @code{domain-error} error. +@code{(log10 @var{x})} @equiv{} @code{(log @var{x} 10)}, at least +approximately. +@end defun + +@defun expt x y +This function returns @var{x} raised to power @var{y}. If both +arguments are integers and @var{y} is positive, the result is an +integer; in this case, overflow causes truncation, so watch out. +@end defun + +@defun sqrt arg +This returns the square root of @var{arg}. If @var{arg} is negative, +it signals a @code{domain-error} error. +@end defun + +@node Random Numbers +@section Random Numbers +@cindex random numbers + +A deterministic computer program cannot generate true random numbers. +For most purposes, @dfn{pseudo-random numbers} suffice. A series of +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. +Starting from any given seed, the @code{random} function always +generates the same sequence of numbers. Emacs always starts with the +same seed value, so the sequence of values of @code{random} is actually +the same in each Emacs run! For example, in one operating system, the +first call to @code{(random)} after you start Emacs always returns +@minus{}1457731, and the second one always returns @minus{}7692030. This +repeatability is helpful for debugging. + +If you want random numbers that don't always come out the same, execute +@code{(random t)}. This chooses a new seed based on the current time of +day and on Emacs's process @acronym{ID} number. + +@defun random &optional limit +This function returns a pseudo-random integer. Repeated calls return a +series of pseudo-random integers. + +If @var{limit} is a positive integer, the value is chosen to be +nonnegative and less than @var{limit}. + +If @var{limit} is @code{t}, it means to choose a new seed based on the +current time of day and on Emacs's process @acronym{ID} number. +@c "Emacs'" is incorrect usage! + +On some machines, any integer representable in Lisp may be the result +of @code{random}. On other machines, the result can never be larger +than a certain maximum or less than a certain (negative) minimum. +@end defun + +@ignore + arch-tag: 574e8dd2-d513-4616-9844-c9a27869782e +@end ignore diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi new file mode 100644 index 00000000000..e75cde70202 --- /dev/null +++ b/doc/lispref/objects.texi @@ -0,0 +1,2036 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/objects +@node Lisp Data Types, Numbers, Introduction, Top +@chapter Lisp Data Types +@cindex object +@cindex Lisp object +@cindex type +@cindex data type + + A Lisp @dfn{object} is a piece of data used and manipulated by Lisp +programs. For our purposes, a @dfn{type} or @dfn{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. + +@cindex primitive type + A few fundamental object types are built into Emacs. These, from +which all other types are constructed, are called @dfn{primitive types}. +Each object belongs to one and only one primitive type. These types +include @dfn{integer}, @dfn{float}, @dfn{cons}, @dfn{symbol}, +@dfn{string}, @dfn{vector}, @dfn{hash-table}, @dfn{subr}, and +@dfn{byte-code function}, plus several special types, such as +@dfn{buffer}, that are related to editing. (@xref{Editing Types}.) + + Each primitive type has a corresponding Lisp function that checks +whether an object is a member of that type. + + Note that Lisp is unlike many other languages in that Lisp objects are +@dfn{self-typing}: the primitive type of the object is implicit in the +object itself. For example, if an object is a vector, nothing can treat +it as a number; 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. A Lisp +variable can have any type of value, and it remembers whatever value +you store in it, type and all. (Actually, a small number of Emacs +Lisp variables can only take on values of a certain type. +@xref{Variables with Restricted Values}.) + + 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. + +@menu +* Printed Representation:: How Lisp objects are represented as text. +* Comments:: Comments and their formatting conventions. +* Programming Types:: Types found in all Lisp systems. +* Editing Types:: Types specific to Emacs. +* Circular Objects:: Read syntax for circular structure. +* Type Predicates:: Tests related to types. +* Equality Predicates:: Tests of equality between any two objects. +@end menu + +@node Printed Representation +@comment node-name, next, previous, up +@section Printed Representation and Read Syntax +@cindex printed representation +@cindex read syntax + + The @dfn{printed representation} of an object is the format of the +output generated by the Lisp printer (the function @code{prin1}) for +that object. Every data type has a unique printed representation. +The @dfn{read syntax} of an object is the format of the input accepted +by the Lisp reader (the function @code{read}) for that object. This +is not necessarily unique; many kinds of object have more than one +syntax. @xref{Read and Print}. + +@cindex hash notation + In most cases, an object's printed representation is also a read +syntax for the object. However, some types have no read syntax, since +it does not make sense to enter objects of these types as constants in +a Lisp program. These objects are printed in @dfn{hash notation}, +which consists of the characters @samp{#<}, a descriptive string +(typically the type name followed by the name of the object), and a +closing @samp{>}. For example: + +@example +(current-buffer) + @result{} #<buffer objects.texi> +@end example + +@noindent +Hash notation cannot be read at all, so the Lisp reader signals the +error @code{invalid-read-syntax} whenever it encounters @samp{#<}. +@kindex invalid-read-syntax + + 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. + + 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 (@pxref{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. @xref{Input Functions}, for a description of +@code{read}, the basic function for reading objects. + +@node Comments +@comment node-name, next, previous, up +@section Comments +@cindex comments +@cindex @samp{;} in comment + + A @dfn{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 semicolon (@samp{;}) starts a comment if it +is not within a string or character constant. The comment continues to +the end of line. The Lisp reader discards comments; they do not become +part of the Lisp objects which represent the program within the Lisp +system. + + The @samp{#@@@var{count}} construct, which skips the next @var{count} +characters, is useful for program-generated comments containing binary +data. The Emacs Lisp byte compiler uses this in its output files +(@pxref{Byte Compilation}). It isn't meant for source files, however. + + @xref{Comment Tips}, for conventions for formatting comments. + +@node Programming Types +@section Programming Types +@cindex 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 exist in many Lisp implementations, in one form or another. The +latter are unique to Emacs Lisp. + +@menu +* Integer Type:: Numbers without fractional parts. +* Floating Point Type:: Numbers with fractional parts and with a large range. +* Character Type:: The representation of letters, numbers and + control characters. +* Symbol Type:: A multi-use object that refers to a function, + variable, or property list, and has a unique identity. +* Sequence Type:: Both lists and arrays are classified as sequences. +* Cons Cell Type:: Cons cells, and lists (which are made from cons cells). +* Array Type:: Arrays include strings and vectors. +* String Type:: An (efficient) array of characters. +* Vector Type:: One-dimensional arrays. +* Char-Table Type:: One-dimensional sparse arrays indexed by characters. +* Bool-Vector Type:: One-dimensional arrays of @code{t} or @code{nil}. +* Hash Table Type:: Super-fast lookup tables. +* Function Type:: A piece of executable code you can call from elsewhere. +* Macro Type:: A method of expanding an expression into another + expression, more fundamental but less pretty. +* Primitive Function Type:: A function written in C, callable from Lisp. +* Byte-Code Type:: A function written in Lisp, then compiled. +* Autoload Type:: A type used for automatically loading seldom-used + functions. +@end menu + +@node Integer Type +@subsection Integer Type + + The range of values for integers in Emacs Lisp is @minus{}268435456 to +268435455 (29 bits; i.e., +@ifnottex +-2**28 +@end ifnottex +@tex +@math{-2^{28}} +@end tex +to +@ifnottex +2**28 - 1) +@end ifnottex +@tex +@math{2^{28}-1}) +@end tex +on most machines. (Some machines may provide a wider range.) It is +important to note that the Emacs Lisp arithmetic functions do not check +for overflow. Thus @code{(1+ 268435455)} is @minus{}268435456 on most +machines. + + The read syntax for integers is a sequence of (base ten) digits with an +optional sign at the beginning and an optional period at the end. The +printed representation produced by the Lisp interpreter never has a +leading @samp{+} or a final @samp{.}. + +@example +@group +-1 ; @r{The integer -1.} +1 ; @r{The integer 1.} +1. ; @r{Also the integer 1.} ++1 ; @r{Also the integer 1.} +536870913 ; @r{Also the integer 1 on a 29-bit implementation.} +@end group +@end example + + @xref{Numbers}, for more information. + +@node Floating Point Type +@subsection Floating Point Type + + Floating point numbers are the computer equivalent of scientific +notation; you can think of a floating point number as a fraction +together with a power of ten. The precise number of significant +figures and the range of possible exponents is machine-specific; Emacs +uses the C data type @code{double} to store the value, and internally +this records a power of 2 rather than a power of 10. + + The printed representation for floating point numbers requires either +a decimal point (with at least one digit following), an exponent, or +both. For example, @samp{1500.0}, @samp{15e2}, @samp{15.0e2}, +@samp{1.5e3}, and @samp{.15e4} are five ways of writing a floating point +number whose value is 1500. They are all equivalent. + + @xref{Numbers}, for more information. + +@node Character Type +@subsection Character Type +@cindex @acronym{ASCII} character codes + + A @dfn{character} in Emacs Lisp is nothing more than an integer. In +other words, characters are represented by their character codes. For +example, the character @kbd{A} is represented as the @w{integer 65}. + + Individual characters are used occasionally in programs, but it is +more common to work with @emph{strings}, which are sequences composed +of characters. @xref{String Type}. + + Characters in strings, buffers, and files are currently limited to +the range of 0 to 524287---nineteen bits. But not all values in that +range are valid character codes. Codes 0 through 127 are +@acronym{ASCII} codes; the rest are non-@acronym{ASCII} +(@pxref{Non-ASCII Characters}). Characters that represent keyboard +input have a much wider range, to encode modifier keys such as +Control, Meta and Shift. + + There are special functions for producing a human-readable textual +description of a character for the sake of messages. @xref{Describing +Characters}. + +@menu +* Basic Char Syntax:: +* General Escape Syntax:: +* Ctl-Char Syntax:: +* Meta-Char Syntax:: +* Other Char Bits:: +@end menu + +@node Basic Char Syntax +@subsubsection Basic Char Syntax +@cindex read syntax for characters +@cindex printed representation for characters +@cindex syntax for characters +@cindex @samp{?} in character constant +@cindex question mark in character constant + + 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 writing characters that way in Lisp programs is +not clear programming. You should @emph{always} use the special read +syntax formats that Emacs Lisp provides for characters. These syntax +formats start with a question mark. + + The usual read syntax for alphanumeric characters is a question mark +followed by the character; thus, @samp{?A} for the character +@kbd{A}, @samp{?B} for the character @kbd{B}, and @samp{?a} for the +character @kbd{a}. + + For example: + +@example +?Q @result{} 81 ?q @result{} 113 +@end example + + You can use the same syntax for punctuation characters, but it is +often a good idea to add a @samp{\} so that the Emacs commands for +editing Lisp code don't get confused. For example, @samp{?\(} is the +way to write the open-paren character. If the character is @samp{\}, +you @emph{must} use a second @samp{\} to quote it: @samp{?\\}. + +@cindex whitespace +@cindex bell character +@cindex @samp{\a} +@cindex backspace +@cindex @samp{\b} +@cindex tab (ASCII character) +@cindex @samp{\t} +@cindex vertical tab +@cindex @samp{\v} +@cindex formfeed +@cindex @samp{\f} +@cindex newline +@cindex @samp{\n} +@cindex return (ASCII character) +@cindex @samp{\r} +@cindex escape (ASCII character) +@cindex @samp{\e} +@cindex space (ASCII character) +@cindex @samp{\s} + You can express the characters control-g, backspace, tab, newline, +vertical tab, formfeed, space, return, del, and escape as @samp{?\a}, +@samp{?\b}, @samp{?\t}, @samp{?\n}, @samp{?\v}, @samp{?\f}, +@samp{?\s}, @samp{?\r}, @samp{?\d}, and @samp{?\e}, respectively. +(@samp{?\s} followed by a dash has a different meaning---it applies +the ``super'' modifier to the following character.) Thus, + +@example +?\a @result{} 7 ; @r{control-g, @kbd{C-g}} +?\b @result{} 8 ; @r{backspace, @key{BS}, @kbd{C-h}} +?\t @result{} 9 ; @r{tab, @key{TAB}, @kbd{C-i}} +?\n @result{} 10 ; @r{newline, @kbd{C-j}} +?\v @result{} 11 ; @r{vertical tab, @kbd{C-k}} +?\f @result{} 12 ; @r{formfeed character, @kbd{C-l}} +?\r @result{} 13 ; @r{carriage return, @key{RET}, @kbd{C-m}} +?\e @result{} 27 ; @r{escape character, @key{ESC}, @kbd{C-[}} +?\s @result{} 32 ; @r{space character, @key{SPC}} +?\\ @result{} 92 ; @r{backslash character, @kbd{\}} +?\d @result{} 127 ; @r{delete character, @key{DEL}} +@end example + +@cindex escape sequence + These sequences which start with backslash are also known as +@dfn{escape sequences}, because backslash plays the role of an +``escape character''; this terminology has nothing to do with the +character @key{ESC}. @samp{\s} is meant for use in character +constants; in string constants, just write the space. + + A backslash is allowed, and harmless, preceding any character without +a special escape meaning; thus, @samp{?\+} is equivalent to @samp{?+}. +There is no reason to add a backslash before most characters. However, +you should add a backslash before any of the characters +@samp{()\|;'`"#.,} to avoid confusing the Emacs commands for editing +Lisp code. You can also add a backslash before whitespace characters such as +space, tab, newline and formfeed. However, it is cleaner to use one of +the easily readable escape sequences, such as @samp{\t} or @samp{\s}, +instead of an actual whitespace character such as a tab or a space. +(If you do write backslash followed by a space, you should write +an extra space after the character constant to separate it from the +following text.) + +@node General Escape Syntax +@subsubsection General Escape Syntax + + In addition to the specific excape sequences for special important +control characters, Emacs provides general categories of escape syntax +that you can use to specify non-ASCII text characters. + +@cindex unicode character escape + For instance, you can specify characters by their Unicode values. +@code{?\u@var{nnnn}} represents a character that maps to the Unicode +code point @samp{U+@var{nnnn}}. There is a slightly different syntax +for specifying characters with code points above @code{#xFFFF}; +@code{\U00@var{nnnnnn}} represents the character whose Unicode code +point is @samp{U+@var{nnnnnn}}, if such a character is supported by +Emacs. If the corresponding character is not supported, Emacs signals +an error. + + This peculiar and inconvenient syntax was adopted for compatibility +with other programming languages. Unlike some other languages, Emacs +Lisp supports this syntax in only character literals and strings. + +@cindex @samp{\} in character constant +@cindex backslash in character constant +@cindex octal character code + The most general read syntax for a character represents the +character code in either octal or hex. To use octal, write a question +mark followed by a backslash and the octal character code (up to three +octal digits); thus, @samp{?\101} for the character @kbd{A}, +@samp{?\001} for the character @kbd{C-a}, and @code{?\002} for the +character @kbd{C-b}. Although this syntax can represent any +@acronym{ASCII} character, it is preferred only when the precise octal +value is more important than the @acronym{ASCII} representation. + +@example +@group +?\012 @result{} 10 ?\n @result{} 10 ?\C-j @result{} 10 +?\101 @result{} 65 ?A @result{} 65 +@end group +@end example + + To use hex, write a question mark followed by a backslash, @samp{x}, +and the hexadecimal character code. You can use any number of hex +digits, so you can represent any character code in this way. +Thus, @samp{?\x41} for the character @kbd{A}, @samp{?\x1} for the +character @kbd{C-a}, and @code{?\x8e0} for the Latin-1 character +@iftex +@samp{@`a}. +@end iftex +@ifnottex +@samp{a} with grave accent. +@end ifnottex + +@node Ctl-Char Syntax +@subsubsection Control-Character Syntax + +@cindex control characters + Control characters can 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, both @samp{?\^I} and @samp{?\^i} are valid read syntax for the +character @kbd{C-i}, the character whose value is 9. + + Instead of the @samp{^}, you can use @samp{C-}; thus, @samp{?\C-i} is +equivalent to @samp{?\^I} and to @samp{?\^i}: + +@example +?\^I @result{} 9 ?\C-I @result{} 9 +@end example + + In strings and buffers, the only control characters allowed are those +that exist in @acronym{ASCII}; but for keyboard input purposes, you can turn +any character into a control character with @samp{C-}. The character +codes for these non-@acronym{ASCII} control characters include the +@tex +@math{2^{26}} +@end tex +@ifnottex +2**26 +@end ifnottex +bit as well as the code for the corresponding non-control +character. Ordinary terminals have no way of generating non-@acronym{ASCII} +control characters, but you can generate them straightforwardly using X +and other window systems. + + For historical reasons, Emacs treats the @key{DEL} character as +the control equivalent of @kbd{?}: + +@example +?\^? @result{} 127 ?\C-? @result{} 127 +@end example + +@noindent +As a result, it is currently not possible to represent the character +@kbd{Control-?}, which is a meaningful input character under X, using +@samp{\C-}. It is not easy to change this, as various Lisp files refer +to @key{DEL} in this way. + + For representing control characters to be found in files or strings, +we recommend the @samp{^} syntax; for control characters in keyboard +input, we prefer the @samp{C-} syntax. Which one you use does not +affect the meaning of the program, but may guide the understanding of +people who read it. + +@node Meta-Char Syntax +@subsubsection Meta-Character Syntax + +@cindex meta characters + A @dfn{meta character} is a character typed with the @key{META} +modifier key. The integer that represents such a character has the +@tex +@math{2^{27}} +@end tex +@ifnottex +2**27 +@end ifnottex +bit set. We use high bits for this and other modifiers to make +possible a wide range of basic character codes. + + In a string, the +@tex +@math{2^{7}} +@end tex +@ifnottex +2**7 +@end ifnottex +bit attached to an @acronym{ASCII} character indicates a meta +character; thus, the meta characters that can fit in a string have +codes in the range from 128 to 255, and are the meta versions of the +ordinary @acronym{ASCII} characters. (In Emacs versions 18 and older, +this convention was used for characters outside of strings as well.) + + The read syntax for meta characters uses @samp{\M-}. For example, +@samp{?\M-A} stands for @kbd{M-A}. You can use @samp{\M-} together with +octal character codes (see below), with @samp{\C-}, or with any other +syntax for a character. Thus, you can write @kbd{M-A} as @samp{?\M-A}, +or as @samp{?\M-\101}. Likewise, you can write @kbd{C-M-b} as +@samp{?\M-\C-b}, @samp{?\C-\M-b}, or @samp{?\M-\002}. + +@node Other Char Bits +@subsubsection Other Character Modifier Bits + + The case of a graphic character is indicated by its character code; +for example, @acronym{ASCII} distinguishes between the characters @samp{a} +and @samp{A}. But @acronym{ASCII} has no way to represent whether a control +character is upper case or lower case. Emacs uses the +@tex +@math{2^{25}} +@end tex +@ifnottex +2**25 +@end ifnottex +bit to indicate that the shift key was used in typing a control +character. This distinction is possible only when you use X terminals +or other special terminals; ordinary terminals do not report the +distinction to the computer in any way. The Lisp syntax for +the shift bit is @samp{\S-}; thus, @samp{?\C-\S-o} or @samp{?\C-\S-O} +represents the shifted-control-o character. + +@cindex hyper characters +@cindex super characters +@cindex alt characters + The X Window System defines three other +@anchor{modifier bits}modifier bits that can be set +in a character: @dfn{hyper}, @dfn{super} and @dfn{alt}. The syntaxes +for these bits are @samp{\H-}, @samp{\s-} and @samp{\A-}. (Case is +significant in these prefixes.) Thus, @samp{?\H-\M-\A-x} represents +@kbd{Alt-Hyper-Meta-x}. (Note that @samp{\s} with no following @samp{-} +represents the space character.) +@tex +Numerically, the bit values are @math{2^{22}} for alt, @math{2^{23}} +for super and @math{2^{24}} for hyper. +@end tex +@ifnottex +Numerically, the +bit values are 2**22 for alt, 2**23 for super and 2**24 for hyper. +@end ifnottex + +@node Symbol Type +@subsection Symbol Type + + A @dfn{symbol} in GNU Emacs Lisp is an object with a name. The +symbol name serves as the printed representation of the symbol. In +ordinary Lisp use, with one single obarray (@pxref{Creating Symbols}, +a symbol's name is unique---no two symbols have the same name. + + A symbol can serve as a variable, as a function name, or to hold a +property list. 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. But you can use one symbol in all of these ways, +independently. + + A symbol whose name starts with a colon (@samp{:}) is called a +@dfn{keyword symbol}. These symbols automatically act as constants, and +are normally used only by comparing an unknown symbol with a few +specific alternatives. + +@cindex @samp{\} in symbols +@cindex backslash in symbols + A symbol name can contain any characters whatever. Most symbol names +are written with letters, digits, and the punctuation characters +@samp{-+=*/}. 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 @samp{\} at the beginning of the name to force +interpretation as a symbol.) The characters @samp{_~!@@$%^&:<>@{@}?} 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 simply quotes the single character that follows the +backslash. For example, in a string, @samp{\t} represents a tab +character; in the name of a symbol, however, @samp{\t} merely quotes the +letter @samp{t}. To have a symbol with a tab character in its name, you +must actually use a tab (preceded with a backslash). But it's rare to +do such a thing. + +@cindex CL note---case of letters +@quotation +@b{Common Lisp note:} In Common Lisp, lower case letters are always +``folded'' to upper case, unless they are explicitly escaped. In Emacs +Lisp, upper case and lower case letters are distinct. +@end quotation + + Here are several examples of symbol names. Note that the @samp{+} in +the fifth example is escaped to prevent it from being read as a number. +This is not necessary in the fourth example because the rest of the name +makes it invalid as a number. + +@example +@group +foo ; @r{A symbol named @samp{foo}.} +FOO ; @r{A symbol named @samp{FOO}, different from @samp{foo}.} +char-to-string ; @r{A symbol named @samp{char-to-string}.} +@end group +@group +1+ ; @r{A symbol named @samp{1+}} + ; @r{(not @samp{+1}, which is an integer).} +@end group +@group +\+1 ; @r{A symbol named @samp{+1}} + ; @r{(not a very readable name).} +@end group +@group +\(*\ 1\ 2\) ; @r{A symbol named @samp{(* 1 2)} (a worse name).} +@c the @'s in this next line use up three characters, hence the +@c apparent misalignment of the comment. ++-*/_~!@@$%^&=:<>@{@} ; @r{A symbol named @samp{+-*/_~!@@$%^&=:<>@{@}}.} + ; @r{These characters need not be escaped.} +@end group +@end example + +@ifinfo +@c This uses ``colon'' instead of a literal `:' because Info cannot +@c cope with a `:' in a menu +@cindex @samp{#@var{colon}} read syntax +@end ifinfo +@ifnotinfo +@cindex @samp{#:} read syntax +@end ifnotinfo + Normally the Lisp reader interns all symbols (@pxref{Creating +Symbols}). To prevent interning, you can write @samp{#:} before the +name of the symbol. + +@node Sequence Type +@subsection Sequence Types + + A @dfn{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, vectors, char-tables and +bool-vectors. Vectors can hold elements of any type, but string +elements must be characters, and bool-vector elements must be @code{t} +or @code{nil}. Char-tables are like vectors except that they are +indexed by any valid character code. The characters in a string can +have text properties like characters in a buffer (@pxref{Text +Properties}), but vectors do not support text properties, even when +their elements happen to be characters. + + Lists, strings and the other array types are different, but they have +important similarities. For example, all have a length @var{l}, and all +have elements which can be indexed from zero to @var{l} minus one. +Several functions, called sequence functions, accept any kind of +sequence. For example, the function @code{elt} can be used to extract +an element of a sequence, given its index. @xref{Sequences Arrays +Vectors}. + + It is generally impossible to read the same sequence twice, since +sequences are always created anew upon reading. If you read the read +syntax for a sequence twice, you get two sequences with equal contents. +There is one exception: the empty list @code{()} always stands for the +same object, @code{nil}. + +@node Cons Cell Type +@subsection Cons Cell and List Types +@cindex address field of register +@cindex decrement field of register +@cindex pointers + + A @dfn{cons cell} is an object that consists of two slots, called the +@sc{car} slot and the @sc{cdr} slot. Each slot can @dfn{hold} or +@dfn{refer to} any Lisp object. We also say that ``the @sc{car} of +this cons cell is'' whatever object its @sc{car} slot currently holds, +and likewise for the @sc{cdr}. + +@quotation +A note to C programmers: in Lisp, we do not distinguish between +``holding'' a value and ``pointing to'' the value, because pointers in +Lisp are implicit. +@end quotation + + A @dfn{list} is a series of cons cells, linked together so that the +@sc{cdr} slot of each cons cell holds either the next cons cell or the +empty list. The empty list is actually the symbol @code{nil}. +@xref{Lists}, for functions that work on lists. Because most cons +cells are used as part of lists, the phrase @dfn{list structure} has +come to refer to any structure made out of cons cells. + +@cindex atoms + 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 +@dfn{atoms}. + +@cindex parenthesis +@cindex @samp{(@dots{})} in lists + 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. Here are examples of lists: + +@example +(A 2 "A") ; @r{A list of three elements.} +() ; @r{A list of no elements (the empty list).} +nil ; @r{A list of no elements (the empty list).} +("A ()") ; @r{A list of one element: the string @code{"A ()"}.} +(A ()) ; @r{A list of two elements: @code{A} and the empty list.} +(A nil) ; @r{Equivalent to the previous.} +((A B C)) ; @r{A list of one element} + ; @r{(which is a list of three elements).} +@end example + + Upon reading, each object inside the parentheses becomes an element +of the list. That is, a cons cell is made for each element. The +@sc{car} slot of the cons cell holds the element, and its @sc{cdr} +slot refers to the next cons cell of the list, which holds the next +element in the list. The @sc{cdr} slot of the last cons cell is set to +hold @code{nil}. + + The names @sc{car} and @sc{cdr} derive from the history of Lisp. The +original Lisp implementation ran on an @w{IBM 704} computer which +divided words into two parts, called the ``address'' part and the +``decrement''; @sc{car} was an instruction to extract the contents of +the address part of a register, and @sc{cdr} an instruction to extract +the contents of the decrement. By contrast, ``cons cells'' are named +for the function @code{cons} that creates them, which in turn was named +for its purpose, the construction of cells. + +@menu +* Box Diagrams:: Drawing pictures of lists. +* Dotted Pair Notation:: A general syntax for cons cells. +* Association List Type:: A specially constructed list. +@end menu + +@node Box Diagrams +@subsubsection Drawing Lists as Box Diagrams +@cindex box diagrams, for lists +@cindex diagrams, boxed, for lists + + A list can be illustrated by a diagram in which the cons cells are +shown as pairs of boxes, like dominoes. (The Lisp reader cannot read +such an illustration; unlike the textual notation, which can be +understood by both humans and computers, the box illustrations can be +understood only by humans.) This picture represents the three-element +list @code{(rose violet buttercup)}: + +@example +@group + --- --- --- --- --- --- + | | |--> | | |--> | | |--> nil + --- --- --- --- --- --- + | | | + | | | + --> rose --> violet --> buttercup +@end group +@end example + + In this diagram, each box represents a slot that can hold or refer to +any Lisp object. Each pair of boxes represents a cons cell. Each arrow +represents a reference to a Lisp object, either an atom or another cons +cell. + + In this example, the first box, which holds the @sc{car} of the first +cons cell, refers to or ``holds'' @code{rose} (a symbol). The second +box, holding the @sc{cdr} of the first cons cell, refers to the next +pair of boxes, the second cons cell. The @sc{car} of the second cons +cell is @code{violet}, and its @sc{cdr} is the third cons cell. The +@sc{cdr} of the third (and last) cons cell is @code{nil}. + + Here is another diagram of the same list, @code{(rose violet +buttercup)}, sketched in a different manner: + +@smallexample +@group + --------------- ---------------- ------------------- +| car | cdr | | car | cdr | | car | cdr | +| rose | o-------->| violet | o-------->| buttercup | nil | +| | | | | | | | | + --------------- ---------------- ------------------- +@end group +@end smallexample + +@cindex @code{nil} as a list +@cindex empty list + A list with no elements in it is the @dfn{empty list}; it is identical +to the symbol @code{nil}. In other words, @code{nil} is both a symbol +and a list. + + Here is the list @code{(A ())}, or equivalently @code{(A nil)}, +depicted with boxes and arrows: + +@example +@group + --- --- --- --- + | | |--> | | |--> nil + --- --- --- --- + | | + | | + --> A --> nil +@end group +@end example + + Here is a more complex illustration, showing the three-element list, +@code{((pine needles) oak maple)}, the first element of which is a +two-element list: + +@example +@group + --- --- --- --- --- --- + | | |--> | | |--> | | |--> nil + --- --- --- --- --- --- + | | | + | | | + | --> oak --> maple + | + | --- --- --- --- + --> | | |--> | | |--> nil + --- --- --- --- + | | + | | + --> pine --> needles +@end group +@end example + + The same list represented in the second box notation looks like this: + +@example +@group + -------------- -------------- -------------- +| car | cdr | | car | cdr | | car | cdr | +| o | o------->| oak | o------->| maple | nil | +| | | | | | | | | | + -- | --------- -------------- -------------- + | + | + | -------------- ---------------- + | | car | cdr | | car | cdr | + ------>| pine | o------->| needles | nil | + | | | | | | + -------------- ---------------- +@end group +@end example + +@node Dotted Pair Notation +@subsubsection Dotted Pair Notation +@cindex dotted pair notation +@cindex @samp{.} in lists + + @dfn{Dotted pair notation} is a general syntax for cons cells that +represents the @sc{car} and @sc{cdr} explicitly. In this syntax, +@code{(@var{a} .@: @var{b})} stands for a cons cell whose @sc{car} is +the object @var{a} and whose @sc{cdr} is the object @var{b}. Dotted +pair notation is more general than list syntax because the @sc{cdr} +does not have to be a list. However, it is more cumbersome in cases +where list syntax would work. In dotted pair notation, the list +@samp{(1 2 3)} is written as @samp{(1 . (2 . (3 . nil)))}. For +@code{nil}-terminated lists, you can use either notation, but list +notation is usually clearer and more convenient. When printing a +list, the dotted pair notation is only used if the @sc{cdr} of a cons +cell is not a list. + + Here's an example using boxes to illustrate dotted pair notation. +This example shows the pair @code{(rose . violet)}: + +@example +@group + --- --- + | | |--> violet + --- --- + | + | + --> rose +@end group +@end example + + You can combine dotted pair notation with list notation to represent +conveniently a chain of cons cells with a non-@code{nil} final @sc{cdr}. +You write a dot after the last element of the list, followed by the +@sc{cdr} of the final cons cell. For example, @code{(rose violet +. buttercup)} is equivalent to @code{(rose . (violet . buttercup))}. +The object looks like this: + +@example +@group + --- --- --- --- + | | |--> | | |--> buttercup + --- --- --- --- + | | + | | + --> rose --> violet +@end group +@end example + + The syntax @code{(rose .@: violet .@: buttercup)} is invalid because +there is nothing that it could mean. If anything, it would say to put +@code{buttercup} in the @sc{cdr} of a cons cell whose @sc{cdr} is already +used for @code{violet}. + + The list @code{(rose violet)} is equivalent to @code{(rose . (violet))}, +and looks like this: + +@example +@group + --- --- --- --- + | | |--> | | |--> nil + --- --- --- --- + | | + | | + --> rose --> violet +@end group +@end example + + Similarly, the three-element list @code{(rose violet buttercup)} +is equivalent to @code{(rose . (violet . (buttercup)))}. +@ifnottex +It looks like this: + +@example +@group + --- --- --- --- --- --- + | | |--> | | |--> | | |--> nil + --- --- --- --- --- --- + | | | + | | | + --> rose --> violet --> buttercup +@end group +@end example +@end ifnottex + +@node Association List Type +@comment node-name, next, previous, up +@subsubsection Association List Type + + An @dfn{association list} or @dfn{alist} is a specially-constructed +list whose elements are cons cells. In each element, the @sc{car} is +considered a @dfn{key}, and the @sc{cdr} is considered an +@dfn{associated value}. (In some cases, the associated value is stored +in the @sc{car} of the @sc{cdr}.) Association lists are often used as +stacks, since it is easy to add or remove associations at the front of +the list. + + For example, + +@example +(setq alist-of-colors + '((rose . red) (lily . white) (buttercup . yellow))) +@end example + +@noindent +sets the variable @code{alist-of-colors} to an alist of three elements. In the +first element, @code{rose} is the key and @code{red} is the value. + + @xref{Association Lists}, for a further explanation of alists and for +functions that work on alists. @xref{Hash Tables}, for another kind of +lookup table, which is much faster for handling a large number of keys. + +@node Array Type +@subsection Array Type + + An @dfn{array} is composed of an arbitrary number of slots for +holding or referring to other Lisp objects, arranged in a contiguous block of +memory. Accessing any element of an array takes approximately the same +amount of 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 four types of array: strings, vectors, bool-vectors, and +char-tables. + + A string is an array of characters and a vector is an array of +arbitrary objects. A bool-vector can hold only @code{t} or @code{nil}. +These kinds of array may have any length up to the largest integer. +Char-tables are sparse arrays indexed by any valid character code; they +can hold arbitrary objects. + + The first element of an array has index zero, the second element has +index 1, and so on. This is called @dfn{zero-origin} indexing. For +example, an array of four elements has indices 0, 1, 2, @w{and 3}. The +largest possible index value is one less than the length of the array. +Once an array is created, its length is fixed. + + All Emacs Lisp arrays are one-dimensional. (Most other programming +languages support multidimensional arrays, but they are not essential; +you can get the same effect with nested one-dimensional arrays.) Each +type of array has its own read syntax; see the following sections for +details. + + The array type is a subset of the sequence type, and contains the +string type, the vector type, the bool-vector type, and the char-table +type. + +@node String Type +@subsection String Type + + A @dfn{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. + + @xref{Strings and Characters}, for functions that operate on strings. + +@menu +* Syntax for Strings:: +* Non-ASCII in Strings:: +* Nonprinting Characters:: +* Text Props and Strings:: +@end menu + +@node Syntax for Strings +@subsubsection Syntax for Strings + +@cindex @samp{"} in strings +@cindex double-quote in strings +@cindex @samp{\} in strings +@cindex backslash in strings + The read syntax for strings is a double-quote, an arbitrary number of +characters, and another double-quote, @code{"like this"}. To include a +double-quote in a string, precede it with a backslash; thus, @code{"\""} +is a string containing just a single double-quote character. Likewise, +you can include a backslash by preceding it with another backslash, like +this: @code{"this \\ is a single embedded backslash"}. + +@cindex newline in strings + The newline character is not special in the read syntax for strings; +if you write a new line between the double-quotes, it becomes a +character in the string. But an escaped newline---one that is preceded +by @samp{\}---does not become part of the string; i.e., the Lisp reader +ignores an escaped newline while reading a string. An escaped space +@w{@samp{\ }} is likewise ignored. + +@example +"It is useful to include newlines +in documentation strings, +but the newline is \ +ignored if escaped." + @result{} "It is useful to include newlines +in documentation strings, +but the newline is ignored if escaped." +@end example + +@node Non-ASCII in Strings +@subsubsection Non-@acronym{ASCII} Characters in Strings + + You can include a non-@acronym{ASCII} international character in a string +constant by writing it literally. There are two text representations +for non-@acronym{ASCII} characters in Emacs strings (and in buffers): unibyte +and multibyte. If the string constant is read from a multibyte source, +such as a multibyte buffer or string, or a file that would be visited as +multibyte, then the character is read as a multibyte character, and that +makes the string multibyte. If the string constant is read from a +unibyte source, then the character is read as unibyte and that makes the +string unibyte. + + You can also represent a multibyte non-@acronym{ASCII} character with its +character code: use a hex escape, @samp{\x@var{nnnnnnn}}, with as many +digits as necessary. (Multibyte non-@acronym{ASCII} character codes are all +greater than 256.) Any character which is not a valid hex digit +terminates this construct. If the next character in the string could be +interpreted as a hex digit, write @w{@samp{\ }} (backslash and space) to +terminate the hex escape---for example, @w{@samp{\x8e0\ }} represents +one character, @samp{a} with grave accent. @w{@samp{\ }} in a string +constant is just like backslash-newline; it does not contribute any +character to the string, but it does terminate the preceding hex escape. + + You can represent a unibyte non-@acronym{ASCII} character with its +character code, which must be in the range from 128 (0200 octal) to +255 (0377 octal). If you write all such character codes in octal and +the string contains no other characters forcing it to be multibyte, +this produces a unibyte string. However, using any hex escape in a +string (even for an @acronym{ASCII} character) forces the string to be +multibyte. + + You can also specify characters in a string by their numeric values +in Unicode, using @samp{\u} and @samp{\U} (@pxref{Character Type}). + + @xref{Text Representations}, for more information about the two +text representations. + +@node Nonprinting Characters +@subsubsection Nonprinting Characters in Strings + + You can use the same backslash escape-sequences in a string constant +as in character literals (but do not use the question mark that begins a +character constant). For example, you can write a string containing the +nonprinting characters tab and @kbd{C-a}, with commas and spaces between +them, like this: @code{"\t, \C-a"}. @xref{Character Type}, for a +description of the read syntax for characters. + + However, not all of the characters you can write with backslash +escape-sequences are valid in strings. The only control characters that +a string can hold are the @acronym{ASCII} control characters. Strings do not +distinguish case in @acronym{ASCII} control characters. + + Properly speaking, strings cannot hold meta characters; but when a +string is to be used as a key sequence, there is a special convention +that provides a way to represent meta versions of @acronym{ASCII} +characters in a string. If you use the @samp{\M-} syntax to indicate +a meta character in a string constant, this sets the +@tex +@math{2^{7}} +@end tex +@ifnottex +2**7 +@end ifnottex +bit of the character in the string. If the string is used in +@code{define-key} or @code{lookup-key}, this numeric code is translated +into the equivalent meta character. @xref{Character Type}. + + Strings cannot hold characters that have the hyper, super, or alt +modifiers. + +@node Text Props and Strings +@subsubsection Text Properties in Strings + + A string can hold properties for the characters it contains, in +addition to the characters themselves. This enables programs that copy +text between strings and buffers to copy the text's properties with no +special effort. @xref{Text Properties}, for an explanation of what text +properties mean. Strings with text properties use a special read and +print syntax: + +@example +#("@var{characters}" @var{property-data}...) +@end example + +@noindent +where @var{property-data} consists of zero or more elements, in groups +of three as follows: + +@example +@var{beg} @var{end} @var{plist} +@end example + +@noindent +The elements @var{beg} and @var{end} are integers, and together specify +a range of indices in the string; @var{plist} is the property list for +that range. For example, + +@example +#("foo bar" 0 3 (face bold) 3 4 nil 4 7 (face italic)) +@end example + +@noindent +represents a string whose textual contents are @samp{foo bar}, in which +the first three characters have a @code{face} property with value +@code{bold}, and the last three have a @code{face} property with value +@code{italic}. (The fourth character has no text properties, so its +property list is @code{nil}. It is not actually necessary to mention +ranges with @code{nil} as the property list, since any characters not +mentioned in any range will default to having no properties.) + +@node Vector Type +@subsection Vector Type + + A @dfn{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. + +@example +[1 "two" (three)] ; @r{A vector of three elements.} + @result{} [1 "two" (three)] +@end example + + @xref{Vectors}, for functions that work with vectors. + +@node Char-Table Type +@subsection Char-Table Type + + A @dfn{char-table} is a one-dimensional array of elements of any type, +indexed by character codes. Char-tables have certain extra features to +make them more useful for many jobs that involve assigning information +to character codes---for example, a char-table can have a parent to +inherit from, a default value, and a small number of extra slots to use for +special purposes. A char-table can also specify a single value for +a whole character set. + + The printed representation of a char-table is like a vector +except that there is an extra @samp{#^} at the beginning. + + @xref{Char-Tables}, for special functions to operate on char-tables. +Uses of char-tables include: + +@itemize @bullet +@item +Case tables (@pxref{Case Tables}). + +@item +Character category tables (@pxref{Categories}). + +@item +Display tables (@pxref{Display Tables}). + +@item +Syntax tables (@pxref{Syntax Tables}). +@end itemize + +@node Bool-Vector Type +@subsection Bool-Vector Type + + A @dfn{bool-vector} is a one-dimensional array of elements that +must be @code{t} or @code{nil}. + + The printed representation of a bool-vector is like a string, except +that it begins with @samp{#&} followed by the length. The string +constant that follows actually specifies the contents of the bool-vector +as a bitmap---each ``character'' in the string contains 8 bits, which +specify the next 8 elements of the bool-vector (1 stands for @code{t}, +and 0 for @code{nil}). The least significant bits of the character +correspond to the lowest indices in the bool-vector. + +@example +(make-bool-vector 3 t) + @result{} #&3"^G" +(make-bool-vector 3 nil) + @result{} #&3"^@@" +@end example + +@noindent +These results make sense, because the binary code for @samp{C-g} is +111 and @samp{C-@@} is the character with code 0. + + If the length is not a multiple of 8, the printed representation +shows extra elements, but these extras really make no difference. For +instance, in the next example, the two bool-vectors are equal, because +only the first 3 bits are used: + +@example +(equal #&3"\377" #&3"\007") + @result{} t +@end example + +@node Hash Table Type +@subsection Hash Table Type + + A hash table is a very fast kind of lookup table, somewhat like an +alist in that it maps keys to corresponding values, but much faster. +Hash tables have no read syntax, and print using hash notation. +@xref{Hash Tables}, for functions that operate on hash tables. + +@example +(make-hash-table) + @result{} #<hash-table 'eql nil 0/65 0x83af980> +@end example + +@node Function Type +@subsection Function Type + + Lisp functions are executable code, just like functions in other +programming languages. In Lisp, unlike most languages, functions are +also Lisp objects. A non-compiled function in Lisp is a lambda +expression: that is, a list whose first element is the symbol +@code{lambda} (@pxref{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 can be called as a function even though it has no name; to +emphasize this, we also call it an @dfn{anonymous function} +(@pxref{Anonymous Functions}). A named function in Lisp is just a +symbol with a valid function in its function cell (@pxref{Defining +Functions}). + + Most of the time, functions are called when their names are written in +Lisp expressions in Lisp programs. However, you can construct or obtain +a function object at run time and then call it with the primitive +functions @code{funcall} and @code{apply}. @xref{Calling Functions}. + +@node Macro Type +@subsection Macro Type + + A @dfn{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 argument-passing semantics. A Lisp macro has the form of a +list whose first element is the symbol @code{macro} and whose @sc{cdr} +is a Lisp function object, including the @code{lambda} symbol. + + Lisp macro objects are usually defined with the built-in +@code{defmacro} function, but any list that begins with @code{macro} is +a macro as far as Emacs is concerned. @xref{Macros}, for an explanation +of how to write a macro. + + @strong{Warning}: Lisp macros and keyboard macros (@pxref{Keyboard +Macros}) are entirely different things. When we use the word ``macro'' +without qualification, we mean a Lisp macro, not a keyboard macro. + +@node Primitive Function Type +@subsection Primitive Function Type +@cindex special forms + + A @dfn{primitive function} is a function callable from Lisp but +written in the C programming language. Primitive functions are also +called @dfn{subrs} or @dfn{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 @dfn{special form} +(@pxref{Special Forms}).@refill + + It does not matter to the caller of a function whether the function is +primitive. However, this does matter if you try to redefine a primitive +with a function written in Lisp. The reason is that the primitive +function may be called directly from C code. Calls to the redefined +function from Lisp will use the new definition, but calls from C code +may still use the built-in definition. Therefore, @strong{we discourage +redefinition of primitive functions}. + + The term @dfn{function} refers to all Emacs functions, whether written +in Lisp or C. @xref{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. + +@example +@group +(symbol-function 'car) ; @r{Access the function cell} + ; @r{of the symbol.} + @result{} #<subr car> +(subrp (symbol-function 'car)) ; @r{Is this a primitive function?} + @result{} t ; @r{Yes.} +@end group +@end example + +@node Byte-Code Type +@subsection Byte-Code Function Type + +The byte compiler produces @dfn{byte-code function objects}. +Internally, a byte-code function object is much like a vector; however, +the evaluator handles this data type specially when it appears as a +function to be called. @xref{Byte Compilation}, for information about +the byte compiler. + +The printed representation and read syntax for a byte-code function +object is like that for a vector, with an additional @samp{#} before the +opening @samp{[}. + +@node Autoload Type +@subsection Autoload Type + + An @dfn{autoload object} is a list whose first element is the symbol +@code{autoload}. It is stored as the function definition of a symbol, +where it serves as a placeholder for the real definition. The autoload +object says that the real definition is found in a file of Lisp code +that should be loaded when necessary. It 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 +@code{autoload}, which stores the object in the function cell of a +symbol. @xref{Autoload}, for more details. + +@node Editing Types +@section Editing Types +@cindex editing types + + The types in the previous section are used for general programming +purposes, and most of them are common to most Lisp dialects. Emacs Lisp +provides several additional data types for purposes connected with +editing. + +@menu +* Buffer Type:: The basic object of editing. +* Marker Type:: A position in a buffer. +* Window Type:: Buffers are displayed in windows. +* Frame Type:: Windows subdivide frames. +* Window Configuration Type:: Recording the way a frame is subdivided. +* Frame Configuration Type:: Recording the status of all frames. +* Process Type:: A process running on the underlying OS. +* Stream Type:: Receive or send characters. +* Keymap Type:: What function a keystroke invokes. +* Overlay Type:: How an overlay is represented. +@end menu + +@node Buffer Type +@subsection Buffer Type + + A @dfn{buffer} is an object that holds text that can be edited +(@pxref{Buffers}). Most buffers hold the contents of a disk file +(@pxref{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 (@pxref{Windows}). But a +buffer need not be displayed in any 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, you can insert text efficiently into an +existing buffer, altering the buffer's contents, whereas ``inserting'' +text into a string requires concatenating substrings, and the result is +an entirely new string object. + + Each buffer has a designated position called @dfn{point} +(@pxref{Positions}). At any time, one buffer is the @dfn{current +buffer}. Most editing commands act on the contents of the current +buffer in the neighborhood of point. Many of the standard Emacs +functions manipulate or test the characters in the current buffer; a +whole chapter in this manual is devoted to describing these functions +(@pxref{Text}). + + Several other data structures are associated with each buffer: + +@itemize @bullet +@item +a local syntax table (@pxref{Syntax Tables}); + +@item +a local keymap (@pxref{Keymaps}); and, + +@item +a list of buffer-local variable bindings (@pxref{Buffer-Local Variables}). + +@item +overlays (@pxref{Overlays}). + +@item +text properties for the text in the buffer (@pxref{Text Properties}). +@end itemize + +@noindent +The local keymap and variable list contain entries that individually +override global bindings or values. These are used to customize the +behavior of programs in different buffers, without actually changing the +programs. + + A buffer may be @dfn{indirect}, which means it shares the text +of another buffer, but presents it differently. @xref{Indirect Buffers}. + + Buffers have no read syntax. They print in hash notation, showing the +buffer name. + +@example +@group +(current-buffer) + @result{} #<buffer objects.texi> +@end group +@end example + +@node Marker Type +@subsection Marker Type + + A @dfn{marker} denotes a position in a specific buffer. Markers +therefore have two components: one for the buffer, and one for the +position. Changes in the buffer's text automatically relocate the +position value as necessary 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. + +@example +@group +(point-marker) + @result{} #<marker at 10779 in objects.texi> +@end group +@end example + +@xref{Markers}, for information on how to test, create, copy, and move +markers. + +@node Window Type +@subsection Window Type + + A @dfn{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, at any time one window +is designated the @dfn{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 are grouped on the screen into frames; each window belongs to +one and only one frame. @xref{Frame Type}. + + 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. + +@example +@group +(selected-window) + @result{} #<window 1 on objects.texi> +@end group +@end example + + @xref{Windows}, for a description of the functions that work on windows. + +@node Frame Type +@subsection Frame Type + + A @dfn{frame} is a screen area that contains one or more Emacs +windows; we also use the term ``frame'' to refer to the Lisp object +that Emacs uses to refer to the screen area. + + Frames have no read syntax. They print in hash notation, giving the +frame's title, plus its address in core (useful to identify the frame +uniquely). + +@example +@group +(selected-frame) + @result{} #<frame emacs@@psilocin.gnu.org 0xdac80> +@end group +@end example + + @xref{Frames}, for a description of the functions that work on frames. + +@node Window Configuration Type +@subsection Window Configuration Type +@cindex window layout in a frame + + A @dfn{window configuration} stores information about the positions, +sizes, and contents of the windows in a frame, so you can recreate the +same arrangement of windows later. + + Window configurations do not have a read syntax; their print syntax +looks like @samp{#<window-configuration>}. @xref{Window +Configurations}, for a description of several functions related to +window configurations. + +@node Frame Configuration Type +@subsection Frame Configuration Type +@cindex screen layout +@cindex window layout, all frames + + A @dfn{frame configuration} stores information about the positions, +sizes, and contents of the windows in all frames. It is actually +a list whose @sc{car} is @code{frame-configuration} and whose +@sc{cdr} is an alist. Each alist element describes one frame, +which appears as the @sc{car} of that element. + + @xref{Frame Configurations}, for a description of several functions +related to frame configurations. + +@node Process Type +@subsection Process Type + + The word @dfn{process} usually 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 the Emacs process. +Programs such as shells, GDB, ftp, and compilers, running in +subprocesses of Emacs, extend the capabilities of Emacs. + + An Emacs subprocess takes textual input from Emacs and returns textual +output to Emacs for further manipulation. Emacs can also send signals +to the subprocess. + + Process objects have no read syntax. They print in hash notation, +giving the name of the process: + +@example +@group +(process-list) + @result{} (#<process shell>) +@end group +@end example + +@xref{Processes}, for information about functions that create, delete, +return information about, send input or signals to, and receive output +from processes. + +@node Stream Type +@subsection Stream Type + + A @dfn{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 +@file{*Help*} buffer, or to the echo area. + + The object @code{nil}, in addition to its other meanings, may be used +as a stream. It stands for the value of the variable +@code{standard-input} or @code{standard-output}. Also, the object +@code{t} as a stream specifies input using the minibuffer +(@pxref{Minibuffers}) or output in the echo area (@pxref{The Echo +Area}). + + Streams have no special printed representation or read syntax, and +print as whatever primitive type they are. + + @xref{Read and Print}, for a description of functions +related to streams, including parsing and printing functions. + +@node Keymap Type +@subsection Keymap Type + + A @dfn{keymap} maps keys typed by the user to commands. This mapping +controls how the user's command input is executed. A keymap is actually +a list whose @sc{car} is the symbol @code{keymap}. + + @xref{Keymaps}, for information about creating keymaps, handling prefix +keys, local as well as global keymaps, and changing key bindings. + +@node Overlay Type +@subsection Overlay Type + + An @dfn{overlay} specifies properties that apply to a part of a +buffer. Each overlay applies to a specified range of the buffer, and +contains a property list (a list whose elements are alternating property +names and values). Overlay properties are used to present parts of the +buffer temporarily in a different display style. Overlays have no read +syntax, and print in hash notation, giving the buffer name and range of +positions. + + @xref{Overlays}, for how to create and use overlays. + +@node Circular Objects +@section Read Syntax for Circular Objects +@cindex circular structure, read syntax +@cindex shared structure, read syntax +@cindex @samp{#@var{n}=} read syntax +@cindex @samp{#@var{n}#} read syntax + + To represent shared or circular structures within a complex of Lisp +objects, you can use the reader constructs @samp{#@var{n}=} and +@samp{#@var{n}#}. + + Use @code{#@var{n}=} before an object to label it for later reference; +subsequently, you can use @code{#@var{n}#} to refer the same object in +another place. Here, @var{n} is some integer. For example, here is how +to make a list in which the first element recurs as the third element: + +@example +(#1=(a) b #1#) +@end example + +@noindent +This differs from ordinary syntax such as this + +@example +((a) b (a)) +@end example + +@noindent +which would result in a list whose first and third elements +look alike but are not the same Lisp object. This shows the difference: + +@example +(prog1 nil + (setq x '(#1=(a) b #1#))) +(eq (nth 0 x) (nth 2 x)) + @result{} t +(setq x '((a) b (a))) +(eq (nth 0 x) (nth 2 x)) + @result{} nil +@end example + + You can also use the same syntax to make a circular structure, which +appears as an ``element'' within itself. Here is an example: + +@example +#1=(a #1#) +@end example + +@noindent +This makes a list whose second element is the list itself. +Here's how you can see that it really works: + +@example +(prog1 nil + (setq x '#1=(a #1#))) +(eq x (cadr x)) + @result{} t +@end example + + The Lisp printer can produce this syntax to record circular and shared +structure in a Lisp object, if you bind the variable @code{print-circle} +to a non-@code{nil} value. @xref{Output Variables}. + +@node Type Predicates +@section Type Predicates +@cindex type checking +@kindex wrong-type-argument + + 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 so, since function arguments in Lisp do not have declared data +types, as they do in other programming languages. It is therefore up to +the individual function to test whether each actual argument belongs to +a type that the function can use. + + All built-in functions do check the types of their actual arguments +when appropriate, and signal a @code{wrong-type-argument} error if an +argument is of the wrong type. For example, here is what happens if you +pass an argument to @code{+} that it cannot handle: + +@example +@group +(+ 2 'a) + @error{} Wrong type argument: number-or-marker-p, a +@end group +@end example + +@cindex type predicates +@cindex testing types + If you want your program to handle different types differently, you +must do explicit type checking. The most common way to check the type +of an object is to call a @dfn{type predicate} function. Emacs has a +type predicate for each type, as well as some predicates for +combinations of types. + + A type predicate function takes one argument; it returns @code{t} if +the argument belongs to the appropriate type, and @code{nil} otherwise. +Following a general Lisp convention for predicate functions, most type +predicates' names end with @samp{p}. + + Here is an example which uses the predicates @code{listp} to check for +a list and @code{symbolp} to check for a symbol. + +@example +(defun add-on (x) + (cond ((symbolp x) + ;; If X is a symbol, put it on LIST. + (setq list (cons x list))) + ((listp x) + ;; If X is a list, add its elements to LIST. + (setq list (append x list))) + (t + ;; We handle only symbols and lists. + (error "Invalid argument %s in add-on" x)))) +@end example + + Here is a table of predefined type predicates, in alphabetical order, +with references to further information. + +@table @code +@item atom +@xref{List-related Predicates, atom}. + +@item arrayp +@xref{Array Functions, arrayp}. + +@item bool-vector-p +@xref{Bool-Vectors, bool-vector-p}. + +@item bufferp +@xref{Buffer Basics, bufferp}. + +@item byte-code-function-p +@xref{Byte-Code Type, byte-code-function-p}. + +@item case-table-p +@xref{Case Tables, case-table-p}. + +@item char-or-string-p +@xref{Predicates for Strings, char-or-string-p}. + +@item char-table-p +@xref{Char-Tables, char-table-p}. + +@item commandp +@xref{Interactive Call, commandp}. + +@item consp +@xref{List-related Predicates, consp}. + +@item display-table-p +@xref{Display Tables, display-table-p}. + +@item floatp +@xref{Predicates on Numbers, floatp}. + +@item frame-configuration-p +@xref{Frame Configurations, frame-configuration-p}. + +@item frame-live-p +@xref{Deleting Frames, frame-live-p}. + +@item framep +@xref{Frames, framep}. + +@item functionp +@xref{Functions, functionp}. + +@item hash-table-p +@xref{Other Hash, hash-table-p}. + +@item integer-or-marker-p +@xref{Predicates on Markers, integer-or-marker-p}. + +@item integerp +@xref{Predicates on Numbers, integerp}. + +@item keymapp +@xref{Creating Keymaps, keymapp}. + +@item keywordp +@xref{Constant Variables}. + +@item listp +@xref{List-related Predicates, listp}. + +@item markerp +@xref{Predicates on Markers, markerp}. + +@item wholenump +@xref{Predicates on Numbers, wholenump}. + +@item nlistp +@xref{List-related Predicates, nlistp}. + +@item numberp +@xref{Predicates on Numbers, numberp}. + +@item number-or-marker-p +@xref{Predicates on Markers, number-or-marker-p}. + +@item overlayp +@xref{Overlays, overlayp}. + +@item processp +@xref{Processes, processp}. + +@item sequencep +@xref{Sequence Functions, sequencep}. + +@item stringp +@xref{Predicates for Strings, stringp}. + +@item subrp +@xref{Function Cells, subrp}. + +@item symbolp +@xref{Symbols, symbolp}. + +@item syntax-table-p +@xref{Syntax Tables, syntax-table-p}. + +@item user-variable-p +@xref{Defining Variables, user-variable-p}. + +@item vectorp +@xref{Vectors, vectorp}. + +@item window-configuration-p +@xref{Window Configurations, window-configuration-p}. + +@item window-live-p +@xref{Deleting Windows, window-live-p}. + +@item windowp +@xref{Basic Windows, windowp}. + +@item booleanp +@xref{nil and t, booleanp}. + +@item string-or-null-p +@xref{Predicates for Strings, string-or-null-p}. +@end table + + The most general way to check the type of an object is to call the +function @code{type-of}. Recall that each object belongs to one and +only one primitive type; @code{type-of} tells you which one (@pxref{Lisp +Data Types}). But @code{type-of} knows nothing about non-primitive +types. In most cases, it is more convenient to use type predicates than +@code{type-of}. + +@defun type-of object +This function returns a symbol naming the primitive type of +@var{object}. The value is one of the symbols @code{symbol}, +@code{integer}, @code{float}, @code{string}, @code{cons}, @code{vector}, +@code{char-table}, @code{bool-vector}, @code{hash-table}, @code{subr}, +@code{compiled-function}, @code{marker}, @code{overlay}, @code{window}, +@code{buffer}, @code{frame}, @code{process}, or +@code{window-configuration}. + +@example +(type-of 1) + @result{} integer +@group +(type-of 'nil) + @result{} symbol +(type-of '()) ; @r{@code{()} is @code{nil}.} + @result{} symbol +(type-of '(x)) + @result{} cons +@end group +@end example +@end defun + +@node Equality Predicates +@section Equality Predicates +@cindex equality + + 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. For these predicates, see the appropriate chapter +describing the data type. + +@defun eq object1 object2 +This function returns @code{t} if @var{object1} and @var{object2} are +the same object, @code{nil} otherwise. + +@code{eq} returns @code{t} if @var{object1} and @var{object2} are +integers with the same value. Also, since symbol names are normally +unique, if the arguments are symbols with the same name, they are +@code{eq}. For other types (e.g., lists, vectors, strings), two +arguments with the same contents or elements are not necessarily +@code{eq} to each other: they are @code{eq} only if they are the same +object, meaning that a change in the contents of one will be reflected +by the same change in the contents of the other. + +@example +@group +(eq 'foo 'foo) + @result{} t +@end group + +@group +(eq 456 456) + @result{} t +@end group + +@group +(eq "asdf" "asdf") + @result{} nil +@end group + +@group +(eq '(1 (2 (3))) '(1 (2 (3)))) + @result{} nil +@end group + +@group +(setq foo '(1 (2 (3)))) + @result{} (1 (2 (3))) +(eq foo foo) + @result{} t +(eq foo '(1 (2 (3)))) + @result{} nil +@end group + +@group +(eq [(1 2) 3] [(1 2) 3]) + @result{} nil +@end group + +@group +(eq (point-marker) (point-marker)) + @result{} nil +@end group +@end example + +The @code{make-symbol} function returns an uninterned symbol, distinct +from the symbol that is used if you write the name in a Lisp expression. +Distinct symbols with the same name are not @code{eq}. @xref{Creating +Symbols}. + +@example +@group +(eq (make-symbol "foo") 'foo) + @result{} nil +@end group +@end example +@end defun + +@defun equal object1 object2 +This function returns @code{t} if @var{object1} and @var{object2} have +equal components, @code{nil} otherwise. Whereas @code{eq} tests if its +arguments are the same object, @code{equal} looks inside nonidentical +arguments to see if their elements or contents are the same. So, if two +objects are @code{eq}, they are @code{equal}, but the converse is not +always true. + +@example +@group +(equal 'foo 'foo) + @result{} t +@end group + +@group +(equal 456 456) + @result{} t +@end group + +@group +(equal "asdf" "asdf") + @result{} t +@end group +@group +(eq "asdf" "asdf") + @result{} nil +@end group + +@group +(equal '(1 (2 (3))) '(1 (2 (3)))) + @result{} t +@end group +@group +(eq '(1 (2 (3))) '(1 (2 (3)))) + @result{} nil +@end group + +@group +(equal [(1 2) 3] [(1 2) 3]) + @result{} t +@end group +@group +(eq [(1 2) 3] [(1 2) 3]) + @result{} nil +@end group + +@group +(equal (point-marker) (point-marker)) + @result{} t +@end group + +@group +(eq (point-marker) (point-marker)) + @result{} nil +@end group +@end example + +Comparison of strings is case-sensitive, but does not take account of +text properties---it compares only the characters in the strings. For +technical reasons, a unibyte string and a multibyte string are +@code{equal} if and only if they contain the same sequence of +character codes and all these codes are either in the range 0 through +127 (@acronym{ASCII}) or 160 through 255 (@code{eight-bit-graphic}). +(@pxref{Text Representations}). + +@example +@group +(equal "asdf" "ASDF") + @result{} nil +@end group +@end example + +However, two distinct buffers are never considered @code{equal}, even if +their textual contents are the same. +@end defun + + The test for equality is implemented recursively; for example, given +two cons cells @var{x} and @var{y}, @code{(equal @var{x} @var{y})} +returns @code{t} if and only if both the expressions below return +@code{t}: + +@example +(equal (car @var{x}) (car @var{y})) +(equal (cdr @var{x}) (cdr @var{y})) +@end example + +Because of this recursive method, circular lists may therefore cause +infinite recursion (leading to an error). + +@ignore + arch-tag: 9711a66e-4749-4265-9e8c-972d55b67096 +@end ignore diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi new file mode 100644 index 00000000000..08f94b427eb --- /dev/null +++ b/doc/lispref/os.texi @@ -0,0 +1,2004 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/os +@node System Interface, Antinews, Display, Top +@chapter 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. + + @xref{Building Emacs}, for related information. See also +@ref{Display}, for additional operating system status information +pertaining to the terminal and the screen. + +@menu +* Starting Up:: Customizing Emacs startup processing. +* Getting Out:: How exiting works (permanent or temporary). +* System Environment:: Distinguish the name and kind of system. +* User Identification:: Finding the name and user id of the user. +* Time of Day:: Getting the current time. +* Time Conversion:: Converting a time from numeric form + to calendrical data, and vice versa). +* Time Parsing:: Converting a time from numeric form to text + and vice versa. +* Processor Run Time:: Getting the run time used by Emacs. +* Time Calculations:: Adding, subtracting, comparing times, etc. +* Timers:: Setting a timer to call a function at a certain time. +* Idle Timers:: Setting a timer to call a function when Emacs has + been idle for a certain length of time. +* Terminal Input:: Accessing and recording terminal input. +* Terminal Output:: Controlling and recording terminal output. +* Sound Output:: Playing sounds on the computer's speaker. +* X11 Keysyms:: Operating on key symbols for X Windows +* Batch Mode:: Running Emacs without terminal interaction. +* Session Management:: Saving and restoring state with X Session Management. +@end menu + +@node Starting Up +@section Starting Up Emacs + + This section describes what Emacs does when it is started, and how you +can customize these actions. + +@menu +* Startup Summary:: Sequence of actions Emacs performs at startup. +* Init File:: Details on reading the init file (@file{.emacs}). +* Terminal-Specific:: How the terminal-specific Lisp file is read. +* Command-Line Arguments:: How command-line arguments are processed, + and how you can customize them. +@end menu + +@node Startup Summary +@subsection Summary: Sequence of Actions at Startup +@cindex initialization of Emacs +@cindex startup of Emacs +@cindex @file{startup.el} + + The order of operations performed (in @file{startup.el}) by Emacs when +it is started up is as follows: + +@enumerate +@item +It adds subdirectories to @code{load-path}, by running the file named +@file{subdirs.el} in each directory in the list. Normally this file +adds the directory's subdirectories to the list, and these will be +scanned in their turn. The files @file{subdirs.el} are normally +generated automatically by Emacs installation. + +@item +It sets the language environment and the terminal coding system, +if requested by environment variables such as @code{LANG}. + +@item +It loads the initialization library for the window system, if you are +using a window system. This library's name is +@file{term/@var{windowsystem}-win.el}. + +@item +It processes the initial options. (Some of them are handled +even earlier than this.) + +@item +It initializes the window frame and faces, if appropriate. + +@item +It runs the normal hook @code{before-init-hook}. + +@item +It loads the library @file{site-start} (if any), unless the option +@samp{-Q} (or @samp{--no-site-file}) was specified. The library's file +name is usually @file{site-start.el}. +@cindex @file{site-start.el} + +@item +It loads your init file (usually @file{~/.emacs}), unless the option +@samp{-q} (or @samp{--no-init-file}), @samp{-Q}, or @samp{--batch} was +specified on the command line. The @samp{-u} option can specify +another user whose home directory should be used instead of @file{~}. + +@item +It loads the library @file{default} (if any), unless +@code{inhibit-default-init} is non-@code{nil}. (This is not done in +@samp{-batch} mode, or if @samp{-Q} or @samp{-q} was specified on the +command line.) The library's file name is usually @file{default.el}. +@cindex @file{default.el} + +@item +It runs the normal hook @code{after-init-hook}. + +@item +It sets the major mode according to @code{initial-major-mode}, provided +the buffer @samp{*scratch*} is still current and still in Fundamental +mode. + +@item +It loads the terminal-specific Lisp file, if any, except when in batch +mode or using a window system. + +@item +It displays the initial echo area message, unless you have suppressed +that with @code{inhibit-startup-echo-area-message}. + +@item +It processes the action arguments from the command line. + +@item +It runs @code{emacs-startup-hook} and then @code{term-setup-hook}. + +@item +It calls @code{frame-notice-user-settings}, which modifies the +parameters of the selected frame according to whatever the init files +specify. + +@item +It runs @code{window-setup-hook}. @xref{Window Systems}. + +@item +It displays copyleft, nonwarranty, and basic use information, provided +the value of @code{inhibit-startup-message} is @code{nil}, you didn't +specify @samp{--no-splash} or @samp{-Q}. +@end enumerate + +@defopt inhibit-startup-message +This variable inhibits the initial startup messages (the nonwarranty, +etc.). If it is non-@code{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. +@end defopt + +@defopt inhibit-startup-echo-area-message +This variable controls the display of the startup echo area message. +You can suppress the startup echo area message by adding text with this +form to your init file: + +@example +(setq inhibit-startup-echo-area-message + "@var{your-login-name}") +@end example + +Emacs explicitly checks for an expression as shown above in your init +file; your login name must appear in the expression as a Lisp string +constant. Other methods of setting +@code{inhibit-startup-echo-area-message} to the same value do not +inhibit the startup message. + +This way, you can easily inhibit the message for yourself if you wish, +but thoughtless copying of your init file will not inhibit the message +for someone else. +@end defopt + +@node Init File +@subsection The Init File, @file{.emacs} +@cindex init file +@cindex @file{.emacs} + + When you start Emacs, it normally attempts to load your @dfn{init +file}, a file in your home directory. Its normal name is +@file{.emacs}, but you can also call it @file{.emacs.el}. +Alternatively, you can use a file named @file{init.el} in a +subdirectory @file{.emacs.d}. Whichever place you use, you can also +compile the file (@pxref{Byte Compilation}); then the actual file +loaded will be @file{.emacs.elc} or @file{init.elc}. + + The command-line switches @samp{-q}, @samp{-Q}, and @samp{-u} +control whether and where to find the init file; @samp{-q} (and the +stronger @samp{-Q}) says not to load an init file, while @samp{-u +@var{user}} says to load @var{user}'s init file instead of yours. +@xref{Entering Emacs,,, emacs, The GNU Emacs Manual}. If neither +option is specified, Emacs uses the @code{LOGNAME} environment +variable, or the @code{USER} (most systems) or @code{USERNAME} (MS +systems) variable, to find your home directory and thus your init +file; this way, even if you have su'd, Emacs still loads your own init +file. If those environment variables are absent, though, Emacs uses +your user-id to find your home directory. + +@cindex default init file + A site may have a @dfn{default init file}, which is the library +named @file{default.el}. Emacs finds the @file{default.el} file +through the standard search path for libraries (@pxref{How Programs Do +Loading}). The Emacs distribution does not come with this file; sites +may provide one for local customizations. If the default init file +exists, it is loaded whenever you start Emacs, except in batch mode or +if @samp{-q} (or @samp{-Q}) is specified. But your own personal init +file, if any, is loaded first; if it sets @code{inhibit-default-init} +to a non-@code{nil} value, then Emacs does not subsequently load the +@file{default.el} file. + + Another file for site-customization is @file{site-start.el}. Emacs +loads this @emph{before} the user's init file. You can inhibit the +loading of this file with the option @samp{--no-site-file}. + +@defvar site-run-file +This variable specifies the site-customization file to load before the +user's init file. Its normal value is @code{"site-start"}. The only +way you can change it with real effect is to do so before dumping +Emacs. +@end defvar + + @xref{Init Examples,, Init File Examples, emacs, The GNU Emacs Manual}, for +examples of how to make various commonly desired customizations in your +@file{.emacs} file. + +@defopt inhibit-default-init +This variable prevents Emacs from loading the default initialization +library file for your session of Emacs. If its value is non-@code{nil}, +then the default library is not loaded. The default value is +@code{nil}. +@end defopt + +@defvar before-init-hook +This normal hook is run, once, just before loading all the init files +(the user's init file, @file{default.el}, and/or @file{site-start.el}). +(The only way to change it with real effect is before dumping Emacs.) +@end defvar + +@defvar after-init-hook +This normal hook is run, once, just after loading all the init files +(the user's init file, @file{default.el}, and/or @file{site-start.el}), +before loading the terminal-specific library and processing the +command-line action arguments. +@end defvar + +@defvar emacs-startup-hook +This normal hook is run, once, just after handling the command line +arguments, just before @code{term-setup-hook}. +@end defvar + +@defvar user-init-file +This variable holds the absolute file name of the user's init file. If the +actual init file loaded is a compiled file, such as @file{.emacs.elc}, +the value refers to the corresponding source file. +@end defvar + +@defvar user-emacs-directory +This variable holds the name of the @file{.emacs.d} directory. It is +ordinarily @file{~/.emacs.d}, but differs on some platforms. +@end defvar + +@node Terminal-Specific +@subsection Terminal-Specific Initialization +@cindex terminal-specific initialization + + Each terminal type can have its own Lisp library that Emacs loads when +run on that type of terminal. The library's name is constructed by +concatenating the value of the variable @code{term-file-prefix} and the +terminal type (specified by the environment variable @code{TERM}). +Normally, @code{term-file-prefix} has the value +@code{"term/"}; changing this is not recommended. Emacs finds the file +in the normal manner, by searching the @code{load-path} directories, and +trying the @samp{.elc} and @samp{.el} suffixes. + +@cindex Termcap + The usual function of a terminal-specific library is to enable +special keys to send sequences that Emacs can recognize. It may also +need to set or add to @code{function-key-map} if the Termcap or +Terminfo entry does not specify all the terminal's function keys. +@xref{Terminal Input}. + + When the name of the terminal type contains a hyphen, and no library +is found whose name is identical to the terminal's name, Emacs strips +from the terminal's name the last hyphen and everything that follows +it, and tries again. This process is repeated until Emacs finds a +matching library or until there are no more hyphens in the name (the +latter means the terminal doesn't have any library specific to it). +Thus, for example, if there are no @samp{aaa-48} and @samp{aaa-30} +libraries, Emacs will try the same library @file{term/aaa.el} for +terminal types @samp{aaa-48} and @samp{aaa-30-rv}. If necessary, the +library can evaluate @code{(getenv "TERM")} to find the full name of +the terminal type.@refill + + Your init file can prevent the loading of the +terminal-specific library by setting the variable +@code{term-file-prefix} to @code{nil}. This feature is 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 +@code{term-setup-hook}. This is a normal hook which Emacs runs using +@code{run-hooks} at the end of Emacs initialization, after loading both +your init file and any terminal-specific libraries. You can +use this variable to define initializations for terminals that do not +have their own libraries. @xref{Hooks}. + +@defvar term-file-prefix +@cindex @code{TERM} environment variable +If the @code{term-file-prefix} variable is non-@code{nil}, Emacs loads +a terminal-specific initialization file as follows: + +@example +(load (concat term-file-prefix (getenv "TERM"))) +@end example + +@noindent +You may set the @code{term-file-prefix} variable to @code{nil} in your +init file if you do not wish to load the +terminal-initialization file. To do this, put the following in +your init file: @code{(setq term-file-prefix nil)}. + +On MS-DOS, if the environment variable @code{TERM} is not set, Emacs +uses @samp{internal} as the terminal type. +@end defvar + +@defvar term-setup-hook +This variable is a normal hook that Emacs runs after loading your +init file, the default initialization file (if any) and the +terminal-specific Lisp file. + +You can use @code{term-setup-hook} to override the definitions made by a +terminal-specific file. +@end defvar + + See @code{window-setup-hook} in @ref{Window Systems}, for a related +feature. + +@node Command-Line Arguments +@subsection Command-Line Arguments +@cindex 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. + + This section describes how Emacs processes command-line arguments, +and how you can customize them. + +@ignore + (Note that some other editors require you to start afresh each time +you want to edit a file. With this kind of editor, you will probably +specify the file as a command-line argument. The recommended way to +use GNU Emacs is to start it only once, just after you log in, and do +all your editing in the same Emacs process. Each time you want to edit +a different file, you visit it with the existing Emacs, which eventually +comes to have many files in it ready for editing. Usually you do not +kill the Emacs until you are about to log out.) +@end ignore + +@defun command-line +This function parses the command line that Emacs was called with, +processes it, loads the user's init file and displays the +startup messages. +@end defun + +@defvar command-line-processed +The value of this variable is @code{t} once the command line has been +processed. + +If you redump Emacs by calling @code{dump-emacs}, you may wish to set +this variable to @code{nil} first in order to cause the new dumped Emacs +to process its new command-line arguments. +@end defvar + +@defvar command-switch-alist +@cindex switches on command line +@cindex options on command line +@cindex command-line options +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 @dfn{command-line option} is an argument on the command line, which +has the form: + +@example +-@var{option} +@end example + +The elements of the @code{command-switch-alist} look like this: + +@example +(@var{option} . @var{handler-function}) +@end example + +The @sc{car}, @var{option}, is a string, the name of a command-line +option (not including the initial hyphen). The @var{handler-function} +is called to handle @var{option}, and receives the option name as its +sole argument. + +In some cases, the option is followed in the command line by an +argument. In these cases, the @var{handler-function} can find all the +remaining command-line arguments in the variable +@code{command-line-args-left}. (The entire list of command-line +arguments is in @code{command-line-args}.) + +The command-line arguments are parsed by the @code{command-line-1} +function in the @file{startup.el} file. See also @ref{Emacs +Invocation, , Command Line Arguments for Emacs Invocation, emacs, The +GNU Emacs Manual}. +@end defvar + +@defvar command-line-args +The value of this variable is the list of command-line arguments passed +to Emacs. +@end defvar + +@defvar command-line-functions +This variable's value is a list of functions for handling an +unrecognized command-line argument. Each time the next argument to be +processed has no special meaning, the functions in this list are called, +in order of appearance, until one of them returns a non-@code{nil} +value. + +These functions are called with no arguments. They can access the +command-line argument under consideration through the variable +@code{argi}, which is bound temporarily at this point. The remaining +arguments (not including the current one) are in the variable +@code{command-line-args-left}. + +When a function recognizes and processes the argument in @code{argi}, it +should return a non-@code{nil} value to say it has dealt with that +argument. If it has also dealt with some of the following arguments, it +can indicate that by deleting them from @code{command-line-args-left}. + +If all of these functions return @code{nil}, then the argument is used +as a file name to visit. +@end defvar + +@node Getting Out +@section Getting Out of Emacs +@cindex exiting 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. + +@menu +* Killing Emacs:: Exiting Emacs irreversibly. +* Suspending Emacs:: Exiting Emacs reversibly. +@end menu + +@node Killing Emacs +@comment node-name, next, previous, up +@subsection Killing Emacs +@cindex killing Emacs + + Killing Emacs means ending the execution of the Emacs process. The +parent process normally resumes control. The low-level primitive for +killing Emacs is @code{kill-emacs}. + +@defun kill-emacs &optional exit-data +This function exits the Emacs process and kills it. + +If @var{exit-data} is an integer, then it is used as the exit status +of the Emacs process. (This is useful primarily in batch operation; see +@ref{Batch Mode}.) + +If @var{exit-data} 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. +@end defun + + All the information in the Emacs process, aside from files that have +been saved, is lost when the Emacs process is killed. Because killing +Emacs inadvertently can lose a lot of work, Emacs queries for +confirmation before actually terminating if you have buffers that need +saving or subprocesses that are running. This is done in the function +@code{save-buffers-kill-emacs}, the higher level function from which +@code{kill-emacs} is usually called. + +@defvar kill-emacs-query-functions +After asking the standard questions, @code{save-buffers-kill-emacs} +calls the functions in the list @code{kill-emacs-query-functions}, in +order of appearance, with no arguments. These functions can ask for +additional confirmation from the user. If any of them returns +@code{nil}, @code{save-buffers-kill-emacs} does not kill Emacs, and +does not run the remaining functions in this hook. Calling +@code{kill-emacs} directly does not run this hook. +@end defvar + +@defvar kill-emacs-hook +This variable is a normal hook; once @code{save-buffers-kill-emacs} is +finished with all file saving and confirmation, it calls +@code{kill-emacs} which runs the functions in this hook. +@code{kill-emacs} does not run this hook in batch mode. + +@code{kill-emacs} may be invoked directly (that is not via +@code{save-buffers-kill-emacs}) if the terminal is disconnected, or in +similar situations where interaction with the user is not possible. +Thus, if your hook needs to interact with the user, put it on +@code{kill-emacs-query-functions}; if it needs to run regardless of +how Emacs is killed, put it on @code{kill-emacs-hook}. +@end defvar + +@node Suspending Emacs +@subsection Suspending Emacs +@cindex suspending Emacs + + @dfn{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 @code{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, 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 when Emacs is using +a window system (X, MS Windows, or Mac). + +@defun suspend-emacs &optional string +This function stops Emacs and returns control to the superior process. +If and when the superior process resumes Emacs, @code{suspend-emacs} +returns @code{nil} to its caller in Lisp. + +If @var{string} is non-@code{nil}, its characters are sent to be read +as terminal input by Emacs's superior shell. The characters in +@var{string} are not echoed by the superior shell; only the results +appear. + +Before suspending, @code{suspend-emacs} runs the normal hook +@code{suspend-hook}. + +After the user resumes Emacs, @code{suspend-emacs} runs the normal hook +@code{suspend-resume-hook}. @xref{Hooks}. + +The next redisplay after resumption will redraw the entire screen, +unless the variable @code{no-redraw-on-reenter} is non-@code{nil} +(@pxref{Refresh Screen}). + +In the following example, note that @samp{pwd} is not echoed after +Emacs is suspended. But it is read and executed by the shell. + +@smallexample +@group +(suspend-emacs) + @result{} nil +@end group + +@group +(add-hook 'suspend-hook + (function (lambda () + (or (y-or-n-p + "Really suspend? ") + (error "Suspend canceled"))))) + @result{} (lambda nil + (or (y-or-n-p "Really suspend? ") + (error "Suspend canceled"))) +@end group +@group +(add-hook 'suspend-resume-hook + (function (lambda () (message "Resumed!")))) + @result{} (lambda nil (message "Resumed!")) +@end group +@group +(suspend-emacs "pwd") + @result{} nil +@end group +@group +---------- Buffer: Minibuffer ---------- +Really suspend? @kbd{y} +---------- Buffer: Minibuffer ---------- +@end group + +@group +---------- Parent Shell ---------- +lewis@@slug[23] % /user/lewis/manual +lewis@@slug[24] % fg +@end group + +@group +---------- Echo Area ---------- +Resumed! +@end group +@end smallexample +@end defun + +@defvar suspend-hook +This variable is a normal hook that Emacs runs before suspending. +@end defvar + +@defvar suspend-resume-hook +This variable is a normal hook that Emacs runs on resuming +after a suspension. +@end defvar + +@node System Environment +@section Operating System Environment +@cindex 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 @acronym{UID}, and so on. + +@defvar system-configuration +This variable holds the standard GNU configuration name for the +hardware/software configuration of your system, as a string. The +convenient way to test parts of this string is with +@code{string-match}. +@end defvar + +@cindex system type and name +@defvar 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 possible values: + +@table @code +@item alpha-vms +VMS on the Alpha. + +@item aix-v3 +AIX. + +@item berkeley-unix +Berkeley BSD. + +@item cygwin +Cygwin. + +@item dgux +Data General DGUX operating system. + +@item gnu +the GNU system (using the GNU kernel, which consists of the HURD and Mach). + +@item gnu/linux +A GNU/Linux system---that is, a variant GNU system, using the Linux +kernel. (These systems are the ones people often call ``Linux,'' but +actually Linux is just the kernel, not the whole system.) + +@item hpux +Hewlett-Packard HPUX operating system. + +@item irix +Silicon Graphics Irix system. + +@item ms-dos +Microsoft MS-DOS ``operating system.'' Emacs compiled with DJGPP for +MS-DOS binds @code{system-type} to @code{ms-dos} even when you run it on +MS-Windows. + +@item next-mach +NeXT Mach-based system. + +@item rtu +Masscomp RTU, UCB universe. + +@item unisoft-unix +UniSoft UniPlus. + +@item usg-unix-v +AT&T System V. + +@item vax-vms +VAX VMS. + +@item windows-nt +Microsoft windows NT. The same executable supports Windows 9X, but the +value of @code{system-type} is @code{windows-nt} in either case. + +@item xenix +SCO Xenix 386. +@end table + +We do not wish to add new symbols to make finer distinctions unless it +is absolutely necessary! In fact, we hope to eliminate some of these +alternatives in the future. We recommend using +@code{system-configuration} to distinguish between different operating +systems. +@end defvar + +@defun system-name +This function returns the name of the machine you are running on. +@example +(system-name) + @result{} "www.gnu.org" +@end example +@end defun + + The symbol @code{system-name} is a variable as well as a function. In +fact, the function returns whatever value the variable +@code{system-name} currently holds. Thus, you can set the variable +@code{system-name} in case Emacs is confused about the name of your +system. The variable is also useful for constructing frame titles +(@pxref{Frame Titles}). + +@defvar mail-host-address +If this variable is non-@code{nil}, it is used instead of +@code{system-name} for purposes of generating email addresses. For +example, it is used when constructing the default value of +@code{user-mail-address}. @xref{User Identification}. (Since this is +done when Emacs starts up, the value actually used is the one saved when +Emacs was dumped. @xref{Building Emacs}.) +@end defvar + +@deffn Command getenv var +@cindex environment variable access +This function returns the value of the environment variable @var{var}, +as a string. @var{var} should be a string. If @var{var} is undefined +in the environment, @code{getenv} returns @code{nil}. If returns +@samp{""} if @var{var} is set but null. Within Emacs, the environment +variable values are kept in the Lisp variable @code{process-environment}. + +@example +@group +(getenv "USER") + @result{} "lewis" +@end group + +@group +lewis@@slug[10] % printenv +PATH=.:/user/lewis/bin:/usr/bin:/usr/local/bin +USER=lewis +@end group +@group +TERM=ibmapa16 +SHELL=/bin/csh +HOME=/user/lewis +@end group +@end example +@end deffn + +@c Emacs 19 feature +@deffn Command setenv variable &optional value +This command sets the value of the environment variable named +@var{variable} to @var{value}. @var{variable} should be a string. +Internally, Emacs Lisp can handle any string. However, normally +@var{variable} should be a valid shell identifier, that is, a sequence +of letters, digits and underscores, starting with a letter or +underscore. Otherwise, errors may occur if subprocesses of Emacs try +to access the value of @var{variable}. If @var{value} is omitted or +@code{nil}, @code{setenv} removes @var{variable} from the environment. +Otherwise, @var{value} should be a string. + +@code{setenv} works by modifying @code{process-environment}; binding +that variable with @code{let} is also reasonable practice. + +@code{setenv} returns the new value of @var{variable}, or @code{nil} +if it removed @var{variable} from the environment. +@end deffn + +@defvar process-environment +This variable is a list of strings, each describing one environment +variable. The functions @code{getenv} and @code{setenv} work by means +of this variable. + +@smallexample +@group +process-environment +@result{} ("l=/usr/stanford/lib/gnuemacs/lisp" + "PATH=.:/user/lewis/bin:/usr/class:/nfsusr/local/bin" + "USER=lewis" +@end group +@group + "TERM=ibmapa16" + "SHELL=/bin/csh" + "HOME=/user/lewis") +@end group +@end smallexample + +If @code{process-environment} contains ``duplicate'' elements that +specify the same environment variable, the first of these elements +specifies the variable, and the other ``duplicates'' are ignored. +@end defvar + +@defvar path-separator +This variable holds a string which says which character separates +directories in a search path (as found in an environment variable). Its +value is @code{":"} for Unix and GNU systems, and @code{";"} for MS-DOS +and MS-Windows. +@end defvar + +@defun parse-colon-path path +This function takes a search path string such as would be the value of +the @code{PATH} environment variable, and splits it at the separators, +returning a list of directory names. @code{nil} in this list stands for +``use the current directory.'' Although the function's name says +``colon,'' it actually uses the value of @code{path-separator}. + +@example +(parse-colon-path ":/foo:/bar") + @result{} (nil "/foo/" "/bar/") +@end example +@end defun + +@defvar invocation-name +This variable holds the program name under which Emacs was invoked. The +value is a string, and does not include a directory name. +@end defvar + +@defvar invocation-directory +This variable holds the directory from which the Emacs executable was +invoked, or perhaps @code{nil} if that directory cannot be determined. +@end defvar + +@defvar installation-directory +If non-@code{nil}, this is a directory within which to look for the +@file{lib-src} and @file{etc} subdirectories. This is non-@code{nil} +when Emacs can't find those directories in their standard installed +locations, but can find them in a directory related somehow to the one +containing the Emacs executable. +@end defvar + +@defun load-average &optional use-float +This function returns the current 1-minute, 5-minute, and 15-minute load +averages, in a list. + +By default, the values are integers that are 100 times the system load +averages, which indicate the average number of processes trying to run. +If @var{use-float} is non-@code{nil}, then they are returned +as floating point numbers and without multiplying by 100. + +If it is impossible to obtain the load average, this function signals +an error. On some platforms, access to load averages requires +installing Emacs as setuid or setgid so that it can read kernel +information, and that usually isn't advisable. + +If the 1-minute load average is available, but the 5- or 15-minute +averages are not, this function returns a shortened list containing +the available averages. + +@example +@group +(load-average) + @result{} (169 48 36) +@end group +@group +(load-average t) + @result{} (1.69 0.48 0.36) +@end group + +@group +lewis@@rocky[5] % uptime + 11:55am up 1 day, 19:37, 3 users, + load average: 1.69, 0.48, 0.36 +@end group +@end example +@end defun + +@defun emacs-pid +This function returns the process @acronym{ID} of the Emacs process, +as an integer. +@end defun + +@defvar tty-erase-char +This variable holds the erase character that was selected +in the system's terminal driver, before Emacs was started. +The value is @code{nil} if Emacs is running under a window system. +@end defvar + +@defun setprv privilege-name &optional setp getprv +This function sets or resets a VMS privilege. (It does not exist on +other systems.) The first argument is the privilege name, as a string. +The second argument, @var{setp}, is @code{t} or @code{nil}, indicating +whether the privilege is to be turned on or off. Its default is +@code{nil}. The function returns @code{t} if successful, @code{nil} +otherwise. + +If the third argument, @var{getprv}, is non-@code{nil}, @code{setprv} +does not change the privilege, but returns @code{t} or @code{nil} +indicating whether the privilege is currently enabled. +@end defun + +@node User Identification +@section User Identification +@cindex user identification + +@defvar init-file-user +This variable says which user's init files should be used by +Emacs---or @code{nil} if none. @code{""} stands for the user who +originally logged in. The value reflects command-line options such as +@samp{-q} or @samp{-u @var{user}}. + +Lisp packages that load files of customizations, or any other sort of +user profile, should obey this variable in deciding where to find it. +They should load the profile of the user name found in this variable. +If @code{init-file-user} is @code{nil}, meaning that the @samp{-q} +option was used, then Lisp packages should not load any customization +files or user profile. +@end defvar + +@defvar user-mail-address +This holds the nominal email address of the user who is using Emacs. +Emacs normally sets this variable to a default value after reading your +init files, but not if you have already set it. So you can set the +variable to some other value in your init file if you do not +want to use the default value. +@end defvar + +@defun user-login-name &optional uid +If you don't specify @var{uid}, this function returns the name under +which the user is logged in. If the environment variable @code{LOGNAME} +is set, that value is used. Otherwise, if the environment variable +@code{USER} is set, that value is used. Otherwise, the value is based +on the effective @acronym{UID}, not the real @acronym{UID}. + +If you specify @var{uid}, the value is the user name that corresponds +to @var{uid} (which should be an integer), or @code{nil} if there is +no such user. + +@example +@group +(user-login-name) + @result{} "lewis" +@end group +@end example +@end defun + +@defun user-real-login-name +This function returns the user name corresponding to Emacs's real +@acronym{UID}. This ignores the effective @acronym{UID} and ignores the +environment variables @code{LOGNAME} and @code{USER}. +@end defun + +@defun user-full-name &optional uid +This function returns the full name of the logged-in user---or the value +of the environment variable @code{NAME}, if that is set. + +@c "Bil" is the correct spelling. +@example +@group +(user-full-name) + @result{} "Bil Lewis" +@end group +@end example + +If the Emacs job's user-id does not correspond to any known user (and +provided @code{NAME} is not set), the value is @code{"unknown"}. + +If @var{uid} is non-@code{nil}, then it should be a number (a user-id) +or a string (a login name). Then @code{user-full-name} returns the full +name corresponding to that user-id or login name. If you specify a +user-id or login name that isn't defined, it returns @code{nil}. +@end defun + +@vindex user-full-name +@vindex user-real-login-name +@vindex user-login-name + The symbols @code{user-login-name}, @code{user-real-login-name} and +@code{user-full-name} are variables as well as functions. The functions +return the same values that the variables hold. These variables allow +you to ``fake out'' Emacs by telling the functions what to return. The +variables are also useful for constructing frame titles (@pxref{Frame +Titles}). + +@defun user-real-uid +This function returns the real @acronym{UID} of the user. +The value may be a floating point number. + +@example +@group +(user-real-uid) + @result{} 19 +@end group +@end example +@end defun + +@defun user-uid +This function returns the effective @acronym{UID} of the user. +The value may be a floating point number. +@end defun + +@node Time of Day +@section Time of Day + + This section explains how to determine the current time and the time +zone. + +@defun current-time-string &optional time-value +This function returns the current time and date as a human-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 +@code{substring} to extract pieces of it. It is wise to count the +characters from the beginning of the string rather than from the end, as +additional information may some day be added at the end. + +@c Emacs 19 feature +The argument @var{time-value}, if given, specifies a time to format +instead of the current time. The argument should be a list whose first +two elements are integers. Thus, you can use times obtained from +@code{current-time} (see below) and from @code{file-attributes} +(@pxref{Definition of file-attributes}). @var{time-value} can also be +a cons of two integers, but this is considered obsolete. + +@example +@group +(current-time-string) + @result{} "Wed Oct 14 22:21:05 1987" +@end group +@end example +@end defun + +@c Emacs 19 feature +@defun current-time +This function returns the system's time value as a list of three +integers: @code{(@var{high} @var{low} @var{microsec})}. The integers +@var{high} and @var{low} combine to give the number of seconds since +0:00 January 1, 1970 UTC (Coordinated Universal Time), which is +@ifnottex +@var{high} * 2**16 + @var{low}. +@end ifnottex +@tex +$high*2^{16}+low$. +@end tex + +The third element, @var{microsec}, gives the microseconds since the +start of the current second (or 0 for systems that return time with +the resolution of only one second). + +The first two elements can be compared with file time values such as you +get with the function @code{file-attributes}. +@xref{Definition of file-attributes}. +@end defun + +@c Emacs 19 feature +@defun current-time-zone &optional time-value +This function returns a list describing the time zone that the user is +in. + +The value has the form @code{(@var{offset} @var{name})}. Here +@var{offset} is an integer giving the number of seconds ahead of UTC +(east of Greenwich). A negative value means west of Greenwich. The +second element, @var{name}, is a string giving the name of the time +zone. Both elements change when daylight saving time begins or ends; +if the user has specified a time zone that does not use a seasonal time +adjustment, then the value is constant through time. + +If the operating system doesn't supply all the information necessary to +compute the value, the unknown elements of the list are @code{nil}. + +The argument @var{time-value}, if given, specifies a time to analyze +instead of the current time. The argument should have the same form +as for @code{current-time-string} (see above). Thus, you can use +times obtained from @code{current-time} (see above) and from +@code{file-attributes}. @xref{Definition of file-attributes}. +@end defun + +@defun set-time-zone-rule tz +This function specifies the local time zone according to @var{tz}. If +@var{tz} is @code{nil}, that means to use an implementation-defined +default time zone. If @var{tz} is @code{t}, that means to use +Universal Time. Otherwise, @var{tz} should be a string specifying a +time zone rule. +@end defun + +@defun float-time &optional time-value +This function returns the current time as a floating-point number of +seconds since the epoch. The argument @var{time-value}, if given, +specifies a time to convert instead of the current time. The argument +should have the same form as for @code{current-time-string} (see +above). Thus, it accepts the output of @code{current-time} and +@code{file-attributes}. + +@emph{Warning}: Since the result is floating point, it may not be +exact. Do not use this function if precise time stamps are required. +@end defun + +@node Time Conversion +@section Time Conversion + + These functions convert time values (lists of two or three integers) +to calendrical information and vice versa. You can get time values +from the functions @code{current-time} (@pxref{Time of Day}) and +@code{file-attributes} (@pxref{Definition of file-attributes}). + + Many operating systems are limited to time values that contain 32 bits +of information; these systems typically handle only the times from +1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC. However, some +operating systems have larger time values, and can represent times far +in the past or future. + + Time conversion functions always use the Gregorian calendar, even +for dates before the Gregorian calendar was introduced. Year numbers +count the number of years since the year 1 B.C., and do not skip zero +as traditional Gregorian years do; for example, the year number +@minus{}37 represents the Gregorian year 38 B.C@. + +@defun decode-time &optional time +This function converts a time value into calendrical information. If +you don't specify @var{time}, it decodes the current time. The return +value is a list of nine elements, as follows: + +@example +(@var{seconds} @var{minutes} @var{hour} @var{day} @var{month} @var{year} @var{dow} @var{dst} @var{zone}) +@end example + +Here is what the elements mean: + +@table @var +@item seconds +The number of seconds past the minute, as an integer between 0 and 59. +On some operating systems, this is 60 for leap seconds. +@item minutes +The number of minutes past the hour, as an integer between 0 and 59. +@item hour +The hour of the day, as an integer between 0 and 23. +@item day +The day of the month, as an integer between 1 and 31. +@item month +The month of the year, as an integer between 1 and 12. +@item year +The year, an integer typically greater than 1900. +@item dow +The day of week, as an integer between 0 and 6, where 0 stands for +Sunday. +@item dst +@code{t} if daylight saving time is effect, otherwise @code{nil}. +@item zone +An integer indicating the time zone, as the number of seconds east of +Greenwich. +@end table + +@strong{Common Lisp Note:} Common Lisp has different meanings for +@var{dow} and @var{zone}. +@end defun + +@defun encode-time seconds minutes hour day month year &optional zone +This function is the inverse of @code{decode-time}. It converts seven +items of calendrical data into a time value. For the meanings of the +arguments, see the table above under @code{decode-time}. + +Year numbers less than 100 are not treated specially. If you want them +to stand for years above 1900, or years above 2000, you must alter them +yourself before you call @code{encode-time}. + +The optional argument @var{zone} defaults to the current time zone and +its daylight saving time rules. If specified, it can be either a list +(as you would get from @code{current-time-zone}), a string as in the +@code{TZ} environment variable, @code{t} for Universal Time, or an +integer (as you would get from @code{decode-time}). The specified +zone is used without any further alteration for daylight saving time. + +If you pass more than seven arguments to @code{encode-time}, the first +six are used as @var{seconds} through @var{year}, the last argument is +used as @var{zone}, and the arguments in between are ignored. This +feature makes it possible to use the elements of a list returned by +@code{decode-time} as the arguments to @code{encode-time}, like this: + +@example +(apply 'encode-time (decode-time @dots{})) +@end example + +You can perform simple date arithmetic by using out-of-range values for +the @var{seconds}, @var{minutes}, @var{hour}, @var{day}, and @var{month} +arguments; for example, day 0 means the day preceding the given month. + +The operating system puts limits on the range of possible time values; +if you try to encode a time that is out of range, an error results. +For instance, years before 1970 do not work on some systems; +on others, years as early as 1901 do work. +@end defun + +@node Time Parsing +@section Parsing and Formatting Times + + These functions convert time values (lists of two or three integers) +to text in a string, and vice versa. + +@defun date-to-time string +This function parses the time-string @var{string} and returns the +corresponding time value. +@end defun + +@defun format-time-string format-string &optional time universal +This function converts @var{time} (or the current time, if @var{time} is +omitted) to a string according to @var{format-string}. The argument +@var{format-string} may contain @samp{%}-sequences which say to +substitute parts of the time. Here is a table of what the +@samp{%}-sequences mean: + +@table @samp +@item %a +This stands for the abbreviated name of the day of week. +@item %A +This stands for the full name of the day of week. +@item %b +This stands for the abbreviated name of the month. +@item %B +This stands for the full name of the month. +@item %c +This is a synonym for @samp{%x %X}. +@item %C +This has a locale-specific meaning. In the default locale (named C), it +is equivalent to @samp{%A, %B %e, %Y}. +@item %d +This stands for the day of month, zero-padded. +@item %D +This is a synonym for @samp{%m/%d/%y}. +@item %e +This stands for the day of month, blank-padded. +@item %h +This is a synonym for @samp{%b}. +@item %H +This stands for the hour (00-23). +@item %I +This stands for the hour (01-12). +@item %j +This stands for the day of the year (001-366). +@item %k +This stands for the hour (0-23), blank padded. +@item %l +This stands for the hour (1-12), blank padded. +@item %m +This stands for the month (01-12). +@item %M +This stands for the minute (00-59). +@item %n +This stands for a newline. +@item %p +This stands for @samp{AM} or @samp{PM}, as appropriate. +@item %r +This is a synonym for @samp{%I:%M:%S %p}. +@item %R +This is a synonym for @samp{%H:%M}. +@item %S +This stands for the seconds (00-59). +@item %t +This stands for a tab character. +@item %T +This is a synonym for @samp{%H:%M:%S}. +@item %U +This stands for the week of the year (01-52), assuming that weeks +start on Sunday. +@item %w +This stands for the numeric day of week (0-6). Sunday is day 0. +@item %W +This stands for the week of the year (01-52), assuming that weeks +start on Monday. +@item %x +This has a locale-specific meaning. In the default locale (named +@samp{C}), it is equivalent to @samp{%D}. +@item %X +This has a locale-specific meaning. In the default locale (named +@samp{C}), it is equivalent to @samp{%T}. +@item %y +This stands for the year without century (00-99). +@item %Y +This stands for the year with century. +@item %Z +This stands for the time zone abbreviation (e.g., @samp{EST}). +@item %z +This stands for the time zone numerical offset (e.g., @samp{-0500}). +@end table + +You can also specify the field width and type of padding for any of +these @samp{%}-sequences. This works as in @code{printf}: you write +the field width as digits in the middle of a @samp{%}-sequences. If you +start the field width with @samp{0}, it means to pad with zeros. If you +start the field width with @samp{_}, it means to pad with spaces. + +For example, @samp{%S} specifies the number of seconds since the minute; +@samp{%03S} means to pad this with zeros to 3 positions, @samp{%_3S} to +pad with spaces to 3 positions. Plain @samp{%3S} pads with zeros, +because that is how @samp{%S} normally pads to two positions. + +The characters @samp{E} and @samp{O} act as modifiers when used between +@samp{%} and one of the letters in the table above. @samp{E} specifies +using the current locale's ``alternative'' version of the date and time. +In a Japanese locale, for example, @code{%Ex} might yield a date format +based on the Japanese Emperors' reigns. @samp{E} is allowed in +@samp{%Ec}, @samp{%EC}, @samp{%Ex}, @samp{%EX}, @samp{%Ey}, and +@samp{%EY}. + +@samp{O} means to use the current locale's ``alternative'' +representation of numbers, instead of the ordinary decimal digits. This +is allowed with most letters, all the ones that output numbers. + +If @var{universal} is non-@code{nil}, that means to describe the time as +Universal Time; @code{nil} means describe it using what Emacs believes +is the local time zone (see @code{current-time-zone}). + +This function uses the C library function @code{strftime} +(@pxref{Formatting Calendar Time,,, libc, The GNU C Library Reference +Manual}) to do most of the work. In order to communicate with that +function, it first encodes its argument using the coding system +specified by @code{locale-coding-system} (@pxref{Locales}); after +@code{strftime} returns the resulting string, +@code{format-time-string} decodes the string using that same coding +system. +@end defun + +@defun seconds-to-time seconds +This function converts @var{seconds}, a floating point number of +seconds since the epoch, to a time value and returns that. To perform +the inverse conversion, use @code{float-time}. +@end defun + +@node Processor Run Time +@section Processor Run time +@cindex processor run time + +@defun get-internal-run-time +This function returns the processor run time used by Emacs as a list +of three integers: @code{(@var{high} @var{low} @var{microsec})}. The +integers @var{high} and @var{low} combine to give the number of +seconds, which is +@ifnottex +@var{high} * 2**16 + @var{low}. +@end ifnottex +@tex +$high*2^{16}+low$. +@end tex + +The third element, @var{microsec}, gives the microseconds (or 0 for +systems that return time with the resolution of only one second). + +If the system doesn't provide a way to determine the processor run +time, get-internal-run-time returns the same time as current-time. +@end defun + +@node Time Calculations +@section Time Calculations + + These functions perform calendrical computations using time values +(the kind of list that @code{current-time} returns). + +@defun time-less-p t1 t2 +This returns @code{t} if time value @var{t1} is less than time value +@var{t2}. +@end defun + +@defun time-subtract t1 t2 +This returns the time difference @var{t1} @minus{} @var{t2} between +two time values, in the same format as a time value. +@end defun + +@defun time-add t1 t2 +This returns the sum of two time values, one of which ought to +represent a time difference rather than a point in time. +Here is how to add a number of seconds to a time value: + +@example +(time-add @var{time} (seconds-to-time @var{seconds})) +@end example +@end defun + +@defun time-to-days time +This function returns the number of days between the beginning of year +1 and @var{time}. +@end defun + +@defun time-to-day-in-year time +This returns the day number within the year corresponding to @var{time}. +@end defun + +@defun date-leap-year-p year +This function returns @code{t} if @var{year} is a leap year. +@end defun + +@node Timers +@section Timers for Delayed Execution +@cindex timer + + You can set up a @dfn{timer} to call a function at a specified +future time or after a certain length of idleness. + + Emacs cannot run timers at any arbitrary point in a Lisp program; it +can run them only when Emacs could accept output from a subprocess: +namely, while waiting or inside certain primitive functions such as +@code{sit-for} or @code{read-event} which @emph{can} wait. Therefore, a +timer's execution may be delayed if Emacs is busy. However, the time of +execution is very precise if Emacs is idle. + + Emacs binds @code{inhibit-quit} to @code{t} before calling the timer +function, because quitting out of many timer functions can leave +things in an inconsistent state. This is normally unproblematical +because most timer functions don't do a lot of work. Indeed, for a +timer to call a function that takes substantial time to run is likely +to be annoying. If a timer function needs to allow quitting, it +should use @code{with-local-quit} (@pxref{Quitting}). For example, if +a timer function calls @code{accept-process-output} to receive output +from an external process, that call should be wrapped inside +@code{with-local-quit}, to ensure that @kbd{C-g} works if the external +process hangs. + + It is usually a bad idea for timer functions to alter buffer +contents. When they do, they usually should call @code{undo-boundary} +both before and after changing the buffer, to separate the timer's +changes from user commands' changes and prevent a single undo entry +from growing to be quite large. + + Timer functions should also avoid calling functions that cause Emacs +to wait, such as @code{sit-for} (@pxref{Waiting}). This can lead to +unpredictable effects, since other timers (or even the same timer) can +run while waiting. If a timer function needs to perform an action +after a certain time has elapsed, it can do this by scheduling a new +timer. + + If a timer function calls functions that can change the match data, +it should save and restore the match data. @xref{Saving Match Data}. + +@deffn Command run-at-time time repeat function &rest args +This sets up a timer that calls the function @var{function} with +arguments @var{args} at time @var{time}. If @var{repeat} is a number +(integer or floating point), the timer is scheduled to run again every +@var{repeat} seconds after @var{time}. If @var{repeat} is @code{nil}, +the timer runs only once. + +@var{time} may specify an absolute or a relative time. + +Absolute times may be specified using a string with a limited variety +of formats, and are taken to be times @emph{today}, even if already in +the past. The recognized forms are @samp{@var{xxxx}}, +@samp{@var{x}:@var{xx}}, or @samp{@var{xx}:@var{xx}} (military time), +and @samp{@var{xx}am}, @samp{@var{xx}AM}, @samp{@var{xx}pm}, +@samp{@var{xx}PM}, @samp{@var{xx}:@var{xx}am}, +@samp{@var{xx}:@var{xx}AM}, @samp{@var{xx}:@var{xx}pm}, or +@samp{@var{xx}:@var{xx}PM}. A period can be used instead of a colon +to separate the hour and minute parts. + +To specify a relative time as a string, use numbers followed by units. +For example: + +@table @samp +@item 1 min +denotes 1 minute from now. +@item 1 min 5 sec +denotes 65 seconds from now. +@item 1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year +denotes exactly 103 months, 123 days, and 10862 seconds from now. +@end table + +For relative time values, Emacs considers a month to be exactly thirty +days, and a year to be exactly 365.25 days. + +Not all convenient formats are strings. If @var{time} is a number +(integer or floating point), that specifies a relative time measured in +seconds. The result of @code{encode-time} can also be used to specify +an absolute value for @var{time}. + +In most cases, @var{repeat} has no effect on when @emph{first} call +takes place---@var{time} alone specifies that. There is one exception: +if @var{time} is @code{t}, then the timer runs whenever the time is a +multiple of @var{repeat} seconds after the epoch. This is useful for +functions like @code{display-time}. + +The function @code{run-at-time} returns a timer value that identifies +the particular scheduled future action. You can use this value to call +@code{cancel-timer} (see below). +@end deffn + + A repeating timer nominally ought to run every @var{repeat} seconds, +but remember that any invocation of a timer can be late. Lateness of +one repetition has no effect on the scheduled time of the next +repetition. For instance, if Emacs is busy computing for long enough +to cover three scheduled repetitions of the timer, and then starts to +wait, it will immediately call the timer function three times in +immediate succession (presuming no other timers trigger before or +between them). If you want a timer to run again no less than @var{n} +seconds after the last invocation, don't use the @var{repeat} argument. +Instead, the timer function should explicitly reschedule the timer. + +@defvar timer-max-repeats +This variable's value specifies the maximum number of times to repeat +calling a timer function in a row, when many previously scheduled +calls were unavoidably delayed. +@end defvar + +@defmac with-timeout (seconds timeout-forms@dots{}) body@dots{} +Execute @var{body}, but give up after @var{seconds} seconds. If +@var{body} finishes before the time is up, @code{with-timeout} returns +the value of the last form in @var{body}. If, however, the execution of +@var{body} is cut short by the timeout, then @code{with-timeout} +executes all the @var{timeout-forms} and returns the value of the last +of them. + +This macro works by setting a timer to run after @var{seconds} seconds. If +@var{body} finishes before that time, it cancels the timer. If the +timer actually runs, it terminates execution of @var{body}, then +executes @var{timeout-forms}. + +Since timers can run within a Lisp program only when the program calls a +primitive that can wait, @code{with-timeout} cannot stop executing +@var{body} while it is in the midst of a computation---only when it +calls one of those primitives. So use @code{with-timeout} only with a +@var{body} that waits for input, not one that does a long computation. +@end defmac + + The function @code{y-or-n-p-with-timeout} provides a simple way to use +a timer to avoid waiting too long for an answer. @xref{Yes-or-No +Queries}. + +@defun cancel-timer timer +This cancels the requested action for @var{timer}, which should be a +timer---usually, one previously returned by @code{run-at-time} or +@code{run-with-idle-timer}. This cancels the effect of that call to +one of these functions; the arrival of the specified time will not +cause anything special to happen. +@end defun + +@node Idle Timers +@section Idle Timers + + Here is how to set up a timer that runs when Emacs is idle for a +certain length of time. Aside from how to set them up, idle timers +work just like ordinary timers. + +@deffn Command run-with-idle-timer secs repeat function &rest args +Set up a timer which runs when Emacs has been idle for @var{secs} +seconds. The value of @var{secs} may be an integer or a floating point +number; a value of the type returned by @code{current-idle-time} +is also allowed. + +If @var{repeat} is @code{nil}, the timer runs just once, the first time +Emacs remains idle for a long enough time. More often @var{repeat} is +non-@code{nil}, which means to run the timer @emph{each time} Emacs +remains idle for @var{secs} seconds. + +The function @code{run-with-idle-timer} returns a timer value which you +can use in calling @code{cancel-timer} (@pxref{Timers}). +@end deffn + +@cindex idleness + Emacs becomes ``idle'' when it starts waiting for user input, and it +remains idle until the user provides some input. If a timer is set for +five seconds of idleness, it runs approximately five seconds after Emacs +first becomes idle. Even if @var{repeat} is non-@code{nil}, this timer +will not run again as long as Emacs remains idle, because the duration +of idleness will continue to increase and will not go down to five +seconds again. + + Emacs can do various things while idle: garbage collect, autosave or +handle data from a subprocess. But these interludes during idleness do +not interfere with idle timers, because they do not reset the clock of +idleness to zero. An idle timer set for 600 seconds will run when ten +minutes have elapsed since the last user command was finished, even if +subprocess output has been accepted thousands of times within those ten +minutes, and even if there have been garbage collections and autosaves. + + When the user supplies input, Emacs becomes non-idle while executing the +input. Then it becomes idle again, and all the idle timers that are +set up to repeat will subsequently run another time, one by one. + +@c Emacs 19 feature +@defun current-idle-time +This function returns the length of time Emacs has been idle, as a +list of three integers: @code{(@var{high} @var{low} @var{microsec})}. +The integers @var{high} and @var{low} combine to give the number of +seconds of idleness, which is +@ifnottex +@var{high} * 2**16 + @var{low}. +@end ifnottex +@tex +$high*2^{16}+low$. +@end tex + +The third element, @var{microsec}, gives the microseconds since the +start of the current second (or 0 for systems that return time with +the resolution of only one second). + +The main use of this function is when an idle timer function wants to +``take a break'' for a while. It can set up another idle timer to +call the same function again, after a few seconds more idleness. +Here's an example: + +@smallexample +(defvar resume-timer nil + "Timer that `timer-function' used to reschedule itself, or nil.") + +(defun timer-function () + ;; @r{If the user types a command while @code{resume-timer}} + ;; @r{is active, the next time this function is called from} + ;; @r{its main idle timer, deactivate @code{resume-timer}.} + (when resume-timer + (cancel-timer resume-timer)) + ...@var{do the work for a while}... + (when @var{taking-a-break} + (setq resume-timer + (run-with-idle-timer + ;; Compute an idle time @var{break-length} + ;; more than the current value. + (time-add (current-idle-time) + (seconds-to-time @var{break-length})) + nil + 'timer-function)))) +@end smallexample +@end defun + + Some idle timer functions in user Lisp packages have a loop that +does a certain amount of processing each time around, and exits when +@code{(input-pending-p)} is non-@code{nil}. That approach seems very +natural but has two problems: + +@itemize +@item +It blocks out all process output (since Emacs accepts process output +only while waiting). + +@item +It blocks out any idle timers that ought to run during that time. +@end itemize + +@noindent +To avoid these problems, don't use that technique. Instead, write +such idle timers to reschedule themselves after a brief pause, using +the method in the @code{timer-function} example above. + +@node Terminal Input +@section Terminal Input +@cindex terminal input + + This section describes functions and variables for recording or +manipulating terminal input. See @ref{Display}, for related +functions. + +@menu +* Input Modes:: Options for how input is processed. +* Recording Input:: Saving histories of recent or all input events. +@end menu + +@node Input Modes +@subsection Input Modes +@cindex input modes +@cindex terminal input modes + +@defun set-input-mode interrupt flow meta &optional quit-char +This function sets the mode for reading keyboard input. If +@var{interrupt} is non-null, then Emacs uses input interrupts. If it is +@code{nil}, then it uses @sc{cbreak} mode. The default setting is +system-dependent. Some systems always use @sc{cbreak} mode regardless +of what is specified. + +When Emacs communicates directly with X, it ignores this argument and +uses interrupts if that is the way it knows how to communicate. + +If @var{flow} is non-@code{nil}, then Emacs uses @sc{xon/xoff} +(@kbd{C-q}, @kbd{C-s}) flow control for output to the terminal. This +has no effect except in @sc{cbreak} mode. + +@c Emacs 19 feature +The argument @var{meta} controls support for input character codes +above 127. If @var{meta} is @code{t}, Emacs converts characters with +the 8th bit set into Meta characters. If @var{meta} is @code{nil}, +Emacs disregards the 8th bit; this is necessary when the terminal uses +it as a parity bit. If @var{meta} is neither @code{t} nor @code{nil}, +Emacs uses all 8 bits of input unchanged. This is good for terminals +that use 8-bit character sets. + +@c Emacs 19 feature +If @var{quit-char} is non-@code{nil}, it specifies the character to +use for quitting. Normally this character is @kbd{C-g}. +@xref{Quitting}. +@end defun + +The @code{current-input-mode} function returns the input mode settings +Emacs is currently using. + +@c Emacs 19 feature +@defun current-input-mode +This function returns the current mode for reading keyboard input. It +returns a list, corresponding to the arguments of @code{set-input-mode}, +of the form @code{(@var{interrupt} @var{flow} @var{meta} @var{quit})} in +which: +@table @var +@item interrupt +is non-@code{nil} when Emacs is using interrupt-driven input. If +@code{nil}, Emacs is using @sc{cbreak} mode. +@item flow +is non-@code{nil} if Emacs uses @sc{xon/xoff} (@kbd{C-q}, @kbd{C-s}) +flow control for output to the terminal. This value is meaningful only +when @var{interrupt} is @code{nil}. +@item meta +is @code{t} if Emacs treats the eighth bit of input characters as +the meta bit; @code{nil} means Emacs clears the eighth bit of every +input character; any other value means Emacs uses all eight bits as the +basic character code. +@item quit +is the character Emacs currently uses for quitting, usually @kbd{C-g}. +@end table +@end defun + +@node Recording Input +@subsection Recording Input +@cindex recording input + +@defun recent-keys +This function returns a vector containing the last 300 input events from +the keyboard or mouse. All input events are included, whether or not +they were used as parts of key sequences. Thus, you always get the last +100 input events, not counting events generated by keyboard macros. +(These are excluded because they are less interesting for debugging; it +should be enough to see the events that invoked the macros.) + +A call to @code{clear-this-command-keys} (@pxref{Command Loop Info}) +causes this function to return an empty vector immediately afterward. +@end defun + +@deffn Command open-dribble-file filename +@cindex dribble file +This function opens a @dfn{dribble file} named @var{filename}. When a +dribble file is open, each input event from the keyboard or mouse (but +not those from keyboard macros) is written in that file. A +non-character event is expressed using its printed representation +surrounded by @samp{<@dots{}>}. + +You close the dribble file by calling this function with an argument +of @code{nil}. + +This function is normally used to record the input necessary to +trigger an Emacs bug, for the sake of a bug report. + +@example +@group +(open-dribble-file "~/dribble") + @result{} nil +@end group +@end example +@end deffn + + See also the @code{open-termscript} function (@pxref{Terminal Output}). + +@node Terminal Output +@section Terminal Output +@cindex terminal output + + The terminal output functions send output to a text terminal, or keep +track of output sent to the terminal. The variable @code{baud-rate} +tells you what Emacs thinks is the output speed of the terminal. + +@defvar baud-rate +This variable's value is the output speed of the terminal, as far as +Emacs knows. Setting this variable does not change the speed of actual +data transmission, but the value is used for calculations such as +padding. + + It also affects decisions about whether to scroll part of the +screen or repaint on text terminals. @xref{Forcing Redisplay}, +for the corresponding functionality on graphical terminals. + +The value is measured in baud. +@end defvar + + 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 Emacs has the wrong value, it makes decisions that are less +than optimal. To fix the problem, set @code{baud-rate}. + +@defun baud-rate +This obsolete function returns the value of the variable +@code{baud-rate}. +@end defun + +@defun send-string-to-terminal string +This function sends @var{string} to the terminal without alteration. +Control characters in @var{string} have terminal-dependent effects. +This function operates only on text terminals. + +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 @kbd{C-u C-f} to the +computer): + +@example +@group +(send-string-to-terminal "\eF4\^U\^F") + @result{} nil +@end group +@end example +@end defun + +@deffn Command open-termscript filename +@cindex termscript file +This function is used to open a @dfn{termscript file} that will record +all the characters sent by Emacs to the terminal. It returns +@code{nil}. Termscript files are useful for investigating problems +where Emacs garbles the screen, problems that are due to incorrect +Termcap entries or to undesirable settings of terminal options more +often than to 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. + +You close the termscript file by calling this function with an +argument of @code{nil}. + +See also @code{open-dribble-file} in @ref{Recording Input}. + +@example +@group +(open-termscript "../junk/termscript") + @result{} nil +@end group +@end example +@end deffn + +@node Sound Output +@section Sound Output +@cindex sound + + To play sound using Emacs, use the function @code{play-sound}. Only +certain systems are supported; if you call @code{play-sound} on a system +which cannot really do the job, it gives an error. Emacs version 20 and +earlier did not support sound at all. + + The sound must be stored as a file in RIFF-WAVE format (@samp{.wav}) +or Sun Audio format (@samp{.au}). + +@defun play-sound sound +This function plays a specified sound. The argument, @var{sound}, has +the form @code{(sound @var{properties}...)}, where the @var{properties} +consist of alternating keywords (particular symbols recognized +specially) and values corresponding to them. + +Here is a table of the keywords that are currently meaningful in +@var{sound}, and their meanings: + +@table @code +@item :file @var{file} +This specifies the file containing the sound to play. +If the file name is not absolute, it is expanded against +the directory @code{data-directory}. + +@item :data @var{data} +This specifies the sound to play without need to refer to a file. The +value, @var{data}, should be a string containing the same bytes as a +sound file. We recommend using a unibyte string. + +@item :volume @var{volume} +This specifies how loud to play the sound. It should be a number in the +range of 0 to 1. The default is to use whatever volume has been +specified before. + +@item :device @var{device} +This specifies the system device on which to play the sound, as a +string. The default device is system-dependent. +@end table + +Before actually playing the sound, @code{play-sound} +calls the functions in the list @code{play-sound-functions}. +Each function is called with one argument, @var{sound}. +@end defun + +@defun play-sound-file file &optional volume device +This function is an alternative interface to playing a sound @var{file} +specifying an optional @var{volume} and @var{device}. +@end defun + +@defvar play-sound-functions +A list of functions to be called before playing a sound. Each function +is called with one argument, a property list that describes the sound. +@end defvar + +@node X11 Keysyms +@section Operating on X11 Keysyms +@cindex X11 keysyms + +To define system-specific X11 keysyms, set the variable +@code{system-key-alist}. + +@defvar system-key-alist +This variable's value should be an alist with one element for each +system-specific keysym. Each element has the form @code{(@var{code} +. @var{symbol})}, where @var{code} is the numeric keysym code (not +including the ``vendor specific'' bit, +@ifnottex +-2**28), +@end ifnottex +@tex +$-2^{28}$), +@end tex +and @var{symbol} is the name for the function key. + +For example @code{(168 . mute-acute)} defines a system-specific key (used +by HP X servers) whose numeric code is +@ifnottex +-2**28 +@end ifnottex +@tex +$-2^{28}$ +@end tex ++ 168. + +It is not crucial to exclude from the alist the keysyms of other X +servers; those do no harm, as long as they don't conflict with the ones +used by the X server actually in use. + +The variable is always local to the current terminal, and cannot be +buffer-local. @xref{Multiple Displays}. +@end defvar + +You can specify which keysyms Emacs should use for the Meta, Alt, Hyper, and Super modifiers by setting these variables: + +@defvar x-alt-keysym +@defvarx x-meta-keysym +@defvarx x-hyper-keysym +@defvarx x-super-keysym +The name of the keysym that should stand for the Alt modifier +(respectively, for Meta, Hyper, and Super). For example, here is +how to swap the Meta and Alt modifiers within Emacs: +@lisp +(setq x-alt-keysym 'meta) +(setq x-meta-keysym 'alt) +@end lisp +@end defvar + +@node Batch Mode +@section Batch Mode +@cindex batch mode + + The command-line option @samp{-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 specify +Lisp programs to run; when they are finished, Emacs should exit. The +way to specify the programs to run is with @samp{-l @var{file}}, which +loads the library named @var{file}, or @samp{-f @var{function}}, which +calls @var{function} with no arguments, or @samp{--eval @var{form}}. + + Any Lisp program output that would normally go to the echo area, +either using @code{message}, or using @code{prin1}, etc., with @code{t} +as the stream, goes instead to Emacs's standard error descriptor when +in batch mode. Similarly, input that would normally come from the +minibuffer is read from the standard input descriptor. +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.) + +@defvar noninteractive +This variable is non-@code{nil} when Emacs is running in batch mode. +@end defvar + +@node Session Management +@section Session Management +@cindex session manager + +Emacs supports the X Session Management Protocol for suspension and +restart of applications. In the X Window System, a program called the +@dfn{session manager} has the responsibility to keep track of the +applications that are running. During shutdown, the session manager +asks applications to save their state, and delays the actual shutdown +until they respond. An application can also cancel the shutdown. + +When the session manager restarts a suspended session, it directs +these applications to individually reload their saved state. It does +this by specifying a special command-line argument that says what +saved session to restore. For Emacs, this argument is @samp{--smid +@var{session}}. + +@defvar emacs-save-session-functions +Emacs supports saving state by using a hook called +@code{emacs-save-session-functions}. Each function in this hook is +called when the session manager tells Emacs that the window system is +shutting down. The functions are called with no arguments and with the +current buffer set to a temporary buffer. Each function can use +@code{insert} to add Lisp code to this buffer. At the end, Emacs +saves the buffer in a file that a subsequent Emacs invocation will +load in order to restart the saved session. + +If a function in @code{emacs-save-session-functions} returns +non-@code{nil}, Emacs tells the session manager to cancel the +shutdown. +@end defvar + +Here is an example that just inserts some text into @samp{*scratch*} when +Emacs is restarted by the session manager. + +@example +@group +(add-hook 'emacs-save-session-functions 'save-yourself-test) +@end group + +@group +(defun save-yourself-test () + (insert "(save-excursion + (switch-to-buffer \"*scratch*\") + (insert \"I am restored\"))") + nil) +@end group +@end example + +@ignore + arch-tag: 8378814a-30d7-467c-9615-74a80b9988a7 +@end ignore diff --git a/doc/lispref/positions.texi b/doc/lispref/positions.texi new file mode 100644 index 00000000000..939b3f75fc1 --- /dev/null +++ b/doc/lispref/positions.texi @@ -0,0 +1,1004 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/positions +@node Positions, Markers, Frames, Top +@chapter Positions +@cindex position (in buffer) + + A @dfn{position} is the index of a character in the text of a 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, we +often speak of the character ``at'' a position, meaning the character +after that position. + + Positions are usually represented as integers starting from 1, but +can also be represented as @dfn{markers}---special objects that +relocate automatically when text is inserted or deleted so they stay +with the surrounding characters. Functions that expect an argument to +be a position (an integer), but accept a marker as a substitute, +normally ignore which buffer the marker points into; they convert the +marker to an integer, and use that integer, exactly as if you had +passed the integer as the argument, even if the marker points to the +``wrong'' buffer. A marker that points nowhere cannot convert to an +integer; using it instead of an integer causes an error. +@xref{Markers}. + + See also the ``field'' feature (@pxref{Fields}), which provides +functions that are used by many cursor-motion commands. + +@menu +* Point:: The special position where editing takes place. +* Motion:: Changing point. +* Excursions:: Temporary motion and buffer changes. +* Narrowing:: Restricting editing to a portion of the buffer. +@end menu + +@node Point +@section Point +@cindex point + + @dfn{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. Usually terminals display the cursor over +the character that immediately follows point; point is actually before +the character on which the cursor sits. + +@cindex point with narrowing + The value of point is a number no less than 1, and no greater than the +buffer size plus 1. If narrowing is in effect (@pxref{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. @xref{Window Point}, for more +details. + +@defun point +@cindex current buffer position +This function returns the value of point in the current buffer, +as an integer. + +@need 700 +@example +@group +(point) + @result{} 175 +@end group +@end example +@end defun + +@defun point-min +This function returns the minimum accessible value of point in the +current buffer. This is normally 1, but if narrowing is in effect, it +is the position of the start of the region that you narrowed to. +(@xref{Narrowing}.) +@end defun + +@defun point-max +This function returns the maximum accessible value of point in the +current buffer. This is @code{(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. (@xref{Narrowing}.) +@end defun + +@defun buffer-end flag +This function returns @code{(point-max)} if @var{flag} is greater than +0, @code{(point-min)} otherwise. The argument @var{flag} must be a +number. +@end defun + +@defun buffer-size &optional buffer +This function returns the total number of characters in the current +buffer. In the absence of any narrowing (@pxref{Narrowing}), +@code{point-max} returns a value one larger than this. + +If you specify a buffer, @var{buffer}, then the value is the +size of @var{buffer}. + +@example +@group +(buffer-size) + @result{} 35 +@end group +@group +(point-max) + @result{} 36 +@end group +@end example +@end defun + +@node Motion +@section Motion +@cindex motion by chars, words, lines, lists + + 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. @xref{Point}. + +@menu +* Character Motion:: Moving in terms of characters. +* Word Motion:: Moving in terms of words. +* Buffer End Motion:: Moving to the beginning or end of the buffer. +* Text Lines:: Moving in terms of lines of text. +* Screen Lines:: Moving in terms of lines as displayed. +* List Motion:: Moving by parsing lists and sexps. +* Skipping Characters:: Skipping characters belonging to a certain set. +@end menu + +@node Character Motion +@subsection Motion by Characters + + These functions move point based on a count of characters. +@code{goto-char} is the fundamental primitive; the other functions use +that. + +@deffn Command goto-char position +This function sets point in the current buffer to the value +@var{position}. If @var{position} is less than 1, it moves point to the +beginning of the buffer. If @var{position} is greater than the length +of the buffer, it moves point to the end. + +If narrowing is in effect, @var{position} still counts from the +beginning of the buffer, but point cannot go outside the accessible +portion. If @var{position} is out of range, @code{goto-char} moves +point to the beginning or the end of the accessible portion. + +When this function is called interactively, @var{position} is the +numeric prefix argument, if provided; otherwise it is read from the +minibuffer. + +@code{goto-char} returns @var{position}. +@end deffn + +@deffn Command forward-char &optional count +@c @kindex beginning-of-buffer +@c @kindex end-of-buffer +This function moves point @var{count} characters forward, towards the +end of the buffer (or backward, towards the beginning of the buffer, if +@var{count} is negative). If @var{count} is @code{nil}, the default +is 1. + +If this attempts to move past the beginning or end of the buffer (or +the limits of the accessible portion, when narrowing is in effect), it +signals an error with error symbol @code{beginning-of-buffer} or +@code{end-of-buffer}. + +In an interactive call, @var{count} is the numeric prefix argument. +@end deffn + +@deffn Command backward-char &optional count +This is just like @code{forward-char} except that it moves +in the opposite direction. +@end deffn + +@node Word Motion +@subsection Motion by Words + + These functions for parsing words use the syntax table to decide +whether a given character is part of a word. @xref{Syntax Tables}. + +@deffn Command forward-word &optional count +This function moves point forward @var{count} words (or backward if +@var{count} is negative). If @var{count} is @code{nil}, it moves +forward one word. + +``Moving one word'' means moving until point crosses a +word-constituent character and then encounters a word-separator +character. However, this function cannot move point past the boundary +of the accessible portion of the buffer, or across a field boundary +(@pxref{Fields}). The most common case of a field boundary is the end +of the prompt in the minibuffer. + +If it is possible to move @var{count} words, without being stopped +prematurely by the buffer boundary or a field boundary, the value is +@code{t}. Otherwise, the return value is @code{nil} and point stops at +the buffer boundary or field boundary. + +If @code{inhibit-field-text-motion} is non-@code{nil}, +this function ignores field boundaries. + +In an interactive call, @var{count} is specified by the numeric prefix +argument. If @var{count} is omitted or @code{nil}, it defaults to 1. +@end deffn + +@deffn Command backward-word &optional count +This function is just like @code{forward-word}, except that it moves +backward until encountering the front of a word, rather than forward. +@end deffn + +@defvar words-include-escapes +@c Emacs 19 feature +This variable affects the behavior of @code{forward-word} and everything +that uses it. If it is non-@code{nil}, then characters in the +``escape'' and ``character quote'' syntax classes count as part of +words. Otherwise, they do not. +@end defvar + +@defvar inhibit-field-text-motion +If this variable is non-@code{nil}, certain motion functions including +@code{forward-word}, @code{forward-sentence}, and +@code{forward-paragraph} ignore field boundaries. +@end defvar + +@node Buffer End Motion +@subsection Motion to an End of the Buffer +@cindex move to beginning or end of buffer + + To move point to the beginning of the buffer, write: + +@example +@group +(goto-char (point-min)) +@end group +@end example + +@noindent +Likewise, to move to the end of the buffer, use: + +@example +@group +(goto-char (point-max)) +@end group +@end example + + Here are two commands that 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. + +@deffn 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 (except in Transient Mark mode, if +the mark is already active, it does not set the mark.) + +If @var{n} is non-@code{nil}, then it puts point @var{n} tenths of the +way from the beginning of the accessible portion of the buffer. In an +interactive call, @var{n} is the numeric prefix argument, if provided; +otherwise @var{n} defaults to @code{nil}. + +@strong{Warning:} Don't use this function in Lisp programs! +@end deffn + +@deffn 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 (except in Transient Mark mode when the mark +is already active). If @var{n} is non-@code{nil}, then it puts point +@var{n} tenths of the way from the end of the accessible portion of +the buffer. + +In an interactive call, @var{n} is the numeric prefix argument, +if provided; otherwise @var{n} defaults to @code{nil}. + +@strong{Warning:} Don't use this function in Lisp programs! +@end deffn + +@node Text Lines +@subsection Motion by Text Lines +@cindex 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, by line continuation in display, or by how tabs and +control characters are displayed. + +@deffn Command goto-line line +This function moves point to the front of the @var{line}th line, +counting from line 1 at beginning of the buffer. If @var{line} is less +than 1, it moves point to the beginning of the buffer. If @var{line} is +greater than the number of lines in the buffer, it moves point to the +end of the buffer---that is, the @emph{end of the last line} of the +buffer. This is the only case in which @code{goto-line} does not +necessarily move to the beginning of a line. + +If narrowing is in effect, then @var{line} still counts from the +beginning of the buffer, but point cannot go outside the accessible +portion. So @code{goto-line} moves point to the beginning or end of the +accessible portion, if the line number specifies an inaccessible +position. + +The return value of @code{goto-line} is the difference between +@var{line} and the line number of the line to which point actually was +able to move (in the full buffer, before taking account of narrowing). +Thus, the value is positive if the scan encounters the real end of the +buffer before finding the specified line. The value is zero if scan +encounters the end of the accessible portion but not the real end of the +buffer. + +In an interactive call, @var{line} is the numeric prefix argument if +one has been provided. Otherwise @var{line} is read in the minibuffer. +@end deffn + +@deffn Command beginning-of-line &optional count +This function moves point to the beginning of the current line. With an +argument @var{count} not @code{nil} or 1, it moves forward +@var{count}@minus{}1 lines and then to the beginning of the line. + +This function does not move point across a field boundary +(@pxref{Fields}) unless doing so would move beyond there to a +different line; therefore, if @var{count} is @code{nil} or 1, and +point starts at a field boundary, point does not move. To ignore +field boundaries, either bind @code{inhibit-field-text-motion} to +@code{t}, or use the @code{forward-line} function instead. For +instance, @code{(forward-line 0)} does the same thing as +@code{(beginning-of-line)}, except that it ignores field boundaries. + +If this function reaches the end of the buffer (or of the accessible +portion, if narrowing is in effect), it positions point there. No error +is signaled. +@end deffn + +@defun line-beginning-position &optional count +Return the position that @code{(beginning-of-line @var{count})} +would move to. +@end defun + +@deffn Command end-of-line &optional count +This function moves point to the end of the current line. With an +argument @var{count} not @code{nil} or 1, it moves forward +@var{count}@minus{}1 lines and then to the end of the line. + +This function does not move point across a field boundary +(@pxref{Fields}) unless doing so would move beyond there to a +different line; therefore, if @var{count} is @code{nil} or 1, and +point starts at a field boundary, point does not move. To ignore +field boundaries, bind @code{inhibit-field-text-motion} to @code{t}. + +If this function reaches the end of the buffer (or of the accessible +portion, if narrowing is in effect), it positions point there. No error +is signaled. +@end deffn + +@defun line-end-position &optional count +Return the position that @code{(end-of-line @var{count})} +would move to. +@end defun + +@deffn Command forward-line &optional count +@cindex beginning of line +This function moves point forward @var{count} lines, to the beginning of +the line. If @var{count} is negative, it moves point +@minus{}@var{count} lines backward, to the beginning of a line. If +@var{count} is zero, it moves point to the beginning of the current +line. If @var{count} is @code{nil}, that means 1. + +If @code{forward-line} encounters the beginning or end of the buffer (or +of the accessible portion) before finding that many lines, it sets point +there. No error is signaled. + +@code{forward-line} returns the difference between @var{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 stops at +the end of the last line, and the value will be 2. + +In an interactive call, @var{count} is the numeric prefix argument. +@end deffn + +@defun count-lines start end +@cindex lines in region +@anchor{Definition of count-lines} +This function returns the number of lines between the positions +@var{start} and @var{end} in the current buffer. If @var{start} and +@var{end} are equal, then it returns 0. Otherwise it returns at least +1, even if @var{start} and @var{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 @code{count-lines}: + +@example +@group +(defun current-line () + "Return the vertical position of point@dots{}" + (+ (count-lines (window-start) (point)) + (if (= (current-column) 0) 1 0))) +@end group +@end example +@end defun + +@defun line-number-at-pos &optional pos +@cindex line number +This function returns the line number in the current buffer +corresponding to the buffer position @var{pos}. If @var{pos} is @code{nil} +or omitted, the current buffer position is used. +@end defun + +@ignore +@c ================ +The @code{previous-line} and @code{next-line} commands are functions +that should not be used in programs. They are for users and are +mentioned here only for completeness. + +@deffn Command previous-line count +@cindex goal column +This function moves point up @var{count} lines (down if @var{count} +is negative). In moving, it attempts to keep point in the ``goal column'' +(normally the same column that it was at the beginning of the move). + +If there is no character in the target line exactly under the current +column, point is positioned after the character in that line which +spans this column, or at the end of the line if it is not long enough. + +If it attempts to move beyond the top or bottom of the buffer (or clipped +region), then point is positioned in the goal column in the top or +bottom line. No error is signaled. + +In an interactive call, @var{count} will be the numeric +prefix argument. + +The command @code{set-goal-column} can be used to create a semipermanent +goal column to which this command always moves. Then it does not try to +move vertically. + +If you are thinking of using this in a Lisp program, consider using +@code{forward-line} with a negative argument instead. It is usually easier +to use and more reliable (no dependence on goal column, etc.). +@end deffn + +@deffn Command next-line count +This function moves point down @var{count} lines (up if @var{count} +is negative). In moving, it attempts to keep point in the ``goal column'' +(normally the same column that it was at the beginning of the move). + +If there is no character in the target line exactly under the current +column, point is positioned after the character in that line which +spans this column, or at the end of the line if it is not long enough. + +If it attempts to move beyond the top or bottom of the buffer (or clipped +region), then point is positioned in the goal column in the top or +bottom line. No error is signaled. + +In the case where the @var{count} is 1, and point is on the last +line of the buffer (or clipped region), a new empty line is inserted at the +end of the buffer (or clipped region) and point moved there. + +In an interactive call, @var{count} will be the numeric +prefix argument. + +The command @code{set-goal-column} can be used to create a semipermanent +goal column to which this command always moves. Then it does not try to +move vertically. + +If you are thinking of using this in a Lisp program, consider using +@code{forward-line} instead. It is usually easier +to use and more reliable (no dependence on goal column, etc.). +@end deffn + +@c ================ +@end ignore + + Also see the functions @code{bolp} and @code{eolp} in @ref{Near Point}. +These functions do not move point, but test whether it is already at the +beginning or end of a line. + +@node Screen Lines +@subsection 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. In these cases, +@code{vertical-motion} moves point much like @code{forward-line}. +@xref{Truncation}. + + Because the width of a given string depends on the flags that control +the appearance of certain characters, @code{vertical-motion} behaves +differently, for a given piece of text, depending on the buffer it is +in, and even on the selected window (because the width, the truncation +flag, and display table may vary between windows). @xref{Usual +Display}. + + These functions scan text to determine where screen lines break, and +thus take time proportional to the distance scanned. If you intend to +use them heavily, Emacs provides caches which may improve the +performance of your code. @xref{Truncation, cache-long-line-scans}. + +@defun vertical-motion count &optional window +This function moves point to the start of the screen line @var{count} +screen lines down from the screen line containing point. If @var{count} +is negative, it moves up instead. + +@code{vertical-motion} returns the number of screen lines over which it +moved point. The value may be less in absolute value than @var{count} +if the beginning or end of the buffer was reached. + +The window @var{window} is used for obtaining parameters such as the +width, the horizontal scrolling, and the display table. But +@code{vertical-motion} always operates on the current buffer, even if +@var{window} currently displays some other buffer. +@end defun + +@defun count-screen-lines &optional beg end count-final-newline window +This function returns the number of screen lines in the text from +@var{beg} to @var{end}. The number of screen lines may be different +from the number of actual lines, due to line continuation, the display +table, etc. If @var{beg} and @var{end} are @code{nil} or omitted, +they default to the beginning and end of the accessible portion of the +buffer. + +If the region ends with a newline, that is ignored unless the optional +third argument @var{count-final-newline} is non-@code{nil}. + +The optional fourth argument @var{window} specifies the window for +obtaining parameters such as width, horizontal scrolling, and so on. +The default is to use the selected window's parameters. + +Like @code{vertical-motion}, @code{count-screen-lines} always uses the +current buffer, regardless of which buffer is displayed in +@var{window}. This makes possible to use @code{count-screen-lines} in +any buffer, whether or not it is currently displayed in some window. +@end defun + +@deffn Command move-to-window-line count +This function moves point with respect to the text currently displayed +in the selected window. It moves point to the beginning of the screen +line @var{count} screen lines from the top of the window. If +@var{count} is negative, that specifies a position +@w{@minus{}@var{count}} lines from the bottom (or the last line of the +buffer, if the buffer ends above the specified screen position). + +If @var{count} is @code{nil}, then point moves to the beginning of the +line in the middle of the window. If the absolute value of @var{count} +is greater than the size of the window, then point moves to the place +that 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, @var{count} is the numeric prefix argument. + +The value returned is the window line number point has moved to, with +the top line in the window numbered 0. +@end deffn + +@defun compute-motion from frompos to topos width offsets window +This function scans the current buffer, calculating screen positions. +It scans the buffer forward from position @var{from}, assuming that is +at screen coordinates @var{frompos}, to position @var{to} or coordinates +@var{topos}, whichever comes first. It returns the ending buffer +position and screen coordinates. + +The coordinate arguments @var{frompos} and @var{topos} are cons cells of +the form @code{(@var{hpos} . @var{vpos})}. + +The argument @var{width} is the number of columns available to display +text; this affects handling of continuation lines. @code{nil} means +the actual number of usable text columns in the window, which is +equivalent to the value returned by @code{(window-width window)}. + +The argument @var{offsets} is either @code{nil} or a cons cell of the +form @code{(@var{hscroll} . @var{tab-offset})}. Here @var{hscroll} is +the number of columns not being displayed at the left margin; most +callers get this by calling @code{window-hscroll}. Meanwhile, +@var{tab-offset} is the offset between column numbers on the screen and +column numbers in the buffer. This can be nonzero in a continuation +line, when the previous screen lines' widths do not add up to a multiple +of @code{tab-width}. It is always zero in a non-continuation line. + +The window @var{window} serves only to specify which display table to +use. @code{compute-motion} always operates on the current buffer, +regardless of what buffer is displayed in @var{window}. + +The return value is a list of five elements: + +@example +(@var{pos} @var{hpos} @var{vpos} @var{prevhpos} @var{contin}) +@end example + +@noindent +Here @var{pos} is the buffer position where the scan stopped, @var{vpos} +is the vertical screen position, and @var{hpos} is the horizontal screen +position. + +The result @var{prevhpos} is the horizontal position one character back +from @var{pos}. The result @var{contin} is @code{t} if the last line +was continued after (or within) the previous character. + +For example, to find the buffer position of column @var{col} of screen line +@var{line} of a certain window, pass the window's display start location +as @var{from} and the window's upper-left coordinates as @var{frompos}. +Pass the buffer's @code{(point-max)} as @var{to}, to limit the scan to +the end of the accessible portion of the buffer, and pass @var{line} and +@var{col} as @var{topos}. Here's a function that does this: + +@example +(defun coordinates-of-position (col line) + (car (compute-motion (window-start) + '(0 . 0) + (point-max) + (cons col line) + (window-width) + (cons (window-hscroll) 0) + (selected-window)))) +@end example + +When you use @code{compute-motion} for the minibuffer, you need to use +@code{minibuffer-prompt-width} to get the horizontal position of the +beginning of the first screen line. @xref{Minibuffer Contents}. +@end defun + +@node List Motion +@comment node-name, next, previous, up +@subsection Moving over Balanced Expressions +@cindex sexp motion +@cindex Lisp expression motion +@cindex list motion +@cindex balanced parenthesis motion + + Here are several functions concerned with balanced-parenthesis +expressions (also called @dfn{sexps} in connection with moving across +them in Emacs). The syntax table controls how these functions interpret +various characters; see @ref{Syntax Tables}. @xref{Parsing +Expressions}, for lower-level primitives for scanning sexps or parts of +sexps. For user-level commands, see @ref{Parentheses,, Commands for +Editing with Parentheses, emacs, The GNU Emacs Manual}. + +@deffn Command forward-list &optional arg +This function moves forward across @var{arg} (default 1) balanced groups of +parentheses. (Other syntactic entities such as words or paired string +quotes are ignored.) +@end deffn + +@deffn Command backward-list &optional arg +This function moves backward across @var{arg} (default 1) balanced groups of +parentheses. (Other syntactic entities such as words or paired string +quotes are ignored.) +@end deffn + +@deffn Command up-list &optional arg +This function moves forward out of @var{arg} (default 1) levels of parentheses. +A negative argument means move backward but still to a less deep spot. +@end deffn + +@deffn Command down-list &optional arg +This function moves forward into @var{arg} (default 1) levels of +parentheses. A negative argument means move backward but still go +deeper in parentheses (@minus{}@var{arg} levels). +@end deffn + +@deffn Command forward-sexp &optional arg +This function moves forward across @var{arg} (default 1) balanced expressions. +Balanced expressions include both those delimited by parentheses and +other kinds, such as words and string constants. +@xref{Parsing Expressions}. For example, + +@example +@group +---------- Buffer: foo ---------- +(concat@point{} "foo " (car x) y z) +---------- Buffer: foo ---------- +@end group + +@group +(forward-sexp 3) + @result{} nil + +---------- Buffer: foo ---------- +(concat "foo " (car x) y@point{} z) +---------- Buffer: foo ---------- +@end group +@end example +@end deffn + +@deffn Command backward-sexp &optional arg +This function moves backward across @var{arg} (default 1) balanced expressions. +@end deffn + +@deffn Command beginning-of-defun &optional arg +This function moves back to the @var{arg}th beginning of a defun. If +@var{arg} is negative, this actually moves forward, but it still moves +to the beginning of a defun, not to the end of one. @var{arg} defaults +to 1. +@end deffn + +@deffn Command end-of-defun &optional arg +This function moves forward to the @var{arg}th end of a defun. If +@var{arg} is negative, this actually moves backward, but it still moves +to the end of a defun, not to the beginning of one. @var{arg} defaults +to 1. +@end deffn + +@defopt defun-prompt-regexp +If non-@code{nil}, this buffer-local variable holds a regular +expression that specifies what text can appear before the +open-parenthesis that starts a defun. That is to say, a defun begins +on a line that starts with a match for this regular expression, +followed by a character with open-parenthesis syntax. +@end defopt + +@defopt open-paren-in-column-0-is-defun-start +If this variable's value is non-@code{nil}, an open parenthesis in +column 0 is considered to be the start of a defun. If it is +@code{nil}, an open parenthesis in column 0 has no special meaning. +The default is @code{t}. +@end defopt + +@defvar beginning-of-defun-function +If non-@code{nil}, this variable holds a function for finding the +beginning of a defun. The function @code{beginning-of-defun} +calls this function instead of using its normal method. +@end defvar + +@defvar end-of-defun-function +If non-@code{nil}, this variable holds a function for finding the end of +a defun. The function @code{end-of-defun} calls this function instead +of using its normal method. +@end defvar + +@node Skipping Characters +@comment node-name, next, previous, up +@subsection Skipping Characters +@cindex skipping characters + + The following two functions move point over a specified set of +characters. For example, they are often used to skip whitespace. For +related functions, see @ref{Motion and Syntax}. + +These functions convert the set string to multibyte if the buffer is +multibyte, and they convert it to unibyte if the buffer is unibyte, as +the search functions do (@pxref{Searching and Matching}). + +@defun skip-chars-forward character-set &optional limit +This function moves point in the current buffer forward, skipping over a +given set of characters. It examines the character following point, +then advances point if the character matches @var{character-set}. This +continues until it reaches a character that does not match. The +function returns the number of characters moved over. + +The argument @var{character-set} is a string, like the inside of a +@samp{[@dots{}]} in a regular expression except that @samp{]} does not +terminate it, and @samp{\} quotes @samp{^}, @samp{-} or @samp{\}. +Thus, @code{"a-zA-Z"} skips over all letters, stopping before the +first nonletter, and @code{"^a-zA-Z"} skips nonletters stopping before +the first letter. See @xref{Regular Expressions}. Character classes +can also be used, e.g. @code{"[:alnum:]"}. See @pxref{Char Classes}. + +If @var{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 @var{limit}. + +In the following example, point is initially located directly before the +@samp{T}. After the form is evaluated, point is located at the end of +that line (between the @samp{t} of @samp{hat} and the newline). The +function skips all letters and spaces, but not newlines. + +@example +@group +---------- Buffer: foo ---------- +I read "@point{}The cat in the hat +comes back" twice. +---------- Buffer: foo ---------- +@end group + +@group +(skip-chars-forward "a-zA-Z ") + @result{} nil + +---------- Buffer: foo ---------- +I read "The cat in the hat@point{} +comes back" twice. +---------- Buffer: foo ---------- +@end group +@end example +@end defun + +@defun skip-chars-backward character-set &optional limit +This function moves point backward, skipping characters that match +@var{character-set}, until @var{limit}. It is just like +@code{skip-chars-forward} except for the direction of motion. + +The return value indicates the distance traveled. It is an integer that +is zero or less. +@end defun + +@node Excursions +@section Excursions +@cindex excursion + + It is often useful to move point ``temporarily'' within a localized +portion of the program, or to switch buffers temporarily. This is +called an @dfn{excursion}, and it is done with the @code{save-excursion} +special form. This construct initially remembers the identity of the +current buffer, and its values of point and the mark, and restores them +after the completion of the excursion. + + The forms for saving and restoring the configuration of windows are +described elsewhere (see @ref{Window Configurations}, and @pxref{Frame +Configurations}). + +@defspec save-excursion body@dots{} +@cindex mark excursion +@cindex point excursion +The @code{save-excursion} special form saves the identity of the current +buffer and the values of point and the mark in it, evaluates +@var{body}, 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 @code{throw} or error (@pxref{Nonlocal Exits}). + +The @code{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 4000 times in the Lisp +sources of Emacs. + +@code{save-excursion} does not save the values of point and the mark for +other buffers, so changes in other buffers remain in effect after +@code{save-excursion} exits. + +@cindex window excursions +Likewise, @code{save-excursion} does not restore window-buffer +correspondences altered by functions such as @code{switch-to-buffer}. +One way to restore these correspondences, and the selected window, is to +use @code{save-window-excursion} inside @code{save-excursion} +(@pxref{Window Configurations}). + +The value returned by @code{save-excursion} is the result of the last +form in @var{body}, or @code{nil} if no body forms were given. + +@example +@group +(save-excursion @var{forms}) +@equiv{} +(let ((old-buf (current-buffer)) + (old-pnt (point-marker)) +@end group + (old-mark (copy-marker (mark-marker)))) + (unwind-protect + (progn @var{forms}) + (set-buffer old-buf) +@group + (goto-char old-pnt) + (set-marker (mark-marker) old-mark))) +@end group +@end example +@end defspec + + @strong{Warning:} Ordinary insertion of text adjacent to the saved +point value relocates the saved value, just as it relocates all markers. +More precisely, the saved value is a marker with insertion type +@code{nil}. @xref{Marker Insertion Types}. Therefore, when the saved +point value is restored, it normally comes before the inserted text. + + Although @code{save-excursion} saves the location of the mark, it does +not prevent functions which modify the buffer from setting +@code{deactivate-mark}, and thus causing the deactivation of the mark +after the command finishes. @xref{The Mark}. + +@node Narrowing +@section Narrowing +@cindex narrowing +@cindex restriction (in a buffer) +@cindex accessible portion (of a buffer) + + @dfn{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 @dfn{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 +and most Emacs primitives, 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, do so despite narrowing, but the functions +which use them refuse to operate on text that is inaccessible. + + The commands for saving buffers are unaffected by narrowing; they save +the entire buffer regardless of any narrowing. + +@deffn Command narrow-to-region start end +This function sets the accessible portion of the current buffer to start +at @var{start} and end at @var{end}. Both arguments should be character +positions. + +In an interactive call, @var{start} and @var{end} are set to the bounds +of the current region (point and the mark, with the smallest first). +@end deffn + +@deffn Command narrow-to-page &optional move-count +This function sets the accessible portion of the current buffer to +include just the current page. An optional first argument +@var{move-count} non-@code{nil} means to move forward or backward by +@var{move-count} pages and then narrow to one page. The variable +@code{page-delimiter} specifies where pages start and end +(@pxref{Standard Regexps}). + +In an interactive call, @var{move-count} is set to the numeric prefix +argument. +@end deffn + +@deffn Command widen +@cindex widening +This function cancels any narrowing in the current buffer, so that the +entire contents are accessible. This is called @dfn{widening}. +It is equivalent to the following expression: + +@example +(narrow-to-region 1 (1+ (buffer-size))) +@end example +@end deffn + +@defspec save-restriction body@dots{} +This special form saves the current bounds of the accessible portion, +evaluates the @var{body} 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 @code{throw} or error (@pxref{Nonlocal Exits}). +Therefore, this construct is a clean way to narrow a buffer temporarily. + +The value returned by @code{save-restriction} is that returned by the +last form in @var{body}, or @code{nil} if no body forms were given. + +@c Wordy to avoid overfull hbox. --rjc 16mar92 +@strong{Caution:} it is easy to make a mistake when using the +@code{save-restriction} construct. Read the entire description here +before you try it. + +If @var{body} changes the current buffer, @code{save-restriction} still +restores the restrictions on the original buffer (the buffer whose +restrictions it saved from), but it does not restore the identity of the +current buffer. + +@code{save-restriction} does @emph{not} restore point and the mark; use +@code{save-excursion} for that. If you use both @code{save-restriction} +and @code{save-excursion} together, @code{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. + +Here is a simple example of correct use of @code{save-restriction}: + +@example +@group +---------- Buffer: foo ---------- +This is the contents of foo +This is the contents of foo +This is the contents of foo@point{} +---------- Buffer: foo ---------- +@end group + +@group +(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@point{} +---------- Buffer: foo ---------- +@end group +@end example +@end defspec + +@ignore + arch-tag: 56e8ff26-4ffe-4832-a141-7e991a2d0f87 +@end ignore diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi new file mode 100644 index 00000000000..f7be990b85e --- /dev/null +++ b/doc/lispref/processes.texi @@ -0,0 +1,2561 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/processes +@node Processes, Display, Abbrevs, Top +@chapter Processes +@cindex child process +@cindex parent process +@cindex subprocess +@cindex process + + In the terminology of operating systems, a @dfn{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 @dfn{subprocesses} or @dfn{child processes} of the Emacs process, +which is their @dfn{parent process}. + + A subprocess of Emacs may be @dfn{synchronous} or @dfn{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. + +@defun processp object +This function returns @code{t} if @var{object} is a process, +@code{nil} otherwise. +@end defun + +@menu +* Subprocess Creation:: Functions that start subprocesses. +* Shell Arguments:: Quoting an argument to pass it to a shell. +* Synchronous Processes:: Details of using synchronous subprocesses. +* Asynchronous Processes:: Starting up an asynchronous subprocess. +* Deleting Processes:: Eliminating an asynchronous subprocess. +* Process Information:: Accessing run-status and other attributes. +* Input to Processes:: Sending input to an asynchronous subprocess. +* Signals to Processes:: Stopping, continuing or interrupting + an asynchronous subprocess. +* Output from Processes:: Collecting output from an asynchronous subprocess. +* Sentinels:: Sentinels run when process run-status changes. +* Query Before Exit:: Whether to query if exiting will kill a process. +* Transaction Queues:: Transaction-based communication with subprocesses. +* Network:: Opening network connections. +* Network Servers:: Network servers let Emacs accept net connections. +* Datagrams:: UDP network connections. +* Low-Level Network:: Lower-level but more general function + to create connections and servers. +* Misc Network:: Additional relevant functions for network connections. +* Byte Packing:: Using bindat to pack and unpack binary data. +@end menu + +@node Subprocess Creation +@section Functions that Create Subprocesses + + There are three functions that create a new subprocess in which to run +a program. One of them, @code{start-process}, creates an asynchronous +process and returns a process object (@pxref{Asynchronous Processes}). +The other two, @code{call-process} and @code{call-process-region}, +create a synchronous process and do not return a process object +(@pxref{Synchronous Processes}). + + Synchronous and asynchronous processes are explained in the following +sections. Since the three functions are all called in a similar +fashion, their common arguments are described here. + +@cindex execute program +@cindex @code{PATH} environment variable +@cindex @code{HOME} environment variable + In all cases, the function's @var{program} argument specifies the +program to be run. An error is signaled if the file is not found or +cannot be executed. If the file name is relative, the variable +@code{exec-path} contains a list of directories to search. Emacs +initializes @code{exec-path} when it starts up, based on the value of +the environment variable @code{PATH}. The standard file name +constructs, @samp{~}, @samp{.}, and @samp{..}, are interpreted as +usual in @code{exec-path}, but environment variable substitutions +(@samp{$HOME}, etc.) are not recognized; use +@code{substitute-in-file-name} to perform them (@pxref{File Name +Expansion}). @code{nil} in this list refers to +@code{default-directory}. + + Executing a program can also try adding suffixes to the specified +name: + +@defvar exec-suffixes +This variable is a list of suffixes (strings) to try adding to the +specified program file name. The list should include @code{""} if you +want the name to be tried exactly as specified. The default value is +system-dependent. +@end defvar + + @strong{Please note:} The argument @var{program} contains only the +name of the program; it may not contain any command-line arguments. You +must use @var{args} to provide those. + + Each of the subprocess-creating functions has a @var{buffer-or-name} +argument which specifies where the standard output from the program will +go. It should be a buffer or a buffer name; if it is a buffer name, +that will create the buffer if it does not already exist. It can also +be @code{nil}, which says to discard the output unless a filter function +handles it. (@xref{Filter Functions}, and @ref{Read and Print}.) +Normally, you should avoid having multiple processes send output to the +same buffer because their output would be intermixed randomly. + +@cindex program arguments + All three of the subprocess-creating functions have a @code{&rest} +argument, @var{args}. The @var{args} must all be strings, and they are +supplied to @var{program} as separate command line arguments. Wildcard +characters and other shell constructs have no special meanings in these +strings, since the strings are passed directly to the specified program. + + The subprocess gets its current directory from the value of +@code{default-directory} (@pxref{File Name Expansion}). + +@cindex environment variables, subprocesses + The subprocess inherits its environment from Emacs, but you can +specify overrides for it with @code{process-environment}. @xref{System +Environment}. + +@defvar exec-directory +@pindex movemail +The value of this variable is a string, the name of a directory that +contains programs that come with GNU Emacs, programs intended for Emacs +to invoke. The program @code{movemail} is an example of such a program; +Rmail uses it to fetch new mail from an inbox. +@end defvar + +@defopt 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 @code{nil}, which stands for the default +directory (which is the value of @code{default-directory}). +@cindex program directories + +The value of @code{exec-path} is used by @code{call-process} and +@code{start-process} when the @var{program} argument is not an absolute +file name. +@end defopt + +@node Shell Arguments +@section Shell Arguments +@cindex arguments for shell commands +@cindex shell command arguments + + Lisp programs sometimes need to run a shell and give it a command +that contains file names that were specified by the user. These +programs ought to be able to support any valid file name. But the shell +gives special treatment to certain characters, and if these characters +occur in the file name, they will confuse the shell. To handle these +characters, use the function @code{shell-quote-argument}: + +@defun shell-quote-argument argument +This function returns a string which represents, in shell syntax, +an argument whose actual contents are @var{argument}. It should +work reliably to concatenate the return value into a shell command +and then pass it to a shell for execution. + +Precisely what this function does depends on your operating system. The +function is designed to work with the syntax of your system's standard +shell; if you use an unusual shell, you will need to redefine this +function. + +@example +;; @r{This example shows the behavior on GNU and Unix systems.} +(shell-quote-argument "foo > bar") + @result{} "foo\\ \\>\\ bar" + +;; @r{This example shows the behavior on MS-DOS and MS-Windows.} +(shell-quote-argument "foo > bar") + @result{} "\"foo > bar\"" +@end example + +Here's an example of using @code{shell-quote-argument} to construct +a shell command: + +@example +(concat "diff -c " + (shell-quote-argument oldfile) + " " + (shell-quote-argument newfile)) +@end example +@end defun + +@node Synchronous Processes +@section Creating a Synchronous Process +@cindex synchronous subprocess + + After a @dfn{synchronous process} is created, Emacs waits for the +process to terminate before continuing. Starting Dired on GNU or +Unix@footnote{On other systems, Emacs uses a Lisp emulation of +@code{ls}; see @ref{Contents of Directories}.} is an example of this: it +runs @code{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 @kbd{C-g}. The first @kbd{C-g} tries to kill +the subprocess with a @code{SIGINT} signal; but it waits until the +subprocess actually terminates before quitting. If during that time the +user types another @kbd{C-g}, that kills the subprocess instantly with +@code{SIGKILL} and quits immediately (except on MS-DOS, where killing +other processes doesn't work). @xref{Quitting}. + + The synchronous subprocess functions return an indication of how the +process terminated. + + The output from a synchronous subprocess is generally decoded using a +coding system, much like text read from a file. The input sent to a +subprocess by @code{call-process-region} is encoded using a coding +system, much like text written into a file. @xref{Coding Systems}. + +@defun call-process program &optional infile destination display &rest args +This function calls @var{program} in a separate process and waits for +it to finish. + +The standard input for the process comes from file @var{infile} if +@var{infile} is not @code{nil}, and from the null device otherwise. +The argument @var{destination} says where to put the process output. +Here are the possibilities: + +@table @asis +@item a buffer +Insert the output in that buffer, before point. This includes both the +standard output stream and the standard error stream of the process. + +@item a string +Insert the output in a buffer with that name, before point. + +@item @code{t} +Insert the output in the current buffer, before point. + +@item @code{nil} +Discard the output. + +@item 0 +Discard the output, and return @code{nil} immediately without waiting +for the subprocess to finish. + +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. + +MS-DOS doesn't support asynchronous subprocesses, so this option doesn't +work there. + +@item @code{(@var{real-destination} @var{error-destination})} +Keep the standard output stream separate from the standard error stream; +deal with the ordinary output as specified by @var{real-destination}, +and dispose of the error output according to @var{error-destination}. +If @var{error-destination} is @code{nil}, that means to discard the +error output, @code{t} means mix it with the ordinary output, and a +string specifies a file name to redirect error output into. + +You can't directly specify a buffer to put the error output in; that is +too difficult to implement. But you can achieve this result by sending +the error output to a temporary file and then inserting the file into a +buffer. +@end table + +If @var{display} is non-@code{nil}, then @code{call-process} redisplays +the buffer as output is inserted. (However, if the coding system chosen +for decoding output is @code{undecided}, meaning deduce the encoding +from the actual data, then redisplay sometimes cannot continue once +non-@acronym{ASCII} characters are encountered. There are fundamental +reasons why it is hard to fix this; see @ref{Output from Processes}.) + +Otherwise the function @code{call-process} 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, @var{args}, are strings that specify command +line arguments for the program. + +The value returned by @code{call-process} (unless you told it not to +wait) indicates the reason for process termination. A number gives the +exit status of the subprocess; 0 means success, and any other value +means failure. If the process terminated with a signal, +@code{call-process} returns a string describing the signal. + +In the examples below, the buffer @samp{foo} is current. + +@smallexample +@group +(call-process "pwd" nil t) + @result{} 0 + +---------- Buffer: foo ---------- +/usr/user/lewis/manual +---------- Buffer: foo ---------- +@end group + +@group +(call-process "grep" nil "bar" nil "lewis" "/etc/passwd") + @result{} 0 + +---------- Buffer: bar ---------- +lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh + +---------- Buffer: bar ---------- +@end group +@end smallexample + +Here is a good example of the use of @code{call-process}, which used to +be found in the definition of @code{insert-directory}: + +@smallexample +@group +(call-process insert-directory-program nil t nil @var{switches} + (if full-directory-p + (concat (file-name-as-directory file) ".") + file)) +@end group +@end smallexample +@end defun + +@defun process-file program &optional infile buffer display &rest args +This function processes files synchronously in a separate process. It +is similar to @code{call-process} but may invoke a file handler based +on the value of the variable @code{default-directory}. The current +working directory of the subprocess is @code{default-directory}. + +The arguments are handled in almost the same way as for +@code{call-process}, with the following differences: + +Some file handlers may not support all combinations and forms of the +arguments @var{infile}, @var{buffer}, and @var{display}. For example, +some file handlers might behave as if @var{display} were @code{nil}, +regardless of the value actually passed. As another example, some +file handlers might not support separating standard output and error +output by way of the @var{buffer} argument. + +If a file handler is invoked, it determines the program to run based +on the first argument @var{program}. For instance, consider that a +handler for remote files is invoked. Then the path that is used for +searching the program might be different than @code{exec-path}. + +The second argument @var{infile} may invoke a file handler. The file +handler could be different from the handler chosen for the +@code{process-file} function itself. (For example, +@code{default-directory} could be on a remote host, whereas +@var{infile} is on another remote host. Or @code{default-directory} +could be non-special, whereas @var{infile} is on a remote host.) + +If @var{buffer} is a list of the form @code{(@var{real-destination} +@var{error-destination})}, and @var{error-destination} names a file, +then the same remarks as for @var{infile} apply. + +The remaining arguments (@var{args}) will be passed to the process +verbatim. Emacs is not involved in processing file names that are +present in @var{args}. To avoid confusion, it may be best to avoid +absolute file names in @var{args}, but rather to specify all file +names as relative to @code{default-directory}. The function +@code{file-relative-name} is useful for constructing such relative +file names. +@end defun + +@defun call-process-region start end program &optional delete destination display &rest args +This function sends the text from @var{start} to @var{end} as +standard input to a process running @var{program}. It deletes the text +sent if @var{delete} is non-@code{nil}; this is useful when +@var{destination} is @code{t}, to insert the output in the current +buffer in place of the input. + +The arguments @var{destination} and @var{display} control what to do +with the output from the subprocess, and whether to update the display +as it comes in. For details, see the description of +@code{call-process}, above. If @var{destination} is the integer 0, +@code{call-process-region} discards the output and returns @code{nil} +immediately, without waiting for the subprocess to finish (this only +works if asynchronous subprocesses are supported). + +The remaining arguments, @var{args}, are strings that specify command +line arguments for the program. + +The return value of @code{call-process-region} is just like that of +@code{call-process}: @code{nil} if you told it to return without +waiting; otherwise, a number or string which indicates how the +subprocess terminated. + +In the following example, we use @code{call-process-region} to run the +@code{cat} utility, with standard input being the first five characters +in buffer @samp{foo} (the word @samp{input}). @code{cat} copies its +standard input into its standard output. Since the argument +@var{destination} is @code{t}, this output is inserted in the current +buffer. + +@smallexample +@group +---------- Buffer: foo ---------- +input@point{} +---------- Buffer: foo ---------- +@end group + +@group +(call-process-region 1 6 "cat" nil t) + @result{} 0 + +---------- Buffer: foo ---------- +inputinput@point{} +---------- Buffer: foo ---------- +@end group +@end smallexample + + The @code{shell-command-on-region} command uses +@code{call-process-region} like this: + +@smallexample +@group +(call-process-region + start end + shell-file-name ; @r{Name of program.} + nil ; @r{Do not delete region.} + buffer ; @r{Send output to @code{buffer}.} + nil ; @r{No redisplay during output.} + "-c" command) ; @r{Arguments for the shell.} +@end group +@end smallexample +@end defun + +@defun call-process-shell-command command &optional infile destination display &rest args +This function executes the shell command @var{command} synchronously +in a separate process. The final arguments @var{args} are additional +arguments to add at the end of @var{command}. The other arguments +are handled as in @code{call-process}. +@end defun + +@defun process-file-shell-command command &optional infile destination display &rest args +This function is like @code{call-process-shell-command}, but uses +@code{process-file} internally. Depending on @code{default-directory}, +@var{command} can be executed also on remote hosts. +@end defun + +@defun shell-command-to-string command +This function executes @var{command} (a string) as a shell command, +then returns the command's output as a string. +@end defun + +@node Asynchronous Processes +@section Creating an Asynchronous Process +@cindex asynchronous subprocess + + After an @dfn{asynchronous process} is created, Emacs and the subprocess +both continue running immediately. The process thereafter runs +in parallel with Emacs, and the two can communicate with each other +using the functions described in the following sections. However, +communication is only partially asynchronous: Emacs sends data to the +process only when certain functions are called, and Emacs accepts data +from the process only when Emacs is waiting for input or for a time +delay. + + Here we describe how to create an asynchronous process. + +@defun start-process name buffer-or-name program &rest args +This function creates a new asynchronous subprocess and starts the +program @var{program} running in it. It returns a process object that +stands for the new subprocess in Lisp. The argument @var{name} +specifies the name for the process object; if a process with this name +already exists, then @var{name} is modified (by appending @samp{<1>}, +etc.) to be unique. The buffer @var{buffer-or-name} is the buffer to +associate with the process. + +The remaining arguments, @var{args}, are strings that specify 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, and +given the name @samp{my-process<1>} for the sake of uniqueness. It +inserts the directory listing at the end of the buffer @samp{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. + +@smallexample +@group +(start-process "my-process" "foo" "sleep" "100") + @result{} #<process my-process> +@end group + +@group +(start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin") + @result{} #<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 ---------- +@end group +@end smallexample +@end defun + +@defun start-file-process name buffer-or-name program &rest args +Like @code{start-process}, this function starts a new asynchronous +subprocess running @var{program} in it, and returns its process +object---when @code{default-directory} is not a magic file name. + +If @code{default-directory} is magic, the function invokes its file +handler instead. This handler ought to run @var{program}, perhaps on +the local host, perhaps on a remote host that corresponds to +@code{default-directory}. In the latter case, the local part of +@code{default-directory} becomes the working directory of the process. + +This function does not try to invoke file name handlers for +@var{program} or for the @var{program-args}. + +Depending on the implementation of the file handler, it might not be +possible to apply @code{process-filter} or @code{process-sentinel} to +the resulting process object (@pxref{Filter Functions}, @pxref{Sentinels}). + +Some file handlers may not support @code{start-file-process} (for +example @code{ange-ftp-hook-function}). In such cases, the function +does nothing and returns @code{nil}. +@end defun + +@defun start-process-shell-command name buffer-or-name command &rest command-args +This function is like @code{start-process} except that it uses a shell +to execute the specified command. The argument @var{command} is a shell +command name, and @var{command-args} are the arguments for the shell +command. The variable @code{shell-file-name} specifies which shell to +use. + +The point of running a program through the shell, rather than directly +with @code{start-process}, is so that you can employ shell features such +as wildcards in the arguments. It follows that if you include an +arbitrary user-specified arguments in the command, you should quote it +with @code{shell-quote-argument} first, so that any special shell +characters do @emph{not} have their special shell meanings. @xref{Shell +Arguments}. +@end defun + +@defun start-file-process-shell-command name buffer-or-name command &rest command-args +This function is like @code{start-process-shell-command}, but uses +@code{start-file-process} internally. By this, @var{command} can be +executed also on remote hosts, depending on @code{default-directory}. +@end defun + +@defvar process-connection-type +@cindex pipes +@cindex @acronym{PTY}s +This variable controls the type of device used to communicate with +asynchronous subprocesses. If it is non-@code{nil}, then @acronym{PTY}s are +used, when available. Otherwise, pipes are used. + +@acronym{PTY}s are usually preferable for processes visible to the user, as +in Shell mode, because they allow job control (@kbd{C-c}, @kbd{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 @acronym{PTY}s is limited on many systems and +it is good not to waste them. + +The value of @code{process-connection-type} takes effect when +@code{start-process} is called. So you can specify how to communicate +with one subprocess by binding the variable around the call to +@code{start-process}. + +@smallexample +@group +(let ((process-connection-type nil)) ; @r{Use a pipe.} + (start-process @dots{})) +@end group +@end smallexample + +To determine whether a given subprocess actually got a pipe or a +@acronym{PTY}, use the function @code{process-tty-name} (@pxref{Process +Information}). +@end defvar + +@node Deleting Processes +@section Deleting Processes +@cindex deleting processes + + @dfn{Deleting a process} disconnects Emacs immediately from the +subprocess. Processes are deleted automatically after they terminate, +but not necessarily right away. You can delete a process explicitly +at any time. If you delete a terminated process explicitly before it +is deleted automatically, no harm results. Deleting a running +process sends a signal to terminate it (and its child processes if +any), and calls the process sentinel if it has one. @xref{Sentinels}. + + When a process is deleted, the process object itself continues to +exist as long as other Lisp objects point to it. All the Lisp +primitives that work on process objects accept deleted processes, but +those that do I/O or send signals will report an error. The process +mark continues to point to the same place as before, usually into a +buffer where output from the process was being inserted. + +@defopt delete-exited-processes +This variable controls automatic deletion of processes that have +terminated (due to calling @code{exit} or to a signal). If it is +@code{nil}, then they continue to exist until the user runs +@code{list-processes}. Otherwise, they are deleted immediately after +they exit. +@end defopt + +@defun delete-process process +This function deletes a process, killing it with a @code{SIGKILL} +signal. The argument may be a process, the name of a process, a +buffer, or the name of a buffer. (A buffer or buffer-name stands for +the process that @code{get-buffer-process} returns.) Calling +@code{delete-process} on a running process terminates it, updates the +process status, and runs the sentinel (if any) immediately. If the +process has already terminated, calling @code{delete-process} has no +effect on its status, or on the running of its sentinel (which will +happen sooner or later). + +@smallexample +@group +(delete-process "*shell*") + @result{} nil +@end group +@end smallexample +@end defun + +@node Process Information +@section Process Information + + Several functions return information about processes. +@code{list-processes} is provided for interactive use. + +@deffn Command list-processes &optional query-only +This command displays a listing of all living processes. In addition, +it finally deletes any process whose status was @samp{Exited} or +@samp{Signaled}. It returns @code{nil}. + +If @var{query-only} is non-@code{nil} then it lists only processes +whose query flag is non-@code{nil}. @xref{Query Before Exit}. +@end deffn + +@defun process-list +This function returns a list of all processes that have not been deleted. + +@smallexample +@group +(process-list) + @result{} (#<process display-time> #<process shell>) +@end group +@end smallexample +@end defun + +@defun get-process name +This function returns the process named @var{name}, or @code{nil} if +there is none. An error is signaled if @var{name} is not a string. + +@smallexample +@group +(get-process "shell") + @result{} #<process shell> +@end group +@end smallexample +@end defun + +@defun process-command process +This function returns the command that was executed to start +@var{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. + +@smallexample +@group +(process-command (get-process "shell")) + @result{} ("/bin/csh" "-i") +@end group +@end smallexample +@end defun + +@defun process-id process +This function returns the @acronym{PID} of @var{process}. This is an +integer that distinguishes the process @var{process} from all other +processes running on the same computer at the current time. The +@acronym{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. +@end defun + +@defun process-name process +This function returns the name of @var{process}. +@end defun + +@defun process-status process-name +This function returns the status of @var{process-name} as a symbol. +The argument @var{process-name} must be a process, a buffer, a +process name (string) or a buffer name (string). + +The possible values for an actual subprocess are: + +@table @code +@item run +for a process that is running. +@item stop +for a process that is stopped but continuable. +@item exit +for a process that has exited. +@item signal +for a process that has received a fatal signal. +@item open +for a network connection that is open. +@item closed +for a network connection that is closed. Once a connection +is closed, you cannot reopen it, though you might be able to open +a new connection to the same place. +@item connect +for a non-blocking connection that is waiting to complete. +@item failed +for a non-blocking connection that has failed to complete. +@item listen +for a network server that is listening. +@item nil +if @var{process-name} is not the name of an existing process. +@end table + +@smallexample +@group +(process-status "shell") + @result{} run +@end group +@group +(process-status (get-buffer "*shell*")) + @result{} run +@end group +@group +x + @result{} #<process xx<1>> +(process-status x) + @result{} exit +@end group +@end smallexample + +For a network connection, @code{process-status} returns one of the symbols +@code{open} or @code{closed}. The latter means that the other side +closed the connection, or Emacs did @code{delete-process}. +@end defun + +@defun process-exit-status process +This function returns the exit status of @var{process} or the signal +number that killed it. (Use the result of @code{process-status} to +determine which of those it is.) If @var{process} has not yet +terminated, the value is 0. +@end defun + +@defun process-tty-name process +This function returns the terminal name that @var{process} is using for +its communication with Emacs---or @code{nil} if it is using pipes +instead of a terminal (see @code{process-connection-type} in +@ref{Asynchronous Processes}). +@end defun + +@defun process-coding-system process +@anchor{Coding systems for a subprocess} +This function returns a cons cell describing the coding systems in use +for decoding output from @var{process} and for encoding input to +@var{process} (@pxref{Coding Systems}). The value has this form: + +@example +(@var{coding-system-for-decoding} . @var{coding-system-for-encoding}) +@end example +@end defun + +@defun set-process-coding-system process &optional decoding-system encoding-system +This function specifies the coding systems to use for subsequent output +from and input to @var{process}. It will use @var{decoding-system} to +decode subprocess output, and @var{encoding-system} to encode subprocess +input. +@end defun + + Every process also has a property list that you can use to store +miscellaneous values associated with the process. + +@defun process-get process propname +This function returns the value of the @var{propname} property +of @var{process}. +@end defun + +@defun process-put process propname value +This function sets the value of the @var{propname} property +of @var{process} to @var{value}. +@end defun + +@defun process-plist process +This function returns the process plist of @var{process}. +@end defun + +@defun set-process-plist process plist +This function sets the process plist of @var{process} to @var{plist}. +@end defun + +@node Input to Processes +@section Sending Input to Processes +@cindex process input + + 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 +@acronym{PTY}. On these systems, Emacs sends an @acronym{EOF} +periodically amidst the other characters, to force them through. For +most programs, these @acronym{EOF}s do no harm. + + Subprocess input is normally encoded using a coding system before the +subprocess receives it, much like text written into a file. You can use +@code{set-process-coding-system} to specify which coding system to use +(@pxref{Process Information}). Otherwise, the coding system comes from +@code{coding-system-for-write}, if that is non-@code{nil}; or else from +the defaulting mechanism (@pxref{Default Coding Systems}). + + Sometimes the system is unable to accept input for that process, +because the input buffer is full. When this happens, the send functions +wait a short while, accepting output from subprocesses, and then try +again. This gives the subprocess a chance to read more of its pending +input and make space in the buffer. It also allows filters, sentinels +and timers to run---so take account of that in writing your code. + + In these functions, the @var{process} argument can be a process or +the name of a process, or a buffer or buffer name (which stands +for a process via @code{get-buffer-process}). @code{nil} means +the current buffer's process. + +@defun process-send-string process string +This function sends @var{process} the contents of @var{string} as +standard input. If it is @code{nil}, the current buffer's process is used. + + The function returns @code{nil}. + +@smallexample +@group +(process-send-string "shell<1>" "ls\n") + @result{} nil +@end group + + +@group +---------- Buffer: *shell* ---------- +... +introduction.texi syntax-tables.texi~ +introduction.texi~ text.texi +introduction.txt text.texi~ +... +---------- Buffer: *shell* ---------- +@end group +@end smallexample +@end defun + +@defun process-send-region process start end +This function sends the text in the region defined by @var{start} and +@var{end} as standard input to @var{process}. + +An error is signaled unless both @var{start} and @var{end} are +integers or markers that indicate positions in the current buffer. (It +is unimportant which number is larger.) +@end defun + +@defun process-send-eof &optional process +This function makes @var{process} see an end-of-file in its +input. The @acronym{EOF} comes after any text already sent to it. + +The function returns @var{process}. + +@smallexample +@group +(process-send-eof "shell") + @result{} "shell" +@end group +@end smallexample +@end defun + +@defun process-running-child-p process +This function will tell you whether a subprocess has given control of +its terminal to its own child process. The value is @code{t} if this is +true, or if Emacs cannot tell; it is @code{nil} if Emacs can be certain +that this is not so. +@end defun + +@node Signals to Processes +@section Sending Signals to Processes +@cindex process signals +@cindex sending signals +@cindex signals + + @dfn{Sending a signal} to a subprocess is a way of interrupting its +activities. There are several different signals, each with its own +meaning. The set of signals and their names is defined by the operating +system. For example, the signal @code{SIGINT} means that the user has +typed @kbd{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. + + You can send signals explicitly by calling the functions in this +section. Emacs also sends signals automatically at certain times: +killing a buffer sends a @code{SIGHUP} signal to all its associated +processes; killing Emacs sends a @code{SIGHUP} signal to all remaining +processes. (@code{SIGHUP} is a signal that usually indicates that the +user hung up the phone.) + + Each of the signal-sending functions takes two optional arguments: +@var{process} and @var{current-group}. + + The argument @var{process} must be either a process, a process +name, a buffer, a buffer name, or @code{nil}. A buffer or buffer name +stands for a process through @code{get-buffer-process}. @code{nil} +stands for the process associated with the current buffer. An error +is signaled if @var{process} does not identify a process. + + The argument @var{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-@code{nil}, then the signal is sent to the current process-group +of the terminal that 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 @code{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 @var{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 +@code{process-connection-type} in @ref{Asynchronous Processes}. + +@defun interrupt-process &optional process current-group +This function interrupts the process @var{process} by sending the +signal @code{SIGINT}. Outside of Emacs, typing the ``interrupt +character'' (normally @kbd{C-c} on some systems, and @code{DEL} on +others) sends this signal. When the argument @var{current-group} is +non-@code{nil}, you can think of this function as ``typing @kbd{C-c}'' +on the terminal by which Emacs talks to the subprocess. +@end defun + +@defun kill-process &optional process current-group +This function kills the process @var{process} by sending the +signal @code{SIGKILL}. This signal kills the subprocess immediately, +and cannot be handled by the subprocess. +@end defun + +@defun quit-process &optional process current-group +This function sends the signal @code{SIGQUIT} to the process +@var{process}. This signal is the one sent by the ``quit +character'' (usually @kbd{C-b} or @kbd{C-\}) when you are not inside +Emacs. +@end defun + +@defun stop-process &optional process current-group +This function stops the process @var{process} by sending the +signal @code{SIGTSTP}. Use @code{continue-process} to resume its +execution. + +Outside of Emacs, on systems with job control, the ``stop character'' +(usually @kbd{C-z}) normally sends this signal. When +@var{current-group} is non-@code{nil}, you can think of this function as +``typing @kbd{C-z}'' on the terminal Emacs uses to communicate with the +subprocess. +@end defun + +@defun continue-process &optional process current-group +This function resumes execution of the process @var{process} by sending +it the signal @code{SIGCONT}. This presumes that @var{process} was +stopped previously. +@end defun + +@c Emacs 19 feature +@defun signal-process process signal +This function sends a signal to process @var{process}. The argument +@var{signal} specifies which signal to send; it should be an integer. + +The @var{process} argument can be a system process @acronym{ID}; that +allows you to send signals to processes that are not children of +Emacs. +@end defun + +@node Output from Processes +@section Receiving Output from Processes +@cindex process output +@cindex 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 @dfn{filter function} can be called to act on the output. If +the process has no buffer and no filter function, its output is +discarded. + + When a subprocess terminates, Emacs reads any pending output, +then stops reading output from that subprocess. Therefore, if the +subprocess has children that are still live and still producing +output, Emacs won't receive that output. + + Output from a subprocess can arrive only while Emacs is waiting: when +reading terminal input, in @code{sit-for} and @code{sleep-for} +(@pxref{Waiting}), and in @code{accept-process-output} (@pxref{Accepting +Output}). This minimizes the problem of timing errors that usually +plague parallel programming. For example, you can safely create a +process and only then specify its buffer or filter function; no output +can arrive before you finish, if the code in between does not call any +primitive that waits. + +@defvar process-adaptive-read-buffering +On some systems, when Emacs reads the output from a subprocess, the +output data is read in very small blocks, potentially resulting in +very poor performance. This behavior can be remedied to some extent +by setting the variable @var{process-adaptive-read-buffering} to a +non-@code{nil} value (the default), as it will automatically delay reading +from such processes, thus allowing them to produce more output before +Emacs tries to read it. +@end defvar + + It is impossible to separate the standard output and standard error +streams of the subprocess, because Emacs normally spawns the subprocess +inside a pseudo-TTY, and a pseudo-TTY has only one output channel. If +you want to keep the output to those streams separate, you should +redirect one of them to a file---for example, by using an appropriate +shell command. + +@menu +* Process Buffers:: If no filter, output is put in a buffer. +* Filter Functions:: Filter functions accept output from the process. +* Decoding Output:: Filters can get unibyte or multibyte strings. +* Accepting Output:: How to wait until process output arrives. +@end menu + +@node Process Buffers +@subsection Process Buffers + + A process can (and usually does) have an @dfn{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 (@pxref{Filter Functions}), +its output is inserted in the associated buffer. The position to insert +the output is determined by the @code{process-mark}, which is then +updated to point to the end of the text just inserted. Usually, but not +always, the @code{process-mark} is at the end of the buffer. + +@defun process-buffer process +This function returns the associated buffer of the process +@var{process}. + +@smallexample +@group +(process-buffer (get-process "shell")) + @result{} #<buffer *shell*> +@end group +@end smallexample +@end defun + +@defun process-mark process +This function returns the process marker for @var{process}, which is the +marker that says where to insert output from the process. + +If @var{process} does not have a buffer, @code{process-mark} returns a +marker that points nowhere. + +Insertion of process output in a buffer uses this marker to decide where +to insert, and updates it to point after the inserted text. That is why +successive batches of output are inserted consecutively. + +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 @code{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 separates the new input +from previous output. +@end defun + +@defun set-process-buffer process buffer +This function sets the buffer associated with @var{process} to +@var{buffer}. If @var{buffer} is @code{nil}, the process becomes +associated with no buffer. +@end defun + +@defun get-buffer-process buffer-or-name +This function returns a nondeleted process associated with the buffer +specified by @var{buffer-or-name}. If there are several processes +associated with it, this function chooses one (currently, the one most +recently created, but don't count on that). Deletion of a process +(see @code{delete-process}) makes it ineligible for this function to +return. + +It is usually a bad idea to have more than one process associated with +the same buffer. + +@smallexample +@group +(get-buffer-process "*shell*") + @result{} #<process shell> +@end group +@end smallexample + +Killing the process's buffer deletes the process, which kills the +subprocess with a @code{SIGHUP} signal (@pxref{Signals to Processes}). +@end defun + +@node Filter Functions +@subsection Process Filter Functions +@cindex filter function +@cindex process filter + + A process @dfn{filter function} is a function that receives the +standard output from the associated process. If a process has a filter, +then @emph{all} output from that process is passed to the filter. The +process buffer is used directly for output from the process only when +there is no filter. + + The filter function can only be called when Emacs is waiting for +something, because process output arrives only at such times. Emacs +waits when reading terminal input, in @code{sit-for} and +@code{sleep-for} (@pxref{Waiting}), and in @code{accept-process-output} +(@pxref{Accepting Output}). + + A filter function must accept two arguments: the associated process +and a string, which is output just received from it. The function is +then free to do whatever it chooses with the output. + + Quitting is normally inhibited within a filter function---otherwise, +the effect of typing @kbd{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 @code{inhibit-quit} to @code{nil}. In most +cases, the right way to do this is with the macro +@code{with-local-quit}. @xref{Quitting}. + + If an error happens during execution of a filter function, it is +caught automatically, so that it doesn't stop the execution of whatever +program was running when the filter function was started. However, if +@code{debug-on-error} is non-@code{nil}, the error-catching is turned +off. This makes it possible to use the Lisp debugger to debug the +filter function. @xref{Debugger}. + + 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 @code{set-buffer} in order to +be sure to insert in that buffer. To avoid setting the current buffer +semipermanently, these filter functions must save and restore the +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: + +@smallexample +@group +(defun ordinary-insertion-filter (proc string) + (with-current-buffer (process-buffer proc) + (let ((moving (= (point) (process-mark proc)))) +@end group +@group + (save-excursion + ;; @r{Insert the text, advancing the process marker.} + (goto-char (process-mark proc)) + (insert string) + (set-marker (process-mark proc) (point))) + (if moving (goto-char (process-mark proc)))))) +@end group +@end smallexample + +@noindent +The reason to use @code{with-current-buffer}, rather than using +@code{save-excursion} to save and restore the current buffer, is so as +to preserve the change in point made by the second call to +@code{goto-char}. + + To make the filter force the process buffer to be visible whenever new +text arrives, insert the following line just before the +@code{with-current-buffer} construct: + +@smallexample +(display-buffer (process-buffer proc)) +@end smallexample + + To force point to the end of the new output, no matter where it was +previously, eliminate the variable @code{moving} and call +@code{goto-char} unconditionally. + + In earlier Emacs versions, every filter function that did regular +expression searching or matching had to explicitly save and restore the +match data. Now Emacs does this automatically for filter functions; +they never need to do it explicitly. @xref{Match Data}. + + A filter function that writes the output into the buffer of the +process should check whether the buffer is still alive. If it tries to +insert into a dead buffer, it will get an error. The expression +@code{(buffer-name (process-buffer @var{process}))} returns @code{nil} +if the buffer is dead. + + 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. If +the filter looks for certain text strings in the subprocess output, make +sure to handle the case where one of these strings is split across two +or more batches of output. + +@defun set-process-filter process filter +This function gives @var{process} the filter function @var{filter}. If +@var{filter} is @code{nil}, it gives the process no filter. +@end defun + +@defun process-filter process +This function returns the filter function of @var{process}, or @code{nil} +if it has none. +@end defun + + Here is an example of use of a filter function: + +@smallexample +@group +(defun keep-output (process output) + (setq kept (cons output kept))) + @result{} keep-output +@end group +@group +(setq kept nil) + @result{} nil +@end group +@group +(set-process-filter (get-process "shell") 'keep-output) + @result{} keep-output +@end group +@group +(process-send-string "shell" "ls ~/other\n") + @result{} nil +kept + @result{} ("lewis@@slug[8] % " +@end group +@group +"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 +") +@end group +@end smallexample + +@ignore @c The code in this example doesn't show the right way to do things. +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: + +@smallexample +@group +;; @r{Insert input in the buffer specified by @code{my-shell-buffer}} +;; @r{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) +@end group +@group + (goto-char (point-max)) + (insert str) + (set-marker (process-mark proc) (point-max)) + (select-window cur))) +@end group +@end smallexample +@end ignore + +@node Decoding Output +@subsection Decoding Process Output +@cindex decode process output + + When Emacs writes process output directly into a multibyte buffer, +it decodes the output according to the process output coding system. +If the coding system is @code{raw-text} or @code{no-conversion}, Emacs +converts the unibyte output to multibyte using +@code{string-to-multibyte}, and inserts the resulting multibyte text. + + You can use @code{set-process-coding-system} to specify which coding +system to use (@pxref{Process Information}). Otherwise, the coding +system comes from @code{coding-system-for-read}, if that is +non-@code{nil}; or else from the defaulting mechanism (@pxref{Default +Coding Systems}). + + @strong{Warning:} Coding systems such as @code{undecided} which +determine the coding system from the data do not work entirely +reliably with asynchronous subprocess output. This is because Emacs +has to process asynchronous subprocess output in batches, as it +arrives. Emacs must try to detect the proper coding system from one +batch at a time, and this does not always work. Therefore, if at all +possible, specify a coding system that determines both the character +code conversion and the end of line conversion---that is, one like +@code{latin-1-unix}, rather than @code{undecided} or @code{latin-1}. + +@cindex filter multibyte flag, of process +@cindex process filter multibyte flag + When Emacs calls a process filter function, it provides the process +output as a multibyte string or as a unibyte string according to the +process's filter multibyte flag. If the flag is non-@code{nil}, Emacs +decodes the output according to the process output coding system to +produce a multibyte string, and passes that to the process. If the +flag is @code{nil}, Emacs puts the output into a unibyte string, with +no decoding, and passes that. + + When you create a process, the filter multibyte flag takes its +initial value from @code{default-enable-multibyte-characters}. If you +want to change the flag later on, use +@code{set-process-filter-multibyte}. + +@defun set-process-filter-multibyte process multibyte +This function sets the filter multibyte flag of @var{process} +to @var{multibyte}. +@end defun + +@defun process-filter-multibyte-p process +This function returns the filter multibyte flag of @var{process}. +@end defun + +@node Accepting Output +@subsection Accepting Output from Processes +@cindex accept input 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. + +@defun accept-process-output &optional process seconds millisec just-this-one +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 @var{process} is non-@code{nil} then this function does +not return until some output has been received from @var{process}. + +@c Emacs 19 feature +The arguments @var{seconds} and @var{millisec} let you specify timeout +periods. The former specifies a period measured in seconds and the +latter specifies one measured in milliseconds. The two time periods +thus specified are added together, and @code{accept-process-output} +returns after that much time, whether or not there has been any +subprocess output. + +The argument @var{millisec} is semi-obsolete nowadays because +@var{seconds} can be a floating point number to specify waiting a +fractional number of seconds. If @var{seconds} is 0, the function +accepts whatever output is pending but does not wait. + +@c Emacs 22.1 feature +If @var{process} is a process, and the argument @var{just-this-one} is +non-@code{nil}, only output from that process is handled, suspending output +from other processes until some output has been received from that +process or the timeout expires. If @var{just-this-one} is an integer, +also inhibit running timers. This feature is generally not +recommended, but may be necessary for specific applications, such as +speech synthesis. + +The function @code{accept-process-output} returns non-@code{nil} if it +did get some output, or @code{nil} if the timeout expired before output +arrived. +@end defun + +@node Sentinels +@section Sentinels: Detecting Process Status Changes +@cindex process sentinel +@cindex sentinel (of process) + + A @dfn{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: + +@itemize @bullet +@item +@code{"finished\n"}. + +@item +@code{"exited abnormally with code @var{exitcode}\n"}. + +@item +@code{"@var{name-of-signal}\n"}. + +@item +@code{"@var{name-of-signal} (core dumped)\n"}. +@end itemize + + 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. A program can wait, so that +sentinels will run, by calling @code{sit-for} or @code{sleep-for} +(@pxref{Waiting}), or @code{accept-process-output} (@pxref{Accepting +Output}). Emacs also allows sentinels to run when the command loop is +reading input. @code{delete-process} calls the sentinel when it +terminates a running process. + + Emacs does not keep a queue of multiple reasons to call the sentinel +of one process; it records just the current status and the fact that +there has been a change. Therefore two changes in status, coming in +quick succession, can call the sentinel just once. However, process +termination will always run the sentinel exactly once. This is +because the process status can't change again after termination. + + Emacs explicitly checks for output from the process before running +the process sentinel. Once the sentinel runs due to process +termination, no further output can arrive from the process. + + A sentinel that writes the output into the buffer of the process +should check whether the buffer is still alive. If it tries to insert +into a dead buffer, it will get an error. If the buffer is dead, +@code{(buffer-name (process-buffer @var{process}))} returns @code{nil}. + + Quitting is normally inhibited within a sentinel---otherwise, the +effect of typing @kbd{C-g} at command level or to quit a user command +would be unpredictable. If you want to permit quitting inside a +sentinel, bind @code{inhibit-quit} to @code{nil}. In most cases, the +right way to do this is with the macro @code{with-local-quit}. +@xref{Quitting}. + + If an error happens during execution of a sentinel, it is caught +automatically, so that it doesn't stop the execution of whatever +programs was running when the sentinel was started. However, if +@code{debug-on-error} is non-@code{nil}, the error-catching is turned +off. This makes it possible to use the Lisp debugger to debug the +sentinel. @xref{Debugger}. + + While a sentinel is running, the process sentinel is temporarily +set to @code{nil} so that the sentinel won't run recursively. +For this reason it is not possible for a sentinel to specify +a new sentinel. + + In earlier Emacs versions, every sentinel that did regular expression +searching or matching had to explicitly save and restore the match data. +Now Emacs does this automatically for sentinels; they never need to do +it explicitly. @xref{Match Data}. + +@defun set-process-sentinel process sentinel +This function associates @var{sentinel} with @var{process}. If +@var{sentinel} is @code{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. + +Changes in process sentinel take effect immediately---if the sentinel +is slated to be run but has not been called yet, and you specify a new +sentinel, the eventual call to the sentinel will use the new one. + +@smallexample +@group +(defun msg-me (process event) + (princ + (format "Process: %s had the event `%s'" process event))) +(set-process-sentinel (get-process "shell") 'msg-me) + @result{} msg-me +@end group +@group +(kill-process (get-process "shell")) + @print{} Process: #<process shell> had the event `killed' + @result{} #<process shell> +@end group +@end smallexample +@end defun + +@defun process-sentinel process +This function returns the sentinel of @var{process}, or @code{nil} if it +has none. +@end defun + +@defun waiting-for-user-input-p +While a sentinel or filter function is running, this function returns +non-@code{nil} if Emacs was waiting for keyboard input from the user at +the time the sentinel or filter function was called, @code{nil} if it +was not. +@end defun + +@node Query Before Exit +@section Querying Before Exit + + When Emacs exits, it terminates all its subprocesses by sending them +the @code{SIGHUP} signal. Because subprocesses may be doing +valuable work, Emacs normally asks the user to confirm that it is ok +to terminate them. Each process has a query flag which, if +non-@code{nil}, says that Emacs should ask for confirmation before +exiting and thus killing that process. The default for the query flag +is @code{t}, meaning @emph{do} query. + +@defun process-query-on-exit-flag process +This returns the query flag of @var{process}. +@end defun + +@defun set-process-query-on-exit-flag process flag +This function sets the query flag of @var{process} to @var{flag}. It +returns @var{flag}. + +@smallexample +@group +;; @r{Don't query about the shell process} +(set-process-query-on-exit-flag (get-process "shell") nil) + @result{} t +@end group +@end smallexample +@end defun + +@defun process-kill-without-query process &optional do-query +This function clears the query flag of @var{process}, so that +Emacs will not query the user on account of that process. + +Actually, the function does more than that: it returns the old value of +the process's query flag, and sets the query flag to @var{do-query}. +Please don't use this function to do those things any more---please +use the newer, cleaner functions @code{process-query-on-exit-flag} and +@code{set-process-query-on-exit-flag} in all but the simplest cases. +The only way you should use @code{process-kill-without-query} nowadays +is like this: + +@smallexample +@group +;; @r{Don't query about the shell process} +(process-kill-without-query (get-process "shell")) +@end group +@end smallexample +@end defun + +@node Transaction Queues +@section Transaction Queues +@cindex transaction queue + +You can use a @dfn{transaction queue} to communicate with a subprocess +using transactions. First use @code{tq-create} to create a transaction +queue communicating with a specified process. Then you can call +@code{tq-enqueue} to send a transaction. + +@defun tq-create process +This function creates and returns a transaction queue communicating with +@var{process}. The argument @var{process} should be a subprocess +capable of sending and receiving streams of bytes. It may be a child +process, or it may be a TCP connection to a server, possibly on another +machine. +@end defun + +@defun tq-enqueue queue question regexp closure fn &optional delay-question +This function sends a transaction to queue @var{queue}. Specifying the +queue has the effect of specifying the subprocess to talk to. + +The argument @var{question} is the outgoing message that starts the +transaction. The argument @var{fn} is the function to call when the +corresponding answer comes back; it is called with two arguments: +@var{closure}, and the answer received. + +The argument @var{regexp} is a regular expression that should match +text at the end of the entire answer, but nothing before; that's how +@code{tq-enqueue} determines where the answer ends. + +If the argument @var{delay-question} is non-nil, delay sending this +question until the process has finished replying to any previous +questions. This produces more reliable results with some processes. + +The return value of @code{tq-enqueue} itself is not meaningful. +@end defun + +@defun tq-close queue +Shut down transaction queue @var{queue}, waiting for all pending transactions +to complete, and then terminate the connection or child process. +@end defun + +Transaction queues are implemented by means of a filter function. +@xref{Filter Functions}. + +@node Network +@section Network Connections +@cindex network connection +@cindex TCP +@cindex UDP + + Emacs Lisp programs can open stream (TCP) and datagram (UDP) network +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 it has no +process @acronym{ID}, and you can't kill it or send it signals. All you +can do is send and receive data. @code{delete-process} closes the +connection, but does not kill the program at the other end; that +program must decide what to do about closure of the connection. + + Lisp programs can listen for connections by creating network +servers. A network server is also represented by a kind of process +object, but unlike a network connection, the network server never +transfers data itself. When it receives a connection request, it +creates a new network connection to represent the connection just +made. (The network connection inherits certain information, including +the process plist, from the server.) The network server then goes +back to listening for more connection requests. + + Network connections and servers are created by calling +@code{make-network-process} with an argument list consisting of +keyword/argument pairs, for example @code{:server t} to create a +server process, or @code{:type 'datagram} to create a datagram +connection. @xref{Low-Level Network}, for details. You can also use +the @code{open-network-stream} function described below. + + You can distinguish process objects representing network connections +and servers from those representing subprocesses with the +@code{process-status} function. The possible status values for +network connections are @code{open}, @code{closed}, @code{connect}, +and @code{failed}. For a network server, the status is always +@code{listen}. None of those values is possible for a real +subprocess. @xref{Process Information}. + + You can stop and resume operation of a network process by calling +@code{stop-process} and @code{continue-process}. For a server +process, being stopped means not accepting new connections. (Up to 5 +connection requests will be queued for when you resume the server; you +can increase this limit, unless it is imposed by the operating +system.) For a network stream connection, being stopped means not +processing input (any arriving input waits until you resume the +connection). For a datagram connection, some number of packets may be +queued but input may be lost. You can use the function +@code{process-command} to determine whether a network connection or +server is stopped; a non-@code{nil} value means yes. + +@defun open-network-stream name buffer-or-name host service +This function opens a TCP connection, and returns a process object +that represents the connection. + +The @var{name} argument specifies the name for the process object. It +is modified as necessary to make it unique. + +The @var{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 +@var{buffer-or-name} is @code{nil}, it means that the connection is not +associated with any buffer. + +The arguments @var{host} and @var{service} specify where to connect to; +@var{host} is the host name (a string), and @var{service} is the name of +a defined network service (a string) or a port number (an integer). +@end defun + +@defun process-contact process &optional key +This function returns information about how a network process was set +up. For a connection, when @var{key} is @code{nil}, it returns +@code{(@var{hostname} @var{service})} which specifies what you +connected to. + +If @var{key} is @code{t}, the value is the complete status information +for the connection or server; that is, the list of keywords and values +specified in @code{make-network-process}, except that some of the +values represent the current status instead of what you specified: + +@table @code +@item :buffer +The associated value is the process buffer. +@item :filter +The associated value is the process filter function. +@item :sentinel +The associated value is the process sentinel function. +@item :remote +In a connection, the address in internal format of the remote peer. +@item :local +The local address, in internal format. +@item :service +In a server, if you specified @code{t} for @var{service}, +this value is the actual port number. +@end table + +@code{:local} and @code{:remote} are included even if they were not +specified explicitly in @code{make-network-process}. + +If @var{key} is a keyword, the function returns the value corresponding +to that keyword. + +For an ordinary child process, this function always returns @code{t}. +@end defun + +@node Network Servers +@section Network Servers +@cindex network servers + + You create a server by calling @code{make-network-process} with +@code{:server t}. The server will listen for connection requests from +clients. When it accepts a client connection request, that creates a +new network connection, itself a process object, with the following +parameters: + +@itemize @bullet +@item +The connection's process name is constructed by concatenating the +server process' @var{name} with a client identification string. The +client identification string for an IPv4 connection looks like +@samp{<@var{a}.@var{b}.@var{c}.@var{d}:@var{p}>}. Otherwise, it is a +unique number in brackets, as in @samp{<@var{nnn}>}. The number +is unique for each connection in the Emacs session. + +@item +If the server's filter is non-@code{nil}, the connection process does +not get a separate process buffer; otherwise, Emacs creates a new +buffer for the purpose. The buffer name is the server's buffer name +or process name, concatenated with the client identification string. + +The server's process buffer value is never used directly by Emacs, but +it is passed to the log function, which can log connections by +inserting text there. + +@item +The communication type and the process filter and sentinel are +inherited from those of the server. The server never directly +uses its filter and sentinel; their sole purpose is to initialize +connections made to the server. + +@item +The connection's process contact info is set according to the client's +addressing information (typically an IP address and a port number). +This information is associated with the @code{process-contact} +keywords @code{:host}, @code{:service}, @code{:remote}. + +@item +The connection's local address is set up according to the port +number used for the connection. + +@item +The client process' plist is initialized from the server's plist. +@end itemize + +@node Datagrams +@section Datagrams +@cindex datagrams + + A datagram connection communicates with individual packets rather +than streams of data. Each call to @code{process-send} sends one +datagram packet (@pxref{Input to Processes}), and each datagram +received results in one call to the filter function. + + The datagram connection doesn't have to talk with the same remote +peer all the time. It has a @dfn{remote peer address} which specifies +where to send datagrams to. Each time an incoming datagram is passed +to the filter function, the peer address is set to the address that +datagram came from; that way, if the filter function sends a datagram, +it will go back to that place. You can specify the remote peer +address when you create the datagram connection using the +@code{:remote} keyword. You can change it later on by calling +@code{set-process-datagram-address}. + +@defun process-datagram-address process +If @var{process} is a datagram connection or server, this function +returns its remote peer address. +@end defun + +@defun set-process-datagram-address process address +If @var{process} is a datagram connection or server, this function +sets its remote peer address to @var{address}. +@end defun + +@node Low-Level Network +@section Low-Level Network Access + + You can also create network connections by operating at a lower +level than that of @code{open-network-stream}, using +@code{make-network-process}. + +@menu +* Proc: Network Processes. Using @code{make-network-process}. +* Options: Network Options. Further control over network connections. +* Features: Network Feature Testing. + Determining which network features work on + the machine you are using. +@end menu + +@node Network Processes +@subsection @code{make-network-process} + + The basic function for creating network connections and network +servers is @code{make-network-process}. It can do either of those +jobs, depending on the arguments you give it. + +@defun make-network-process &rest args +This function creates a network connection or server and returns the +process object that represents it. The arguments @var{args} are a +list of keyword/argument pairs. Omitting a keyword is always +equivalent to specifying it with value @code{nil}, except for +@code{:coding}, @code{:filter-multibyte}, and @code{:reuseaddr}. Here +are the meaningful keywords: + +@table @asis +@item :name @var{name} +Use the string @var{name} as the process name. It is modified if +necessary to make it unique. + +@item :type @var{type} +Specify the communication type. A value of @code{nil} specifies a +stream connection (the default); @code{datagram} specifies a datagram +connection. Both connections and servers can be of either type. + +@item :server @var{server-flag} +If @var{server-flag} is non-@code{nil}, create a server. Otherwise, +create a connection. For a stream type server, @var{server-flag} may +be an integer which then specifies the length of the queue of pending +connections to the server. The default queue length is 5. + +@item :host @var{host} +Specify the host to connect to. @var{host} should be a host name or +Internet address, as a string, or the symbol @code{local} to specify +the local host. If you specify @var{host} for a server, it must +specify a valid address for the local host, and only clients +connecting to that address will be accepted. + +@item :service @var{service} +@var{service} specifies a port number to connect to, or, for a server, +the port number to listen on. It should be a service name that +translates to a port number, or an integer specifying the port number +directly. For a server, it can also be @code{t}, which means to let +the system select an unused port number. + +@item :family @var{family} +@var{family} specifies the address (and protocol) family for +communication. @code{nil} means determine the proper address family +automatically for the given @var{host} and @var{service}. +@code{local} specifies a Unix socket, in which case @var{host} is +ignored. @code{ipv4} and @code{ipv6} specify to use IPv4 and IPv6 +respectively. + +@item :local @var{local-address} +For a server process, @var{local-address} is the address to listen on. +It overrides @var{family}, @var{host} and @var{service}, and you +may as well not specify them. + +@item :remote @var{remote-address} +For a connection, @var{remote-address} is the address to connect to. +It overrides @var{family}, @var{host} and @var{service}, and you +may as well not specify them. + +For a datagram server, @var{remote-address} specifies the initial +setting of the remote datagram address. + +The format of @var{local-address} or @var{remote-address} depends on +the address family: + +@itemize - +@item +An IPv4 address is represented as a five-element vector of four 8-bit +integers and one 16-bit integer +@code{[@var{a} @var{b} @var{c} @var{d} @var{p}]} corresponding to +numeric IPv4 address @var{a}.@var{b}.@var{c}.@var{d} and port number +@var{p}. + +@item +An IPv6 address is represented as a nine-element vector of 16-bit +integers @code{[@var{a} @var{b} @var{c} @var{d} @var{e} @var{f} +@var{g} @var{h} @var{p}]} corresponding to numeric IPv6 address +@var{a}:@var{b}:@var{c}:@var{d}:@var{e}:@var{f}:@var{g}:@var{h} and +port number @var{p}. + +@item +A local address is represented as a string which specifies the address +in the local address space. + +@item +An ``unsupported family'' address is represented by a cons +@code{(@var{f} . @var{av})}, where @var{f} is the family number and +@var{av} is a vector specifying the socket address using one element +per address data byte. Do not rely on this format in portable code, +as it may depend on implementation defined constants, data sizes, and +data structure alignment. +@end itemize + +@item :nowait @var{bool} +If @var{bool} is non-@code{nil} for a stream connection, return +without waiting for the connection to complete. When the connection +succeeds or fails, Emacs will call the sentinel function, with a +second argument matching @code{"open"} (if successful) or +@code{"failed"}. The default is to block, so that +@code{make-network-process} does not return until the connection +has succeeded or failed. + +@item :stop @var{stopped} +Start the network connection or server in the `stopped' state if +@var{stopped} is non-@code{nil}. + +@item :buffer @var{buffer} +Use @var{buffer} as the process buffer. + +@item :coding @var{coding} +Use @var{coding} as the coding system for this process. To specify +different coding systems for decoding data from the connection and for +encoding data sent to it, specify @code{(@var{decoding} . +@var{encoding})} for @var{coding}. + +If you don't specify this keyword at all, the default +is to determine the coding systems from the data. + +@item :noquery @var{query-flag} +Initialize the process query flag to @var{query-flag}. +@xref{Query Before Exit}. + +@item :filter @var{filter} +Initialize the process filter to @var{filter}. + +@item :filter-multibyte @var{bool} +If @var{bool} is non-@code{nil}, strings given to the process filter +are multibyte, otherwise they are unibyte. If you don't specify this +keyword at all, the default is that the strings are multibyte if +@code{default-enable-multibyte-characters} is non-@code{nil}. + +@item :sentinel @var{sentinel} +Initialize the process sentinel to @var{sentinel}. + +@item :log @var{log} +Initialize the log function of a server process to @var{log}. The log +function is called each time the server accepts a network connection +from a client. The arguments passed to the log function are +@var{server}, @var{connection}, and @var{message}, where @var{server} +is the server process, @var{connection} is the new process for the +connection, and @var{message} is a string describing what has +happened. + +@item :plist @var{plist} +Initialize the process plist to @var{plist}. +@end table + +The original argument list, modified with the actual connection +information, is available via the @code{process-contact} function. +@end defun + +@node Network Options +@subsection Network Options + + The following network options can be specified when you create a +network process. Except for @code{:reuseaddr}, you can also set or +modify these options later, using @code{set-network-process-option}. + + For a server process, the options specified with +@code{make-network-process} are not inherited by the client +connections, so you will need to set the necessary options for each +child connection as it is created. + +@table @asis +@item :bindtodevice @var{device-name} +If @var{device-name} is a non-empty string identifying a network +interface name (see @code{network-interface-list}), only handle +packets received on that interface. If @var{device-name} is @code{nil} +(the default), handle packets received on any interface. + +Using this option may require special privileges on some systems. + +@item :broadcast @var{broadcast-flag} +If @var{broadcast-flag} is non-@code{nil} for a datagram process, the +process will receive datagram packet sent to a broadcast address, and +be able to send packets to a broadcast address. Ignored for a stream +connection. + +@item :dontroute @var{dontroute-flag} +If @var{dontroute-flag} is non-@code{nil}, the process can only send +to hosts on the same network as the local host. + +@item :keepalive @var{keepalive-flag} +If @var{keepalive-flag} is non-@code{nil} for a stream connection, +enable exchange of low-level keep-alive messages. + +@item :linger @var{linger-arg} +If @var{linger-arg} is non-@code{nil}, wait for successful +transmission of all queued packets on the connection before it is +deleted (see @code{delete-process}). If @var{linger-arg} is an +integer, it specifies the maximum time in seconds to wait for queued +packets to be sent before closing the connection. Default is +@code{nil} which means to discard unsent queued packets when the +process is deleted. + +@item :oobinline @var{oobinline-flag} +If @var{oobinline-flag} is non-@code{nil} for a stream connection, +receive out-of-band data in the normal data stream. Otherwise, ignore +out-of-band data. + +@item :priority @var{priority} +Set the priority for packets sent on this connection to the integer +@var{priority}. The interpretation of this number is protocol +specific, such as setting the TOS (type of service) field on IP +packets sent on this connection. It may also have system dependent +effects, such as selecting a specific output queue on the network +interface. + +@item :reuseaddr @var{reuseaddr-flag} +If @var{reuseaddr-flag} is non-@code{nil} (the default) for a stream +server process, allow this server to reuse a specific port number (see +@code{:service}) unless another process on this host is already +listening on that port. If @var{reuseaddr-flag} is @code{nil}, there +may be a period of time after the last use of that port (by any +process on the host), where it is not possible to make a new server on +that port. +@end table + +@defun set-network-process-option process option value +This function sets or modifies a network option for network process +@var{process}. See @code{make-network-process} for details of options +@var{option} and their corresponding values @var{value}. + +The current setting of an option is available via the +@code{process-contact} function. +@end defun + +@node Network Feature Testing +@subsection Testing Availability of Network Features + + To test for the availability of a given network feature, use +@code{featurep} like this: + +@example +(featurep 'make-network-process '(@var{keyword} @var{value})) +@end example + +@noindent +The result of the first form is @code{t} if it works to specify +@var{keyword} with value @var{value} in @code{make-network-process}. +The result of the second form is @code{t} if @var{keyword} is +supported by @code{make-network-process}. Here are some of the +@var{keyword}---@var{value} pairs you can test in +this way. + +@table @code +@item (:nowait t) +Non-@code{nil} if non-blocking connect is supported. +@item (:type datagram) +Non-@code{nil} if datagrams are supported. +@item (:family local) +Non-@code{nil} if local (a.k.a.@: ``UNIX domain'') sockets are supported. +@item (:family ipv6) +Non-@code{nil} if IPv6 is supported. +@item (:service t) +Non-@code{nil} if the system can select the port for a server. +@end table + + To test for the availability of a given network option, use +@code{featurep} like this: + +@example +(featurep 'make-network-process '@var{keyword}) +@end example + +@noindent +Here are some of the options you can test in this way. + +@table @code +@item :bindtodevice +@itemx :broadcast +@itemx :dontroute +@itemx :keepalive +@itemx :linger +@itemx :oobinline +@itemx :priority +@itemx :reuseaddr +That particular network option is supported by +@code{make-network-process} and @code{set-network-process-option}. +@end table + +@node Misc Network +@section Misc Network Facilities + + These additional functions are useful for creating and operating +on network connections. + +@defun network-interface-list +This function returns a list describing the network interfaces +of the machine you are using. The value is an alist whose +elements have the form @code{(@var{name} . @var{address})}. +@var{address} has the same form as the @var{local-address} +and @var{remote-address} arguments to @code{make-network-process}. +@end defun + +@defun network-interface-info ifname +This function returns information about the network interface named +@var{ifname}. The value is a list of the form +@code{(@var{addr} @var{bcast} @var{netmask} @var{hwaddr} @var{flags})}. + +@table @var +@item addr +The Internet protocol address. +@item bcast +The broadcast address. +@item netmask +The network mask. +@item hwaddr +The layer 2 address (Ethernet MAC address, for instance). +@item flags +The current flags of the interface. +@end table +@end defun + +@defun format-network-address address &optional omit-port +This function converts the Lisp representation of a network address to +a string. + +A five-element vector @code{[@var{a} @var{b} @var{c} @var{d} @var{p}]} +represents an IPv4 address @var{a}.@var{b}.@var{c}.@var{d} and port +number @var{p}. @code{format-network-address} converts that to the +string @code{"@var{a}.@var{b}.@var{c}.@var{d}:@var{p}"}. + +A nine-element vector @code{[@var{a} @var{b} @var{c} @var{d} @var{e} +@var{f} @var{g} @var{h} @var{p}]} represents an IPv6 address along +with a port number. @code{format-network-address} converts that to +the string +@code{"[@var{a}:@var{b}:@var{c}:@var{d}:@var{e}:@var{f}:@var{g}:@var{h}]:@var{p}"}. + +If the vector does not include the port number, @var{p}, or if +@var{omit-port} is non-@code{nil}, the result does not include the +@code{:@var{p}} suffix. +@end defun + +@node Byte Packing +@section Packing and Unpacking Byte Arrays +@cindex byte packing and unpacking + + This section describes how to pack and unpack arrays of bytes, +usually for binary network protocols. These functions convert byte arrays +to alists, and vice versa. The byte array can be represented as a +unibyte string or as a vector of integers, while the alist associates +symbols either with fixed-size objects or with recursive sub-alists. + +@cindex serializing +@cindex deserializing +@cindex packing +@cindex unpacking + Conversion from byte arrays to nested alists is also known as +@dfn{deserializing} or @dfn{unpacking}, while going in the opposite +direction is also known as @dfn{serializing} or @dfn{packing}. + +@menu +* Bindat Spec:: Describing data layout. +* Bindat Functions:: Doing the unpacking and packing. +* Bindat Examples:: Samples of what bindat.el can do for you! +@end menu + +@node Bindat Spec +@subsection Describing Data Layout + + To control unpacking and packing, you write a @dfn{data layout +specification}, a special nested list describing named and typed +@dfn{fields}. This specification controls length of each field to be +processed, and how to pack or unpack it. We normally keep bindat specs +in variables whose names end in @samp{-bindat-spec}; that kind of name +is automatically recognized as ``risky.'' + +@cindex endianness +@cindex big endian +@cindex little endian +@cindex network byte ordering + A field's @dfn{type} describes the size (in bytes) of the object +that the field represents and, in the case of multibyte fields, how +the bytes are ordered within the field. The two possible orderings +are ``big endian'' (also known as ``network byte ordering'') and +``little endian.'' For instance, the number @code{#x23cd} (decimal +9165) in big endian would be the two bytes @code{#x23} @code{#xcd}; +and in little endian, @code{#xcd} @code{#x23}. Here are the possible +type values: + +@table @code +@item u8 +@itemx byte +Unsigned byte, with length 1. + +@item u16 +@itemx word +@itemx short +Unsigned integer in network byte order, with length 2. + +@item u24 +Unsigned integer in network byte order, with length 3. + +@item u32 +@itemx dword +@itemx long +Unsigned integer in network byte order, with length 4. +Note: These values may be limited by Emacs' integer implementation limits. + +@item u16r +@itemx u24r +@itemx u32r +Unsigned integer in little endian order, with length 2, 3 and 4, respectively. + +@item str @var{len} +String of length @var{len}. + +@item strz @var{len} +Zero-terminated string, in a fixed-size field with length @var{len}. + +@item vec @var{len} [@var{type}] +Vector of @var{len} elements of type @var{type}, or bytes if not +@var{type} is specified. +The @var{type} is any of the simple types above, or another vector +specified as a list @code{(vec @var{len} [@var{type}])}. + +@item ip +Four-byte vector representing an Internet address. For example: +@code{[127 0 0 1]} for localhost. + +@item bits @var{len} +List of set bits in @var{len} bytes. The bytes are taken in big +endian order and the bits are numbered starting with @code{8 * +@var{len} @minus{} 1} and ending with zero. For example: @code{bits +2} unpacks @code{#x28} @code{#x1c} to @code{(2 3 4 11 13)} and +@code{#x1c} @code{#x28} to @code{(3 5 10 11 12)}. + +@item (eval @var{form}) +@var{form} is a Lisp expression evaluated at the moment the field is +unpacked or packed. The result of the evaluation should be one of the +above-listed type specifications. +@end table + +For a fixed-size field, the length @var{len} is given as an integer +specifying the number of bytes in the field. + +When the length of a field is not fixed, it typically depends on the +value of a preceding field. In this case, the length @var{len} can be +given either as a list @code{(@var{name} ...)} identifying a +@dfn{field name} in the format specified for @code{bindat-get-field} +below, or by an expression @code{(eval @var{form})} where @var{form} +should evaluate to an integer, specifying the field length. + +A field specification generally has the form @code{([@var{name}] +@var{handler})}. The square braces indicate that @var{name} is +optional. (Don't use names that are symbols meaningful as type +specifications (above) or handler specifications (below), since that +would be ambiguous.) @var{name} can be a symbol or the expression +@code{(eval @var{form})}, in which case @var{form} should evaluate to +a symbol. + +@var{handler} describes how to unpack or pack the field and can be one +of the following: + +@table @code +@item @var{type} +Unpack/pack this field according to the type specification @var{type}. + +@item eval @var{form} +Evaluate @var{form}, a Lisp expression, for side-effect only. If the +field name is specified, the value is bound to that field name. + +@item fill @var{len} +Skip @var{len} bytes. In packing, this leaves them unchanged, +which normally means they remain zero. In unpacking, this means +they are ignored. + +@item align @var{len} +Skip to the next multiple of @var{len} bytes. + +@item struct @var{spec-name} +Process @var{spec-name} as a sub-specification. This describes a +structure nested within another structure. + +@item union @var{form} (@var{tag} @var{spec})@dots{} +@c ??? I don't see how one would actually use this. +@c ??? what kind of expression would be useful for @var{form}? +Evaluate @var{form}, a Lisp expression, find the first @var{tag} +that matches it, and process its associated data layout specification +@var{spec}. Matching can occur in one of three ways: + +@itemize +@item +If a @var{tag} has the form @code{(eval @var{expr})}, evaluate +@var{expr} with the variable @code{tag} dynamically bound to the value +of @var{form}. A non-@code{nil} result indicates a match. + +@item +@var{tag} matches if it is @code{equal} to the value of @var{form}. + +@item +@var{tag} matches unconditionally if it is @code{t}. +@end itemize + +@item repeat @var{count} @var{field-specs}@dots{} +Process the @var{field-specs} recursively, in order, then repeat +starting from the first one, processing all the specs @var{count} +times overall. The @var{count} is given using the same formats as a +field length---if an @code{eval} form is used, it is evaluated just once. +For correct operation, each spec in @var{field-specs} must include a name. +@end table + +For the @code{(eval @var{form})} forms used in a bindat specification, +the @var{form} can access and update these dynamically bound variables +during evaluation: + +@table @code +@item last +Value of the last field processed. + +@item bindat-raw +The data as a byte array. + +@item bindat-idx +Current index (within @code{bindat-raw}) for unpacking or packing. + +@item struct +The alist containing the structured data that have been unpacked so +far, or the entire structure being packed. You can use +@code{bindat-get-field} to access specific fields of this structure. + +@item count +@itemx index +Inside a @code{repeat} block, these contain the maximum number of +repetitions (as specified by the @var{count} parameter), and the +current repetition number (counting from 0). Setting @code{count} to +zero will terminate the inner-most repeat block after the current +repetition has completed. +@end table + +@node Bindat Functions +@subsection Functions to Unpack and Pack Bytes + + In the following documentation, @var{spec} refers to a data layout +specification, @code{bindat-raw} to a byte array, and @var{struct} to an +alist representing unpacked field data. + +@defun bindat-unpack spec bindat-raw &optional bindat-idx +This function unpacks data from the unibyte string or byte +array @code{bindat-raw} +according to @var{spec}. Normally this starts unpacking at the +beginning of the byte array, but if @var{bindat-idx} is non-@code{nil}, it +specifies a zero-based starting position to use instead. + +The value is an alist or nested alist in which each element describes +one unpacked field. +@end defun + +@defun bindat-get-field struct &rest name +This function selects a field's data from the nested alist +@var{struct}. Usually @var{struct} was returned by +@code{bindat-unpack}. If @var{name} corresponds to just one argument, +that means to extract a top-level field value. Multiple @var{name} +arguments specify repeated lookup of sub-structures. An integer name +acts as an array index. + +For example, if @var{name} is @code{(a b 2 c)}, that means to find +field @code{c} in the third element of subfield @code{b} of field +@code{a}. (This corresponds to @code{struct.a.b[2].c} in C.) +@end defun + + Although packing and unpacking operations change the organization of +data (in memory), they preserve the data's @dfn{total length}, which is +the sum of all the fields' lengths, in bytes. This value is not +generally inherent in either the specification or alist alone; instead, +both pieces of information contribute to its calculation. Likewise, the +length of a string or array being unpacked may be longer than the data's +total length as described by the specification. + +@defun bindat-length spec struct +This function returns the total length of the data in @var{struct}, +according to @var{spec}. +@end defun + +@defun bindat-pack spec struct &optional bindat-raw bindat-idx +This function returns a byte array packed according to @var{spec} from +the data in the alist @var{struct}. Normally it creates and fills a +new byte array starting at the beginning. However, if @var{bindat-raw} +is non-@code{nil}, it specifies a pre-allocated unibyte string or vector to +pack into. If @var{bindat-idx} is non-@code{nil}, it specifies the starting +offset for packing into @code{bindat-raw}. + +When pre-allocating, you should make sure @code{(length @var{bindat-raw})} +meets or exceeds the total length to avoid an out-of-range error. +@end defun + +@defun bindat-ip-to-string ip +Convert the Internet address vector @var{ip} to a string in the usual +dotted notation. + +@example +(bindat-ip-to-string [127 0 0 1]) + @result{} "127.0.0.1" +@end example +@end defun + +@node Bindat Examples +@subsection Examples of Byte Unpacking and Packing + + Here is a complete example of byte unpacking and packing: + +@lisp +(defvar fcookie-index-spec + '((:version u32) + (:count u32) + (:longest u32) + (:shortest u32) + (:flags u32) + (:delim u8) + (:ignored fill 3) + (:offset repeat (:count) + (:foo u32))) + "Description of a fortune cookie index file's contents.") + +(defun fcookie (cookies &optional index) + "Display a random fortune cookie from file COOKIES. +Optional second arg INDEX specifies the associated index +filename, which is by default constructed by appending +\".dat\" to COOKIES. Display cookie text in possibly +new buffer \"*Fortune Cookie: BASENAME*\" where BASENAME +is COOKIES without the directory part." + (interactive "fCookies file: ") + (let* ((info (with-temp-buffer + (insert-file-contents-literally + (or index (concat cookies ".dat"))) + (bindat-unpack fcookie-index-spec + (buffer-string)))) + (sel (random (bindat-get-field info :count))) + (beg (cdar (bindat-get-field info :offset sel))) + (end (or (cdar (bindat-get-field info + :offset (1+ sel))) + (nth 7 (file-attributes cookies))))) + (switch-to-buffer + (get-buffer-create + (format "*Fortune Cookie: %s*" + (file-name-nondirectory cookies)))) + (erase-buffer) + (insert-file-contents-literally + cookies nil beg (- end 3)))) + +(defun fcookie-create-index (cookies &optional index delim) + "Scan file COOKIES, and write out its index file. +Optional second arg INDEX specifies the index filename, +which is by default constructed by appending \".dat\" to +COOKIES. Optional third arg DELIM specifies the unibyte +character which, when found on a line of its own in +COOKIES, indicates the border between entries." + (interactive "fCookies file: ") + (setq delim (or delim ?%)) + (let ((delim-line (format "\n%c\n" delim)) + (count 0) + (max 0) + min p q len offsets) + (unless (= 3 (string-bytes delim-line)) + (error "Delimiter cannot be represented in one byte")) + (with-temp-buffer + (insert-file-contents-literally cookies) + (while (and (setq p (point)) + (search-forward delim-line (point-max) t) + (setq len (- (point) 3 p))) + (setq count (1+ count) + max (max max len) + min (min (or min max) len) + offsets (cons (1- p) offsets)))) + (with-temp-buffer + (set-buffer-multibyte nil) + (insert + (bindat-pack + fcookie-index-spec + `((:version . 2) + (:count . ,count) + (:longest . ,max) + (:shortest . ,min) + (:flags . 0) + (:delim . ,delim) + (:offset . ,(mapcar (lambda (o) + (list (cons :foo o))) + (nreverse offsets)))))) + (let ((coding-system-for-write 'raw-text-unix)) + (write-file (or index (concat cookies ".dat"))))))) +@end lisp + +Following is an example of defining and unpacking a complex structure. +Consider the following C structures: + +@example +struct header @{ + unsigned long dest_ip; + unsigned long src_ip; + unsigned short dest_port; + unsigned short src_port; +@}; + +struct data @{ + unsigned char type; + unsigned char opcode; + unsigned short length; /* In network byte order */ + unsigned char id[8]; /* null-terminated string */ + unsigned char data[/* (length + 3) & ~3 */]; +@}; + +struct packet @{ + struct header header; + unsigned long counters[2]; /* In little endian order */ + unsigned char items; + unsigned char filler[3]; + struct data item[/* items */]; + +@}; +@end example + +The corresponding data layout specification: + +@lisp +(setq header-spec + '((dest-ip ip) + (src-ip ip) + (dest-port u16) + (src-port u16))) + +(setq data-spec + '((type u8) + (opcode u8) + (length u16) ;; network byte order + (id strz 8) + (data vec (length)) + (align 4))) + +(setq packet-spec + '((header struct header-spec) + (counters vec 2 u32r) ;; little endian order + (items u8) + (fill 3) + (item repeat (items) + (struct data-spec)))) +@end lisp + +A binary data representation: + +@lisp +(setq binary-data + [ 192 168 1 100 192 168 1 101 01 28 21 32 + 160 134 1 0 5 1 0 0 2 0 0 0 + 2 3 0 5 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0 + 1 4 0 7 ?B ?C ?D ?E ?F ?G 0 0 6 7 8 9 10 11 12 0 ]) +@end lisp + +The corresponding decoded structure: + +@lisp +(setq decoded (bindat-unpack packet-spec binary-data)) + @result{} +((header + (dest-ip . [192 168 1 100]) + (src-ip . [192 168 1 101]) + (dest-port . 284) + (src-port . 5408)) + (counters . [100000 261]) + (items . 2) + (item ((data . [1 2 3 4 5]) + (id . "ABCDEF") + (length . 5) + (opcode . 3) + (type . 2)) + ((data . [6 7 8 9 10 11 12]) + (id . "BCDEFG") + (length . 7) + (opcode . 4) + (type . 1)))) +@end lisp + +Fetching data from this structure: + +@lisp +(bindat-get-field decoded 'item 1 'id) + @result{} "BCDEFG" +@end lisp + +@ignore + arch-tag: ba9da253-e65f-4e7f-b727-08fba0a1df7a +@end ignore diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi new file mode 100644 index 00000000000..70926478ea7 --- /dev/null +++ b/doc/lispref/searching.texi @@ -0,0 +1,1766 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/searching +@node Searching and Matching, Syntax Tables, Non-ASCII Characters, Top +@chapter Searching and Matching +@cindex searching + + 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 examine the @dfn{match data} to +determine which text matched the whole regular expression or various +portions of it. + +@menu +* String Search:: Search for an exact match. +* Searching and Case:: Case-independent or case-significant searching. +* Regular Expressions:: Describing classes of strings. +* Regexp Search:: Searching for a match for a regexp. +* POSIX Regexps:: Searching POSIX-style for the longest match. +* Match Data:: Finding out which part of the text matched, + after a string or regexp search. +* Search and Replace:: Commands that loop, searching and replacing. +* Standard Regexps:: Useful regexps for finding sentences, pages,... +@end menu + + The @samp{skip-chars@dots{}} functions also perform a kind of searching. +@xref{Skipping Characters}. To search for changes in character +properties, see @ref{Property Search}. + +@node String Search +@section Searching for Strings +@cindex string search + + 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; the +arguments @var{limit} and @var{noerror} are @code{nil}, and @var{repeat} +is 1. + + These search functions convert the search string to multibyte if the +buffer is multibyte; they convert the search string to unibyte if the +buffer is unibyte. @xref{Text Representations}. + +@deffn Command search-forward string &optional limit noerror repeat +This function searches forward from point for an exact match for +@var{string}. If successful, it sets point to the end of the occurrence +found, and returns the new value of point. If no match is found, the +value and side effects depend on @var{noerror} (see below). +@c Emacs 19 feature + +In the following example, point is initially at the beginning of the +line. Then @code{(search-forward "fox")} moves point after the last +letter of @samp{fox}: + +@example +@group +---------- Buffer: foo ---------- +@point{}The quick brown fox jumped over the lazy dog. +---------- Buffer: foo ---------- +@end group + +@group +(search-forward "fox") + @result{} 20 + +---------- Buffer: foo ---------- +The quick brown fox@point{} jumped over the lazy dog. +---------- Buffer: foo ---------- +@end group +@end example + +The argument @var{limit} specifies the upper bound to the search. (It +must be a position in the current buffer.) No match extending after +that position is accepted. If @var{limit} is omitted or @code{nil}, it +defaults to the end of the accessible portion of the buffer. + +@kindex search-failed +What happens when the search fails depends on the value of +@var{noerror}. If @var{noerror} is @code{nil}, a @code{search-failed} +error is signaled. If @var{noerror} is @code{t}, @code{search-forward} +returns @code{nil} and does nothing. If @var{noerror} is neither +@code{nil} nor @code{t}, then @code{search-forward} moves point to the +upper bound and returns @code{nil}. (It would be more consistent now to +return the new position of point in that case, but some existing +programs may depend on a value of @code{nil}.) + +The argument @var{noerror} only affects valid searches which fail to +find a match. Invalid arguments cause errors regardless of +@var{noerror}. + +If @var{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). If these successive searches succeed, the +function succeeds, moving point and returning its new value. Otherwise +the search fails, with results depending on the value of +@var{noerror}, as described above. +@end deffn + +@deffn Command search-backward string &optional limit noerror repeat +This function searches backward from point for @var{string}. It is +just like @code{search-forward} except that it searches backwards and +leaves point at the beginning of the match. +@end deffn + +@deffn Command word-search-forward string &optional limit noerror repeat +@c @cindex word search Redundant +This function searches forward from point for a ``word'' match for +@var{string}. If it finds a match, it sets point to the end of the +match found, and returns the new value of point. +@c Emacs 19 feature + +Word matching regards @var{string} as a sequence of words, disregarding +punctuation that separates them. It searches the buffer for the same +sequence of words. Each word must be distinct in the buffer (searching +for the word @samp{ball} does not match the word @samp{balls}), but the +details of punctuation and spacing are ignored (searching for @samp{ball +boy} does match @samp{ball. Boy!}). + +In this example, point is initially at the beginning of the buffer; the +search leaves it between the @samp{y} and the @samp{!}. + +@example +@group +---------- Buffer: foo ---------- +@point{}He said "Please! Find +the ball boy!" +---------- Buffer: foo ---------- +@end group + +@group +(word-search-forward "Please find the ball, boy.") + @result{} 35 + +---------- Buffer: foo ---------- +He said "Please! Find +the ball boy@point{}!" +---------- Buffer: foo ---------- +@end group +@end example + +If @var{limit} is non-@code{nil}, it must be a position in the current +buffer; it specifies the upper bound to the search. The match found +must not extend after that position. + +If @var{noerror} is @code{nil}, then @code{word-search-forward} signals +an error if the search fails. If @var{noerror} is @code{t}, then it +returns @code{nil} instead of signaling an error. If @var{noerror} is +neither @code{nil} nor @code{t}, it moves point to @var{limit} (or the +end of the accessible portion of the buffer) and returns @code{nil}. + +If @var{repeat} is non-@code{nil}, then the search is repeated that many +times. Point is positioned at the end of the last match. +@end deffn + +@deffn Command word-search-backward string &optional limit noerror repeat +This function searches backward from point for a word match to +@var{string}. This function is just like @code{word-search-forward} +except that it searches backward and normally leaves point at the +beginning of the match. +@end deffn + +@node Searching and Case +@section Searching and Case +@cindex searching and case + + By default, searches in Emacs ignore the case of the text they are +searching through; if you specify searching for @samp{FOO}, then +@samp{Foo} or @samp{foo} is also considered a match. This applies to +regular expressions, too; thus, @samp{[aB]} would match @samp{a} or +@samp{A} or @samp{b} or @samp{B}. + + If you do not want this feature, set the variable +@code{case-fold-search} to @code{nil}. Then all letters must match +exactly, including case. This is a buffer-local variable; altering the +variable affects only the current buffer. (@xref{Intro to +Buffer-Local}.) Alternatively, you may change the value of +@code{default-case-fold-search}, which is the default value of +@code{case-fold-search} for buffers that do not override it. + + Note that the user-level incremental search feature handles case +distinctions differently. When given a lower case letter, it looks for +a match of either case, but when given an upper case letter, it looks +for an upper case letter only. But this has nothing to do with the +searching functions used in Lisp code. + +@defopt case-replace +This variable determines whether the higher level replacement +functions should preserve case. If the variable is @code{nil}, that +means to use the replacement text verbatim. A non-@code{nil} value +means to convert the case of the replacement text according to the +text being replaced. + +This variable is used by passing it as an argument to the function +@code{replace-match}. @xref{Replacing Match}. +@end defopt + +@defopt case-fold-search +This buffer-local variable determines whether searches should ignore +case. If the variable is @code{nil} they do not ignore case; otherwise +they do ignore case. +@end defopt + +@defvar default-case-fold-search +The value of this variable is the default value for +@code{case-fold-search} in buffers that do not override it. This is the +same as @code{(default-value 'case-fold-search)}. +@end defvar + +@node Regular Expressions +@section Regular Expressions +@cindex regular expression +@cindex regexp + + A @dfn{regular expression} (@dfn{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. + +@findex re-builder +@cindex regular expressions, developing + For convenient interactive development of regular expressions, you +can use the @kbd{M-x re-builder} command. It provides a convenient +interface for creating regular expressions, by giving immediate visual +feedback in a separate buffer. As you edit the regexp, all its +matches in the target buffer are highlighted. Each parenthesized +sub-expression of the regexp is shown in a distinct face, which makes +it easier to verify even very complex regexps. + +@menu +* Syntax of Regexps:: Rules for writing regular expressions. +* Regexp Example:: Illustrates regular expression syntax. +* Regexp Functions:: Functions for operating on regular expressions. +@end menu + +@node Syntax of Regexps +@subsection Syntax of Regular Expressions + + Regular expressions have a syntax in which a few characters are +special constructs and the rest are @dfn{ordinary}. An ordinary +character is a simple regular expression that matches that character +and nothing else. The special characters are @samp{.}, @samp{*}, +@samp{+}, @samp{?}, @samp{[}, @samp{^}, @samp{$}, and @samp{\}; no new +special characters will be defined in the future. The character +@samp{]} is special if it ends a character alternative (see later). +The character @samp{-} is special inside a character alternative. A +@samp{[:} and balancing @samp{:]} enclose a character class inside a +character alternative. Any other character appearing in a regular +expression is ordinary, unless a @samp{\} precedes it. + + For example, @samp{f} is not a special character, so it is ordinary, and +therefore @samp{f} is a regular expression that matches the string +@samp{f} and no other string. (It does @emph{not} match the string +@samp{fg}, but it does match a @emph{part} of that string.) Likewise, +@samp{o} is a regular expression that matches only @samp{o}.@refill + + Any two regular expressions @var{a} and @var{b} can be concatenated. The +result is a regular expression that matches a string if @var{a} matches +some amount of the beginning of that string and @var{b} matches the rest of +the string.@refill + + As a simple example, we can concatenate the regular expressions @samp{f} +and @samp{o} to get the regular expression @samp{fo}, which matches only +the string @samp{fo}. Still trivial. To do something more powerful, you +need to use one of the special regular expression constructs. + +@menu +* Regexp Special:: Special characters in regular expressions. +* Char Classes:: Character classes used in regular expressions. +* Regexp Backslash:: Backslash-sequences in regular expressions. +@end menu + +@node Regexp Special +@subsubsection Special Characters in Regular Expressions + + Here is a list of the characters that are special in a regular +expression. + +@need 800 +@table @asis +@item @samp{.}@: @r{(Period)} +@cindex @samp{.} in regexp +is a special character that matches any single character except a newline. +Using concatenation, we can make regular expressions like @samp{a.b}, which +matches any three-character string that begins with @samp{a} and ends with +@samp{b}.@refill + +@item @samp{*} +@cindex @samp{*} in regexp +is not a construct by itself; it is a postfix operator that means to +match the preceding regular expression repetitively as many times as +possible. Thus, @samp{o*} matches any number of @samp{o}s (including no +@samp{o}s). + +@samp{*} always applies to the @emph{smallest} possible preceding +expression. Thus, @samp{fo*} has a repeating @samp{o}, not a repeating +@samp{fo}. It matches @samp{f}, @samp{fo}, @samp{foo}, and so on. + +The matcher processes a @samp{*} 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 @samp{*}-modified construct in the hope that that will +make it possible to match the rest of the pattern. For example, in +matching @samp{ca*ar} against the string @samp{caaar}, the @samp{a*} +first tries to match all three @samp{a}s; but the rest of the pattern is +@samp{ar} and there is only @samp{r} left to match, so this try fails. +The next alternative is for @samp{a*} to match only two @samp{a}s. With +this choice, the rest of the regexp matches successfully. + +@strong{Warning:} Nested repetition operators can run for an +indefinitely long time, if they lead to ambiguous matching. For +example, trying to match the regular expression @samp{\(x+y*\)*a} +against the string @samp{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz} could +take hours before it ultimately fails. Emacs must try each way of +grouping the @samp{x}s before concluding that none of them can work. +Even worse, @samp{\(x*\)*} can match the null string in infinitely +many ways, so it causes an infinite loop. To avoid these problems, +check nested repetitions carefully, to make sure that they do not +cause combinatorial explosions in backtracking. + +@item @samp{+} +@cindex @samp{+} in regexp +is a postfix operator, similar to @samp{*} except that it must match +the preceding expression at least once. So, for example, @samp{ca+r} +matches the strings @samp{car} and @samp{caaaar} but not the string +@samp{cr}, whereas @samp{ca*r} matches all three strings. + +@item @samp{?} +@cindex @samp{?} in regexp +is a postfix operator, similar to @samp{*} except that it must match the +preceding expression either once or not at all. For example, +@samp{ca?r} matches @samp{car} or @samp{cr}; nothing else. + +@item @samp{*?}, @samp{+?}, @samp{??} +These are ``non-greedy'' variants of the operators @samp{*}, @samp{+} +and @samp{?}. Where those operators match the largest possible +substring (consistent with matching the entire containing expression), +the non-greedy variants match the smallest possible substring +(consistent with matching the entire containing expression). + +For example, the regular expression @samp{c[ad]*a} when applied to the +string @samp{cdaaada} matches the whole string; but the regular +expression @samp{c[ad]*?a}, applied to that same string, matches just +@samp{cda}. (The smallest possible match here for @samp{[ad]*?} that +permits the whole expression to match is @samp{d}.) + +@item @samp{[ @dots{} ]} +@cindex character alternative (in regexp) +@cindex @samp{[} in regexp +@cindex @samp{]} in regexp +is a @dfn{character alternative}, which begins with @samp{[} and is +terminated by @samp{]}. In the simplest case, the characters between +the two brackets are what this character alternative can match. + +Thus, @samp{[ad]} matches either one @samp{a} or one @samp{d}, and +@samp{[ad]*} matches any string composed of just @samp{a}s and @samp{d}s +(including the empty string), from which it follows that @samp{c[ad]*r} +matches @samp{cr}, @samp{car}, @samp{cdr}, @samp{caddaar}, etc. + +You can also include character ranges in a character alternative, by +writing the starting and ending characters with a @samp{-} between them. +Thus, @samp{[a-z]} matches any lower-case @acronym{ASCII} letter. +Ranges may be intermixed freely with individual characters, as in +@samp{[a-z$%.]}, which matches any lower case @acronym{ASCII} letter +or @samp{$}, @samp{%} or period. + +Note that the usual regexp special characters are not special inside a +character alternative. A completely different set of characters is +special inside character alternatives: @samp{]}, @samp{-} and @samp{^}. + +To include a @samp{]} in a character alternative, you must make it the +first character. For example, @samp{[]a]} matches @samp{]} or @samp{a}. +To include a @samp{-}, write @samp{-} as the first or last character of +the character alternative, or put it after a range. Thus, @samp{[]-]} +matches both @samp{]} and @samp{-}. + +To include @samp{^} in a character alternative, put it anywhere but at +the beginning. + +The beginning and end of a range of multibyte characters must be in +the same character set (@pxref{Character Sets}). Thus, +@code{"[\x8e0-\x97c]"} is invalid because character 0x8e0 (@samp{a} +with grave accent) is in the Emacs character set for Latin-1 but the +character 0x97c (@samp{u} with diaeresis) is in the Emacs character +set for Latin-2. (We use Lisp string syntax to write that example, +and a few others in the next few paragraphs, in order to include hex +escape sequences in them.) + +If a range starts with a unibyte character @var{c} and ends with a +multibyte character @var{c2}, the range is divided into two parts: one +is @samp{@var{c}..?\377}, the other is @samp{@var{c1}..@var{c2}}, where +@var{c1} is the first character of the charset to which @var{c2} +belongs. + +You cannot always match all non-@acronym{ASCII} characters with the regular +expression @code{"[\200-\377]"}. This works when searching a unibyte +buffer or string (@pxref{Text Representations}), but not in a multibyte +buffer or string, because many non-@acronym{ASCII} characters have codes +above octal 0377. However, the regular expression @code{"[^\000-\177]"} +does match all non-@acronym{ASCII} characters (see below regarding @samp{^}), +in both multibyte and unibyte representations, because only the +@acronym{ASCII} characters are excluded. + +A character alternative can also specify named +character classes (@pxref{Char Classes}). This is a POSIX feature whose +syntax is @samp{[:@var{class}:]}. Using a character class is equivalent +to mentioning each of the characters in that class; but the latter is +not feasible in practice, since some classes include thousands of +different characters. + +@item @samp{[^ @dots{} ]} +@cindex @samp{^} in regexp +@samp{[^} begins a @dfn{complemented character alternative}. This +matches any character except the ones specified. Thus, +@samp{[^a-z0-9A-Z]} matches all characters @emph{except} letters and +digits. + +@samp{^} is not special in a character alternative unless it is the first +character. The character following the @samp{^} is treated as if it +were first (in other words, @samp{-} and @samp{]} are not special there). + +A complemented character alternative can match a newline, unless newline is +mentioned as one of the characters not to match. This is in contrast to +the handling of regexps in programs such as @code{grep}. + +@item @samp{^} +@cindex beginning of line in regexp +When matching a buffer, @samp{^} matches the empty string, but only at the +beginning of a line in the text being matched (or the beginning of the +accessible portion of the buffer). Otherwise it fails to match +anything. Thus, @samp{^foo} matches a @samp{foo} that occurs at the +beginning of a line. + +When matching a string instead of a buffer, @samp{^} matches at the +beginning of the string or after a newline character. + +For historical compatibility reasons, @samp{^} can be used only at the +beginning of the regular expression, or after @samp{\(}, @samp{\(?:} +or @samp{\|}. + +@item @samp{$} +@cindex @samp{$} in regexp +@cindex end of line in regexp +is similar to @samp{^} but matches only at the end of a line (or the +end of the accessible portion of the buffer). Thus, @samp{x+$} +matches a string of one @samp{x} or more at the end of a line. + +When matching a string instead of a buffer, @samp{$} matches at the end +of the string or before a newline character. + +For historical compatibility reasons, @samp{$} can be used only at the +end of the regular expression, or before @samp{\)} or @samp{\|}. + +@item @samp{\} +@cindex @samp{\} in regexp +has two functions: it quotes the special characters (including +@samp{\}), and it introduces additional special constructs. + +Because @samp{\} quotes special characters, @samp{\$} is a regular +expression that matches only @samp{$}, and @samp{\[} is a regular +expression that matches only @samp{[}, and so on. + +Note that @samp{\} also has special meaning in the read syntax of Lisp +strings (@pxref{String Type}), and must be quoted with @samp{\}. For +example, the regular expression that matches the @samp{\} character is +@samp{\\}. To write a Lisp string that contains the characters +@samp{\\}, Lisp syntax requires you to quote each @samp{\} with another +@samp{\}. Therefore, the read syntax for a regular expression matching +@samp{\} is @code{"\\\\"}.@refill +@end table + +@strong{Please 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, @samp{*foo} treats @samp{*} as +ordinary since there is no preceding expression on which the @samp{*} +can act. It is poor practice to depend on this behavior; quote the +special character anyway, regardless of where it appears.@refill + +As a @samp{\} is not special inside a character alternative, it can +never remove the special meaning of @samp{-} or @samp{]}. So you +should not quote these characters when they have no special meaning +either. This would not clarify anything, since backslashes can +legitimately precede these characters where they @emph{have} special +meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string syntax), +which matches any single character except a backslash. + +In practice, most @samp{]} that occur in regular expressions close a +character alternative and hence are special. However, occasionally a +regular expression may try to match a complex pattern of literal +@samp{[} and @samp{]}. In such situations, it sometimes may be +necessary to carefully parse the regexp from the start to determine +which square brackets enclose a character alternative. For example, +@samp{[^][]]} consists of the complemented character alternative +@samp{[^][]} (which matches any single character that is not a square +bracket), followed by a literal @samp{]}. + +The exact rules are that at the beginning of a regexp, @samp{[} is +special and @samp{]} not. This lasts until the first unquoted +@samp{[}, after which we are in a character alternative; @samp{[} is +no longer special (except when it starts a character class) but @samp{]} +is special, unless it immediately follows the special @samp{[} or that +@samp{[} followed by a @samp{^}. This lasts until the next special +@samp{]} that does not end a character class. This ends the character +alternative and restores the ordinary syntax of regular expressions; +an unquoted @samp{[} is special again and a @samp{]} not. + +@node Char Classes +@subsubsection Character Classes +@cindex character classes in regexp + + Here is a table of the classes you can use in a character alternative, +and what they mean: + +@table @samp +@item [:ascii:] +This matches any @acronym{ASCII} character (codes 0--127). +@item [:alnum:] +This matches any letter or digit. (At present, for multibyte +characters, it matches anything that has word syntax.) +@item [:alpha:] +This matches any letter. (At present, for multibyte characters, it +matches anything that has word syntax.) +@item [:blank:] +This matches space and tab only. +@item [:cntrl:] +This matches any @acronym{ASCII} control character. +@item [:digit:] +This matches @samp{0} through @samp{9}. Thus, @samp{[-+[:digit:]]} +matches any digit, as well as @samp{+} and @samp{-}. +@item [:graph:] +This matches graphic characters---everything except @acronym{ASCII} control +characters, space, and the delete character. +@item [:lower:] +This matches any lower-case letter, as determined by +the current case table (@pxref{Case Tables}). +@item [:multibyte:] +This matches any multibyte character (@pxref{Text Representations}). +@item [:nonascii:] +This matches any non-@acronym{ASCII} character. +@item [:print:] +This matches printing characters---everything except @acronym{ASCII} control +characters and the delete character. +@item [:punct:] +This matches any punctuation character. (At present, for multibyte +characters, it matches anything that has non-word syntax.) +@item [:space:] +This matches any character that has whitespace syntax +(@pxref{Syntax Class Table}). +@item [:unibyte:] +This matches any unibyte character (@pxref{Text Representations}). +@item [:upper:] +This matches any upper-case letter, as determined by +the current case table (@pxref{Case Tables}). +@item [:word:] +This matches any character that has word syntax (@pxref{Syntax Class +Table}). +@item [:xdigit:] +This matches the hexadecimal digits: @samp{0} through @samp{9}, @samp{a} +through @samp{f} and @samp{A} through @samp{F}. +@end table + +@node Regexp Backslash +@subsubsection Backslash Constructs in Regular Expressions + + For the most part, @samp{\} followed by any character matches only +that character. However, there are several exceptions: certain +two-character sequences starting with @samp{\} that have special +meanings. (The character after the @samp{\} in such a sequence is +always ordinary when used on its own.) Here is a table of the special +@samp{\} constructs. + +@table @samp +@item \| +@cindex @samp{|} in regexp +@cindex regexp alternative +specifies an alternative. +Two regular expressions @var{a} and @var{b} with @samp{\|} in +between form an expression that matches anything that either @var{a} or +@var{b} matches.@refill + +Thus, @samp{foo\|bar} matches either @samp{foo} or @samp{bar} +but no other string.@refill + +@samp{\|} applies to the largest possible surrounding expressions. Only a +surrounding @samp{\( @dots{} \)} grouping can limit the grouping power of +@samp{\|}.@refill + +If you need full backtracking capability to handle multiple uses of +@samp{\|}, use the POSIX regular expression functions (@pxref{POSIX +Regexps}). + +@item \@{@var{m}\@} +is a postfix operator that repeats the previous pattern exactly @var{m} +times. Thus, @samp{x\@{5\@}} matches the string @samp{xxxxx} +and nothing else. @samp{c[ad]\@{3\@}r} matches string such as +@samp{caaar}, @samp{cdddr}, @samp{cadar}, and so on. + +@item \@{@var{m},@var{n}\@} +is a more general postfix operator that specifies repetition with a +minimum of @var{m} repeats and a maximum of @var{n} repeats. If @var{m} +is omitted, the minimum is 0; if @var{n} is omitted, there is no +maximum. + +For example, @samp{c[ad]\@{1,2\@}r} matches the strings @samp{car}, +@samp{cdr}, @samp{caar}, @samp{cadr}, @samp{cdar}, and @samp{cddr}, and +nothing else.@* +@samp{\@{0,1\@}} or @samp{\@{,1\@}} is equivalent to @samp{?}. @* +@samp{\@{0,\@}} or @samp{\@{,\@}} is equivalent to @samp{*}. @* +@samp{\@{1,\@}} is equivalent to @samp{+}. + +@item \( @dots{} \) +@cindex @samp{(} in regexp +@cindex @samp{)} in regexp +@cindex regexp grouping +is a grouping construct that serves three purposes: + +@enumerate +@item +To enclose a set of @samp{\|} alternatives for other operations. Thus, +the regular expression @samp{\(foo\|bar\)x} matches either @samp{foox} +or @samp{barx}. + +@item +To enclose a complicated expression for the postfix operators @samp{*}, +@samp{+} and @samp{?} to operate on. Thus, @samp{ba\(na\)*} matches +@samp{ba}, @samp{bana}, @samp{banana}, @samp{bananana}, etc., with any +number (zero or more) of @samp{na} strings. + +@item +To record a matched substring for future reference with +@samp{\@var{digit}} (see below). +@end enumerate + +This last application is not a consequence of the idea of a +parenthetical grouping; it is a separate feature that was assigned as a +second meaning to the same @samp{\( @dots{} \)} construct because, in +practice, there was usually no conflict between the two meanings. But +occasionally there is a conflict, and that led to the introduction of +shy groups. + +@item \(?: @dots{} \) +is the @dfn{shy group} construct. A shy group serves the first two +purposes of an ordinary group (controlling the nesting of other +operators), but it does not get a number, so you cannot refer back to +its value with @samp{\@var{digit}}. + +Shy groups are particularly useful for mechanically-constructed regular +expressions because they can be added automatically without altering the +numbering of any ordinary, non-shy groups. + +@item \(?@var{num}: @dots{} \) +is the @dfn{explicitly numbered group} construct. Normal groups get +their number implicitly, based on their position, which can be +inconvenient. This construct allows you to force a particular group +number. There is no particular restriction on the numbering, +e.g.@: you can have several groups with the same number in which case +the last one to match (i.e.@: the rightmost match) will win. +Implicitly numbered groups always get the smallest integer larger than +the one of any previous group. + +@item \@var{digit} +matches the same text that matched the @var{digit}th occurrence of a +grouping (@samp{\( @dots{} \)}) construct. + +In other words, after the end of a group, the matcher remembers the +beginning and end of the text matched by that group. Later on in the +regular expression you can use @samp{\} followed by @var{digit} to +match that same text, whatever it may have been. + +The strings matching the first nine grouping constructs appearing in +the entire regular expression passed to a search or matching function +are assigned numbers 1 through 9 in the order that the open +parentheses appear in the regular expression. So you can use +@samp{\1} through @samp{\9} to refer to the text matched by the +corresponding grouping constructs. + +For example, @samp{\(.*\)\1} matches any newline-free string that is +composed of two identical halves. The @samp{\(.*\)} matches the first +half, which may be anything, but the @samp{\1} that follows must match +the same exact text. + +If a @samp{\( @dots{} \)} construct matches more than once (which can +happen, for instance, if it is followed by @samp{*}), only the last +match is recorded. + +If a particular grouping construct in the regular expression was never +matched---for instance, if it appears inside of an alternative that +wasn't used, or inside of a repetition that repeated zero times---then +the corresponding @samp{\@var{digit}} construct never matches +anything. To use an artificial example,, @samp{\(foo\(b*\)\|lose\)\2} +cannot match @samp{lose}: the second alternative inside the larger +group matches it, but then @samp{\2} is undefined and can't match +anything. But it can match @samp{foobb}, because the first +alternative matches @samp{foob} and @samp{\2} matches @samp{b}. + +@item \w +@cindex @samp{\w} in regexp +matches any word-constituent character. The editor syntax table +determines which characters these are. @xref{Syntax Tables}. + +@item \W +@cindex @samp{\W} in regexp +matches any character that is not a word constituent. + +@item \s@var{code} +@cindex @samp{\s} in regexp +matches any character whose syntax is @var{code}. Here @var{code} is a +character that represents a syntax code: thus, @samp{w} for word +constituent, @samp{-} for whitespace, @samp{(} for open parenthesis, +etc. To represent whitespace syntax, use either @samp{-} or a space +character. @xref{Syntax Class Table}, for a list of syntax codes and +the characters that stand for them. + +@item \S@var{code} +@cindex @samp{\S} in regexp +matches any character whose syntax is not @var{code}. + +@item \c@var{c} +matches any character whose category is @var{c}. Here @var{c} is a +character that represents a category: thus, @samp{c} for Chinese +characters or @samp{g} for Greek characters in the standard category +table. + +@item \C@var{c} +matches any character whose category is not @var{c}. +@end table + + The following regular expression constructs match the empty string---that is, +they don't use up any characters---but whether they match depends on the +context. For all, the beginning and end of the accessible portion of +the buffer are treated as if they were the actual beginning and end of +the buffer. + +@table @samp +@item \` +@cindex @samp{\`} in regexp +matches the empty string, but only at the beginning +of the buffer or string being matched against. + +@item \' +@cindex @samp{\'} in regexp +matches the empty string, but only at the end of +the buffer or string being matched against. + +@item \= +@cindex @samp{\=} in regexp +matches the empty string, but only at point. +(This construct is not defined when matching against a string.) + +@item \b +@cindex @samp{\b} in regexp +matches the empty string, but only at the beginning or +end of a word. Thus, @samp{\bfoo\b} matches any occurrence of +@samp{foo} as a separate word. @samp{\bballs?\b} matches +@samp{ball} or @samp{balls} as a separate word.@refill + +@samp{\b} matches at the beginning or end of the buffer (or string) +regardless of what text appears next to it. + +@item \B +@cindex @samp{\B} in regexp +matches the empty string, but @emph{not} at the beginning or +end of a word, nor at the beginning or end of the buffer (or string). + +@item \< +@cindex @samp{\<} in regexp +matches the empty string, but only at the beginning of a word. +@samp{\<} matches at the beginning of the buffer (or string) only if a +word-constituent character follows. + +@item \> +@cindex @samp{\>} in regexp +matches the empty string, but only at the end of a word. @samp{\>} +matches at the end of the buffer (or string) only if the contents end +with a word-constituent character. + +@item \_< +@cindex @samp{\_<} in regexp +matches the empty string, but only at the beginning of a symbol. A +symbol is a sequence of one or more word or symbol constituent +characters. @samp{\_<} matches at the beginning of the buffer (or +string) only if a symbol-constituent character follows. + +@item \_> +@cindex @samp{\_>} in regexp +matches the empty string, but only at the end of a symbol. @samp{\_>} +matches at the end of the buffer (or string) only if the contents end +with a symbol-constituent character. +@end table + +@kindex invalid-regexp + Not every string is a valid regular expression. For example, a string +that ends inside a character alternative without terminating @samp{]} +is invalid, and so is a string that ends with a single @samp{\}. If +an invalid regular expression is passed to any of the search functions, +an @code{invalid-regexp} error is signaled. + +@node Regexp Example +@comment node-name, next, previous, up +@subsection Complex Regexp Example + + Here is a complicated regexp which was formerly used by Emacs to +recognize the end of a sentence together with any whitespace that +follows. (Nowadays Emacs uses a similar but more complex default +regexp constructed by the function @code{sentence-end}. +@xref{Standard Regexps}.) + + First, we show the regexp as a string in Lisp syntax to distinguish +spaces from tab characters. The string constant begins and ends with a +double-quote. @samp{\"} stands for a double-quote as part of the +string, @samp{\\} for a backslash as part of the string, @samp{\t} for a +tab and @samp{\n} for a newline. + +@example +"[.?!][]\"')@}]*\\($\\| $\\|\t\\|@ @ \\)[ \t\n]*" +@end example + +@noindent +In contrast, if you evaluate this string, you will see the following: + +@example +@group +"[.?!][]\"')@}]*\\($\\| $\\|\t\\|@ @ \\)[ \t\n]*" + @result{} "[.?!][]\"')@}]*\\($\\| $\\| \\|@ @ \\)[ +]*" +@end group +@end example + +@noindent +In this output, tab and newline appear as themselves. + + This regular expression contains four parts in succession and can be +deciphered as follows: + +@table @code +@item [.?!] +The first part of the pattern is a character alternative that matches +any one of three characters: period, question mark, and exclamation +mark. The match must begin with one of these three characters. (This +is one point where the new default regexp used by Emacs differs from +the old. The new value also allows some non-@acronym{ASCII} +characters that end a sentence without any following whitespace.) + +@item []\"')@}]* +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 @code{\"} is Lisp syntax for a double-quote in +a string. The @samp{*} at the end indicates that the immediately +preceding regular expression (a character alternative, in this case) may be +repeated zero or more times. + +@item \\($\\|@ $\\|\t\\|@ @ \\) +The third part of the pattern matches the whitespace that follows the +end of a sentence: the end of a line (optionally with a space), or a +tab, or two spaces. The double backslashes mark the parentheses and +vertical bars as regular expression syntax; the parentheses delimit a +group and the vertical bars separate alternatives. The dollar sign is +used to match the end of a line. + +@item [ \t\n]* +Finally, the last part of the pattern matches any additional whitespace +beyond the minimum needed to end a sentence. +@end table + +@node Regexp Functions +@subsection Regular Expression Functions + + These functions operate on regular expressions. + +@defun regexp-quote string +This function returns a regular expression whose only exact match is +@var{string}. Using this regular expression in @code{looking-at} will +succeed only if the next characters in the buffer are @var{string}; +using it in a search function will succeed if the text being searched +contains @var{string}. + +This allows you to request an exact string match or search when calling +a function that wants a regular expression. + +@example +@group +(regexp-quote "^The cat$") + @result{} "\\^The cat\\$" +@end group +@end example + +One use of @code{regexp-quote} is to combine an exact string match with +context described as a regular expression. For example, this searches +for the string that is the value of @var{string}, surrounded by +whitespace: + +@example +@group +(re-search-forward + (concat "\\s-" (regexp-quote string) "\\s-")) +@end group +@end example +@end defun + +@defun regexp-opt strings &optional paren +This function returns an efficient regular expression that will match +any of the strings in the list @var{strings}. This is useful when you +need to make matching or searching as fast as possible---for example, +for Font Lock mode. + +If the optional argument @var{paren} is non-@code{nil}, then the +returned regular expression is always enclosed by at least one +parentheses-grouping construct. If @var{paren} is @code{words}, then +that construct is additionally surrounded by @samp{\<} and @samp{\>}. + +This simplified definition of @code{regexp-opt} produces a +regular expression which is equivalent to the actual value +(but not as efficient): + +@example +(defun regexp-opt (strings paren) + (let ((open-paren (if paren "\\(" "")) + (close-paren (if paren "\\)" ""))) + (concat open-paren + (mapconcat 'regexp-quote strings "\\|") + close-paren))) +@end example +@end defun + +@defun regexp-opt-depth regexp +This function returns the total number of grouping constructs +(parenthesized expressions) in @var{regexp}. (This does not include +shy groups.) +@end defun + +@node Regexp Search +@section Regular Expression Searching +@cindex regular expression searching +@cindex regexp searching +@cindex searching for regexp + + In GNU Emacs, you can search for the next match for a regular +expression either incrementally or not. For incremental search +commands, see @ref{Regexp Search, , Regular Expression Search, emacs, +The GNU Emacs Manual}. Here we describe only the search functions +useful in programs. The principal one is @code{re-search-forward}. + + These search functions convert the regular expression to multibyte if +the buffer is multibyte; they convert the regular expression to unibyte +if the buffer is unibyte. @xref{Text Representations}. + +@deffn 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 @var{regexp}. The +function skips over any amount of text that is not matched by +@var{regexp}, and leaves point at the end of the first match found. +It returns the new value of point. + +If @var{limit} is non-@code{nil}, it must be a position in the current +buffer. It specifies the upper bound to the search. No match +extending after that position is accepted. + +If @var{repeat} is supplied, it must be a positive number; the search +is repeated that many times; each repetition starts at the end of the +previous match. If all these successive searches succeed, the search +succeeds, moving point and returning its new value. Otherwise the +search fails. What @code{re-search-forward} does when the search +fails depends on the value of @var{noerror}: + +@table @asis +@item @code{nil} +Signal a @code{search-failed} error. +@item @code{t} +Do nothing and return @code{nil}. +@item anything else +Move point to @var{limit} (or the end of the accessible portion of the +buffer) and return @code{nil}. +@end table + +In the following example, point is initially before the @samp{T}. +Evaluating the search call moves point to the end of that line (between +the @samp{t} of @samp{hat} and the newline). + +@example +@group +---------- Buffer: foo ---------- +I read "@point{}The cat in the hat +comes back" twice. +---------- Buffer: foo ---------- +@end group + +@group +(re-search-forward "[a-z]+" nil t 5) + @result{} 27 + +---------- Buffer: foo ---------- +I read "The cat in the hat@point{} +comes back" twice. +---------- Buffer: foo ---------- +@end group +@end example +@end deffn + +@deffn 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 @var{regexp}, leaving +point at the beginning of the first text found. + +This function is analogous to @code{re-search-forward}, but they are not +simple mirror images. @code{re-search-forward} finds the match whose +beginning is as close as possible to the starting point. If +@code{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 (and yet ends before the +starting point). The reason for this is that matching a regular +expression at a given spot always works from beginning to end, and +starts at a specified beginning position. + +A true mirror-image of @code{re-search-forward} would require a special +feature for matching regular expressions from end to beginning. It's +not worth the trouble of implementing that. +@end deffn + +@defun string-match regexp string &optional start +This function returns the index of the start of the first match for +the regular expression @var{regexp} in @var{string}, or @code{nil} if +there is no match. If @var{start} is non-@code{nil}, the search starts +at that index in @var{string}. + +For example, + +@example +@group +(string-match + "quick" "The quick brown fox jumped quickly.") + @result{} 4 +@end group +@group +(string-match + "quick" "The quick brown fox jumped quickly." 8) + @result{} 27 +@end group +@end example + +@noindent +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 @code{(match-end 0)}. @xref{Match Data}. + +@example +@group +(string-match + "quick" "The quick brown fox jumped quickly." 8) + @result{} 27 +@end group + +@group +(match-end 0) + @result{} 32 +@end group +@end example +@end defun + +@defun looking-at regexp +This function determines whether the text in the current buffer directly +following point matches the regular expression @var{regexp}. ``Directly +following'' means precisely that: the search is ``anchored'' and it can +succeed only starting with the first character following point. The +result is @code{t} if so, @code{nil} otherwise. + +This function does not move point, but it updates the match data, which +you can access using @code{match-beginning} and @code{match-end}. +@xref{Match Data}. + +In this example, point is located directly before the @samp{T}. If it +were anywhere else, the result would be @code{nil}. + +@example +@group +---------- Buffer: foo ---------- +I read "@point{}The cat in the hat +comes back" twice. +---------- Buffer: foo ---------- + +(looking-at "The cat in the hat$") + @result{} t +@end group +@end example +@end defun + +@defun looking-back regexp &optional limit +This function returns @code{t} if @var{regexp} matches text before +point, ending at point, and @code{nil} otherwise. + +Because regular expression matching works only going forward, this is +implemented by searching backwards from point for a match that ends at +point. That can be quite slow if it has to search a long distance. +You can bound the time required by specifying @var{limit}, which says +not to search before @var{limit}. In this case, the match that is +found must begin at or after @var{limit}. + +@example +@group +---------- Buffer: foo ---------- +I read "@point{}The cat in the hat +comes back" twice. +---------- Buffer: foo ---------- + +(looking-back "read \"" 3) + @result{} t +(looking-back "read \"" 4) + @result{} nil +@end group +@end example +@end defun + +@defvar search-spaces-regexp +If this variable is non-@code{nil}, it should be a regular expression +that says how to search for whitespace. In that case, any group of +spaces in a regular expression being searched for stands for use of +this regular expression. However, spaces inside of constructs such as +@samp{[@dots{}]} and @samp{*}, @samp{+}, @samp{?} are not affected by +@code{search-spaces-regexp}. + +Since this variable affects all regular expression search and match +constructs, you should bind it temporarily for as small as possible +a part of the code. +@end defvar + +@node POSIX Regexps +@section POSIX Regular Expression Searching + + The usual regular expression functions do backtracking when necessary +to handle the @samp{\|} and repetition constructs, but they continue +this only until they find @emph{some} match. Then they succeed and +report the first match found. + + This section describes alternative search functions which perform the +full backtracking specified by the POSIX standard for regular expression +matching. They continue backtracking until they have tried all +possibilities and found all matches, so they can report the longest +match, as required by POSIX. This is much slower, so use these +functions only when you really need the longest match. + + The POSIX search and match functions do not properly support the +non-greedy repetition operators. This is because POSIX backtracking +conflicts with the semantics of non-greedy repetition. + +@defun posix-search-forward regexp &optional limit noerror repeat +This is like @code{re-search-forward} except that it performs the full +backtracking specified by the POSIX standard for regular expression +matching. +@end defun + +@defun posix-search-backward regexp &optional limit noerror repeat +This is like @code{re-search-backward} except that it performs the full +backtracking specified by the POSIX standard for regular expression +matching. +@end defun + +@defun posix-looking-at regexp +This is like @code{looking-at} except that it performs the full +backtracking specified by the POSIX standard for regular expression +matching. +@end defun + +@defun posix-string-match regexp string &optional start +This is like @code{string-match} except that it performs the full +backtracking specified by the POSIX standard for regular expression +matching. +@end defun + +@node Match Data +@section The Match Data +@cindex match data + + Emacs keeps track of the start and end positions of the segments of +text found during a search; this is called the @dfn{match data}. +Thanks to the match data, you can search for a complex pattern, such +as a date in a mail message, and then extract parts of the match under +control of the pattern. + + Because the match data normally describe the most recent search only, +you must be careful not to do another search inadvertently between the +search you wish to refer back to and the use of the match data. If you +can't avoid another intervening search, you must save and restore the +match data around it, to prevent it from being overwritten. + +@menu +* Replacing Match:: Replacing a substring that was matched. +* Simple Match Data:: Accessing single items of match data, + such as where a particular subexpression started. +* Entire Match Data:: Accessing the entire match data at once, as a list. +* Saving Match Data:: Saving and restoring the match data. +@end menu + +@node Replacing Match +@subsection Replacing the Text that Matched +@cindex replace matched text + + This function replaces all or part of the text matched by the last +search. It works by means of the match data. + +@cindex case in replacements +@defun replace-match replacement &optional fixedcase literal string subexp +This function replaces the text in the buffer (or in @var{string}) that +was matched by the last search. It replaces that text with +@var{replacement}. + +If you did the last search in a buffer, you should specify @code{nil} +for @var{string} and make sure that the current buffer when you call +@code{replace-match} is the one in which you did the searching or +matching. Then @code{replace-match} does the replacement by editing +the buffer; it leaves point at the end of the replacement text, and +returns @code{t}. + +If you did the search in a string, pass the same string as @var{string}. +Then @code{replace-match} does the replacement by constructing and +returning a new string. + +If @var{fixedcase} is non-@code{nil}, then @code{replace-match} uses +the replacement text without case conversion; otherwise, it converts +the replacement text depending upon the capitalization of the text to +be replaced. If the original text is all upper case, this converts +the replacement text to upper case. If all words of the original text +are capitalized, this capitalizes all the words of the replacement +text. If all the words are one-letter and they are all upper case, +they are treated as capitalized words rather than all-upper-case +words. + +If @var{literal} is non-@code{nil}, then @var{replacement} is inserted +exactly as it is, the only alterations being case changes as needed. +If it is @code{nil} (the default), then the character @samp{\} is treated +specially. If a @samp{\} appears in @var{replacement}, then it must be +part of one of the following sequences: + +@table @asis +@item @samp{\&} +@cindex @samp{&} in replacement +@samp{\&} stands for the entire text being replaced. + +@item @samp{\@var{n}} +@cindex @samp{\@var{n}} in replacement +@samp{\@var{n}}, where @var{n} is a digit, stands for the text that +matched the @var{n}th subexpression in the original regexp. +Subexpressions are those expressions grouped inside @samp{\(@dots{}\)}. +If the @var{n}th subexpression never matched, an empty string is substituted. + +@item @samp{\\} +@cindex @samp{\} in replacement +@samp{\\} stands for a single @samp{\} in the replacement text. +@end table + +These substitutions occur after case conversion, if any, +so the strings they substitute are never case-converted. + +If @var{subexp} is non-@code{nil}, that says to replace just +subexpression number @var{subexp} of the regexp that was matched, not +the entire match. For example, after matching @samp{foo \(ba*r\)}, +calling @code{replace-match} with 1 as @var{subexp} means to replace +just the text that matched @samp{\(ba*r\)}. +@end defun + +@node Simple Match Data +@subsection Simple Match Data Access + + This section explains how to use the match data to find out what was +matched by the last search or match operation, if it succeeded. + + You can ask about the entire matching text, or about a particular +parenthetical subexpression of a regular expression. The @var{count} +argument in the functions below specifies which. If @var{count} is +zero, you are asking about the entire match. If @var{count} is +positive, it specifies which subexpression you want. + + Recall that the subexpressions of a regular expression are those +expressions grouped with escaped parentheses, @samp{\(@dots{}\)}. The +@var{count}th subexpression is found by counting occurrences of +@samp{\(} from the beginning of the whole regular expression. The first +subexpression is numbered 1, the second 2, and so on. Only regular +expressions can have subexpressions---after a simple string search, the +only information available is about the entire match. + + Every successful search sets the match data. Therefore, you should +query the match data immediately after searching, before calling any +other function that might perform another search. Alternatively, you +may save and restore the match data (@pxref{Saving Match Data}) around +the call to functions that could perform another search. + + A search which fails may or may not alter the match data. In the +past, a failing search did not do this, but we may change it in the +future. So don't try to rely on the value of the match data after +a failing search. + +@defun match-string count &optional in-string +This function returns, as a string, the text matched in the last search +or match operation. It returns the entire text if @var{count} is zero, +or just the portion corresponding to the @var{count}th parenthetical +subexpression, if @var{count} is positive. + +If the last such operation was done against a string with +@code{string-match}, then you should pass the same string as the +argument @var{in-string}. After a buffer search or match, +you should omit @var{in-string} or pass @code{nil} for it; but you +should make sure that the current buffer when you call +@code{match-string} is the one in which you did the searching or +matching. + +The value is @code{nil} if @var{count} is out of range, or for a +subexpression inside a @samp{\|} alternative that wasn't used or a +repetition that repeated zero times. +@end defun + +@defun match-string-no-properties count &optional in-string +This function is like @code{match-string} except that the result +has no text properties. +@end defun + +@defun match-beginning count +This function returns the position of the start of text matched by the +last regular expression searched for, or a subexpression of it. + +If @var{count} is zero, then the value is the position of the start of +the entire match. Otherwise, @var{count} specifies a subexpression in +the regular expression, and the value of the function is the starting +position of the match for that subexpression. + +The value is @code{nil} for a subexpression inside a @samp{\|} +alternative that wasn't used or a repetition that repeated zero times. +@end defun + +@defun match-end count +This function is like @code{match-beginning} except that it returns the +position of the end of the match, rather than the position of the +beginning. +@end defun + + Here is an example of using the match data, with a comment showing the +positions within the text: + +@example +@group +(string-match "\\(qu\\)\\(ick\\)" + "The quick fox jumped quickly.") + ;0123456789 + @result{} 4 +@end group + +@group +(match-string 0 "The quick fox jumped quickly.") + @result{} "quick" +(match-string 1 "The quick fox jumped quickly.") + @result{} "qu" +(match-string 2 "The quick fox jumped quickly.") + @result{} "ick" +@end group + +@group +(match-beginning 1) ; @r{The beginning of the match} + @result{} 4 ; @r{with @samp{qu} is at index 4.} +@end group + +@group +(match-beginning 2) ; @r{The beginning of the match} + @result{} 6 ; @r{with @samp{ick} is at index 6.} +@end group + +@group +(match-end 1) ; @r{The end of the match} + @result{} 6 ; @r{with @samp{qu} is at index 6.} + +(match-end 2) ; @r{The end of the match} + @result{} 9 ; @r{with @samp{ick} is at index 9.} +@end group +@end example + + Here is another example. Point is initially located at the beginning +of the line. Searching moves point to between the space and the word +@samp{in}. The beginning of the entire match is at the 9th character of +the buffer (@samp{T}), and the beginning of the match for the first +subexpression is at the 13th character (@samp{c}). + +@example +@group +(list + (re-search-forward "The \\(cat \\)") + (match-beginning 0) + (match-beginning 1)) + @result{} (9 9 13) +@end group + +@group +---------- Buffer: foo ---------- +I read "The cat @point{}in the hat comes back" twice. + ^ ^ + 9 13 +---------- Buffer: foo ---------- +@end group +@end example + +@noindent +(In this case, the index returned is a buffer position; the first +character of the buffer counts as 1.) + +@node Entire Match Data +@subsection Accessing the Entire Match Data + + The functions @code{match-data} and @code{set-match-data} read or +write the entire match data, all at once. + +@defun match-data &optional integers reuse reseat +This function returns a list of positions (markers or integers) that +record 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, and so on. +In general, element +@ifnottex +number 2@var{n} +@end ifnottex +@tex +number {\mathsurround=0pt $2n$} +@end tex +corresponds to @code{(match-beginning @var{n})}; and +element +@ifnottex +number 2@var{n} + 1 +@end ifnottex +@tex +number {\mathsurround=0pt $2n+1$} +@end tex +corresponds to @code{(match-end @var{n})}. + +Normally all the elements are markers or @code{nil}, but if +@var{integers} is non-@code{nil}, that means to use integers instead +of markers. (In that case, the buffer itself is appended as an +additional element at the end of the list, to facilitate complete +restoration of the match data.) If the last match was done on a +string with @code{string-match}, then integers are always used, +since markers can't point into a string. + +If @var{reuse} is non-@code{nil}, it should be a list. In that case, +@code{match-data} stores the match data in @var{reuse}. That is, +@var{reuse} is destructively modified. @var{reuse} does not need to +have the right length. If it is not long enough to contain the match +data, it is extended. If it is too long, the length of @var{reuse} +stays the same, but the elements that were not used are set to +@code{nil}. The purpose of this feature is to reduce the need for +garbage collection. + +If @var{reseat} is non-@code{nil}, all markers on the @var{reuse} list +are reseated to point to nowhere. + +As always, there must be no possibility of intervening searches between +the call to a search function and the call to @code{match-data} that is +intended to access the match data for that search. + +@example +@group +(match-data) + @result{} (#<marker at 9 in foo> + #<marker at 17 in foo> + #<marker at 13 in foo> + #<marker at 17 in foo>) +@end group +@end example +@end defun + +@defun set-match-data match-list &optional reseat +This function sets the match data from the elements of @var{match-list}, +which should be a list that was the value of a previous call to +@code{match-data}. (More precisely, anything that has the same format +will work.) + +If @var{match-list} refers to a buffer that doesn't exist, you don't get +an error; that sets the match data in a meaningless but harmless way. + +If @var{reseat} is non-@code{nil}, all markers on the @var{match-list} list +are reseated to point to nowhere. + +@findex store-match-data +@code{store-match-data} is a semi-obsolete alias for @code{set-match-data}. +@end defun + +@node Saving Match Data +@subsection Saving and Restoring the Match Data + + When you call a function that may do a search, you may need to save +and restore the match data around that call, if you want to preserve the +match data from an earlier search for later use. Here is an example +that shows the problem that arises if you fail to save the match data: + +@example +@group +(re-search-forward "The \\(cat \\)") + @result{} 48 +(foo) ; @r{Perhaps @code{foo} does} + ; @r{more searching.} +(match-end 0) + @result{} 61 ; @r{Unexpected result---not 48!} +@end group +@end example + + You can save and restore the match data with @code{save-match-data}: + +@defmac save-match-data body@dots{} +This macro executes @var{body}, saving and restoring the match +data around it. The return value is the value of the last form in +@var{body}. +@end defmac + + You could use @code{set-match-data} together with @code{match-data} to +imitate the effect of the special form @code{save-match-data}. Here is +how: + +@example +@group +(let ((data (match-data))) + (unwind-protect + @dots{} ; @r{Ok to change the original match data.} + (set-match-data data))) +@end group +@end example + + Emacs automatically saves and restores the match data when it runs +process filter functions (@pxref{Filter Functions}) and process +sentinels (@pxref{Sentinels}). + +@ignore + Here is a function which restores the match data provided the buffer +associated with it still exists. + +@smallexample +@group +(defun restore-match-data (data) +@c It is incorrect to split the first line of a doc string. +@c If there's a problem here, it should be solved in some other way. + "Restore the match data DATA unless the buffer is missing." + (catch 'foo + (let ((d data)) +@end group + (while d + (and (car d) + (null (marker-buffer (car d))) +@group + ;; @file{match-data} @r{buffer is deleted.} + (throw 'foo nil)) + (setq d (cdr d))) + (set-match-data data)))) +@end group +@end smallexample +@end ignore + +@node Search and Replace +@section Search and Replace +@cindex replacement after search +@cindex searching and replacing + + If you want to find all matches for a regexp in part of the buffer, +and replace them, the best way is to write an explicit loop using +@code{re-search-forward} and @code{replace-match}, like this: + +@example +(while (re-search-forward "foo[ \t]+bar" nil t) + (replace-match "foobar")) +@end example + +@noindent +@xref{Replacing Match,, Replacing the Text that Matched}, for a +description of @code{replace-match}. + + However, replacing matches in a string is more complex, especially +if you want to do it efficiently. So Emacs provides a function to do +this. + +@defun replace-regexp-in-string regexp rep string &optional fixedcase literal subexp start +This function copies @var{string} and searches it for matches for +@var{regexp}, and replaces them with @var{rep}. It returns the +modified copy. If @var{start} is non-@code{nil}, the search for +matches starts at that index in @var{string}, so matches starting +before that index are not changed. + +This function uses @code{replace-match} to do the replacement, and it +passes the optional arguments @var{fixedcase}, @var{literal} and +@var{subexp} along to @code{replace-match}. + +Instead of a string, @var{rep} can be a function. In that case, +@code{replace-regexp-in-string} calls @var{rep} for each match, +passing the text of the match as its sole argument. It collects the +value @var{rep} returns and passes that to @code{replace-match} as the +replacement string. The match-data at this point are the result +of matching @var{regexp} against a substring of @var{string}. +@end defun + + If you want to write a command along the lines of @code{query-replace}, +you can use @code{perform-replace} to do the work. + +@defun perform-replace from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map start end +This function is the guts of @code{query-replace} and related +commands. It searches for occurrences of @var{from-string} in the +text between positions @var{start} and @var{end} and replaces some or +all of them. If @var{start} is @code{nil} (or omitted), point is used +instead, and the end of the buffer's accessible portion is used for +@var{end}. + +If @var{query-flag} is @code{nil}, it replaces all +occurrences; otherwise, it asks the user what to do about each one. + +If @var{regexp-flag} is non-@code{nil}, then @var{from-string} is +considered a regular expression; otherwise, it must match literally. If +@var{delimited-flag} is non-@code{nil}, then only replacements +surrounded by word boundaries are considered. + +The argument @var{replacements} specifies what to replace occurrences +with. If it is a string, that string is used. It can also be a list of +strings, to be used in cyclic order. + +If @var{replacements} is a cons cell, @code{(@var{function} +. @var{data})}, this means to call @var{function} after each match to +get the replacement text. This function is called with two arguments: +@var{data}, and the number of replacements already made. + +If @var{repeat-count} is non-@code{nil}, it should be an integer. Then +it specifies how many times to use each of the strings in the +@var{replacements} list before advancing cyclically to the next one. + +If @var{from-string} contains upper-case letters, then +@code{perform-replace} binds @code{case-fold-search} to @code{nil}, and +it uses the @code{replacements} without altering the case of them. + +Normally, the keymap @code{query-replace-map} defines the possible +user responses for queries. The argument @var{map}, if +non-@code{nil}, specifies a keymap to use instead of +@code{query-replace-map}. +@end defun + +@defvar query-replace-map +This variable holds a special keymap that defines the valid user +responses for @code{perform-replace} and the commands that use it, as +well as @code{y-or-n-p} and @code{map-y-or-n-p}. This map is unusual +in two ways: + +@itemize @bullet +@item +The ``key bindings'' are not commands, just symbols that are meaningful +to the functions that use this map. + +@item +Prefix keys are not supported; each key binding must be for a +single-event key sequence. This is because the functions don't use +@code{read-key-sequence} to get the input; instead, they read a single +event and look it up ``by hand.'' +@end itemize +@end defvar + +Here are the meaningful ``bindings'' for @code{query-replace-map}. +Several of them are meaningful only for @code{query-replace} and +friends. + +@table @code +@item act +Do take the action being considered---in other words, ``yes.'' + +@item skip +Do not take action for this question---in other words, ``no.'' + +@item exit +Answer this question ``no,'' and give up on the entire series of +questions, assuming that the answers will be ``no.'' + +@item act-and-exit +Answer this question ``yes,'' and give up on the entire series of +questions, assuming that subsequent answers will be ``no.'' + +@item act-and-show +Answer this question ``yes,'' but show the results---don't advance yet +to the next question. + +@item automatic +Answer this question and all subsequent questions in the series with +``yes,'' without further user interaction. + +@item backup +Move back to the previous place that a question was asked about. + +@item edit +Enter a recursive edit to deal with this question---instead of any +other action that would normally be taken. + +@item delete-and-edit +Delete the text being considered, then enter a recursive edit to replace +it. + +@item recenter +Redisplay and center the window, then ask the same question again. + +@item quit +Perform a quit right away. Only @code{y-or-n-p} and related functions +use this answer. + +@item help +Display some help, then ask again. +@end table + +@node Standard Regexps +@section Standard Regular Expressions Used in Editing +@cindex regexps used standardly in editing +@cindex standard regexps used in editing + + This section describes some variables that hold regular expressions +used for certain purposes in editing: + +@defvar page-delimiter +This is the regular expression describing line-beginnings that separate +pages. The default value is @code{"^\014"} (i.e., @code{"^^L"} or +@code{"^\C-l"}); this matches a line that starts with a formfeed +character. +@end defvar + + The following two regular expressions should @emph{not} assume the +match always starts at the beginning of a line; they should not use +@samp{^} to anchor the match. Most often, the paragraph commands do +check for a match only at the beginning of a line, which means that +@samp{^} would be superfluous. When there is a nonzero left margin, +they accept matches that start after the left margin. In that case, a +@samp{^} would be incorrect. However, a @samp{^} is harmless in modes +where a left margin is never used. + +@defvar 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 @code{paragraph-start} also.) The default value is +@w{@code{"[@ \t\f]*$"}}, which matches a line that consists entirely of +spaces, tabs, and form feeds (after its left margin). +@end defvar + +@defvar paragraph-start +This is the regular expression for recognizing the beginning of a line +that starts @emph{or} separates paragraphs. The default value is +@w{@code{"\f\\|[ \t]*$"}}, which matches a line containing only +whitespace or starting with a form feed (after its left margin). +@end defvar + +@defvar sentence-end +If non-@code{nil}, the value should be a regular expression describing +the end of a sentence, including the whitespace following the +sentence. (All paragraph boundaries also end sentences, regardless.) + +If the value is @code{nil}, the default, then the function +@code{sentence-end} has to construct the regexp. That is why you +should always call the function @code{sentence-end} to obtain the +regexp to be used to recognize the end of a sentence. +@end defvar + +@defun sentence-end +This function returns the value of the variable @code{sentence-end}, +if non-@code{nil}. Otherwise it returns a default value based on the +values of the variables @code{sentence-end-double-space} +(@pxref{Definition of sentence-end-double-space}), +@code{sentence-end-without-period} and +@code{sentence-end-without-space}. +@end defun + +@ignore + arch-tag: c2573ca2-18aa-4839-93b8-924043ef831f +@end ignore diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi new file mode 100644 index 00000000000..7e66549412b --- /dev/null +++ b/doc/lispref/sequences.texi @@ -0,0 +1,734 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/sequences +@node Sequences Arrays Vectors, Hash Tables, Lists, Top +@chapter Sequences, Arrays, and Vectors +@cindex sequence + + Recall that the @dfn{sequence} type is the union of two other Lisp +types: lists and arrays. In other words, any list is a sequence, and +any array is a sequence. The common property that all sequences have is +that each is an ordered collection of elements. + + An @dfn{array} is a single primitive object that has a slot for each +of its elements. All the elements are accessible in constant time, but +the length of an existing array cannot be changed. Strings, vectors, +char-tables and bool-vectors are the four types of 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. Finding the +@var{n}th element requires looking through @var{n} cons cells, so +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 following diagram shows the relationship between these types: + +@example +@group + _____________________________________________ + | | + | Sequence | + | ______ ________________________________ | + | | | | | | + | | List | | Array | | + | | | | ________ ________ | | + | |______| | | | | | | | + | | | Vector | | String | | | + | | |________| |________| | | + | | ____________ _____________ | | + | | | | | | | | + | | | Char-table | | Bool-vector | | | + | | |____________| |_____________| | | + | |________________________________| | + |_____________________________________________| +@end group +@end example + + The elements of vectors and lists may be any Lisp objects. The +elements of strings are all characters. + +@menu +* Sequence Functions:: Functions that accept any kind of sequence. +* Arrays:: Characteristics of arrays in Emacs Lisp. +* Array Functions:: Functions specifically for arrays. +* Vectors:: Special characteristics of Emacs Lisp vectors. +* Vector Functions:: Functions specifically for vectors. +* Char-Tables:: How to work with char-tables. +* Bool-Vectors:: How to work with bool-vectors. +@end menu + +@node Sequence Functions +@section Sequences + + In Emacs Lisp, a @dfn{sequence} is either a list or an array. The +common property of all sequences is that they are ordered collections of +elements. This section describes functions that accept any kind of +sequence. + +@defun sequencep object +Returns @code{t} if @var{object} is a list, vector, string, +bool-vector, or char-table, @code{nil} otherwise. +@end defun + +@defun length sequence +@cindex string length +@cindex list length +@cindex vector length +@cindex sequence length +@cindex char-table length +This function returns the number of elements in @var{sequence}. If +@var{sequence} is a dotted list, a @code{wrong-type-argument} error is +signaled. Circular lists may cause an infinite loop. For a +char-table, the value returned is always one more than the maximum +Emacs character code. + +@xref{Definition of safe-length}, for the related function @code{safe-length}. + +@example +@group +(length '(1 2 3)) + @result{} 3 +@end group +@group +(length ()) + @result{} 0 +@end group +@group +(length "foobar") + @result{} 6 +@end group +@group +(length [1 2 3]) + @result{} 3 +@end group +@group +(length (make-bool-vector 5 nil)) + @result{} 5 +@end group +@end example +@end defun + +@noindent +See also @code{string-bytes}, in @ref{Text Representations}. + +@defun elt sequence index +@cindex elements of sequences +This function returns the element of @var{sequence} indexed by +@var{index}. Legitimate values of @var{index} are integers ranging +from 0 up to one less than the length of @var{sequence}. If +@var{sequence} is a list, out-of-range values behave as for +@code{nth}. @xref{Definition of nth}. Otherwise, out-of-range values +trigger an @code{args-out-of-range} error. + +@example +@group +(elt [1 2 3 4] 2) + @result{} 3 +@end group +@group +(elt '(1 2 3 4) 2) + @result{} 3 +@end group +@group +;; @r{We use @code{string} to show clearly which character @code{elt} returns.} +(string (elt "1234" 2)) + @result{} "3" +@end group +@group +(elt [1 2 3 4] 4) + @error{} Args out of range: [1 2 3 4], 4 +@end group +@group +(elt [1 2 3 4] -1) + @error{} Args out of range: [1 2 3 4], -1 +@end group +@end example + +This function generalizes @code{aref} (@pxref{Array Functions}) and +@code{nth} (@pxref{Definition of nth}). +@end defun + +@defun copy-sequence sequence +@cindex copying sequences +Returns a copy of @var{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 +@var{sequence}, and vice versa. However, the elements of the new +sequence are not copies; they are identical (@code{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. + +If the sequence is a string with text properties, the property list in +the copy is itself a copy, not shared with the original's property +list. However, the actual values of the properties are shared. +@xref{Text Properties}. + +This function does not work for dotted lists. Trying to copy a +circular list may cause an infinite loop. + +See also @code{append} in @ref{Building Lists}, @code{concat} in +@ref{Creating Strings}, and @code{vconcat} in @ref{Vector Functions}, +for other ways to copy sequences. + +@example +@group +(setq bar '(1 2)) + @result{} (1 2) +@end group +@group +(setq x (vector 'foo bar)) + @result{} [foo (1 2)] +@end group +@group +(setq y (copy-sequence x)) + @result{} [foo (1 2)] +@end group + +@group +(eq x y) + @result{} nil +@end group +@group +(equal x y) + @result{} t +@end group +@group +(eq (elt x 1) (elt y 1)) + @result{} t +@end group + +@group +;; @r{Replacing an element of one sequence.} +(aset x 0 'quux) +x @result{} [quux (1 2)] +y @result{} [foo (1 2)] +@end group + +@group +;; @r{Modifying the inside of a shared element.} +(setcar (aref x 1) 69) +x @result{} [quux (69 2)] +y @result{} [foo (69 2)] +@end group +@end example +@end defun + +@node Arrays +@section Arrays +@cindex array + + An @dfn{array} object has slots that hold 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. + + Emacs defines four types of array, all one-dimensional: @dfn{strings}, +@dfn{vectors}, @dfn{bool-vectors} and @dfn{char-tables}. A vector is a +general array; its elements can be any Lisp objects. A string is a +specialized array; its elements must be characters. Each type of array +has its own read syntax. +@xref{String Type}, and @ref{Vector Type}. + + All four kinds of array share these characteristics: + +@itemize @bullet +@item +The first element of an array has index zero, the second element has +index 1, and so on. This is called @dfn{zero-origin} indexing. For +example, an array of four elements has indices 0, 1, 2, @w{and 3}. + +@item +The length of the array is fixed once you create it; you cannot +change the length of an existing array. + +@item +For purposes of evaluation, the array is a constant---in other words, +it evaluates to itself. + +@item +The elements of an array may be referenced or changed with the functions +@code{aref} and @code{aset}, respectively (@pxref{Array Functions}). +@end itemize + + When you create an array, other than a char-table, you must specify +its length. You cannot specify the length of a char-table, because that +is determined by the range of character codes. + + In principle, if you want an array of text characters, you could use +either a string or a vector. In practice, we always choose strings for +such applications, for four reasons: + +@itemize @bullet +@item +They occupy one-fourth the space of a vector of the same elements. + +@item +Strings are printed in a way that shows the contents more clearly +as text. + +@item +Strings can hold text properties. @xref{Text Properties}. + +@item +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. @xref{Strings and Characters}. +@end itemize + + By contrast, for an array of keyboard input characters (such as a key +sequence), a vector may be necessary, because many keyboard input +characters are outside the range that will fit in a string. @xref{Key +Sequence Input}. + +@node Array Functions +@section Functions that Operate on Arrays + + In this section, we describe the functions that accept all types of +arrays. + +@defun arrayp object +This function returns @code{t} if @var{object} is an array (i.e., a +vector, a string, a bool-vector or a char-table). + +@example +@group +(arrayp [a]) + @result{} t +(arrayp "asdf") + @result{} t +(arrayp (syntax-table)) ;; @r{A char-table.} + @result{} t +@end group +@end example +@end defun + +@defun aref array index +@cindex array elements +This function returns the @var{index}th element of @var{array}. The +first element is at index zero. + +@example +@group +(setq primes [2 3 5 7 11 13]) + @result{} [2 3 5 7 11 13] +(aref primes 4) + @result{} 11 +@end group +@group +(aref "abcdefg" 1) + @result{} 98 ; @r{@samp{b} is @acronym{ASCII} code 98.} +@end group +@end example + +See also the function @code{elt}, in @ref{Sequence Functions}. +@end defun + +@defun aset array index object +This function sets the @var{index}th element of @var{array} to be +@var{object}. It returns @var{object}. + +@example +@group +(setq w [foo bar baz]) + @result{} [foo bar baz] +(aset w 0 'fu) + @result{} fu +w + @result{} [fu bar baz] +@end group + +@group +(setq x "asdfasfd") + @result{} "asdfasfd" +(aset x 3 ?Z) + @result{} 90 +x + @result{} "asdZasfd" +@end group +@end example + +If @var{array} is a string and @var{object} is not a character, a +@code{wrong-type-argument} error results. The function converts a +unibyte string to multibyte if necessary to insert a character. +@end defun + +@defun fillarray array object +This function fills the array @var{array} with @var{object}, so that +each element of @var{array} is @var{object}. It returns @var{array}. + +@example +@group +(setq a [a b c d e f g]) + @result{} [a b c d e f g] +(fillarray a 0) + @result{} [0 0 0 0 0 0 0] +a + @result{} [0 0 0 0 0 0 0] +@end group +@group +(setq s "When in the course") + @result{} "When in the course" +(fillarray s ?-) + @result{} "------------------" +@end group +@end example + +If @var{array} is a string and @var{object} is not a character, a +@code{wrong-type-argument} error results. +@end defun + +The general sequence functions @code{copy-sequence} and @code{length} +are often useful for objects known to be arrays. @xref{Sequence Functions}. + +@node Vectors +@section Vectors +@cindex vector (type) + + Arrays in Lisp, like arrays in most languages, are blocks of memory +whose elements can be accessed in constant time. A @dfn{vector} is a +general-purpose array of specified length; its elements can be any Lisp +objects. (By contrast, a string can hold only characters as elements.) +Vectors in Emacs are used for obarrays (vectors of symbols), and as part +of 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. + + In Emacs Lisp, the indices of the elements of a vector start from zero +and count up from there. + + Vectors are printed with square brackets surrounding the elements. +Thus, a vector whose elements are the symbols @code{a}, @code{b} and +@code{a} is printed as @code{[a b a]}. 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. This does +not evaluate or even examine the elements of the vector. +@xref{Self-Evaluating Forms}. + + Here are examples illustrating these principles: + +@example +@group +(setq avector [1 two '(three) "four" [five]]) + @result{} [1 two (quote (three)) "four" [five]] +(eval avector) + @result{} [1 two (quote (three)) "four" [five]] +(eq avector (eval avector)) + @result{} t +@end group +@end example + +@node Vector Functions +@section Functions for Vectors + + Here are some functions that relate to vectors: + +@defun vectorp object +This function returns @code{t} if @var{object} is a vector. + +@example +@group +(vectorp [a]) + @result{} t +(vectorp "asdf") + @result{} nil +@end group +@end example +@end defun + +@defun vector &rest objects +This function creates and returns a vector whose elements are the +arguments, @var{objects}. + +@example +@group +(vector 'foo 23 [bar baz] "rats") + @result{} [foo 23 [bar baz] "rats"] +(vector) + @result{} [] +@end group +@end example +@end defun + +@defun make-vector length object +This function returns a new vector consisting of @var{length} elements, +each initialized to @var{object}. + +@example +@group +(setq sleepy (make-vector 9 'Z)) + @result{} [Z Z Z Z Z Z Z Z Z] +@end group +@end example +@end defun + +@defun vconcat &rest sequences +@cindex copying vectors +This function returns a new vector containing all the elements of the +@var{sequences}. The arguments @var{sequences} may be true lists, +vectors, strings or bool-vectors. If no @var{sequences} are given, an +empty vector is returned. + +The value is a newly constructed vector that is not @code{eq} to any +existing vector. + +@example +@group +(setq a (vconcat '(A B C) '(D E F))) + @result{} [A B C D E F] +(eq a (vconcat a)) + @result{} nil +@end group +@group +(vconcat) + @result{} [] +(vconcat [A B C] "aa" '(foo (6 7))) + @result{} [A B C 97 97 foo (6 7)] +@end group +@end example + +The @code{vconcat} function also allows byte-code function objects as +arguments. This is a special feature to make it easy to access the entire +contents of a byte-code function object. @xref{Byte-Code Objects}. + +In Emacs versions before 21, the @code{vconcat} function allowed +integers as arguments, converting them to strings of digits, but that +feature has been eliminated. The proper way to convert an integer to +a decimal number in this way is with @code{format} (@pxref{Formatting +Strings}) or @code{number-to-string} (@pxref{String Conversion}). + +For other concatenation functions, see @code{mapconcat} in @ref{Mapping +Functions}, @code{concat} in @ref{Creating Strings}, and @code{append} +in @ref{Building Lists}. +@end defun + + The @code{append} function also provides a way to convert a vector into a +list with the same elements: + +@example +@group +(setq avector [1 two (quote (three)) "four" [five]]) + @result{} [1 two (quote (three)) "four" [five]] +(append avector nil) + @result{} (1 two (quote (three)) "four" [five]) +@end group +@end example + +@node Char-Tables +@section Char-Tables +@cindex char-tables +@cindex extra slots of char-table + + A char-table is much like a vector, except that it is indexed by +character codes. Any valid character code, without modifiers, can be +used as an index in a char-table. You can access a char-table's +elements with @code{aref} and @code{aset}, as with any array. In +addition, a char-table can have @dfn{extra slots} to hold additional +data not associated with particular character codes. Char-tables are +constants when evaluated. + +@cindex subtype of char-table + Each char-table has a @dfn{subtype} which is a symbol. The subtype +has two purposes: to distinguish char-tables meant for different uses, +and to control the number of extra slots. For example, display tables +are char-tables with @code{display-table} as the subtype, and syntax +tables are char-tables with @code{syntax-table} as the subtype. A valid +subtype must have a @code{char-table-extra-slots} property which is an +integer between 0 and 10. This integer specifies the number of +@dfn{extra slots} in the char-table. + +@cindex parent of char-table + A char-table can have a @dfn{parent}, which is another char-table. If +it does, then whenever the char-table specifies @code{nil} for a +particular character @var{c}, it inherits the value specified in the +parent. In other words, @code{(aref @var{char-table} @var{c})} returns +the value from the parent of @var{char-table} if @var{char-table} itself +specifies @code{nil}. + +@cindex default value of char-table + A char-table can also have a @dfn{default value}. If so, then +@code{(aref @var{char-table} @var{c})} returns the default value +whenever the char-table does not specify any other non-@code{nil} value. + +@defun make-char-table subtype &optional init +Return a newly created char-table, with subtype @var{subtype}. Each +element is initialized to @var{init}, which defaults to @code{nil}. You +cannot alter the subtype of a char-table after the char-table is +created. + +There is no argument to specify the length of the char-table, because +all char-tables have room for any valid character code as an index. +@end defun + +@defun char-table-p object +This function returns @code{t} if @var{object} is a char-table, +otherwise @code{nil}. +@end defun + +@defun char-table-subtype char-table +This function returns the subtype symbol of @var{char-table}. +@end defun + +@defun set-char-table-default char-table char new-default +This function sets the default value of generic character @var{char} +in @var{char-table} to @var{new-default}. + +There is no special function to access default values in a char-table. +To do that, use @code{char-table-range} (see below). +@end defun + +@defun char-table-parent char-table +This function returns the parent of @var{char-table}. The parent is +always either @code{nil} or another char-table. +@end defun + +@defun set-char-table-parent char-table new-parent +This function sets the parent of @var{char-table} to @var{new-parent}. +@end defun + +@defun char-table-extra-slot char-table n +This function returns the contents of extra slot @var{n} of +@var{char-table}. The number of extra slots in a char-table is +determined by its subtype. +@end defun + +@defun set-char-table-extra-slot char-table n value +This function stores @var{value} in extra slot @var{n} of +@var{char-table}. +@end defun + + A char-table can specify an element value for a single character code; +it can also specify a value for an entire character set. + +@defun char-table-range char-table range +This returns the value specified in @var{char-table} for a range of +characters @var{range}. Here are the possibilities for @var{range}: + +@table @asis +@item @code{nil} +Refers to the default value. + +@item @var{char} +Refers to the element for character @var{char} +(supposing @var{char} is a valid character code). + +@item @var{charset} +Refers to the value specified for the whole character set +@var{charset} (@pxref{Character Sets}). + +@item @var{generic-char} +A generic character stands for a character set, or a row of a +character set; specifying the generic character as argument is +equivalent to specifying the character set name. @xref{Splitting +Characters}, for a description of generic characters. +@end table +@end defun + +@defun set-char-table-range char-table range value +This function sets the value in @var{char-table} for a range of +characters @var{range}. Here are the possibilities for @var{range}: + +@table @asis +@item @code{nil} +Refers to the default value. + +@item @code{t} +Refers to the whole range of character codes. + +@item @var{char} +Refers to the element for character @var{char} +(supposing @var{char} is a valid character code). + +@item @var{charset} +Refers to the value specified for the whole character set +@var{charset} (@pxref{Character Sets}). + +@item @var{generic-char} +A generic character stands for a character set; specifying the generic +character as argument is equivalent to specifying the character set +name. @xref{Splitting Characters}, for a description of generic characters. +@end table +@end defun + +@defun map-char-table function char-table +This function calls @var{function} for each element of @var{char-table}. +@var{function} is called with two arguments, a key and a value. The key +is a possible @var{range} argument for @code{char-table-range}---either +a valid character or a generic character---and the value is +@code{(char-table-range @var{char-table} @var{key})}. + +Overall, the key-value pairs passed to @var{function} describe all the +values stored in @var{char-table}. + +The return value is always @code{nil}; to make this function useful, +@var{function} should have side effects. For example, +here is how to examine each element of the syntax table: + +@example +(let (accumulator) + (map-char-table + #'(lambda (key value) + (setq accumulator + (cons (list key value) accumulator))) + (syntax-table)) + accumulator) +@result{} +((475008 nil) (474880 nil) (474752 nil) (474624 nil) + ... (5 (3)) (4 (3)) (3 (3)) (2 (3)) (1 (3)) (0 (3))) +@end example +@end defun + +@node Bool-Vectors +@section Bool-vectors +@cindex Bool-vectors + + A bool-vector is much like a vector, except that it stores only the +values @code{t} and @code{nil}. If you try to store any non-@code{nil} +value into an element of the bool-vector, the effect is to store +@code{t} there. As with all arrays, bool-vector indices start from 0, +and the length cannot be changed once the bool-vector is created. +Bool-vectors are constants when evaluated. + + There are two special functions for working with bool-vectors; aside +from that, you manipulate them with same functions used for other kinds +of arrays. + +@defun make-bool-vector length initial +Return a new bool-vector of @var{length} elements, +each one initialized to @var{initial}. +@end defun + +@defun bool-vector-p object +This returns @code{t} if @var{object} is a bool-vector, +and @code{nil} otherwise. +@end defun + + Here is an example of creating, examining, and updating a +bool-vector. Note that the printed form represents up to 8 boolean +values as a single character. + +@example +(setq bv (make-bool-vector 5 t)) + @result{} #&5"^_" +(aref bv 1) + @result{} t +(aset bv 3 nil) + @result{} nil +bv + @result{} #&5"^W" +@end example + +@noindent +These results make sense because the binary codes for control-_ and +control-W are 11111 and 10111, respectively. + +@ignore + arch-tag: fcf1084a-cd29-4adc-9f16-68586935b386 +@end ignore diff --git a/doc/lispref/spellfile b/doc/lispref/spellfile new file mode 100644 index 00000000000..b373d00bebf --- /dev/null +++ b/doc/lispref/spellfile @@ -0,0 +1,738 @@ +ARPA +Abbrev +Acknowledgements +Alan +Arnold +Autoloading +BAppend +Backquote +Beeping +Beverly +Boyes +Brian +CL +CSWKg +Carl +Carroll +Chris +Cleanups +DEC +DStandard +Dan +Dired's +Disassembly +Duff +EMAC +EMACSLOADPATH +Eckelkamp +Edward +Eirik +Emacses +Eric +Erlebacher +Fcar +Fcdr +Fcons +Fcoordinates +Feval +Frazzle +Frederick +Fri +Gardiner +Gentlemen +HAL +HATTED +HS +HU +Hanchrow +Hartzell +Hess +Hewlett +IBM +ISBN +Impl +Interning +Ithought +J's +Jacobson +Jak +Joe +Jones +Jr +Jul +Keymaps +Kimmo +Kirman +Knighten +Korz +Krawitz +LTsHm +LaLiberte +LaTeX +Lammens +Local' +MAC +MONIES +MSS +Maclisp +Magill +Marick +Matthew +Minibuf +Misc +Miscellany +Mocklisp +Montanaro +Myers +NFS +Nathan +Nope +OS +OSITIONS +Oct +Ovwrt +PURESIZE +Packard +Qlistp +Qnil +RMAIL +Raul +Resizing +Robbins +Rockwell +SCO +SIGCONT +SIGHUP +SIGINT +SIGKILL +SIGQUIT +SIGTSTP +SLOAD +Scoordinates +Set' +Setcar +Setcdr +Shinichirou +Snarf +Sor +SourceFile +Stops' +Subprocess +Sugou +Sunview +Suominen +T's +TCP +ThXs +Tharp +Thu +Trost +UCB +UNEVALLED +UNGCPRO +UniPlus +UniSoft's +VMS +Vip +Void' +Warren +Welty +Wethought +Wilding +Worley +Wright +XDVI +XFASTINT +XINT +XWINDOW +Xs +Yo +Zuhn +aB +aa +aaa +abbrevname +abbrevs +abc +abcdefg +abcxyz +abd +above' +abracadabra +address' +after' +alist +alists +anchored' +and' +ar +aref +arg'th +argdecl +arith +arrayp +arrow' +asa +asdZasfd +asdf +asdfasfd +aset +assoc +assq +at' +aug +autoload +automatic' +automatically' +avector +bBuffer +bFrobnicate +ba +back' +bananana +barfoo +barx +bballs +before' +beforep +bfoo +bil +binding's +bish +bobp +bolp +bottommost +boundp +brief' +buf +buffer' +bufferp +buttercup +ca +caaaar +caaar +caddaar +cadr +callable +cbreak +ce +cell' +cells' +cf +chaprm +character' +childp +chistory +ck +column' +commandp +concat +cond +conses +consing +consp +constant' +contains' +continuable +convert' +copyleft +correct' +counterintuitive +cr +creatable +customie +deactivate +deactivated +deassigns +decrement' +deffnx +definition' +defmacro +defsubr +deletable +deletion' +delq +depiction +descendents +deselecting +destructive' +destructively' +diffs +ding +directory' +dired +dirname +disassembler +dland +docfile +docstring +doesnt +dont +down' +downcasing +downloadable +dribble +dup +ef +efg +electric' +elided +elt +enablement +endkeyfun +endrecfun +environment' +eobp +eof +eol +eolp +eq +eqlsign +erminal +erste +etags +eval +evalled +evals +evaluate' +excess' +exec +exitcode +expression' +extendible +extra' +fails' +fascist +fboundp +featurep +ff +fg +fi +file' +filespec +filesystems +fillarray +firstchar +firstonly +fixedcase +fixit +fixup +floatp +fmakunbound +fns +fo +fol +folded' +following' +fooba +foobaz +foox +for' +formfeed +forms' +forw +forwa +found' +frob +from' +front' +fset +fstab +ftp +fu +funtions +garbles +gc +gcpro +gd +getenv +getprv +gid +gnuemacs +gp +grep +gtr +halves' +hand' +hashes' +hd +hexadecimal +hf +hfil +hookvar +horsechestnut +hostname +hpux +hscroll +ibmapa +ick +id +idiom +ii +indrm +inode +input' +inputinput +inserting' +integerp +intermixed +ints +inturned +irreversibly +jum +keymapp +kill' +killed' +killp +kludge +kolstad +language' +lastchar +lcl +ledit +leif +lessp +level' +lewis +library' +link' +lisplib +listexp +loadable +loadst +loadup +logand +logior +lognot +logxor +long' +loop's +lru +lrwxrwxrwx +ls +lsh +m's +macroexpand +makunbound +malloc +mapatoms +mapconcat +mapvar +mark' +marker's +markerp +mathsurround +medit +memq +mh +mim +mini +minibuffer's +minibuffers +misalignment +misnamed +mode's +modename +modes' +mods +modtime +mqueue +msg +multicharacter +myfile +nCount +nXExpression +na +name's +natnump +nb +nbBuffer +nconc +newdef +newelt +newname +nextrecfun +nfsusr +ninett +nlines +nlinks +nlistp +noconfirm +nodigits +noerror +noforce +nomessage +nominees +nomsg +nonblank +nonconstant +nondestructive +nondirectory +nonidentical +noninteractive +noninteractively +nonletter +nonletters +nonlocally +nonoverlapping +nonprinting +nonselected +nonsequentially +nonvoid +nonwarranty +nonwritable +noop +noprint +norecord +normal' +noselect +nosuffix +nots +noundo +nr +nreverse +ns +nsRename +nth +nthcdr +num +number' +numberp +nums +obarray +obarrays +object' +oldbuf +olddef +oldname +oo +oops +op +or' +otl +out' +over' +overful +overfullrule +overstrike +overstriking +overstruck +p' +paren +part' +passwd +pe +ped +perverse +pid +plist +pnt +pointer' +pointm +pos +preallocate +predicale +preload +prepend +prepended +prepends +pretty' +prin +princ +print' +printenv +printer' +proc +process' +processp +programmer' +prolog +protect' +ps +psf +psychotherapy +pty +purecopy +qu +quux +rassq +reader' +readin +rebind +rec +rechecking +recursively' +recycler' +redo +redrawing +redraws +redump +reenabled +reexposed +reg +region' +reindent +reindents +reinitialization +reinitialize +reinitialized +reinstall +reinstalled +resize +resized +resizes +reversibly +reworded +rhetorical +right' +ring' +risky +rmailedit +rms +rplaca +rplacd +rtu +runnable +rw +rwxrwxrwx +sDescribe +sans +se +searching' +section' +seed' +sequence' +sequencep +setp +setplist +setprv +settable +setuid +sexp +sexps +shape' +shell's +sideline +special' +specpdl +st +stanford +startkeyfun +str +stringp +stty +subcategories +subcommands +subexp +subform +subforms +subjob +submap +subprocesses +subr +subr' +subroutine' +subrp +subrs +subwindows +sugar' +suid +supersession +suspension' +symbolp +symlink +syms +syntatic +tabname +temacs +temporarily' +tempvar +tenths +termcap +termcaps +terminfo +termscript +termtype +terpri +text' +textrm +textsl +texttt +than' +the' +tildes +time's +to' +towars +transportable +txt +types' +uid +unbind +unbinding +unbinds +unchanged' +unclutters +undefine +undefines +underfull +undo's +undodata +unevaluated' +unexec +unexpand +unhesitatingly +uninterned +unisoft +unpaired +unread +unreadable +unreading +unsaved +untyped +ununderline +up' +uptime +usecount +used' +user' +userlock +usg +val +varbind +varname +varref +vars +varset +vb +vconcat +vectorp +vfil +vi +vn +voidness +vrs +vt +window' +windowing +windowp +wrapped' +xSpecify +xcoord +xcssun +xemacs +xenix +xf +xfirst +xoff +xon +xx +xxxxx +xxxxxxxxx +xy +xyz +ycoord +yes' +zA +zap +zerop diff --git a/doc/lispref/streams.texi b/doc/lispref/streams.texi new file mode 100644 index 00000000000..7356c119a1e --- /dev/null +++ b/doc/lispref/streams.texi @@ -0,0 +1,837 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998, 1999, 2001, 2002, +@c 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/streams +@node Read and Print, Minibuffers, Debugging, Top +@comment node-name, next, previous, up +@chapter Reading and Printing Lisp Objects + + @dfn{Printing} and @dfn{reading} are the operations of converting Lisp +objects to textual form and vice versa. They use the printed +representations and read syntax described in @ref{Lisp Data Types}. + + This chapter describes the Lisp functions for reading and printing. +It also describes @dfn{streams}, which specify where to get the text (if +reading) or where to put it (if printing). + +@menu +* Streams Intro:: Overview of streams, reading and printing. +* Input Streams:: Various data types that can be used as input streams. +* Input Functions:: Functions to read Lisp objects from text. +* Output Streams:: Various data types that can be used as output streams. +* Output Functions:: Functions to print Lisp objects as text. +* Output Variables:: Variables that control what the printing functions do. +@end menu + +@node Streams Intro +@section Introduction to Reading and Printing +@cindex Lisp reader +@cindex printing +@cindex reading + + @dfn{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 +@dfn{read syntax} of the object. For example, the text @samp{(a .@: 5)} +is the read syntax for a cons cell whose @sc{car} is @code{a} and whose +@sc{cdr} is the number 5. + + @dfn{Printing} a Lisp object means producing text that represents that +object---converting the object to its @dfn{printed representation} +(@pxref{Printed Representation}). Printing the cons cell described +above produces the text @samp{(a .@: 5)}. + + Reading and printing are more or less 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 @code{foo} produces the text @samp{foo}, and reading that text +returns the symbol @code{foo}. Printing a list whose elements are +@code{a} and @code{b} produces the text @samp{(a b)}, and reading that +text produces a list (but not the same list) with elements @code{a} +and @code{b}. + + However, these two operations are not precisely inverse to each other. +There are three kinds of exceptions: + +@itemize @bullet +@item +Printing can produce text that cannot be read. For example, buffers, +windows, frames, subprocesses and markers print as text that starts +with @samp{#}; if you try to read this text, you get an error. There is +no way to read those data types. + +@item +One object can have multiple textual representations. For example, +@samp{1} and @samp{01} represent the same integer, and @samp{(a b)} and +@samp{(a .@: (b))} represent the same list. Reading will accept any of +the alternatives, but printing must choose one of them. + +@item +Comments can appear at certain points in the middle of an object's +read sequence without affecting the result of reading it. +@end itemize + +@node Input Streams +@section Input Streams +@cindex stream (for reading) +@cindex input stream + + Most of the Lisp functions for reading text take an @dfn{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: + +@table @asis +@item @var{buffer} +@cindex buffer input stream +The input characters are read from @var{buffer}, starting with the +character directly after point. Point advances as characters are read. + +@item @var{marker} +@cindex marker input stream +The input characters are read from the buffer that @var{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. + +@item @var{string} +@cindex string input stream +The input characters are taken from @var{string}, starting at the first +character in the string and using as many characters as required. + +@item @var{function} +@cindex function input stream +The input characters are generated by @var{function}, which must support +two kinds of calls: + +@itemize @bullet +@item +When it is called with no arguments, it should return the next character. + +@item +When it is called with one argument (always a character), @var{function} +should save the argument and arrange to return it on the next call. +This is called @dfn{unreading} the character; it happens when the Lisp +reader reads one character too many and wants to ``put it back where it +came from.'' In this case, it makes no difference what value +@var{function} returns. +@end itemize + +@item @code{t} +@cindex @code{t} input stream +@code{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. If Emacs is running in batch mode, standard input is used +instead of the minibuffer. For example, +@example +(message "%s" (read t)) +@end example +will read a Lisp expression from standard input and print the result +to standard output. + +@item @code{nil} +@cindex @code{nil} input stream +@code{nil} supplied as an input stream means to use the value of +@code{standard-input} instead; that value is the @dfn{default input +stream}, and must be a non-@code{nil} input stream. + +@item @var{symbol} +A symbol as input stream is equivalent to the symbol's function +definition (if any). +@end table + + Here is an example of reading from a stream that is a buffer, showing +where point is located before and after: + +@example +@group +---------- Buffer: foo ---------- +This@point{} is the contents of foo. +---------- Buffer: foo ---------- +@end group + +@group +(read (get-buffer "foo")) + @result{} is +@end group +@group +(read (get-buffer "foo")) + @result{} the +@end group + +@group +---------- Buffer: foo ---------- +This is the@point{} contents of foo. +---------- Buffer: foo ---------- +@end group +@end example + +@noindent +Note that the first read skips a space. Reading skips any amount of +whitespace preceding the significant text. + + Here is an example of reading from a stream that is a marker, +initially positioned at the beginning of the buffer shown. The value +read is the symbol @code{This}. + +@example +@group + +---------- Buffer: foo ---------- +This is the contents of foo. +---------- Buffer: foo ---------- +@end group + +@group +(setq m (set-marker (make-marker) 1 (get-buffer "foo"))) + @result{} #<marker at 1 in foo> +@end group +@group +(read m) + @result{} This +@end group +@group +m + @result{} #<marker at 5 in foo> ;; @r{Before the first space.} +@end group +@end example + + Here we read from the contents of a string: + +@example +@group +(read "(When in) the course") + @result{} (When in) +@end group +@end example + + The following example reads from the minibuffer. The +prompt is: @w{@samp{Lisp expression: }}. (That is always the prompt +used when you read from the stream @code{t}.) The user's input is shown +following the prompt. + +@example +@group +(read t) + @result{} 23 +---------- Buffer: Minibuffer ---------- +Lisp expression: @kbd{23 @key{RET}} +---------- Buffer: Minibuffer ---------- +@end group +@end example + + Finally, here is an example of a stream that is a function, named +@code{useless-stream}. Before we use the stream, we initialize the +variable @code{useless-list} to a list of characters. Then each call to +the function @code{useless-stream} obtains the next character in the list +or unreads a character by adding it to the front of the list. + +@example +@group +(setq useless-list (append "XY()" nil)) + @result{} (88 89 40 41) +@end group + +@group +(defun useless-stream (&optional unread) + (if unread + (setq useless-list (cons unread useless-list)) + (prog1 (car useless-list) + (setq useless-list (cdr useless-list))))) + @result{} useless-stream +@end group +@end example + +@noindent +Now we read using the stream thus constructed: + +@example +@group +(read 'useless-stream) + @result{} XY +@end group + +@group +useless-list + @result{} (40 41) +@end group +@end example + +@noindent +Note that the open and close parentheses remain in the list. The Lisp +reader encountered the open parenthesis, decided that it ended the +input, and unread it. Another attempt to read from the stream at this +point would read @samp{()} and return @code{nil}. + +@defun get-file-char +This function is used internally as an input stream to read from the +input file opened by the function @code{load}. Don't use this function +yourself. +@end defun + +@node Input Functions +@section Input Functions + + This section describes the Lisp functions and variables that pertain +to reading. + + In the functions below, @var{stream} stands for an input stream (see +the previous section). If @var{stream} is @code{nil} or omitted, it +defaults to the value of @code{standard-input}. + +@kindex end-of-file + An @code{end-of-file} error is signaled if reading encounters an +unterminated list, vector, or string. + +@defun read &optional stream +This function reads one textual Lisp expression from @var{stream}, +returning it as a Lisp object. This is the basic Lisp input function. +@end defun + +@defun read-from-string string &optional start end +@cindex string to object +This function reads the first textual Lisp expression from the text in +@var{string}. It returns a cons cell whose @sc{car} is that expression, +and whose @sc{cdr} is an integer giving the position of the next +remaining character in the string (i.e., the first one not read). + +If @var{start} is supplied, then reading begins at index @var{start} in +the string (where the first character is at index 0). If you specify +@var{end}, then reading is forced to stop just before that index, as if +the rest of the string were not there. + +For example: + +@example +@group +(read-from-string "(setq x 55) (setq y 5)") + @result{} ((setq x 55) . 11) +@end group +@group +(read-from-string "\"A short string\"") + @result{} ("A short string" . 16) +@end group + +@group +;; @r{Read starting at the first character.} +(read-from-string "(list 112)" 0) + @result{} ((list 112) . 10) +@end group +@group +;; @r{Read starting at the second character.} +(read-from-string "(list 112)" 1) + @result{} (list . 5) +@end group +@group +;; @r{Read starting at the seventh character,} +;; @r{and stopping at the ninth.} +(read-from-string "(list 112)" 6 8) + @result{} (11 . 8) +@end group +@end example +@end defun + +@defvar standard-input +This variable holds the default input stream---the stream that +@code{read} uses when the @var{stream} argument is @code{nil}. +The default is @code{t}, meaning use the minibuffer. +@end defvar + +@node Output Streams +@section Output Streams +@cindex stream (for printing) +@cindex output stream + + 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: + +@table @asis +@item @var{buffer} +@cindex buffer output stream +The output characters are inserted into @var{buffer} at point. +Point advances as characters are inserted. + +@item @var{marker} +@cindex marker output stream +The output characters are inserted into the buffer that @var{marker} +points into, at the marker position. The marker position advances as +characters are inserted. The value of point in the buffer has no effect +on printing when the stream is a marker, and this kind of printing +does not move point (except that if the marker points at or before the +position of point, point advances with the surrounding text, as +usual). + +@item @var{function} +@cindex function output stream +The output characters are passed to @var{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 responsible for storing the characters wherever you want to put them. + +@item @code{t} +@cindex @code{t} output stream +The output characters are displayed in the echo area. + +@item @code{nil} +@cindex @code{nil} output stream +@code{nil} specified as an output stream means to use the value of +@code{standard-output} instead; that value is the @dfn{default output +stream}, and must not be @code{nil}. + +@item @var{symbol} +A symbol as output stream is equivalent to the symbol's function +definition (if any). +@end table + + Many of the valid output streams are also valid as input streams. The +difference between input and output streams is therefore more a matter +of how you use a Lisp object, than of different types of object. + + Here is an example of a buffer used as an output stream. Point is +initially located as shown immediately before the @samp{h} in +@samp{the}. At the end, point is located directly before that same +@samp{h}. + +@cindex print example +@example +@group +---------- Buffer: foo ---------- +This is t@point{}he contents of foo. +---------- Buffer: foo ---------- +@end group + +(print "This is the output" (get-buffer "foo")) + @result{} "This is the output" + +@group +---------- Buffer: foo ---------- +This is t +"This is the output" +@point{}he contents of foo. +---------- Buffer: foo ---------- +@end group +@end example + + Now we show a use of a marker as an output stream. Initially, the +marker is in buffer @code{foo}, between the @samp{t} and the @samp{h} in +the word @samp{the}. At the end, the marker has advanced over the +inserted text so that it remains positioned before the same @samp{h}. +Note that the location of point, shown in the usual fashion, has no +effect. + +@example +@group +---------- Buffer: foo ---------- +This is the @point{}output +---------- Buffer: foo ---------- +@end group + +@group +(setq m (copy-marker 10)) + @result{} #<marker at 10 in foo> +@end group + +@group +(print "More output for foo." m) + @result{} "More output for foo." +@end group + +@group +---------- Buffer: foo ---------- +This is t +"More output for foo." +he @point{}output +---------- Buffer: foo ---------- +@end group + +@group +m + @result{} #<marker at 34 in foo> +@end group +@end example + + The following example shows output to the echo area: + +@example +@group +(print "Echo Area output" t) + @result{} "Echo Area output" +---------- Echo Area ---------- +"Echo Area output" +---------- Echo Area ---------- +@end group +@end example + + Finally, we show the use of a function as an output stream. The +function @code{eat-output} takes each character that it is given and +conses it onto the front of the list @code{last-output} (@pxref{Building +Lists}). At the end, the list contains all the characters output, but +in reverse order. + +@example +@group +(setq last-output nil) + @result{} nil +@end group + +@group +(defun eat-output (c) + (setq last-output (cons c last-output))) + @result{} eat-output +@end group + +@group +(print "This is the output" 'eat-output) + @result{} "This is the output" +@end group + +@group +last-output + @result{} (10 34 116 117 112 116 117 111 32 101 104 + 116 32 115 105 32 115 105 104 84 34 10) +@end group +@end example + +@noindent +Now we can put the output in the proper order by reversing the list: + +@example +@group +(concat (nreverse last-output)) + @result{} " +\"This is the output\" +" +@end group +@end example + +@noindent +Calling @code{concat} converts the list to a string so you can see its +contents more clearly. + +@node Output Functions +@section Output Functions + + This section describes the Lisp functions for printing Lisp +objects---converting objects into their printed representation. + +@cindex @samp{"} in printing +@cindex @samp{\} in printing +@cindex quoting characters in printing +@cindex escape characters in 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 @samp{"} and @samp{\}; they distinguish strings from +symbols, and prevent punctuation characters in strings and symbols from +being taken as delimiters when reading. @xref{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 you should 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 usually +better to print without quoting. + + Lisp objects can refer to themselves. Printing a self-referential +object in the normal way would require an infinite amount of text, and +the attempt could cause infinite recursion. Emacs detects such +recursion and prints @samp{#@var{level}} instead of recursively printing +an object already being printed. For example, here @samp{#0} indicates +a recursive reference to the object at level 0 of the current print +operation: + +@example +(setq foo (list nil)) + @result{} (nil) +(setcar foo foo) + @result{} (#0) +@end example + + In the functions below, @var{stream} stands for an output stream. +(See the previous section for a description of output streams.) If +@var{stream} is @code{nil} or omitted, it defaults to the value of +@code{standard-output}. + +@defun print object &optional stream +@cindex Lisp printer +The @code{print} function is a convenient way of printing. It outputs +the printed representation of @var{object} to @var{stream}, printing in +addition one newline before @var{object} and another after it. Quoting +characters are used. @code{print} returns @var{object}. For example: + +@example +@group +(progn (print 'The\ cat\ in) + (print "the hat") + (print " came back")) + @print{} + @print{} The\ cat\ in + @print{} + @print{} "the hat" + @print{} + @print{} " came back" + @result{} " came back" +@end group +@end example +@end defun + +@defun prin1 object &optional stream +This function outputs the printed representation of @var{object} to +@var{stream}. It does not print newlines to separate output as +@code{print} does, but it does use quoting characters just like +@code{print}. It returns @var{object}. + +@example +@group +(progn (prin1 'The\ cat\ in) + (prin1 "the hat") + (prin1 " came back")) + @print{} The\ cat\ in"the hat"" came back" + @result{} " came back" +@end group +@end example +@end defun + +@defun princ object &optional stream +This function outputs the printed representation of @var{object} to +@var{stream}. It returns @var{object}. + +This function is intended to produce output that is readable by people, +not by @code{read}, so it doesn't insert quoting characters and doesn't +put double-quotes around the contents of strings. It does not add any +spacing between calls. + +@example +@group +(progn + (princ 'The\ cat) + (princ " in the \"hat\"")) + @print{} The cat in the "hat" + @result{} " in the \"hat\"" +@end group +@end example +@end defun + +@defun terpri &optional stream +@cindex newline in print +This function outputs a newline to @var{stream}. The name stands +for ``terminate print.'' +@end defun + +@defun write-char character &optional stream +This function outputs @var{character} to @var{stream}. It returns +@var{character}. +@end defun + +@defun prin1-to-string object &optional noescape +@cindex object to string +This function returns a string containing the text that @code{prin1} +would have printed for the same argument. + +@example +@group +(prin1-to-string 'foo) + @result{} "foo" +@end group +@group +(prin1-to-string (mark-marker)) + @result{} "#<marker at 2773 in strings.texi>" +@end group +@end example + +If @var{noescape} is non-@code{nil}, that inhibits use of quoting +characters in the output. (This argument is supported in Emacs versions +19 and later.) + +@example +@group +(prin1-to-string "foo") + @result{} "\"foo\"" +@end group +@group +(prin1-to-string "foo" t) + @result{} "foo" +@end group +@end example + +See @code{format}, in @ref{Formatting Strings}, for other ways to obtain +the printed representation of a Lisp object as a string. +@end defun + +@defmac with-output-to-string body@dots{} +This macro executes the @var{body} forms with @code{standard-output} set +up to feed output into a string. Then it returns that string. + +For example, if the current buffer name is @samp{foo}, + +@example +(with-output-to-string + (princ "The buffer is ") + (princ (buffer-name))) +@end example + +@noindent +returns @code{"The buffer is foo"}. +@end defmac + +@node Output Variables +@section Variables Affecting Output +@cindex output-controlling variables + +@defvar standard-output +The value of this variable is the default output stream---the stream +that print functions use when the @var{stream} argument is @code{nil}. +The default is @code{t}, meaning display in the echo area. +@end defvar + +@defvar print-quoted +If this is non-@code{nil}, that means to print quoted forms using +abbreviated reader syntax. @code{(quote foo)} prints as @code{'foo}, +@code{(function foo)} as @code{#'foo}, and backquoted forms print +using modern backquote syntax. +@end defvar + +@defvar print-escape-newlines +@cindex @samp{\n} in print +@cindex escape characters +If this variable is non-@code{nil}, then newline characters in strings +are printed as @samp{\n} and formfeeds are printed as @samp{\f}. +Normally these characters are printed as actual newlines and formfeeds. + +This variable affects the print functions @code{prin1} and @code{print} +that print with quoting. It does not affect @code{princ}. Here is an +example using @code{prin1}: + +@example +@group +(prin1 "a\nb") + @print{} "a + @print{} b" + @result{} "a +b" +@end group + +@group +(let ((print-escape-newlines t)) + (prin1 "a\nb")) + @print{} "a\nb" + @result{} "a +b" +@end group +@end example + +@noindent +In the second expression, the local binding of +@code{print-escape-newlines} is in effect during the call to +@code{prin1}, but not during the printing of the result. +@end defvar + +@defvar print-escape-nonascii +If this variable is non-@code{nil}, then unibyte non-@acronym{ASCII} +characters in strings are unconditionally printed as backslash sequences +by the print functions @code{prin1} and @code{print} that print with +quoting. + +Those functions also use backslash sequences for unibyte non-@acronym{ASCII} +characters, regardless of the value of this variable, when the output +stream is a multibyte buffer or a marker pointing into one. +@end defvar + +@defvar print-escape-multibyte +If this variable is non-@code{nil}, then multibyte non-@acronym{ASCII} +characters in strings are unconditionally printed as backslash sequences +by the print functions @code{prin1} and @code{print} that print with +quoting. + +Those functions also use backslash sequences for multibyte +non-@acronym{ASCII} characters, regardless of the value of this variable, +when the output stream is a unibyte buffer or a marker pointing into +one. +@end defvar + +@defvar print-length +@cindex printing limits +The value of this variable is the maximum number of elements to print in +any list, vector or bool-vector. If an object being printed has more +than this many elements, it is abbreviated with an ellipsis. + +If the value is @code{nil} (the default), then there is no limit. + +@example +@group +(setq print-length 2) + @result{} 2 +@end group +@group +(print '(1 2 3 4 5)) + @print{} (1 2 ...) + @result{} (1 2 ...) +@end group +@end example +@end defvar + +@defvar print-level +The value of this variable is the maximum depth of nesting of +parentheses and brackets when printed. Any list or vector at a depth +exceeding this limit is abbreviated with an ellipsis. A value of +@code{nil} (which is the default) means no limit. +@end defvar + +@defopt eval-expression-print-length +@defoptx eval-expression-print-level +These are the values for @code{print-length} and @code{print-level} +used by @code{eval-expression}, and thus, indirectly, by many +interactive evaluation commands (@pxref{Lisp Eval,, Evaluating +Emacs-Lisp Expressions, emacs, The GNU Emacs Manual}). +@end defopt + + These variables are used for detecting and reporting circular +and shared structure: + +@defvar print-circle +If non-@code{nil}, this variable enables detection of circular +and shared structure in printing. +@end defvar + +@defvar print-gensym +If non-@code{nil}, this variable enables detection of uninterned symbols +(@pxref{Creating Symbols}) in printing. When this is enabled, +uninterned symbols print with the prefix @samp{#:}, which tells the Lisp +reader to produce an uninterned symbol. +@end defvar + +@defvar print-continuous-numbering +If non-@code{nil}, that means number continuously across print calls. +This affects the numbers printed for @samp{#@var{n}=} labels and +@samp{#@var{m}#} references. + +Don't set this variable with @code{setq}; you should only bind it +temporarily to @code{t} with @code{let}. When you do that, you should +also bind @code{print-number-table} to @code{nil}. +@end defvar + +@defvar print-number-table +This variable holds a vector used internally by printing to implement +the @code{print-circle} feature. You should not use it except +to bind it to @code{nil} when you bind @code{print-continuous-numbering}. +@end defvar + +@defvar float-output-format +This variable specifies how to print floating point numbers. Its +default value is @code{nil}, meaning use the shortest output +that represents the number without losing information. + +To control output format more precisely, you can put a string in this +variable. The string should hold a @samp{%}-specification to be used +in the C function @code{sprintf}. For further restrictions on what +you can use, see the variable's documentation string. +@end defvar + +@ignore + arch-tag: 07636b8c-c4e3-4735-9e06-2e864320b434 +@end ignore diff --git a/doc/lispref/strings.texi b/doc/lispref/strings.texi new file mode 100644 index 00000000000..af5a2fa14d3 --- /dev/null +++ b/doc/lispref/strings.texi @@ -0,0 +1,1163 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/strings +@node Strings and Characters, Lists, Numbers, Top +@comment node-name, next, previous, up +@chapter Strings and Characters +@cindex strings +@cindex character arrays +@cindex characters +@cindex bytes + + 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, +Emacs Lisp has many functions expressly for manipulating them. Emacs +Lisp programs use strings more often than individual characters. + + @xref{Strings of Events}, for special considerations for strings of +keyboard character events. + +@menu +* Basics: String Basics. Basic properties of strings and characters. +* Predicates for Strings:: Testing whether an object is a string or char. +* Creating Strings:: Functions to allocate new strings. +* Modifying Strings:: Altering the contents of an existing string. +* Text Comparison:: Comparing characters or strings. +* String Conversion:: Converting to and from characters and strings. +* Formatting Strings:: @code{format}: Emacs's analogue of @code{printf}. +* Case Conversion:: Case conversion functions. +* Case Tables:: Customizing case conversion. +@end menu + +@node String Basics +@section String and Character Basics + + Characters are represented in Emacs Lisp as integers; +whether an integer is a character or not is determined only by how it is +used. Thus, strings really contain integers. + + The length of a string (like any array) is fixed, and cannot be +altered once the string exists. Strings in Lisp are @emph{not} +terminated by a distinguished character code. (By contrast, strings in +C are terminated by a character with @acronym{ASCII} code 0.) + + Since strings are arrays, and therefore sequences as well, you can +operate on them with the general array and sequence functions. +(@xref{Sequences Arrays Vectors}.) For example, you can access or +change individual characters in a string using the functions @code{aref} +and @code{aset} (@pxref{Array Functions}). + + There are two text representations for non-@acronym{ASCII} characters in +Emacs strings (and in buffers): unibyte and multibyte (@pxref{Text +Representations}). An @acronym{ASCII} character always occupies one byte in a +string; in fact, when a string is all @acronym{ASCII}, there is no real +difference between the unibyte and multibyte representations. +For most Lisp programming, you don't need to be concerned with these two +representations. + + Sometimes key sequences are represented as strings. When a string is +a key sequence, string elements in the range 128 to 255 represent meta +characters (which are large integers) rather than character +codes in the range 128 to 255. + + Strings cannot hold characters that have the hyper, super or alt +modifiers; they can hold @acronym{ASCII} control characters, but no other +control characters. They do not distinguish case in @acronym{ASCII} control +characters. If you want to store such characters in a sequence, such as +a key sequence, you must use a vector instead of a string. +@xref{Character Type}, for more information about the representation of meta +and other modifiers for keyboard input characters. + + Strings are useful for holding regular expressions. You can also +match regular expressions against strings with @code{string-match} +(@pxref{Regexp Search}). The functions @code{match-string} +(@pxref{Simple Match Data}) and @code{replace-match} (@pxref{Replacing +Match}) are useful for decomposing and modifying strings after +matching regular expressions against them. + + Like a buffer, a string can contain text properties for the characters +in it, as well as the characters themselves. @xref{Text Properties}. +All the Lisp primitives that copy text from strings to buffers or other +strings also copy the properties of the characters being copied. + + @xref{Text}, for information about functions that display strings or +copy them into buffers. @xref{Character Type}, and @ref{String Type}, +for information about the syntax of characters and strings. +@xref{Non-ASCII Characters}, for functions to convert between text +representations and to encode and decode character codes. + +@node Predicates for Strings +@section The Predicates for Strings + +For more information about general sequence and array predicates, +see @ref{Sequences Arrays Vectors}, and @ref{Arrays}. + +@defun stringp object +This function returns @code{t} if @var{object} is a string, @code{nil} +otherwise. +@end defun + +@defun string-or-null-p object +This function returns @code{t} if @var{object} is a string or nil, +@code{nil} otherwise. +@end defun + +@defun char-or-string-p object +This function returns @code{t} if @var{object} is a string or a +character (i.e., an integer), @code{nil} otherwise. +@end defun + +@node Creating Strings +@section Creating Strings + + The following functions create strings, either from scratch, or by +putting strings together, or by taking them apart. + +@defun make-string count character +This function returns a string made up of @var{count} repetitions of +@var{character}. If @var{count} is negative, an error is signaled. + +@example +(make-string 5 ?x) + @result{} "xxxxx" +(make-string 0 ?x) + @result{} "" +@end example + + Other functions to compare with this one include @code{char-to-string} +(@pxref{String Conversion}), @code{make-vector} (@pxref{Vectors}), and +@code{make-list} (@pxref{Building Lists}). +@end defun + +@defun string &rest characters +This returns a string containing the characters @var{characters}. + +@example +(string ?a ?b ?c) + @result{} "abc" +@end example +@end defun + +@defun substring string start &optional end +This function returns a new string which consists of those characters +from @var{string} in the range from (and including) the character at the +index @var{start} up to (but excluding) the character at the index +@var{end}. The first character is at index zero. + +@example +@group +(substring "abcdefg" 0 3) + @result{} "abc" +@end group +@end example + +@noindent +Here the index for @samp{a} is 0, the index for @samp{b} is 1, and the +index for @samp{c} is 2. Thus, three letters, @samp{abc}, are copied +from the string @code{"abcdefg"}. 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 @minus{}1 +signifies the index of the last character of the string. For example: + +@example +@group +(substring "abcdefg" -3 -1) + @result{} "ef" +@end group +@end example + +@noindent +In this example, the index for @samp{e} is @minus{}3, the index for +@samp{f} is @minus{}2, and the index for @samp{g} is @minus{}1. +Therefore, @samp{e} and @samp{f} are included, and @samp{g} is excluded. + +When @code{nil} is used for @var{end}, it stands for the length of the +string. Thus, + +@example +@group +(substring "abcdefg" -3 nil) + @result{} "efg" +@end group +@end example + +Omitting the argument @var{end} is equivalent to specifying @code{nil}. +It follows that @code{(substring @var{string} 0)} returns a copy of all +of @var{string}. + +@example +@group +(substring "abcdefg" 0) + @result{} "abcdefg" +@end group +@end example + +@noindent +But we recommend @code{copy-sequence} for this purpose (@pxref{Sequence +Functions}). + +If the characters copied from @var{string} have text properties, the +properties are copied into the new string also. @xref{Text Properties}. + +@code{substring} also accepts a vector for the first argument. +For example: + +@example +(substring [a b (c) "d"] 1 3) + @result{} [b (c)] +@end example + +A @code{wrong-type-argument} error is signaled if @var{start} is not +an integer or if @var{end} is neither an integer nor @code{nil}. An +@code{args-out-of-range} error is signaled if @var{start} indicates a +character following @var{end}, or if either integer is out of range +for @var{string}. + +Contrast this function with @code{buffer-substring} (@pxref{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. +@end defun + +@defun substring-no-properties string &optional start end +This works like @code{substring} but discards all text properties from +the value. Also, @var{start} may be omitted or @code{nil}, which is +equivalent to 0. Thus, @w{@code{(substring-no-properties +@var{string})}} returns a copy of @var{string}, with all text +properties removed. +@end defun + +@defun concat &rest sequences +@cindex copying strings +@cindex concatenating strings +This function returns a new string consisting of the characters in the +arguments passed to it (along with their text properties, if any). The +arguments may be strings, lists of numbers, or vectors of numbers; they +are not themselves changed. If @code{concat} receives no arguments, it +returns an empty string. + +@example +(concat "abc" "-def") + @result{} "abc-def" +(concat "abc" (list 120 121) [122]) + @result{} "abcxyz" +;; @r{@code{nil} is an empty sequence.} +(concat "abc" nil "-def") + @result{} "abc-def" +(concat "The " "quick brown " "fox.") + @result{} "The quick brown fox." +(concat) + @result{} "" +@end example + +@noindent +The @code{concat} function always constructs a new string that is +not @code{eq} to any existing string. + +In Emacs versions before 21, when an argument was an integer (not a +sequence of integers), it was converted to a string of digits making up +the decimal printed representation of the integer. This obsolete usage +no longer works. The proper way to convert an integer to its decimal +printed form is with @code{format} (@pxref{Formatting Strings}) or +@code{number-to-string} (@pxref{String Conversion}). + +For information about other concatenation functions, see the +description of @code{mapconcat} in @ref{Mapping Functions}, +@code{vconcat} in @ref{Vector Functions}, and @code{append} in @ref{Building +Lists}. +@end defun + +@defun split-string string &optional separators omit-nulls +This function splits @var{string} into substrings at matches for the +regular expression @var{separators}. Each match for @var{separators} +defines a splitting point; the substrings between the splitting points +are made into a list, which is the value returned by +@code{split-string}. + +If @var{omit-nulls} is @code{nil}, the result contains null strings +whenever there are two consecutive matches for @var{separators}, or a +match is adjacent to the beginning or end of @var{string}. If +@var{omit-nulls} is @code{t}, these null strings are omitted from the +result. + +If @var{separators} is @code{nil} (or omitted), +the default is the value of @code{split-string-default-separators}. + +As a special case, when @var{separators} is @code{nil} (or omitted), +null strings are always omitted from the result. Thus: + +@example +(split-string " two words ") + @result{} ("two" "words") +@end example + +The result is not @code{("" "two" "words" "")}, which would rarely be +useful. If you need such a result, use an explicit value for +@var{separators}: + +@example +(split-string " two words " + split-string-default-separators) + @result{} ("" "two" "words" "") +@end example + +More examples: + +@example +(split-string "Soup is good food" "o") + @result{} ("S" "up is g" "" "d f" "" "d") +(split-string "Soup is good food" "o" t) + @result{} ("S" "up is g" "d f" "d") +(split-string "Soup is good food" "o+") + @result{} ("S" "up is g" "d f" "d") +@end example + +Empty matches do count, except that @code{split-string} will not look +for a final empty match when it already reached the end of the string +using a non-empty match or when @var{string} is empty: + +@example +(split-string "aooob" "o*") + @result{} ("" "a" "" "b" "") +(split-string "ooaboo" "o*") + @result{} ("" "" "a" "b" "") +(split-string "" "") + @result{} ("") +@end example + +However, when @var{separators} can match the empty string, +@var{omit-nulls} is usually @code{t}, so that the subtleties in the +three previous examples are rarely relevant: + +@example +(split-string "Soup is good food" "o*" t) + @result{} ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d") +(split-string "Nice doggy!" "" t) + @result{} ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!") +(split-string "" "" t) + @result{} nil +@end example + +Somewhat odd, but predictable, behavior can occur for certain +``non-greedy'' values of @var{separators} that can prefer empty +matches over non-empty matches. Again, such values rarely occur in +practice: + +@example +(split-string "ooo" "o*" t) + @result{} nil +(split-string "ooo" "\\|o+" t) + @result{} ("o" "o" "o") +@end example +@end defun + +@defvar split-string-default-separators +The default value of @var{separators} for @code{split-string}. Its +usual value is @w{@code{"[ \f\t\n\r\v]+"}}. +@end defvar + +@node Modifying Strings +@section Modifying Strings + + The most basic way to alter the contents of an existing string is with +@code{aset} (@pxref{Array Functions}). @code{(aset @var{string} +@var{idx} @var{char})} stores @var{char} into @var{string} at index +@var{idx}. Each character occupies one or more bytes, and if @var{char} +needs a different number of bytes from the character already present at +that index, @code{aset} signals an error. + + A more powerful function is @code{store-substring}: + +@defun store-substring string idx obj +This function alters part of the contents of the string @var{string}, by +storing @var{obj} starting at index @var{idx}. The argument @var{obj} +may be either a character or a (smaller) string. + +Since it is impossible to change the length of an existing string, it is +an error if @var{obj} doesn't fit within @var{string}'s actual length, +or if any new character requires a different number of bytes from the +character currently present at that point in @var{string}. +@end defun + + To clear out a string that contained a password, use +@code{clear-string}: + +@defun clear-string string +This makes @var{string} a unibyte string and clears its contents to +zeros. It may also change @var{string}'s length. +@end defun + +@need 2000 +@node Text Comparison +@section Comparison of Characters and Strings +@cindex string equality + +@defun char-equal character1 character2 +This function returns @code{t} if the arguments represent the same +character, @code{nil} otherwise. This function ignores differences +in case if @code{case-fold-search} is non-@code{nil}. + +@example +(char-equal ?x ?x) + @result{} t +(let ((case-fold-search nil)) + (char-equal ?x ?X)) + @result{} nil +@end example +@end defun + +@defun string= string1 string2 +This function returns @code{t} if the characters of the two strings +match exactly. Symbols are also allowed as arguments, in which case +their print names are used. +Case is always significant, regardless of @code{case-fold-search}. + +@example +(string= "abc" "abc") + @result{} t +(string= "abc" "ABC") + @result{} nil +(string= "ab" "ABC") + @result{} nil +@end example + +The function @code{string=} ignores the text properties of the two +strings. When @code{equal} (@pxref{Equality Predicates}) compares two +strings, it uses @code{string=}. + +For technical reasons, a unibyte and a multibyte string are +@code{equal} if and only if they contain the same sequence of +character codes and all these codes are either in the range 0 through +127 (@acronym{ASCII}) or 160 through 255 (@code{eight-bit-graphic}). +However, when a unibyte string gets converted to a multibyte string, +all characters with codes in the range 160 through 255 get converted +to characters with higher codes, whereas @acronym{ASCII} characters +remain unchanged. Thus, a unibyte string and its conversion to +multibyte are only @code{equal} if the string is all @acronym{ASCII}. +Character codes 160 through 255 are not entirely proper in multibyte +text, even though they can occur. As a consequence, the situation +where a unibyte and a multibyte string are @code{equal} without both +being all @acronym{ASCII} is a technical oddity that very few Emacs +Lisp programmers ever get confronted with. @xref{Text +Representations}. +@end defun + +@defun string-equal string1 string2 +@code{string-equal} is another name for @code{string=}. +@end defun + +@cindex lexical comparison +@defun string< string1 string2 +@c (findex string< causes problems for permuted index!!) +This function compares two strings a character at a time. It +scans both the strings at the same time to find the first pair of corresponding +characters that do not match. If the lesser character of these two is +the character from @var{string1}, then @var{string1} is less, and this +function returns @code{t}. If the lesser character is the one from +@var{string2}, then @var{string1} is greater, and this function returns +@code{nil}. If the two strings match entirely, the value is @code{nil}. + +Pairs of characters are compared according to their character codes. +Keep in mind that lower case letters have higher numeric values in the +@acronym{ASCII} character set than their upper case counterparts; digits and +many punctuation characters have a lower numeric value than upper case +letters. An @acronym{ASCII} character is less than any non-@acronym{ASCII} +character; a unibyte non-@acronym{ASCII} character is always less than any +multibyte non-@acronym{ASCII} character (@pxref{Text Representations}). + +@example +@group +(string< "abc" "abd") + @result{} t +(string< "abd" "abc") + @result{} nil +(string< "123" "abc") + @result{} t +@end group +@end example + +When the strings have different lengths, and they match up to the +length of @var{string1}, then the result is @code{t}. If they match up +to the length of @var{string2}, the result is @code{nil}. A string of +no characters is less than any other string. + +@example +@group +(string< "" "abc") + @result{} t +(string< "ab" "abc") + @result{} t +(string< "abc" "") + @result{} nil +(string< "abc" "ab") + @result{} nil +(string< "" "") + @result{} nil +@end group +@end example + +Symbols are also allowed as arguments, in which case their print names +are used. +@end defun + +@defun string-lessp string1 string2 +@code{string-lessp} is another name for @code{string<}. +@end defun + +@defun compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case +This function compares the specified part of @var{string1} with the +specified part of @var{string2}. The specified part of @var{string1} +runs from index @var{start1} up to index @var{end1} (@code{nil} means +the end of the string). The specified part of @var{string2} runs from +index @var{start2} up to index @var{end2} (@code{nil} means the end of +the string). + +The strings are both converted to multibyte for the comparison +(@pxref{Text Representations}) so that a unibyte string and its +conversion to multibyte are always regarded as equal. If +@var{ignore-case} is non-@code{nil}, then case is ignored, so that +upper case letters can be equal to lower case letters. + +If the specified portions of the two strings match, the value is +@code{t}. Otherwise, the value is an integer which indicates how many +leading characters agree, and which string is less. Its absolute value +is one plus the number of characters that agree at the beginning of the +two strings. The sign is negative if @var{string1} (or its specified +portion) is less. +@end defun + +@defun assoc-string key alist &optional case-fold +This function works like @code{assoc}, except that @var{key} must be a +string or symbol, and comparison is done using @code{compare-strings}. +Symbols are converted to strings before testing. +If @var{case-fold} is non-@code{nil}, it ignores case differences. +Unlike @code{assoc}, this function can also match elements of the alist +that are strings or symbols rather than conses. In particular, @var{alist} can +be a list of strings or symbols rather than an actual alist. +@xref{Association Lists}. +@end defun + + See also the @code{compare-buffer-substrings} function in +@ref{Comparing Text}, for a way to compare text in buffers. The +function @code{string-match}, which matches a regular expression +against a string, can be used for a kind of string comparison; see +@ref{Regexp Search}. + +@node String Conversion +@comment node-name, next, previous, up +@section Conversion of Characters and Strings +@cindex conversion of strings + + This section describes functions for conversions between characters, +strings and integers. @code{format} (@pxref{Formatting Strings}) +and @code{prin1-to-string} +(@pxref{Output Functions}) can also convert Lisp objects into strings. +@code{read-from-string} (@pxref{Input Functions}) can ``convert'' a +string representation of a Lisp object into an object. The functions +@code{string-make-multibyte} and @code{string-make-unibyte} convert the +text representation of a string (@pxref{Converting Representations}). + + @xref{Documentation}, for functions that produce textual descriptions +of text characters and general input events +(@code{single-key-description} and @code{text-char-description}). These +are used primarily for making help messages. + +@defun char-to-string character +@cindex character to string +This function returns a new string containing one character, +@var{character}. This function is semi-obsolete because the function +@code{string} is more general. @xref{Creating Strings}. +@end defun + +@defun string-to-char string +@cindex string to character + This function returns the first character in @var{string}. If the +string is empty, the function returns 0. The value is also 0 when the +first character of @var{string} is the null character, @acronym{ASCII} code +0. + +@example +(string-to-char "ABC") + @result{} 65 + +(string-to-char "xyz") + @result{} 120 +(string-to-char "") + @result{} 0 +@group +(string-to-char "\000") + @result{} 0 +@end group +@end example + +This function may be eliminated in the future if it does not seem useful +enough to retain. +@end defun + +@defun number-to-string number +@cindex integer to string +@cindex integer to decimal +This function returns a string consisting of the printed base-ten +representation of @var{number}, which may be an integer or a floating +point number. The returned value starts with a minus sign if the argument is +negative. + +@example +(number-to-string 256) + @result{} "256" +@group +(number-to-string -23) + @result{} "-23" +@end group +(number-to-string -23.5) + @result{} "-23.5" +@end example + +@cindex int-to-string +@code{int-to-string} is a semi-obsolete alias for this function. + +See also the function @code{format} in @ref{Formatting Strings}. +@end defun + +@defun string-to-number string &optional base +@cindex string to number +This function returns the numeric value of the characters in +@var{string}. If @var{base} is non-@code{nil}, it must be an integer +between 2 and 16 (inclusive), and integers are converted in that base. +If @var{base} is @code{nil}, then base ten is used. Floating point +conversion only works in base ten; we have not implemented other +radices for floating point numbers, because that would be much more +work and does not seem useful. If @var{string} looks like an integer +but its value is too large to fit into a Lisp integer, +@code{string-to-number} returns a floating point result. + +The parsing skips spaces and tabs at the beginning of @var{string}, +then reads as much of @var{string} as it can interpret as a number in +the given base. (On some systems it ignores other whitespace at the +beginning, not just spaces and tabs.) If the first character after +the ignored whitespace is neither a digit in the given base, nor a +plus or minus sign, nor the leading dot of a floating point number, +this function returns 0. + +@example +(string-to-number "256") + @result{} 256 +(string-to-number "25 is a perfect square.") + @result{} 25 +(string-to-number "X256") + @result{} 0 +(string-to-number "-4.5") + @result{} -4.5 +(string-to-number "1e5") + @result{} 100000.0 +@end example + +@findex string-to-int +@code{string-to-int} is an obsolete alias for this function. +@end defun + + Here are some other functions that can convert to or from a string: + +@table @code +@item concat +@code{concat} can convert a vector or a list into a string. +@xref{Creating Strings}. + +@item vconcat +@code{vconcat} can convert a string into a vector. @xref{Vector +Functions}. + +@item append +@code{append} can convert a string into a list. @xref{Building Lists}. +@end table + +@node Formatting Strings +@comment node-name, next, previous, up +@section Formatting Strings +@cindex formatting strings +@cindex strings, formatting them + + @dfn{Formatting} means constructing a string by substitution of +computed values at various places in a constant string. This constant string +controls how the other values are printed, as well as where they appear; +it is called a @dfn{format string}. + + Formatting is often useful for computing messages to be displayed. In +fact, the functions @code{message} and @code{error} provide the same +formatting feature described here; they differ from @code{format} only +in how they use the result of formatting. + +@defun format string &rest objects +This function returns a new string that is made by copying +@var{string} and then replacing any format specification +in the copy with encodings of the corresponding @var{objects}. The +arguments @var{objects} are the computed values to be formatted. + +The characters in @var{string}, other than the format specifications, +are copied directly into the output, including their text properties, +if any. +@end defun + +@cindex @samp{%} in format +@cindex format specification + A format specification is a sequence of characters beginning with a +@samp{%}. Thus, if there is a @samp{%d} in @var{string}, the +@code{format} function replaces it with the printed representation of +one of the values to be formatted (one of the arguments @var{objects}). +For example: + +@example +@group +(format "The value of fill-column is %d." fill-column) + @result{} "The value of fill-column is 72." +@end group +@end example + + Since @code{format} interprets @samp{%} characters as format +specifications, you should @emph{never} pass an arbitrary string as +the first argument. This is particularly true when the string is +generated by some Lisp code. Unless the string is @emph{known} to +never include any @samp{%} characters, pass @code{"%s"}, described +below, as the first argument, and the string as the second, like this: + +@example + (format "%s" @var{arbitrary-string}) +@end example + + If @var{string} contains more than one format specification, the +format specifications correspond to successive values from +@var{objects}. Thus, the first format specification in @var{string} +uses the first such value, the second format specification uses the +second such value, and so on. Any extra format specifications (those +for which there are no corresponding values) cause an error. Any +extra values to be formatted are ignored. + + Certain format specifications require values of particular types. If +you supply a value that doesn't fit the requirements, an error is +signaled. + + Here is a table of valid format specifications: + +@table @samp +@item %s +Replace the specification with the printed representation of the object, +made without quoting (that is, using @code{princ}, not +@code{prin1}---@pxref{Output Functions}). Thus, strings are represented +by their contents alone, with no @samp{"} characters, and symbols appear +without @samp{\} characters. + +If the object is a string, its text properties are +copied into the output. The text properties of the @samp{%s} itself +are also copied, but those of the object take priority. + +@item %S +Replace the specification with the printed representation of the object, +made with quoting (that is, using @code{prin1}---@pxref{Output +Functions}). Thus, strings are enclosed in @samp{"} characters, and +@samp{\} characters appear where necessary before special characters. + +@item %o +@cindex integer to octal +Replace the specification with the base-eight representation of an +integer. + +@item %d +Replace the specification with the base-ten representation of an +integer. + +@item %x +@itemx %X +@cindex integer to hexadecimal +Replace the specification with the base-sixteen representation of an +integer. @samp{%x} uses lower case and @samp{%X} uses upper case. + +@item %c +Replace the specification with the character which is the value given. + +@item %e +Replace the specification with the exponential notation for a floating +point number. + +@item %f +Replace the specification with the decimal-point notation for a floating +point number. + +@item %g +Replace the specification with notation for a floating point number, +using either exponential notation or decimal-point notation, whichever +is shorter. + +@item %% +Replace the specification with a single @samp{%}. This format +specification is unusual in that it does not use a value. For example, +@code{(format "%% %d" 30)} returns @code{"% 30"}. +@end table + + Any other format character results in an @samp{Invalid format +operation} error. + + Here are several examples: + +@example +@group +(format "The name of this buffer is %s." (buffer-name)) + @result{} "The name of this buffer is strings.texi." + +(format "The buffer object prints as %s." (current-buffer)) + @result{} "The buffer object prints as strings.texi." + +(format "The octal value of %d is %o, + and the hex value is %x." 18 18 18) + @result{} "The octal value of 18 is 22, + and the hex value is 12." +@end group +@end example + +@cindex field width +@cindex padding + A specification can have a @dfn{width}, which is a signed decimal +number between the @samp{%} and the specification character. If the +printed representation of the object contains fewer characters than +this width, @code{format} extends it with padding. The padding goes +on the left if the width is positive (or starts with zero) and on the +right if the width is negative. The padding character is normally a +space, but it's @samp{0} if the width starts with a zero. + + Some of these conventions are ignored for specification characters +for which they do not make sense. That is, @samp{%s}, @samp{%S} and +@samp{%c} accept a width starting with 0, but still pad with +@emph{spaces} on the left. Also, @samp{%%} accepts a width, but +ignores it. Here are some examples of padding: + +@example +(format "%06d is padded on the left with zeros" 123) + @result{} "000123 is padded on the left with zeros" + +(format "%-6d is padded on the right" 123) + @result{} "123 is padded on the right" +@end example + +@noindent +If the width is too small, @code{format} does not truncate the +object's printed representation. Thus, you can use a width to specify +a minimum spacing between columns with no risk of losing information. + + In the following three examples, @samp{%7s} specifies a minimum +width of 7. In the first case, the string inserted in place of +@samp{%7s} has only 3 letters, it needs 4 blank spaces as padding. In +the second case, the string @code{"specification"} is 13 letters wide +but is not truncated. In the third case, the padding is on the right. + +@smallexample +@group +(format "The word `%7s' actually has %d letters in it." + "foo" (length "foo")) + @result{} "The word ` foo' actually has 3 letters in it." +@end group + +@group +(format "The word `%7s' actually has %d letters in it." + "specification" (length "specification")) + @result{} "The word `specification' actually has 13 letters in it." +@end group + +@group +(format "The word `%-7s' actually has %d letters in it." + "foo" (length "foo")) + @result{} "The word `foo ' actually has 3 letters in it." +@end group +@end smallexample + +@cindex precision in format specifications + All the specification characters allow an optional @dfn{precision} +before the character (after the width, if present). The precision is +a decimal-point @samp{.} followed by a digit-string. For the +floating-point specifications (@samp{%e}, @samp{%f}, @samp{%g}), the +precision specifies how many decimal places to show; if zero, the +decimal-point itself is also omitted. For @samp{%s} and @samp{%S}, +the precision truncates the string to the given width, so @samp{%.3s} +shows only the first three characters of the representation for +@var{object}. Precision has no effect for other specification +characters. + +@cindex flags in format specifications + Immediately after the @samp{%} and before the optional width and +precision, you can put certain ``flag'' characters. + + @samp{+} as a flag inserts a plus sign before a positive number, so +that it always has a sign. A space character as flag inserts a space +before a positive number. (Otherwise, positive numbers start with the +first digit.) Either of these two flags ensures that positive numbers +and negative numbers use the same number of columns. These flags are +ignored except for @samp{%d}, @samp{%e}, @samp{%f}, @samp{%g}, and if +both flags are used, the @samp{+} takes precedence. + + The flag @samp{#} specifies an ``alternate form'' which depends on +the format in use. For @samp{%o} it ensures that the result begins +with a @samp{0}. For @samp{%x} and @samp{%X}, it prefixes the result +with @samp{0x} or @samp{0X}. For @samp{%e}, @samp{%f}, and @samp{%g}, +the @samp{#} flag means include a decimal point even if the precision +is zero. + +@node Case Conversion +@comment node-name, next, previous, up +@section Case Conversion in Lisp +@cindex upper case +@cindex lower case +@cindex character case +@cindex case conversion in Lisp + + The character case functions change the case of single characters or +of the contents of strings. The functions normally convert only +alphabetic characters (the letters @samp{A} through @samp{Z} and +@samp{a} through @samp{z}, as well as non-@acronym{ASCII} letters); other +characters are not altered. You can specify a different case +conversion mapping by specifying a case table (@pxref{Case Tables}). + + These functions do not modify the strings that are passed to them as +arguments. + + The examples below use the characters @samp{X} and @samp{x} which have +@acronym{ASCII} codes 88 and 120 respectively. + +@defun downcase string-or-char +This function converts a character or a string to lower case. + +When the argument to @code{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 +@code{downcase} is a character, @code{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. + +@example +(downcase "The cat in the hat") + @result{} "the cat in the hat" + +(downcase ?X) + @result{} 120 +@end example +@end defun + +@defun upcase string-or-char +This function converts a character or a string to upper case. + +When the argument to @code{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 @code{upcase} is a character, @code{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 returned equals the original character. + +@example +(upcase "The cat in the hat") + @result{} "THE CAT IN THE HAT" + +(upcase ?x) + @result{} 88 +@end example +@end defun + +@defun capitalize string-or-char +@cindex capitalization +This function capitalizes strings or characters. If +@var{string-or-char} is a string, the function creates and returns a new +string, whose contents are a copy of @var{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 syntax class in the current syntax +table (@pxref{Syntax Class Table}). + +When the argument to @code{capitalize} is a character, @code{capitalize} +has the same result as @code{upcase}. + +@example +@group +(capitalize "The cat in the hat") + @result{} "The Cat In The Hat" +@end group + +@group +(capitalize "THE 77TH-HATTED CAT") + @result{} "The 77th-Hatted Cat" +@end group + +@group +(capitalize ?x) + @result{} 88 +@end group +@end example +@end defun + +@defun upcase-initials string-or-char +If @var{string-or-char} is a string, this function capitalizes the +initials of the words in @var{string-or-char}, without altering any +letters other than the initials. It returns a new string whose +contents are a copy of @var{string-or-char}, in which each word has +had its initial letter converted to upper case. + +The definition of a word is any sequence of consecutive characters that +are assigned to the word constituent syntax class in the current syntax +table (@pxref{Syntax Class Table}). + +When the argument to @code{upcase-initials} is a character, +@code{upcase-initials} has the same result as @code{upcase}. + +@example +@group +(upcase-initials "The CAT in the hAt") + @result{} "The CAT In The HAt" +@end group +@end example +@end defun + + @xref{Text Comparison}, for functions that compare strings; some of +them ignore case differences, or can optionally ignore case differences. + +@node Case Tables +@section The Case Table + + You can customize case conversion by installing a special @dfn{case +table}. A case table specifies the mapping between upper case and lower +case letters. It affects both the case conversion functions for Lisp +objects (see the previous section) and those that apply to text in the +buffer (@pxref{Case Changes}). Each buffer has a case table; there is +also a standard case table which is used to initialize the case table +of new buffers. + + A case table is a char-table (@pxref{Char-Tables}) whose subtype is +@code{case-table}. This char-table maps each character into the +corresponding lower case character. It has three extra slots, which +hold related tables: + +@table @var +@item upcase +The upcase table maps each character into the corresponding upper +case character. +@item canonicalize +The canonicalize table maps all of a set of case-related characters +into a particular member of that set. +@item equivalences +The equivalences table maps each one of a set of case-related characters +into the next character in that set. +@end table + + In simple cases, all you need to specify is the mapping to lower-case; +the three related tables will be calculated automatically from that one. + + For some languages, upper and lower case letters are not in one-to-one +correspondence. There may be two different lower case letters with the +same upper case equivalent. In these cases, you need to specify the +maps for both lower case and upper case. + + The extra table @var{canonicalize} maps each character to a canonical +equivalent; any two characters that are related by case-conversion have +the same canonical equivalent character. For example, since @samp{a} +and @samp{A} are related by case-conversion, they should have the same +canonical equivalent character (which should be either @samp{a} for both +of them, or @samp{A} for both of them). + + The extra table @var{equivalences} is a map that cyclically permutes +each equivalence class (of characters with the same canonical +equivalent). (For ordinary @acronym{ASCII}, this would map @samp{a} into +@samp{A} and @samp{A} into @samp{a}, and likewise for each set of +equivalent characters.) + + When you construct a case table, you can provide @code{nil} for +@var{canonicalize}; then Emacs fills in this slot from the lower case +and upper case mappings. You can also provide @code{nil} for +@var{equivalences}; then Emacs fills in this slot from +@var{canonicalize}. In a case table that is actually in use, those +components are non-@code{nil}. Do not try to specify @var{equivalences} +without also specifying @var{canonicalize}. + + Here are the functions for working with case tables: + +@defun case-table-p object +This predicate returns non-@code{nil} if @var{object} is a valid case +table. +@end defun + +@defun set-standard-case-table table +This function makes @var{table} the standard case table, so that it will +be used in any buffers created subsequently. +@end defun + +@defun standard-case-table +This returns the standard case table. +@end defun + +@defun current-case-table +This function returns the current buffer's case table. +@end defun + +@defun set-case-table table +This sets the current buffer's case table to @var{table}. +@end defun + +@defmac with-case-table table body@dots{} +The @code{with-case-table} macro saves the current case table, makes +@var{table} the current case table, evaluates the @var{body} forms, +and finally restores the case table. The return value is the value of +the last form in @var{body}. The case table is restored even in case +of an abnormal exit via @code{throw} or error (@pxref{Nonlocal +Exits}). +@end defmac + + Some language environments may modify the case conversions of +@acronym{ASCII} characters; for example, in the Turkish language +environment, the @acronym{ASCII} character @samp{I} is downcased into +a Turkish ``dotless i''. This can interfere with code that requires +ordinary ASCII case conversion, such as implementations of +@acronym{ASCII}-based network protocols. In that case, use the +@code{with-case-table} macro with the variable @var{ascii-case-table}, +which stores the unmodified case table for the @acronym{ASCII} +character set. + +@defvar ascii-case-table +The case table for the @acronym{ASCII} character set. This should not be +modified by any language environment settings. +@end defvar + + The following three functions are convenient subroutines for packages +that define non-@acronym{ASCII} character sets. They modify the specified +case table @var{case-table}; they also modify the standard syntax table. +@xref{Syntax Tables}. Normally you would use these functions to change +the standard case table. + +@defun set-case-syntax-pair uc lc case-table +This function specifies a pair of corresponding letters, one upper case +and one lower case. +@end defun + +@defun set-case-syntax-delims l r case-table +This function makes characters @var{l} and @var{r} a matching pair of +case-invariant delimiters. +@end defun + +@defun set-case-syntax char syntax case-table +This function makes @var{char} case-invariant, with syntax +@var{syntax}. +@end defun + +@deffn Command describe-buffer-case-table +This command displays a description of the contents of the current +buffer's case table. +@end deffn + +@ignore + arch-tag: 700b8e95-7aa5-4b52-9eb3-8f2e1ea152b4 +@end ignore diff --git a/doc/lispref/symbols.texi b/doc/lispref/symbols.texi new file mode 100644 index 00000000000..7234a75bd59 --- /dev/null +++ b/doc/lispref/symbols.texi @@ -0,0 +1,598 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/symbols +@node Symbols, Evaluation, Hash Tables, Top +@chapter Symbols +@cindex symbol + + A @dfn{symbol} is an object with a unique name. This chapter +describes symbols, their components, their property lists, and how they +are created and interned. Separate chapters describe the use of symbols +as variables and as function names; see @ref{Variables}, and +@ref{Functions}. For the precise read syntax for symbols, see +@ref{Symbol Type}. + + You can test whether an arbitrary Lisp object is a symbol +with @code{symbolp}: + +@defun symbolp object +This function returns @code{t} if @var{object} is a symbol, @code{nil} +otherwise. +@end defun + +@menu +* Symbol Components:: Symbols have names, values, function definitions + and property lists. +* Definitions:: A definition says how a symbol will be used. +* Creating Symbols:: How symbols are kept unique. +* Property Lists:: Each symbol has a property list + for recording miscellaneous information. +@end menu + +@node Symbol Components, Definitions, Symbols, Symbols +@section Symbol Components +@cindex symbol components + + Each symbol has four components (or ``cells''), each of which +references another object: + +@table @asis +@item Print name +@cindex print name cell +The @dfn{print name cell} holds a string that names the symbol for +reading and printing. See @code{symbol-name} in @ref{Creating Symbols}. + +@item Value +@cindex value cell +The @dfn{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 @code{symbol-value} in +@ref{Accessing Variables}. + +@item Function +@cindex function cell +The @dfn{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 to make a symbol stand for a keymap +or a keyboard macro, for editor command execution. Because each symbol +has separate value and function cells, variables names and function names do +not conflict. See @code{symbol-function} in @ref{Function Cells}. + +@item Property list +@cindex property list cell +The @dfn{property list cell} holds the property list of the symbol. See +@code{symbol-plist} in @ref{Property Lists}. +@end table + + 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 lookup uses a hashing algorithm and an obarray; see @ref{Creating +Symbols}.) + + The value cell holds the symbol's value as a variable +(@pxref{Variables}). That is what you get if you evaluate the symbol as +a Lisp expression (@pxref{Evaluation}). Any Lisp object is a legitimate +value. Certain symbols have values that cannot be changed; these +include @code{nil} and @code{t}, and any symbol whose name starts with +@samp{:} (those are called @dfn{keywords}). @xref{Constant Variables}. + + We often refer to ``the function @code{foo}'' when we really mean +the function stored in the function cell of the symbol @code{foo}. We +make the distinction explicit only when necessary. In normal +usage, the function cell usually contains a function +(@pxref{Functions}) or a macro (@pxref{Macros}), as that is what the +Lisp interpreter expects to see there (@pxref{Evaluation}). Keyboard +macros (@pxref{Keyboard Macros}), keymaps (@pxref{Keymaps}) and +autoload objects (@pxref{Autoloading}) are also sometimes stored in +the function cells of symbols. + + The property list cell normally should hold a correctly formatted +property list (@pxref{Property Lists}), as a number of functions expect +to see a property list there. + + The function cell or the value cell may be @dfn{void}, which means +that the cell does not reference any object. (This is not the same +thing as holding the symbol @code{void}, nor the same as holding the +symbol @code{nil}.) Examining a function or value cell that is void +results in an error, such as @samp{Symbol's value as variable is void}. + + The four functions @code{symbol-name}, @code{symbol-value}, +@code{symbol-plist}, and @code{symbol-function} return the contents of +the four cells of a symbol. Here as an example we show the contents of +the four cells of the symbol @code{buffer-file-name}: + +@example +(symbol-name 'buffer-file-name) + @result{} "buffer-file-name" +(symbol-value 'buffer-file-name) + @result{} "/gnu/elisp/symbols.texi" +(symbol-function 'buffer-file-name) + @result{} #<subr buffer-file-name> +(symbol-plist 'buffer-file-name) + @result{} (variable-documentation 29529) +@end example + +@noindent +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 @code{(variable-documentation +29529)} which tells the documentation functions where to find the +documentation string for the variable @code{buffer-file-name} in the +@file{DOC-@var{version}} file. (29529 is the offset from the beginning +of the @file{DOC-@var{version}} file to where that documentation string +begins---see @ref{Documentation Basics}.) The function cell contains +the function for returning the name of the file. +@code{buffer-file-name} names a primitive function, which has no read +syntax and prints in hash notation (@pxref{Primitive Function Type}). A +symbol naming a function written in Lisp would have a lambda expression +(or a byte-code object) in this cell. + +@node Definitions, Creating Symbols, Symbol Components, Symbols +@section Defining Symbols +@cindex definitions of symbols + + A @dfn{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. + + @code{defvar} and @code{defconst} are special forms that define a +symbol as a global variable. They are documented in detail in +@ref{Defining Variables}. For defining user option variables that can +be customized, use @code{defcustom} (@pxref{Customization}). + + @code{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 @code{defun} gives the symbol its +definition as a function.) @code{defsubst} and @code{defalias} are two +other ways of defining a function. @xref{Functions}. + + @code{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. +@xref{Macros}. + + In 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 @code{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 +@emph{intended} to be used as variables, or as functions. In addition, +utilities such as @file{etags} and @file{make-docfile} recognize +definitions, and add appropriate information to tag tables and the +@file{DOC-@var{version}} file. @xref{Accessing Documentation}. + +@node Creating Symbols, Property Lists, Definitions, Symbols +@section Creating and Interning Symbols +@cindex reading symbols + + To understand how symbols are created in GNU Emacs Lisp, you must know +how Lisp reads them. Lisp must ensure that it finds the same symbol +every time it reads the same set of characters. Failure to do so would +cause complete confusion. + +@cindex symbol name hashing +@cindex hashing +@cindex obarray +@cindex bucket (in obarray) + 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 @dfn{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 @dfn{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. (The +same idea is used for general Emacs hash tables, but they are a +different data type; see @ref{Hash Tables}.) + +@cindex interning + If a symbol with the desired name is found, the reader uses that +symbol. If the obarray does not contain a symbol with that name, the +reader makes a new symbol and adds it to the obarray. Finding or adding +a symbol with a certain name is called @dfn{interning} it, and the +symbol is then called an @dfn{interned symbol}. + + Interning ensures that each obarray has just one symbol with any +particular name. Other like-named symbols may exist, but not in the +same obarray. Thus, the reader gets the same symbols for the same +names, as long as you keep reading with the same obarray. + + Interning usually happens automatically in the reader, but sometimes +other programs need to do it. For example, after the @kbd{M-x} command +obtains the command name as a string using the minibuffer, it then +interns the string, to get the interned symbol with that name. + +@cindex symbol equality +@cindex uninterned symbol + No obarray contains all symbols; in fact, some symbols are not in any +obarray. They are called @dfn{uninterned symbols}. An uninterned +symbol has the same four cells as other symbols; however, the only way +to gain access to it is by finding it in some other object or as the +value of a variable. + + Creating an uninterned symbol is useful in generating Lisp code, +because an uninterned symbol used as a variable in the code you generate +cannot clash with any variables used in other Lisp programs. + + In Emacs Lisp, an obarray is actually 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 +find all the symbols in an obarray except using @code{mapatoms} (below). +The order of symbols in a bucket is not significant. + + In an empty obarray, every element is 0, so you can create an obarray +with @code{(make-vector @var{length} 0)}. @strong{This is the only +valid way to create an obarray.} Prime numbers as lengths tend +to result in good hashing; lengths one less than a power of two are also +good. + + @strong{Do not try to put symbols in an obarray yourself.} This does +not work---only @code{intern} can enter a symbol in an obarray properly. + +@cindex CL note---symbol in obarrays +@quotation +@b{Common Lisp note:} In Common Lisp, a single symbol may be interned in +several obarrays. +@end quotation + + Most of the functions below take a name and sometimes an obarray as +arguments. A @code{wrong-type-argument} error is signaled if the name +is not a string, or if the obarray is not a vector. + +@defun symbol-name symbol +This function returns the string that is @var{symbol}'s name. For example: + +@example +@group +(symbol-name 'foo) + @result{} "foo" +@end group +@end example + +@strong{Warning:} Changing the string by substituting characters does +change the name of the symbol, but fails to update the obarray, so don't +do it! +@end defun + +@defun make-symbol name +This function returns a newly-allocated, uninterned symbol whose name is +@var{name} (which must be a string). Its value and function definition +are void, and its property list is @code{nil}. In the example below, +the value of @code{sym} is not @code{eq} to @code{foo} because it is a +distinct uninterned symbol whose name is also @samp{foo}. + +@example +(setq sym (make-symbol "foo")) + @result{} foo +(eq sym 'foo) + @result{} nil +@end example +@end defun + +@defun intern name &optional obarray +This function returns the interned symbol whose name is @var{name}. If +there is no such symbol in the obarray @var{obarray}, @code{intern} +creates a new one, adds it to the obarray, and returns it. If +@var{obarray} is omitted, the value of the global variable +@code{obarray} is used. + +@example +(setq sym (intern "foo")) + @result{} foo +(eq sym 'foo) + @result{} t + +(setq sym1 (intern "foo" other-obarray)) + @result{} foo +(eq sym1 'foo) + @result{} nil +@end example +@end defun + +@cindex CL note---interning existing symbol +@quotation +@b{Common Lisp note:} In Common Lisp, you can intern an existing symbol +in an obarray. In Emacs Lisp, you cannot do this, because the argument +to @code{intern} must be a string, not a symbol. +@end quotation + +@defun intern-soft name &optional obarray +This function returns the symbol in @var{obarray} whose name is +@var{name}, or @code{nil} if @var{obarray} has no symbol with that name. +Therefore, you can use @code{intern-soft} to test whether a symbol with +a given name is already interned. If @var{obarray} is omitted, the +value of the global variable @code{obarray} is used. + +The argument @var{name} may also be a symbol; in that case, +the function returns @var{name} if @var{name} is interned +in the specified obarray, and otherwise @code{nil}. + +@smallexample +(intern-soft "frazzle") ; @r{No such symbol exists.} + @result{} nil +(make-symbol "frazzle") ; @r{Create an uninterned one.} + @result{} frazzle +@group +(intern-soft "frazzle") ; @r{That one cannot be found.} + @result{} nil +@end group +@group +(setq sym (intern "frazzle")) ; @r{Create an interned one.} + @result{} frazzle +@end group +@group +(intern-soft "frazzle") ; @r{That one can be found!} + @result{} frazzle +@end group +@group +(eq sym 'frazzle) ; @r{And it is the same one.} + @result{} t +@end group +@end smallexample +@end defun + +@defvar obarray +This variable is the standard obarray for use by @code{intern} and +@code{read}. +@end defvar + +@defun mapatoms function &optional obarray +@anchor{Definition of mapatoms} +This function calls @var{function} once with each symbol in the obarray +@var{obarray}. Then it returns @code{nil}. If @var{obarray} is +omitted, it defaults to the value of @code{obarray}, the standard +obarray for ordinary symbols. + +@smallexample +(setq count 0) + @result{} 0 +(defun count-syms (s) + (setq count (1+ count))) + @result{} count-syms +(mapatoms 'count-syms) + @result{} nil +count + @result{} 1871 +@end smallexample + +See @code{documentation} in @ref{Accessing Documentation}, for another +example using @code{mapatoms}. +@end defun + +@defun unintern symbol &optional obarray +This function deletes @var{symbol} from the obarray @var{obarray}. If +@code{symbol} is not actually in the obarray, @code{unintern} does +nothing. If @var{obarray} is @code{nil}, the current obarray is used. + +If you provide a string instead of a symbol as @var{symbol}, it stands +for a symbol name. Then @code{unintern} deletes the symbol (if any) in +the obarray which has that name. If there is no such symbol, +@code{unintern} does nothing. + +If @code{unintern} does delete a symbol, it returns @code{t}. Otherwise +it returns @code{nil}. +@end defun + +@node Property Lists,, Creating Symbols, Symbols +@section Property Lists +@cindex property list +@cindex plist + + A @dfn{property list} (@dfn{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 its documentation as a variable, 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. + + Character positions in a string or buffer can also have property lists. +@xref{Text Properties}. + + The property names and values in a property list can be any Lisp +objects, but the names are usually symbols. Property list functions +compare the property names using @code{eq}. Here is an example of a +property list, found on the symbol @code{progn} when the compiler is +loaded: + +@example +(lisp-indent-function 0 byte-compile byte-compile-progn) +@end example + +@noindent +Here @code{lisp-indent-function} and @code{byte-compile} are property +names, and the other two elements are the corresponding values. + +@menu +* Plists and Alists:: Comparison of the advantages of property + lists and association lists. +* Symbol Plists:: Functions to access symbols' property lists. +* Other Plists:: Accessing property lists stored elsewhere. +@end menu + +@node Plists and Alists +@subsection Property Lists and Association Lists +@cindex plist vs. alist +@cindex alist vs. plist + +@cindex property lists vs association lists + Association lists (@pxref{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 for attaching +information to various Lisp function names or variables. If your +program keeps all of its associations in one association list, it will +typically need to search that entire list each time it checks for an +association. This could be slow. By contrast, if you keep the same +information 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. This is why the documentation for a variable is +recorded in a property named @code{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 choose property names that are probably +unique, such as by beginning the property name with the program's usual +name-prefix for variables and functions.) 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. + +@node Symbol Plists +@subsection Property List Functions for Symbols + +@defun symbol-plist symbol +This function returns the property list of @var{symbol}. +@end defun + +@defun setplist symbol plist +This function sets @var{symbol}'s property list to @var{plist}. +Normally, @var{plist} should be a well-formed property list, but this is +not enforced. The return value is @var{plist}. + +@smallexample +(setplist 'foo '(a 1 b (2 3) c nil)) + @result{} (a 1 b (2 3) c nil) +(symbol-plist 'foo) + @result{} (a 1 b (2 3) c nil) +@end smallexample + +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 +(@pxref{Abbrevs}). +@end defun + +@defun get symbol property +This function finds the value of the property named @var{property} in +@var{symbol}'s property list. If there is no such property, @code{nil} +is returned. Thus, there is no distinction between a value of +@code{nil} and the absence of the property. + +The name @var{property} is compared with the existing property names +using @code{eq}, so any object is a legitimate property. + +See @code{put} for an example. +@end defun + +@defun put symbol property value +This function puts @var{value} onto @var{symbol}'s property list under +the property name @var{property}, replacing any previous property value. +The @code{put} function returns @var{value}. + +@smallexample +(put 'fly 'verb 'transitive) + @result{}'transitive +(put 'fly 'noun '(a buzzing little bug)) + @result{} (a buzzing little bug) +(get 'fly 'verb) + @result{} transitive +(symbol-plist 'fly) + @result{} (verb transitive noun (a buzzing little bug)) +@end smallexample +@end defun + +@node Other Plists +@subsection Property Lists Outside Symbols + + These functions are useful for manipulating property lists +that are stored in places other than symbols: + +@defun plist-get plist property +This returns the value of the @var{property} property +stored in the property list @var{plist}. For example, + +@example +(plist-get '(foo 4) 'foo) + @result{} 4 +(plist-get '(foo 4 bad) 'foo) + @result{} 4 +(plist-get '(foo 4 bad) 'bar) + @result{} @code{wrong-type-argument} error +@end example + +It accepts a malformed @var{plist} argument and always returns @code{nil} +if @var{property} is not found in the @var{plist}. For example, + +@example +(plist-get '(foo 4 bad) 'bar) + @result{} nil +@end example +@end defun + +@defun plist-put plist property value +This stores @var{value} as the value of the @var{property} property in +the property list @var{plist}. It may modify @var{plist} destructively, +or it may construct a new list structure without altering the old. The +function returns the modified property list, so you can store that back +in the place where you got @var{plist}. For example, + +@example +(setq my-plist '(bar t foo 4)) + @result{} (bar t foo 4) +(setq my-plist (plist-put my-plist 'foo 69)) + @result{} (bar t foo 69) +(setq my-plist (plist-put my-plist 'quux '(a))) + @result{} (bar t foo 69 quux (a)) +@end example +@end defun + + You could define @code{put} in terms of @code{plist-put} as follows: + +@example +(defun put (symbol prop value) + (setplist symbol + (plist-put (symbol-plist symbol) prop value))) +@end example + +@defun lax-plist-get plist property +Like @code{plist-get} except that it compares properties +using @code{equal} instead of @code{eq}. +@end defun + +@defun lax-plist-put plist property value +Like @code{plist-put} except that it compares properties +using @code{equal} instead of @code{eq}. +@end defun + +@defun plist-member plist property +This returns non-@code{nil} if @var{plist} contains the given +@var{property}. Unlike @code{plist-get}, this allows you to distinguish +between a missing property and a property with the value @code{nil}. +The value is actually the tail of @var{plist} whose @code{car} is +@var{property}. +@end defun + +@ignore + arch-tag: 8750b7d2-de4c-4923-809a-d35fc39fd8ce +@end ignore diff --git a/doc/lispref/syntax.texi b/doc/lispref/syntax.texi new file mode 100644 index 00000000000..340f74632bd --- /dev/null +++ b/doc/lispref/syntax.texi @@ -0,0 +1,1185 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/syntax +@node Syntax Tables, Abbrevs, Searching and Matching, Top +@chapter Syntax Tables +@cindex parsing buffer text +@cindex syntax table +@cindex text parsing + + A @dfn{syntax table} specifies the syntactic textual function of each +character. This information is used by the @dfn{parsing functions}, the +complex movement commands, and others to determine where words, symbols, +and other syntactic constructs begin and end. The current syntax table +controls the meaning of the word motion functions (@pxref{Word Motion}) +and the list motion functions (@pxref{List Motion}), as well as the +functions in this chapter. + +@menu +* Basics: Syntax Basics. Basic concepts of syntax tables. +* Desc: Syntax Descriptors. How characters are classified. +* Syntax Table Functions:: How to create, examine and alter syntax tables. +* Syntax Properties:: Overriding syntax with text properties. +* Motion and Syntax:: Moving over characters with certain syntaxes. +* Parsing Expressions:: Parsing balanced expressions + using the syntax table. +* Standard Syntax Tables:: Syntax tables used by various major modes. +* Syntax Table Internals:: How syntax table information is stored. +* Categories:: Another way of classifying character syntax. +@end menu + +@node Syntax Basics +@section Syntax Table Concepts + +@ifnottex + A @dfn{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. The current syntax table controls +the meaning of the word motion functions (@pxref{Word Motion}) and the +list motion functions (@pxref{List Motion}) as well as the functions in +this chapter. +@end ifnottex + + A syntax table is a char-table (@pxref{Char-Tables}). The element at +index @var{c} describes the character with code @var{c}. The element's +value should be a list that encodes the syntax of the character in +question. + + Syntax tables are used only for moving across text, not for the Emacs +Lisp reader. Emacs Lisp uses built-in syntactic rules when reading Lisp +expressions, and these rules cannot be changed. (Some Lisp systems +provide ways to redefine the read syntax, but we decided to leave this +feature out of Emacs Lisp for simplicity.) + + 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 @samp{;} begins a comment, but in C mode, it +terminates a statement. To support these variations, Emacs makes the +choice of syntax table local to each buffer. Typically, each major +mode has its own syntax table and installs that table in each buffer +that 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. +@xref{Example Major Modes}, for an example of how to set up a syntax +table. + +A syntax table can inherit the data for some characters from the +standard syntax table, while specifying other characters itself. The +``inherit'' syntax class means ``inherit this character's syntax from +the standard syntax table.'' Just changing the standard syntax for a +character affects all syntax tables that inherit from it. + +@defun syntax-table-p object +This function returns @code{t} if @var{object} is a syntax table. +@end defun + +@node Syntax Descriptors +@section Syntax Descriptors +@cindex syntax class + + This section describes the syntax classes and flags that denote the +syntax of a character, and how they are represented as a @dfn{syntax +descriptor}, which is a Lisp string that you pass to +@code{modify-syntax-entry} to specify the syntax you want. + + The syntax table specifies a syntax class for each character. 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 that is often assigned that class; however, +its meaning as a designator is unvarying and independent of what syntax +that character currently has. Thus, @samp{\} as a designator character +always gives ``escape character'' syntax, regardless of what syntax +@samp{\} currently has. + +@cindex syntax descriptor + A syntax descriptor is a Lisp string that specifies a syntax class, a +matching character (used only for the 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. + + For example, the syntax descriptor for the character @samp{*} in C +mode is @samp{@w{. 23}} (i.e., punctuation, matching character slot +unused, second character of a comment-starter, first character of a +comment-ender), and the entry for @samp{/} is @samp{@w{. 14}} (i.e., +punctuation, matching character slot unused, first character of a +comment-starter, second character of a comment-ender). + +@menu +* Syntax Class Table:: Table of syntax classes. +* Syntax Flags:: Additional flags each character can have. +@end menu + +@node Syntax Class Table +@subsection Table of Syntax Classes + + Here is a table of syntax classes, the characters that stand for them, +their meanings, and examples of their use. + +@deffn {Syntax class} @w{whitespace character} +@dfn{Whitespace characters} (designated by @w{@samp{@ }} or @samp{-}) +separate symbols and words from each other. Typically, whitespace +characters have no other syntactic significance, and multiple whitespace +characters are syntactically equivalent to a single one. Space, tab, +newline and formfeed are classified as whitespace in almost all major +modes. +@end deffn + +@deffn {Syntax class} @w{word constituent} +@dfn{Word constituents} (designated by @samp{w}) are parts of words in +human languages, and are typically used in variable and command names +in programs. All upper- and lower-case letters, and the digits, are +typically word constituents. +@end deffn + +@deffn {Syntax class} @w{symbol constituent} +@dfn{Symbol constituents} (designated by @samp{_}) 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 @samp{$&*+-_<>}. In standard C, the only non-word-constituent +character that is valid in symbols is underscore (@samp{_}). +@end deffn + +@deffn {Syntax class} @w{punctuation character} +@dfn{Punctuation characters} (designated by @samp{.}) 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. +Some programming language modes, such as Emacs Lisp mode, have no +characters in this class since the few characters that are not symbol or +word constituents all have other uses. Other programming language modes, +such as C mode, use punctuation syntax for operators. +@end deffn + +@deffn {Syntax class} @w{open parenthesis character} +@deffnx {Syntax class} @w{close parenthesis character} +@cindex parenthesis syntax +Open and close @dfn{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. +@xref{Blinking}. + +The class of open parentheses is designated by @samp{(}, and that of +close parentheses by @samp{)}. + +In English text, and in C code, the parenthesis pairs are @samp{()}, +@samp{[]}, and @samp{@{@}}. In Emacs Lisp, the delimiters for lists and +vectors (@samp{()} and @samp{[]}) are classified as parenthesis +characters. +@end deffn + +@deffn {Syntax class} @w{string quote} +@dfn{String quote characters} (designated by @samp{"}) are used in +many languages, including Lisp and C, to delimit string constants. 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 (@samp{"}) +and vertical bar (@samp{|}). @samp{|} 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 (@samp{'}) 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. +@end deffn + +@deffn {Syntax class} @w{escape-syntax character} +An @dfn{escape character} (designated by @samp{\}) starts an escape +sequence such as is used in C string and character constants. The +character @samp{\} 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.) + +Characters in this class count as part of words if +@code{words-include-escapes} is non-@code{nil}. @xref{Word Motion}. +@end deffn + +@deffn {Syntax class} @w{character quote} +A @dfn{character quote character} (designated by @samp{/}) 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. + +Characters in this class count as part of words if +@code{words-include-escapes} is non-@code{nil}. @xref{Word Motion}. + +This class is used for backslash in @TeX{} mode. +@end deffn + +@deffn {Syntax class} @w{paired delimiter} +@dfn{Paired delimiter characters} (designated by @samp{$}) 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 delimiter presently---the @samp{$} that both enters and +leaves math mode. +@end deffn + +@deffn {Syntax class} @w{expression prefix} +An @dfn{expression prefix operator} (designated by @samp{'}) is used for +syntactic operators that are considered as part of an expression if they +appear next to one. In Lisp modes, these characters include the +apostrophe, @samp{'} (used for quoting), the comma, @samp{,} (used in +macros), and @samp{#} (used in the read syntax for certain data types). +@end deffn + +@deffn {Syntax class} @w{comment starter} +@deffnx {Syntax class} @w{comment ender} +@cindex comment syntax +The @dfn{comment starter} and @dfn{comment ender} characters are used in +various languages to delimit comments. These classes are designated +by @samp{<} and @samp{>}, respectively. + +English text has no comment characters. In Lisp, the semicolon +(@samp{;}) starts a comment and a newline or formfeed ends one. +@end deffn + +@deffn {Syntax class} @w{inherit standard syntax} +This syntax class does not specify a particular syntax. It says to look +in the standard syntax table to find the syntax of this character. The +designator for this syntax class is @samp{@@}. +@end deffn + +@deffn {Syntax class} @w{generic comment delimiter} +A @dfn{generic comment delimiter} (designated by @samp{!}) starts +or ends a special kind of comment. @emph{Any} generic comment delimiter +matches @emph{any} generic comment delimiter, but they cannot match +a comment starter or comment ender; generic comment delimiters can only +match each other. + +This syntax class is primarily meant for use with the +@code{syntax-table} text property (@pxref{Syntax Properties}). You can +mark any range of characters as forming a comment, by giving the first +and last characters of the range @code{syntax-table} properties +identifying them as generic comment delimiters. +@end deffn + +@deffn {Syntax class} @w{generic string delimiter} +A @dfn{generic string delimiter} (designated by @samp{|}) starts or ends +a string. This class differs from the string quote class in that @emph{any} +generic string delimiter can match any other generic string delimiter; but +they do not match ordinary string quote characters. + +This syntax class is primarily meant for use with the +@code{syntax-table} text property (@pxref{Syntax Properties}). You can +mark any range of characters as forming a string constant, by giving the +first and last characters of the range @code{syntax-table} properties +identifying them as generic string delimiters. +@end deffn + +@node Syntax Flags +@subsection Syntax Flags +@cindex syntax flags + + In addition to the classes, entries for characters in a syntax table +can specify flags. There are seven possible flags, represented by the +characters @samp{1}, @samp{2}, @samp{3}, @samp{4}, @samp{b}, @samp{n}, +and @samp{p}. + + All the flags except @samp{n} and @samp{p} are used to describe +multi-character comment delimiters. The digit flags indicate that a +character can @emph{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 @samp{*} in C mode, which is a punctuation character, @emph{and} +the second character of a start-of-comment sequence (@samp{/*}), +@emph{and} the first character of an end-of-comment sequence +(@samp{*/}). + + Here is a table of the possible flags for a character @var{c}, +and what they mean: + +@itemize @bullet +@item +@samp{1} means @var{c} is the start of a two-character comment-start +sequence. + +@item +@samp{2} means @var{c} is the second character of such a sequence. + +@item +@samp{3} means @var{c} is the start of a two-character comment-end +sequence. + +@item +@samp{4} means @var{c} is the second character of such a sequence. + +@item +@c Emacs 19 feature +@samp{b} means that @var{c} as a comment delimiter belongs to the +alternative ``b'' comment style. + +Emacs supports two comment styles simultaneously in any one syntax +table. This is for the sake of C++. Each style of comment syntax has +its own comment-start sequence and its own comment-end sequence. Each +comment must stick to one style or the other; thus, if it starts with +the comment-start sequence of style ``b,'' it must also end with the +comment-end sequence of style ``b.'' + +The two comment-start sequences must begin with the same character; only +the second character may differ. Mark the second character of the +``b''-style comment-start sequence with the @samp{b} flag. + +A comment-end sequence (one or two characters) applies to the ``b'' +style if its first character has the @samp{b} flag set; otherwise, it +applies to the ``a'' style. + +The appropriate comment syntax settings for C++ are as follows: + +@table @asis +@item @samp{/} +@samp{124b} +@item @samp{*} +@samp{23} +@item newline +@samp{>b} +@end table + +This defines four comment-delimiting sequences: + +@table @asis +@item @samp{/*} +This is a comment-start sequence for ``a'' style because the +second character, @samp{*}, does not have the @samp{b} flag. + +@item @samp{//} +This is a comment-start sequence for ``b'' style because the second +character, @samp{/}, does have the @samp{b} flag. + +@item @samp{*/} +This is a comment-end sequence for ``a'' style because the first +character, @samp{*}, does not have the @samp{b} flag. + +@item newline +This is a comment-end sequence for ``b'' style, because the newline +character has the @samp{b} flag. +@end table + +@item +@samp{n} on a comment delimiter character specifies +that this kind of comment can be nested. For a two-character +comment delimiter, @samp{n} on either character makes it +nestable. + +@item +@c Emacs 19 feature +@samp{p} identifies an additional ``prefix character'' for Lisp syntax. +These characters are treated as whitespace when they appear between +expressions. When they appear within an expression, they are handled +according to their usual syntax classes. + +The function @code{backward-prefix-chars} moves back over these +characters, as well as over characters whose primary syntax class is +prefix (@samp{'}). @xref{Motion and Syntax}. +@end itemize + +@node Syntax Table Functions +@section Syntax Table Functions + + In this section we describe functions for creating, accessing and +altering syntax tables. + +@defun make-syntax-table &optional table +This function creates a new syntax table, with all values initialized +to @code{nil}. If @var{table} is non-@code{nil}, it becomes the +parent of the new syntax table, otherwise the standard syntax table is +the parent. Like all char-tables, a syntax table inherits from its +parent. Thus the original syntax of all characters in the returned +syntax table is determined by the parent. @xref{Char-Tables}. + +Most major mode syntax tables are created in this way. +@end defun + +@defun copy-syntax-table &optional table +This function constructs a copy of @var{table} and returns it. If +@var{table} is not supplied (or is @code{nil}), it returns a copy of the +standard syntax table. Otherwise, an error is signaled if @var{table} is +not a syntax table. +@end defun + +@deffn Command modify-syntax-entry char syntax-descriptor &optional table +This function sets the syntax entry for @var{char} according to +@var{syntax-descriptor}. The syntax is changed only for @var{table}, +which defaults to the current buffer's syntax table, and not in any +other syntax table. The argument @var{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. @xref{Syntax Descriptors}. + +This function always returns @code{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 seventeen syntax class designator characters. An error is also +signaled if @var{char} is not a character. + +@example +@group +@exdent @r{Examples:} + +;; @r{Put the space character in class whitespace.} +(modify-syntax-entry ?\s " ") + @result{} nil +@end group + +@group +;; @r{Make @samp{$} an open parenthesis character,} +;; @r{with @samp{^} as its matching close.} +(modify-syntax-entry ?$ "(^") + @result{} nil +@end group + +@group +;; @r{Make @samp{^} a close parenthesis character,} +;; @r{with @samp{$} as its matching open.} +(modify-syntax-entry ?^ ")$") + @result{} nil +@end group + +@group +;; @r{Make @samp{/} a punctuation character,} +;; @r{the first character of a start-comment sequence,} +;; @r{and the second character of an end-comment sequence.} +;; @r{This is used in C mode.} +(modify-syntax-entry ?/ ". 14") + @result{} nil +@end group +@end example +@end deffn + +@defun char-syntax character +This function returns the syntax class of @var{character}, represented +by its mnemonic designator character. This returns @emph{only} the +class, not any matching parenthesis or flags. + +An error is signaled if @var{char} is not a character. + +The following examples apply to C mode. The first example shows that +the syntax class of space is whitespace (represented by a space). The +second example shows that the syntax of @samp{/} is punctuation. This +does not show the fact that it is also part of comment-start and -end +sequences. 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, @samp{)}. + +@example +@group +(string (char-syntax ?\s)) + @result{} " " +@end group + +@group +(string (char-syntax ?/)) + @result{} "." +@end group + +@group +(string (char-syntax ?\()) + @result{} "(" +@end group +@end example + +We use @code{string} to make it easier to see the character returned by +@code{char-syntax}. +@end defun + +@defun set-syntax-table table +This function makes @var{table} the syntax table for the current buffer. +It returns @var{table}. +@end defun + +@defun syntax-table +This function returns the current syntax table, which is the table for +the current buffer. +@end defun + +@defmac with-syntax-table @var{table} @var{body}@dots{} +This macro executes @var{body} using @var{table} as the current syntax +table. It returns the value of the last form in @var{body}, after +restoring the old current syntax table. + +Since each buffer has its own current syntax table, we should make that +more precise: @code{with-syntax-table} temporarily alters the current +syntax table of whichever buffer is current at the time the macro +execution starts. Other buffers are not affected. +@end defmac + +@node Syntax Properties +@section Syntax Properties +@kindex syntax-table @r{(text property)} + +When the syntax table is not flexible enough to specify the syntax of +a language, you can use @code{syntax-table} text properties to +override the syntax table for specific character occurrences in the +buffer. @xref{Text Properties}. You can use Font Lock mode to set +@code{syntax-table} text properties. @xref{Setting Syntax +Properties}. + +The valid values of @code{syntax-table} text property are: + +@table @asis +@item @var{syntax-table} +If the property value is a syntax table, that table is used instead of +the current buffer's syntax table to determine the syntax for this +occurrence of the character. + +@item @code{(@var{syntax-code} . @var{matching-char})} +A cons cell of this format specifies the syntax for this +occurrence of the character. (@pxref{Syntax Table Internals}) + +@item @code{nil} +If the property is @code{nil}, the character's syntax is determined from +the current syntax table in the usual way. +@end table + +@defvar parse-sexp-lookup-properties +If this is non-@code{nil}, the syntax scanning functions pay attention +to syntax text properties. Otherwise they use only the current syntax +table. +@end defvar + +@node Motion and Syntax +@section Motion and Syntax + + This section describes functions for moving across characters that +have certain syntax classes. + +@defun skip-syntax-forward syntaxes &optional limit +This function moves point forward across characters having syntax +classes mentioned in @var{syntaxes} (a string of syntax class +characters). It stops when it encounters the end of the buffer, or +position @var{limit} (if specified), or a character it is not supposed +to skip. + +If @var{syntaxes} starts with @samp{^}, then the function skips +characters whose syntax is @emph{not} in @var{syntaxes}. + +The return value is the distance traveled, which is a nonnegative +integer. +@end defun + +@defun skip-syntax-backward syntaxes &optional limit +This function moves point backward across characters whose syntax +classes are mentioned in @var{syntaxes}. It stops when it encounters +the beginning of the buffer, or position @var{limit} (if specified), or +a character it is not supposed to skip. + +If @var{syntaxes} starts with @samp{^}, then the function skips +characters whose syntax is @emph{not} in @var{syntaxes}. + +The return value indicates the distance traveled. It is an integer that +is zero or less. +@end defun + +@defun backward-prefix-chars +This function moves point backward over any number of characters with +expression prefix syntax. This includes both characters in the +expression prefix syntax class, and characters with the @samp{p} flag. +@end defun + +@node Parsing Expressions +@section Parsing Expressions + + This section describes functions for parsing and scanning balanced +expressions, also known as @dfn{sexps}. Basically, a sexp is either a +balanced parenthetical grouping, a string, or a symbol name (a +sequence of characters whose syntax is either word constituent or +symbol constituent). However, characters whose syntax is expression +prefix are treated as part of the sexp if they appear next to it. + + 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. @xref{List Motion}, for convenient +higher-level functions for moving over balanced expressions. + + A character's syntax controls how it changes the state of the +parser, rather than describing the state itself. For example, a +string delimiter character toggles the parser state between +``in-string'' and ``in-code,'' but the syntax of characters does not +directly say whether they are inside a string. For example (note that +15 is the syntax code for generic string delimiters), + +@example +(put-text-property 1 9 'syntax-table '(15 . nil)) +@end example + +@noindent +does not tell Emacs that the first eight chars of the current buffer +are a string, but rather that they are all string delimiters. As a +result, Emacs treats them as four consecutive empty string constants. + +@menu +* Motion via Parsing:: Motion functions that work by parsing. +* Position Parse:: Determining the syntactic state of a position. +* Parser State:: How Emacs represents a syntactic state. +* Low-Level Parsing:: Parsing across a specified region. +* Control Parsing:: Parameters that affect parsing. +@end menu + +@node Motion via Parsing +@subsection Motion Commands Based on Parsing + + This section describes simple point-motion functions that operate +based on parsing expressions. + +@defun scan-lists from count depth +This function scans forward @var{count} balanced parenthetical groupings +from position @var{from}. It returns the position where the scan stops. +If @var{count} is negative, the scan moves backwards. + +If @var{depth} is nonzero, parenthesis depth counting begins from that +value. The only candidates for stopping are places where the depth in +parentheses becomes zero; @code{scan-lists} counts @var{count} such +places and then stops. Thus, a positive value for @var{depth} means go +out @var{depth} levels of parenthesis. + +Scanning ignores comments if @code{parse-sexp-ignore-comments} is +non-@code{nil}. + +If the scan reaches the beginning or end of the buffer (or its +accessible portion), and the depth is not zero, an error is signaled. +If the depth is zero but the count is not used up, @code{nil} is +returned. +@end defun + +@defun scan-sexps from count +This function scans forward @var{count} sexps from position @var{from}. +It returns the position where the scan stops. If @var{count} is +negative, the scan moves backwards. + +Scanning ignores comments if @code{parse-sexp-ignore-comments} is +non-@code{nil}. + +If the scan reaches the beginning or end of (the accessible part of) the +buffer while in the middle of a parenthetical grouping, an error is +signaled. If it reaches the beginning or end between groupings but +before count is used up, @code{nil} is returned. +@end defun + +@defun forward-comment count +This function moves point forward across @var{count} complete comments + (that is, including the starting delimiter and the terminating +delimiter if any), plus any whitespace encountered on the way. It +moves backward if @var{count} is negative. If it encounters anything +other than a comment or whitespace, it stops, leaving point at the +place where it stopped. This includes (for instance) finding the end +of a comment when moving forward and expecting the beginning of one. +The function also stops immediately after moving over the specified +number of complete comments. If @var{count} comments are found as +expected, with nothing except whitespace between them, it returns +@code{t}; otherwise it returns @code{nil}. + +This function cannot tell whether the ``comments'' it traverses are +embedded within a string. If they look like comments, it treats them +as comments. +@end defun + +To move forward over all comments and whitespace following point, use +@code{(forward-comment (buffer-size))}. @code{(buffer-size)} is a good +argument to use, because the number of comments in the buffer cannot +exceed that many. + +@node Position Parse +@subsection Finding the Parse State for a Position + + For syntactic analysis, such as in indentation, often the useful +thing is to compute the syntactic state corresponding to a given buffer +position. This function does that conveniently. + +@defun syntax-ppss &optional pos +This function returns the parser state (see next section) that the +parser would reach at position @var{pos} starting from the beginning +of the buffer. This is equivalent to @code{(parse-partial-sexp +(point-min) @var{pos})}, except that @code{syntax-ppss} uses a cache +to speed up the computation. Due to this optimization, the 2nd value +(previous complete subexpression) and 6th value (minimum parenthesis +depth) of the returned parser state are not meaningful. +@end defun + + @code{syntax-ppss} automatically hooks itself to +@code{before-change-functions} to keep its cache consistent. But +updating can fail if @code{syntax-ppss} is called while +@code{before-change-functions} is temporarily let-bound, or if the +buffer is modified without obeying the hook, such as when using +@code{inhibit-modification-hooks}. For this reason, it is sometimes +necessary to flush the cache manually. + +@defun syntax-ppss-flush-cache beg +This function flushes the cache used by @code{syntax-ppss}, starting at +position @var{beg}. +@end defun + + Major modes can make @code{syntax-ppss} run faster by specifying +where it needs to start parsing. + +@defvar syntax-begin-function +If this is non-@code{nil}, it should be a function that moves to an +earlier buffer position where the parser state is equivalent to +@code{nil}---in other words, a position outside of any comment, +string, or parenthesis. @code{syntax-ppss} uses it to further +optimize its computations, when the cache gives no help. +@end defvar + +@node Parser State +@subsection Parser State +@cindex parser state + + A @dfn{parser state} is a list of ten elements describing the final +state of parsing text syntactically as part of an expression. The +parsing functions in the following sections return a parser state as +the value, and in some cases accept one as an argument also, so that +you can resume parsing after it stops. Here are the meanings of the +elements of the parser state: + +@enumerate 0 +@item +The depth in parentheses, counting from 0. @strong{Warning:} this can +be negative if there are more close parens than open parens between +the start of the defun and point. + +@item +@cindex innermost containing parentheses +The character position of the start of the innermost parenthetical +grouping containing the stopping point; @code{nil} if none. + +@item +@cindex previous complete subexpression +The character position of the start of the last complete subexpression +terminated; @code{nil} if none. + +@item +@cindex inside string +Non-@code{nil} if inside a string. More precisely, this is the +character that will terminate the string, or @code{t} if a generic +string delimiter character should terminate it. + +@item +@cindex inside comment +@code{t} if inside a comment (of either style), +or the comment nesting level if inside a kind of comment +that can be nested. + +@item +@cindex quote character +@code{t} if point is just after a quote character. + +@item +The minimum parenthesis depth encountered during this scan. + +@item +What kind of comment is active: @code{nil} for a comment of style +``a'' or when not inside a comment, @code{t} for a comment of style +``b,'' and @code{syntax-table} for a comment that should be ended by a +generic comment delimiter character. + +@item +The string or comment start position. While inside a comment, this is +the position where the comment began; while inside a string, this is the +position where the string began. When outside of strings and comments, +this element is @code{nil}. + +@item +Internal data for continuing the parsing. The meaning of this +data is subject to change; it is used if you pass this list +as the @var{state} argument to another call. +@end enumerate + + Elements 1, 2, and 6 are ignored in a state which you pass as an +argument to continue parsing, and elements 8 and 9 are used only in +trivial cases. Those elements serve primarily to convey information +to the Lisp program which does the parsing. + + One additional piece of useful information is available from a +parser state using this function: + +@defun syntax-ppss-toplevel-pos state +This function extracts, from parser state @var{state}, the last +position scanned in the parse which was at top level in grammatical +structure. ``At top level'' means outside of any parentheses, +comments, or strings. + +The value is @code{nil} if @var{state} represents a parse which has +arrived at a top level position. +@end defun + + We have provided this access function rather than document how the +data is represented in the state, because we plan to change the +representation in the future. + +@node Low-Level Parsing +@subsection Low-Level Parsing + + The most basic way to use the expression parser is to tell it +to start at a given position with a certain state, and parse up to +a specified end position. + +@defun parse-partial-sexp start limit &optional target-depth stop-before state stop-comment +This function parses a sexp in the current buffer starting at +@var{start}, not scanning past @var{limit}. It stops at position +@var{limit} or when certain criteria described below are met, and sets +point to the location where parsing stops. It returns a parser state +describing the status of the parse at the point where it stops. + +@cindex parenthesis depth +If the third argument @var{target-depth} is non-@code{nil}, parsing +stops if the depth in parentheses becomes equal to @var{target-depth}. +The depth starts at 0, or at whatever is given in @var{state}. + +If the fourth argument @var{stop-before} is non-@code{nil}, parsing +stops when it comes to any character that starts a sexp. If +@var{stop-comment} is non-@code{nil}, parsing stops when it comes to the +start of a comment. If @var{stop-comment} is the symbol +@code{syntax-table}, parsing stops after the start of a comment or a +string, or the end of a comment or a string, whichever comes first. + +If @var{state} is @code{nil}, @var{start} is assumed to be at the top +level of parenthesis structure, such as the beginning of a function +definition. Alternatively, you might wish to resume parsing in the +middle of the structure. To do this, you must provide a @var{state} +argument that describes the initial status of parsing. The value +returned by a previous call to @code{parse-partial-sexp} will do +nicely. +@end defun + +@node Control Parsing +@subsection Parameters to Control Parsing + +@defvar multibyte-syntax-as-symbol +If this variable is non-@code{nil}, @code{scan-sexps} treats all +non-@acronym{ASCII} characters as symbol constituents regardless +of what the syntax table says about them. (However, text properties +can still override the syntax.) +@end defvar + +@defopt parse-sexp-ignore-comments +@cindex skipping comments +If the value is non-@code{nil}, then comments are treated as +whitespace by the functions in this section and by @code{forward-sexp}, +@code{scan-lists} and @code{scan-sexps}. +@end defopt + +@vindex parse-sexp-lookup-properties +The behavior of @code{parse-partial-sexp} is also affected by +@code{parse-sexp-lookup-properties} (@pxref{Syntax Properties}). + +You can use @code{forward-comment} to move forward or backward over +one comment or several comments. + +@node Standard Syntax Tables +@section Some Standard Syntax Tables + + Most of the major modes in Emacs have their own syntax tables. Here +are several of them: + +@defun standard-syntax-table +This function returns the standard syntax table, which is the syntax +table used in Fundamental mode. +@end defun + +@defvar text-mode-syntax-table +The value of this variable is the syntax table used in Text mode. +@end defvar + +@defvar c-mode-syntax-table +The value of this variable is the syntax table for C-mode buffers. +@end defvar + +@defvar 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 @code{read} +function.) +@end defvar + +@node Syntax Table Internals +@section Syntax Table Internals +@cindex syntax table internals + + Lisp programs don't usually work with the elements directly; the +Lisp-level syntax table functions usually work with syntax descriptors +(@pxref{Syntax Descriptors}). Nonetheless, here we document the +internal format. This format is used mostly when manipulating +syntax properties. + + Each element of a syntax table is a cons cell of the form +@code{(@var{syntax-code} . @var{matching-char})}. The @sc{car}, +@var{syntax-code}, is an integer that encodes the syntax class, and any +flags. The @sc{cdr}, @var{matching-char}, is non-@code{nil} if +a character to match was specified. + + This table gives the value of @var{syntax-code} which corresponds +to each syntactic type. + +@multitable @columnfractions .05 .3 .3 .31 +@item +@tab +@i{Integer} @i{Class} +@tab +@i{Integer} @i{Class} +@tab +@i{Integer} @i{Class} +@item +@tab +0 @ @ whitespace +@tab +5 @ @ close parenthesis +@tab +10 @ @ character quote +@item +@tab +1 @ @ punctuation +@tab +6 @ @ expression prefix +@tab +11 @ @ comment-start +@item +@tab +2 @ @ word +@tab +7 @ @ string quote +@tab +12 @ @ comment-end +@item +@tab +3 @ @ symbol +@tab +8 @ @ paired delimiter +@tab +13 @ @ inherit +@item +@tab +4 @ @ open parenthesis +@tab +9 @ @ escape +@tab +14 @ @ generic comment +@item +@tab +15 @ generic string +@end multitable + + For example, the usual syntax value for @samp{(} is @code{(4 . 41)}. +(41 is the character code for @samp{)}.) + + The flags are encoded in higher order bits, starting 16 bits from the +least significant bit. This table gives the power of two which +corresponds to each syntax flag. + +@multitable @columnfractions .05 .3 .3 .3 +@item +@tab +@i{Prefix} @i{Flag} +@tab +@i{Prefix} @i{Flag} +@tab +@i{Prefix} @i{Flag} +@item +@tab +@samp{1} @ @ @code{(lsh 1 16)} +@tab +@samp{4} @ @ @code{(lsh 1 19)} +@tab +@samp{b} @ @ @code{(lsh 1 21)} +@item +@tab +@samp{2} @ @ @code{(lsh 1 17)} +@tab +@samp{p} @ @ @code{(lsh 1 20)} +@tab +@samp{n} @ @ @code{(lsh 1 22)} +@item +@tab +@samp{3} @ @ @code{(lsh 1 18)} +@end multitable + +@defun string-to-syntax @var{desc} +This function returns the internal form corresponding to the syntax +descriptor @var{desc}, a cons cell @code{(@var{syntax-code} +. @var{matching-char})}. +@end defun + +@defun syntax-after pos +This function returns the syntax code of the character in the buffer +after position @var{pos}, taking account of syntax properties as well +as the syntax table. If @var{pos} is outside the buffer's accessible +portion (@pxref{Narrowing, accessible portion}), this function returns +@code{nil}. +@end defun + +@defun syntax-class syntax +This function returns the syntax class of the syntax code +@var{syntax}. (It masks off the high 16 bits that hold the flags +encoded in the syntax descriptor.) If @var{syntax} is @code{nil}, it +returns @code{nil}; this is so evaluating the expression + +@example +(syntax-class (syntax-after pos)) +@end example + +@noindent +where @code{pos} is outside the buffer's accessible portion, will +yield @code{nil} without throwing errors or producing wrong syntax +class codes. +@end defun + +@node Categories +@section Categories +@cindex categories of characters +@cindex character categories + + @dfn{Categories} provide an alternate way of classifying characters +syntactically. You can define several categories as needed, then +independently assign each character to one or more categories. Unlike +syntax classes, categories are not mutually exclusive; it is normal for +one character to belong to several categories. + +@cindex category table + Each buffer has a @dfn{category table} which records which categories +are defined and also which characters belong to each category. Each +category table defines its own categories, but normally these are +initialized by copying from the standard categories table, so that the +standard categories are available in all modes. + + Each category has a name, which is an @acronym{ASCII} printing character in +the range @w{@samp{ }} to @samp{~}. You specify the name of a category +when you define it with @code{define-category}. + + The category table is actually a char-table (@pxref{Char-Tables}). +The element of the category table at index @var{c} is a @dfn{category +set}---a bool-vector---that indicates which categories character @var{c} +belongs to. In this category set, if the element at index @var{cat} is +@code{t}, that means category @var{cat} is a member of the set, and that +character @var{c} belongs to category @var{cat}. + +For the next three functions, the optional argument @var{table} +defaults to the current buffer's category table. + +@defun define-category char docstring &optional table +This function defines a new category, with name @var{char} and +documentation @var{docstring}, for the category table @var{table}. +@end defun + +@defun category-docstring category &optional table +This function returns the documentation string of category @var{category} +in category table @var{table}. + +@example +(category-docstring ?a) + @result{} "ASCII" +(category-docstring ?l) + @result{} "Latin" +@end example +@end defun + +@defun get-unused-category &optional table +This function returns a category name (a character) which is not +currently defined in @var{table}. If all possible categories are in use +in @var{table}, it returns @code{nil}. +@end defun + +@defun category-table +This function returns the current buffer's category table. +@end defun + +@defun category-table-p object +This function returns @code{t} if @var{object} is a category table, +otherwise @code{nil}. +@end defun + +@defun standard-category-table +This function returns the standard category table. +@end defun + +@defun copy-category-table &optional table +This function constructs a copy of @var{table} and returns it. If +@var{table} is not supplied (or is @code{nil}), it returns a copy of the +standard category table. Otherwise, an error is signaled if @var{table} +is not a category table. +@end defun + +@defun set-category-table table +This function makes @var{table} the category table for the current +buffer. It returns @var{table}. +@end defun + +@defun make-category-table +This creates and returns an empty category table. In an empty category +table, no categories have been allocated, and no characters belong to +any categories. +@end defun + +@defun make-category-set categories +This function returns a new category set---a bool-vector---whose initial +contents are the categories listed in the string @var{categories}. The +elements of @var{categories} should be category names; the new category +set has @code{t} for each of those categories, and @code{nil} for all +other categories. + +@example +(make-category-set "al") + @result{} #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0" +@end example +@end defun + +@defun char-category-set char +This function returns the category set for character @var{char} in the +current buffer's category table. This is the bool-vector which +records which categories the character @var{char} belongs to. The +function @code{char-category-set} does not allocate storage, because +it returns the same bool-vector that exists in the category table. + +@example +(char-category-set ?a) + @result{} #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0" +@end example +@end defun + +@defun category-set-mnemonics category-set +This function converts the category set @var{category-set} into a string +containing the characters that designate the categories that are members +of the set. + +@example +(category-set-mnemonics (char-category-set ?a)) + @result{} "al" +@end example +@end defun + +@defun modify-category-entry character category &optional table reset +This function modifies the category set of @var{character} in category +table @var{table} (which defaults to the current buffer's category +table). + +Normally, it modifies the category set by adding @var{category} to it. +But if @var{reset} is non-@code{nil}, then it deletes @var{category} +instead. +@end defun + +@deffn Command describe-categories &optional buffer-or-name +This function describes the category specifications in the current +category table. It inserts the descriptions in a buffer, and then +displays that buffer. If @var{buffer-or-name} is non-@code{nil}, it +describes the category table of that buffer instead. +@end deffn + +@ignore + arch-tag: 4d914e96-0283-445c-9233-75d33662908c +@end ignore diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi new file mode 100644 index 00000000000..430c48133ee --- /dev/null +++ b/doc/lispref/text.texi @@ -0,0 +1,4303 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/text +@node Text, Non-ASCII Characters, Markers, Top +@chapter Text +@cindex 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 operating at point or on text adjacent to point. Many are +interactive. All the functions that change the text provide for undoing +the changes (@pxref{Undo}). + + Many text-related functions operate on a region of text defined by two +buffer positions passed in arguments named @var{start} and @var{end}. +These arguments should be either markers (@pxref{Markers}) or numeric +character positions (@pxref{Positions}). The order of these arguments +does not matter; it is all right for @var{start} to be the end of the +region and @var{end} the beginning. For example, @code{(delete-region 1 +10)} and @code{(delete-region 10 1)} are equivalent. An +@code{args-out-of-range} error is signaled if either @var{start} or +@var{end} is outside the accessible portion of the buffer. In an +interactive call, point and the mark are used for these arguments. + +@cindex buffer contents + Throughout this chapter, ``text'' refers to the characters in the +buffer, together with their properties (when relevant). Keep in mind +that point is always between two characters, and the cursor appears on +the character after point. + +@menu +* Near Point:: Examining text in the vicinity of point. +* Buffer Contents:: Examining text in a general fashion. +* Comparing Text:: Comparing substrings of buffers. +* Insertion:: Adding new text to a buffer. +* Commands for Insertion:: User-level commands to insert text. +* Deletion:: Removing text from a buffer. +* User-Level Deletion:: User-level commands to delete text. +* The Kill Ring:: Where removed text sometimes is saved for later use. +* Undo:: Undoing changes to the text of a buffer. +* Maintaining Undo:: How to enable and disable undo information. + How to control how much information is kept. +* Filling:: Functions for explicit filling. +* Margins:: How to specify margins for filling commands. +* Adaptive Fill:: Adaptive Fill mode chooses a fill prefix from context. +* Auto Filling:: How auto-fill mode is implemented to break lines. +* Sorting:: Functions for sorting parts of the buffer. +* Columns:: Computing horizontal positions, and using them. +* Indentation:: Functions to insert or adjust indentation. +* Case Changes:: Case conversion of parts of the buffer. +* Text Properties:: Assigning Lisp property lists to text characters. +* Substitution:: Replacing a given character wherever it appears. +* Transposition:: Swapping two portions of a buffer. +* Registers:: How registers are implemented. Accessing the text or + position stored in a register. +* Base 64:: Conversion to or from base 64 encoding. +* MD5 Checksum:: Compute the MD5 "message digest"/"checksum". +* Atomic Changes:: Installing several buffer changes "atomically". +* Change Hooks:: Supplying functions to be run when text is changed. +@end menu + +@node Near Point +@section Examining Text Near Point +@cindex text near point + + Many functions are provided to look at the characters around point. +Several simple functions are described here. See also @code{looking-at} +in @ref{Regexp Search}. + +In the following four functions, ``beginning'' or ``end'' of buffer +refers to the beginning or end of the accessible portion. + +@defun char-after &optional position +This function returns the character in the current buffer at (i.e., +immediately after) position @var{position}. If @var{position} is out of +range for this purpose, either before the beginning of the buffer, or at +or beyond the end, then the value is @code{nil}. The default for +@var{position} is point. + +In the following example, assume that the first character in the +buffer is @samp{@@}: + +@example +@group +(char-to-string (char-after 1)) + @result{} "@@" +@end group +@end example +@end defun + +@defun char-before &optional position +This function returns the character in the current buffer immediately +before position @var{position}. If @var{position} is out of range for +this purpose, either at or before the beginning of the buffer, or beyond +the end, then the value is @code{nil}. The default for +@var{position} is point. +@end defun + +@defun following-char +This function returns the character following point in the current +buffer. This is similar to @code{(char-after (point))}. However, if +point is at the end of the buffer, then @code{following-char} returns 0. + +Remember that point is always between characters, and the cursor +normally appears over the character following point. Therefore, the +character returned by @code{following-char} is the character the +cursor is over. + +In this example, point is between the @samp{a} and the @samp{c}. + +@example +@group +---------- Buffer: foo ---------- +Gentlemen may cry ``Pea@point{}ce! Peace!,'' +but there is no peace. +---------- Buffer: foo ---------- +@end group + +@group +(char-to-string (preceding-char)) + @result{} "a" +(char-to-string (following-char)) + @result{} "c" +@end group +@end example +@end defun + +@defun preceding-char +This function returns the character preceding point in the current +buffer. See above, under @code{following-char}, for an example. If +point is at the beginning of the buffer, @code{preceding-char} returns +0. +@end defun + +@defun bobp +This function returns @code{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 @code{point-min} in +@ref{Point}. +@end defun + +@defun eobp +This function returns @code{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 @code{point-max} in @xref{Point}. +@end defun + +@defun bolp +This function returns @code{t} if point is at the beginning of a line. +@xref{Text Lines}. The beginning of the buffer (or of its accessible +portion) always counts as the beginning of a line. +@end defun + +@defun eolp +This function returns @code{t} if point is at the end of a line. The +end of the buffer (or of its accessible portion) is always considered +the end of a line. +@end defun + +@node Buffer Contents +@section Examining Buffer Contents + + This section describes functions that allow a Lisp program to +convert any portion of the text in the buffer into a string. + +@defun buffer-substring start end +This function returns a string containing a copy of the text of the +region defined by positions @var{start} and @var{end} in the current +buffer. If the arguments are not positions in the accessible portion of +the buffer, @code{buffer-substring} signals an @code{args-out-of-range} +error. + +It is not necessary for @var{start} to be less than @var{end}; the +arguments can be given in either order. But most often the smaller +argument is written first. + +Here's an example which assumes Font-Lock mode is not enabled: + +@example +@group +---------- Buffer: foo ---------- +This is the contents of buffer foo + +---------- Buffer: foo ---------- +@end group + +@group +(buffer-substring 1 10) + @result{} "This is t" +@end group +@group +(buffer-substring (point-max) 10) + @result{} "he contents of buffer foo\n" +@end group +@end example + +If the text being copied has any text properties, these are copied into +the string along with the characters they belong to. @xref{Text +Properties}. However, overlays (@pxref{Overlays}) in the buffer and +their properties are ignored, not copied. + +For example, if Font-Lock mode is enabled, you might get results like +these: + +@example +@group +(buffer-substring 1 10) + @result{} #("This is t" 0 1 (fontified t) 1 9 (fontified t)) +@end group +@end example +@end defun + +@defun buffer-substring-no-properties start end +This is like @code{buffer-substring}, except that it does not copy text +properties, just the characters themselves. @xref{Text Properties}. +@end defun + +@defun filter-buffer-substring start end &optional delete noprops +This function passes the buffer text between @var{start} and @var{end} +through the filter functions specified by the variable +@code{buffer-substring-filters}, and returns the value from the last +filter function. If @code{buffer-substring-filters} is @code{nil}, +the value is the unaltered text from the buffer, what +@code{buffer-substring} would return. + +If @var{delete} is non-@code{nil}, this function deletes the text +between @var{start} and @var{end} after copying it, like +@code{delete-and-extract-region}. + +If @var{noprops} is non-@code{nil}, the final string returned does not +include text properties, while the string passed through the filters +still includes text properties from the buffer text. + +Lisp code should use this function instead of @code{buffer-substring}, +@code{buffer-substring-no-properties}, +or @code{delete-and-extract-region} when copying into user-accessible +data structures such as the kill-ring, X clipboard, and registers. +Major and minor modes can add functions to +@code{buffer-substring-filters} to alter such text as it is copied out +of the buffer. +@end defun + +@defvar buffer-substring-filters +This variable should be a list of functions that accept a single +argument, a string, and return a string. +@code{filter-buffer-substring} passes the buffer substring to the +first function in this list, and the return value of each function is +passed to the next function. The return value of the last function is +used as the return value of @code{filter-buffer-substring}. + +As a special convention, point is set to the start of the buffer text +being operated on (i.e., the @var{start} argument for +@code{filter-buffer-substring}) before these functions are called. + +If this variable is @code{nil}, no filtering is performed. +@end defvar + +@defun buffer-string +This function returns the contents of the entire accessible portion of +the current buffer as a string. It is equivalent to + +@example +(buffer-substring (point-min) (point-max)) +@end example + +@example +@group +---------- Buffer: foo ---------- +This is the contents of buffer foo + +---------- Buffer: foo ---------- + +(buffer-string) + @result{} "This is the contents of buffer foo\n" +@end group +@end example +@end defun + +@defun current-word &optional strict really-word +This function returns the symbol (or word) at or near point, as a string. +The return value includes no text properties. + +If the optional argument @var{really-word} is non-@code{nil}, it finds a +word; otherwise, it finds a symbol (which includes both word +characters and symbol constituent characters). + +If the optional argument @var{strict} is non-@code{nil}, then point +must be in or next to the symbol or word---if no symbol or word is +there, the function returns @code{nil}. Otherwise, a nearby symbol or +word on the same line is acceptable. +@end defun + +@defun thing-at-point thing +Return the @var{thing} around or next to point, as a string. + +The argument @var{thing} is a symbol which specifies a kind of syntactic +entity. Possibilities include @code{symbol}, @code{list}, @code{sexp}, +@code{defun}, @code{filename}, @code{url}, @code{word}, @code{sentence}, +@code{whitespace}, @code{line}, @code{page}, and others. + +@example +---------- Buffer: foo ---------- +Gentlemen may cry ``Pea@point{}ce! Peace!,'' +but there is no peace. +---------- Buffer: foo ---------- + +(thing-at-point 'word) + @result{} "Peace" +(thing-at-point 'line) + @result{} "Gentlemen may cry ``Peace! Peace!,''\n" +(thing-at-point 'whitespace) + @result{} nil +@end example +@end defun + +@node Comparing Text +@section Comparing Text +@cindex comparing buffer text + + This function lets you compare portions of the text in a buffer, without +copying them into strings first. + +@defun compare-buffer-substrings buffer1 start1 end1 buffer2 start2 end2 +This function lets you compare two substrings of the same buffer or two +different buffers. The first three arguments specify one substring, +giving a buffer (or a buffer name) and two positions within the +buffer. The last three arguments specify the other substring in the +same way. You can use @code{nil} for @var{buffer1}, @var{buffer2}, or +both to stand for the current buffer. + +The value is negative if the first substring is less, positive if the +first is greater, and zero if they are equal. The absolute value of +the result is one plus the index of the first differing characters +within the substrings. + +This function ignores case when comparing characters +if @code{case-fold-search} is non-@code{nil}. It always ignores +text properties. + +Suppose the current buffer contains the text @samp{foobarbar +haha!rara!}; then in this example the two substrings are @samp{rbar } +and @samp{rara!}. The value is 2 because the first substring is greater +at the second character. + +@example +(compare-buffer-substrings nil 6 11 nil 16 21) + @result{} 2 +@end example +@end defun + +@node Insertion +@section Inserting Text +@cindex insertion of text +@cindex text insertion + +@cindex insertion before point +@cindex before point, insertion + @dfn{Insertion} means adding new text to a buffer. The inserted text +goes at point---between the character before point and the character +after point. Some insertion functions leave point before the inserted +text, while other functions leave it after. We call the former +insertion @dfn{after point} and the latter insertion @dfn{before point}. + + Insertion relocates markers that point at positions after the +insertion point, so that they stay with the surrounding text +(@pxref{Markers}). When a marker points at the place of insertion, +insertion may or may not relocate the marker, depending on the marker's +insertion type (@pxref{Marker Insertion Types}). Certain special +functions such as @code{insert-before-markers} relocate all such markers +to point after the inserted text, regardless of the markers' insertion +type. + + Insertion functions signal an error if the current buffer is +read-only or if they insert within read-only text. + + These functions copy text characters from strings and buffers along +with their properties. The inserted characters have exactly the same +properties as the characters they were copied from. By contrast, +characters specified as separate arguments, not part of a string or +buffer, inherit their text properties from the neighboring text. + + The insertion functions convert text from unibyte to multibyte in +order to insert in a multibyte buffer, and vice versa---if the text +comes from a string or from a buffer. However, they do not convert +unibyte character codes 128 through 255 to multibyte characters, not +even if the current buffer is a multibyte buffer. @xref{Converting +Representations}. + +@defun insert &rest args +This function inserts the strings and/or characters @var{args} into the +current buffer, at point, moving point forward. In other words, it +inserts the text before point. An error is signaled unless all +@var{args} are either strings or characters. The value is @code{nil}. +@end defun + +@defun insert-before-markers &rest args +This function inserts the strings and/or characters @var{args} into the +current buffer, at point, moving point forward. An error is signaled +unless all @var{args} are either strings or characters. The value is +@code{nil}. + +This function is unlike the other insertion functions in that it +relocates markers initially pointing at the insertion point, to point +after the inserted text. If an overlay begins at the insertion point, +the inserted text falls outside the overlay; if a nonempty overlay +ends at the insertion point, the inserted text falls inside that +overlay. +@end defun + +@defun insert-char character count &optional inherit +This function inserts @var{count} instances of @var{character} into the +current buffer before point. The argument @var{count} should be an +integer, and @var{character} must be a character. The value is @code{nil}. + +This function does not convert unibyte character codes 128 through 255 +to multibyte characters, not even if the current buffer is a multibyte +buffer. @xref{Converting Representations}. + +If @var{inherit} is non-@code{nil}, then the inserted characters inherit +sticky text properties from the two characters before and after the +insertion point. @xref{Sticky Properties}. +@end defun + +@defun insert-buffer-substring from-buffer-or-name &optional start end +This function inserts a portion of buffer @var{from-buffer-or-name} +(which must already exist) into the current buffer before point. The +text inserted is the region between @var{start} and @var{end}. (These +arguments default to the beginning and end of the accessible portion of +that buffer.) This function returns @code{nil}. + +In this example, the form is executed with buffer @samp{bar} as the +current buffer. We assume that buffer @samp{bar} is initially empty. + +@example +@group +---------- Buffer: foo ---------- +We hold these truths to be self-evident, that all +---------- Buffer: foo ---------- +@end group + +@group +(insert-buffer-substring "foo" 1 20) + @result{} nil + +---------- Buffer: bar ---------- +We hold these truth@point{} +---------- Buffer: bar ---------- +@end group +@end example +@end defun + +@defun insert-buffer-substring-no-properties from-buffer-or-name &optional start end +This is like @code{insert-buffer-substring} except that it does not +copy any text properties. +@end defun + + @xref{Sticky Properties}, for other insertion functions that inherit +text properties from the nearby text in addition to inserting it. +Whitespace inserted by indentation functions also inherits text +properties. + +@node Commands for Insertion +@section 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. + +@deffn Command insert-buffer from-buffer-or-name +This command inserts the entire accessible contents of +@var{from-buffer-or-name} (which must exist) into the current buffer +after point. It leaves the mark after the inserted text. The value +is @code{nil}. +@end deffn + +@deffn Command self-insert-command count +@cindex character insertion +@cindex self-insertion +This command inserts the last character typed; it does so @var{count} +times, before point, and returns @code{nil}. Most printing characters +are bound to this command. In routine use, @code{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, @var{count} is the numeric prefix argument. + +Self-insertion translates the input character through +@code{translation-table-for-input}. @xref{Translation of Characters}. + +This command calls @code{auto-fill-function} whenever that is +non-@code{nil} and the character inserted is in the table +@code{auto-fill-chars} (@pxref{Auto Filling}). + +@c Cross refs reworded to prevent overfull hbox. --rjc 15mar92 +This command performs abbrev expansion if Abbrev mode is enabled and +the inserted character does not have word-constituent +syntax. (@xref{Abbrevs}, and @ref{Syntax Class Table}.) It is also +responsible for calling @code{blink-paren-function} when the inserted +character has close parenthesis syntax (@pxref{Blinking}). + +Do not try substituting your own definition of +@code{self-insert-command} for the standard one. The editor command +loop handles this function specially. +@end deffn + +@deffn Command newline &optional number-of-newlines +This command inserts newlines into the current buffer before point. +If @var{number-of-newlines} is supplied, that many newline characters +are inserted. + +@cindex newline and Auto Fill mode +This function calls @code{auto-fill-function} if the current column +number is greater than the value of @code{fill-column} and +@var{number-of-newlines} is @code{nil}. Typically what +@code{auto-fill-function} does is insert a newline; thus, the overall +result in this case is to insert two newlines at different places: one +at point, and another earlier in the line. @code{newline} does not +auto-fill if @var{number-of-newlines} is non-@code{nil}. + +This command indents to the left margin if that is not zero. +@xref{Margins}. + +The value returned is @code{nil}. In an interactive call, @var{count} +is the numeric prefix argument. +@end deffn + +@defvar overwrite-mode +This variable controls whether overwrite mode is in effect. The value +should be @code{overwrite-mode-textual}, @code{overwrite-mode-binary}, +or @code{nil}. @code{overwrite-mode-textual} specifies textual +overwrite mode (treats newlines and tabs specially), and +@code{overwrite-mode-binary} specifies binary overwrite mode (treats +newlines and tabs like any other characters). +@end defvar + +@node Deletion +@section Deleting Text +@cindex text deletion + +@cindex deleting text vs killing + Deletion means removing part of the text in a buffer, without saving +it in the kill ring (@pxref{The Kill Ring}). Deleted text can't be +yanked, but can be reinserted using the undo mechanism (@pxref{Undo}). +Some deletion functions do save text in the kill ring in some special +cases. + + All of the deletion functions operate on the current buffer. + +@deffn Command erase-buffer +This function deletes the entire text of the current buffer +(@emph{not} just the accessible portion), leaving it +empty. If the buffer is read-only, it signals a @code{buffer-read-only} +error; if some of the text in it is read-only, it signals a +@code{text-read-only} error. Otherwise, it deletes the text without +asking for any confirmation. It returns @code{nil}. + +Normally, deleting a large amount of text from a buffer inhibits further +auto-saving of that buffer ``because it has shrunk.'' However, +@code{erase-buffer} does not do this, the idea being that the future +text is not really related to the former text, and its size should not +be compared with that of the former text. +@end deffn + +@deffn Command delete-region start end +This command deletes the text between positions @var{start} and +@var{end} in the current buffer, and returns @code{nil}. If point was +inside the deleted region, its value afterward is @var{start}. +Otherwise, point relocates with the surrounding text, as markers do. +@end deffn + +@defun delete-and-extract-region start end +This function deletes the text between positions @var{start} and +@var{end} in the current buffer, and returns a string containing the +text just deleted. + +If point was inside the deleted region, its value afterward is +@var{start}. Otherwise, point relocates with the surrounding text, as +markers do. +@end defun + +@deffn Command delete-char count &optional killp +This command deletes @var{count} characters directly after point, or +before point if @var{count} is negative. If @var{killp} is +non-@code{nil}, then it saves the deleted characters in the kill ring. + +In an interactive call, @var{count} is the numeric prefix argument, and +@var{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 @code{nil}. +@end deffn + +@deffn Command delete-backward-char count &optional killp +@cindex deleting previous char +This command deletes @var{count} characters directly before point, or +after point if @var{count} is negative. If @var{killp} is +non-@code{nil}, then it saves the deleted characters in the kill ring. + +In an interactive call, @var{count} is the numeric prefix argument, and +@var{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 @code{nil}. +@end deffn + +@deffn Command backward-delete-char-untabify count &optional killp +@cindex tab deletion +This command deletes @var{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 +@var{killp} is non-@code{nil}, then the command saves the deleted +characters in the kill ring. + +Conversion of tabs to spaces happens only if @var{count} is positive. +If it is negative, exactly @minus{}@var{count} characters after point +are deleted. + +In an interactive call, @var{count} is the numeric prefix argument, and +@var{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 @code{nil}. +@end deffn + +@defopt backward-delete-char-untabify-method +This option specifies how @code{backward-delete-char-untabify} should +deal with whitespace. Possible values include @code{untabify}, the +default, meaning convert a tab to many spaces and delete one; +@code{hungry}, meaning delete all tabs and spaces before point with +one command; @code{all} meaning delete all tabs, spaces and newlines +before point, and @code{nil}, meaning do nothing special for +whitespace characters. +@end defopt + +@node User-Level Deletion +@section 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. + +@deffn Command delete-horizontal-space &optional backward-only +@cindex deleting whitespace +This function deletes all spaces and tabs around point. It returns +@code{nil}. + +If @var{backward-only} is non-@code{nil}, the function deletes +spaces and tabs before point, but not after point. + +In the following examples, we call @code{delete-horizontal-space} four +times, once on each line, with point between the second and third +characters on the line each time. + +@example +@group +---------- Buffer: foo ---------- +I @point{}thought +I @point{} thought +We@point{} thought +Yo@point{}u thought +---------- Buffer: foo ---------- +@end group + +@group +(delete-horizontal-space) ; @r{Four times.} + @result{} nil + +---------- Buffer: foo ---------- +Ithought +Ithought +Wethought +You thought +---------- Buffer: foo ---------- +@end group +@end example +@end deffn + +@deffn 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 @var{join-following-p} is non-@code{nil}, +@code{delete-indentation} joins this line to the following line +instead. The function returns @code{nil}. + +If there is a fill prefix, and the second of the lines being joined +starts with the prefix, then @code{delete-indentation} deletes the +fill prefix before joining the lines. @xref{Margins}. + +In the example below, point is located on the line starting +@samp{events}, and it makes no difference if there are trailing spaces +in the preceding line. + +@smallexample +@group +---------- Buffer: foo ---------- +When in the course of human +@point{} events, it becomes necessary +---------- Buffer: foo ---------- +@end group + +(delete-indentation) + @result{} nil + +@group +---------- Buffer: foo ---------- +When in the course of human@point{} events, it becomes necessary +---------- Buffer: foo ---------- +@end group +@end smallexample + +After the lines are joined, the function @code{fixup-whitespace} is +responsible for deciding whether to leave a space at the junction. +@end deffn + +@deffn Command fixup-whitespace +This function replaces all the horizontal whitespace surrounding point +with either one space or no space, according to the context. It +returns @code{nil}. + +At the beginning or end of a line, the appropriate amount of space is +none. Before a character with close parenthesis syntax, or after a +character with open parenthesis or expression-prefix syntax, no space is +also appropriate. Otherwise, one space is appropriate. @xref{Syntax +Class Table}. + +In the example below, @code{fixup-whitespace} is called the first time +with point before the word @samp{spaces} in the first line. For the +second invocation, point is directly after the @samp{(}. + +@smallexample +@group +---------- Buffer: foo ---------- +This has too many @point{}spaces +This has too many spaces at the start of (@point{} this list) +---------- Buffer: foo ---------- +@end group + +@group +(fixup-whitespace) + @result{} nil +(fixup-whitespace) + @result{} nil +@end group + +@group +---------- Buffer: foo ---------- +This has too many spaces +This has too many spaces at the start of (this list) +---------- Buffer: foo ---------- +@end group +@end smallexample +@end deffn + +@deffn Command just-one-space &optional n +@comment !!SourceFile simple.el +This command replaces any spaces and tabs around point with a single +space, or @var{n} spaces if @var{n} is specified. It returns +@code{nil}. +@end deffn + +@deffn 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 immediately following it. + +A blank line is defined as a line containing only tabs and spaces. + +@code{delete-blank-lines} returns @code{nil}. +@end deffn + +@node The Kill Ring +@section The Kill Ring +@cindex kill ring + + @dfn{Kill functions} delete text like the deletion functions, but save +it so that the user can reinsert it by @dfn{yanking}. Most of these +functions have @samp{kill-} in their name. By contrast, the functions +whose names start with @samp{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. You can use these functions to write +commands for killing text. When you need to delete text for internal +purposes within a Lisp function, you should normally use deletion +functions, so as not to disturb the kill ring contents. +@xref{Deletion}. + + Killed text is saved for later yanking in the @dfn{kill ring}. This +is a list that holds a number of recent kills, not just the last text +kill. We call this a ``ring'' because yanking treats it as having +elements in a cyclic order. The list is kept in the variable +@code{kill-ring}, and can be operated on with the usual functions for +lists; there are also specialized functions, described in this section, +that treat it as a ring. + + Some people think this use of the word ``kill'' is unfortunate, since +it refers to operations that specifically @emph{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 the terminology now. + +@menu +* Kill Ring Concepts:: What text looks like in the kill ring. +* Kill Functions:: Functions that kill text. +* Yanking:: How yanking is done. +* Yank Commands:: Commands that access the kill ring. +* Low-Level Kill Ring:: Functions and variables for kill ring access. +* Internals of Kill Ring:: Variables that hold kill ring data. +@end menu + +@node Kill Ring Concepts +@comment node-name, next, previous, up +@subsection Kill Ring Concepts + + The kill ring records killed text as strings in a list, most recent +first. A short kill ring, for example, might look like this: + +@example +("some text" "a different piece of text" "even older text") +@end example + +@noindent +When the list reaches @code{kill-ring-max} entries in length, adding a +new entry automatically deletes the last entry. + + When kill commands are interwoven with other commands, each kill +command makes a new entry in the kill ring. Multiple kill commands in +succession build up a single kill ring entry, which would be yanked as a +unit; the second and subsequent consecutive kill commands add text to +the entry made by the first one. + + For yanking, one entry in the kill ring is designated the ``front'' of +the ring. Some yank commands ``rotate'' the ring by designating a +different element as the ``front.'' But this virtual rotation doesn't +change the list itself---the most recent entry always comes first in the +list. + +@node Kill Functions +@comment node-name, next, previous, up +@subsection Functions for Killing + + @code{kill-region} is the usual subroutine for killing text. Any +command that calls this function is a ``kill command'' (and should +probably have @samp{kill} in its name). @code{kill-region} puts the +newly killed text in a new element at the beginning of the kill ring or +adds it to the most recent element. It determines automatically (using +@code{last-command}) whether the previous command was a kill command, +and if so appends the killed text to the most recent entry. + +@deffn Command kill-region start end &optional yank-handler +This function kills the text in the region defined by @var{start} and +@var{end}. The text is deleted but saved in the kill ring, along with +its text properties. The value is always @code{nil}. + +In an interactive call, @var{start} and @var{end} are point and +the mark. + +@c Emacs 19 feature +If the buffer or text is read-only, @code{kill-region} modifies the kill +ring just the same, then signals an error without modifying the buffer. +This is convenient because it lets the user use a series of kill +commands to copy text from a read-only buffer into the kill ring. + +If @var{yank-handler} is non-@code{nil}, this puts that value onto +the string of killed text, as a @code{yank-handler} text property. +@xref{Yanking}. Note that if @var{yank-handler} is @code{nil}, any +@code{yank-handler} properties present on the killed text are copied +onto the kill ring, like other text properties. +@end deffn + +@defopt kill-read-only-ok +If this option is non-@code{nil}, @code{kill-region} does not signal an +error if the buffer or text is read-only. Instead, it simply returns, +updating the kill ring but not changing the buffer. +@end defopt + +@deffn Command copy-region-as-kill start end +This command saves the region defined by @var{start} and @var{end} on +the kill ring (including text properties), but does not delete the text +from the buffer. It returns @code{nil}. + +The command does not set @code{this-command} to @code{kill-region}, so a +subsequent kill command does not append to the same kill ring entry. + +Don't call @code{copy-region-as-kill} in Lisp programs unless you aim to +support Emacs 18. For newer Emacs versions, it is better to use +@code{kill-new} or @code{kill-append} instead. @xref{Low-Level Kill +Ring}. +@end deffn + +@node Yanking +@subsection Yanking + + Yanking means inserting text from the kill ring, but it does +not insert the text blindly. Yank commands and some other commands +use @code{insert-for-yank} to perform special processing on the +text that they copy into the buffer. + +@defun insert-for-yank string +This function normally works like @code{insert} except that it doesn't +insert the text properties in the @code{yank-excluded-properties} +list. However, if any part of @var{string} has a non-@code{nil} +@code{yank-handler} text property, that property can do various +special processing on that part of the text being inserted. +@end defun + +@defun insert-buffer-substring-as-yank buf &optional start end +This function resembles @code{insert-buffer-substring} except that it +doesn't insert the text properties in the +@code{yank-excluded-properties} list. +@end defun + + You can put a @code{yank-handler} text property on all or part of +the text to control how it will be inserted if it is yanked. The +@code{insert-for-yank} function looks for that property. The property +value must be a list of one to four elements, with the following +format (where elements after the first may be omitted): + +@example +(@var{function} @var{param} @var{noexclude} @var{undo}) +@end example + + Here is what the elements do: + +@table @var +@item function +When @var{function} is present and non-@code{nil}, it is called instead of +@code{insert} to insert the string. @var{function} takes one +argument---the string to insert. + +@item param +If @var{param} is present and non-@code{nil}, it replaces @var{string} +(or the part of @var{string} being processed) as the object passed to +@var{function} (or @code{insert}); for example, if @var{function} is +@code{yank-rectangle}, @var{param} should be a list of strings to +insert as a rectangle. + +@item noexclude +If @var{noexclude} is present and non-@code{nil}, the normal removal of the +yank-excluded-properties is not performed; instead @var{function} is +responsible for removing those properties. This may be necessary +if @var{function} adjusts point before or after inserting the object. + +@item undo +If @var{undo} is present and non-@code{nil}, it is a function that will be +called by @code{yank-pop} to undo the insertion of the current object. +It is called with two arguments, the start and end of the current +region. @var{function} can set @code{yank-undo-function} to override +the @var{undo} value. +@end table + +@node Yank Commands +@comment node-name, next, previous, up +@subsection Functions for Yanking + + This section describes higher-level commands for yanking, which are +intended primarily for the user but useful also in Lisp programs. +Both @code{yank} and @code{yank-pop} honor the +@code{yank-excluded-properties} variable and @code{yank-handler} text +property (@pxref{Yanking}). + +@deffn Command yank &optional arg +@cindex inserting killed text +This command inserts before point the text at the front of the +kill ring. It positions the mark at the beginning of that text, and +point at the end. + +If @var{arg} is a non-@code{nil} list (which occurs interactively when +the user types @kbd{C-u} with no digits), then @code{yank} inserts the +text as described above, but puts point before the yanked text and +puts the mark after it. + +If @var{arg} is a number, then @code{yank} inserts the @var{arg}th +most recently killed text---the @var{arg}th element of the kill ring +list, counted cyclically from the front, which is considered the +first element for this purpose. + +@code{yank} does not alter the contents of the kill ring, unless it +used text provided by another program, in which case it pushes that text +onto the kill ring. However if @var{arg} is an integer different from +one, it rotates the kill ring to place the yanked string at the front. + +@code{yank} returns @code{nil}. +@end deffn + +@deffn Command yank-pop &optional arg +This command replaces the just-yanked entry from the kill ring with a +different entry from the kill ring. + +This is allowed only immediately after a @code{yank} or another +@code{yank-pop}. At such a time, the region contains text that was just +inserted by yanking. @code{yank-pop} deletes that text and inserts in +its place a different piece of killed text. It does not add the deleted +text to the kill ring, since it is already in the kill ring somewhere. +It does however rotate the kill ring to place the newly yanked string at +the front. + +If @var{arg} is @code{nil}, then the replacement text is the previous +element of the kill ring. If @var{arg} is numeric, the replacement is +the @var{arg}th previous kill. If @var{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 return value is always @code{nil}. +@end deffn + +@defvar yank-undo-function +If this variable is non-@code{nil}, the function @code{yank-pop} uses +its value instead of @code{delete-region} to delete the text +inserted by the previous @code{yank} or +@code{yank-pop} command. The value must be a function of two +arguments, the start and end of the current region. + +The function @code{insert-for-yank} automatically sets this variable +according to the @var{undo} element of the @code{yank-handler} +text property, if there is one. +@end defvar + +@node Low-Level Kill Ring +@subsection Low-Level Kill Ring + + These functions and variables provide access to the kill ring at a +lower level, but still convenient for use in Lisp programs, because they +take care of interaction with window system selections +(@pxref{Window System Selections}). + +@defun current-kill n &optional do-not-move +The function @code{current-kill} rotates the yanking pointer, which +designates the ``front'' of the kill ring, by @var{n} places (from newer +kills to older ones), and returns the text at that place in the ring. + +If the optional second argument @var{do-not-move} is non-@code{nil}, +then @code{current-kill} doesn't alter the yanking pointer; it just +returns the @var{n}th kill, counting from the current yanking pointer. + +If @var{n} is zero, indicating a request for the latest kill, +@code{current-kill} calls the value of +@code{interprogram-paste-function} (documented below) before +consulting the kill ring. If that value is a function and calling it +returns a string, @code{current-kill} pushes that string onto the kill +ring and returns it. It also sets the yanking pointer to point to +that new entry, regardless of the value of @var{do-not-move}. +Otherwise, @code{current-kill} does not treat a zero value for @var{n} +specially: it returns the entry pointed at by the yanking pointer and +does not move the yanking pointer. +@end defun + +@defun kill-new string &optional replace yank-handler +This function pushes the text @var{string} onto the kill ring and +makes the yanking pointer point to it. It discards the oldest entry +if appropriate. It also invokes the value of +@code{interprogram-cut-function} (see below). + +If @var{replace} is non-@code{nil}, then @code{kill-new} replaces the +first element of the kill ring with @var{string}, rather than pushing +@var{string} onto the kill ring. + +If @var{yank-handler} is non-@code{nil}, this puts that value onto +the string of killed text, as a @code{yank-handler} property. +@xref{Yanking}. Note that if @var{yank-handler} is @code{nil}, then +@code{kill-new} copies any @code{yank-handler} properties present on +@var{string} onto the kill ring, as it does with other text properties. +@end defun + +@defun kill-append string before-p &optional yank-handler +This function appends the text @var{string} to the first entry in the +kill ring and makes the yanking pointer point to the combined entry. +Normally @var{string} goes at the end of the entry, but if +@var{before-p} is non-@code{nil}, it goes at the beginning. This +function also invokes the value of @code{interprogram-cut-function} +(see below). This handles @var{yank-handler} just like +@code{kill-new}, except that if @var{yank-handler} is different from +the @code{yank-handler} property of the first entry of the kill ring, +@code{kill-append} pushes the concatenated string onto the kill ring, +instead of replacing the original first entry with it. +@end defun + +@defvar interprogram-paste-function +This variable provides a way of transferring killed text from other +programs, when you are using a window system. Its value should be +@code{nil} or a function of no arguments. + +If the value is a function, @code{current-kill} calls it to get the +``most recent kill.'' If the function returns a non-@code{nil} value, +then that value is used as the ``most recent kill.'' If it returns +@code{nil}, then the front of the kill ring is used. + +The normal use of this hook is to get the window system's primary +selection as the most recent kill, even if the selection belongs to +another application. @xref{Window System Selections}. +@end defvar + +@defvar interprogram-cut-function +This variable provides a way of communicating killed text to other +programs, when you are using a window system. Its value should be +@code{nil} or a function of one required and one optional argument. + +If the value is a function, @code{kill-new} and @code{kill-append} call +it with the new first element of the kill ring as the first argument. +The second, optional, argument has the same meaning as the @var{push} +argument to @code{x-set-cut-buffer} (@pxref{Definition of +x-set-cut-buffer}) and only affects the second and later cut buffers. + +The normal use of this hook is to set the window system's primary +selection (and first cut buffer) from the newly killed text. +@xref{Window System Selections}. +@end defvar + +@node Internals of Kill Ring +@comment node-name, next, previous, up +@subsection Internals of the Kill Ring + + The variable @code{kill-ring} holds the kill ring contents, in the +form of a list of strings. The most recent kill is always at the front +of the list. + + The @code{kill-ring-yank-pointer} variable points to a link in the +kill ring list, whose @sc{car} is the text to yank next. We say it +identifies the ``front'' of the ring. Moving +@code{kill-ring-yank-pointer} to a different link is called +@dfn{rotating the kill ring}. We call the kill ring a ``ring'' because +the functions that move the yank pointer wrap around from the end of the +list to the beginning, or vice-versa. Rotation of the kill ring is +virtual; it does not change the value of @code{kill-ring}. + + Both @code{kill-ring} and @code{kill-ring-yank-pointer} are Lisp +variables whose values are normally lists. The word ``pointer'' in the +name of the @code{kill-ring-yank-pointer} indicates that the variable's +purpose is to identify one element of the list for use by the next yank +command. + + The value of @code{kill-ring-yank-pointer} is always @code{eq} to one +of the links in the kill ring list. The element it identifies is the +@sc{car} of that link. Kill commands, which change the kill ring, also +set this variable to the value of @code{kill-ring}. The effect is to +rotate the ring so that the newly killed text is at the front. + + Here is a diagram that shows the variable @code{kill-ring-yank-pointer} +pointing to the second entry in the kill ring @code{("some text" "a +different piece of text" "yet older text")}. + +@example +@group +kill-ring ---- kill-ring-yank-pointer + | | + | v + | --- --- --- --- --- --- + --> | | |------> | | |--> | | |--> nil + --- --- --- --- --- --- + | | | + | | | + | | -->"yet older text" + | | + | --> "a different piece of text" + | + --> "some text" +@end group +@end example + +@noindent +This state of affairs might occur after @kbd{C-y} (@code{yank}) +immediately followed by @kbd{M-y} (@code{yank-pop}). + +@defvar kill-ring +This variable holds the list of killed text sequences, most recently +killed first. +@end defvar + +@defvar kill-ring-yank-pointer +This variable's value indicates which element of the kill ring is at the +``front'' of the ring for yanking. More precisely, the value is a tail +of the value of @code{kill-ring}, and its @sc{car} is the kill string +that @kbd{C-y} should yank. +@end defvar + +@defopt kill-ring-max +The value of this variable is the maximum length to which the kill +ring can grow, before elements are thrown away at the end. The default +value for @code{kill-ring-max} is 60. +@end defopt + +@node Undo +@comment node-name, next, previous, up +@section Undo +@cindex redo + + Most buffers have an @dfn{undo list}, which records all changes made +to the buffer's text so that they can be undone. (The buffers that +don't have one are usually special-purpose buffers for which Emacs +assumes that undoing is not useful. In particular, any buffer whose +name begins with a space has its undo recording off by default; +see @ref{Buffer Names}.) All the primitives that modify the +text in the buffer automatically add elements to the front of the undo +list, which is in the variable @code{buffer-undo-list}. + +@defvar buffer-undo-list +This buffer-local variable's value is the undo list of the current +buffer. A value of @code{t} disables the recording of undo information. +@end defvar + +Here are the kinds of elements an undo list can have: + +@table @code +@item @var{position} +This kind of element records a previous value of point; undoing this +element moves point to @var{position}. Ordinary cursor motion does not +make any sort of undo record, but deletion operations use these entries +to record where point was before the command. + +@item (@var{beg} . @var{end}) +This kind of element indicates how to delete text that was inserted. +Upon insertion, the text occupied the range @var{beg}--@var{end} in the +buffer. + +@item (@var{text} . @var{position}) +This kind of element indicates how to reinsert text that was deleted. +The deleted text itself is the string @var{text}. The place to +reinsert it is @code{(abs @var{position})}. If @var{position} is +positive, point was at the beginning of the deleted text, otherwise it +was at the end. + +@item (t @var{high} . @var{low}) +This kind of element indicates that an unmodified buffer became +modified. The elements @var{high} and @var{low} are two integers, each +recording 16 bits of the visited file's modification time as of when it +was previously visited or saved. @code{primitive-undo} uses those +values to determine whether to mark the buffer as unmodified once again; +it does so only if the file's modification time matches those numbers. + +@item (nil @var{property} @var{value} @var{beg} . @var{end}) +This kind of element records a change in a text property. +Here's how you might undo the change: + +@example +(put-text-property @var{beg} @var{end} @var{property} @var{value}) +@end example + +@item (@var{marker} . @var{adjustment}) +This kind of element records the fact that the marker @var{marker} was +relocated due to deletion of surrounding text, and that it moved +@var{adjustment} character positions. Undoing this element moves +@var{marker} @minus{} @var{adjustment} characters. + +@item (apply @var{funname} . @var{args}) +This is an extensible undo item, which is undone by calling +@var{funname} with arguments @var{args}. + +@item (apply @var{delta} @var{beg} @var{end} @var{funname} . @var{args}) +This is an extensible undo item, which records a change limited to the +range @var{beg} to @var{end}, which increased the size of the buffer +by @var{delta}. It is undone by calling @var{funname} with arguments +@var{args}. + +This kind of element enables undo limited to a region to determine +whether the element pertains to that region. + +@item nil +This element is a boundary. The elements between two boundaries are +called a @dfn{change group}; normally, each change group corresponds to +one keyboard command, and undo commands normally undo an entire group as +a unit. +@end table + +@defun undo-boundary +This function places a boundary element in the undo list. The undo +command stops at such a boundary, and successive undo commands undo +to earlier and earlier boundaries. This function returns @code{nil}. + +The editor command loop automatically creates an undo boundary before +each key sequence is executed. Thus, each undo normally undoes the +effects of one command. Self-inserting input characters are an +exception. The command loop makes a boundary for the first such +character; the next 19 consecutive self-inserting input characters do +not make boundaries, and then the 20th does, and so on as long as +self-inserting characters continue. + +All buffer modifications add a boundary whenever the previous undoable +change was made in some other buffer. This is to ensure that +each command makes a boundary in each buffer where it makes changes. + +Calling this function explicitly is useful for splitting the effects of +a command into more than one unit. For example, @code{query-replace} +calls @code{undo-boundary} after each replacement, so that the user can +undo individual replacements one by one. +@end defun + +@defvar undo-in-progress +This variable is normally @code{nil}, but the undo commands bind it to +@code{t}. This is so that various kinds of change hooks can tell when +they're being called for the sake of undoing. +@end defvar + +@defun primitive-undo count list +This is the basic function for undoing elements of an undo list. +It undoes the first @var{count} elements of @var{list}, returning +the rest of @var{list}. + +@code{primitive-undo} adds elements to the buffer's undo list when it +changes the buffer. Undo commands avoid confusion by saving the undo +list value at the beginning of a sequence of undo operations. Then the +undo operations use and update the saved value. The new elements added +by undoing are not part of this saved value, so they don't interfere with +continuing to undo. + +This function does not bind @code{undo-in-progress}. +@end defun + +@node Maintaining Undo +@section Maintaining Undo Lists + + This section describes how to enable and disable undo information for +a given buffer. It also explains how the undo list is truncated +automatically so it doesn't get too big. + + Recording of undo information in a newly created buffer is normally +enabled to start with; but if the buffer name starts with a space, the +undo recording is initially disabled. You can explicitly enable or +disable undo recording with the following two functions, or by setting +@code{buffer-undo-list} yourself. + +@deffn Command buffer-enable-undo &optional buffer-or-name +This command enables recording undo information for buffer +@var{buffer-or-name}, so that subsequent changes can be undone. If no +argument is supplied, then the current buffer is used. This function +does nothing if undo recording is already enabled in the buffer. It +returns @code{nil}. + +In an interactive call, @var{buffer-or-name} is the current buffer. +You cannot specify any other buffer. +@end deffn + +@deffn Command buffer-disable-undo &optional buffer-or-name +@cindex disabling undo +This function discards the undo list of @var{buffer-or-name}, and disables +further recording of undo information. As a result, it is no longer +possible to undo either previous changes or any subsequent changes. If +the undo list of @var{buffer-or-name} is already disabled, this function +has no effect. + +This function returns @code{nil}. +@end deffn + + As editing continues, undo lists get longer and longer. To prevent +them from using up all available memory space, garbage collection trims +them back to size limits you can set. (For this purpose, the ``size'' +of an undo list measures the cons cells that make up the list, plus the +strings of deleted text.) Three variables control the range of acceptable +sizes: @code{undo-limit}, @code{undo-strong-limit} and +@code{undo-outer-limit}. In these variables, size is counted as the +number of bytes occupied, which includes both saved text and other +data. + +@defopt undo-limit +This is the soft limit for the acceptable size of an undo list. The +change group at which this size is exceeded is the last one kept. +@end defopt + +@defopt undo-strong-limit +This is the upper limit for the acceptable size of an undo list. The +change group at which this size is exceeded is discarded itself (along +with all older change groups). There is one exception: the very latest +change group is only discarded if it exceeds @code{undo-outer-limit}. +@end defopt + +@defopt undo-outer-limit +If at garbage collection time the undo info for the current command +exceeds this limit, Emacs discards the info and displays a warning. +This is a last ditch limit to prevent memory overflow. +@end defopt + +@defopt undo-ask-before-discard +If this variable is non-@code{nil}, when the undo info exceeds +@code{undo-outer-limit}, Emacs asks in the echo area whether to +discard the info. The default value is @code{nil}, which means to +discard it automatically. + +This option is mainly intended for debugging. Garbage collection is +inhibited while the question is asked, which means that Emacs might +leak memory if the user waits too long before answering the question. +@end defopt + +@node Filling +@comment node-name, next, previous, up +@section Filling +@cindex filling text + + @dfn{Filling} means adjusting the lengths of lines (by moving the line +breaks) so that they are nearly (but no greater than) a specified +maximum width. Additionally, lines can be @dfn{justified}, which means +inserting spaces to make the left and/or right margins line up +precisely. The width is controlled by the variable @code{fill-column}. +For ease of reading, lines should be no longer than 70 or so columns. + + You can use Auto Fill mode (@pxref{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 commands in this section return values that are not +meaningful. All the functions that do filling take note of the current +left margin, current right margin, and current justification style +(@pxref{Margins}). If the current justification style is +@code{none}, the filling functions don't actually do anything. + + Several of the filling functions have an argument @var{justify}. +If it is non-@code{nil}, that requests some kind of justification. It +can be @code{left}, @code{right}, @code{full}, or @code{center}, to +request a specific style of justification. If it is @code{t}, that +means to use the current justification style for this part of the text +(see @code{current-justification}, below). Any other value is treated +as @code{full}. + + When you call the filling functions interactively, using a prefix +argument implies the value @code{full} for @var{justify}. + +@deffn Command fill-paragraph justify +This command fills the paragraph at or after point. If +@var{justify} is non-@code{nil}, each line is justified as well. +It uses the ordinary paragraph motion commands to find paragraph +boundaries. @xref{Paragraphs,,, emacs, The GNU Emacs Manual}. +@end deffn + +@deffn Command fill-region start end &optional justify nosqueeze to-eop +This command fills each of the paragraphs in the region from @var{start} +to @var{end}. It justifies as well if @var{justify} is +non-@code{nil}. + +If @var{nosqueeze} is non-@code{nil}, that means to leave whitespace +other than line breaks untouched. If @var{to-eop} is non-@code{nil}, +that means to keep filling to the end of the paragraph---or the next hard +newline, if @code{use-hard-newlines} is enabled (see below). + +The variable @code{paragraph-separate} controls how to distinguish +paragraphs. @xref{Standard Regexps}. +@end deffn + +@deffn Command fill-individual-paragraphs start end &optional justify citation-regexp +This command fills each paragraph in the region according to its +individual fill prefix. Thus, if the lines of a paragraph were indented +with spaces, the filled paragraph will remain indented in the same +fashion. + +The first two arguments, @var{start} and @var{end}, are the beginning +and end of the region to be filled. The third and fourth arguments, +@var{justify} and @var{citation-regexp}, are optional. If +@var{justify} is non-@code{nil}, the paragraphs are justified as +well as filled. If @var{citation-regexp} is non-@code{nil}, it means the +function is operating on a mail message and therefore should not fill +the header lines. If @var{citation-regexp} is a string, it is used as +a regular expression; if it matches the beginning of a line, that line +is treated as a citation marker. + +Ordinarily, @code{fill-individual-paragraphs} regards each change in +indentation as starting a new paragraph. If +@code{fill-individual-varying-indent} is non-@code{nil}, then only +separator lines separate paragraphs. That mode can handle indented +paragraphs with additional indentation on the first line. +@end deffn + +@defopt fill-individual-varying-indent +This variable alters the action of @code{fill-individual-paragraphs} as +described above. +@end defopt + +@deffn Command fill-region-as-paragraph start end &optional justify nosqueeze squeeze-after +This command considers a region of text as a single 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 @var{justify} is non-@code{nil}. + +If @var{nosqueeze} is non-@code{nil}, that means to leave whitespace +other than line breaks untouched. If @var{squeeze-after} is +non-@code{nil}, it specifies a position in the region, and means don't +canonicalize spaces before that position. + +In Adaptive Fill mode, this command calls @code{fill-context-prefix} to +choose a fill prefix by default. @xref{Adaptive Fill}. +@end deffn + +@deffn Command justify-current-line &optional how eop nosqueeze +This command inserts spaces between the words of the current line so +that the line ends exactly at @code{fill-column}. It returns +@code{nil}. + +The argument @var{how}, if non-@code{nil} specifies explicitly the style +of justification. It can be @code{left}, @code{right}, @code{full}, +@code{center}, or @code{none}. If it is @code{t}, that means to do +follow specified justification style (see @code{current-justification}, +below). @code{nil} means to do full justification. + +If @var{eop} is non-@code{nil}, that means do only left-justification +if @code{current-justification} specifies full justification. This is +used for the last line of a paragraph; even if the paragraph as a +whole is fully justified, the last line should not be. + +If @var{nosqueeze} is non-@code{nil}, that means do not change interior +whitespace. +@end deffn + +@defopt default-justification +This variable's value specifies the style of justification to use for +text that doesn't specify a style with a text property. The possible +values are @code{left}, @code{right}, @code{full}, @code{center}, or +@code{none}. The default value is @code{left}. +@end defopt + +@defun current-justification +This function returns the proper justification style to use for filling +the text around point. + +This returns the value of the @code{justification} text property at +point, or the variable @var{default-justification} if there is no such +text property. However, it returns @code{nil} rather than @code{none} +to mean ``don't justify''. +@end defun + +@defopt sentence-end-double-space +@anchor{Definition of sentence-end-double-space} +If this variable is non-@code{nil}, a period followed by just one space +does not count as the end of a sentence, and the filling functions +avoid breaking the line at such a place. +@end defopt + +@defopt sentence-end-without-period +If this variable is non-@code{nil}, a sentence can end without a +period. This is used for languages like Thai, where sentences end +with a double space but without a period. +@end defopt + +@defopt sentence-end-without-space +If this variable is non-@code{nil}, it should be a string of +characters that can end a sentence without following spaces. +@end defopt + +@defvar fill-paragraph-function +This variable provides a way for major modes to override the filling of +paragraphs. If the value is non-@code{nil}, @code{fill-paragraph} calls +this function to do the work. If the function returns a non-@code{nil} +value, @code{fill-paragraph} assumes the job is done, and immediately +returns that value. + +The usual use of this feature is to fill comments in programming +language modes. If the function needs to fill a paragraph in the usual +way, it can do so as follows: + +@example +(let ((fill-paragraph-function nil)) + (fill-paragraph arg)) +@end example +@end defvar + +@defvar use-hard-newlines +If this variable is non-@code{nil}, the filling functions do not delete +newlines that have the @code{hard} text property. These ``hard +newlines'' act as paragraph separators. +@end defvar + +@node Margins +@section Margins for Filling + +@defopt fill-prefix +This buffer-local variable, if non-@code{nil}, specifies a string of +text that appears at the beginning of normal text lines and should be +disregarded when filling them. Any line that fails to start with the +fill prefix is considered the start of a paragraph; so is any line +that starts with the fill prefix followed by additional whitespace. +Lines that start with the fill prefix but no additional whitespace are +ordinary text lines that can be filled together. The resulting filled +lines also start with the fill prefix. + +The fill prefix follows the left margin whitespace, if any. +@end defopt + +@defopt 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 (@pxref{Auto Filling}). + +As a practical matter, if you are writing text for other people to +read, you should set @code{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. +@end defopt + +@defvar default-fill-column +The value of this variable is the default value for @code{fill-column} in +buffers that do not override it. This is the same as +@code{(default-value 'fill-column)}. + +The default value for @code{default-fill-column} is 70. +@end defvar + +@deffn Command set-left-margin from to margin +This sets the @code{left-margin} property on the text from @var{from} to +@var{to} to the value @var{margin}. If Auto Fill mode is enabled, this +command also refills the region to fit the new margin. +@end deffn + +@deffn Command set-right-margin from to margin +This sets the @code{right-margin} property on the text from @var{from} +to @var{to} to the value @var{margin}. If Auto Fill mode is enabled, +this command also refills the region to fit the new margin. +@end deffn + +@defun current-left-margin +This function returns the proper left margin value to use for filling +the text around point. The value is the sum of the @code{left-margin} +property of the character at the start of the current line (or zero if +none), and the value of the variable @code{left-margin}. +@end defun + +@defun current-fill-column +This function returns the proper fill column value to use for filling +the text around point. The value is the value of the @code{fill-column} +variable, minus the value of the @code{right-margin} property of the +character after point. +@end defun + +@deffn Command move-to-left-margin &optional n force +This function moves point to the left margin of the current line. The +column moved to is determined by calling the function +@code{current-left-margin}. If the argument @var{n} is non-@code{nil}, +@code{move-to-left-margin} moves forward @var{n}@minus{}1 lines first. + +If @var{force} is non-@code{nil}, that says to fix the line's +indentation if that doesn't match the left margin value. +@end deffn + +@defun delete-to-left-margin &optional from to +This function removes left margin indentation from the text between +@var{from} and @var{to}. The amount of indentation to delete is +determined by calling @code{current-left-margin}. In no case does this +function delete non-whitespace. If @var{from} and @var{to} are omitted, +they default to the whole buffer. +@end defun + +@defun indent-to-left-margin +This function adjusts the indentation at the beginning of the current +line to the value specified by the variable @code{left-margin}. (That +may involve either inserting or deleting whitespace.) This function +is value of @code{indent-line-function} in Paragraph-Indent Text mode. +@end defun + +@defvar left-margin +This variable specifies the base left margin column. In Fundamental +mode, @kbd{C-j} indents to this column. This variable automatically +becomes buffer-local when set in any fashion. +@end defvar + +@defvar fill-nobreak-predicate +This variable gives major modes a way to specify not to break a line +at certain places. Its value should be a list of functions. Whenever +filling considers breaking the line at a certain place in the buffer, +it calls each of these functions with no arguments and with point +located at that place. If any of the functions returns +non-@code{nil}, then the line won't be broken there. +@end defvar + +@node Adaptive Fill +@section Adaptive Fill Mode +@c @cindex Adaptive Fill mode "adaptive-fill-mode" is adjacent. + + When @dfn{Adaptive Fill Mode} is enabled, Emacs determines the fill +prefix automatically from the text in each paragraph being filled +rather than using a predetermined value. During filling, this fill +prefix gets inserted at the start of the second and subsequent lines +of the paragraph as described in @ref{Filling}, and in @ref{Auto +Filling}. + +@defopt adaptive-fill-mode +Adaptive Fill mode is enabled when this variable is non-@code{nil}. +It is @code{t} by default. +@end defopt + +@defun fill-context-prefix from to +This function implements the heart of Adaptive Fill mode; it chooses a +fill prefix based on the text between @var{from} and @var{to}, +typically the start and end of a paragraph. It does this by looking +at the first two lines of the paragraph, based on the variables +described below. +@c The optional argument first-line-regexp is not documented +@c because it exists for internal purposes and might be eliminated +@c in the future. + +Usually, this function returns the fill prefix, a string. However, +before doing this, the function makes a final check (not specially +mentioned in the following) that a line starting with this prefix +wouldn't look like the start of a paragraph. Should this happen, the +function signals the anomaly by returning @code{nil} instead. + +In detail, @code{fill-context-prefix} does this: + +@enumerate +@item +It takes a candidate for the fill prefix from the first line---it +tries first the function in @code{adaptive-fill-function} (if any), +then the regular expression @code{adaptive-fill-regexp} (see below). +The first non-@code{nil} result of these, or the empty string if +they're both @code{nil}, becomes the first line's candidate. +@item +If the paragraph has as yet only one line, the function tests the +validity of the prefix candidate just found. The function then +returns the candidate if it's valid, or a string of spaces otherwise. +(see the description of @code{adaptive-fill-first-line-regexp} below). +@item +When the paragraph already has two lines, the function next looks for +a prefix candidate on the second line, in just the same way it did for +the first line. If it doesn't find one, it returns @code{nil}. +@item +The function now compares the two candidate prefixes heuristically: if +the non-whitespace characters in the line 2 candidate occur in the +same order in the line 1 candidate, the function returns the line 2 +candidate. Otherwise, it returns the largest initial substring which +is common to both candidates (which might be the empty string). +@end enumerate +@end defun + +@defopt adaptive-fill-regexp +Adaptive Fill mode matches this regular expression against the text +starting after the left margin whitespace (if any) on a line; the +characters it matches are that line's candidate for the fill prefix. + +The default value matches whitespace with certain punctuation +characters intermingled. +@end defopt + +@defopt adaptive-fill-first-line-regexp +Used only in one-line paragraphs, this regular expression acts as an +additional check of the validity of the one available candidate fill +prefix: the candidate must match this regular expression, or match +@code{comment-start-skip}. If it doesn't, @code{fill-context-prefix} +replaces the candidate with a string of spaces ``of the same width'' +as it. + +The default value of this variable is @w{@code{"\\`[ \t]*\\'"}}, which +matches only a string of whitespace. The effect of this default is to +force the fill prefixes found in one-line paragraphs always to be pure +whitespace. +@end defopt + +@defopt adaptive-fill-function +You can specify more complex ways of choosing a fill prefix +automatically by setting this variable to a function. The function is +called with point after the left margin (if any) of a line, and it +must preserve point. It should return either ``that line's'' fill +prefix or @code{nil}, meaning it has failed to determine a prefix. +@end defopt + +@node Auto Filling +@comment node-name, next, previous, up +@section Auto Filling +@cindex filling, automatic +@cindex Auto Fill mode + + Auto Fill mode is a minor mode that fills lines automatically as text +is inserted. This section describes the hook used by Auto Fill mode. +For a description of functions that you can call explicitly to fill and +justify existing text, see @ref{Filling}. + + Auto Fill mode also enables the functions that change the margins and +justification style to refill portions of the text. @xref{Margins}. + +@defvar auto-fill-function +The value of this buffer-local variable should be a function (of no +arguments) to be called after self-inserting a character from the table +@code{auto-fill-chars}. It may be @code{nil}, in which case nothing +special is done in that case. + +The value of @code{auto-fill-function} is @code{do-auto-fill} when +Auto-Fill mode is enabled. That is a function whose sole purpose is to +implement the usual strategy for breaking a line. + +@quotation +In older Emacs versions, this variable was named @code{auto-fill-hook}, +but since it is not called with the standard convention for hooks, it +was renamed to @code{auto-fill-function} in version 19. +@end quotation +@end defvar + +@defvar normal-auto-fill-function +This variable specifies the function to use for +@code{auto-fill-function}, if and when Auto Fill is turned on. Major +modes can set buffer-local values for this variable to alter how Auto +Fill works. +@end defvar + +@defvar auto-fill-chars +A char table of characters which invoke @code{auto-fill-function} when +self-inserted---space and newline in most language environments. They +have an entry @code{t} in the table. +@end defvar + +@node Sorting +@section Sorting Text +@cindex sorting text + + The sorting functions described in this section all rearrange text in +a buffer. This is in contrast to the function @code{sort}, which +rearranges the order of the elements of a list (@pxref{Rearrangement}). +The values returned by these functions are not meaningful. + +@defun sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun predicate +This function is the general text-sorting routine that subdivides a +buffer into records and then sorts them. Most of the commands in this +section use this function. + +To understand how @code{sort-subr} works, consider the whole accessible +portion of the buffer as being divided into disjoint pieces called +@dfn{sort records}. The records may or may not be contiguous, but they +must not overlap. A portion of each sort record (perhaps all of it) is +designated as the sort key. Sorting rearranges the records in order by +their sort keys. + +Usually, the records are rearranged in order of ascending sort key. +If the first argument to the @code{sort-subr} function, @var{reverse}, +is non-@code{nil}, the sort records are rearranged in order of +descending sort key. + +The next four arguments to @code{sort-subr} are functions that are +called to move point across a sort record. They are called many times +from within @code{sort-subr}. + +@enumerate +@item +@var{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 @code{sort-subr} is +called. Therefore, you should usually move point to the beginning of +the buffer before calling @code{sort-subr}. + +This function can indicate there are no more sort records by leaving +point at the end of the buffer. + +@item +@var{endrecfun} is called with point within a record. It moves point to +the end of the record. + +@item +@var{startkeyfun} is called to move point from the start of a record to +the start of the sort key. This argument is optional; if it is omitted, +the whole record is the sort key. If supplied, the function should +either return a non-@code{nil} value to be used as the sort key, or +return @code{nil} to indicate that the sort key is in the buffer +starting at point. In the latter case, @var{endkeyfun} is called to +find the end of the sort key. + +@item +@var{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 +@var{startkeyfun} returns @code{nil} and this argument is omitted (or +@code{nil}), then the sort key extends to the end of the record. There +is no need for @var{endkeyfun} if @var{startkeyfun} returns a +non-@code{nil} value. +@end enumerate + +The argument @var{predicate} is the function to use to compare keys. +If keys are numbers, it defaults to @code{<}; otherwise it defaults to +@code{string<}. + +As an example of @code{sort-subr}, here is the complete function +definition for @code{sort-lines}: + +@example +@group +;; @r{Note that the first two lines of doc string} +;; @r{are effectively one line when viewed by a user.} +(defun sort-lines (reverse beg end) + "Sort lines in region alphabetically;\ + argument means descending order. +Called from a program, there are three arguments: +@end group +@group +REVERSE (non-nil means reverse order),\ + BEG and END (region to sort). +The variable `sort-fold-case' determines\ + whether alphabetic case affects +the sort order." +@end group +@group + (interactive "P\nr") + (save-excursion + (save-restriction + (narrow-to-region beg end) + (goto-char (point-min)) + (let ((inhibit-field-text-motion t)) + (sort-subr reverse 'forward-line 'end-of-line))))) +@end group +@end example + +Here @code{forward-line} moves point to the start of the next record, +and @code{end-of-line} moves point to the end of record. We do not pass +the arguments @var{startkeyfun} and @var{endkeyfun}, because the entire +record is used as the sort key. + +The @code{sort-paragraphs} function is very much the same, except that +its @code{sort-subr} call looks like this: + +@example +@group +(sort-subr reverse + (function + (lambda () + (while (and (not (eobp)) + (looking-at paragraph-separate)) + (forward-line 1)))) + 'forward-paragraph) +@end group +@end example + +Markers pointing into any sort records are left with no useful +position after @code{sort-subr} returns. +@end defun + +@defopt sort-fold-case +If this variable is non-@code{nil}, @code{sort-subr} and the other +buffer sorting functions ignore case when comparing strings. +@end defopt + +@deffn Command sort-regexp-fields reverse record-regexp key-regexp start end +This command sorts the region between @var{start} and @var{end} +alphabetically as specified by @var{record-regexp} and @var{key-regexp}. +If @var{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 character codes in the Emacs character set. + +The value of the @var{record-regexp} argument specifies how to divide +the buffer into sort records. At the end of each record, a search is +done for this regular expression, and the text that matches it is taken +as the next record. For example, the regular expression @samp{^.+$}, +which matches lines with at least one character besides a newline, would +make each such line into a sort record. @xref{Regular Expressions}, for +a description of the syntax and meaning of regular expressions. + +The value of the @var{key-regexp} argument specifies what part of each +record is the sort key. The @var{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 @var{key-regexp} argument can refer to the text matched by a +subexpression of @var{record-regexp}, or it can be a regular expression +on its own. + +If @var{key-regexp} is: + +@table @asis +@item @samp{\@var{digit}} +then the text matched by the @var{digit}th @samp{\(...\)} parenthesis +grouping in @var{record-regexp} is the sort key. + +@item @samp{\&} +then the whole record is the sort key. + +@item a regular expression +then @code{sort-regexp-fields} searches for a match for the regular +expression within the record. If such a match is found, it is the sort +key. If there is no match for @var{key-regexp} 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.) +@end table + +For example, if you plan to sort all the lines in the region by the +first word on each line starting with the letter @samp{f}, you should +set @var{record-regexp} to @samp{^.*$} and set @var{key-regexp} to +@samp{\<f\w*\>}. The resulting expression looks like this: + +@example +@group +(sort-regexp-fields nil "^.*$" "\\<f\\w*\\>" + (region-beginning) + (region-end)) +@end group +@end example + +If you call @code{sort-regexp-fields} interactively, it prompts for +@var{record-regexp} and @var{key-regexp} in the minibuffer. +@end deffn + +@deffn Command sort-lines reverse start end +This command alphabetically sorts lines in the region between +@var{start} and @var{end}. If @var{reverse} is non-@code{nil}, the sort +is in reverse order. +@end deffn + +@deffn Command sort-paragraphs reverse start end +This command alphabetically sorts paragraphs in the region between +@var{start} and @var{end}. If @var{reverse} is non-@code{nil}, the sort +is in reverse order. +@end deffn + +@deffn Command sort-pages reverse start end +This command alphabetically sorts pages in the region between +@var{start} and @var{end}. If @var{reverse} is non-@code{nil}, the sort +is in reverse order. +@end deffn + +@deffn Command sort-fields field start end +This command sorts lines in the region between @var{start} and +@var{end}, comparing them alphabetically by the @var{field}th field +of each line. Fields are separated by whitespace and numbered starting +from 1. If @var{field} is negative, sorting is by the +@w{@minus{}@var{field}th} field from the end of the line. This command +is useful for sorting tables. +@end deffn + +@deffn Command sort-numeric-fields field start end +This command sorts lines in the region between @var{start} and +@var{end}, comparing them numerically by the @var{field}th 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. Numbers starting with 0 are treated as octal, and numbers +starting with @samp{0x} are treated as hexadecimal. + +If @var{field} is negative, sorting is by the +@w{@minus{}@var{field}th} field from the end of the line. This +command is useful for sorting tables. +@end deffn + +@defopt sort-numeric-base +This variable specifies the default radix for +@code{sort-numeric-fields} to parse numbers. +@end defopt + +@deffn Command sort-columns reverse &optional beg end +This command sorts the lines in the region between @var{beg} and +@var{end}, comparing them alphabetically by a certain range of +columns. The column positions of @var{beg} and @var{end} bound the +range of columns to sort on. + +If @var{reverse} is non-@code{nil}, the sort is in reverse order. + +One unusual thing about this command is that the entire line +containing position @var{beg}, and the entire line containing position +@var{end}, are included in the region sorted. + +Note that @code{sort-columns} rejects text that contains tabs, because +tabs could be split across the specified columns. Use @kbd{M-x +untabify} to convert tabs to spaces before sorting. + +When possible, this command actually works by calling the @code{sort} +utility program. +@end deffn + +@node Columns +@comment node-name, next, previous, up +@section Counting Columns +@cindex columns +@cindex counting columns +@cindex horizontal position + + 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). + + These functions count each character 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 +@code{ctl-arrow}, and tabs count as occupying a number of columns that +depends on the value of @code{tab-width} and on the column where the tab +begins. @xref{Usual Display}. + + 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. They +also ignore overlays and text properties, aside from invisibility. + +@defun current-column +This function returns the horizontal position of point, measured in +columns, counting from 0 at the left margin. The column position is the +sum of the widths of all the displayed representations of the characters +between the start of the current line and point. + +For an example of using @code{current-column}, see the description of +@code{count-lines} in @ref{Text Lines}. +@end defun + +@defun move-to-column column &optional force +This function moves point to @var{column} in the current line. The +calculation of @var{column} takes into account the widths of the +displayed representations of the characters between the start of the +line and point. + +If column @var{column} is beyond the end of the line, point moves to the +end of the line. If @var{column} is negative, point moves to the +beginning of the line. + +If it is impossible to move to column @var{column} because that is in +the middle of a multicolumn character such as a tab, point moves to the +end of that character. However, if @var{force} is non-@code{nil}, and +@var{column} is in the middle of a tab, then @code{move-to-column} +converts the tab into spaces so that it can move precisely to column +@var{column}. Other multicolumn characters can cause anomalies despite +@var{force}, since there is no way to split them. + +The argument @var{force} also has an effect if the line isn't long +enough to reach column @var{column}; if it is @code{t}, that means to +add whitespace at the end of the line to reach that column. + +If @var{column} is not an integer, an error is signaled. + +The return value is the column number actually moved to. +@end defun + +@node Indentation +@section Indentation +@cindex 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. Columns and indentation +count from zero at the left margin. + +@menu +* Primitive Indent:: Functions used to count and insert indentation. +* Mode-Specific Indent:: Customize indentation for different modes. +* Region Indent:: Indent all the lines in a region. +* Relative Indent:: Indent the current line based on previous lines. +* Indent Tabs:: Adjustable, typewriter-like tab stops. +* Motion by Indent:: Move to first non-blank character. +@end menu + +@node Primitive Indent +@subsection Indentation Primitives + + This section describes the primitive functions used to count and +insert indentation. The functions in the following sections use these +primitives. @xref{Width}, for related functions. + +@defun current-indentation +@comment !!Type Primitive Function +@comment !!SourceFile indent.c +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. +@end defun + +@deffn Command indent-to column &optional minimum +@comment !!Type Primitive Function +@comment !!SourceFile indent.c +This function indents from point with tabs and spaces until @var{column} +is reached. If @var{minimum} is specified and non-@code{nil}, then at +least that many spaces are inserted even if this requires going beyond +@var{column}. Otherwise the function does nothing if point is already +beyond @var{column}. The value is the column at which the inserted +indentation ends. + +The inserted whitespace characters inherit text properties from the +surrounding text (usually, from the preceding text only). @xref{Sticky +Properties}. +@end deffn + +@defopt indent-tabs-mode +@comment !!SourceFile indent.c +If this variable is non-@code{nil}, indentation functions can insert +tabs as well as spaces. Otherwise, they insert only spaces. Setting +this variable automatically makes it buffer-local in the current buffer. +@end defopt + +@node Mode-Specific Indent +@subsection Indentation Controlled by Major Mode + + An important function of each major mode is to customize the @key{TAB} +key to indent properly for the language being edited. This section +describes the mechanism of the @key{TAB} key and how to control it. +The functions in this section return unpredictable values. + +@defvar indent-line-function +This variable's value is the function to be used by @key{TAB} (and +various commands) to indent the current line. The command +@code{indent-according-to-mode} does no more than call this function. + +In Lisp mode, the value is the symbol @code{lisp-indent-line}; in C +mode, @code{c-indent-line}; in Fortran mode, @code{fortran-indent-line}. +The default value is @code{indent-relative}. +@end defvar + +@deffn Command indent-according-to-mode +This command calls the function in @code{indent-line-function} to +indent the current line in a way appropriate for the current major mode. +@end deffn + +@deffn Command indent-for-tab-command +This command calls the function in @code{indent-line-function} to indent +the current line; however, if that function is +@code{indent-to-left-margin}, @code{insert-tab} is called instead. (That +is a trivial command that inserts a tab character.) +@end deffn + +@deffn Command newline-and-indent +@comment !!SourceFile simple.el +This function inserts a newline, then indents the new line (the one +following the newline just inserted) according to the major mode. + +It does indentation by calling the current @code{indent-line-function}. +In programming language modes, this is the same thing @key{TAB} does, +but in some text modes, where @key{TAB} inserts a tab, +@code{newline-and-indent} indents to the column specified by +@code{left-margin}. +@end deffn + +@deffn Command reindent-then-newline-and-indent +@comment !!SourceFile simple.el +This command reindents the current line, inserts a newline at point, +and then indents the new line (the one following the newline just +inserted). + +This command does indentation on both lines according to the current +major mode, by calling the current value of @code{indent-line-function}. +In programming language modes, this is the same thing @key{TAB} does, +but in some text modes, where @key{TAB} inserts a tab, +@code{reindent-then-newline-and-indent} indents to the column specified +by @code{left-margin}. +@end deffn + +@node Region Indent +@subsection Indenting an Entire Region + + This section describes commands that indent all the lines in the +region. They return unpredictable values. + +@deffn Command indent-region start end to-column +This command indents each nonblank line starting between @var{start} +(inclusive) and @var{end} (exclusive). If @var{to-column} is +@code{nil}, @code{indent-region} indents each nonblank line by calling +the current mode's indentation function, the value of +@code{indent-line-function}. + +If @var{to-column} is non-@code{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. + +If there is a fill prefix, @code{indent-region} indents each line +by making it start with the fill prefix. +@end deffn + +@defvar indent-region-function +The value of this variable is a function that can be used by +@code{indent-region} as a short cut. It should take two arguments, the +start and end of the region. 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 @code{nil}, there is no short cut, and +@code{indent-region} actually works line by line. + +A short-cut function is useful in modes such as C mode and Lisp mode, +where the @code{indent-line-function} must scan from the beginning of +the function definition: 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. In a mode where +indenting a line individually is fast, there is no need for a short cut. + +@code{indent-region} with a non-@code{nil} argument @var{to-column} has +a different meaning and does not use this variable. +@end defvar + +@deffn Command indent-rigidly start end count +@comment !!SourceFile indent.el +This command indents all lines starting between @var{start} +(inclusive) and @var{end} (exclusive) sideways by @var{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 @var{count} is 3, this command adds 3 columns of +indentation to each of the lines beginning in the region specified. + +In Mail mode, @kbd{C-c C-y} (@code{mail-yank-original}) uses +@code{indent-rigidly} to indent the text copied from the message being +replied to. +@end deffn + +@defun indent-code-rigidly start end columns &optional nochange-regexp +This is like @code{indent-rigidly}, except that it doesn't alter lines +that start within strings or comments. + +In addition, it doesn't alter a line if @var{nochange-regexp} matches at +the beginning of the line (if @var{nochange-regexp} is non-@code{nil}). +@end defun + +@node Relative Indent +@subsection Indentation Relative to Previous Lines + + This section describes two commands that indent the current line +based on the contents of previous lines. + +@deffn Command indent-relative &optional unindented-ok +This command inserts whitespace at point, extending to the same +column as the next @dfn{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), @code{indent-relative} either does +nothing (if @var{unindented-ok} is non-@code{nil}) or calls +@code{tab-to-tab-stop}. Thus, if point is underneath and to the right +of the last column of a short line of text, this command ordinarily +moves point to the next tab stop by inserting whitespace. + +The return value of @code{indent-relative} is unpredictable. + +In the following example, point is at the beginning of the second +line: + +@example +@group + This line is indented twelve spaces. +@point{}The quick brown fox jumped. +@end group +@end example + +@noindent +Evaluation of the expression @code{(indent-relative nil)} produces the +following: + +@example +@group + This line is indented twelve spaces. + @point{}The quick brown fox jumped. +@end group +@end example + + In this next example, point is between the @samp{m} and @samp{p} of +@samp{jumped}: + +@example +@group + This line is indented twelve spaces. +The quick brown fox jum@point{}ped. +@end group +@end example + +@noindent +Evaluation of the expression @code{(indent-relative nil)} produces the +following: + +@example +@group + This line is indented twelve spaces. +The quick brown fox jum @point{}ped. +@end group +@end example +@end deffn + +@deffn Command indent-relative-maybe +@comment !!SourceFile indent.el +This command indents the current line like the previous nonblank line, +by calling @code{indent-relative} with @code{t} as the +@var{unindented-ok} argument. The return value is unpredictable. + +If the previous nonblank line has no indent points beyond the current +column, this command does nothing. +@end deffn + +@node Indent Tabs +@comment node-name, next, previous, up +@subsection Adjustable ``Tab Stops'' +@cindex tabs stops for indentation + + This section explains the mechanism for user-specified ``tab stops'' +and the mechanisms that 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 next tab stop column; it does not +affect the display of tab characters in the buffer (@pxref{Usual +Display}). Note that the @key{TAB} character as input uses this tab +stop feature only in a few major modes, such as Text mode. +@xref{Tab Stops,,, emacs, The GNU Emacs Manual}. + +@deffn Command tab-to-tab-stop +This command inserts spaces or tabs before point, up to the next tab +stop column defined by @code{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. It does nothing if no such element is +found. +@end deffn + +@defopt tab-stop-list +This variable is the list of tab stop columns used by +@code{tab-to-tab-stops}. The elements should be integers in increasing +order. The tab stop columns need not be evenly spaced. + +Use @kbd{M-x edit-tab-stops} to edit the location of tab stops +interactively. +@end defopt + +@node Motion by Indent +@subsection Indentation-Based Motion Commands + + These commands, primarily for interactive use, act based on the +indentation in the text. + +@deffn Command back-to-indentation +@comment !!SourceFile simple.el +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 +@code{nil}. +@end deffn + +@deffn Command backward-to-indentation &optional arg +@comment !!SourceFile simple.el +This command moves point backward @var{arg} lines and then to the +first nonblank character on that line. It returns @code{nil}. +If @var{arg} is omitted or @code{nil}, it defaults to 1. +@end deffn + +@deffn Command forward-to-indentation &optional arg +@comment !!SourceFile simple.el +This command moves point forward @var{arg} lines and then to the first +nonblank character on that line. It returns @code{nil}. +If @var{arg} is omitted or @code{nil}, it defaults to 1. +@end deffn + +@node Case Changes +@comment node-name, next, previous, up +@section Case Changes +@cindex case conversion in buffers + + The case change commands described here work on text in the current +buffer. @xref{Case Conversion}, for case conversion functions that work +on strings and characters. @xref{Case Tables}, for how to customize +which characters are upper or lower case and how to convert them. + +@deffn Command capitalize-region start end +This function capitalizes all words in the region defined by +@var{start} and @var{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 @code{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 @code{capitalize-region} is called interactively, @var{start} and +@var{end} are point and the mark, with the smallest first. + +@example +@group +---------- Buffer: foo ---------- +This is the contents of the 5th foo. +---------- Buffer: foo ---------- +@end group + +@group +(capitalize-region 1 44) +@result{} nil + +---------- Buffer: foo ---------- +This Is The Contents Of The 5th Foo. +---------- Buffer: foo ---------- +@end group +@end example +@end deffn + +@deffn Command downcase-region start end +This function converts all of the letters in the region defined by +@var{start} and @var{end} to lower case. The function returns +@code{nil}. + +When @code{downcase-region} is called interactively, @var{start} and +@var{end} are point and the mark, with the smallest first. +@end deffn + +@deffn Command upcase-region start end +This function converts all of the letters in the region defined by +@var{start} and @var{end} to upper case. The function returns +@code{nil}. + +When @code{upcase-region} is called interactively, @var{start} and +@var{end} are point and the mark, with the smallest first. +@end deffn + +@deffn Command capitalize-word count +This function capitalizes @var{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 @var{count} is negative, the function capitalizes the +@minus{}@var{count} previous words but does not move point. The value +is @code{nil}. + +If point is in the middle of a word, the part of the word before point +is ignored when moving forward. The rest is treated as an entire word. + +When @code{capitalize-word} is called interactively, @var{count} is +set to the numeric prefix argument. +@end deffn + +@deffn Command downcase-word count +This function converts the @var{count} words after point to all lower +case, moving point over as it does. If @var{count} is negative, it +converts the @minus{}@var{count} previous words but does not move point. +The value is @code{nil}. + +When @code{downcase-word} is called interactively, @var{count} is set +to the numeric prefix argument. +@end deffn + +@deffn Command upcase-word count +This function converts the @var{count} words after point to all upper +case, moving point over as it does. If @var{count} is negative, it +converts the @minus{}@var{count} previous words but does not move point. +The value is @code{nil}. + +When @code{upcase-word} is called interactively, @var{count} is set to +the numeric prefix argument. +@end deffn + +@node Text Properties +@section Text Properties +@cindex text properties +@cindex attributes of text +@cindex properties of text + + Each character position in a buffer or a string can have a @dfn{text +property list}, much like the property list of a symbol (@pxref{Property +Lists}). The properties belong to a particular character at a +particular place, such as, the letter @samp{T} at the beginning of this +sentence or the first @samp{o} in @samp{foo}---if the same character +occurs in two different places, the two occurrences in general have +different properties. + + Each property has a name and a value. Both of these can be any Lisp +object, but the name is normally a symbol. Typically each property +name symbol is used for a particular purpose; for instance, the text +property @code{face} specifies the faces for displaying the character +(@pxref{Special Properties}). The usual way to access the property +list is to specify a name and ask what value corresponds to it. + + If a character has a @code{category} property, we call it the +@dfn{property category} of the character. It should be a symbol. The +properties of the symbol serve as defaults for the properties of the +character. + + Copying text between strings and buffers preserves the properties +along with the characters; this includes such diverse functions as +@code{substring}, @code{insert}, and @code{buffer-substring}. + +@menu +* Examining Properties:: Looking at the properties of one character. +* Changing Properties:: Setting the properties of a range of text. +* Property Search:: Searching for where a property changes value. +* Special Properties:: Particular properties with special meanings. +* Format Properties:: Properties for representing formatting of text. +* Sticky Properties:: How inserted text gets properties from + neighboring text. +* Lazy Properties:: Computing text properties in a lazy fashion + only when text is examined. +* Clickable Text:: Using text properties to make regions of text + do something when you click on them. +* Links and Mouse-1:: How to make @key{Mouse-1} follow a link. +* Fields:: The @code{field} property defines + fields within the buffer. +* Not Intervals:: Why text properties do not use + Lisp-visible text intervals. +@end menu + +@node Examining Properties +@subsection Examining Text Properties + + The simplest way to examine text properties is to ask for the value of +a particular property of a particular character. For that, use +@code{get-text-property}. Use @code{text-properties-at} to get the +entire property list of a character. @xref{Property Search}, for +functions to examine the properties of a number of characters at once. + + These functions handle both strings and buffers. Keep in mind that +positions in a string start from 0, whereas positions in a buffer start +from 1. + +@defun get-text-property pos prop &optional object +This function returns the value of the @var{prop} property of the +character after position @var{pos} in @var{object} (a buffer or +string). The argument @var{object} is optional and defaults to the +current buffer. + +If there is no @var{prop} property strictly speaking, but the character +has a property category that is a symbol, then @code{get-text-property} returns +the @var{prop} property of that symbol. +@end defun + +@defun get-char-property position prop &optional object +This function is like @code{get-text-property}, except that it checks +overlays first and then text properties. @xref{Overlays}. + +The argument @var{object} may be a string, a buffer, or a window. If it +is a window, then the buffer displayed in that window is used for text +properties and overlays, but only the overlays active for that window +are considered. If @var{object} is a buffer, then all overlays in that +buffer are considered, as well as text properties. If @var{object} is a +string, only text properties are considered, since strings never have +overlays. +@end defun + +@defun get-char-property-and-overlay position prop &optional object +This is like @code{get-char-property}, but gives extra information +about the overlay that the property value comes from. + +Its value is a cons cell whose @sc{car} is the property value, the +same value @code{get-char-property} would return with the same +arguments. Its @sc{cdr} is the overlay in which the property was +found, or @code{nil}, if it was found as a text property or not found +at all. + +If @var{position} is at the end of @var{object}, both the @sc{car} and +the @sc{cdr} of the value are @code{nil}. +@end defun + +@defvar char-property-alias-alist +This variable holds an alist which maps property names to a list of +alternative property names. If a character does not specify a direct +value for a property, the alternative property names are consulted in +order; the first non-@code{nil} value is used. This variable takes +precedence over @code{default-text-properties}, and @code{category} +properties take precedence over this variable. +@end defvar + +@defun text-properties-at position &optional object +This function returns the entire property list of the character at +@var{position} in the string or buffer @var{object}. If @var{object} is +@code{nil}, it defaults to the current buffer. +@end defun + +@defvar default-text-properties +This variable holds a property list giving default values for text +properties. Whenever a character does not specify a value for a +property, neither directly, through a category symbol, or through +@code{char-property-alias-alist}, the value stored in this list is +used instead. Here is an example: + +@example +(setq default-text-properties '(foo 69) + char-property-alias-alist nil) +;; @r{Make sure character 1 has no properties of its own.} +(set-text-properties 1 2 nil) +;; @r{What we get, when we ask, is the default value.} +(get-text-property 1 'foo) + @result{} 69 +@end example +@end defvar + +@node Changing Properties +@subsection Changing Text Properties + + The primitives for changing properties apply to a specified range of +text in a buffer or string. The function @code{set-text-properties} +(see end of section) sets the entire property list of the text in that +range; more often, it is useful to add, change, or delete just certain +properties specified by name. + + Since text properties are considered part of the contents of the +buffer (or string), and can affect how a buffer looks on the screen, +any change in buffer text properties marks the buffer as modified. +Buffer text property changes are undoable also (@pxref{Undo}). +Positions in a string start from 0, whereas positions in a buffer +start from 1. + +@defun put-text-property start end prop value &optional object +This function sets the @var{prop} property to @var{value} for the text +between @var{start} and @var{end} in the string or buffer @var{object}. +If @var{object} is @code{nil}, it defaults to the current buffer. +@end defun + +@defun add-text-properties start end props &optional object +This function adds or overrides text properties for the text between +@var{start} and @var{end} in the string or buffer @var{object}. If +@var{object} is @code{nil}, it defaults to the current buffer. + +The argument @var{props} specifies which properties to add. It should +have the form of a property list (@pxref{Property Lists}): a list whose +elements include the property names followed alternately by the +corresponding values. + +The return value is @code{t} if the function actually changed some +property's value; @code{nil} otherwise (if @var{props} is @code{nil} or +its values agree with those in the text). + +For example, here is how to set the @code{comment} and @code{face} +properties of a range of text: + +@example +(add-text-properties @var{start} @var{end} + '(comment t face highlight)) +@end example +@end defun + +@defun remove-text-properties start end props &optional object +This function deletes specified text properties from the text between +@var{start} and @var{end} in the string or buffer @var{object}. If +@var{object} is @code{nil}, it defaults to the current buffer. + +The argument @var{props} specifies which properties to delete. It +should have the form of a property list (@pxref{Property Lists}): a list +whose elements are property names alternating with corresponding values. +But only the names matter---the values that accompany them are ignored. +For example, here's how to remove the @code{face} property. + +@example +(remove-text-properties @var{start} @var{end} '(face nil)) +@end example + +The return value is @code{t} if the function actually changed some +property's value; @code{nil} otherwise (if @var{props} is @code{nil} or +if no character in the specified text had any of those properties). + +To remove all text properties from certain text, use +@code{set-text-properties} and specify @code{nil} for the new property +list. +@end defun + +@defun remove-list-of-text-properties start end list-of-properties &optional object +Like @code{remove-text-properties} except that +@var{list-of-properties} is a list of property names only, not an +alternating list of property names and values. +@end defun + +@defun set-text-properties start end props &optional object +This function completely replaces the text property list for the text +between @var{start} and @var{end} in the string or buffer @var{object}. +If @var{object} is @code{nil}, it defaults to the current buffer. + +The argument @var{props} is the new property list. It should be a list +whose elements are property names alternating with corresponding values. + +After @code{set-text-properties} returns, all the characters in the +specified range have identical properties. + +If @var{props} is @code{nil}, the effect is to get rid of all properties +from the specified range of text. Here's an example: + +@example +(set-text-properties @var{start} @var{end} nil) +@end example + +Do not rely on the return value of this function. +@end defun + + The easiest way to make a string with text properties +is with @code{propertize}: + +@defun propertize string &rest properties +This function returns a copy of @var{string} which has the text +properties @var{properties}. These properties apply to all the +characters in the string that is returned. Here is an example that +constructs a string with a @code{face} property and a @code{mouse-face} +property: + +@smallexample +(propertize "foo" 'face 'italic + 'mouse-face 'bold-italic) + @result{} #("foo" 0 3 (mouse-face bold-italic face italic)) +@end smallexample + +To put different properties on various parts of a string, you can +construct each part with @code{propertize} and then combine them with +@code{concat}: + +@smallexample +(concat + (propertize "foo" 'face 'italic + 'mouse-face 'bold-italic) + " and " + (propertize "bar" 'face 'italic + 'mouse-face 'bold-italic)) + @result{} #("foo and bar" + 0 3 (face italic mouse-face bold-italic) + 3 8 nil + 8 11 (face italic mouse-face bold-italic)) +@end smallexample +@end defun + + See also the function @code{buffer-substring-no-properties} +(@pxref{Buffer Contents}) which copies text from the buffer +but does not copy its properties. + +@node Property Search +@subsection Text Property Search Functions + + In typical use of text properties, most of the time several or many +consecutive characters have the same value for a property. Rather than +writing your programs to examine characters one by one, it is much +faster to process chunks of text that have the same property value. + + Here are functions you can use to do this. They use @code{eq} for +comparing property values. In all cases, @var{object} defaults to the +current buffer. + + For high performance, it's very important to use the @var{limit} +argument to these functions, especially the ones that search for a +single property---otherwise, they may spend a long time scanning to the +end of the buffer, if the property you are interested in does not change. + + These functions do not move point; instead, they return a position (or +@code{nil}). Remember that a position is always between two characters; +the position returned by these functions is between two characters with +different properties. + +@defun next-property-change pos &optional object limit +The function scans the text forward from position @var{pos} in the +string or buffer @var{object} till it finds a change in some text +property, then returns the position of the change. In other words, it +returns the position of the first character beyond @var{pos} whose +properties are not identical to those of the character just after +@var{pos}. + +If @var{limit} is non-@code{nil}, then the scan ends at position +@var{limit}. If there is no property change before that point, +@code{next-property-change} returns @var{limit}. + +The value is @code{nil} if the properties remain unchanged all the way +to the end of @var{object} and @var{limit} is @code{nil}. If the value +is non-@code{nil}, it is a position greater than or equal to @var{pos}. +The value equals @var{pos} only when @var{limit} equals @var{pos}. + +Here is an example of how to scan the buffer by chunks of text within +which all properties are constant: + +@smallexample +(while (not (eobp)) + (let ((plist (text-properties-at (point))) + (next-change + (or (next-property-change (point) (current-buffer)) + (point-max)))) + @r{Process text from point to @var{next-change}@dots{}} + (goto-char next-change))) +@end smallexample +@end defun + +@defun previous-property-change pos &optional object limit +This is like @code{next-property-change}, but scans back from @var{pos} +instead of forward. If the value is non-@code{nil}, it is a position +less than or equal to @var{pos}; it equals @var{pos} only if @var{limit} +equals @var{pos}. +@end defun + +@defun next-single-property-change pos prop &optional object limit +The function scans text for a change in the @var{prop} property, then +returns the position of the change. The scan goes forward from +position @var{pos} in the string or buffer @var{object}. In other +words, this function returns the position of the first character +beyond @var{pos} whose @var{prop} property differs from that of the +character just after @var{pos}. + +If @var{limit} is non-@code{nil}, then the scan ends at position +@var{limit}. If there is no property change before that point, +@code{next-single-property-change} returns @var{limit}. + +The value is @code{nil} if the property remains unchanged all the way to +the end of @var{object} and @var{limit} is @code{nil}. If the value is +non-@code{nil}, it is a position greater than or equal to @var{pos}; it +equals @var{pos} only if @var{limit} equals @var{pos}. +@end defun + +@defun previous-single-property-change pos prop &optional object limit +This is like @code{next-single-property-change}, but scans back from +@var{pos} instead of forward. If the value is non-@code{nil}, it is a +position less than or equal to @var{pos}; it equals @var{pos} only if +@var{limit} equals @var{pos}. +@end defun + +@defun next-char-property-change pos &optional limit +This is like @code{next-property-change} except that it considers +overlay properties as well as text properties, and if no change is +found before the end of the buffer, it returns the maximum buffer +position rather than @code{nil} (in this sense, it resembles the +corresponding overlay function @code{next-overlay-change}, rather than +@code{next-property-change}). There is no @var{object} operand +because this function operates only on the current buffer. It returns +the next address at which either kind of property changes. +@end defun + +@defun previous-char-property-change pos &optional limit +This is like @code{next-char-property-change}, but scans back from +@var{pos} instead of forward, and returns the minimum buffer +position if no change is found. +@end defun + +@defun next-single-char-property-change pos prop &optional object limit +This is like @code{next-single-property-change} except that it +considers overlay properties as well as text properties, and if no +change is found before the end of the @var{object}, it returns the +maximum valid position in @var{object} rather than @code{nil}. Unlike +@code{next-char-property-change}, this function @emph{does} have an +@var{object} operand; if @var{object} is not a buffer, only +text-properties are considered. +@end defun + +@defun previous-single-char-property-change pos prop &optional object limit +This is like @code{next-single-char-property-change}, but scans back +from @var{pos} instead of forward, and returns the minimum valid +position in @var{object} if no change is found. +@end defun + +@defun text-property-any start end prop value &optional object +This function returns non-@code{nil} if at least one character between +@var{start} and @var{end} has a property @var{prop} whose value is +@var{value}. More precisely, it returns the position of the first such +character. Otherwise, it returns @code{nil}. + +The optional fifth argument, @var{object}, specifies the string or +buffer to scan. Positions are relative to @var{object}. The default +for @var{object} is the current buffer. +@end defun + +@defun text-property-not-all start end prop value &optional object +This function returns non-@code{nil} if at least one character between +@var{start} and @var{end} does not have a property @var{prop} with value +@var{value}. More precisely, it returns the position of the first such +character. Otherwise, it returns @code{nil}. + +The optional fifth argument, @var{object}, specifies the string or +buffer to scan. Positions are relative to @var{object}. The default +for @var{object} is the current buffer. +@end defun + +@node Special Properties +@subsection Properties with Special Meanings + + Here is a table of text property names that have special built-in +meanings. The following sections list a few additional special property +names that control filling and property inheritance. All other names +have no standard meaning, and you can use them as you like. + + Note: the properties @code{composition}, @code{display}, +@code{invisible} and @code{intangible} can also cause point to move to +an acceptable place, after each Emacs command. @xref{Adjusting +Point}. + +@table @code +@cindex property category of text character +@kindex category @r{(text property)} +@item category +If a character has a @code{category} property, we call it the +@dfn{property category} of the character. It should be a symbol. The +properties of this symbol serve as defaults for the properties of the +character. + +@item face +@cindex face codes of text +@kindex face @r{(text property)} +You can use the property @code{face} to control the font and color of +text. @xref{Faces}, for more information. + +In the simplest case, the value is a face name. It can also be a list; +then each element can be any of these possibilities; + +@itemize @bullet +@item +A face name (a symbol or string). + +@item +A property list of face attributes. This has the +form (@var{keyword} @var{value} @dots{}), where each @var{keyword} is a +face attribute name and @var{value} is a meaningful value for that +attribute. With this feature, you do not need to create a face each +time you want to specify a particular attribute for certain text. +@xref{Face Attributes}. + +@item +A cons cell with the form @code{(foreground-color . @var{color-name})} or +@code{(background-color . @var{color-name})}. These elements specify +just the foreground color or just the background color. @xref{Color +Names}, for the supported forms of @var{color-name}. + +A cons cell of @code{(foreground-color . @var{color-name})} is equivalent to +specifying @code{(:foreground @var{color-name})}; likewise for the +background. +@end itemize + +You can use Font Lock Mode (@pxref{Font Lock Mode}), to dynamically +update @code{face} properties based on the contents of the text. + +@item font-lock-face +@kindex font-lock-face @r{(text property)} +The @code{font-lock-face} property is the same in all respects as the +@code{face} property, but its state of activation is controlled by +@code{font-lock-mode}. This can be advantageous for special buffers +which are not intended to be user-editable, or for static areas of +text which are always fontified in the same way. +@xref{Precalculated Fontification}. + +Strictly speaking, @code{font-lock-face} is not a built-in text +property; rather, it is implemented in Font Lock mode using +@code{char-property-alias-alist}. @xref{Examining Properties}. + +This property is new in Emacs 22.1. + +@item mouse-face +@kindex mouse-face @r{(text property)} +The property @code{mouse-face} is used instead of @code{face} when the +mouse is on or near the character. For this purpose, ``near'' means +that all text between the character and where the mouse is have the same +@code{mouse-face} property value. + +@item fontified +@kindex fontified @r{(text property)} +This property says whether the text is ready for display. If +@code{nil}, Emacs's redisplay routine calls the functions in +@code{fontification-functions} (@pxref{Auto Faces}) to prepare this +part of the buffer before it is displayed. It is used internally by +the ``just in time'' font locking code. + +@item display +This property activates various features that change the +way text is displayed. For example, it can make text appear taller +or shorter, higher or lower, wider or narrow, or replaced with an image. +@xref{Display Property}. + +@item help-echo +@kindex help-echo @r{(text property)} +@cindex tooltip +@anchor{Text help-echo} +If text has a string as its @code{help-echo} property, then when you +move the mouse onto that text, Emacs displays that string in the echo +area, or in the tooltip window (@pxref{Tooltips,,, emacs, The GNU Emacs +Manual}). + +If the value of the @code{help-echo} property is a function, that +function is called with three arguments, @var{window}, @var{object} and +@var{pos} and should return a help string or @code{nil} for +none. The first argument, @var{window} is the window in which +the help was found. The second, @var{object}, is the buffer, overlay or +string which had the @code{help-echo} property. The @var{pos} +argument is as follows: + +@itemize @bullet{} +@item +If @var{object} is a buffer, @var{pos} is the position in the buffer. +@item +If @var{object} is an overlay, that overlay has a @code{help-echo} +property, and @var{pos} is the position in the overlay's buffer. +@item +If @var{object} is a string (an overlay string or a string displayed +with the @code{display} property), @var{pos} is the position in that +string. +@end itemize + +If the value of the @code{help-echo} property is neither a function nor +a string, it is evaluated to obtain a help string. + +You can alter the way help text is displayed by setting the variable +@code{show-help-function} (@pxref{Help display}). + +This feature is used in the mode line and for other active text. + +@item keymap +@cindex keymap of character +@kindex keymap @r{(text property)} +The @code{keymap} property specifies an additional keymap for +commands. When this keymap applies, it is used for key lookup before +the minor mode keymaps and before the buffer's local map. +@xref{Active Keymaps}. If the property value is a symbol, the +symbol's function definition is used as the keymap. + +The property's value for the character before point applies if it is +non-@code{nil} and rear-sticky, and the property's value for the +character after point applies if it is non-@code{nil} and +front-sticky. (For mouse clicks, the position of the click is used +instead of the position of point.) + +@item local-map +@kindex local-map @r{(text property)} +This property works like @code{keymap} except that it specifies a +keymap to use @emph{instead of} the buffer's local map. For most +purposes (perhaps all purposes), it is better to use the @code{keymap} +property. + +@item syntax-table +The @code{syntax-table} property overrides what the syntax table says +about this particular character. @xref{Syntax Properties}. + +@item read-only +@cindex read-only character +@kindex read-only @r{(text property)} +If a character has the property @code{read-only}, then modifying that +character is not allowed. Any command that would do so gets an error, +@code{text-read-only}. If the property value is a string, that string +is used as the error message. + +Insertion next to a read-only character is an error if inserting +ordinary text there would inherit the @code{read-only} property due to +stickiness. Thus, you can control permission to insert next to +read-only text by controlling the stickiness. @xref{Sticky Properties}. + +Since changing properties counts as modifying the buffer, it is not +possible to remove a @code{read-only} property unless you know the +special trick: bind @code{inhibit-read-only} to a non-@code{nil} value +and then remove the property. @xref{Read Only Buffers}. + +@item invisible +@kindex invisible @r{(text property)} +A non-@code{nil} @code{invisible} property can make a character invisible +on the screen. @xref{Invisible Text}, for details. + +@item intangible +@kindex intangible @r{(text property)} +If a group of consecutive characters have equal and non-@code{nil} +@code{intangible} properties, then you cannot place point between them. +If you try to move point forward into the group, point actually moves to +the end of the group. If you try to move point backward into the group, +point actually moves to the start of the group. + +If consecutive characters have unequal non-@code{nil} +@code{intangible} properties, they belong to separate groups; each +group is separately treated as described above. + +When the variable @code{inhibit-point-motion-hooks} is non-@code{nil}, +the @code{intangible} property is ignored. + +@item field +@kindex field @r{(text property)} +Consecutive characters with the same @code{field} property constitute a +@dfn{field}. Some motion functions including @code{forward-word} and +@code{beginning-of-line} stop moving at a field boundary. +@xref{Fields}. + +@item cursor +@kindex cursor @r{(text property)} +Normally, the cursor is displayed at the end of any overlay and text +property strings present at the current window position. You can +place the cursor on any desired character of these strings by giving +that character a non-@code{nil} @var{cursor} text property. + +@item pointer +@kindex pointer @r{(text property)} +This specifies a specific pointer shape when the mouse pointer is over +this text or image. @xref{Pointer Shape}, for possible pointer +shapes. + +@item line-spacing +@kindex line-spacing @r{(text property)} +A newline can have a @code{line-spacing} text or overlay property that +controls the height of the display line ending with that newline. The +property value overrides the default frame line spacing and the buffer +local @code{line-spacing} variable. @xref{Line Height}. + +@item line-height +@kindex line-height @r{(text property)} +A newline can have a @code{line-height} text or overlay property that +controls the total height of the display line ending in that newline. +@xref{Line Height}. + +@item modification-hooks +@cindex change hooks for a character +@cindex hooks for changing a character +@kindex modification-hooks @r{(text property)} +If a character has the property @code{modification-hooks}, then its +value should be a list of functions; modifying that character calls all +of those functions. Each function receives two arguments: the beginning +and end of the part of the buffer being modified. Note that if a +particular modification hook function appears on several characters +being modified by a single primitive, you can't predict how many times +the function will be called. + +If these functions modify the buffer, they should bind +@code{inhibit-modification-hooks} to @code{t} around doing so, to +avoid confusing the internal mechanism that calls these hooks. + +Overlays also support the @code{modification-hooks} property, but the +details are somewhat different (@pxref{Overlay Properties}). + +@item insert-in-front-hooks +@itemx insert-behind-hooks +@kindex insert-in-front-hooks @r{(text property)} +@kindex insert-behind-hooks @r{(text property)} +The operation of inserting text in a buffer also calls the functions +listed in the @code{insert-in-front-hooks} property of the following +character and in the @code{insert-behind-hooks} property of the +preceding character. These functions receive two arguments, the +beginning and end of the inserted text. The functions are called +@emph{after} the actual insertion takes place. + +See also @ref{Change Hooks}, for other hooks that are called +when you change text in a buffer. + +@item point-entered +@itemx point-left +@cindex hooks for motion of point +@kindex point-entered @r{(text property)} +@kindex point-left @r{(text property)} +The special properties @code{point-entered} and @code{point-left} +record hook functions that report motion of point. Each time point +moves, Emacs compares these two property values: + +@itemize @bullet +@item +the @code{point-left} property of the character after the old location, +and +@item +the @code{point-entered} property of the character after the new +location. +@end itemize + +@noindent +If these two values differ, each of them is called (if not @code{nil}) +with two arguments: the old value of point, and the new one. + +The same comparison is made for the characters before the old and new +locations. The result may be to execute two @code{point-left} functions +(which may be the same function) and/or two @code{point-entered} +functions (which may be the same function). In any case, all the +@code{point-left} functions are called first, followed by all the +@code{point-entered} functions. + +It is possible with @code{char-after} to examine characters at various +buffer positions without moving point to those positions. Only an +actual change in the value of point runs these hook functions. + +@defvar inhibit-point-motion-hooks +When this variable is non-@code{nil}, @code{point-left} and +@code{point-entered} hooks are not run, and the @code{intangible} +property has no effect. Do not set this variable globally; bind it with +@code{let}. +@end defvar + +@defvar show-help-function +@anchor{Help display} If this variable is non-@code{nil}, it specifies a +function called to display help strings. These may be @code{help-echo} +properties, menu help strings (@pxref{Simple Menu Items}, +@pxref{Extended Menu Items}), or tool bar help strings (@pxref{Tool +Bar}). The specified function is called with one argument, the help +string to display. Tooltip mode (@pxref{Tooltips,,, emacs, The GNU Emacs +Manual}) provides an example. +@end defvar + +@item composition +@kindex composition @r{(text property)} +This text property is used to display a sequence of characters as a +single glyph composed from components. But the value of the property +itself is completely internal to Emacs and should not be manipulated +directly by, for instance, @code{put-text-property}. + +@end table + +@node Format Properties +@subsection Formatted Text Properties + + These text properties affect the behavior of the fill commands. They +are used for representing formatted text. @xref{Filling}, and +@ref{Margins}. + +@table @code +@item hard +If a newline character has this property, it is a ``hard'' newline. +The fill commands do not alter hard newlines and do not move words +across them. However, this property takes effect only if the +@code{use-hard-newlines} minor mode is enabled. @xref{Hard and Soft +Newlines,, Hard and Soft Newlines, emacs, The GNU Emacs Manual}. + +@item right-margin +This property specifies an extra right margin for filling this part of the +text. + +@item left-margin +This property specifies an extra left margin for filling this part of the +text. + +@item justification +This property specifies the style of justification for filling this part +of the text. +@end table + +@node Sticky Properties +@subsection Stickiness of Text Properties +@cindex sticky text properties +@cindex inheritance of text properties + + Self-inserting characters normally take on the same properties as the +preceding character. This is called @dfn{inheritance} of properties. + + In a Lisp program, you can do insertion with inheritance or without, +depending on your choice of insertion primitive. The ordinary text +insertion functions such as @code{insert} do not inherit any properties. +They insert text with precisely the properties of the string being +inserted, and no others. This is correct for programs that copy text +from one context to another---for example, into or out of the kill ring. +To insert with inheritance, use the special primitives described in this +section. Self-inserting characters inherit properties because they work +using these primitives. + + When you do insertion with inheritance, @emph{which} properties are +inherited, and from where, depends on which properties are @dfn{sticky}. +Insertion after a character inherits those of its properties that are +@dfn{rear-sticky}. Insertion before a character inherits those of its +properties that are @dfn{front-sticky}. When both sides offer different +sticky values for the same property, the previous character's value +takes precedence. + + By default, a text property is rear-sticky but not front-sticky; thus, +the default is to inherit all the properties of the preceding character, +and nothing from the following character. + + You can control the stickiness of various text properties with two +specific text properties, @code{front-sticky} and @code{rear-nonsticky}, +and with the variable @code{text-property-default-nonsticky}. You can +use the variable to specify a different default for a given property. +You can use those two text properties to make any specific properties +sticky or nonsticky in any particular part of the text. + + If a character's @code{front-sticky} property is @code{t}, then all +its properties are front-sticky. If the @code{front-sticky} property is +a list, then the sticky properties of the character are those whose +names are in the list. For example, if a character has a +@code{front-sticky} property whose value is @code{(face read-only)}, +then insertion before the character can inherit its @code{face} property +and its @code{read-only} property, but no others. + + The @code{rear-nonsticky} property works the opposite way. Most +properties are rear-sticky by default, so the @code{rear-nonsticky} +property says which properties are @emph{not} rear-sticky. If a +character's @code{rear-nonsticky} property is @code{t}, then none of its +properties are rear-sticky. If the @code{rear-nonsticky} property is a +list, properties are rear-sticky @emph{unless} their names are in the +list. + +@defvar text-property-default-nonsticky +This variable holds an alist which defines the default rear-stickiness +of various text properties. Each element has the form +@code{(@var{property} . @var{nonstickiness})}, and it defines the +stickiness of a particular text property, @var{property}. + +If @var{nonstickiness} is non-@code{nil}, this means that the property +@var{property} is rear-nonsticky by default. Since all properties are +front-nonsticky by default, this makes @var{property} nonsticky in both +directions by default. + +The text properties @code{front-sticky} and @code{rear-nonsticky}, when +used, take precedence over the default @var{nonstickiness} specified in +@code{text-property-default-nonsticky}. +@end defvar + + Here are the functions that insert text with inheritance of properties: + +@defun insert-and-inherit &rest strings +Insert the strings @var{strings}, just like the function @code{insert}, +but inherit any sticky properties from the adjoining text. +@end defun + +@defun insert-before-markers-and-inherit &rest strings +Insert the strings @var{strings}, just like the function +@code{insert-before-markers}, but inherit any sticky properties from the +adjoining text. +@end defun + + @xref{Insertion}, for the ordinary insertion functions which do not +inherit. + +@node Lazy Properties +@subsection Lazy Computation of Text Properties + + Instead of computing text properties for all the text in the buffer, +you can arrange to compute the text properties for parts of the text +when and if something depends on them. + + The primitive that extracts text from the buffer along with its +properties is @code{buffer-substring}. Before examining the properties, +this function runs the abnormal hook @code{buffer-access-fontify-functions}. + +@defvar buffer-access-fontify-functions +This variable holds a list of functions for computing text properties. +Before @code{buffer-substring} copies the text and text properties for a +portion of the buffer, it calls all the functions in this list. Each of +the functions receives two arguments that specify the range of the +buffer being accessed. (The buffer itself is always the current +buffer.) +@end defvar + + The function @code{buffer-substring-no-properties} does not call these +functions, since it ignores text properties anyway. + + In order to prevent the hook functions from being called more than +once for the same part of the buffer, you can use the variable +@code{buffer-access-fontified-property}. + +@defvar buffer-access-fontified-property +If this variable's value is non-@code{nil}, it is a symbol which is used +as a text property name. A non-@code{nil} value for that text property +means, ``the other text properties for this character have already been +computed.'' + +If all the characters in the range specified for @code{buffer-substring} +have a non-@code{nil} value for this property, @code{buffer-substring} +does not call the @code{buffer-access-fontify-functions} functions. It +assumes these characters already have the right text properties, and +just copies the properties they already have. + +The normal way to use this feature is that the +@code{buffer-access-fontify-functions} functions add this property, as +well as others, to the characters they operate on. That way, they avoid +being called over and over for the same text. +@end defvar + +@node Clickable Text +@subsection Defining Clickable Text +@cindex clickable text + + @dfn{Clickable text} is text that can be clicked, with either the +the mouse or via keyboard commands, to produce some result. Many +major modes use clickable text to implement features such as +hyper-links. The @code{button} package provides an easy way to insert +and manipulate clickable text. @xref{Buttons}. + + In this section, we will explain how to manually set up clickable +text in a buffer using text properties. This involves two things: (1) +indicating clickability when the mouse moves over the text, and (2) +making @kbd{RET} or a mouse click on that text do something. + + Indicating clickability usually involves highlighting the text, and +often involves displaying helpful information about the action, such +as which mouse button to press, or a short summary of the action. +This can be done with the @code{mouse-face} and @code{help-echo} +text properties. @xref{Special Properties}. +Here is an example of how Dired does it: + +@smallexample +(condition-case nil + (if (dired-move-to-filename) + (add-text-properties + (point) + (save-excursion + (dired-move-to-end-of-filename) + (point)) + '(mouse-face highlight + help-echo "mouse-2: visit this file in other window"))) + (error nil)) +@end smallexample + +@noindent +The first two arguments to @code{add-text-properties} specify the +beginning and end of the text. + + The usual way to make the mouse do something when you click it +on this text is to define @code{mouse-2} in the major mode's +keymap. The job of checking whether the click was on clickable text +is done by the command definition. Here is how Dired does it: + +@smallexample +(defun dired-mouse-find-file-other-window (event) + "In Dired, visit the file or directory name you click on." + (interactive "e") + (let (window pos file) + (save-excursion + (setq window (posn-window (event-end event)) + pos (posn-point (event-end event))) + (if (not (windowp window)) + (error "No file chosen")) + (set-buffer (window-buffer window)) + (goto-char pos) + (setq file (dired-get-file-for-visit))) + (if (file-directory-p file) + (or (and (cdr dired-subdir-alist) + (dired-goto-subdir file)) + (progn + (select-window window) + (dired-other-window file))) + (select-window window) + (find-file-other-window (file-name-sans-versions file t))))) +@end smallexample + +@noindent +The reason for the @code{save-excursion} construct is to avoid +changing the current buffer. In this case, +Dired uses the functions @code{posn-window} and @code{posn-point} +to determine which buffer the click happened in and where, and +in that buffer, @code{dired-get-file-for-visit} to determine which +file to visit. + + Instead of defining a mouse command for the major mode, you can define +a key binding for the clickable text itself, using the @code{keymap} +text property: + +@example +(let ((map (make-sparse-keymap))) + (define-key map [mouse-2] 'operate-this-button) + (put-text-property (point) + (save-excursion + (dired-move-to-end-of-filename) + (point)) + 'keymap map)) +@end example + +@noindent +This method makes it possible to define different commands for various +clickable pieces of text. Also, the major mode definition (or the +global definition) remains available for the rest of the text in the +buffer. + +@node Links and Mouse-1 +@subsection Links and Mouse-1 +@cindex follow links +@cindex mouse-1 + + The normal Emacs command for activating text in read-only buffers is +@key{Mouse-2}, which includes following textual links. However, most +graphical applications use @key{Mouse-1} for following links. For +compatibility, @key{Mouse-1} follows links in Emacs too, when you +click on a link quickly without moving the mouse. The user can +customize this behavior through the variable +@code{mouse-1-click-follows-link}. + + To define text as a link at the Lisp level, you should bind the +@code{mouse-2} event to a command to follow the link. Then, to indicate that +@key{Mouse-1} should also follow the link, you should specify a +@code{follow-link} condition either as a text property or as a key +binding: + +@table @asis +@item @code{follow-link} property +If the clickable text has a non-@code{nil} @code{follow-link} text or overlay +property, that specifies the condition. + +@item @code{follow-link} event +If there is a binding for the @code{follow-link} event, either on the +clickable text or in the local keymap, the binding is the condition. +@end table + + Regardless of how you set the @code{follow-link} condition, its +value is used as follows to determine whether the given position is +inside a link, and (if so) to compute an @dfn{action code} saying how +@key{Mouse-1} should handle the link. + +@table @asis +@item @code{mouse-face} +If the condition is @code{mouse-face}, a position is inside a link if +there is a non-@code{nil} @code{mouse-face} property at that position. +The action code is always @code{t}. + +For example, here is how Info mode handles @key{Mouse-1}: + +@smallexample +(define-key Info-mode-map [follow-link] 'mouse-face) +@end smallexample + +@item a function +If the condition is a valid function, @var{func}, then a position +@var{pos} is inside a link if @code{(@var{func} @var{pos})} evaluates +to non-@code{nil}. The value returned by @var{func} serves as the +action code. + +For example, here is how pcvs enables @key{Mouse-1} to follow links on +file names only: + +@smallexample +(define-key map [follow-link] + (lambda (pos) + (eq (get-char-property pos 'face) 'cvs-filename-face))) +@end smallexample + +@item anything else +If the condition value is anything else, then the position is inside a +link and the condition itself is the action code. Clearly you should +only specify this kind of condition on the text that constitutes a +link. +@end table + +@noindent +The action code tells @key{Mouse-1} how to follow the link: + +@table @asis +@item a string or vector +If the action code is a string or vector, the @key{Mouse-1} event is +translated into the first element of the string or vector; i.e., the +action of the @key{Mouse-1} click is the local or global binding of +that character or symbol. Thus, if the action code is @code{"foo"}, +@key{Mouse-1} translates into @kbd{f}. If it is @code{[foo]}, +@key{Mouse-1} translates into @key{foo}. + +@item anything else +For any other non-@code{nil} action code, the @code{mouse-1} event is +translated into a @code{mouse-2} event at the same position. +@end table + + To define @key{Mouse-1} to activate a button defined with +@code{define-button-type}, give the button a @code{follow-link} +property with a value as specified above to determine how to follow +the link. For example, here is how Help mode handles @key{Mouse-1}: + +@smallexample +(define-button-type 'help-xref + 'follow-link t + 'action #'help-button-action) +@end smallexample + + To define @key{Mouse-1} on a widget defined with +@code{define-widget}, give the widget a @code{:follow-link} property +with a value as specified above to determine how to follow the link. + +For example, here is how the @code{link} widget specifies that +a @key{Mouse-1} click shall be translated to @key{RET}: + +@smallexample +(define-widget 'link 'item + "An embedded link." + :button-prefix 'widget-link-prefix + :button-suffix 'widget-link-suffix + :follow-link "\C-m" + :help-echo "Follow the link." + :format "%[%t%]") +@end smallexample + +@defun mouse-on-link-p pos +This function returns non-@code{nil} if position @var{pos} in the +current buffer is on a link. @var{pos} can also be a mouse event +location, as returned by @code{event-start} (@pxref{Accessing Events}). +@end defun + +@node Fields +@subsection Defining and Using Fields +@cindex fields + + A field is a range of consecutive characters in the buffer that are +identified by having the same value (comparing with @code{eq}) of the +@code{field} property (either a text-property or an overlay property). +This section describes special functions that are available for +operating on fields. + + You specify a field with a buffer position, @var{pos}. We think of +each field as containing a range of buffer positions, so the position +you specify stands for the field containing that position. + + When the characters before and after @var{pos} are part of the same +field, there is no doubt which field contains @var{pos}: the one those +characters both belong to. When @var{pos} is at a boundary between +fields, which field it belongs to depends on the stickiness of the +@code{field} properties of the two surrounding characters (@pxref{Sticky +Properties}). The field whose property would be inherited by text +inserted at @var{pos} is the field that contains @var{pos}. + + There is an anomalous case where newly inserted text at @var{pos} +would not inherit the @code{field} property from either side. This +happens if the previous character's @code{field} property is not +rear-sticky, and the following character's @code{field} property is not +front-sticky. In this case, @var{pos} belongs to neither the preceding +field nor the following field; the field functions treat it as belonging +to an empty field whose beginning and end are both at @var{pos}. + + In all of these functions, if @var{pos} is omitted or @code{nil}, the +value of point is used by default. If narrowing is in effect, then +@var{pos} should fall within the accessible portion. @xref{Narrowing}. + +@defun field-beginning &optional pos escape-from-edge limit +This function returns the beginning of the field specified by @var{pos}. + +If @var{pos} is at the beginning of its field, and +@var{escape-from-edge} is non-@code{nil}, then the return value is +always the beginning of the preceding field that @emph{ends} at @var{pos}, +regardless of the stickiness of the @code{field} properties around +@var{pos}. + +If @var{limit} is non-@code{nil}, it is a buffer position; if the +beginning of the field is before @var{limit}, then @var{limit} will be +returned instead. +@end defun + +@defun field-end &optional pos escape-from-edge limit +This function returns the end of the field specified by @var{pos}. + +If @var{pos} is at the end of its field, and @var{escape-from-edge} is +non-@code{nil}, then the return value is always the end of the following +field that @emph{begins} at @var{pos}, regardless of the stickiness of +the @code{field} properties around @var{pos}. + +If @var{limit} is non-@code{nil}, it is a buffer position; if the end +of the field is after @var{limit}, then @var{limit} will be returned +instead. +@end defun + +@defun field-string &optional pos +This function returns the contents of the field specified by @var{pos}, +as a string. +@end defun + +@defun field-string-no-properties &optional pos +This function returns the contents of the field specified by @var{pos}, +as a string, discarding text properties. +@end defun + +@defun delete-field &optional pos +This function deletes the text of the field specified by @var{pos}. +@end defun + +@defun constrain-to-field new-pos old-pos &optional escape-from-edge only-in-line inhibit-capture-property +This function ``constrains'' @var{new-pos} to the field that +@var{old-pos} belongs to---in other words, it returns the position +closest to @var{new-pos} that is in the same field as @var{old-pos}. + +If @var{new-pos} is @code{nil}, then @code{constrain-to-field} uses +the value of point instead, and moves point to the resulting position +as well as returning it. + +If @var{old-pos} is at the boundary of two fields, then the acceptable +final positions depend on the argument @var{escape-from-edge}. If +@var{escape-from-edge} is @code{nil}, then @var{new-pos} must be in +the field whose @code{field} property equals what new characters +inserted at @var{old-pos} would inherit. (This depends on the +stickiness of the @code{field} property for the characters before and +after @var{old-pos}.) If @var{escape-from-edge} is non-@code{nil}, +@var{new-pos} can be anywhere in the two adjacent fields. +Additionally, if two fields are separated by another field with the +special value @code{boundary}, then any point within this special +field is also considered to be ``on the boundary.'' + +Commands like @kbd{C-a} with no argumemt, that normally move backward +to a specific kind of location and stay there once there, probably +should specify @code{nil} for @var{escape-from-edge}. Other motion +commands that check fields should probably pass @code{t}. + +If the optional argument @var{only-in-line} is non-@code{nil}, and +constraining @var{new-pos} in the usual way would move it to a different +line, @var{new-pos} is returned unconstrained. This used in commands +that move by line, such as @code{next-line} and +@code{beginning-of-line}, so that they respect field boundaries only in +the case where they can still move to the right line. + +If the optional argument @var{inhibit-capture-property} is +non-@code{nil}, and @var{old-pos} has a non-@code{nil} property of that +name, then any field boundaries are ignored. + +You can cause @code{constrain-to-field} to ignore all field boundaries +(and so never constrain anything) by binding the variable +@code{inhibit-field-text-motion} to a non-@code{nil} value. +@end defun + +@node Not Intervals +@subsection Why Text Properties are not Intervals +@cindex intervals + + Some editors that support adding attributes to text in the buffer do +so by letting the user specify ``intervals'' within the text, and adding +the properties to the intervals. Those editors permit the user or the +programmer to determine where individual intervals start and end. We +deliberately provided a different sort of interface in Emacs Lisp to +avoid certain paradoxical behavior associated with text modification. + + If the actual subdivision into intervals is meaningful, that means you +can distinguish between a buffer that is just one interval with a +certain property, and a buffer containing the same text subdivided into +two intervals, both of which have that property. + + Suppose you take the buffer with just one interval and kill part of +the text. The text remaining in the buffer is one interval, and the +copy in the kill ring (and the undo list) becomes a separate interval. +Then if you yank back the killed text, you get two intervals with the +same properties. Thus, editing does not preserve the distinction +between one interval and two. + + Suppose we ``fix'' this problem by coalescing the two intervals when +the text is inserted. That works fine if the buffer originally was a +single interval. But suppose instead that we have two adjacent +intervals with the same properties, and we kill the text of one interval +and yank it back. The same interval-coalescence feature that rescues +the other case causes trouble in this one: after yanking, we have just +one interval. One again, editing does not preserve the distinction +between one interval and two. + + Insertion of text at the border between intervals also raises +questions that have no satisfactory answer. + + However, it is easy to arrange for editing to behave consistently for +questions of the form, ``What are the properties of this character?'' +So we have decided these are the only questions that make sense; we have +not implemented asking questions about where intervals start or end. + + In practice, you can usually use the text property search functions in +place of explicit interval boundaries. You can think of them as finding +the boundaries of intervals, assuming that intervals are always +coalesced whenever possible. @xref{Property Search}. + + Emacs also provides explicit intervals as a presentation feature; see +@ref{Overlays}. + +@node Substitution +@section Substituting for a Character Code + + The following functions replace characters within a specified region +based on their character codes. + +@defun subst-char-in-region start end old-char new-char &optional noundo +@cindex replace characters +This function replaces all occurrences of the character @var{old-char} +with the character @var{new-char} in the region of the current buffer +defined by @var{start} and @var{end}. + +@cindex undo avoidance +If @var{noundo} is non-@code{nil}, then @code{subst-char-in-region} does +not record the change for undo and does not mark the buffer as modified. +This was useful for controlling the old selective display feature +(@pxref{Selective Display}). + +@code{subst-char-in-region} does not move point and returns +@code{nil}. + +@example +@group +---------- Buffer: foo ---------- +This is the contents of the buffer before. +---------- Buffer: foo ---------- +@end group + +@group +(subst-char-in-region 1 20 ?i ?X) + @result{} nil + +---------- Buffer: foo ---------- +ThXs Xs the contents of the buffer before. +---------- Buffer: foo ---------- +@end group +@end example +@end defun + +@defun translate-region start end table +This function applies a translation table to the characters in the +buffer between positions @var{start} and @var{end}. + +The translation table @var{table} is a string or a char-table; +@code{(aref @var{table} @var{ochar})} gives the translated character +corresponding to @var{ochar}. If @var{table} is a string, any +characters with codes larger than the length of @var{table} are not +altered by the translation. + +The return value of @code{translate-region} is the number of +characters that were actually changed by the translation. This does +not count characters that were mapped into themselves in the +translation table. +@end defun + +@node Registers +@section Registers +@cindex registers + + A register is a sort of variable used in Emacs editing that can hold a +variety of different kinds of values. Each register is named by a +single character. All @acronym{ASCII} characters and their meta variants +(but with the exception of @kbd{C-g}) can be used to name registers. +Thus, there are 255 possible registers. A register is designated in +Emacs Lisp by the character that is its name. + +@defvar register-alist +This variable is an alist of elements of the form @code{(@var{name} . +@var{contents})}. Normally, there is one element for each Emacs +register that has been used. + +The object @var{name} is a character (an integer) identifying the +register. +@end defvar + + The @var{contents} of a register can have several possible types: + +@table @asis +@item a number +A number stands for itself. If @code{insert-register} finds a number +in the register, it converts the number to decimal. + +@item a marker +A marker represents a buffer position to jump to. + +@item a string +A string is text saved in the register. + +@item a rectangle +A rectangle is represented by a list of strings. + +@item @code{(@var{window-configuration} @var{position})} +This represents a window configuration to restore in one frame, and a +position to jump to in the current buffer. + +@item @code{(@var{frame-configuration} @var{position})} +This represents a frame configuration to restore, and a position +to jump to in the current buffer. + +@item (file @var{filename}) +This represents a file to visit; jumping to this value visits file +@var{filename}. + +@item (file-query @var{filename} @var{position}) +This represents a file to visit and a position in it; jumping to this +value visits file @var{filename} and goes to buffer position +@var{position}. Restoring this type of position asks the user for +confirmation first. +@end table + + The functions in this section return unpredictable values unless +otherwise stated. + +@defun get-register reg +This function returns the contents of the register +@var{reg}, or @code{nil} if it has no contents. +@end defun + +@defun set-register reg value +This function sets the contents of register @var{reg} to @var{value}. +A register can be set to any value, but the other register functions +expect only certain data types. The return value is @var{value}. +@end defun + +@deffn Command view-register reg +This command displays what is contained in register @var{reg}. +@end deffn + +@ignore +@deffn Command point-to-register reg +This command stores both the current location of point and the current +buffer in register @var{reg} as a marker. +@end deffn + +@deffn Command jump-to-register reg +@deffnx Command register-to-point reg +@comment !!SourceFile register.el +This command restores the status recorded in register @var{reg}. + +If @var{reg} contains a marker, it moves point to the position stored in +the marker. Since both the buffer and the location within the buffer +are stored by the @code{point-to-register} function, this command can +switch you to another buffer. + +If @var{reg} contains a window configuration or a frame configuration. +@code{jump-to-register} restores that configuration. +@end deffn +@end ignore + +@deffn Command insert-register reg &optional beforep +This command inserts contents of register @var{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 @var{beforep} +is non-@code{nil}, it puts the mark before and point after. +You can pass a non-@code{nil} second argument @var{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. +@end deffn + +@ignore +@deffn Command copy-to-register reg start end &optional delete-flag +This command copies the region from @var{start} to @var{end} into +register @var{reg}. If @var{delete-flag} is non-@code{nil}, it deletes +the region from the buffer after copying it into the register. +@end deffn + +@deffn Command prepend-to-register reg start end &optional delete-flag +This command prepends the region from @var{start} to @var{end} into +register @var{reg}. If @var{delete-flag} is non-@code{nil}, it deletes +the region from the buffer after copying it to the register. +@end deffn + +@deffn Command append-to-register reg start end &optional delete-flag +This command appends the region from @var{start} to @var{end} to the +text already in register @var{reg}. If @var{delete-flag} is +non-@code{nil}, it deletes the region from the buffer after copying it +to the register. +@end deffn + +@deffn Command copy-rectangle-to-register reg start end &optional delete-flag +This command copies a rectangular region from @var{start} to @var{end} +into register @var{reg}. If @var{delete-flag} is non-@code{nil}, it +deletes the region from the buffer after copying it to the register. +@end deffn + +@deffn Command window-configuration-to-register reg +This function stores the window configuration of the selected frame in +register @var{reg}. +@end deffn + +@deffn Command frame-configuration-to-register reg +This function stores the current frame configuration in register +@var{reg}. +@end deffn +@end ignore + +@node Transposition +@section Transposition of Text + + This subroutine is used by the transposition commands. + +@defun transpose-regions start1 end1 start2 end2 &optional leave-markers +This function exchanges two nonoverlapping portions of the buffer. +Arguments @var{start1} and @var{end1} specify the bounds of one portion +and arguments @var{start2} and @var{end2} specify the bounds of the +other portion. + +Normally, @code{transpose-regions} relocates markers with the transposed +text; a marker previously positioned within one of the two transposed +portions moves along with that portion, thus remaining between the same +two characters in their new position. However, if @var{leave-markers} +is non-@code{nil}, @code{transpose-regions} does not do this---it leaves +all markers unrelocated. +@end defun + +@node Base 64 +@section Base 64 Encoding +@cindex base 64 encoding + + Base 64 code is used in email to encode a sequence of 8-bit bytes as +a longer sequence of @acronym{ASCII} graphic characters. It is defined in +Internet RFC@footnote{ +An RFC, an acronym for @dfn{Request for Comments}, is a numbered +Internet informational document describing a standard. RFCs are +usually written by technical experts acting on their own initiative, +and are traditionally written in a pragmatic, experience-driven +manner. +}2045. This section describes the functions for +converting to and from this code. + +@defun base64-encode-region beg end &optional no-line-break +This function converts the region from @var{beg} to @var{end} into base +64 code. It returns the length of the encoded text. An error is +signaled if a character in the region is multibyte, i.e.@: in a +multibyte buffer the region must contain only characters from the +charsets @code{ascii}, @code{eight-bit-control} and +@code{eight-bit-graphic}. + +Normally, this function inserts newline characters into the encoded +text, to avoid overlong lines. However, if the optional argument +@var{no-line-break} is non-@code{nil}, these newlines are not added, so +the output is just one long line. +@end defun + +@defun base64-encode-string string &optional no-line-break +This function converts the string @var{string} into base 64 code. It +returns a string containing the encoded text. As for +@code{base64-encode-region}, an error is signaled if a character in the +string is multibyte. + +Normally, this function inserts newline characters into the encoded +text, to avoid overlong lines. However, if the optional argument +@var{no-line-break} is non-@code{nil}, these newlines are not added, so +the result string is just one long line. +@end defun + +@defun base64-decode-region beg end +This function converts the region from @var{beg} to @var{end} from base +64 code into the corresponding decoded text. It returns the length of +the decoded text. + +The decoding functions ignore newline characters in the encoded text. +@end defun + +@defun base64-decode-string string +This function converts the string @var{string} from base 64 code into +the corresponding decoded text. It returns a unibyte string containing the +decoded text. + +The decoding functions ignore newline characters in the encoded text. +@end defun + +@node MD5 Checksum +@section MD5 Checksum +@cindex MD5 checksum +@cindex message digest computation + + MD5 cryptographic checksums, or @dfn{message digests}, are 128-bit +``fingerprints'' of a document or program. They are used to verify +that you have an exact and unaltered copy of the data. The algorithm +to calculate the MD5 message digest is defined in Internet +RFC@footnote{ +For an explanation of what is an RFC, see the footnote in @ref{Base +64}. +}1321. This section describes the Emacs facilities for computing +message digests. + +@defun md5 object &optional start end coding-system noerror +This function returns the MD5 message digest of @var{object}, which +should be a buffer or a string. + +The two optional arguments @var{start} and @var{end} are character +positions specifying the portion of @var{object} to compute the +message digest for. If they are @code{nil} or omitted, the digest is +computed for the whole of @var{object}. + +The function @code{md5} does not compute the message digest directly +from the internal Emacs representation of the text (@pxref{Text +Representations}). Instead, it encodes the text using a coding +system, and computes the message digest from the encoded text. The +optional fourth argument @var{coding-system} specifies which coding +system to use for encoding the text. It should be the same coding +system that you used to read the text, or that you used or will use +when saving or sending the text. @xref{Coding Systems}, for more +information about coding systems. + +If @var{coding-system} is @code{nil} or omitted, the default depends +on @var{object}. If @var{object} is a buffer, the default for +@var{coding-system} is whatever coding system would be chosen by +default for writing this text into a file. If @var{object} is a +string, the user's most preferred coding system (@pxref{Recognize +Coding, prefer-coding-system, the description of +@code{prefer-coding-system}, emacs, GNU Emacs Manual}) is used. + +Normally, @code{md5} signals an error if the text can't be encoded +using the specified or chosen coding system. However, if +@var{noerror} is non-@code{nil}, it silently uses @code{raw-text} +coding instead. +@end defun + +@node Atomic Changes +@section Atomic Change Groups +@cindex atomic changes + + In data base terminology, an @dfn{atomic} change is an indivisible +change---it can succeed entirely or it can fail entirely, but it +cannot partly succeed. A Lisp program can make a series of changes to +one or several buffers as an @dfn{atomic change group}, meaning that +either the entire series of changes will be installed in their buffers +or, in case of an error, none of them will be. + + To do this for one buffer, the one already current, simply write a +call to @code{atomic-change-group} around the code that makes the +changes, like this: + +@example +(atomic-change-group + (insert foo) + (delete-region x y)) +@end example + +@noindent +If an error (or other nonlocal exit) occurs inside the body of +@code{atomic-change-group}, it unmakes all the changes in that buffer +that were during the execution of the body. This kind of change group +has no effect on any other buffers---any such changes remain. + + If you need something more sophisticated, such as to make changes in +various buffers constitute one atomic group, you must directly call +lower-level functions that @code{atomic-change-group} uses. + +@defun prepare-change-group &optional buffer +This function sets up a change group for buffer @var{buffer}, which +defaults to the current buffer. It returns a ``handle'' that +represents the change group. You must use this handle to activate the +change group and subsequently to finish it. +@end defun + + To use the change group, you must @dfn{activate} it. You must do +this before making any changes in the text of @var{buffer}. + +@defun activate-change-group handle +This function activates the change group that @var{handle} designates. +@end defun + + After you activate the change group, any changes you make in that +buffer become part of it. Once you have made all the desired changes +in the buffer, you must @dfn{finish} the change group. There are two +ways to do this: you can either accept (and finalize) all the changes, +or cancel them all. + +@defun accept-change-group handle +This function accepts all the changes in the change group specified by +@var{handle}, making them final. +@end defun + +@defun cancel-change-group handle +This function cancels and undoes all the changes in the change group +specified by @var{handle}. +@end defun + + Your code should use @code{unwind-protect} to make sure the group is +always finished. The call to @code{activate-change-group} should be +inside the @code{unwind-protect}, in case the user types @kbd{C-g} +just after it runs. (This is one reason why +@code{prepare-change-group} and @code{activate-change-group} are +separate functions, because normally you would call +@code{prepare-change-group} before the start of that +@code{unwind-protect}.) Once you finish the group, don't use the +handle again---in particular, don't try to finish the same group +twice. + + To make a multibuffer change group, call @code{prepare-change-group} +once for each buffer you want to cover, then use @code{nconc} to +combine the returned values, like this: + +@example +(nconc (prepare-change-group buffer-1) + (prepare-change-group buffer-2)) +@end example + +You can then activate the multibuffer change group with a single call +to @code{activate-change-group}, and finish it with a single call to +@code{accept-change-group} or @code{cancel-change-group}. + + Nested use of several change groups for the same buffer works as you +would expect. Non-nested use of change groups for the same buffer +will get Emacs confused, so don't let it happen; the first change +group you start for any given buffer should be the last one finished. + +@node Change Hooks +@section Change Hooks +@cindex change hooks +@cindex hooks for text changes + + These hook variables let you arrange to take notice of all changes in +all buffers (or in a particular buffer, if you make them buffer-local). +See also @ref{Special Properties}, for how to detect changes to specific +parts of the text. + + The functions you use in these hooks should save and restore the match +data if they do anything that uses regular expressions; otherwise, they +will interfere in bizarre ways with the editing operations that call +them. + +@defvar before-change-functions +This variable holds a list of functions to call before any buffer +modification. Each function gets two arguments, the beginning and end +of the region that is about to change, represented as integers. The +buffer that is about to change is always the current buffer. +@end defvar + +@defvar after-change-functions +This variable holds a list of functions to call after any buffer +modification. Each function receives three arguments: the beginning and +end of the region just changed, and the length of the text that existed +before the change. All three arguments are integers. The buffer that's +about to change is always the current buffer. + +The length of the old text is the difference between the buffer positions +before and after that text as it was before the change. As for the +changed text, its length is simply the difference between the first two +arguments. +@end defvar + + Output of messages into the @samp{*Messages*} buffer does not +call these functions. + +@defmac combine-after-change-calls body@dots{} +The macro executes @var{body} normally, but arranges to call the +after-change functions just once for a series of several changes---if +that seems safe. + +If a program makes several text changes in the same area of the buffer, +using the macro @code{combine-after-change-calls} around that part of +the program can make it run considerably faster when after-change hooks +are in use. When the after-change hooks are ultimately called, the +arguments specify a portion of the buffer including all of the changes +made within the @code{combine-after-change-calls} body. + +@strong{Warning:} You must not alter the values of +@code{after-change-functions} within +the body of a @code{combine-after-change-calls} form. + +@strong{Warning:} if the changes you combine occur in widely scattered +parts of the buffer, this will still work, but it is not advisable, +because it may lead to inefficient behavior for some change hook +functions. +@end defmac + +@defvar first-change-hook +This variable is a normal hook that is run whenever a buffer is changed +that was previously in the unmodified state. +@end defvar + +@defvar inhibit-modification-hooks +If this variable is non-@code{nil}, all of the change hooks are +disabled; none of them run. This affects all the hook variables +described above in this section, as well as the hooks attached to +certain special text properties (@pxref{Special Properties}) and overlay +properties (@pxref{Overlay Properties}). + +Also, this variable is bound to non-@code{nil} while running those +same hook variables, so that by default modifying the buffer from +a modification hook does not cause other modification hooks to be run. +If you do want modification hooks to be run in a particular piece of +code that is itself run from a modification hook, then rebind locally +@code{inhibit-modification-hooks} to @code{nil}. +@end defvar + +@ignore + arch-tag: 3721e738-a1cb-4085-bc1a-6cb8d8e1d32b +@end ignore diff --git a/doc/lispref/tindex.pl b/doc/lispref/tindex.pl new file mode 100755 index 00000000000..89bbe5f5f6f --- /dev/null +++ b/doc/lispref/tindex.pl @@ -0,0 +1,127 @@ +#! /usr/bin/perl + +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, +# 2006, 2007 Free Software Foundation, Inc. +# +# This file is part of GNU Emacs. +# +# GNU Emacs is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Emacs is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +require 5; +use Getopt::Long; + +my $USAGE = <<ENDUSAGE; +Remove \@tindex lines from files that were already present in previous +versions. + +Usage: $0 [--old=EXT] FILE... + $0 --help + $0 --version + + --help display this help and exit + --version print version and exit + --old=DIR find old files in DIR + +The script performs two passes. In the first pass, Texinfo files from +DIR are scanned for \@tindex lines, and identifiers in them are +recorded. In a second pass, Texinfo files in the current directory +are scanned, and \@tindex lines for identifiers that were recorded in +the first pass are removed. Old file contents are saved in files +with extension ".orig". A list of modified files and removed \@tindex +identifiers is printed to stdout at the end. +ENDUSAGE + +sub fatal { + print STDERR "$0: ", @_, ".\n"; + exit 1; +} + +my $help = 0; +my $version = 0; +my $old; + +my $rc = GetOptions ('help' => \$help, 'version' => \$version, + 'old=s' => \$old); +if ($version) { + print "0.1\n"; + exit 0; +} elsif (!$rc || !$old || @ARGV) { + print $USAGE; + exit 1; +} elsif ($help) { + print $USAGE; + exit 0; +} + +# Fill the hash %tindex with associations VAR -> COUNT where +# the keys VAR are identifiers mentioned in @tindex lines in the older +# files to process and COUNT is the number of times they are seen in +# the files. + +my %tindex; +my %removed; +my @old_files = glob "$old/*.texi"; +my @new_files = glob "*.texi"; +fatal ("No Texinfo files found in `$old'") unless @old_files; +fatal ("No Texinfo files found in current directory") unless @new_files; + +print "Scanning old files for \@tindex lines\n"; +foreach $file (@old_files) { + open (IN, "<$file") or fatal "Cannot open $file: $!"; + while (<IN>) { + ++$tindex{$1} if /^\s*\@tindex\s+(\S+)/; + } + close IN; +} + +# Process current files and remove those @tindex lines which we +# know were already present in the files scanned above. + +print "Removing old \@tindex lines\n"; +foreach $file (@new_files) { + my $modified = 0; + my $contents = ""; + + open (IN, "< $file") or fatal "Cannot open $file.orig for reading: $!"; + while (<IN>) { + if (/^\s*\@tindex\s+(\S+)/ && $tindex{$1}) { + ++$removed{$1}; + $modified = 1; + } else { + $contents = $contents . $_; + } + } + + close IN; + + if ($modified) { + print " $file\n"; + system ("cp $file $file.orig") == 0 or fatal "Cannot backup $file: $!"; + open (OUT, ">$file") or fatal "Cannot open $file for writing: $!"; + print OUT $contents; + close OUT; + } +} + +# Print a list of identifiers removed. + +print "Removed \@tindex commands for:\n"; +my $key; +foreach $key (keys %removed) { + print " $key\n"; +} + +# arch-tag: f8460df6-6bef-4c98-8555-e2c63a88b0fa diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi new file mode 100644 index 00000000000..f3070f4659b --- /dev/null +++ b/doc/lispref/tips.texi @@ -0,0 +1,1130 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1995, 1998, 1999, 2001, 2002, +@c 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/tips +@node Tips, GNU Emacs Internals, GPL, Top +@appendix Tips and Conventions +@cindex tips for writing Lisp +@cindex standards of coding style +@cindex coding 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, and describes conventions Emacs Lisp programmers +should follow. + + You can automatically check some of the conventions described below by +running the command @kbd{M-x checkdoc RET} when visiting a Lisp file. +It cannot check all of the conventions, and not all the warnings it +gives necessarily correspond to problems, but it is worth examining them +all. + +@menu +* Coding Conventions:: Conventions for clean and robust programs. +* Key Binding Conventions:: Which keys should be bound by which programs. +* Programming Tips:: Making Emacs code fit smoothly in Emacs. +* Compilation Tips:: Making compiled code run fast. +* Warning Tips:: Turning off compiler warnings. +* Documentation Tips:: Writing readable documentation strings. +* Comment Tips:: Conventions for writing comments. +* Library Headers:: Standard headers for library packages. +@end menu + +@node Coding Conventions +@section Emacs Lisp Coding Conventions + +@cindex coding conventions in Emacs Lisp + Here are conventions that you should follow when writing Emacs Lisp +code intended for widespread use: + +@itemize @bullet +@item +Simply loading the package should not change Emacs's editing behavior. +Include a command or commands to enable and disable the feature, +or to invoke it. + +This convention is mandatory for any file that includes custom +definitions. If fixing such a file to follow this convention requires +an incompatible change, go ahead and make the incompatible change; +don't postpone it. + +@item +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@footnote{The +benefits of a Common Lisp-style package system are considered not to +outweigh the costs.}. Then take care to begin the names of all global +variables, constants, and functions in your program with the chosen +prefix. This helps avoid name conflicts. + +Occasionally, for a command name intended for users to use, it is more +convenient if some words come before the package's name prefix. And +constructs that define functions, variables, etc., work better if they +start with @samp{defun} or @samp{defvar}, so put the name prefix later +on in the name. + +This recommendation applies even to names for traditional Lisp +primitives that are not primitives in Emacs Lisp---such as +@code{copy-list}. Believe it or not, there is more than one plausible +way to define @code{copy-list}. Play it safe; append your name prefix +to produce a name like @code{foo-copy-list} or @code{mylib-copy-list} +instead. + +If you write a function that you think ought to be added to Emacs under +a certain name, such as @code{twiddle-files}, don't call it by that name +in your program. Call it @code{mylib-twiddle-files} in your program, +and send mail to @samp{bug-gnu-emacs@@gnu.org} suggesting we add +it to Emacs. If and when we do, we can change the name easily enough. + +If one prefix is insufficient, your package can use two or three +alternative common prefixes, so long as they make sense. + +Separate the prefix from the rest of the symbol name with a hyphen, +@samp{-}. This will be consistent with Emacs itself and with most Emacs +Lisp programs. + +@item +Put a call to @code{provide} at the end of each separate Lisp file. + +@item +If a file requires certain other Lisp programs to be loaded +beforehand, then the comments at the beginning of the file should say +so. Also, use @code{require} to make sure they are loaded. + +@item +If one file @var{foo} uses a macro defined in another file @var{bar}, +@var{foo} should contain this expression before the first use of the +macro: + +@example +(eval-when-compile (require '@var{bar})) +@end example + +@noindent +(And the library @var{bar} should contain @code{(provide '@var{bar})}, +to make the @code{require} work.) This will cause @var{bar} to be +loaded when you byte-compile @var{foo}. Otherwise, you risk compiling +@var{foo} without the necessary macro loaded, and that would produce +compiled code that won't work right. @xref{Compiling Macros}. + +Using @code{eval-when-compile} avoids loading @var{bar} when +the compiled version of @var{foo} is @emph{used}. + +@item +Please don't require the @code{cl} package of Common Lisp extensions at +run time. Use of this package is optional, and it is not part of the +standard Emacs namespace. If your package loads @code{cl} at run time, +that could cause name clashes for users who don't use that package. + +However, there is no problem with using the @code{cl} package at +compile time, with @code{(eval-when-compile (require 'cl))}. That's +sufficient for using the macros in the @code{cl} package, because the +compiler expands them before generating the byte-code. + +@item +When defining a major mode, please follow the major mode +conventions. @xref{Major Mode Conventions}. + +@item +When defining a minor mode, please follow the minor mode +conventions. @xref{Minor Mode Conventions}. + +@item +If the purpose of a function is to tell you whether a certain condition +is true or false, give the function a name that ends in @samp{p}. If +the name is one word, add just @samp{p}; if the name is multiple words, +add @samp{-p}. Examples are @code{framep} and @code{frame-live-p}. + +@item +If a user option variable records a true-or-false condition, give it a +name that ends in @samp{-flag}. + +@item +If the purpose of a variable is to store a single function, give it a +name that ends in @samp{-function}. If the purpose of a variable is +to store a list of functions (i.e., the variable is a hook), please +follow the naming conventions for hooks. @xref{Hooks}. + +@item +@cindex unloading packages, preparing for +If loading the file adds functions to hooks, define a function +@code{@var{feature}-unload-hook}, where @var{feature} is the name of +the feature the package provides, and make it undo any such changes. +Using @code{unload-feature} to unload the file will run this function. +@xref{Unloading}. + +@item +It is a bad idea to define aliases for the Emacs primitives. Normally +you should use the standard names instead. The case where an alias +may be useful is where it facilitates backwards compatibility or +portability. + +@item +If a package needs to define an alias or a new function for +compatibility with some other version of Emacs, name it with the package +prefix, not with the raw name with which it occurs in the other version. +Here is an example from Gnus, which provides many examples of such +compatibility issues. + +@example +(defalias 'gnus-point-at-bol + (if (fboundp 'point-at-bol) + 'point-at-bol + 'line-beginning-position)) +@end example + +@item +Redefining (or advising) an Emacs primitive is a bad idea. It may do +the right thing for a particular program, but there is no telling what +other programs might break as a result. In any case, it is a problem +for debugging, because the advised function doesn't do what its source +code says it does. If the programmer investigating the problem is +unaware that there is advice on the function, the experience can be +very frustrating. + +We hope to remove all the places in Emacs that advise primitives. +In the mean time, please don't add any more. + +@item +It is likewise a bad idea for one Lisp package to advise a function +in another Lisp package. + +@item +Likewise, avoid using @code{eval-after-load} (@pxref{Hooks for +Loading}) in libraries and packages. This feature is meant for +personal customizations; using it in a Lisp program is unclean, +because it modifies the behavior of another Lisp file in a way that's +not visible in that file. This is an obstacle for debugging, much +like advising a function in the other package. + +@item +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. + +@item +Constructs that define a function or variable should be macros, +not functions, and their names should start with @samp{def}. + +@item +A macro that defines a function or variable should have a name that +starts with @samp{define-}. The macro should receive the name to be +defined as the first argument. That will help various tools find the +definition automatically. Avoid constructing the names in the macro +itself, since that would confuse these tools. + +@item +Please keep the names of your Emacs Lisp source files to 13 characters +or less. This way, if the files are compiled, the compiled files' names +will be 14 characters or less, which is short enough to fit on all kinds +of Unix systems. + +@item +In some other systems there is a convention of choosing variable names +that begin and end with @samp{*}. We don't use that convention in Emacs +Lisp, so please don't use it in your programs. (Emacs uses such names +only for special-purpose buffers.) The users will find Emacs more +coherent if all libraries use the same conventions. + +@item +If your program contains non-ASCII characters in string or character +constants, you should make sure Emacs always decodes these characters +the same way, regardless of the user's settings. There are two ways +to do that: + +@itemize - +@item +Use coding system @code{emacs-mule}, and specify that for +@code{coding} in the @samp{-*-} line or the local variables list. + +@example +;; XXX.el -*- coding: emacs-mule; -*- +@end example + +@item +Use one of the coding systems based on ISO 2022 (such as +iso-8859-@var{n} and iso-2022-7bit), and specify it with @samp{!} at +the end for @code{coding}. (The @samp{!} turns off any possible +character translation.) + +@example +;; XXX.el -*- coding: iso-latin-2!; -*- +@end example +@end itemize + +@item +Indent each function with @kbd{C-M-q} (@code{indent-sexp}) using the +default indentation parameters. + +@item +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 the sequence in one or two significant places. + +@item +Please put a copyright notice and copying permission notice on the +file if you distribute copies. Use a notice like this one: + +@smallexample +;; Copyright (C) @var{year} @var{name} + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 3 of +;; the License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be +;; useful, but WITHOUT ANY WARRANTY; without even the implied +;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +;; PURPOSE. See the GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public +;; License along with this program; if not, write to the Free +;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301 USA +@end smallexample + +If you have signed papers to assign the copyright to the Foundation, +then use @samp{Free Software Foundation, Inc.} as @var{name}. +Otherwise, use your name. See also @xref{Library Headers}. +@end itemize + +@node Key Binding Conventions +@section Key Binding Conventions +@cindex key binding, conventions for + +@itemize @bullet +@item +@cindex mouse-2 +@cindex references, following +Special major modes used for read-only text should usually redefine +@kbd{mouse-2} and @key{RET} to trace some sort of reference in the text. +Modes such as Dired, Info, Compilation, and Occur redefine it in this +way. + +In addition, they should mark the text as a kind of ``link'' so that +@kbd{mouse-1} will follow it also. @xref{Links and Mouse-1}. + +@item +@cindex reserved keys +@cindex keys, reserved +Please do not define @kbd{C-c @var{letter}} as a key in Lisp programs. +Sequences consisting of @kbd{C-c} and a letter (either upper or lower +case) are reserved for users; they are the @strong{only} sequences +reserved for users, so do not block them. + +Changing all the Emacs major modes to respect this convention was a +lot of work; abandoning this convention would make that work go to +waste, and inconvenience users. Please comply with it. + +@item +Function keys @key{F5} through @key{F9} without modifier keys are +also reserved for users to define. + +@item +Applications should not bind mouse events based on button 1 with the +shift key held down. These events include @kbd{S-mouse-1}, +@kbd{M-S-mouse-1}, @kbd{C-S-mouse-1}, and so on. They are reserved for +users. + +@item +Sequences consisting of @kbd{C-c} followed by a control character or a +digit are reserved for major modes. + +@item +Sequences consisting of @kbd{C-c} followed by @kbd{@{}, @kbd{@}}, +@kbd{<}, @kbd{>}, @kbd{:} or @kbd{;} are also reserved for major modes. + +@item +Sequences consisting of @kbd{C-c} followed by any other punctuation +character are allocated for minor modes. Using them in a major mode is +not absolutely prohibited, but if you do that, the major mode binding +may be shadowed from time to time by minor modes. + +@item +Do not bind @kbd{C-h} following any prefix character (including +@kbd{C-c}). If you don't bind @kbd{C-h}, it is automatically available +as a help character for listing the subcommands of the prefix character. + +@item +Do not bind a key sequence ending in @key{ESC} except following +another @key{ESC}. (That is, it is OK to bind a sequence ending in +@kbd{@key{ESC} @key{ESC}}.) + +The reason for this rule is that a non-prefix binding for @key{ESC} in +any context prevents recognition of escape sequences as function keys in +that context. + +@item +Anything which acts like a temporary mode or state which the user can +enter and leave should define @kbd{@key{ESC} @key{ESC}} or +@kbd{@key{ESC} @key{ESC} @key{ESC}} as a way to escape. + +For a state which accepts ordinary Emacs commands, or more generally any +kind of state in which @key{ESC} followed by a function key or arrow key +is potentially meaningful, then you must not define @kbd{@key{ESC} +@key{ESC}}, since that would preclude recognizing an escape sequence +after @key{ESC}. In these states, you should define @kbd{@key{ESC} +@key{ESC} @key{ESC}} as the way to escape. Otherwise, define +@kbd{@key{ESC} @key{ESC}} instead. +@end itemize + +@node Programming Tips +@section Emacs Programming Tips +@cindex programming conventions + + Following these conventions will make your program fit better +into Emacs when it runs. + +@itemize @bullet +@item +Don't use @code{next-line} or @code{previous-line} in programs; nearly +always, @code{forward-line} is more convenient as well as more +predictable and robust. @xref{Text Lines}. + +@item +Don't call functions that set the mark, unless setting the mark is one +of the intended features of your program. 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. @xref{The Mark}. + +In particular, don't use any of these functions: + +@itemize @bullet +@item +@code{beginning-of-buffer}, @code{end-of-buffer} +@item +@code{replace-string}, @code{replace-regexp} +@item +@code{insert-file}, @code{insert-buffer} +@end itemize + +If you just want to move point, or replace a certain string, or insert +a file or buffer's contents, without any of the other features +intended for interactive users, you can replace these functions with +one or two lines of simple Lisp code. + +@item +Use lists rather than vectors, except when there is a particular reason +to use a vector. Lisp has more facilities for manipulating lists than +for vectors, and working with lists is usually more convenient. + +Vectors are advantageous for tables that are substantial in size and are +accessed in random order (not searched front to back), provided there is +no need to insert or delete elements (only lists allow that). + +@item +The recommended way to show a message in the echo area is with +the @code{message} function, not @code{princ}. @xref{The Echo Area}. + +@item +When you encounter an error condition, call the function @code{error} +(or @code{signal}). The function @code{error} does not return. +@xref{Signaling Errors}. + +Do not use @code{message}, @code{throw}, @code{sleep-for}, +or @code{beep} to report errors. + +@item +An error message should start with a capital letter but should not end +with a period. + +@item +A question asked in the minibuffer with @code{y-or-n-p} or +@code{yes-or-no-p} should start with a capital letter and end with +@samp{? }. + +@item +When you mention a default value in a minibuffer prompt, +put it and the word @samp{default} inside parentheses. +It should look like this: + +@example +Enter the answer (default 42): +@end example + +@item +In @code{interactive}, if you use a Lisp expression to produce a list +of arguments, don't try to provide the ``correct'' default values for +region or position arguments. Instead, provide @code{nil} for those +arguments if they were not specified, and have the function body +compute the default value when the argument is @code{nil}. For +instance, write this: + +@example +(defun foo (pos) + (interactive + (list (if @var{specified} @var{specified-pos}))) + (unless pos (setq pos @var{default-pos})) + ...) +@end example + +@noindent +rather than this: + +@example +(defun foo (pos) + (interactive + (list (if @var{specified} @var{specified-pos} + @var{default-pos}))) + ...) +@end example + +@noindent +This is so that repetition of the command will recompute +these defaults based on the current circumstances. + +You do not need to take such precautions when you use interactive +specs @samp{d}, @samp{m} and @samp{r}, because they make special +arrangements to recompute the argument values on repetition of the +command. + +@item +Many commands that take a long time to execute display a message that +says something like @samp{Operating...} when they start, and change it to +@samp{Operating...done} when they finish. Please keep the style of +these messages uniform: @emph{no} space around the ellipsis, and +@emph{no} period after @samp{done}. + +@item +Try to avoid using recursive edits. Instead, do what the Rmail @kbd{e} +command does: use a new local keymap that contains one command defined +to switch back to the old local keymap. Or do what the +@code{edit-options} command does: switch to another buffer and let the +user switch back at will. @xref{Recursive Editing}. +@end itemize + +@node Compilation Tips +@section Tips for Making Compiled Code Fast +@cindex execution speed +@cindex speedups + + Here are ways of improving the execution speed of byte-compiled +Lisp programs. + +@itemize @bullet +@item +@cindex profiling +@cindex timing programs +@cindex @file{elp.el} +Profile your program with the @file{elp} library. See the file +@file{elp.el} for instructions. + +@item +@cindex @file{benchmark.el} +@cindex benchmarking +Check the speed of individual Emacs Lisp forms using the +@file{benchmark} library. See the functions @code{benchmark-run} and +@code{benchmark-run-compiled} in @file{benchmark.el}. + +@item +Use iteration rather than recursion whenever possible. +Function calls are slow in Emacs Lisp even when a compiled function +is calling another compiled function. + +@item +Using the primitive list-searching functions @code{memq}, @code{member}, +@code{assq}, or @code{assoc} is even faster than explicit iteration. It +can be worth rearranging a data structure so that one of these primitive +search functions can be used. + +@item +Certain built-in functions are handled specially in byte-compiled code, +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 @code{byte-compile} +property. If the property is non-@code{nil}, then the function is +handled specially. + +For example, the following input will show you that @code{aref} is +compiled specially (@pxref{Array Functions}): + +@example +@group +(get 'aref 'byte-compile) + @result{} byte-compile-two-args +@end group +@end example + +@item +If calling a small function accounts for a substantial part of your +program's running time, make the function inline. This eliminates +the function call overhead. Since making a function inline reduces +the flexibility of changing the program, don't do it unless it gives +a noticeable speedup in something slow enough that users care about +the speed. @xref{Inline Functions}. +@end itemize + +@node Warning Tips +@section Tips for Avoiding Compiler Warnings +@cindex byte compiler warnings, how to avoid + +@itemize @bullet +@item +Try to avoid compiler warnings about undefined free variables, by adding +dummy @code{defvar} definitions for these variables, like this: + +@example +(defvar foo) +@end example + +Such a definition has no effect except to tell the compiler +not to warn about uses of the variable @code{foo} in this file. + +@item +If you use many functions and variables from a certain file, you can +add a @code{require} for that package to avoid compilation warnings +for them. For instance, + +@example +(eval-when-compile + (require 'foo)) +@end example + +@item +If you bind a variable in one function, and use it or set it in +another function, the compiler warns about the latter function unless +the variable has a definition. But adding a definition would be +unclean if the variable has a short name, since Lisp packages should +not define short variable names. The right thing to do is to rename +this variable to start with the name prefix used for the other +functions and variables in your package. + +@item +The last resort for avoiding a warning, when you want to do something +that usually is a mistake but it's not a mistake in this one case, +is to put a call to @code{with-no-warnings} around it. +@end itemize + +@node Documentation Tips +@section Tips for Documentation Strings +@cindex documentation strings, conventions and tips + +@findex checkdoc-minor-mode + Here are some tips and conventions for the writing of documentation +strings. You can check many of these conventions by running the command +@kbd{M-x checkdoc-minor-mode}. + +@itemize @bullet +@item +Every command, function, or variable intended for users to know about +should have a documentation string. + +@item +An internal variable or subroutine of a Lisp program might as well have +a documentation string. In earlier Emacs versions, you could save space +by using a comment instead of a documentation string, but that is no +longer the case---documentation strings now take up very little space in +a running Emacs. + +@item +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 should not be wider than 67 characters +or it will look bad in the output of @code{apropos}. + +You can fill the text if that looks good. However, rather than blindly +filling the entire documentation string, you can often make it much more +readable by choosing certain line breaks with care. Use blank lines +between topics if the documentation string is long. + +@item +The first line of the documentation string should consist of one or two +complete sentences that stand on their own as a summary. @kbd{M-x +apropos} displays just the first line, and if that line's contents don't +stand on their own, the result looks bad. In particular, start the +first line with a capital letter and end with a period. + +For a function, the first line should briefly answer the question, +``What does this function do?'' For a variable, the first line should +briefly answer the question, ``What does this value mean?'' + +Don't limit the documentation string to one line; use as many lines as +you need to explain the details of how to use the function or +variable. Please use complete sentences for the rest of the text too. + +@item +When the user tries to use a disabled command, Emacs displays just the +first paragraph of its documentation string---everything through the +first blank line. If you wish, you can choose which information to +include before the first blank line so as to make this display useful. + +@item +The first line should mention all the important arguments of the +function, and should mention them in the order that they are written +in a function call. If the function has many arguments, then it is +not feasible to mention them all in the first line; in that case, the +first line should mention the first few arguments, including the most +important arguments. + +@item +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 +@code{eval} refers to its second argument as @samp{FORM}, because the +actual argument name is @code{form}: + +@example +Evaluate FORM and return its value. +@end example + +Also write metasyntactic variables in capital letters, such as when you +show the decomposition of a list or vector into subunits, some of which +may vary. @samp{KEY} and @samp{VALUE} in the following example +illustrate this practice: + +@example +The argument TABLE should be an alist whose elements +have the form (KEY . VALUE). Here, KEY is ... +@end example + +@item +Never change the case of a Lisp symbol when you mention it in a doc +string. If the symbol's name is @code{foo}, write ``foo,'' not +``Foo'' (which is a different symbol). + +This might appear to contradict the policy of writing function +argument values, but there is no real contradiction; the argument +@emph{value} is not the same thing as the @emph{symbol} which the +function uses to hold the value. + +If this puts a lower-case letter at the beginning of a sentence +and that annoys you, rewrite the sentence so that the symbol +is not at the start of it. + +@item +Do not start or end a documentation string with whitespace. + +@item +@strong{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! + +@anchor{Docstring hyperlinks} +@item +@iftex +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: @samp{`lambda'}. There are two exceptions: +write @code{t} and @code{nil} without single-quotes. +@end iftex +@ifnottex +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: @samp{lambda}. There are two exceptions: write +t and nil without single-quotes. (In this manual, we use a different +convention, with single-quotes for all symbols.) +@end ifnottex + +@cindex hyperlinks in documentation strings +Help mode automatically creates a hyperlink when a documentation string +uses a symbol name inside single quotes, if the symbol has either a +function or a variable definition. You do not need to do anything +special to make use of this feature. However, when a symbol has both a +function definition and a variable definition, and you want to refer to +just one of them, you can specify which one by writing one of the words +@samp{variable}, @samp{option}, @samp{function}, or @samp{command}, +immediately before the symbol name. (Case makes no difference in +recognizing these indicator words.) For example, if you write + +@example +This function sets the variable `buffer-file-name'. +@end example + +@noindent +then the hyperlink will refer only to the variable documentation of +@code{buffer-file-name}, and not to its function documentation. + +If a symbol has a function definition and/or a variable definition, but +those are irrelevant to the use of the symbol that you are documenting, +you can write the words @samp{symbol} or @samp{program} before the +symbol name to prevent making any hyperlink. For example, + +@example +If the argument KIND-OF-RESULT is the symbol `list', +this function returns a list of all the objects +that satisfy the criterion. +@end example + +@noindent +does not make a hyperlink to the documentation, irrelevant here, of the +function @code{list}. + +Normally, no hyperlink is made for a variable without variable +documentation. You can force a hyperlink for such variables by +preceding them with one of the words @samp{variable} or +@samp{option}. + +Hyperlinks for faces are only made if the face name is preceded or +followed by the word @samp{face}. In that case, only the face +documentation will be shown, even if the symbol is also defined as a +variable or as a function. + +To make a hyperlink to Info documentation, write the name of the Info +node (or anchor) in single quotes, preceded by @samp{info node}, +@samp{Info node}, @samp{info anchor} or @samp{Info anchor}. The Info +file name defaults to @samp{emacs}. For example, + +@smallexample +See Info node `Font Lock' and Info node `(elisp)Font Lock Basics'. +@end smallexample + +Finally, to create a hyperlink to URLs, write the URL in single +quotes, preceded by @samp{URL}. For example, + +@smallexample +The home page for the GNU project has more information (see URL +`http://www.gnu.org/'). +@end smallexample + +@item +Don't write key sequences directly in documentation strings. Instead, +use the @samp{\\[@dots{}]} construct to stand for them. For example, +instead of writing @samp{C-f}, write the construct +@samp{\\[forward-char]}. When Emacs displays the documentation string, +it substitutes whatever key is currently bound to @code{forward-char}. +(This is normally @samp{C-f}, but it may be some other character if the +user has moved key bindings.) @xref{Keys in Documentation}. + +@item +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 @samp{\\<@dots{}>} once in the +documentation string to specify which key map to use. Do this before +the first use of @samp{\\[@dots{}]}. The text inside the +@samp{\\<@dots{}>} should be the name of the variable containing the +local keymap for the major mode. + +It is not practical to use @samp{\\[@dots{}]} very many times, because +display of the documentation string will become slow. So use this to +describe the most important commands in your major mode, and then use +@samp{\\@{@dots{}@}} to display the rest of the mode's keymap. + +@item +For consistency, phrase the verb in the first sentence of a function's +documentation string as an imperative---for instance, use ``Return the +cons of A and B.'' in preference to ``Returns the cons of A and B@.'' +Usually it looks good to do likewise for the rest of the first +paragraph. Subsequent paragraphs usually look better if each sentence +is indicative and has a proper subject. + +@item +The documentation string for a function that is a yes-or-no predicate +should start with words such as ``Return t if,'' to indicate +explicitly what constitutes ``truth.'' The word ``return'' avoids +starting the sentence with lower-case ``t,'' which could be somewhat +distracting. + +@item +If a line in a documentation string begins with an open-parenthesis, +write a backslash before the open-parenthesis, like this: + +@example +The argument FOO can be either a number +\(a buffer position) or a string (a file name). +@end example + +This prevents the open-parenthesis from being treated as the start of a +defun (@pxref{Defuns,, Defuns, emacs, The GNU Emacs Manual}). + +@item +Write documentation strings in the active voice, not the passive, and in +the present tense, not the future. For instance, use ``Return a list +containing A and B.'' instead of ``A list containing A and B will be +returned.'' + +@item +Avoid using the word ``cause'' (or its equivalents) unnecessarily. +Instead of, ``Cause Emacs to display text in boldface,'' write just +``Display text in boldface.'' + +@item +Avoid using ``iff'' (a mathematics term meaning ``if and only if''), +since many people are unfamiliar with it and mistake it for a typo. In +most cases, the meaning is clear with just ``if''. Otherwise, try to +find an alternate phrasing that conveys the meaning. + +@item +When a command is meaningful only in a certain mode or situation, +do mention that in the documentation string. For example, +the documentation of @code{dired-find-file} is: + +@example +In Dired, visit the file or directory named on this line. +@end example + +@item +When you define a variable that users ought to set interactively, you +normally should use @code{defcustom}. However, if for some reason you +use @code{defvar} instead, start the doc string with a @samp{*}. +@xref{Defining Variables}. + +@item +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 that +all non-@code{nil} values are equivalent and indicate explicitly what +@code{nil} and non-@code{nil} mean. +@end itemize + +@node Comment Tips +@section Tips on Writing Comments +@cindex comments, Lisp convention for + + We recommend these conventions for where to put comments and how to +indent them: + +@table @samp +@item ; +Comments that start with a single semicolon, @samp{;}, 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 @kbd{M-;} (@code{indent-for-comment}) +command automatically inserts such a @samp{;} in the right place, or +aligns such a comment if it is already present. + +This and following examples are taken from the Emacs sources. + +@smallexample +@group +(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 +@end group +@end smallexample + +@item ;; +Comments that start with two semicolons, @samp{;;}, should be aligned to +the same level of indentation as the code. Such comments usually +describe the purpose of the following lines or the state of the program +at that point. For example: + +@smallexample +@group +(prog1 (setq auto-fill-function + @dots{} + @dots{} + ;; update mode line + (force-mode-line-update))) +@end group +@end smallexample + +We also normally use two semicolons for comments outside functions. + +@smallexample +@group +;; This Lisp code is run in Emacs +;; when it is to operate as a server +;; for other processes. +@end group +@end smallexample + +Every function that has no documentation string (presumably one that is +used only internally within the package it belongs to), should instead +have a two-semicolon comment right before the function, explaining what +the function does and how to call it properly. Explain precisely what +each argument means and how the function interprets its possible values. + +@item ;;; +Comments that start with three semicolons, @samp{;;;}, should start at +the left margin. These are used, occasionally, for comments within +functions that should start at the margin. We also use them sometimes +for comments that are between functions---whether to use two or three +semicolons depends on whether the comment should be considered a +``heading'' by Outline minor mode. By default, comments starting with +at least three semicolons (followed by a single space and a +non-whitespace character) are considered headings, comments starting +with two or less are not. + +Another use for triple-semicolon comments is for commenting out lines +within a function. We use three semicolons for this precisely so that +they remain at the left margin. By default, Outline minor mode does +not consider a comment to be a heading (even if it starts with at +least three semicolons) if the semicolons are followed by at least two +spaces. Thus, if you add an introductory comment to the commented out +code, make sure to indent it by at least two spaces after the three +semicolons. + +@smallexample +(defun foo (a) +;;; This is no longer necessary. +;;; (force-mode-line-update) + (message "Finished with %s" a)) +@end smallexample + +When commenting out entire functions, use two semicolons. + +@item ;;;; +Comments that start with four semicolons, @samp{;;;;}, should be aligned +to the left margin and are used for headings of major sections of a +program. For example: + +@smallexample +;;;; The kill ring +@end smallexample +@end table + +@noindent +The indentation commands of the Lisp modes in Emacs, such as @kbd{M-;} +(@code{indent-for-comment}) and @key{TAB} (@code{lisp-indent-line}), +automatically indent comments according to these conventions, +depending on the number of semicolons. @xref{Comments,, +Manipulating Comments, emacs, The GNU Emacs Manual}. + +@node Library Headers +@section Conventional Headers for Emacs Libraries +@cindex header comments +@cindex library header comments + + Emacs has conventions for using special comments in Lisp libraries +to divide them into sections and give information such as who wrote +them. This section explains these conventions. + + We'll start with an example, a package that is included in the Emacs +distribution. + + Parts of this example reflect its status as part of Emacs; for +example, the copyright notice lists the Free Software Foundation as the +copyright holder, and the copying permission says the file is part of +Emacs. When you write a package and post it, the copyright holder would +be you (unless your employer claims to own it instead), and you should +get the suggested copying permission from the end of the GNU General +Public License itself. Don't say your file is part of Emacs +if we haven't installed it in Emacs yet! + + With that warning out of the way, on to the example: + +@smallexample +@group +;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers + +;; Copyright (C) 1992 Free Software Foundation, Inc. +@end group + +;; Author: Eric S. Raymond <esr@@snark.thyrsus.com> +;; Maintainer: Eric S. Raymond <esr@@snark.thyrsus.com> +;; Created: 14 Jul 1992 +;; Version: 1.2 +@group +;; Keywords: docs + +;; This file is part of GNU Emacs. +@dots{} +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. +@end group +@end smallexample + + The very first line should have this format: + +@example +;;; @var{filename} --- @var{description} +@end example + +@noindent +The description should be complete in one line. If the file +needs a @samp{-*-} specification, put it after @var{description}. + + After the copyright notice come several @dfn{header comment} lines, +each beginning with @samp{;; @var{header-name}:}. Here is a table of +the conventional possibilities for @var{header-name}: + +@table @samp +@item Author +This line states the name and net address of at least the principal +author of the library. + +If there are multiple authors, you can list them on continuation lines +led by @code{;;} and a tab character, like this: + +@smallexample +@group +;; Author: Ashwin Ram <Ram-Ashwin@@cs.yale.edu> +;; Dave Sill <de5@@ornl.gov> +;; Dave Brennan <brennan@@hal.com> +;; Eric Raymond <esr@@snark.thyrsus.com> +@end group +@end smallexample + +@item Maintainer +This line should contain a single name/address as in the Author line, or +an address only, or the string @samp{FSF}. If there is no maintainer +line, the person(s) in the Author field are presumed to be the +maintainers. The example above is mildly bogus because the maintainer +line is redundant. + +The idea behind the @samp{Author} and @samp{Maintainer} lines is to make +possible a Lisp function to ``send mail to the maintainer'' without +having to mine the name out by hand. + +Be sure to surround the network address with @samp{<@dots{}>} if +you include the person's full name as well as the network address. + +@item Created +This optional line gives the original creation date of the +file. For historical interest only. + +@item Version +If you wish to record version numbers for the individual Lisp program, put +them in this line. + +@item Adapted-By +In this header line, place the name of the person who adapted the +library for installation (to make it fit the style conventions, for +example). + +@item Keywords +This line lists keywords for the @code{finder-by-keyword} help command. +Please use that command to see a list of the meaningful keywords. + +This field is important; it's how people will find your package when +they're looking for things by topic area. To separate the keywords, you +can use spaces, commas, or both. +@end table + + Just about every Lisp library ought to have the @samp{Author} and +@samp{Keywords} header comment lines. Use the others if they are +appropriate. You can also put in header lines with other header +names---they have no standard meanings, so they can't do any harm. + + We use additional stylized comments to subdivide the contents of the +library file. These should be separated by blank lines from anything +else. Here is a table of them: + +@table @samp +@item ;;; Commentary: +This begins introductory comments that explain how the library works. +It should come right after the copying permissions, terminated by a +@samp{Change Log}, @samp{History} or @samp{Code} comment line. This +text is used by the Finder package, so it should make sense in that +context. + +@item ;;; Documentation: +This was used in some files in place of @samp{;;; Commentary:}, +but it is deprecated. + +@item ;;; Change Log: +This begins change log information stored in the library file (if you +store the change history there). For Lisp files distributed with Emacs, +the change history is kept in the file @file{ChangeLog} and not in the +source file at all; these files generally do not have a @samp{;;; Change +Log:} line. @samp{History} is an alternative to @samp{Change Log}. + +@item ;;; Code: +This begins the actual code of the program. + +@item ;;; @var{filename} ends here +This is the @dfn{footer line}; it appears at the very end of the file. +Its purpose is to enable people to detect truncated versions of the file +from the lack of a footer line. +@end table + +@ignore + arch-tag: 9ea911c2-6b1d-47dd-88b7-0a94e8b27c2e +@end ignore diff --git a/doc/lispref/two-volume-cross-refs.txt b/doc/lispref/two-volume-cross-refs.txt new file mode 100644 index 00000000000..6e40920cf66 --- /dev/null +++ b/doc/lispref/two-volume-cross-refs.txt @@ -0,0 +1,322 @@ +Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. + See end for copying conditions. + +Two Volume Cross References +=========================== + +12 June 2007 (karl) + +For lispref 2.9 (for Emacs 22, June 2007), I created a very ugly +Makefile, in the file two-volume.make, to encapsulate all the steps +below, without manual intervention. In theory, simply running "make -f +two-volume.make" should create a vol1.pdf and vol2.pdf with all the +niceties worked out. + +One issue not explicitly discussed below is getting page numbers right. +It's not enough to go through the whole process. You have to go through +the whole process twice -- otherwise, some index entries and/or toc +entries will be off by one. See two-volume.make for a few more comments. + +For future editions, it should suffice to update the usual things in +vol[12].texi (as well as elisp.texi). That was my hope, anyway. + + +18 March 1992 (bob) + +This enables you to create manuals in *two* volumes, with tables of +contents, cross references, and indices in each volume referring to +*both* volumes. + +The procedure is tedious. However, the resulting two volumes are +conveniently organized. Each has an index of the whole two volumes. +Each volume starts with page 1. (I don't like multi-volume works +where each volume starts with a higher page number since I find it +harder to go to the right place in the volume.) + +References to the same volume are just the page number; references to +the other volume are a volumne number (in Roman numerals) preceding +the page number. + +For example, in Volume I: + + list length ......... 90 + list motion ......II:117 + +and in Volume II: + + list length ....... I:90 + list motion .........117 + +All other references and the table of contents work the same way. I +find this *very* helpful. + + +In brief: you run tex on a .texi file with + + a. redefined @contents and @summarycontents inputting elisp-toc-2vol.toc file + b. redone .aux file + c. redone .fns file + + +Here are the steps in detail: + +% tex vol1.texi +% texindex vol1.?? +% tex vol1.texi + +% tex vol2.texi +% texindex vol2.?? +% tex vol2.texi + +### Create .aux files with volume numbers for other volume. + +% cp vol1.aux elisp1-aux +% cp vol2.aux elisp2-aux + +% cp vol1.aux elisp1-aux-vol-added +% cp vol2.aux elisp2-aux-vol-added + +on elisp1-aux-vol-number-added +(volume-aux-markup 1) see defun for volume-aux-markup below. +to create elisp1-aux-vol-added + +on elisp2-aux-vol-number-added +(volume-aux-markup 2) +to create elisp2-aux-vol-added + +insert elisp2-aux-vol-added into vol1.aux (append) +insert elisp1-aux-vol-added into vol2.aux (prepend) + +(so you dont have to do it again) +% cp vol1.aux elisp1-aux-ready +% cp vol2.aux elisp2-aux-ready + + +### Create .fn files with volume numbers for other volume. + +% cp vol1.fn elisp1-fn +% cp vol2.fn elisp2-fn + +% cp vol1.fn elisp1-fn-vol-number-added +% cp vol2.fn elisp2-fn-vol-number-added + +on elisp1-fn-vol-number-added +(volume-index-markup "I") +to create elisp1-fn-vol-number-added + +on elisp2-fn-vol-number-added +(volume-index-markup "II") +to create elisp2-fn-vol-number-added + +insert elisp2-fn-vol-number-added into vol1.fn: do following `cat' +insert elisp1-fn-vol-number-added into vol2.fn: do following `cat' + +% cat elisp2-fn-vol-number-added >> vol1.fn +% cat elisp1-fn-vol-number-added >> vol2.fn + +Be sure to handle special case entries by hand. +Be sure that .fn file has no blank lines. + +% texindex vol1.fn +% texindex vol2.fn + +(so you dont have to do it again) +% cp vol1.fns elisp1-fns-2vol-ready +% cp vol2.fns elisp2-fns-2vol-ready + +### Create merged .toc file with volume number headings. + +append vol2.toc to vol1.toc with following `cat' + +% cat vol1.toc vol2.toc > elisp-toc-2vol.toc + +and edit in Volume titles + +\unnumbchapentry {Volume 1}{} +\unnumbchapentry {}{} + +\unnumbchapentry {Index}{295} +\unnumbchapentry {}{} +\unnumbchapentry {Volume 2}{} +\unnumbchapentry {}{} + +If you want to put in volume numbers for TOC, then do this: +Create volume specific .toc files with volume numbers in them. + +% cp elisp-toc-2vol.toc elisp1-toc.toc +% cp elisp-toc-2vol.toc elisp2-toc.toc + +Use keyboard macro to put I: in first half of elisp1-toc.toc and +II: in first half of elisp2-toc.toc + +Copy the tocs to something you can remember more easily + +% cp elisp2-toc.toc elisp1-toc-ready.toc +% cp elisp1-toc.toc elisp2-toc-ready.toc + +Then, edit vol1.texi to input elisp1-toc-ready.toc +and vol2.texi to input elisp2-toc-ready.toc + + +### Now format the two volumes: + +% cp elisp1-aux-2vol-ready vol1.aux +% cp elisp2-aux-2vol-ready vol2.aux + +% tex vol1.texi +% tex vol2.texi + + + +For every additional run: + +### recopy aux files so the correct ones are read: +% cp elisp1-aux-2vol-ready vol1.aux +% cp elisp2-aux-2vol-ready vol2.aux + +Do not run texindex. Then proper sorted index will stay. + else do: % cp elisp2-fns-2vol-ready vol2.fns + +Do not change the .texi files; they will call the elisp-toc-2vol.toc file. + +% tex vol1.texi +% tex vol2.texi + +================================================================ + + +(defun volume-aux-markup (arg) + "Append `vol. NUMBER' to page number. +Apply to aux file that you save. +Then insert marked file into other volume's .aux file." + (interactive "sType volume number, 1 or 2: " ) + (goto-char (point-min)) + (while (search-forward "-pg" nil t) + (end-of-line 1) + (delete-backward-char 1 nil) + (insert ", vol.'tie" arg "}"))) + +(defun volume-index-markup (arg) + "Prepend `NUMBER:' to page number. Use Roman Numeral. +Apply only to unsorted index file, +Then insert marked file into other volume's unsorted index file. +Then run texindex on that file and save." + (interactive + "sType volume number, roman number I or II: " ) + (goto-char (point-min)) + (while (search-forward "\\entry" nil t) + (search-forward "}{" (save-excursion (end-of-line) (point)) nil) + (insert arg ":"))) + + +================================================================ + + +The steps: + +1. Run TeX, texindex and TeX on file1. +2. Run TeX, texindex and TeX on file2. + +3. Copy both .aux files into specially named files + +4. In the case of the elisp ref manual, + + copy the *unsorted* function index files into specially named files + (no other index used in elisp ref manual) + + +5. For aux files: + + Run a function on the specially named .aux files to label each + entry according to volume. Save these files. + + i.e., convert + 'xrdef {Special-pg}{7} to 'xrdef {Special-pg}{7, vol.'tie1} + +5a.Insert each specially named .aux file into the regular .aux file of + the other volume. + +6. For index files: + + Run a function on the specially named unsorted index files to label + each entry according to volume. Save these files. + +6b.Insert each specially named marked unsorted index file into the + regular unsorted file of the other volume. Run texindex on this + +7. Insert the other volumes .toc file into the .toc, edit, and rename to + elisp-toc-2vol.toc + +7a. insert special @contents and @summarycontents defs into .texi files. + +8. Run TeX on each .texi file. + +================ + + + +Here is the discursive commentary: + +I've been running some small test files, called test1.texi and +test2.texi. As far as I can see, if we run tex on the two test files, +tex creates a .aux for each that includes the names of all the nodes +in that file. The node names are used for cross references. + +If you insert the .aux file for the second test file, test2.aux, into +the .aux file for the first test file, test1.aux, then when you next +run TeX on the first test file, test1.texi, the second volume cross +references are inserted. + +You can edit the text of the cross reference in test2.aux to include +the volume number. + +For example, you can take the following two lines from test1.texi and +insert them into test2.texi: + + 'xrdef {Special-pg}{7} + 'xrdef {Special-snt}{Section'tie1.6} + +You can re-edit this to show that the page is in volume 1: + + 'xrdef {Special-pg}{7, vol.'tie1} + 'xrdef {Special-snt}{Section'tie1.6} + +(The 'tie is a TeX special command to keep the number tied on one +line to the previous word. I don't know if it works after a period in +the "vol." but figure it is worth trying. {The ' is the @ of .aux files.} +Apparently 'tie is like the tilde in plain tex; in texinfo.tex, the +definition for 'tie is the following: + + \def\tie{\penalty 10000\ } % Save plain tex definition of ~. + +) + +After running tex on the test2.texi file with the augmented test2.aux +file, you can see the following in the resulting DVI file: + + See Section 1.6 [Special], page 7, vol. 1 + +Note that TeX rewrites the .aux file each time TeX is run, so after +running Tex using an .aux file augmented with the .aux file from the +other volume, the new .aux file will *lack* the other volumes cross +references. Save your augmented .aux file in some other name for +another run! + + +COPYING CONDITIONS + +This file is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +This file is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this file; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. diff --git a/doc/lispref/two-volume.make b/doc/lispref/two-volume.make new file mode 100644 index 00000000000..b2550576825 --- /dev/null +++ b/doc/lispref/two-volume.make @@ -0,0 +1,227 @@ +# Copyright 2007 Free Software Foundation, Inc. +# See end for copying conditions. + +# although it would be nice to use tex rather than pdftex to avoid +# colors, spurious warnings about names being referenced but not +# existing, etc., dvips | ps2pdf doesn't preserve the page size. +# Instead of creating a special dvips config file, put up with the warnings. +tex = pdftex -interaction=nonstopmode + +all: vol1.pdf vol2.pdf + +# vol1.texi and vol2.texi specially define \tocreadfilename so we can +# use our premade .toc's. +# +vol1.pdf: elisp1med-fns-ready elisp1med-aux-ready elisp1med-toc-ready + @echo -e "\f Final TeX run for volume 1..." + cp elisp1med-toc-ready elisp1-toc-ready.toc + cp elisp1med-fns-ready vol1.fns + cp elisp1med-aux-ready vol1.aux + $(tex) vol1.texi +# +vol2.pdf: elisp2med-fns-ready elisp2med-aux-ready elisp2med-toc-ready + @echo "Final TeX run for volume 2..." + cp elisp2med-toc-ready elisp2-toc-ready.toc + cp elisp2med-fns-ready vol2.fns + cp elisp2med-aux-ready vol2.aux + $(tex) vol2.texi + +# intermediate toc files. +# +# vol1 toc: volume 1, page break, volume 2 (with II: prepended). +elisp1med-toc-ready: elisp1med-init elisp2med-init + echo '@unnchapentry{@b{Volume 1}}{10001}{vol1}{}' >$@ + cat elisp1med-toc >>$@ + echo '@page' >>$@ + echo '@unnchapentry{@b{Volume 2}}{10001}{vol2}{}' >>$@ + sed 's/{\([^}]*\)}$$/{II:\1}/' elisp2med-toc >>$@ +# +# vol2 toc: volume 1 (with I: prepended), page break, volume 2. +elisp2med-toc-ready: elisp1med-init elisp2med-init + echo '@unnchapentry{@b{Volume 1}}{10001}{vol1}{}' >$@ + sed 's/{\([^}]*\)}$$/{I:\1}/' elisp1med-toc >>$@ + echo '@page' >>$@ + echo '@unnchapentry{@b{Volume 2}}{10001}{vol2}{}' >>$@ + cat elisp2med-toc >>$@ + + +# intermediate aux files. +# +# append vol2's fixed aux to normal vol1. +elisp1med-aux-ready: elisp2med-aux-vol-added + cat elisp1med-aux $< >$@ +# +# prepend vol1's fixed aux to vol2. +elisp2med-aux-ready: elisp1med-aux-vol-added + cat $< elisp2med-aux >$@ + +# on -pg entries, append volume number after page number. +elisp1med-aux-vol-added: elisp1med-init + sed 's/-pg}{\(.*\)}$$/-pg}{\1, vol.@tie1}/' elisp1med-aux >$@ +# +elisp2med-aux-vol-added: elisp2med-init + sed 's/-pg}{\(.*\)}$$/-pg}{\1, vol.@tie2}/' elisp2med-aux >$@ + + + +# intermediate index (fns) file. +# +elisp1med-fns-ready: elisp1med-fn-vol-added elisp2med-fn-vol-added + cat elisp2med-fn-vol-added >>vol1.fn + texindex vol1.fn + cp vol1.fns $@ +# +elisp2med-fns-ready: elisp1med-fn-vol-added elisp2med-fn-vol-added + cat elisp1med-fn-vol-added >>vol2.fn + texindex vol2.fn + cp vol2.fns $@ + +# Insert volume number (I: or II:) into index file. +elisp1med-fn-vol-added: elisp1med-init + cp vol1.fn elisp1med-fn + sed 's/}{/}{I:/' elisp1med-fn >$@ +# +elisp2med-fn-vol-added: elisp2med-init + cp vol2.fn elisp2med-fn + sed 's/}{/}{II:/' elisp2med-fn >$@ + +# ----------------------------------------------------------------------------- +# everything above is essentially a duplicate of everything below. sorry. +# ----------------------------------------------------------------------------- + +# intermediate TeX runs. +# +# this generates what would be the final versions -- except the page +# numbers aren't right. The process of adding the I: and II: changes +# the page breaks, so a few index entries, at least are wrong. (In +# 2007, x-meta-keysym in vol.II ended up on page 374 when the index had +# it on page 375 from the initial run.) +# +# So, we start all over again, from these fns/aux/toc files. +# +elisp1med-init: elisp1-fns-ready elisp1-aux-ready elisp1init-toc-ready texinfo.tex + @echo -e "\f Intermediate TeX run for volume 1..." + cp elisp1init-toc-ready elisp1-toc-ready.toc + cp elisp1-fns-ready vol1.fns + cp elisp1-aux-ready vol1.aux + $(tex) vol1.texi + texindex vol1.?? + mv vol1.aux elisp1med-aux + mv vol1.toc elisp1med-toc +# +elisp2med-init: elisp2-fns-ready elisp2-aux-ready elisp2init-toc-ready texinfo.tex + @echo "Final TeX run for volume 2..." + cp elisp2init-toc-ready elisp2-toc-ready.toc + cp elisp2-fns-ready vol2.fns + cp elisp2-aux-ready vol2.aux + $(tex) vol2.texi + texindex vol2.?? + mv vol2.aux elisp2med-aux + mv vol2.toc elisp2med-toc + + +# initial toc files. +# +# vol1 toc: volume 1, page break, volume 2 (with II: prepended). +elisp1init-toc-ready: elisp1-init elisp2-init + echo '@unnchapentry{@b{Volume 1}}{10001}{vol1}{}' >$@ + cat elisp1-toc >>$@ + echo '@page' >>$@ + echo '@unnchapentry{@b{Volume 2}}{10001}{vol2}{}' >>$@ + sed 's/{\([^}]*\)}$$/{II:\1}/' elisp2-toc >>$@ +# +# vol2 toc: volume 1 (with I: prepended), page break, volume 2. +elisp2init-toc-ready: elisp1-init elisp2-init + echo '@unnchapentry{@b{Volume 1}}{10001}{vol1}{}' >$@ + sed 's/{\([^}]*\)}$$/{I:\1}/' elisp1-toc >>$@ + echo '@page' >>$@ + echo '@unnchapentry{@b{Volume 2}}{10001}{vol2}{}' >>$@ + cat elisp2-toc >>$@ + + +# initial aux files. +# +# append vol2's fixed aux to normal vol1. The initial runs saved +# elisp1-aux and elisp2-aux. +elisp1-aux-ready: elisp2-aux-vol-added + cat elisp1-aux $< >$@ +# +# prepend vol1's fixed aux to vol2. +elisp2-aux-ready: elisp1-aux-vol-added + cat $< elisp2-aux >$@ + +# on -pg entries, append volume number after page number. +elisp1-aux-vol-added: elisp1-init + sed 's/-pg}{\(.*\)}$$/-pg}{\1, vol.@tie1}/' elisp1-aux >$@ +# +elisp2-aux-vol-added: elisp2-init + sed 's/-pg}{\(.*\)}$$/-pg}{\1, vol.@tie2}/' elisp2-aux >$@ + + +# initial index (fns) file. +# +# Append other volume's index entries to this one's. +# Index entries in this volume will then take precedence. +elisp1-fns-ready: elisp1-fn-vol-added elisp2-fn-vol-added + cat elisp2-fn-vol-added >>vol1.fn + texindex vol1.fn + cp vol1.fns $@ +# +elisp2-fns-ready: elisp1-fn-vol-added elisp2-fn-vol-added + cat elisp1-fn-vol-added >>vol2.fn + texindex vol2.fn + cp vol2.fns $@ + +# Insert volume number (I: or II:) into index file. +elisp1-fn-vol-added: elisp1-init + cp vol1.fn elisp1-fn + sed 's/}{/}{I:/' elisp1-fn >$@ +# +elisp2-fn-vol-added: elisp2-init + cp vol2.fn elisp2-fn + sed 's/}{/}{II:/' elisp2-fn >$@ + + +# initial TeX runs. +# +# We use the .fn, .aux, and .toc files created here in subsequent +# processing. The page numbers generated here will not be correct yet, +# but we run texindex and TeX a second time just to get them closer. +# Otherwise it might take even longer for them to converge. +# +elisp1-init: vol1.texi + @echo -e "\f Initial TeX run for volume 1..." + rm -f vol1.aux vol1.toc + $(tex) $< + texindex vol1.?? + mv vol1.aux elisp1-aux + mv vol1.toc elisp1-toc + touch $@ +# +elisp2-init: vol2.texi + @echo "Initial TeX run for volume 2..." + rm -f vol2.aux vol2.toc + $(tex) $< + texindex vol2.?? + mv vol2.aux elisp2-aux + mv vol2.toc elisp2-toc + touch $@ + +# COPYING CONDITIONS +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This file is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this file; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# arch-tag: 5c258a2e-d4a9-4d0e-b279-fb3a6faa27eb diff --git a/doc/lispref/two.el b/doc/lispref/two.el new file mode 100644 index 00000000000..baade844463 --- /dev/null +++ b/doc/lispref/two.el @@ -0,0 +1,80 @@ +;; Auxiliary functions for preparing a two volume manual. + +;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +;; Free Software Foundation, Inc. + +;; --rjc 30mar92 + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This file is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this file; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +(defun volume-aux-markup (arg) + "Append `vol. NUMBER' to page number. +Apply to aux file that you save. +Then insert marked file into other volume's .aux file." + (interactive "sType volume number, 1 or 2: " ) + (goto-char (point-min)) + (while (search-forward "-pg" nil t) + (end-of-line 1) + (delete-backward-char 1 nil) + (insert ", vol.'tie" arg "}"))) + +(defun volume-index-markup (arg) + "Prepend `NUMBER:' to page number. Use Roman Numeral. +Apply only to unsorted index file, +Then insert marked file into other volume's unsorted index file. +Then run texindex on that file and save." + (interactive + "sType volume number, roman number I or II: " ) + (goto-char (point-min)) + (while (search-forward "\\entry" nil t) + (search-forward "}{" (save-excursion (end-of-line) (point)) nil) + (insert arg ":"))) + +(defun volume-numbers-toc-markup (arg) + (interactive + "sType volume number, roman number I or II: " ) + (goto-char (point-min)) + (while (search-forward "chapentry" nil t) + (end-of-line) + (search-backward "{" nil t) + (forward-char 1) + (insert arg ":"))) + +(defun volume-header-toc-markup () + "Insert Volume I and Volume II text into .toc file. +NOTE: this auxilary function is file specific. +This is for the *Elisp Ref Manual*" + (interactive) + (goto-char (point-min)) + (insert "\\unnumbchapentry {Volume 1}{}\n\\unnumbchapentry {}{}\n") + (search-forward "\\unnumbchapentry {Index}") + (forward-line 1) + (insert + "\\unnumbchapentry {}{}\n\\unnumbchapentry {}{}\n\\unnumbchapentry {}{}\n\\unnumbchapentry {}{}\n\\unnumbchapentry {Volume 2}{}\n\\unnumbchapentry {}{}\n")) + + +;;; In batch mode, you cannot call functions with args; hence this kludge: + +(defun volume-aux-markup-1 () (volume-aux-markup "1")) +(defun volume-aux-markup-2 () (volume-aux-markup "2")) + +(defun volume-index-markup-I () (volume-index-markup "I")) +(defun volume-index-markup-II () (volume-index-markup "II")) + +(defun volume-numbers-toc-markup-I () (volume-numbers-toc-markup "I")) +(defun volume-numbers-toc-markup-II () (volume-numbers-toc-markup "II")) + +;;; arch-tag: 848955fe-e9cf-45e7-a2f1-570ef156d6a5 diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi new file mode 100644 index 00000000000..9d9dc8260bb --- /dev/null +++ b/doc/lispref/variables.texi @@ -0,0 +1,1908 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, +@c 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/variables +@node Variables, Functions, Control Structures, Top +@chapter Variables +@cindex variable + + A @dfn{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 of 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 its use as +a function name. @xref{Symbol Components}. + + The Lisp objects that constitute a Lisp program determine the textual +form of the program---it is simply the read syntax for those Lisp +objects. This is why, for example, a variable in a textual Lisp program +is written using the read syntax for the symbol that represents the +variable. + +@menu +* Global Variables:: Variable values that exist permanently, everywhere. +* Constant Variables:: Certain "variables" have values that never change. +* Local Variables:: Variable values that exist only temporarily. +* Void Variables:: Symbols that lack values. +* Defining Variables:: A definition says a symbol is used as a variable. +* Tips for Defining:: Things you should think about when you + define a variable. +* Accessing Variables:: Examining values of variables whose names + are known only at run time. +* Setting Variables:: Storing new values in variables. +* Variable Scoping:: How Lisp chooses among local and global values. +* Buffer-Local Variables:: Variable values in effect only in one buffer. +* Frame-Local Variables:: Variable values in effect only in one frame. +* Future Local Variables:: New kinds of local values we might add some day. +* File Local Variables:: Handling local variable lists in files. +* Variable Aliases:: Variables that are aliases for other variables. +* Variables with Restricted Values:: Non-constant variables whose value can + @emph{not} be an arbitrary Lisp object. +@end menu + +@node Global Variables +@section Global Variables +@cindex global variable + + The simplest way to use a variable is @dfn{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 @code{setq}. For example, + +@example +(setq x '(a b)) +@end example + +@noindent +gives the variable @code{x} the value @code{(a b)}. Note that +@code{setq} does not evaluate its first argument, the name of the +variable, but it does evaluate the second argument, the new value. + + Once the variable has a value, you can refer to it by using the symbol +by itself as an expression. Thus, + +@example +@group +x @result{} (a b) +@end group +@end example + +@noindent +assuming the @code{setq} form shown above has already been executed. + + If you do set the same variable again, the new value replaces the old +one: + +@example +@group +x + @result{} (a b) +@end group +@group +(setq x 4) + @result{} 4 +@end group +@group +x + @result{} 4 +@end group +@end example + +@node Constant Variables +@section Variables that Never Change +@kindex setting-constant +@cindex keyword symbol +@cindex variable with constant value +@cindex constant variables +@cindex symbol that evaluates to itself +@cindex symbol with constant value + + In Emacs Lisp, certain symbols normally evaluate to themselves. These +include @code{nil} and @code{t}, as well as any symbol whose name starts +with @samp{:} (these are called @dfn{keywords}). These symbols cannot +be rebound, nor can their values be changed. Any attempt to set or bind +@code{nil} or @code{t} signals a @code{setting-constant} error. The +same is true for a keyword (a symbol whose name starts with @samp{:}), +if it is interned in the standard obarray, except that setting such a +symbol to itself is not an error. + +@example +@group +nil @equiv{} 'nil + @result{} nil +@end group +@group +(setq nil 500) +@error{} Attempt to set constant symbol: nil +@end group +@end example + +@defun keywordp object +function returns @code{t} if @var{object} is a symbol whose name +starts with @samp{:}, interned in the standard obarray, and returns +@code{nil} otherwise. +@end defun + +@node Local Variables +@section Local Variables +@cindex binding local variables +@cindex local variables +@cindex local binding +@cindex global binding + + Global variables have values that last until explicitly superseded +with new values. Sometimes it is useful to create variable values that +exist temporarily---only until a certain part of the program finishes. +These values are called @dfn{local}, and the variables so used are +called @dfn{local variables}. + + For example, when a function is called, its argument variables receive +new local values that last until the function exits. The @code{let} +special form explicitly establishes new local values for specified +variables; these last until exit from the @code{let} form. + +@cindex shadowing of variables + Establishing a local value saves away the previous value (or lack of +one) of the variable. 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 @dfn{shadowed} and @dfn{not visible}. Both global and +local values may be shadowed (@pxref{Scope}). + + If you set a variable (such as with @code{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 @dfn{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 @code{let}, creates the +local binding; exit from the function or from the @code{let} removes the +local binding. As long as the local binding lasts, the variable's value +is stored within it. Use of @code{setq} or @code{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 @dfn{global binding}, which is where +(conceptually) the global value is kept. + +@cindex current binding + A variable can have more than one local binding at a time (for +example, if there are nested @code{let} forms that bind it). In such a +case, the most recently created local binding that still exists is the +@dfn{current binding} of the variable. (This rule is called +@dfn{dynamic scoping}; see @ref{Variable Scoping}.) If there are no +local bindings, the variable's global binding is its current binding. +We sometimes call the current binding the @dfn{most-local existing +binding}, for emphasis. Ordinary evaluation of a symbol always returns +the value of its current binding. + + The special forms @code{let} and @code{let*} exist to create +local bindings. + +@defspec let (bindings@dots{}) forms@dots{} +This special form binds variables according to @var{bindings} and then +evaluates all of the @var{forms} in textual order. The @code{let}-form +returns the value of the last form in @var{forms}. + +Each of the @var{bindings} is either @w{(i) a} symbol, in which case +that symbol is bound to @code{nil}; or @w{(ii) a} list of the form +@code{(@var{symbol} @var{value-form})}, in which case @var{symbol} is +bound to the result of evaluating @var{value-form}. If @var{value-form} +is omitted, @code{nil} is used. + +All of the @var{value-form}s in @var{bindings} are evaluated in the +order they appear and @emph{before} binding any of the symbols to them. +Here is an example of this: @code{z} is bound to the old value of +@code{y}, which is 2, not the new value of @code{y}, which is 1. + +@example +@group +(setq y 2) + @result{} 2 +@end group +@group +(let ((y 1) + (z y)) + (list y z)) + @result{} (1 2) +@end group +@end example +@end defspec + +@defspec let* (bindings@dots{}) forms@dots{} +This special form is like @code{let}, but it binds each variable right +after computing its local value, before computing the local value for +the next variable. Therefore, an expression in @var{bindings} can +reasonably refer to the preceding symbols bound in this @code{let*} +form. Compare the following example with the example above for +@code{let}. + +@example +@group +(setq y 2) + @result{} 2 +@end group +@group +(let* ((y 1) + (z y)) ; @r{Use the just-established value of @code{y}.} + (list y z)) + @result{} (1 1) +@end group +@end example +@end defspec + + Here is a complete list of the other facilities that create local +bindings: + +@itemize @bullet +@item +Function calls (@pxref{Functions}). + +@item +Macro calls (@pxref{Macros}). + +@item +@code{condition-case} (@pxref{Errors}). +@end itemize + + Variables can also have buffer-local bindings (@pxref{Buffer-Local +Variables}) and frame-local bindings (@pxref{Frame-Local Variables}); a +few variables have terminal-local bindings (@pxref{Multiple Displays}). +These kinds of bindings work somewhat like ordinary local bindings, but +they are localized depending on ``where'' you are in Emacs, rather than +localized in time. + +@defvar max-specpdl-size +@anchor{Definition of max-specpdl-size} +@cindex variable limit error +@cindex evaluation error +@cindex infinite recursion +This variable defines the limit on the total number of local variable +bindings and @code{unwind-protect} cleanups (@pxref{Cleanups,, +Cleaning Up from Nonlocal Exits}) that are allowed before signaling an +error (with data @code{"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. +@code{max-lisp-eval-depth} provides another limit on depth of nesting. +@xref{Definition of max-lisp-eval-depth,, Eval}. + +The default value is 1000. Entry to the Lisp debugger increases the +value, if there is little room left, to make sure the debugger itself +has room to execute. +@end defvar + +@node Void Variables +@section When a Variable is ``Void'' +@kindex void-variable +@cindex void variable + + If you have never given a symbol any value as a global variable, we +say that that symbol's global value is @dfn{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 @code{void-variable} error rather than +a value. + + Note that a value of @code{nil} is not the same as void. The symbol +@code{nil} is a Lisp object and can be the value of a variable just as any +other object can be; but it is @emph{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 @code{makunbound}. + +@defun makunbound symbol +This function makes the current variable binding of @var{symbol} void. +Subsequent attempts to use this symbol's value as a variable will signal +the error @code{void-variable}, unless and until you set it again. + +@code{makunbound} returns @var{symbol}. + +@example +@group +(makunbound 'x) ; @r{Make the global value of @code{x} void.} + @result{} x +@end group +@group +x +@error{} Symbol's value as variable is void: x +@end group +@end example + +If @var{symbol} is locally bound, @code{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 local or global binding is +reexposed as usual, and the variable is no longer void unless the newly +reexposed binding was void all along. + +@smallexample +@group +(setq x 1) ; @r{Put a value in the global binding.} + @result{} 1 +(let ((x 2)) ; @r{Locally bind it.} + (makunbound 'x) ; @r{Void the local binding.} + x) +@error{} Symbol's value as variable is void: x +@end group +@group +x ; @r{The global binding is unchanged.} + @result{} 1 + +(let ((x 2)) ; @r{Locally bind it.} + (let ((x 3)) ; @r{And again.} + (makunbound 'x) ; @r{Void the innermost-local binding.} + x)) ; @r{And refer: it's void.} +@error{} Symbol's value as variable is void: x +@end group + +@group +(let ((x 2)) + (let ((x 3)) + (makunbound 'x)) ; @r{Void inner binding, then remove it.} + x) ; @r{Now outer @code{let} binding is visible.} + @result{} 2 +@end group +@end smallexample +@end defun + + A variable that has been made void with @code{makunbound} is +indistinguishable from one that has never received a value and has +always been void. + + You can use the function @code{boundp} to test whether a variable is +currently void. + +@defun boundp variable +@code{boundp} returns @code{t} if @var{variable} (a symbol) is not void; +more precisely, if its current binding is not void. It returns +@code{nil} otherwise. + +@smallexample +@group +(boundp 'abracadabra) ; @r{Starts out void.} + @result{} nil +@end group +@group +(let ((abracadabra 5)) ; @r{Locally bind it.} + (boundp 'abracadabra)) + @result{} t +@end group +@group +(boundp 'abracadabra) ; @r{Still globally void.} + @result{} nil +@end group +@group +(setq abracadabra 5) ; @r{Make it globally nonvoid.} + @result{} 5 +@end group +@group +(boundp 'abracadabra) + @result{} t +@end group +@end smallexample +@end defun + +@node Defining Variables +@section Defining Global Variables +@cindex variable definition + + You may announce your intention to use a symbol as a global variable +with a @dfn{variable definition}: a special form, either @code{defconst} +or @code{defvar}. + + In Emacs Lisp, definitions serve three purposes. First, they inform +people who read the code that certain symbols are @emph{intended} to be +used a certain way (as variables). Second, they inform the Lisp system +of these things, supplying a value and documentation. Third, they +provide information to utilities such as @code{etags} and +@code{make-docfile}, which create data bases of the functions and +variables in a program. + + The difference between @code{defconst} and @code{defvar} is primarily +a matter of intent, serving to inform human readers of whether the value +should ever change. Emacs Lisp does not restrict the ways in which a +variable can be used based on @code{defconst} or @code{defvar} +declarations. However, it does make a difference for initialization: +@code{defconst} unconditionally initializes the variable, while +@code{defvar} initializes it only if it is void. + +@ignore + One would expect user option variables to be defined with +@code{defconst}, since programs do not change them. Unfortunately, this +has bad results if the definition is in a library that is not preloaded: +@code{defconst} would override any prior value when the library is +loaded. Users would like to be able to set user options in their init +files, and override the default values given in the definitions. For +this reason, user options must be defined with @code{defvar}. +@end ignore + +@defspec defvar symbol [value [doc-string]] +This special form defines @var{symbol} as a variable and can also +initialize and document it. The definition informs a person reading +your code that @var{symbol} is used as a variable that might be set or +changed. Note that @var{symbol} is not evaluated; the symbol to be +defined must appear explicitly in the @code{defvar}. + +If @var{symbol} is void and @var{value} is specified, @code{defvar} +evaluates it and sets @var{symbol} to the result. But if @var{symbol} +already has a value (i.e., it is not void), @var{value} is not even +evaluated, and @var{symbol}'s value remains unchanged. If @var{value} +is omitted, the value of @var{symbol} is not changed in any case. + +If @var{symbol} has a buffer-local binding in the current buffer, +@code{defvar} operates on the default value, which is buffer-independent, +not the current (buffer-local) binding. It sets the default value if +the default value is void. @xref{Buffer-Local Variables}. + +When you evaluate a top-level @code{defvar} form with @kbd{C-M-x} in +Emacs Lisp mode (@code{eval-defun}), a special feature of +@code{eval-defun} arranges to set the variable unconditionally, without +testing whether its value is void. + +If the @var{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 @code{variable-documentation} property. The +Emacs help functions (@pxref{Documentation}) look for this property. + +If the variable is a user option that users would want to set +interactively, you should use @samp{*} as the first character of +@var{doc-string}. This lets users set the variable conveniently using +the @code{set-variable} command. Note that you should nearly always +use @code{defcustom} instead of @code{defvar} to define these +variables, so that users can use @kbd{M-x customize} and related +commands to set them. @xref{Customization}. + +Here are some examples. This form defines @code{foo} but does not +initialize it: + +@example +@group +(defvar foo) + @result{} foo +@end group +@end example + +This example initializes the value of @code{bar} to @code{23}, and gives +it a documentation string: + +@example +@group +(defvar bar 23 + "The normal weight of a bar.") + @result{} bar +@end group +@end example + +The following form changes the documentation string for @code{bar}, +making it a user option, but does not change the value, since @code{bar} +already has a value. (The addition @code{(1+ nil)} would get an error +if it were evaluated, but since it is not evaluated, there is no error.) + +@example +@group +(defvar bar (1+ nil) + "*The normal weight of a bar.") + @result{} bar +@end group +@group +bar + @result{} 23 +@end group +@end example + +Here is an equivalent expression for the @code{defvar} special form: + +@example +@group +(defvar @var{symbol} @var{value} @var{doc-string}) +@equiv{} +(progn + (if (not (boundp '@var{symbol})) + (setq @var{symbol} @var{value})) + (if '@var{doc-string} + (put '@var{symbol} 'variable-documentation '@var{doc-string})) + '@var{symbol}) +@end group +@end example + +The @code{defvar} form returns @var{symbol}, but it is normally used +at top level in a file where its value does not matter. +@end defspec + +@defspec defconst symbol value [doc-string] +This special form defines @var{symbol} as a value and initializes it. +It informs a person reading your code that @var{symbol} has a standard +global value, established here, that should not be changed by the user +or by other programs. Note that @var{symbol} is not evaluated; the +symbol to be defined must appear explicitly in the @code{defconst}. + +@code{defconst} always evaluates @var{value}, and sets the value of +@var{symbol} to the result. If @var{symbol} does have a buffer-local +binding in the current buffer, @code{defconst} sets the default value, +not the buffer-local value. (But you should not be making +buffer-local bindings for a symbol that is defined with +@code{defconst}.) + +Here, @code{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. + +@example +@group +(defconst pi 3.1415 "Pi to five places.") + @result{} pi +@end group +@group +(setq pi 3) + @result{} pi +@end group +@group +pi + @result{} 3 +@end group +@end example +@end defspec + +@defun user-variable-p variable +@cindex user option +This function returns @code{t} if @var{variable} is a user option---a +variable intended to be set by the user for customization---and +@code{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 either +though being declared using @code{defcustom}@footnote{They may also be +declared equivalently in @file{cus-start.el}.} or by the first character +of their @code{variable-documentation} property. If the property exists +and is a string, and its first character is @samp{*}, then the variable +is a user option. Aliases of user options are also user options. +@end defun + +@kindex variable-interactive + If a user option variable has a @code{variable-interactive} property, +the @code{set-variable} command uses that value to control reading the +new value for the variable. The property's value is used as if it were +specified in @code{interactive} (@pxref{Using Interactive}). However, +this feature is largely obsoleted by @code{defcustom} +(@pxref{Customization}). + + @strong{Warning:} If the @code{defconst} and @code{defvar} special +forms are used while the variable has a local binding (made with +@code{let}, or a function argument), they set the local-binding's +value; the top-level binding is not changed. This is not what you +usually want. To prevent it, use these special forms at top level in +a file, where normally no local binding is in effect, and make sure to +load the file before making a local binding for the variable. + +@node Tips for Defining +@section Tips for Defining Variables Robustly + + When you define a variable whose value is a function, or a list of +functions, use a name that ends in @samp{-function} or +@samp{-functions}, respectively. + + There are several other variable name conventions; +here is a complete list: + +@table @samp +@item @dots{}-hook +The variable is a normal hook (@pxref{Hooks}). + +@item @dots{}-function +The value is a function. + +@item @dots{}-functions +The value is a list of functions. + +@item @dots{}-form +The value is a form (an expression). + +@item @dots{}-forms +The value is a list of forms (expressions). + +@item @dots{}-predicate +The value is a predicate---a function of one argument that returns +non-@code{nil} for ``good'' arguments and @code{nil} for ``bad'' +arguments. + +@item @dots{}-flag +The value is significant only as to whether it is @code{nil} or not. + +@item @dots{}-program +The value is a program name. + +@item @dots{}-command +The value is a whole shell command. + +@item @dots{}-switches +The value specifies options for a command. +@end table + + When you define a variable, always consider whether you should mark +it as ``risky''; see @ref{File Local Variables}. + + When defining and initializing a variable that holds a complicated +value (such as a keymap with bindings in it), it's best to put the +entire computation of the value into the @code{defvar}, like this: + +@example +(defvar my-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\C-c\C-a" 'my-command) + @dots{} + map) + @var{docstring}) +@end example + +@noindent +This method has several benefits. First, if the user quits while +loading the file, the variable is either still uninitialized or +initialized properly, never in-between. If it is still uninitialized, +reloading the file will initialize it properly. Second, reloading the +file once the variable is initialized will not alter it; that is +important if the user has run hooks to alter part of the contents (such +as, to rebind keys). Third, evaluating the @code{defvar} form with +@kbd{C-M-x} @emph{will} reinitialize the map completely. + + Putting so much code in the @code{defvar} form has one disadvantage: +it puts the documentation string far away from the line which names the +variable. Here's a safe way to avoid that: + +@example +(defvar my-mode-map nil + @var{docstring}) +(unless my-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\C-c\C-a" 'my-command) + @dots{} + (setq my-mode-map map))) +@end example + +@noindent +This has all the same advantages as putting the initialization inside +the @code{defvar}, except that you must type @kbd{C-M-x} twice, once on +each form, if you do want to reinitialize the variable. + + But be careful not to write the code like this: + +@example +(defvar my-mode-map nil + @var{docstring}) +(unless my-mode-map + (setq my-mode-map (make-sparse-keymap)) + (define-key my-mode-map "\C-c\C-a" 'my-command) + @dots{}) +@end example + +@noindent +This code sets the variable, then alters it, but it does so in more than +one step. If the user quits just after the @code{setq}, that leaves the +variable neither correctly initialized nor void nor @code{nil}. Once +that happens, reloading the file will not initialize the variable; it +will remain incomplete. + +@node Accessing Variables +@section Accessing Variable Values + + The usual way to reference a variable is to write the symbol which +names it (@pxref{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 @code{symbol-value}. + +@defun symbol-value symbol +This function returns the value of @var{symbol}. This is the value in +the innermost local binding of the symbol, or its global value if it +has no local bindings. + +@example +@group +(setq abracadabra 5) + @result{} 5 +@end group +@group +(setq foo 9) + @result{} 9 +@end group + +@group +;; @r{Here the symbol @code{abracadabra}} +;; @r{is the symbol whose value is examined.} +(let ((abracadabra 'foo)) + (symbol-value 'abracadabra)) + @result{} foo +@end group + +@group +;; @r{Here, the value of @code{abracadabra},} +;; @r{which is @code{foo},} +;; @r{is the symbol whose value is examined.} +(let ((abracadabra 'foo)) + (symbol-value abracadabra)) + @result{} 9 +@end group + +@group +(symbol-value 'abracadabra) + @result{} 5 +@end group +@end example + +A @code{void-variable} error is signaled if the current binding of +@var{symbol} is void. +@end defun + +@node Setting Variables +@section How to Alter a Variable Value + + The usual way to change the value of a variable is with the special +form @code{setq}. When you need to compute the choice of variable at +run time, use the function @code{set}. + +@defspec setq [symbol form]@dots{} +This special form is the most common method of changing a variable's +value. Each @var{symbol} is given a new value, which is the result of +evaluating the corresponding @var{form}. The most-local existing +binding of the symbol is changed. + +@code{setq} does not evaluate @var{symbol}; it sets the symbol that you +write. We say that this argument is @dfn{automatically quoted}. The +@samp{q} in @code{setq} stands for ``quoted.'' + +The value of the @code{setq} form is the value of the last @var{form}. + +@example +@group +(setq x (1+ 2)) + @result{} 3 +@end group +x ; @r{@code{x} now has a global value.} + @result{} 3 +@group +(let ((x 5)) + (setq x 6) ; @r{The local binding of @code{x} is set.} + x) + @result{} 6 +@end group +x ; @r{The global value is unchanged.} + @result{} 3 +@end example + +Note that the first @var{form} is evaluated, then the first +@var{symbol} is set, then the second @var{form} is evaluated, then the +second @var{symbol} is set, and so on: + +@example +@group +(setq x 10 ; @r{Notice that @code{x} is set before} + y (1+ x)) ; @r{the value of @code{y} is computed.} + @result{} 11 +@end group +@end example +@end defspec + +@defun set symbol value +This function sets @var{symbol}'s value to @var{value}, then returns +@var{value}. Since @code{set} is a function, the expression written for +@var{symbol} is evaluated to obtain the symbol to set. + +The most-local existing binding of the variable is the binding that is +set; shadowed bindings are not affected. + +@example +@group +(set one 1) +@error{} Symbol's value as variable is void: one +@end group +@group +(set 'one 1) + @result{} 1 +@end group +@group +(set 'two 'one) + @result{} one +@end group +@group +(set two 2) ; @r{@code{two} evaluates to symbol @code{one}.} + @result{} 2 +@end group +@group +one ; @r{So it is @code{one} that was set.} + @result{} 2 +(let ((one 1)) ; @r{This binding of @code{one} is set,} + (set 'one 3) ; @r{not the global value.} + one) + @result{} 3 +@end group +@group +one + @result{} 2 +@end group +@end example + +If @var{symbol} is not actually a symbol, a @code{wrong-type-argument} +error is signaled. + +@example +(set '(x y) 'z) +@error{} Wrong type argument: symbolp, (x y) +@end example + +Logically speaking, @code{set} is a more fundamental primitive than +@code{setq}. Any use of @code{setq} can be trivially rewritten to use +@code{set}; @code{setq} could even be defined as a macro, given the +availability of @code{set}. However, @code{set} itself is rarely used; +beginners hardly need to know about it. It is useful only for choosing +at run time which variable to set. For example, the command +@code{set-variable}, which reads a variable name from the user and then +sets the variable, needs to use @code{set}. + +@cindex CL note---@code{set} local +@quotation +@b{Common Lisp note:} In Common Lisp, @code{set} always changes the +symbol's ``special'' or dynamic value, ignoring any lexical bindings. +In Emacs Lisp, all variables and all bindings are dynamic, so @code{set} +always affects the most local existing binding. +@end quotation +@end defun + +@node Variable Scoping +@section Scoping Rules for Variable Bindings + + A given symbol @code{foo} can 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. + +@cindex scope +@cindex extent +@cindex dynamic scoping +@cindex lexical scoping + Local bindings in Emacs Lisp have @dfn{indefinite scope} and +@dfn{dynamic extent}. @dfn{Scope} refers to @emph{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. @dfn{Extent} refers to @emph{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 +@dfn{dynamic scoping}. By contrast, most programming languages use +@dfn{lexical scoping}, in which references to a local variable must be +located textually within the function or block that binds the variable. + +@cindex CL note---special variables +@quotation +@b{Common Lisp note:} Variables declared ``special'' in Common Lisp are +dynamically scoped, like all variables in Emacs Lisp. +@end quotation + +@menu +* Scope:: Scope means where in the program a value is visible. + Comparison with other languages. +* Extent:: Extent means how long in time a value exists. +* Impl of Scope:: Two ways to implement dynamic scoping. +* Using Scoping:: How to use dynamic scoping carefully and avoid problems. +@end menu + +@node Scope +@subsection Scope + + Emacs Lisp uses @dfn{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: + +@example +@group +(defun binder (x) ; @r{@code{x} is bound in @code{binder}.} + (foo 5)) ; @r{@code{foo} is some other function.} +@end group + +@group +(defun user () ; @r{@code{x} is used ``free'' in @code{user}.} + (list x)) +@end group +@end example + + In a lexically scoped language, the binding of @code{x} in +@code{binder} would never be accessible in @code{user}, because +@code{user} is not textually contained within the function +@code{binder}. However, in dynamically-scoped Emacs Lisp, @code{user} +may or may not refer to the binding of @code{x} established in +@code{binder}, depending on the circumstances: + +@itemize @bullet +@item +If we call @code{user} directly without calling @code{binder} at all, +then whatever binding of @code{x} is found, it cannot come from +@code{binder}. + +@item +If we define @code{foo} as follows and then call @code{binder}, then the +binding made in @code{binder} will be seen in @code{user}: + +@example +@group +(defun foo (lose) + (user)) +@end group +@end example + +@item +However, if we define @code{foo} as follows and then call @code{binder}, +then the binding made in @code{binder} @emph{will not} be seen in +@code{user}: + +@example +(defun foo (x) + (user)) +@end example + +@noindent +Here, when @code{foo} is called by @code{binder}, it binds @code{x}. +(The binding in @code{foo} is said to @dfn{shadow} the one made in +@code{binder}.) Therefore, @code{user} will access the @code{x} bound +by @code{foo} instead of the one bound by @code{binder}. +@end itemize + +Emacs Lisp uses dynamic scoping because simple implementations of +lexical scoping are slow. In addition, every Lisp system needs to offer +dynamic scoping at least as an option; if lexical scoping is the norm, +there must be a way to specify dynamic scoping instead for a particular +variable. It might not be a bad thing for Emacs to offer both, but +implementing it with dynamic scoping only was much easier. + +@node Extent +@subsection Extent + + @dfn{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 @dfn{dynamic +extent}. ``Local'' or ``automatic'' variables in most languages, +including C and Pascal, have dynamic extent. + + One alternative to dynamic extent is @dfn{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, @code{make-add}, returns a +function that purports to add @var{n} to its own argument @var{m}. This +would work in Common Lisp, but it does not do the job in Emacs Lisp, +because after the call to @code{make-add} exits, the variable @code{n} +is no longer bound to the actual argument 2. + +@example +(defun make-add (n) + (function (lambda (m) (+ n m)))) ; @r{Return a function.} + @result{} make-add +(fset 'add2 (make-add 2)) ; @r{Define function @code{add2}} + ; @r{with @code{(make-add 2)}.} + @result{} (lambda (m) (+ n m)) +(add2 4) ; @r{Try to add 2 to 4.} +@error{} Symbol's value as variable is void: n +@end example + +@cindex closures not available + Some Lisp dialects have ``closures,'' objects that are like functions +but record additional variable bindings. Emacs Lisp does not have +closures. + +@node Impl of Scope +@subsection Implementation of Dynamic Scoping +@cindex deep binding + + A simple sample implementation (which is not how Emacs Lisp actually +works) may help you understand dynamic binding. This technique is +called @dfn{deep binding} and was used in early Lisp systems. + + Suppose there is a stack of bindings, which are variable-value pairs. +At entry to a function or to a @code{let} form, we can push bindings +onto 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. + +@cindex shallow binding + The actual implementation of variable scoping in GNU Emacs Lisp uses a +technique called @dfn{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. Creating a new binding works by pushing the old value +(belonging to a previous binding) onto a stack, and storing the new +local value in the value cell. Eliminating a binding works by popping +the old value off the stack, into 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. + +@node Using Scoping +@subsection 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: + +@itemize @bullet +@item +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. + +@item +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 +@code{case-fold-search} is defined as ``non-@code{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. +@end itemize + + In either case, you should define the variable with @code{defvar}. +This helps other people understand your program by telling them to look +for inter-function usage. It also avoids a warning from the byte +compiler. Choose the variable's name to avoid name conflicts---don't +use short names like @code{x}. + +@node Buffer-Local Variables +@section Buffer-Local Variables +@cindex variable, buffer-local +@cindex buffer-local variables + + Global and local variable bindings are found in most programming +languages in one form or another. Emacs, however, also supports additional, +unusual kinds of variable binding: @dfn{buffer-local} bindings, which +apply only in one buffer, and @dfn{frame-local} bindings, which apply only in +one frame. Having different values for a variable in different buffers +and/or frames is an important customization method. + + This section describes buffer-local bindings; for frame-local +bindings, see the following section, @ref{Frame-Local Variables}. (A few +variables have bindings that are local to each terminal; see +@ref{Multiple Displays}.) + +@menu +* Intro to Buffer-Local:: Introduction and concepts. +* Creating Buffer-Local:: Creating and destroying buffer-local bindings. +* Default Value:: The default value is seen in buffers + that don't have their own buffer-local values. +@end menu + +@node Intro to Buffer-Local +@subsection 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 its other bindings are unchanged. This means that the change is +visible only in the buffer where you made it. + + The variable's ordinary binding, which is not associated with any +specific buffer, is called the @dfn{default binding}. In most cases, +this is the global binding. + + A variable can have buffer-local bindings in some buffers but not in +other buffers. The default binding is shared by all the buffers that +don't have their own bindings for the variable. (This includes all +newly-created buffers.) If you set the variable in a buffer that does +not have a buffer-local binding for it, this sets the default binding +(assuming there are no frame-local bindings to complicate the matter), +so the new value is visible in all the buffers that see the default +binding. + + 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 @code{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. @xref{Major Modes}. + + The usual way to make a buffer-local binding is with +@code{make-local-variable}, which is what major mode commands typically +use. This affects just the current buffer; all other buffers (including +those yet to be created) will continue to share the default value unless +they are explicitly given their own buffer-local bindings. + +@cindex automatically buffer-local + A more powerful operation is to mark the variable as +@dfn{automatically buffer-local} by calling +@code{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 default value of the variable as usual, +but setting the variable creates a buffer-local binding for the current +buffer. The new value is stored in the buffer-local binding, leaving +the default binding untouched. This means that the default value cannot +be changed with @code{setq} in any buffer; the only way to change it is +with @code{setq-default}. + + @strong{Warning:} When a variable has buffer-local or frame-local +bindings in one or more buffers, @code{let} rebinds the binding that's +currently in effect. For instance, if the current buffer has a +buffer-local value, @code{let} temporarily rebinds that. If no +buffer-local or frame-local bindings are in effect, @code{let} rebinds +the default value. If inside the @code{let} you then change to a +different current buffer in which a different binding is in effect, +you won't see the @code{let} binding any more. And if you exit the +@code{let} while still in the other buffer, you won't see the +unbinding occur (though it will occur properly). Here is an example +to illustrate: + +@example +@group +(setq foo 'g) +(set-buffer "a") +(make-local-variable 'foo) +@end group +(setq foo 'a) +(let ((foo 'temp)) + ;; foo @result{} 'temp ; @r{let binding in buffer @samp{a}} + (set-buffer "b") + ;; foo @result{} 'g ; @r{the global value since foo is not local in @samp{b}} + @var{body}@dots{}) +@group +foo @result{} 'g ; @r{exiting restored the local value in buffer @samp{a},} + ; @r{but we don't see that in buffer @samp{b}} +@end group +@group +(set-buffer "a") ; @r{verify the local value was restored} +foo @result{} 'a +@end group +@end example + + Note that references to @code{foo} in @var{body} access the +buffer-local binding of buffer @samp{b}. + + When a file specifies local variable values, these become buffer-local +values when you visit the file. @xref{File Variables,,, emacs, The +GNU Emacs Manual}. + +@node Creating Buffer-Local +@subsection Creating and Deleting Buffer-Local Bindings + +@deffn Command make-local-variable variable +This function creates a buffer-local binding in the current buffer for +@var{variable} (a symbol). Other buffers are not affected. The value +returned is @var{variable}. + +@c Emacs 19 feature +The buffer-local value of @var{variable} starts out as the same value +@var{variable} previously had. If @var{variable} was void, it remains +void. + +@example +@group +;; @r{In buffer @samp{b1}:} +(setq foo 5) ; @r{Affects all buffers.} + @result{} 5 +@end group +@group +(make-local-variable 'foo) ; @r{Now it is local in @samp{b1}.} + @result{} foo +@end group +@group +foo ; @r{That did not change} + @result{} 5 ; @r{the value.} +@end group +@group +(setq foo 6) ; @r{Change the value} + @result{} 6 ; @r{in @samp{b1}.} +@end group +@group +foo + @result{} 6 +@end group + +@group +;; @r{In buffer @samp{b2}, the value hasn't changed.} +(save-excursion + (set-buffer "b2") + foo) + @result{} 5 +@end group +@end example + +Making a variable buffer-local within a @code{let}-binding for that +variable does not work reliably, unless the buffer in which you do this +is not current either on entry to or exit from the @code{let}. This is +because @code{let} does not distinguish between different kinds of +bindings; it knows only which variable the binding was made for. + +If the variable is terminal-local, this function signals an error. Such +variables cannot have buffer-local bindings as well. @xref{Multiple +Displays}. + +@strong{Warning:} do not use @code{make-local-variable} for a hook +variable. The hook variables are automatically made buffer-local as +needed if you use the @var{local} argument to @code{add-hook} or +@code{remove-hook}. +@end deffn + +@deffn Command make-variable-buffer-local variable +This function marks @var{variable} (a symbol) automatically +buffer-local, so that any subsequent attempt to set it will make it +local to the current buffer at the time. + +A peculiar wrinkle of this feature is that binding the variable (with +@code{let} or other binding constructs) does not create a buffer-local +binding for it. Only setting the variable (with @code{set} or +@code{setq}), while the variable does not have a @code{let}-style +binding that was made in the current buffer, does so. + +If @var{variable} does not have a default value, then calling this +command will give it a default value of @code{nil}. If @var{variable} +already has a default value, that value remains unchanged. +Subsequently calling @code{makunbound} on @var{variable} will result +in a void buffer-local value and leave the default value unaffected. + +The value returned is @var{variable}. + +@strong{Warning:} Don't assume that you should use +@code{make-variable-buffer-local} for user-option variables, simply +because users @emph{might} want to customize them differently in +different buffers. Users can make any variable local, when they wish +to. It is better to leave the choice to them. + +The time to use @code{make-variable-buffer-local} is when it is crucial +that no two buffers ever share the same binding. For example, when a +variable is used for internal purposes in a Lisp program which depends +on having separate values in separate buffers, then using +@code{make-variable-buffer-local} can be the best solution. +@end deffn + +@defun local-variable-p variable &optional buffer +This returns @code{t} if @var{variable} is buffer-local in buffer +@var{buffer} (which defaults to the current buffer); otherwise, +@code{nil}. +@end defun + +@defun local-variable-if-set-p variable &optional buffer +This returns @code{t} if @var{variable} will become buffer-local in +buffer @var{buffer} (which defaults to the current buffer) if it is +set there. +@end defun + +@defun buffer-local-value variable buffer +This function returns the buffer-local binding of @var{variable} (a +symbol) in buffer @var{buffer}. If @var{variable} does not have a +buffer-local binding in buffer @var{buffer}, it returns the default +value (@pxref{Default Value}) of @var{variable} instead. +@end defun + +@defun buffer-local-variables &optional buffer +This function returns a list describing the buffer-local variables in +buffer @var{buffer}. (If @var{buffer} is omitted, the current buffer is +used.) It returns an association list (@pxref{Association Lists}) in +which each element contains one buffer-local variable and its value. +However, when a variable's buffer-local binding in @var{buffer} is void, +then the variable appears directly in the resulting list. + +@example +@group +(make-local-variable 'foobar) +(makunbound 'foobar) +(make-local-variable 'bind-me) +(setq bind-me 69) +@end group +(setq lcl (buffer-local-variables)) + ;; @r{First, built-in variables local in all buffers:} +@result{} ((mark-active . nil) + (buffer-undo-list . nil) + (mode-name . "Fundamental") + @dots{} +@group + ;; @r{Next, non-built-in buffer-local variables.} + ;; @r{This one is buffer-local and void:} + foobar + ;; @r{This one is buffer-local and nonvoid:} + (bind-me . 69)) +@end group +@end example + +Note that storing new values into the @sc{cdr}s of cons cells in this +list does @emph{not} change the buffer-local values of the variables. +@end defun + +@deffn Command kill-local-variable variable +This function deletes the buffer-local binding (if any) for +@var{variable} (a symbol) in the current buffer. As a result, the +default binding of @var{variable} becomes visible in this buffer. This +typically results in a change in the value of @var{variable}, since the +default value is usually different from the buffer-local value just +eliminated. + +If you kill the buffer-local binding of a variable that automatically +becomes buffer-local when set, this makes the default value visible in +the current buffer. However, if you set the variable again, that will +once again create a buffer-local binding for it. + +@code{kill-local-variable} returns @var{variable}. + +This function is a command because it is sometimes useful to kill one +buffer-local variable interactively, just as it is useful to create +buffer-local variables interactively. +@end deffn + +@defun kill-all-local-variables +This function eliminates all the buffer-local variable bindings of the +current buffer except for variables marked as ``permanent.'' As a +result, the buffer will see the default values of most variables. + +This function also resets certain other information pertaining to the +buffer: it sets the local keymap to @code{nil}, the syntax table to the +value of @code{(standard-syntax-table)}, the case table to +@code{(standard-case-table)}, and the abbrev table to the value of +@code{fundamental-mode-abbrev-table}. + +The very first thing this function does is run the normal hook +@code{change-major-mode-hook} (see below). + +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. To ensure that this does its job, the +variables that major modes set should not be marked permanent. + +@code{kill-all-local-variables} returns @code{nil}. +@end defun + +@defvar change-major-mode-hook +The function @code{kill-all-local-variables} runs this normal hook +before it does anything else. This gives major modes a way to arrange +for something special to be done if the user switches to a different +major mode. It is also useful for buffer-specific minor modes +that should be forgotten if the user changes the major mode. + +For best results, make this variable buffer-local, so that it will +disappear after doing its job and will not interfere with the +subsequent major mode. @xref{Hooks}. +@end defvar + +@c Emacs 19 feature +@cindex permanent local variable +A buffer-local variable is @dfn{permanent} if the variable name (a +symbol) has a @code{permanent-local} property that is non-@code{nil}. +Permanent locals are appropriate for data pertaining to where the file +came from or how to save it, rather than with how to edit the contents. + +@node Default Value +@subsection The Default Value of a Buffer-Local Variable +@cindex default value + + The global value of a variable with buffer-local bindings is also +called the @dfn{default} value, because it is the value that is in +effect whenever neither the current buffer nor the selected frame has +its own binding for the variable. + + The functions @code{default-value} and @code{setq-default} access and +change a variable's default value regardless of whether the current +buffer has a buffer-local binding. For example, you could use +@code{setq-default} to change the default setting of +@code{paragraph-start} for most buffers; and this would work even when +you are in a C or Lisp mode buffer that has a buffer-local value for +this variable. + +@c Emacs 19 feature + The special forms @code{defvar} and @code{defconst} also set the +default value (if they set the variable at all), rather than any +buffer-local or frame-local value. + +@defun default-value symbol +This function returns @var{symbol}'s default value. This is the value +that is seen in buffers and frames that do not have their own values for +this variable. If @var{symbol} is not buffer-local, this is equivalent +to @code{symbol-value} (@pxref{Accessing Variables}). +@end defun + +@c Emacs 19 feature +@defun default-boundp symbol +The function @code{default-boundp} tells you whether @var{symbol}'s +default value is nonvoid. If @code{(default-boundp 'foo)} returns +@code{nil}, then @code{(default-value 'foo)} would get an error. + +@code{default-boundp} is to @code{default-value} as @code{boundp} is to +@code{symbol-value}. +@end defun + +@defspec setq-default [symbol form]@dots{} +This special form gives each @var{symbol} a new default value, which is +the result of evaluating the corresponding @var{form}. It does not +evaluate @var{symbol}, but does evaluate @var{form}. The value of the +@code{setq-default} form is the value of the last @var{form}. + +If a @var{symbol} is not buffer-local for the current buffer, and is not +marked automatically buffer-local, @code{setq-default} has the same +effect as @code{setq}. If @var{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. + +@example +@group +;; @r{In buffer @samp{foo}:} +(make-local-variable 'buffer-local) + @result{} buffer-local +@end group +@group +(setq buffer-local 'value-in-foo) + @result{} value-in-foo +@end group +@group +(setq-default buffer-local 'new-default) + @result{} new-default +@end group +@group +buffer-local + @result{} value-in-foo +@end group +@group +(default-value 'buffer-local) + @result{} new-default +@end group + +@group +;; @r{In (the new) buffer @samp{bar}:} +buffer-local + @result{} new-default +@end group +@group +(default-value 'buffer-local) + @result{} new-default +@end group +@group +(setq buffer-local 'another-default) + @result{} another-default +@end group +@group +(default-value 'buffer-local) + @result{} another-default +@end group + +@group +;; @r{Back in buffer @samp{foo}:} +buffer-local + @result{} value-in-foo +(default-value 'buffer-local) + @result{} another-default +@end group +@end example +@end defspec + +@defun set-default symbol value +This function is like @code{setq-default}, except that @var{symbol} is +an ordinary evaluated argument. + +@example +@group +(set-default (car '(a b c)) 23) + @result{} 23 +@end group +@group +(default-value 'a) + @result{} 23 +@end group +@end example +@end defun + +@node Frame-Local Variables +@section Frame-Local Variables +@cindex frame-local variables + + Just as variables can have buffer-local bindings, they can also have +frame-local bindings. These bindings belong to one frame, and are in +effect when that frame is selected. Frame-local bindings are actually +frame parameters: you create a frame-local binding in a specific frame +by calling @code{modify-frame-parameters} and specifying the variable +name as the parameter name. + + To enable frame-local bindings for a certain variable, call the function +@code{make-variable-frame-local}. + +@deffn Command make-variable-frame-local variable +Enable the use of frame-local bindings for @var{variable}. This does +not in itself create any frame-local bindings for the variable; however, +if some frame already has a value for @var{variable} as a frame +parameter, that value automatically becomes a frame-local binding. + +If @var{variable} does not have a default value, then calling this +command will give it a default value of @code{nil}. If @var{variable} +already has a default value, that value remains unchanged. + +If the variable is terminal-local, this function signals an error, +because such variables cannot have frame-local bindings as well. +@xref{Multiple Displays}. A few variables that are implemented +specially in Emacs can be buffer-local, but can never be frame-local. + +This command returns @var{variable}. +@end deffn + + Buffer-local bindings take precedence over frame-local bindings. Thus, +consider a variable @code{foo}: if the current buffer has a buffer-local +binding for @code{foo}, that binding is active; otherwise, if the +selected frame has a frame-local binding for @code{foo}, that binding is +active; otherwise, the default binding of @code{foo} is active. + + Here is an example. First we prepare a few bindings for @code{foo}: + +@example +(setq f1 (selected-frame)) +(make-variable-frame-local 'foo) + +;; @r{Make a buffer-local binding for @code{foo} in @samp{b1}.} +(set-buffer (get-buffer-create "b1")) +(make-local-variable 'foo) +(setq foo '(b 1)) + +;; @r{Make a frame-local binding for @code{foo} in a new frame.} +;; @r{Store that frame in @code{f2}.} +(setq f2 (make-frame)) +(modify-frame-parameters f2 '((foo . (f 2)))) +@end example + + Now we examine @code{foo} in various contexts. Whenever the +buffer @samp{b1} is current, its buffer-local binding is in effect, +regardless of the selected frame: + +@example +(select-frame f1) +(set-buffer (get-buffer-create "b1")) +foo + @result{} (b 1) + +(select-frame f2) +(set-buffer (get-buffer-create "b1")) +foo + @result{} (b 1) +@end example + +@noindent +Otherwise, the frame gets a chance to provide the binding; when frame +@code{f2} is selected, its frame-local binding is in effect: + +@example +(select-frame f2) +(set-buffer (get-buffer "*scratch*")) +foo + @result{} (f 2) +@end example + +@noindent +When neither the current buffer nor the selected frame provides +a binding, the default binding is used: + +@example +(select-frame f1) +(set-buffer (get-buffer "*scratch*")) +foo + @result{} nil +@end example + +@noindent +When the active binding of a variable is a frame-local binding, setting +the variable changes that binding. You can observe the result with +@code{frame-parameters}: + +@example +(select-frame f2) +(set-buffer (get-buffer "*scratch*")) +(setq foo 'nobody) +(assq 'foo (frame-parameters f2)) + @result{} (foo . nobody) +@end example + +@node Future Local Variables +@section Possible Future Local Variables + + We have considered the idea of bindings that are local to a category +of frames---for example, all color frames, or all frames with dark +backgrounds. We have not implemented them because it is not clear that +this feature is really useful. You can get more or less the same +results by adding a function to @code{after-make-frame-functions}, set up to +define a particular frame parameter according to the appropriate +conditions for each frame. + + It would also be possible to implement window-local bindings. We +don't know of many situations where they would be useful, and it seems +that indirect buffers (@pxref{Indirect Buffers}) with buffer-local +bindings offer a way to handle these situations more robustly. + + If sufficient application is found for either of these two kinds of +local bindings, we will provide it in a subsequent Emacs version. + +@node File Local Variables +@section File Local Variables +@cindex file local variables + + A file can specify local variable values; Emacs uses these to create +buffer-local bindings for those variables in the buffer visiting that +file. @xref{File variables, , Local Variables in Files, emacs, The +GNU Emacs Manual}, for basic information about file local variables. +This section describes the functions and variables that affect +processing of file local variables. + +@defopt enable-local-variables +This variable controls whether to process file local variables. +The possible values are: + +@table @asis +@item @code{t} (the default) +Set the safe variables, and query (once) about any unsafe variables. +@item @code{:safe} +Set only the safe variables and do not query. +@item @code{:all} +Set all the variables and do not query. +@item @code{nil} +Don't set any variables. +@item anything else +Query (once) about all the variables. +@end table +@end defopt + +@defun hack-local-variables &optional mode-only +This function parses, and binds or evaluates as appropriate, any local +variables specified by the contents of the current buffer. The variable +@code{enable-local-variables} has its effect here. However, this +function does not look for the @samp{mode:} local variable in the +@w{@samp{-*-}} line. @code{set-auto-mode} does that, also taking +@code{enable-local-variables} into account (@pxref{Auto Major Mode}). + +If the optional argument @var{mode-only} is non-@code{nil}, then all +this function does is return @code{t} if the @w{@samp{-*-}} line or +the local variables list specifies a mode and @code{nil} otherwise. +It does not set the mode nor any other file local variable. +@end defun + + If a file local variable could specify a function that would +be called later, or an expression that would be executed later, simply +visiting a file could take over your Emacs. Emacs takes several +measures to prevent this. + +@cindex safe local variable + You can specify safe values for a variable with a +@code{safe-local-variable} property. The property has to be +a function of one argument; any value is safe if the function +returns non-@code{nil} given that value. Many commonly encountered +file variables standardly have @code{safe-local-variable} properties, +including @code{fill-column}, @code{fill-prefix}, and +@code{indent-tabs-mode}. For boolean-valued variables that are safe, +use @code{booleanp} as the property value. Lambda expressions should +be quoted so that @code{describe-variable} can display the predicate. + +@defopt safe-local-variable-values +This variable provides another way to mark some variable values as +safe. It is a list of cons cells @code{(@var{var} . @var{val})}, +where @var{var} is a variable name and @var{val} is a value which is +safe for that variable. + +When Emacs asks the user whether or not to obey a set of file local +variable specifications, the user can choose to mark them as safe. +Doing so adds those variable/value pairs to +@code{safe-local-variable-values}, and saves it to the user's custom +file. +@end defopt + +@defun safe-local-variable-p sym val +This function returns non-@code{nil} if it is safe to give @var{sym} +the value @var{val}, based on the above criteria. +@end defun + +@c @cindex risky local variable Duplicates risky-local-variable + Some variables are considered @dfn{risky}. A variable whose name +ends in any of @samp{-command}, @samp{-frame-alist}, @samp{-function}, +@samp{-functions}, @samp{-hook}, @samp{-hooks}, @samp{-form}, +@samp{-forms}, @samp{-map}, @samp{-map-alist}, @samp{-mode-alist}, +@samp{-program}, or @samp{-predicate} is considered risky. The +variables @samp{font-lock-keywords}, @samp{font-lock-keywords} +followed by a digit, and @samp{font-lock-syntactic-keywords} are also +considered risky. Finally, any variable whose name has a +non-@code{nil} @code{risky-local-variable} property is considered +risky. + +@defun risky-local-variable-p sym +This function returns non-@code{nil} if @var{sym} is a risky variable, +based on the above criteria. +@end defun + + If a variable is risky, it will not be entered automatically into +@code{safe-local-variable-values} as described above. Therefore, +Emacs will always query before setting a risky variable, unless the +user explicitly allows the setting by customizing +@code{safe-local-variable-values} directly. + +@defvar ignored-local-variables +This variable holds a list of variables that should not be given local +values by files. Any value specified for one of these variables is +completely ignored. +@end defvar + + The @samp{Eval:} ``variable'' is also a potential loophole, so Emacs +normally asks for confirmation before handling it. + +@defopt enable-local-eval +This variable controls processing of @samp{Eval:} in @samp{-*-} lines +or local variables +lists in files being visited. A value of @code{t} means process them +unconditionally; @code{nil} means ignore them; anything else means ask +the user what to do for each file. The default value is @code{maybe}. +@end defopt + +@defopt safe-local-eval-forms +This variable holds a list of expressions that are safe to +evaluate when found in the @samp{Eval:} ``variable'' in a file +local variables list. +@end defopt + + If the expression is a function call and the function has a +@code{safe-local-eval-function} property, the property value +determines whether the expression is safe to evaluate. The property +value can be a predicate to call to test the expression, a list of +such predicates (it's safe if any predicate succeeds), or @code{t} +(always safe provided the arguments are constant). + + Text properties are also potential loopholes, since their values +could include functions to call. So Emacs discards all text +properties from string values specified for file local variables. + +@node Variable Aliases +@section Variable Aliases +@cindex variable aliases + + It is sometimes useful to make two variables synonyms, so that both +variables always have the same value, and changing either one also +changes the other. Whenever you change the name of a +variable---either because you realize its old name was not well +chosen, or because its meaning has partly changed---it can be useful +to keep the old name as an @emph{alias} of the new one for +compatibility. You can do this with @code{defvaralias}. + +@defun defvaralias new-alias base-variable &optional docstring +This function defines the symbol @var{new-alias} as a variable alias +for symbol @var{base-variable}. This means that retrieving the value +of @var{new-alias} returns the value of @var{base-variable}, and +changing the value of @var{new-alias} changes the value of +@var{base-variable}. The two aliased variable names always share the +same value and the same bindings. + +If the @var{docstring} argument is non-@code{nil}, it specifies the +documentation for @var{new-alias}; otherwise, the alias gets the same +documentation as @var{base-variable} has, if any, unless +@var{base-variable} is itself an alias, in which case @var{new-alias} gets +the documentation of the variable at the end of the chain of aliases. + +This function returns @var{base-variable}. +@end defun + + Variable aliases are convenient for replacing an old name for a +variable with a new name. @code{make-obsolete-variable} declares that +the old name is obsolete and therefore that it may be removed at some +stage in the future. + +@defun make-obsolete-variable obsolete-name current-name &optional when +This function makes the byte-compiler warn that the variable +@var{obsolete-name} is obsolete. If @var{current-name} is a symbol, it is +the variable's new name; then the warning message says to use +@var{current-name} instead of @var{obsolete-name}. If @var{current-name} +is a string, this is the message and there is no replacement variable. + +If provided, @var{when} should be a string indicating when the +variable was first made obsolete---for example, a date or a release +number. +@end defun + + You can make two variables synonyms and declare one obsolete at the +same time using the macro @code{define-obsolete-variable-alias}. + +@defmac define-obsolete-variable-alias obsolete-name current-name &optional when docstring +This macro marks the variable @var{obsolete-name} as obsolete and also +makes it an alias for the variable @var{current-name}. It is +equivalent to the following: + +@example +(defvaralias @var{obsolete-name} @var{current-name} @var{docstring}) +(make-obsolete-variable @var{obsolete-name} @var{current-name} @var{when}) +@end example +@end defmac + +@defun indirect-variable variable +This function returns the variable at the end of the chain of aliases +of @var{variable}. If @var{variable} is not a symbol, or if @var{variable} is +not defined as an alias, the function returns @var{variable}. + +This function signals a @code{cyclic-variable-indirection} error if +there is a loop in the chain of symbols. +@end defun + +@example +(defvaralias 'foo 'bar) +(indirect-variable 'foo) + @result{} bar +(indirect-variable 'bar) + @result{} bar +(setq bar 2) +bar + @result{} 2 +@group +foo + @result{} 2 +@end group +(setq foo 0) +bar + @result{} 0 +foo + @result{} 0 +@end example + +@node Variables with Restricted Values +@section Variables with Restricted Values + + Ordinary Lisp variables can be assigned any value that is a valid +Lisp object. However, certain Lisp variables are not defined in Lisp, +but in C. Most of these variables are defined in the C code using +@code{DEFVAR_LISP}. Like variables defined in Lisp, these can take on +any value. However, some variables are defined using +@code{DEFVAR_INT} or @code{DEFVAR_BOOL}. @xref{Defining Lisp +variables in C,, Writing Emacs Primitives}, in particular the +description of functions of the type @code{syms_of_@var{filename}}, +for a brief discussion of the C implementation. + + Variables of type @code{DEFVAR_BOOL} can only take on the values +@code{nil} or @code{t}. Attempting to assign them any other value +will set them to @code{t}: + +@example +(let ((display-hourglass 5)) + display-hourglass) + @result{} t +@end example + +@defvar byte-boolean-vars +This variable holds a list of all variables of type @code{DEFVAR_BOOL}. +@end defvar + + Variables of type @code{DEFVAR_INT} can only take on integer values. +Attempting to assign them any other value will result in an error: + +@example +(setq window-min-height 5.0) +@error{} Wrong type argument: integerp, 5.0 +@end example + +@ignore + arch-tag: 5ff62c44-2b51-47bb-99d4-fea5aeec5d3e +@end ignore diff --git a/doc/lispref/vol1.texi b/doc/lispref/vol1.texi new file mode 100644 index 00000000000..d41b2f076df --- /dev/null +++ b/doc/lispref/vol1.texi @@ -0,0 +1,1507 @@ +\input texinfo @c -*-texinfo-*- +@c This file is used for printing the GNU Emacs Lisp Reference Manual +@c in two volumes. It is a modified version of elisp.texi. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c %**start of header +@setfilename elisp +@settitle GNU Emacs Lisp Reference Manual: Volume 1 +@c %**end of header + +@c See two-volume-cross-refs.txt. +@tex +\message{Formatting for two volume edition...Volume 1...} +% +% Read special toc file, set up in two-volume.make. +\gdef\tocreadfilename{elisp1-toc-ready.toc} +% +% Don't make outlines, they're not needed and \readdatafile can't pay +% attention to the special definition above. +\global\let\pdfmakeoutlines=\relax +% +% Start volume 1 chapter numbering at 1; this must be listed as chapno0. +\global\chapno=0 +@end tex + +@c Version of the manual and of Emacs. +@c Please remember to update the edition number in README as well. +@set VERSION 2.9 +@set EMACSVER 22 + +@dircategory Emacs +@direntry +* Elisp: (elisp). The Emacs Lisp Reference Manual. +@end direntry + +@c in general, keep the following line commented out, unless doing a +@c copy of this manual that will be published. the manual should go +@c onto the distribution in the full, 8.5 x 11" size. +@set smallbook + +@ifset smallbook +@smallbook +@end ifset + +@c per rms and peterb, use 10pt fonts for the main text, mostly to +@c save on paper cost. +@c Do this inside @tex for now, so current makeinfo does not complain. +@tex +@ifset smallbook +@fonttextsize 10 +\global\let\urlcolor=\Black % don't print links in grayscale +\global\let\linkcolor=\Black +@end ifset +\global\hbadness=6666 % don't worry about not-too-underfull boxes +@end tex + +@c Combine indices. +@synindex cp fn +@syncodeindex vr fn +@syncodeindex ky fn +@syncodeindex pg fn +@c We use the "type index" to index new functions and variables. +@c @syncodeindex tp fn + +@copying +This is edition @value{VERSION} of the GNU Emacs Lisp Reference Manual,@* +corresponding to Emacs version @value{EMACSVER}. + +Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, +1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software +Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with the +Invariant Sections being ``GNU General Public License,'' with the +Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover +Texts as in (a) below. A copy of the license is included in the +section entitled ``GNU Free Documentation License.'' + +(a) The FSF's Back-Cover Text is: ``You are free to copy and modify +this GNU Manual. Buying copies from GNU Press supports the FSF in +developing GNU and promoting software freedom.'' +@end quotation +@end copying + +@titlepage +@title GNU Emacs Lisp Reference Manual +@subtitle Volume 1 +@subtitle For Emacs Version @value{EMACSVER} +@subtitle Revision @value{VERSION}, June 2007 + +@author by Bil Lewis, Dan LaLiberte, Richard Stallman +@author and the GNU Manual Group +@page +@vskip 0pt plus 1filll +@insertcopying + +@sp 2 + +Published by the Free Software Foundation @* +51 Franklin St, Fifth Floor @* +Boston, MA 02110-1301 @* +USA @* +ISBN 1-882114-74-4 + +@sp 2 +Cover art by Etienne Suvasa. +@end titlepage + + +@c Print the tables of contents +@summarycontents +@contents + + +@ifnottex +@node Top, Introduction, (dir), (dir) +@top Emacs Lisp + +This Info file contains edition @value{VERSION} of the GNU Emacs Lisp +Reference Manual, corresponding to GNU Emacs version @value{EMACSVER}. +@end ifnottex + +@menu +* Introduction:: Introduction and conventions used. + +* Lisp Data Types:: Data types of objects in Emacs Lisp. +* Numbers:: Numbers and arithmetic functions. +* Strings and Characters:: Strings, and functions that work on them. +* Lists:: Lists, cons cells, and related functions. +* Sequences Arrays Vectors:: Lists, strings and vectors are called sequences. + Certain functions act on any kind of sequence. + The description of vectors is here as well. +* Hash Tables:: Very fast lookup-tables. +* Symbols:: Symbols represent names, uniquely. + +* Evaluation:: How Lisp expressions are evaluated. +* Control Structures:: Conditionals, loops, nonlocal exits. +* Variables:: Using symbols in programs to stand for values. +* Functions:: A function is a Lisp program + that can be invoked from other functions. +* Macros:: Macros are a way to extend the Lisp language. +* Customization:: Writing customization declarations. + +* Loading:: Reading files of Lisp code into Lisp. +* Byte Compilation:: Compilation makes programs run faster. +* Advising Functions:: Adding to the definition of a function. +* Debugging:: Tools and tips for debugging Lisp programs. + +* Read and Print:: Converting Lisp objects to text and back. +* Minibuffers:: Using the minibuffer to read input. +* Command Loop:: How the editor command loop works, + and how you can call its subroutines. +* Keymaps:: Defining the bindings from keys to commands. +* Modes:: Defining major and minor modes. +* Documentation:: Writing and using documentation strings. + +* Files:: Accessing files. +* Backups and Auto-Saving:: Controlling how backups and auto-save + files are made. +* Buffers:: Creating and using buffer objects. +* Windows:: Manipulating windows and displaying buffers. +* Frames:: Making multiple system-level windows. +* Positions:: Buffer positions and motion functions. +* Markers:: Markers represent positions and update + automatically when the text is changed. + +* Text:: Examining and changing text in buffers. +* Non-ASCII Characters:: Non-ASCII text in buffers and strings. +* Searching and Matching:: Searching buffers for strings or regexps. +* Syntax Tables:: The syntax table controls word and list parsing. +* Abbrevs:: How Abbrev mode works, and its data structures. + +* Processes:: Running and communicating with subprocesses. +* Display:: Features for controlling the screen display. +* System Interface:: Getting the user id, system type, environment + variables, and other such things. + +Appendices + +* Antinews:: Info for users downgrading to Emacs 21. +* GNU Free Documentation License:: The license for this documentation +* GPL:: Conditions for copying and changing GNU Emacs. +* Tips:: Advice and coding conventions for Emacs Lisp. +* GNU Emacs Internals:: Building and dumping Emacs; + internal data structures. +* Standard Errors:: List of all error symbols. +* Standard Buffer-Local Variables:: + List of variables buffer-local in all buffers. +* Standard Keymaps:: List of standard keymaps. +* Standard Hooks:: List of standard hook variables. + +* Index:: Index including concepts, functions, variables, + and other terms. + +@ignore +* New Symbols:: New functions and variables in Emacs @value{EMACSVER}. +@end ignore + +@c Do NOT modify the following 3 lines! They must have this form to +@c be correctly identified by `texinfo-multiple-files-update'. In +@c particular, the detailed menu header line MUST be identical to the +@c value of `texinfo-master-menu-header'. See texnfo-upd.el. + +@detailmenu + --- The Detailed Node Listing --- + --------------------------------- + +Here are other nodes that are inferiors of those already listed, +mentioned here so you can get to them in one step: + +Introduction + +* Caveats:: Flaws and a request for help. +* Lisp History:: Emacs Lisp is descended from Maclisp. +* Conventions:: How the manual is formatted. +* Version Info:: Which Emacs version is running? +* Acknowledgements:: The authors, editors, and sponsors of this manual. + +Conventions + +* Some Terms:: Explanation of terms we use in this manual. +* nil and t:: How the symbols @code{nil} and @code{t} are used. +* Evaluation Notation:: The format we use for examples of evaluation. +* Printing Notation:: The format we use for examples that print output. +* Error Messages:: The format we use for examples of errors. +* Buffer Text Notation:: The format we use for buffer contents in examples. +* Format of Descriptions:: Notation for describing functions, variables, etc. + +Format of Descriptions + +* A Sample Function Description:: A description of an imaginary + function, @code{foo}. +* A Sample Variable Description:: A description of an imaginary + variable, @code{electric-future-map}. + +Lisp Data Types + +* Printed Representation:: How Lisp objects are represented as text. +* Comments:: Comments and their formatting conventions. +* Programming Types:: Types found in all Lisp systems. +* Editing Types:: Types specific to Emacs. +* Circular Objects:: Read syntax for circular structure. +* Type Predicates:: Tests related to types. +* Equality Predicates:: Tests of equality between any two objects. + +Programming Types + +* Integer Type:: Numbers without fractional parts. +* Floating Point Type:: Numbers with fractional parts and with a large range. +* Character Type:: The representation of letters, numbers and + control characters. +* Symbol Type:: A multi-use object that refers to a function, + variable, property list, or itself. +* Sequence Type:: Both lists and arrays are classified as sequences. +* Cons Cell Type:: Cons cells, and lists (which are made from cons cells). +* Array Type:: Arrays include strings and vectors. +* String Type:: An (efficient) array of characters. +* Vector Type:: One-dimensional arrays. +* Char-Table Type:: One-dimensional sparse arrays indexed by characters. +* Bool-Vector Type:: One-dimensional arrays of @code{t} or @code{nil}. +* Hash Table Type:: Super-fast lookup tables. +* Function Type:: A piece of executable code you can call from elsewhere. +* Macro Type:: A method of expanding an expression into another + expression, more fundamental but less pretty. +* Primitive Function Type:: A function written in C, callable from Lisp. +* Byte-Code Type:: A function written in Lisp, then compiled. +* Autoload Type:: A type used for automatically loading seldom-used + functions. + +Character Type + +* Basic Char Syntax:: Syntax for regular characters. +* General Escape Syntax:: How to specify characters by their codes. +* Ctl-Char Syntax:: Syntax for control characters. +* Meta-Char Syntax:: Syntax for meta-characters. +* Other Char Bits:: Syntax for hyper-, super-, and alt-characters. + +Cons Cell and List Types + +* Box Diagrams:: Drawing pictures of lists. +* Dotted Pair Notation:: An alternative syntax for lists. +* Association List Type:: A specially constructed list. + +String Type + +* Syntax for Strings:: How to specify Lisp strings. +* Non-ASCII in Strings:: International characters in strings. +* Nonprinting Characters:: Literal unprintable characters in strings. +* Text Props and Strings:: Strings with text properties. + +Editing Types + +* Buffer Type:: The basic object of editing. +* Marker Type:: A position in a buffer. +* Window Type:: What makes buffers visible. +* Frame Type:: Windows subdivide frames. +* Window Configuration Type:: Recording the way a frame is subdivided. +* Frame Configuration Type:: Recording the status of all frames. +* Process Type:: A process running on the underlying OS. +* Stream Type:: Receive or send characters. +* Keymap Type:: What function a keystroke invokes. +* Overlay Type:: How an overlay is represented. + +Numbers + +* Integer Basics:: Representation and range of integers. +* Float Basics:: Representation and range of floating point. +* Predicates on Numbers:: Testing for numbers. +* Comparison of Numbers:: Equality and inequality predicates. +* Numeric Conversions:: Converting float to integer and vice versa. +* Arithmetic Operations:: How to add, subtract, multiply and divide. +* Rounding Operations:: Explicitly rounding floating point numbers. +* Bitwise Operations:: Logical and, or, not, shifting. +* Math Functions:: Trig, exponential and logarithmic functions. +* Random Numbers:: Obtaining random integers, predictable or not. + +Strings and Characters + +* String Basics:: Basic properties of strings and characters. +* Predicates for Strings:: Testing whether an object is a string or char. +* Creating Strings:: Functions to allocate new strings. +* Modifying Strings:: Altering the contents of an existing string. +* Text Comparison:: Comparing characters or strings. +* String Conversion:: Converting characters to strings and vice versa. +* Formatting Strings:: @code{format}: Emacs's analogue of @code{printf}. +* Case Conversion:: Case conversion functions. +* Case Tables:: Customizing case conversion. + +Lists + +* Cons Cells:: How lists are made out of cons cells. +* List-related Predicates:: Is this object a list? Comparing two lists. +* List Elements:: Extracting the pieces of a list. +* Building Lists:: Creating list structure. +* List Variables:: Modifying lists stored in variables. +* Modifying Lists:: Storing new pieces into an existing list. +* Sets And Lists:: A list can represent a finite mathematical set. +* Association Lists:: A list can represent a finite relation or mapping. +* Rings:: Managing a fixed-size ring of objects. + +Modifying Existing List Structure + +* Setcar:: Replacing an element in a list. +* Setcdr:: Replacing part of the list backbone. + This can be used to remove or add elements. +* Rearrangement:: Reordering the elements in a list; combining lists. + +Sequences, Arrays, and Vectors + +* Sequence Functions:: Functions that accept any kind of sequence. +* Arrays:: Characteristics of arrays in Emacs Lisp. +* Array Functions:: Functions specifically for arrays. +* Vectors:: Special characteristics of Emacs Lisp vectors. +* Vector Functions:: Functions specifically for vectors. +* Char-Tables:: How to work with char-tables. +* Bool-Vectors:: How to work with bool-vectors. + +Hash Tables + +* Creating Hash:: Functions to create hash tables. +* Hash Access:: Reading and writing the hash table contents. +* Defining Hash:: Defining new comparison methods +* Other Hash:: Miscellaneous. + +Symbols + +* Symbol Components:: Symbols have names, values, function definitions + and property lists. +* Definitions:: A definition says how a symbol will be used. +* Creating Symbols:: How symbols are kept unique. +* Property Lists:: Each symbol has a property list + for recording miscellaneous information. + +Property Lists + +* Plists and Alists:: Comparison of the advantages of property + lists and association lists. +* Symbol Plists:: Functions to access symbols' property lists. +* Other Plists:: Accessing property lists stored elsewhere. + +Evaluation + +* Intro Eval:: Evaluation in the scheme of things. +* Forms:: How various sorts of objects are evaluated. +* Quoting:: Avoiding evaluation (to put constants in + the program). +* Eval:: How to invoke the Lisp interpreter explicitly. + +Kinds of Forms + +* Self-Evaluating Forms:: Forms that evaluate to themselves. +* Symbol Forms:: Symbols evaluate as variables. +* Classifying Lists:: How to distinguish various sorts of list forms. +* Function Indirection:: When a symbol appears as the car of a list, + we find the real function via the symbol. +* Function Forms:: Forms that call functions. +* Macro Forms:: Forms that call macros. +* Special Forms:: "Special forms" are idiosyncratic primitives, + most of them extremely important. +* Autoloading:: Functions set up to load files + containing their real definitions. + +Control Structures + +* Sequencing:: Evaluation in textual order. +* Conditionals:: @code{if}, @code{cond}, @code{when}, @code{unless}. +* Combining Conditions:: @code{and}, @code{or}, @code{not}. +* Iteration:: @code{while} loops. +* Nonlocal Exits:: Jumping out of a sequence. + +Nonlocal Exits + +* Catch and Throw:: Nonlocal exits for the program's own purposes. +* Examples of Catch:: Showing how such nonlocal exits can be written. +* Errors:: How errors are signaled and handled. +* Cleanups:: Arranging to run a cleanup form if an + error happens. + +Errors + +* Signaling Errors:: How to report an error. +* Processing of Errors:: What Emacs does when you report an error. +* Handling Errors:: How you can trap errors and continue execution. +* Error Symbols:: How errors are classified for trapping them. +* Standard Errors:: List of all error symbols. + +Variables + +* Global Variables:: Variable values that exist permanently, everywhere. +* Constant Variables:: Certain "variables" have values that never change. +* Local Variables:: Variable values that exist only temporarily. +* Void Variables:: Symbols that lack values. +* Defining Variables:: A definition says a symbol is used as a variable. +* Tips for Defining:: Things you should think about when you + define a variable. +* Accessing Variables:: Examining values of variables whose names + are known only at run time. +* Setting Variables:: Storing new values in variables. +* Variable Scoping:: How Lisp chooses among local and global values. +* Buffer-Local Variables:: Variable values in effect only in one buffer. +* Frame-Local Variables:: Variable values in effect only in one frame. +* Future Local Variables:: New kinds of local values we might add some day. +* File Local Variables:: Handling local variable lists in files. +* Variable Aliases:: Variables that are aliases for other variables. +* Variables with Restricted Values:: Non-constant variables whose value can + @emph{not} be an arbitrary Lisp object. +* Standard Buffer-Local Variables:: + List of variables buffer-local in all buffers. + +Scoping Rules for Variable Bindings + +* Scope:: Scope means where in the program a value + is visible. Comparison with other languages. +* Extent:: Extent means how long in time a value exists. +* Impl of Scope:: Two ways to implement dynamic scoping. +* Using Scoping:: How to use dynamic scoping carefully and + avoid problems. + +Buffer-Local Variables + +* Intro to Buffer-Local:: Introduction and concepts. +* Creating Buffer-Local:: Creating and destroying buffer-local bindings. +* Default Value:: The default value is seen in buffers + that don't have their own buffer-local values. + +Functions + +* What Is a Function:: Lisp functions vs primitives; terminology. +* Lambda Expressions:: How functions are expressed as Lisp objects. +* Function Names:: A symbol can serve as the name of a function. +* Defining Functions:: Lisp expressions for defining functions. +* Calling Functions:: How to use an existing function. +* Mapping Functions:: Applying a function to each element of a list, etc. +* Anonymous Functions:: Lambda-expressions are functions with no names. +* Function Cells:: Accessing or setting the function definition + of a symbol. +* Obsolete Functions:: Declaring functions obsolete. +* Inline Functions:: Defining functions that the compiler will open code. +* Function Safety:: Determining whether a function is safe to call. +* Related Topics:: Cross-references to specific Lisp primitives + that have a special bearing on how + functions work. + +Lambda Expressions + +* Lambda Components:: The parts of a lambda expression. +* Simple Lambda:: A simple example. +* Argument List:: Details and special features of argument lists. +* Function Documentation:: How to put documentation in a function. + +Macros + +* Simple Macro:: A basic example. +* Expansion:: How, when and why macros are expanded. +* Compiling Macros:: How macros are expanded by the compiler. +* Defining Macros:: How to write a macro definition. +* Backquote:: Easier construction of list structure. +* Problems with Macros:: Don't evaluate the macro arguments too many times. + Don't hide the user's variables. +* Indenting Macros:: Specifying how to indent macro calls. + +Common Problems Using Macros + +* Wrong Time:: Do the work in the expansion, not in the macro. +* Argument Evaluation:: The expansion should evaluate each macro arg once. +* Surprising Local Vars:: Local variable bindings in the expansion + require special care. +* Eval During Expansion:: Don't evaluate them; put them in the expansion. +* Repeated Expansion:: Avoid depending on how many times expansion is done. + +Writing Customization Definitions + +* Common Keywords:: Common keyword arguments for all kinds of + customization declarations. +* Group Definitions:: Writing customization group definitions. +* Variable Definitions:: Declaring user options. +* Customization Types:: Specifying the type of a user option. + +Customization Types + +* Simple Types:: Simple customization types: sexp, integer, number, + string, file, directory, alist. +* Composite Types:: Build new types from other types or data. +* Splicing into Lists:: Splice elements into list with @code{:inline}. +* Type Keywords:: Keyword-argument pairs in a customization type. +* Defining New Types:: Give your type a name. + +Loading + +* How Programs Do Loading:: The @code{load} function and others. +* Load Suffixes:: Details about the suffixes that @code{load} tries. +* Library Search:: Finding a library to load. +* Loading Non-ASCII:: Non-@acronym{ASCII} characters in Emacs Lisp files. +* Autoload:: Setting up a function to autoload. +* Repeated Loading:: Precautions about loading a file twice. +* Named Features:: Loading a library if it isn't already loaded. +* Where Defined:: Finding which file defined a certain symbol. +* Unloading:: How to "unload" a library that was loaded. +* Hooks for Loading:: Providing code to be run when + particular libraries are loaded. + +Byte Compilation + +* Speed of Byte-Code:: An example of speedup from byte compilation. +* Compilation Functions:: Byte compilation functions. +* Docs and Compilation:: Dynamic loading of documentation strings. +* Dynamic Loading:: Dynamic loading of individual functions. +* Eval During Compile:: Code to be evaluated when you compile. +* Compiler Errors:: Handling compiler error messages. +* Byte-Code Objects:: The data type used for byte-compiled functions. +* Disassembly:: Disassembling byte-code; how to read byte-code. + +Advising Emacs Lisp Functions + +* Simple Advice:: A simple example to explain the basics of advice. +* Defining Advice:: Detailed description of @code{defadvice}. +* Around-Advice:: Wrapping advice around a function's definition. +* Computed Advice:: ...is to @code{defadvice} as @code{fset} is to @code{defun}. +* Activation of Advice:: Advice doesn't do anything until you activate it. +* Enabling Advice:: You can enable or disable each piece of advice. +* Preactivation:: Preactivation is a way of speeding up the + loading of compiled advice. +* Argument Access in Advice:: How advice can access the function's arguments. +* Advising Primitives:: Accessing arguments when advising a primitive. +* Combined Definition:: How advice is implemented. + +Debugging Lisp Programs + +* Debugger:: How the Emacs Lisp debugger is implemented. +* Edebug:: A source-level Emacs Lisp debugger. +* Syntax Errors:: How to find syntax errors. +* Test Coverage:: Ensuring you have tested all branches in your code. +* Compilation Errors:: How to find errors that show up in + byte compilation. + +The Lisp Debugger + +* Error Debugging:: Entering the debugger when an error happens. +* Infinite Loops:: Stopping and debugging a program that doesn't exit. +* Function Debugging:: Entering it when a certain function is called. +* Explicit Debug:: Entering it at a certain point in the program. +* Using Debugger:: What the debugger does; what you see while in it. +* Debugger Commands:: Commands used while in the debugger. +* Invoking the Debugger:: How to call the function @code{debug}. +* Internals of Debugger:: Subroutines of the debugger, and global variables. + +Edebug + +* Using Edebug:: Introduction to use of Edebug. +* Instrumenting:: You must instrument your code + in order to debug it with Edebug. +* Edebug Execution Modes:: Execution modes, stopping more or less often. +* Jumping:: Commands to jump to a specified place. +* Edebug Misc:: Miscellaneous commands. +* Breaks:: Setting breakpoints to make the program stop. +* Trapping Errors:: Trapping errors with Edebug. +* Edebug Views:: Views inside and outside of Edebug. +* Edebug Eval:: Evaluating expressions within Edebug. +* Eval List:: Expressions whose values are displayed + each time you enter Edebug. +* Printing in Edebug:: Customization of printing. +* Trace Buffer:: How to produce trace output in a buffer. +* Coverage Testing:: How to test evaluation coverage. +* The Outside Context:: Data that Edebug saves and restores. +* Edebug and Macros:: Specifying how to handle macro calls. +* Edebug Options:: Option variables for customizing Edebug. + +Debugging Invalid Lisp Syntax + +* Excess Open:: How to find a spurious open paren or missing close. +* Excess Close:: How to find a spurious close paren or missing open. + +Reading and Printing Lisp Objects + +* Streams Intro:: Overview of streams, reading and printing. +* Input Streams:: Various data types that can be used as + input streams. +* Input Functions:: Functions to read Lisp objects from text. +* Output Streams:: Various data types that can be used as + output streams. +* Output Functions:: Functions to print Lisp objects as text. +* Output Variables:: Variables that control what the printing + functions do. + +Minibuffers + +* Intro to Minibuffers:: Basic information about minibuffers. +* Text from Minibuffer:: How to read a straight text string. +* Object from Minibuffer:: How to read a Lisp object or expression. +* Minibuffer History:: Recording previous minibuffer inputs + so the user can reuse them. +* Initial Input:: Specifying initial contents for the minibuffer. +* Completion:: How to invoke and customize completion. +* Yes-or-No Queries:: Asking a question with a simple answer. +* Multiple Queries:: Asking a series of similar questions. +* Reading a Password:: Reading a password from the terminal. +* Minibuffer Commands:: Commands used as key bindings in minibuffers. +* Minibuffer Contents:: How such commands access the minibuffer text. +* Minibuffer Windows:: Operating on the special minibuffer windows. +* Recursive Mini:: Whether recursive entry to minibuffer is allowed. +* Minibuffer Misc:: Various customization hooks and variables. + +Completion + +* Basic Completion:: Low-level functions for completing strings. + (These are too low level to use the minibuffer.) +* Minibuffer Completion:: Invoking the minibuffer with completion. +* Completion Commands:: Minibuffer commands that do completion. +* High-Level Completion:: Convenient special cases of completion + (reading buffer name, file name, etc.) +* Reading File Names:: Using completion to read file names. +* Programmed Completion:: Finding the completions for a given file name. + +Command Loop + +* Command Overview:: How the command loop reads commands. +* Defining Commands:: Specifying how a function should read arguments. +* Interactive Call:: Calling a command, so that it will read arguments. +* Command Loop Info:: Variables set by the command loop for you to examine. +* Adjusting Point:: Adjustment of point after a command. +* Input Events:: What input looks like when you read it. +* Reading Input:: How to read input events from the keyboard or mouse. +* Special Events:: Events processed immediately and individually. +* Waiting:: Waiting for user input or elapsed time. +* Quitting:: How @kbd{C-g} works. How to catch or defer quitting. +* Prefix Command Arguments:: How the commands to set prefix args work. +* Recursive Editing:: Entering a recursive edit, + and why you usually shouldn't. +* Disabling Commands:: How the command loop handles disabled commands. +* Command History:: How the command history is set up, and how accessed. +* Keyboard Macros:: How keyboard macros are implemented. + +Defining Commands + +* Using Interactive:: General rules for @code{interactive}. +* Interactive Codes:: The standard letter-codes for reading arguments + in various ways. +* Interactive Examples:: Examples of how to read interactive arguments. + +Input Events + +* Keyboard Events:: Ordinary characters--keys with symbols on them. +* Function Keys:: Function keys--keys with names, not symbols. +* Mouse Events:: Overview of mouse events. +* Click Events:: Pushing and releasing a mouse button. +* Drag Events:: Moving the mouse before releasing the button. +* Button-Down Events:: A button was pushed and not yet released. +* Repeat Events:: Double and triple click (or drag, or down). +* Motion Events:: Just moving the mouse, not pushing a button. +* Focus Events:: Moving the mouse between frames. +* Misc Events:: Other events the system can generate. +* Event Examples:: Examples of the lists for mouse events. +* Classifying Events:: Finding the modifier keys in an event symbol. +* Accessing Events:: Functions to extract info from events. +* Strings of Events:: Special considerations for putting + keyboard character events in a string. + +Reading Input + +* Key Sequence Input:: How to read one key sequence. +* Reading One Event:: How to read just one event. +* Event Mod:: How Emacs modifies events as they are read. +* Invoking the Input Method:: How reading an event uses the input method. +* Quoted Character Input:: Asking the user to specify a character. +* Event Input Misc:: How to reread or throw away input events. + +Keymaps + +* Key Sequences:: Key sequences as Lisp objects. +* Keymap Basics:: Basic concepts of keymaps. +* Format of Keymaps:: What a keymap looks like as a Lisp object. +* Creating Keymaps:: Functions to create and copy keymaps. +* Inheritance and Keymaps:: How one keymap can inherit the bindings + of another keymap. +* Prefix Keys:: Defining a key with a keymap as its definition. +* Active Keymaps:: How Emacs searches the active keymaps + for a key binding. +* Searching Keymaps:: A pseudo-Lisp summary of searching active maps. +* Controlling Active Maps:: Each buffer has a local keymap + to override the standard (global) bindings. + A minor mode can also override them. +* Key Lookup:: How extracting elements from keymaps works. +* Functions for Key Lookup:: How to request key lookup. +* Changing Key Bindings:: Redefining a key in a keymap. +* Remapping Commands:: A keymap can translate one command to another. +* Translation Keymaps:: Keymaps for translating sequences of events. +* Key Binding Commands:: Interactive interfaces for redefining keys. +* Scanning Keymaps:: Looking through all keymaps, for printing help. +* Menu Keymaps:: A keymap can define a menu for X + or for use from the terminal. +* Standard Keymaps:: List of standard keymaps. + +Major and Minor Modes + +* Hooks:: How to use hooks; how to write code that + provides hooks. +* Major Modes:: Defining major modes. +* Minor Modes:: Defining minor modes. +* Mode Line Format:: Customizing the text that appears in the mode line. +* Imenu:: How a mode can provide a menu + of definitions in the buffer. +* Font Lock Mode:: How modes can highlight text according to syntax. +* Desktop Save Mode:: How modes can have buffer state saved between + Emacs sessions. + +Menu Keymaps + +* Defining Menus:: How to make a keymap that defines a menu. +* Mouse Menus:: How users actuate the menu with the mouse. +* Keyboard Menus:: How users actuate the menu with the keyboard. +* Menu Example:: Making a simple menu. +* Menu Bar:: How to customize the menu bar. +* Tool Bar:: A tool bar is a row of images. +* Modifying Menus:: How to add new items to a menu. + +Defining Menus + +* Simple Menu Items:: A simple kind of menu key binding, + limited in capabilities. +* Extended Menu Items:: More powerful menu item definitions + let you specify keywords to enable + various features. +* Menu Separators:: Drawing a horizontal line through a menu. +* Alias Menu Items:: Using command aliases in menu items. + +Major and Minor Modes + +* Hooks:: How to use hooks; how to write code that provides hooks. +* Major Modes:: Defining major modes. +* Minor Modes:: Defining minor modes. +* Mode Line Format:: Customizing the text that appears in the mode line. +* Imenu:: How a mode can provide a menu + of definitions in the buffer. +* Font Lock Mode:: How modes can highlight text according to syntax. +* Desktop Save Mode:: How modes can have buffer state saved between + Emacs sessions. + +Major Modes + +* Major Mode Basics:: +* Major Mode Conventions:: Coding conventions for keymaps, etc. +* Example Major Modes:: Text mode and Lisp modes. +* Auto Major Mode:: How Emacs chooses the major mode automatically. +* Mode Help:: Finding out how to use a mode. +* Derived Modes:: Defining a new major mode based on another major + mode. +* Generic Modes:: Defining a simple major mode that supports + comment syntax and Font Lock mode. +* Mode Hooks:: Hooks run at the end of major mode functions. + +Minor Modes + +* Minor Mode Conventions:: Tips for writing a minor mode. +* Keymaps and Minor Modes:: How a minor mode can have its own keymap. +* Defining Minor Modes:: A convenient facility for defining minor modes. + +Mode Line Format + +* Mode Line Basics:: +* Mode Line Data:: The data structure that controls the mode line. +* Mode Line Variables:: Variables used in that data structure. +* %-Constructs:: Putting information into a mode line. +* Properties in Mode:: Using text properties in the mode line. +* Header Lines:: Like a mode line, but at the top. +* Emulating Mode Line:: Formatting text as the mode line would. + +Font Lock Mode + +* Font Lock Basics:: Overview of customizing Font Lock. +* Search-based Fontification:: Fontification based on regexps. +* Customizing Keywords:: Customizing search-based fontification. +* Other Font Lock Variables:: Additional customization facilities. +* Levels of Font Lock:: Each mode can define alternative levels + so that the user can select more or less. +* Precalculated Fontification:: How Lisp programs that produce the buffer + contents can also specify how to fontify it. +* Faces for Font Lock:: Special faces specifically for Font Lock. +* Syntactic Font Lock:: Fontification based on syntax tables. +* Setting Syntax Properties:: Defining character syntax based on context + using the Font Lock mechanism. +* Multiline Font Lock:: How to coerce Font Lock into properly + highlighting multiline constructs. + +Multiline Font Lock Constructs + +* Font Lock Multiline:: Marking multiline chunks with a text property +* Region to Fontify:: Controlling which region gets refontified + after a buffer change. + +Documentation + +* Documentation Basics:: Good style for doc strings. + Where to put them. How Emacs stores them. +* Accessing Documentation:: How Lisp programs can access doc strings. +* Keys in Documentation:: Substituting current key bindings. +* Describing Characters:: Making printable descriptions of + non-printing characters and key sequences. +* Help Functions:: Subroutines used by Emacs help facilities. + +Files + +* Visiting Files:: Reading files into Emacs buffers for editing. +* Saving Buffers:: Writing changed buffers back into files. +* Reading from Files:: Reading files into other buffers. +* Writing to Files:: Writing new files from parts of buffers. +* File Locks:: Locking and unlocking files, to prevent + simultaneous editing by two people. +* Information about Files:: Testing existence, accessibility, size of files. +* Changing Files:: Renaming files, changing protection, etc. +* File Names:: Decomposing and expanding file names. +* Contents of Directories:: Getting a list of the files in a directory. +* Create/Delete Dirs:: Creating and Deleting Directories. +* Magic File Names:: Defining "magic" special handling + for certain file names. +* Format Conversion:: Conversion to and from various file formats. + +Visiting Files + +* Visiting Functions:: The usual interface functions for visiting. +* Subroutines of Visiting:: Lower-level subroutines that they use. + +Information about Files + +* Testing Accessibility:: Is a given file readable? Writable? +* Kinds of Files:: Is it a directory? A symbolic link? +* Truenames:: Eliminating symbolic links from a file name. +* File Attributes:: How large is it? Any other names? Etc. +* Locating Files:: How to find a file in standard places. + +File Names + +* File Name Components:: The directory part of a file name, and the rest. +* Relative File Names:: Some file names are relative to a + current directory. +* Directory Names:: A directory's name as a directory + is different from its name as a file. +* File Name Expansion:: Converting relative file names to absolute ones. +* Unique File Names:: Generating names for temporary files. +* File Name Completion:: Finding the completions for a given file name. +* Standard File Names:: If your package uses a fixed file name, + how to handle various operating systems simply. + +Backups and Auto-Saving + +* Backup Files:: How backup files are made; how their names + are chosen. +* Auto-Saving:: How auto-save files are made; how their + names are chosen. +* Reverting:: @code{revert-buffer}, and how to customize + what it does. + +Backup Files + +* Making Backups:: How Emacs makes backup files, and when. +* Rename or Copy:: Two alternatives: renaming the old file + or copying it. +* Numbered Backups:: Keeping multiple backups for each source file. +* Backup Names:: How backup file names are computed; customization. + +Buffers + +* Buffer Basics:: What is a buffer? +* Current Buffer:: Designating a buffer as current + so primitives will access its contents. +* Buffer Names:: Accessing and changing buffer names. +* Buffer File Name:: The buffer file name indicates which file + is visited. +* Buffer Modification:: A buffer is @dfn{modified} if it needs to be saved. +* Modification Time:: Determining whether the visited file was changed + ``behind Emacs's back''. +* Read Only Buffers:: Modifying text is not allowed in a + read-only buffer. +* The Buffer List:: How to look at all the existing buffers. +* Creating Buffers:: Functions that create buffers. +* Killing Buffers:: Buffers exist until explicitly killed. +* Indirect Buffers:: An indirect buffer shares text with some + other buffer. +* Buffer Gap:: The gap in the buffer. + +Windows + +* Basic Windows:: Basic information on using windows. +* Splitting Windows:: Splitting one window into two windows. +* Deleting Windows:: Deleting a window gives its space to other windows. +* Selecting Windows:: The selected window is the one that you edit in. +* Cyclic Window Ordering:: Moving around the existing windows. +* Buffers and Windows:: Each window displays the contents of a buffer. +* Displaying Buffers:: Higher-level functions for displaying a buffer + and choosing a window for it. +* Choosing Window:: How to choose a window for displaying a buffer. +* Window Point:: Each window has its own location of point. +* Window Start:: The display-start position controls which text + is on-screen in the window. +* Textual Scrolling:: Moving text up and down through the window. +* Vertical Scrolling:: Moving the contents up and down on the window. +* Horizontal Scrolling:: Moving the contents sideways on the window. +* Size of Window:: Accessing the size of a window. +* Resizing Windows:: Changing the size of a window. +* Coordinates and Windows:: Converting coordinates to windows. +* Window Tree:: The layout and sizes of all windows in a frame. +* Window Configurations:: Saving and restoring the state of the screen. +* Window Hooks:: Hooks for scrolling, window size changes, + redisplay going past a certain point, + or window configuration changes. + +Frames + +* Creating Frames:: Creating additional frames. +* Multiple Displays:: Creating frames on other displays. +* Frame Parameters:: Controlling frame size, position, font, etc. +* Frame Titles:: Automatic updating of frame titles. +* Deleting Frames:: Frames last until explicitly deleted. +* Finding All Frames:: How to examine all existing frames. +* Frames and Windows:: A frame contains windows; + display of text always works through windows. +* Minibuffers and Frames:: How a frame finds the minibuffer to use. +* Input Focus:: Specifying the selected frame. +* Visibility of Frames:: Frames may be visible or invisible, or icons. +* Raising and Lowering:: Raising a frame makes it hide other windows; + lowering it puts it underneath the others. +* Frame Configurations:: Saving the state of all frames. +* Mouse Tracking:: Getting events that say when the mouse moves. +* Mouse Position:: Asking where the mouse is, or moving it. +* Pop-Up Menus:: Displaying a menu for the user to select from. +* Dialog Boxes:: Displaying a box to ask yes or no. +* Pointer Shape:: Specifying the shape of the mouse pointer. +* Window System Selections::Transferring text to and from other windows. +* Drag and Drop:: Internals of Drag-and-Drop implementation. +* Color Names:: Getting the definitions of color names. +* Text Terminal Colors:: Defining colors for text-only terminals. +* Resources:: Getting resource values from the server. +* Display Feature Testing:: Determining the features of a terminal. + +Frame Parameters + +* Parameter Access:: How to change a frame's parameters. +* Initial Parameters:: Specifying frame parameters when you make a frame. +* Window Frame Parameters:: List of frame parameters for window systems. +* Size and Position:: Changing the size and position of a frame. +* Geometry:: Parsing geometry specifications. + +Window Frame Parameters + +* Basic Parameters:: Parameters that are fundamental. +* Position Parameters:: The position of the frame on the screen. +* Size Parameters:: Frame's size. +* Layout Parameters:: Size of parts of the frame, and + enabling or disabling some parts. +* Buffer Parameters:: Which buffers have been or should be shown. +* Management Parameters:: Communicating with the window manager. +* Cursor Parameters:: Controlling the cursor appearance. +* Color Parameters:: Colors of various parts of the frame. + +Positions + +* Point:: The special position where editing takes place. +* Motion:: Changing point. +* Excursions:: Temporary motion and buffer changes. +* Narrowing:: Restricting editing to a portion of the buffer. + +Motion + +* Character Motion:: Moving in terms of characters. +* Word Motion:: Moving in terms of words. +* Buffer End Motion:: Moving to the beginning or end of the buffer. +* Text Lines:: Moving in terms of lines of text. +* Screen Lines:: Moving in terms of lines as displayed. +* List Motion:: Moving by parsing lists and sexps. +* Skipping Characters:: Skipping characters belonging to a certain set. + +Markers + +* Overview of Markers:: The components of a marker, and how it relocates. +* Predicates on Markers:: Testing whether an object is a marker. +* Creating Markers:: Making empty markers or markers at certain places. +* Information from Markers::Finding the marker's buffer or character + position. +* Marker Insertion Types:: Two ways a marker can relocate when you + insert where it points. +* Moving Markers:: Moving the marker to a new buffer or position. +* The Mark:: How "the mark" is implemented with a marker. +* The Region:: How to access "the region". + +Text + +* Near Point:: Examining text in the vicinity of point. +* Buffer Contents:: Examining text in a general fashion. +* Comparing Text:: Comparing substrings of buffers. +* Insertion:: Adding new text to a buffer. +* Commands for Insertion:: User-level commands to insert text. +* Deletion:: Removing text from a buffer. +* User-Level Deletion:: User-level commands to delete text. +* The Kill Ring:: Where removed text sometimes is saved for + later use. +* Undo:: Undoing changes to the text of a buffer. +* Maintaining Undo:: How to enable and disable undo information. + How to control how much information is kept. +* Filling:: Functions for explicit filling. +* Margins:: How to specify margins for filling commands. +* Adaptive Fill:: Adaptive Fill mode chooses a fill prefix + from context. +* Auto Filling:: How auto-fill mode is implemented to break lines. +* Sorting:: Functions for sorting parts of the buffer. +* Columns:: Computing horizontal positions, and using them. +* Indentation:: Functions to insert or adjust indentation. +* Case Changes:: Case conversion of parts of the buffer. +* Text Properties:: Assigning Lisp property lists to text characters. +* Substitution:: Replacing a given character wherever it appears. +* Transposition:: Swapping two portions of a buffer. +* Registers:: How registers are implemented. Accessing + the text or position stored in a register. +* Base 64:: Conversion to or from base 64 encoding. +* MD5 Checksum:: Compute the MD5 "message digest"/"checksum". +* Atomic Changes:: Installing several buffer changes "atomically". +* Change Hooks:: Supplying functions to be run when text is changed. + +The Kill Ring + +* Kill Ring Concepts:: What text looks like in the kill ring. +* Kill Functions:: Functions that kill text. +* Yanking:: How yanking is done. +* Yank Commands:: Commands that access the kill ring. +* Low-Level Kill Ring:: Functions and variables for kill ring access. +* Internals of Kill Ring:: Variables that hold kill-ring data. + +Indentation + +* Primitive Indent:: Functions used to count and insert indentation. +* Mode-Specific Indent:: Customize indentation for different modes. +* Region Indent:: Indent all the lines in a region. +* Relative Indent:: Indent the current line based on previous lines. +* Indent Tabs:: Adjustable, typewriter-like tab stops. +* Motion by Indent:: Move to first non-blank character. + +Text Properties + +* Examining Properties:: Looking at the properties of one character. +* Changing Properties:: Setting the properties of a range of text. +* Property Search:: Searching for where a property changes value. +* Special Properties:: Particular properties with special meanings. +* Format Properties:: Properties for representing formatting of text. +* Sticky Properties:: How inserted text gets properties from + neighboring text. +* Saving Properties:: Saving text properties in files, and reading + them back. +* Lazy Properties:: Computing text properties in a lazy fashion + only when text is examined. +* Clickable Text:: Using text properties to make regions of text + do something when you click on them. +* Links and Mouse-1:: How to make @key{Mouse-1} follow a link. +* Fields:: The @code{field} property defines + fields within the buffer. +* Not Intervals:: Why text properties do not use + Lisp-visible text intervals. + +Non-ASCII Characters + +* Text Representations:: Unibyte and multibyte representations +* Converting Representations:: Converting unibyte to multibyte and vice versa. +* Selecting a Representation:: Treating a byte sequence as unibyte or multi. +* Character Codes:: How unibyte and multibyte relate to + codes of individual characters. +* Character Sets:: The space of possible character codes + is divided into various character sets. +* Chars and Bytes:: More information about multibyte encodings. +* Splitting Characters:: Converting a character to its byte sequence. +* Scanning Charsets:: Which character sets are used in a buffer? +* Translation of Characters:: Translation tables are used for conversion. +* Coding Systems:: Coding systems are conversions for saving files. +* Input Methods:: Input methods allow users to enter various + non-ASCII characters without special keyboards. +* Locales:: Interacting with the POSIX locale. + +Coding Systems + +* Coding System Basics:: Basic concepts. +* Encoding and I/O:: How file I/O functions handle coding systems. +* Lisp and Coding Systems:: Functions to operate on coding system names. +* User-Chosen Coding Systems:: Asking the user to choose a coding system. +* Default Coding Systems:: Controlling the default choices. +* Specifying Coding Systems:: Requesting a particular coding system + for a single file operation. +* Explicit Encoding:: Encoding or decoding text without doing I/O. +* Terminal I/O Encoding:: Use of encoding for terminal I/O. +* MS-DOS File Types:: How DOS "text" and "binary" files + relate to coding systems. + +Searching and Matching + +* String Search:: Search for an exact match. +* Searching and Case:: Case-independent or case-significant searching. +* Regular Expressions:: Describing classes of strings. +* Regexp Search:: Searching for a match for a regexp. +* POSIX Regexps:: Searching POSIX-style for the longest match. +* Match Data:: Finding out which part of the text matched, + after a string or regexp search. +* Search and Replace:: Commands that loop, searching and replacing. +* Standard Regexps:: Useful regexps for finding sentences, pages,... + +Regular Expressions + +* Syntax of Regexps:: Rules for writing regular expressions. +* Regexp Example:: Illustrates regular expression syntax. +* Regexp Functions:: Functions for operating on regular expressions. + +Syntax of Regular Expressions + +* Regexp Special:: Special characters in regular expressions. +* Char Classes:: Character classes used in regular expressions. +* Regexp Backslash:: Backslash-sequences in regular expressions. + +The Match Data + +* Replacing Match:: Replacing a substring that was matched. +* Simple Match Data:: Accessing single items of match data, + such as where a particular subexpression started. +* Entire Match Data:: Accessing the entire match data at once, as a list. +* Saving Match Data:: Saving and restoring the match data. + +Syntax Tables + +* Syntax Basics:: Basic concepts of syntax tables. +* Syntax Descriptors:: How characters are classified. +* Syntax Table Functions:: How to create, examine and alter syntax tables. +* Syntax Properties:: Overriding syntax with text properties. +* Motion and Syntax:: Moving over characters with certain syntaxes. +* Parsing Expressions:: Parsing balanced expressions + using the syntax table. +* Standard Syntax Tables:: Syntax tables used by various major modes. +* Syntax Table Internals:: How syntax table information is stored. +* Categories:: Another way of classifying character syntax. + +Syntax Descriptors + +* Syntax Class Table:: Table of syntax classes. +* Syntax Flags:: Additional flags each character can have. + +Parsing Expressions + +* Motion via Parsing:: Motion functions that work by parsing. +* Position Parse:: Determining the syntactic state of a position. +* Parser State:: How Emacs represents a syntactic state. +* Low-Level Parsing:: Parsing across a specified region. +* Control Parsing:: Parameters that affect parsing. + +Abbrevs And Abbrev Expansion + +* Abbrev Mode:: Setting up Emacs for abbreviation. +* Abbrev Tables:: Creating and working with abbrev tables. +* Defining Abbrevs:: Specifying abbreviations and their expansions. +* Abbrev Files:: Saving abbrevs in files. +* Abbrev Expansion:: Controlling expansion; expansion subroutines. +* Standard Abbrev Tables:: Abbrev tables used by various major modes. + +Processes + +* Subprocess Creation:: Functions that start subprocesses. +* Shell Arguments:: Quoting an argument to pass it to a shell. +* Synchronous Processes:: Details of using synchronous subprocesses. +* Asynchronous Processes:: Starting up an asynchronous subprocess. +* Deleting Processes:: Eliminating an asynchronous subprocess. +* Process Information:: Accessing run-status and other attributes. +* Input to Processes:: Sending input to an asynchronous subprocess. +* Signals to Processes:: Stopping, continuing or interrupting + an asynchronous subprocess. +* Output from Processes:: Collecting output from an asynchronous subprocess. +* Sentinels:: Sentinels run when process run-status changes. +* Query Before Exit:: Whether to query if exiting will kill a process. +* Transaction Queues:: Transaction-based communication with subprocesses. +* Network:: Opening network connections. +* Network Servers:: Network servers let Emacs accept net connections. +* Datagrams:: UDP network connections. +* Low-Level Network:: Lower-level but more general function + to create connections and servers. +* Misc Network:: Additional relevant functions for network connections. +* Byte Packing:: Using bindat to pack and unpack binary data. + +Receiving Output from Processes + +* Process Buffers:: If no filter, output is put in a buffer. +* Filter Functions:: Filter functions accept output from the process. +* Decoding Output:: Filters can get unibyte or multibyte strings. +* Accepting Output:: How to wait until process output arrives. + +Low-Level Network Access + +* Proc: Network Processes. Using @code{make-network-process}. +* Options: Network Options. Further control over network connections. +* Features: Network Feature Testing. + Determining which network features work on + the machine you are using. + +Packing and Unpacking Byte Arrays + +* Bindat Spec:: Describing data layout. +* Bindat Functions:: Doing the unpacking and packing. +* Bindat Examples:: Samples of what bindat.el can do for you! + +Emacs Display + +* Refresh Screen:: Clearing the screen and redrawing everything on it. +* Forcing Redisplay:: Forcing redisplay. +* Truncation:: Folding or wrapping long text lines. +* The Echo Area:: Displaying messages at the bottom of the screen. +* Warnings:: Displaying warning messages for the user. +* Invisible Text:: Hiding part of the buffer text. +* Selective Display:: Hiding part of the buffer text (the old way). +* Temporary Displays:: Displays that go away automatically. +* Overlays:: Use overlays to highlight parts of the buffer. +* Width:: How wide a character or string is on the screen. +* Line Height:: Controlling the height of lines. +* Faces:: A face defines a graphics style + for text characters: font, colors, etc. +* Fringes:: Controlling window fringes. +* Scroll Bars:: Controlling vertical scroll bars. +* Display Property:: Enabling special display features. +* Images:: Displaying images in Emacs buffers. +* Buttons:: Adding clickable buttons to Emacs buffers. +* Abstract Display:: Emacs' Widget for Object Collections. +* Blinking:: How Emacs shows the matching open parenthesis. +* Usual Display:: The usual conventions for displaying nonprinting chars. +* Display Tables:: How to specify other conventions. +* Beeping:: Audible signal to the user. +* Window Systems:: Which window system is being used. + +The Echo Area + +* Displaying Messages:: Explicitly displaying text in the echo area. +* Progress:: Informing user about progress of a long operation. +* Logging Messages:: Echo area messages are logged for the user. +* Echo Area Customization:: Controlling the echo area. + +Reporting Warnings + +* Warning Basics:: Warnings concepts and functions to report them. +* Warning Variables:: Variables programs bind to customize their warnings. +* Warning Options:: Variables users set to control display of warnings. + +Overlays + +* Managing Overlays:: Creating and moving overlays. +* Overlay Properties:: How to read and set properties. + What properties do to the screen display. +* Finding Overlays:: Searching for overlays. + +Faces + +* Defining Faces:: How to define a face with @code{defface}. +* Face Attributes:: What is in a face? +* Attribute Functions:: Functions to examine and set face attributes. +* Displaying Faces:: How Emacs combines the faces specified for + a character. +* Font Selection:: Finding the best available font for a face. +* Face Functions:: How to define and examine faces. +* Auto Faces:: Hook for automatic face assignment. +* Font Lookup:: Looking up the names of available fonts + and information about them. +* Fontsets:: A fontset is a collection of fonts + that handle a range of character sets. + +Fringes + +* Fringe Size/Pos:: Specifying where to put the window fringes. +* Fringe Indicators:: Displaying indicator icons in the window fringes. +* Fringe Cursors:: Displaying cursors in the right fringe. +* Fringe Bitmaps:: Specifying bitmaps for fringe indicators. +* Customizing Bitmaps:: Specifying your own bitmaps to use in the fringes. +* Overlay Arrow:: Display of an arrow to indicate position. + +The @code{display} Property + +* Specified Space:: Displaying one space with a specified width. +* Pixel Specification:: Specifying space width or height in pixels. +* Other Display Specs:: Displaying an image; magnifying text; moving it + up or down on the page; adjusting the width + of spaces within text. +* Display Margins:: Displaying text or images to the side of + the main text. + +Images + +* Image Descriptors:: How to specify an image for use in @code{:display}. +* XBM Images:: Special features for XBM format. +* XPM Images:: Special features for XPM format. +* GIF Images:: Special features for GIF format. +* PostScript Images:: Special features for PostScript format. +* Other Image Types:: Various other formats are supported. +* Defining Images:: Convenient ways to define an image for later use. +* Showing Images:: Convenient ways to display an image once + it is defined. +* Image Cache:: Internal mechanisms of image display. + +Buttons + +* Button Properties:: Button properties with special meanings. +* Button Types:: Defining common properties for classes of buttons. +* Making Buttons:: Adding buttons to Emacs buffers. +* Manipulating Buttons:: Getting and setting properties of buttons. +* Button Buffer Commands:: Buffer-wide commands and bindings for buttons. + +Abstract Display + +* Abstract Display Functions:: Functions in the Ewoc package. +* Abstract Display Example:: Example of using Ewoc. + +Display Tables + +* Display Table Format:: What a display table consists of. +* Active Display Table:: How Emacs selects a display table to use. +* Glyphs:: How to define a glyph, and what glyphs mean. + +Operating System Interface + +* Starting Up:: Customizing Emacs start-up processing. +* Getting Out:: How exiting works (permanent or temporary). +* System Environment:: Distinguish the name and kind of system. +* User Identification:: Finding the name and user id of the user. +* Time of Day:: Getting the current time. +* Time Conversion:: Converting a time from numeric form to a string, or + to calendrical data (or vice versa). +* Time Parsing:: Converting a time from numeric form to text + and vice versa. +* Processor Run Time:: Getting the run time used by Emacs. +* Time Calculations:: Adding, subtracting, comparing times, etc. +* Timers:: Setting a timer to call a function at a certain time. +* Idle Timers:: Setting a timer to call a function when Emacs has + been idle for a certain length of time. +* Terminal Input:: Accessing and recording terminal input. +* Terminal Output:: Controlling and recording terminal output. +* Sound Output:: Playing sounds on the computer's speaker. +* X11 Keysyms:: Operating on key symbols for X Windows +* Batch Mode:: Running Emacs without terminal interaction. +* Session Management:: Saving and restoring state with X Session Management. + +Starting Up Emacs + +* Startup Summary:: Sequence of actions Emacs performs at start-up. +* Init File:: Details on reading the init file (@file{.emacs}). +* Terminal-Specific:: How the terminal-specific Lisp file is read. +* Command-Line Arguments:: How command-line arguments are processed, + and how you can customize them. + +Getting Out of Emacs + +* Killing Emacs:: Exiting Emacs irreversibly. +* Suspending Emacs:: Exiting Emacs reversibly. + +Terminal Input + +* Input Modes:: Options for how input is processed. +* Recording Input:: Saving histories of recent or all input events. + +Tips and Conventions + +* Coding Conventions:: Conventions for clean and robust programs. +* Key Binding Conventions:: Which keys should be bound by which programs. +* Programming Tips:: Making Emacs code fit smoothly in Emacs. +* Compilation Tips:: Making compiled code run fast. +* Warning Tips:: Turning off compiler warnings. +* Documentation Tips:: Writing readable documentation strings. +* Comment Tips:: Conventions for writing comments. +* Library Headers:: Standard headers for library packages. + +GNU Emacs Internals + +* Building Emacs:: How the dumped Emacs is made. +* Pure Storage:: A kludge to make preloaded Lisp functions sharable. +* Garbage Collection:: Reclaiming space for Lisp objects no longer used. +* Memory Usage:: Info about total size of Lisp objects made so far. +* Writing Emacs Primitives:: Writing C code for Emacs. +* Object Internals:: Data formats of buffers, windows, processes. + +Object Internals + +* Buffer Internals:: Components of a buffer structure. +* Window Internals:: Components of a window structure. +* Process Internals:: Components of a process structure. +@end detailmenu +@end menu + +@include intro.texi +@include objects.texi +@include numbers.texi +@include strings.texi + +@include lists.texi +@include sequences.texi +@include hash.texi +@include symbols.texi +@include eval.texi + +@include control.texi +@include variables.texi +@include functions.texi +@include macros.texi + +@include customize.texi +@include loading.texi +@include compile.texi +@include advice.texi + +@include debugging.texi +@include streams.texi +@include minibuf.texi +@include commands.texi + +@include keymaps.texi +@include modes.texi +@include help.texi +@include files.texi + +@include backups.texi + +@c ================ Beginning of Volume 2 ================ +@c include buffers.texi +@c include windows.texi +@c include frames.texi + +@c include positions.texi +@c include markers.texi +@c include text.texi +@c include nonascii.texi + +@c include searching.texi +@c include syntax.texi +@c include abbrevs.texi +@c include processes.texi + +@c include display.texi +@c include os.texi + +@c MOVE to Emacs Manual: include misc-modes.texi + +@c appendices + +@c REMOVE this: include non-hacker.texi + +@c include anti.texi +@c include doclicense.texi +@c include gpl.texi +@c include tips.texi +@c include internals.texi +@c include errors.texi +@c include locals.texi +@c include maps.texi +@c include hooks.texi + +@include index.texi + +@ignore +@node New Symbols, , Index, Top +@unnumbered New Symbols Since the Previous Edition + +@printindex tp +@end ignore + +@bye + + +These words prevent "local variables" above from confusing Emacs. + +@ignore + arch-tag: 9594760d-8801-4d1b-aeb9-f3b3166b5be2 +@end ignore diff --git a/doc/lispref/vol2.texi b/doc/lispref/vol2.texi new file mode 100644 index 00000000000..515973c6281 --- /dev/null +++ b/doc/lispref/vol2.texi @@ -0,0 +1,1506 @@ +\input texinfo @c -*-texinfo-*- +@c This file is used for printing the GNU Emacs Lisp Reference Manual +@c in two volumes. It is a modified version of elisp.texi. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c %**start of header +@setfilename elisp +@settitle GNU Emacs Lisp Reference Manual: Volume 2 +@c %**end of header + +@c See two-volume-cross-refs.txt. +@tex +\message{Formatting for two volume edition...Volume 2...} +% +% Read special toc file, set up in two-volume.make. +\gdef\tocreadfilename{elisp2-toc-ready.toc} +% +% Don't make outlines, they're not needed and \readdatafile can't pay +% attention to the special definition above. +\global\let\pdfmakeoutlines=\relax +% +% Start volume 2 chapter numbering at 27; this must be listed as chapno26 +\global\chapno=26 +@end tex + +@c Version of the manual and of Emacs. +@c Please remember to update the edition number in README as well. +@set VERSION 2.9 +@set EMACSVER 22 + +@dircategory Emacs +@direntry +* Elisp: (elisp). The Emacs Lisp Reference Manual. +@end direntry + +@c in general, keep the following line commented out, unless doing a +@c copy of this manual that will be published. the manual should go +@c onto the distribution in the full, 8.5 x 11" size. +@set smallbook + +@ifset smallbook +@smallbook +@end ifset + +@c per rms and peterb, use 10pt fonts for the main text, mostly to +@c save on paper cost. +@c Do this inside @tex for now, so current makeinfo does not complain. +@tex +@ifset smallbook +@fonttextsize 10 +\global\let\urlcolor=\Black % don't print links in grayscale +\global\let\linkcolor=\Black +@end ifset +\global\hbadness=6666 % don't worry about not-too-underfull boxes +@end tex + +@c Combine indices. +@synindex cp fn +@syncodeindex vr fn +@syncodeindex ky fn +@syncodeindex pg fn +@c We use the "type index" to index new functions and variables. +@c @syncodeindex tp fn + +@copying +This is edition @value{VERSION} of the GNU Emacs Lisp Reference Manual,@* +corresponding to Emacs version @value{EMACSVER}. + +Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, +1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software +Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with the +Invariant Sections being ``GNU General Public License,'' with the +Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover +Texts as in (a) below. A copy of the license is included in the +section entitled ``GNU Free Documentation License.'' + +(a) The FSF's Back-Cover Text is: ``You are free to copy and modify +this GNU Manual. Buying copies from GNU Press supports the FSF in +developing GNU and promoting software freedom.'' +@end quotation +@end copying + +@titlepage +@title GNU Emacs Lisp Reference Manual +@subtitle Volume 2 +@subtitle For Emacs Version @value{EMACSVER} +@subtitle Revision @value{VERSION}, June 2007 + +@author by Bil Lewis, Dan LaLiberte, Richard Stallman +@author and the GNU Manual Group +@page +@vskip 0pt plus 1filll +@insertcopying + +@sp 2 +Published by the Free Software Foundation @* +51 Franklin St, Fifth Floor @* +Boston, MA 02110-1301 @* +USA @* +ISBN 1-882114-74-4 + +@sp 2 +Cover art by Etienne Suvasa. +@end titlepage + + +@c Print the tables of contents +@summarycontents +@contents + + +@ifnottex +@node Top, Introduction, (dir), (dir) +@top Emacs Lisp + +This Info file contains edition @value{VERSION} of the GNU Emacs Lisp +Reference Manual, corresponding to GNU Emacs version @value{EMACSVER}. +@end ifnottex + +@menu +* Introduction:: Introduction and conventions used. + +* Lisp Data Types:: Data types of objects in Emacs Lisp. +* Numbers:: Numbers and arithmetic functions. +* Strings and Characters:: Strings, and functions that work on them. +* Lists:: Lists, cons cells, and related functions. +* Sequences Arrays Vectors:: Lists, strings and vectors are called sequences. + Certain functions act on any kind of sequence. + The description of vectors is here as well. +* Hash Tables:: Very fast lookup-tables. +* Symbols:: Symbols represent names, uniquely. + +* Evaluation:: How Lisp expressions are evaluated. +* Control Structures:: Conditionals, loops, nonlocal exits. +* Variables:: Using symbols in programs to stand for values. +* Functions:: A function is a Lisp program + that can be invoked from other functions. +* Macros:: Macros are a way to extend the Lisp language. +* Customization:: Writing customization declarations. + +* Loading:: Reading files of Lisp code into Lisp. +* Byte Compilation:: Compilation makes programs run faster. +* Advising Functions:: Adding to the definition of a function. +* Debugging:: Tools and tips for debugging Lisp programs. + +* Read and Print:: Converting Lisp objects to text and back. +* Minibuffers:: Using the minibuffer to read input. +* Command Loop:: How the editor command loop works, + and how you can call its subroutines. +* Keymaps:: Defining the bindings from keys to commands. +* Modes:: Defining major and minor modes. +* Documentation:: Writing and using documentation strings. + +* Files:: Accessing files. +* Backups and Auto-Saving:: Controlling how backups and auto-save + files are made. +* Buffers:: Creating and using buffer objects. +* Windows:: Manipulating windows and displaying buffers. +* Frames:: Making multiple system-level windows. +* Positions:: Buffer positions and motion functions. +* Markers:: Markers represent positions and update + automatically when the text is changed. + +* Text:: Examining and changing text in buffers. +* Non-ASCII Characters:: Non-ASCII text in buffers and strings. +* Searching and Matching:: Searching buffers for strings or regexps. +* Syntax Tables:: The syntax table controls word and list parsing. +* Abbrevs:: How Abbrev mode works, and its data structures. + +* Processes:: Running and communicating with subprocesses. +* Display:: Features for controlling the screen display. +* System Interface:: Getting the user id, system type, environment + variables, and other such things. + +Appendices + +* Antinews:: Info for users downgrading to Emacs 21. +* GNU Free Documentation License:: The license for this documentation +* GPL:: Conditions for copying and changing GNU Emacs. +* Tips:: Advice and coding conventions for Emacs Lisp. +* GNU Emacs Internals:: Building and dumping Emacs; + internal data structures. +* Standard Errors:: List of all error symbols. +* Standard Buffer-Local Variables:: + List of variables buffer-local in all buffers. +* Standard Keymaps:: List of standard keymaps. +* Standard Hooks:: List of standard hook variables. + +* Index:: Index including concepts, functions, variables, + and other terms. + +@ignore +* New Symbols:: New functions and variables in Emacs @value{EMACSVER}. +@end ignore + +@c Do NOT modify the following 3 lines! They must have this form to +@c be correctly identified by `texinfo-multiple-files-update'. In +@c particular, the detailed menu header line MUST be identical to the +@c value of `texinfo-master-menu-header'. See texnfo-upd.el. + +@detailmenu + --- The Detailed Node Listing --- + --------------------------------- + +Here are other nodes that are inferiors of those already listed, +mentioned here so you can get to them in one step: + +Introduction + +* Caveats:: Flaws and a request for help. +* Lisp History:: Emacs Lisp is descended from Maclisp. +* Conventions:: How the manual is formatted. +* Version Info:: Which Emacs version is running? +* Acknowledgements:: The authors, editors, and sponsors of this manual. + +Conventions + +* Some Terms:: Explanation of terms we use in this manual. +* nil and t:: How the symbols @code{nil} and @code{t} are used. +* Evaluation Notation:: The format we use for examples of evaluation. +* Printing Notation:: The format we use for examples that print output. +* Error Messages:: The format we use for examples of errors. +* Buffer Text Notation:: The format we use for buffer contents in examples. +* Format of Descriptions:: Notation for describing functions, variables, etc. + +Format of Descriptions + +* A Sample Function Description:: A description of an imaginary + function, @code{foo}. +* A Sample Variable Description:: A description of an imaginary + variable, @code{electric-future-map}. + +Lisp Data Types + +* Printed Representation:: How Lisp objects are represented as text. +* Comments:: Comments and their formatting conventions. +* Programming Types:: Types found in all Lisp systems. +* Editing Types:: Types specific to Emacs. +* Circular Objects:: Read syntax for circular structure. +* Type Predicates:: Tests related to types. +* Equality Predicates:: Tests of equality between any two objects. + +Programming Types + +* Integer Type:: Numbers without fractional parts. +* Floating Point Type:: Numbers with fractional parts and with a large range. +* Character Type:: The representation of letters, numbers and + control characters. +* Symbol Type:: A multi-use object that refers to a function, + variable, property list, or itself. +* Sequence Type:: Both lists and arrays are classified as sequences. +* Cons Cell Type:: Cons cells, and lists (which are made from cons cells). +* Array Type:: Arrays include strings and vectors. +* String Type:: An (efficient) array of characters. +* Vector Type:: One-dimensional arrays. +* Char-Table Type:: One-dimensional sparse arrays indexed by characters. +* Bool-Vector Type:: One-dimensional arrays of @code{t} or @code{nil}. +* Hash Table Type:: Super-fast lookup tables. +* Function Type:: A piece of executable code you can call from elsewhere. +* Macro Type:: A method of expanding an expression into another + expression, more fundamental but less pretty. +* Primitive Function Type:: A function written in C, callable from Lisp. +* Byte-Code Type:: A function written in Lisp, then compiled. +* Autoload Type:: A type used for automatically loading seldom-used + functions. + +Character Type + +* Basic Char Syntax:: Syntax for regular characters. +* General Escape Syntax:: How to specify characters by their codes. +* Ctl-Char Syntax:: Syntax for control characters. +* Meta-Char Syntax:: Syntax for meta-characters. +* Other Char Bits:: Syntax for hyper-, super-, and alt-characters. + +Cons Cell and List Types + +* Box Diagrams:: Drawing pictures of lists. +* Dotted Pair Notation:: An alternative syntax for lists. +* Association List Type:: A specially constructed list. + +String Type + +* Syntax for Strings:: How to specify Lisp strings. +* Non-ASCII in Strings:: International characters in strings. +* Nonprinting Characters:: Literal unprintable characters in strings. +* Text Props and Strings:: Strings with text properties. + +Editing Types + +* Buffer Type:: The basic object of editing. +* Marker Type:: A position in a buffer. +* Window Type:: What makes buffers visible. +* Frame Type:: Windows subdivide frames. +* Window Configuration Type:: Recording the way a frame is subdivided. +* Frame Configuration Type:: Recording the status of all frames. +* Process Type:: A process running on the underlying OS. +* Stream Type:: Receive or send characters. +* Keymap Type:: What function a keystroke invokes. +* Overlay Type:: How an overlay is represented. + +Numbers + +* Integer Basics:: Representation and range of integers. +* Float Basics:: Representation and range of floating point. +* Predicates on Numbers:: Testing for numbers. +* Comparison of Numbers:: Equality and inequality predicates. +* Numeric Conversions:: Converting float to integer and vice versa. +* Arithmetic Operations:: How to add, subtract, multiply and divide. +* Rounding Operations:: Explicitly rounding floating point numbers. +* Bitwise Operations:: Logical and, or, not, shifting. +* Math Functions:: Trig, exponential and logarithmic functions. +* Random Numbers:: Obtaining random integers, predictable or not. + +Strings and Characters + +* String Basics:: Basic properties of strings and characters. +* Predicates for Strings:: Testing whether an object is a string or char. +* Creating Strings:: Functions to allocate new strings. +* Modifying Strings:: Altering the contents of an existing string. +* Text Comparison:: Comparing characters or strings. +* String Conversion:: Converting characters to strings and vice versa. +* Formatting Strings:: @code{format}: Emacs's analogue of @code{printf}. +* Case Conversion:: Case conversion functions. +* Case Tables:: Customizing case conversion. + +Lists + +* Cons Cells:: How lists are made out of cons cells. +* List-related Predicates:: Is this object a list? Comparing two lists. +* List Elements:: Extracting the pieces of a list. +* Building Lists:: Creating list structure. +* List Variables:: Modifying lists stored in variables. +* Modifying Lists:: Storing new pieces into an existing list. +* Sets And Lists:: A list can represent a finite mathematical set. +* Association Lists:: A list can represent a finite relation or mapping. +* Rings:: Managing a fixed-size ring of objects. + +Modifying Existing List Structure + +* Setcar:: Replacing an element in a list. +* Setcdr:: Replacing part of the list backbone. + This can be used to remove or add elements. +* Rearrangement:: Reordering the elements in a list; combining lists. + +Sequences, Arrays, and Vectors + +* Sequence Functions:: Functions that accept any kind of sequence. +* Arrays:: Characteristics of arrays in Emacs Lisp. +* Array Functions:: Functions specifically for arrays. +* Vectors:: Special characteristics of Emacs Lisp vectors. +* Vector Functions:: Functions specifically for vectors. +* Char-Tables:: How to work with char-tables. +* Bool-Vectors:: How to work with bool-vectors. + +Hash Tables + +* Creating Hash:: Functions to create hash tables. +* Hash Access:: Reading and writing the hash table contents. +* Defining Hash:: Defining new comparison methods +* Other Hash:: Miscellaneous. + +Symbols + +* Symbol Components:: Symbols have names, values, function definitions + and property lists. +* Definitions:: A definition says how a symbol will be used. +* Creating Symbols:: How symbols are kept unique. +* Property Lists:: Each symbol has a property list + for recording miscellaneous information. + +Property Lists + +* Plists and Alists:: Comparison of the advantages of property + lists and association lists. +* Symbol Plists:: Functions to access symbols' property lists. +* Other Plists:: Accessing property lists stored elsewhere. + +Evaluation + +* Intro Eval:: Evaluation in the scheme of things. +* Forms:: How various sorts of objects are evaluated. +* Quoting:: Avoiding evaluation (to put constants in + the program). +* Eval:: How to invoke the Lisp interpreter explicitly. + +Kinds of Forms + +* Self-Evaluating Forms:: Forms that evaluate to themselves. +* Symbol Forms:: Symbols evaluate as variables. +* Classifying Lists:: How to distinguish various sorts of list forms. +* Function Indirection:: When a symbol appears as the car of a list, + we find the real function via the symbol. +* Function Forms:: Forms that call functions. +* Macro Forms:: Forms that call macros. +* Special Forms:: "Special forms" are idiosyncratic primitives, + most of them extremely important. +* Autoloading:: Functions set up to load files + containing their real definitions. + +Control Structures + +* Sequencing:: Evaluation in textual order. +* Conditionals:: @code{if}, @code{cond}, @code{when}, @code{unless}. +* Combining Conditions:: @code{and}, @code{or}, @code{not}. +* Iteration:: @code{while} loops. +* Nonlocal Exits:: Jumping out of a sequence. + +Nonlocal Exits + +* Catch and Throw:: Nonlocal exits for the program's own purposes. +* Examples of Catch:: Showing how such nonlocal exits can be written. +* Errors:: How errors are signaled and handled. +* Cleanups:: Arranging to run a cleanup form if an + error happens. + +Errors + +* Signaling Errors:: How to report an error. +* Processing of Errors:: What Emacs does when you report an error. +* Handling Errors:: How you can trap errors and continue execution. +* Error Symbols:: How errors are classified for trapping them. +* Standard Errors:: List of all error symbols. + +Variables + +* Global Variables:: Variable values that exist permanently, everywhere. +* Constant Variables:: Certain "variables" have values that never change. +* Local Variables:: Variable values that exist only temporarily. +* Void Variables:: Symbols that lack values. +* Defining Variables:: A definition says a symbol is used as a variable. +* Tips for Defining:: Things you should think about when you + define a variable. +* Accessing Variables:: Examining values of variables whose names + are known only at run time. +* Setting Variables:: Storing new values in variables. +* Variable Scoping:: How Lisp chooses among local and global values. +* Buffer-Local Variables:: Variable values in effect only in one buffer. +* Frame-Local Variables:: Variable values in effect only in one frame. +* Future Local Variables:: New kinds of local values we might add some day. +* File Local Variables:: Handling local variable lists in files. +* Variable Aliases:: Variables that are aliases for other variables. +* Variables with Restricted Values:: Non-constant variables whose value can + @emph{not} be an arbitrary Lisp object. +* Standard Buffer-Local Variables:: + List of variables buffer-local in all buffers. + +Scoping Rules for Variable Bindings + +* Scope:: Scope means where in the program a value + is visible. Comparison with other languages. +* Extent:: Extent means how long in time a value exists. +* Impl of Scope:: Two ways to implement dynamic scoping. +* Using Scoping:: How to use dynamic scoping carefully and + avoid problems. + +Buffer-Local Variables + +* Intro to Buffer-Local:: Introduction and concepts. +* Creating Buffer-Local:: Creating and destroying buffer-local bindings. +* Default Value:: The default value is seen in buffers + that don't have their own buffer-local values. + +Functions + +* What Is a Function:: Lisp functions vs primitives; terminology. +* Lambda Expressions:: How functions are expressed as Lisp objects. +* Function Names:: A symbol can serve as the name of a function. +* Defining Functions:: Lisp expressions for defining functions. +* Calling Functions:: How to use an existing function. +* Mapping Functions:: Applying a function to each element of a list, etc. +* Anonymous Functions:: Lambda-expressions are functions with no names. +* Function Cells:: Accessing or setting the function definition + of a symbol. +* Obsolete Functions:: Declaring functions obsolete. +* Inline Functions:: Defining functions that the compiler will open code. +* Function Safety:: Determining whether a function is safe to call. +* Related Topics:: Cross-references to specific Lisp primitives + that have a special bearing on how + functions work. + +Lambda Expressions + +* Lambda Components:: The parts of a lambda expression. +* Simple Lambda:: A simple example. +* Argument List:: Details and special features of argument lists. +* Function Documentation:: How to put documentation in a function. + +Macros + +* Simple Macro:: A basic example. +* Expansion:: How, when and why macros are expanded. +* Compiling Macros:: How macros are expanded by the compiler. +* Defining Macros:: How to write a macro definition. +* Backquote:: Easier construction of list structure. +* Problems with Macros:: Don't evaluate the macro arguments too many times. + Don't hide the user's variables. +* Indenting Macros:: Specifying how to indent macro calls. + +Common Problems Using Macros + +* Wrong Time:: Do the work in the expansion, not in the macro. +* Argument Evaluation:: The expansion should evaluate each macro arg once. +* Surprising Local Vars:: Local variable bindings in the expansion + require special care. +* Eval During Expansion:: Don't evaluate them; put them in the expansion. +* Repeated Expansion:: Avoid depending on how many times expansion is done. + +Writing Customization Definitions + +* Common Keywords:: Common keyword arguments for all kinds of + customization declarations. +* Group Definitions:: Writing customization group definitions. +* Variable Definitions:: Declaring user options. +* Customization Types:: Specifying the type of a user option. + +Customization Types + +* Simple Types:: Simple customization types: sexp, integer, number, + string, file, directory, alist. +* Composite Types:: Build new types from other types or data. +* Splicing into Lists:: Splice elements into list with @code{:inline}. +* Type Keywords:: Keyword-argument pairs in a customization type. +* Defining New Types:: Give your type a name. + +Loading + +* How Programs Do Loading:: The @code{load} function and others. +* Load Suffixes:: Details about the suffixes that @code{load} tries. +* Library Search:: Finding a library to load. +* Loading Non-ASCII:: Non-@acronym{ASCII} characters in Emacs Lisp files. +* Autoload:: Setting up a function to autoload. +* Repeated Loading:: Precautions about loading a file twice. +* Named Features:: Loading a library if it isn't already loaded. +* Where Defined:: Finding which file defined a certain symbol. +* Unloading:: How to "unload" a library that was loaded. +* Hooks for Loading:: Providing code to be run when + particular libraries are loaded. + +Byte Compilation + +* Speed of Byte-Code:: An example of speedup from byte compilation. +* Compilation Functions:: Byte compilation functions. +* Docs and Compilation:: Dynamic loading of documentation strings. +* Dynamic Loading:: Dynamic loading of individual functions. +* Eval During Compile:: Code to be evaluated when you compile. +* Compiler Errors:: Handling compiler error messages. +* Byte-Code Objects:: The data type used for byte-compiled functions. +* Disassembly:: Disassembling byte-code; how to read byte-code. + +Advising Emacs Lisp Functions + +* Simple Advice:: A simple example to explain the basics of advice. +* Defining Advice:: Detailed description of @code{defadvice}. +* Around-Advice:: Wrapping advice around a function's definition. +* Computed Advice:: ...is to @code{defadvice} as @code{fset} is to @code{defun}. +* Activation of Advice:: Advice doesn't do anything until you activate it. +* Enabling Advice:: You can enable or disable each piece of advice. +* Preactivation:: Preactivation is a way of speeding up the + loading of compiled advice. +* Argument Access in Advice:: How advice can access the function's arguments. +* Advising Primitives:: Accessing arguments when advising a primitive. +* Combined Definition:: How advice is implemented. + +Debugging Lisp Programs + +* Debugger:: How the Emacs Lisp debugger is implemented. +* Edebug:: A source-level Emacs Lisp debugger. +* Syntax Errors:: How to find syntax errors. +* Test Coverage:: Ensuring you have tested all branches in your code. +* Compilation Errors:: How to find errors that show up in + byte compilation. + +The Lisp Debugger + +* Error Debugging:: Entering the debugger when an error happens. +* Infinite Loops:: Stopping and debugging a program that doesn't exit. +* Function Debugging:: Entering it when a certain function is called. +* Explicit Debug:: Entering it at a certain point in the program. +* Using Debugger:: What the debugger does; what you see while in it. +* Debugger Commands:: Commands used while in the debugger. +* Invoking the Debugger:: How to call the function @code{debug}. +* Internals of Debugger:: Subroutines of the debugger, and global variables. + +Edebug + +* Using Edebug:: Introduction to use of Edebug. +* Instrumenting:: You must instrument your code + in order to debug it with Edebug. +* Edebug Execution Modes:: Execution modes, stopping more or less often. +* Jumping:: Commands to jump to a specified place. +* Edebug Misc:: Miscellaneous commands. +* Breaks:: Setting breakpoints to make the program stop. +* Trapping Errors:: Trapping errors with Edebug. +* Edebug Views:: Views inside and outside of Edebug. +* Edebug Eval:: Evaluating expressions within Edebug. +* Eval List:: Expressions whose values are displayed + each time you enter Edebug. +* Printing in Edebug:: Customization of printing. +* Trace Buffer:: How to produce trace output in a buffer. +* Coverage Testing:: How to test evaluation coverage. +* The Outside Context:: Data that Edebug saves and restores. +* Edebug and Macros:: Specifying how to handle macro calls. +* Edebug Options:: Option variables for customizing Edebug. + +Debugging Invalid Lisp Syntax + +* Excess Open:: How to find a spurious open paren or missing close. +* Excess Close:: How to find a spurious close paren or missing open. + +Reading and Printing Lisp Objects + +* Streams Intro:: Overview of streams, reading and printing. +* Input Streams:: Various data types that can be used as + input streams. +* Input Functions:: Functions to read Lisp objects from text. +* Output Streams:: Various data types that can be used as + output streams. +* Output Functions:: Functions to print Lisp objects as text. +* Output Variables:: Variables that control what the printing + functions do. + +Minibuffers + +* Intro to Minibuffers:: Basic information about minibuffers. +* Text from Minibuffer:: How to read a straight text string. +* Object from Minibuffer:: How to read a Lisp object or expression. +* Minibuffer History:: Recording previous minibuffer inputs + so the user can reuse them. +* Initial Input:: Specifying initial contents for the minibuffer. +* Completion:: How to invoke and customize completion. +* Yes-or-No Queries:: Asking a question with a simple answer. +* Multiple Queries:: Asking a series of similar questions. +* Reading a Password:: Reading a password from the terminal. +* Minibuffer Commands:: Commands used as key bindings in minibuffers. +* Minibuffer Contents:: How such commands access the minibuffer text. +* Minibuffer Windows:: Operating on the special minibuffer windows. +* Recursive Mini:: Whether recursive entry to minibuffer is allowed. +* Minibuffer Misc:: Various customization hooks and variables. + +Completion + +* Basic Completion:: Low-level functions for completing strings. + (These are too low level to use the minibuffer.) +* Minibuffer Completion:: Invoking the minibuffer with completion. +* Completion Commands:: Minibuffer commands that do completion. +* High-Level Completion:: Convenient special cases of completion + (reading buffer name, file name, etc.) +* Reading File Names:: Using completion to read file names. +* Programmed Completion:: Finding the completions for a given file name. + +Command Loop + +* Command Overview:: How the command loop reads commands. +* Defining Commands:: Specifying how a function should read arguments. +* Interactive Call:: Calling a command, so that it will read arguments. +* Command Loop Info:: Variables set by the command loop for you to examine. +* Adjusting Point:: Adjustment of point after a command. +* Input Events:: What input looks like when you read it. +* Reading Input:: How to read input events from the keyboard or mouse. +* Special Events:: Events processed immediately and individually. +* Waiting:: Waiting for user input or elapsed time. +* Quitting:: How @kbd{C-g} works. How to catch or defer quitting. +* Prefix Command Arguments:: How the commands to set prefix args work. +* Recursive Editing:: Entering a recursive edit, + and why you usually shouldn't. +* Disabling Commands:: How the command loop handles disabled commands. +* Command History:: How the command history is set up, and how accessed. +* Keyboard Macros:: How keyboard macros are implemented. + +Defining Commands + +* Using Interactive:: General rules for @code{interactive}. +* Interactive Codes:: The standard letter-codes for reading arguments + in various ways. +* Interactive Examples:: Examples of how to read interactive arguments. + +Input Events + +* Keyboard Events:: Ordinary characters--keys with symbols on them. +* Function Keys:: Function keys--keys with names, not symbols. +* Mouse Events:: Overview of mouse events. +* Click Events:: Pushing and releasing a mouse button. +* Drag Events:: Moving the mouse before releasing the button. +* Button-Down Events:: A button was pushed and not yet released. +* Repeat Events:: Double and triple click (or drag, or down). +* Motion Events:: Just moving the mouse, not pushing a button. +* Focus Events:: Moving the mouse between frames. +* Misc Events:: Other events the system can generate. +* Event Examples:: Examples of the lists for mouse events. +* Classifying Events:: Finding the modifier keys in an event symbol. +* Accessing Events:: Functions to extract info from events. +* Strings of Events:: Special considerations for putting + keyboard character events in a string. + +Reading Input + +* Key Sequence Input:: How to read one key sequence. +* Reading One Event:: How to read just one event. +* Event Mod:: How Emacs modifies events as they are read. +* Invoking the Input Method:: How reading an event uses the input method. +* Quoted Character Input:: Asking the user to specify a character. +* Event Input Misc:: How to reread or throw away input events. + +Keymaps + +* Key Sequences:: Key sequences as Lisp objects. +* Keymap Basics:: Basic concepts of keymaps. +* Format of Keymaps:: What a keymap looks like as a Lisp object. +* Creating Keymaps:: Functions to create and copy keymaps. +* Inheritance and Keymaps:: How one keymap can inherit the bindings + of another keymap. +* Prefix Keys:: Defining a key with a keymap as its definition. +* Active Keymaps:: How Emacs searches the active keymaps + for a key binding. +* Searching Keymaps:: A pseudo-Lisp summary of searching active maps. +* Controlling Active Maps:: Each buffer has a local keymap + to override the standard (global) bindings. + A minor mode can also override them. +* Key Lookup:: How extracting elements from keymaps works. +* Functions for Key Lookup:: How to request key lookup. +* Changing Key Bindings:: Redefining a key in a keymap. +* Remapping Commands:: A keymap can translate one command to another. +* Translation Keymaps:: Keymaps for translating sequences of events. +* Key Binding Commands:: Interactive interfaces for redefining keys. +* Scanning Keymaps:: Looking through all keymaps, for printing help. +* Menu Keymaps:: A keymap can define a menu for X + or for use from the terminal. +* Standard Keymaps:: List of standard keymaps. + +Major and Minor Modes + +* Hooks:: How to use hooks; how to write code that + provides hooks. +* Major Modes:: Defining major modes. +* Minor Modes:: Defining minor modes. +* Mode Line Format:: Customizing the text that appears in the mode line. +* Imenu:: How a mode can provide a menu + of definitions in the buffer. +* Font Lock Mode:: How modes can highlight text according to syntax. +* Desktop Save Mode:: How modes can have buffer state saved between + Emacs sessions. + +Menu Keymaps + +* Defining Menus:: How to make a keymap that defines a menu. +* Mouse Menus:: How users actuate the menu with the mouse. +* Keyboard Menus:: How users actuate the menu with the keyboard. +* Menu Example:: Making a simple menu. +* Menu Bar:: How to customize the menu bar. +* Tool Bar:: A tool bar is a row of images. +* Modifying Menus:: How to add new items to a menu. + +Defining Menus + +* Simple Menu Items:: A simple kind of menu key binding, + limited in capabilities. +* Extended Menu Items:: More powerful menu item definitions + let you specify keywords to enable + various features. +* Menu Separators:: Drawing a horizontal line through a menu. +* Alias Menu Items:: Using command aliases in menu items. + +Major and Minor Modes + +* Hooks:: How to use hooks; how to write code that provides hooks. +* Major Modes:: Defining major modes. +* Minor Modes:: Defining minor modes. +* Mode Line Format:: Customizing the text that appears in the mode line. +* Imenu:: How a mode can provide a menu + of definitions in the buffer. +* Font Lock Mode:: How modes can highlight text according to syntax. +* Desktop Save Mode:: How modes can have buffer state saved between + Emacs sessions. + +Major Modes + +* Major Mode Basics:: +* Major Mode Conventions:: Coding conventions for keymaps, etc. +* Example Major Modes:: Text mode and Lisp modes. +* Auto Major Mode:: How Emacs chooses the major mode automatically. +* Mode Help:: Finding out how to use a mode. +* Derived Modes:: Defining a new major mode based on another major + mode. +* Generic Modes:: Defining a simple major mode that supports + comment syntax and Font Lock mode. +* Mode Hooks:: Hooks run at the end of major mode functions. + +Minor Modes + +* Minor Mode Conventions:: Tips for writing a minor mode. +* Keymaps and Minor Modes:: How a minor mode can have its own keymap. +* Defining Minor Modes:: A convenient facility for defining minor modes. + +Mode Line Format + +* Mode Line Basics:: +* Mode Line Data:: The data structure that controls the mode line. +* Mode Line Variables:: Variables used in that data structure. +* %-Constructs:: Putting information into a mode line. +* Properties in Mode:: Using text properties in the mode line. +* Header Lines:: Like a mode line, but at the top. +* Emulating Mode Line:: Formatting text as the mode line would. + +Font Lock Mode + +* Font Lock Basics:: Overview of customizing Font Lock. +* Search-based Fontification:: Fontification based on regexps. +* Customizing Keywords:: Customizing search-based fontification. +* Other Font Lock Variables:: Additional customization facilities. +* Levels of Font Lock:: Each mode can define alternative levels + so that the user can select more or less. +* Precalculated Fontification:: How Lisp programs that produce the buffer + contents can also specify how to fontify it. +* Faces for Font Lock:: Special faces specifically for Font Lock. +* Syntactic Font Lock:: Fontification based on syntax tables. +* Setting Syntax Properties:: Defining character syntax based on context + using the Font Lock mechanism. +* Multiline Font Lock:: How to coerce Font Lock into properly + highlighting multiline constructs. + +Multiline Font Lock Constructs + +* Font Lock Multiline:: Marking multiline chunks with a text property +* Region to Fontify:: Controlling which region gets refontified + after a buffer change. + +Documentation + +* Documentation Basics:: Good style for doc strings. + Where to put them. How Emacs stores them. +* Accessing Documentation:: How Lisp programs can access doc strings. +* Keys in Documentation:: Substituting current key bindings. +* Describing Characters:: Making printable descriptions of + non-printing characters and key sequences. +* Help Functions:: Subroutines used by Emacs help facilities. + +Files + +* Visiting Files:: Reading files into Emacs buffers for editing. +* Saving Buffers:: Writing changed buffers back into files. +* Reading from Files:: Reading files into other buffers. +* Writing to Files:: Writing new files from parts of buffers. +* File Locks:: Locking and unlocking files, to prevent + simultaneous editing by two people. +* Information about Files:: Testing existence, accessibility, size of files. +* Changing Files:: Renaming files, changing protection, etc. +* File Names:: Decomposing and expanding file names. +* Contents of Directories:: Getting a list of the files in a directory. +* Create/Delete Dirs:: Creating and Deleting Directories. +* Magic File Names:: Defining "magic" special handling + for certain file names. +* Format Conversion:: Conversion to and from various file formats. + +Visiting Files + +* Visiting Functions:: The usual interface functions for visiting. +* Subroutines of Visiting:: Lower-level subroutines that they use. + +Information about Files + +* Testing Accessibility:: Is a given file readable? Writable? +* Kinds of Files:: Is it a directory? A symbolic link? +* Truenames:: Eliminating symbolic links from a file name. +* File Attributes:: How large is it? Any other names? Etc. +* Locating Files:: How to find a file in standard places. + +File Names + +* File Name Components:: The directory part of a file name, and the rest. +* Relative File Names:: Some file names are relative to a + current directory. +* Directory Names:: A directory's name as a directory + is different from its name as a file. +* File Name Expansion:: Converting relative file names to absolute ones. +* Unique File Names:: Generating names for temporary files. +* File Name Completion:: Finding the completions for a given file name. +* Standard File Names:: If your package uses a fixed file name, + how to handle various operating systems simply. + +Backups and Auto-Saving + +* Backup Files:: How backup files are made; how their names + are chosen. +* Auto-Saving:: How auto-save files are made; how their + names are chosen. +* Reverting:: @code{revert-buffer}, and how to customize + what it does. + +Backup Files + +* Making Backups:: How Emacs makes backup files, and when. +* Rename or Copy:: Two alternatives: renaming the old file + or copying it. +* Numbered Backups:: Keeping multiple backups for each source file. +* Backup Names:: How backup file names are computed; customization. + +Buffers + +* Buffer Basics:: What is a buffer? +* Current Buffer:: Designating a buffer as current + so primitives will access its contents. +* Buffer Names:: Accessing and changing buffer names. +* Buffer File Name:: The buffer file name indicates which file + is visited. +* Buffer Modification:: A buffer is @dfn{modified} if it needs to be saved. +* Modification Time:: Determining whether the visited file was changed + ``behind Emacs's back''. +* Read Only Buffers:: Modifying text is not allowed in a + read-only buffer. +* The Buffer List:: How to look at all the existing buffers. +* Creating Buffers:: Functions that create buffers. +* Killing Buffers:: Buffers exist until explicitly killed. +* Indirect Buffers:: An indirect buffer shares text with some + other buffer. +* Buffer Gap:: The gap in the buffer. + +Windows + +* Basic Windows:: Basic information on using windows. +* Splitting Windows:: Splitting one window into two windows. +* Deleting Windows:: Deleting a window gives its space to other windows. +* Selecting Windows:: The selected window is the one that you edit in. +* Cyclic Window Ordering:: Moving around the existing windows. +* Buffers and Windows:: Each window displays the contents of a buffer. +* Displaying Buffers:: Higher-level functions for displaying a buffer + and choosing a window for it. +* Choosing Window:: How to choose a window for displaying a buffer. +* Window Point:: Each window has its own location of point. +* Window Start:: The display-start position controls which text + is on-screen in the window. +* Textual Scrolling:: Moving text up and down through the window. +* Vertical Scrolling:: Moving the contents up and down on the window. +* Horizontal Scrolling:: Moving the contents sideways on the window. +* Size of Window:: Accessing the size of a window. +* Resizing Windows:: Changing the size of a window. +* Coordinates and Windows:: Converting coordinates to windows. +* Window Tree:: The layout and sizes of all windows in a frame. +* Window Configurations:: Saving and restoring the state of the screen. +* Window Hooks:: Hooks for scrolling, window size changes, + redisplay going past a certain point, + or window configuration changes. + +Frames + +* Creating Frames:: Creating additional frames. +* Multiple Displays:: Creating frames on other displays. +* Frame Parameters:: Controlling frame size, position, font, etc. +* Frame Titles:: Automatic updating of frame titles. +* Deleting Frames:: Frames last until explicitly deleted. +* Finding All Frames:: How to examine all existing frames. +* Frames and Windows:: A frame contains windows; + display of text always works through windows. +* Minibuffers and Frames:: How a frame finds the minibuffer to use. +* Input Focus:: Specifying the selected frame. +* Visibility of Frames:: Frames may be visible or invisible, or icons. +* Raising and Lowering:: Raising a frame makes it hide other windows; + lowering it puts it underneath the others. +* Frame Configurations:: Saving the state of all frames. +* Mouse Tracking:: Getting events that say when the mouse moves. +* Mouse Position:: Asking where the mouse is, or moving it. +* Pop-Up Menus:: Displaying a menu for the user to select from. +* Dialog Boxes:: Displaying a box to ask yes or no. +* Pointer Shape:: Specifying the shape of the mouse pointer. +* Window System Selections::Transferring text to and from other windows. +* Drag and Drop:: Internals of Drag-and-Drop implementation. +* Color Names:: Getting the definitions of color names. +* Text Terminal Colors:: Defining colors for text-only terminals. +* Resources:: Getting resource values from the server. +* Display Feature Testing:: Determining the features of a terminal. + +Frame Parameters + +* Parameter Access:: How to change a frame's parameters. +* Initial Parameters:: Specifying frame parameters when you make a frame. +* Window Frame Parameters:: List of frame parameters for window systems. +* Size and Position:: Changing the size and position of a frame. +* Geometry:: Parsing geometry specifications. + +Window Frame Parameters + +* Basic Parameters:: Parameters that are fundamental. +* Position Parameters:: The position of the frame on the screen. +* Size Parameters:: Frame's size. +* Layout Parameters:: Size of parts of the frame, and + enabling or disabling some parts. +* Buffer Parameters:: Which buffers have been or should be shown. +* Management Parameters:: Communicating with the window manager. +* Cursor Parameters:: Controlling the cursor appearance. +* Color Parameters:: Colors of various parts of the frame. + +Positions + +* Point:: The special position where editing takes place. +* Motion:: Changing point. +* Excursions:: Temporary motion and buffer changes. +* Narrowing:: Restricting editing to a portion of the buffer. + +Motion + +* Character Motion:: Moving in terms of characters. +* Word Motion:: Moving in terms of words. +* Buffer End Motion:: Moving to the beginning or end of the buffer. +* Text Lines:: Moving in terms of lines of text. +* Screen Lines:: Moving in terms of lines as displayed. +* List Motion:: Moving by parsing lists and sexps. +* Skipping Characters:: Skipping characters belonging to a certain set. + +Markers + +* Overview of Markers:: The components of a marker, and how it relocates. +* Predicates on Markers:: Testing whether an object is a marker. +* Creating Markers:: Making empty markers or markers at certain places. +* Information from Markers::Finding the marker's buffer or character + position. +* Marker Insertion Types:: Two ways a marker can relocate when you + insert where it points. +* Moving Markers:: Moving the marker to a new buffer or position. +* The Mark:: How "the mark" is implemented with a marker. +* The Region:: How to access "the region". + +Text + +* Near Point:: Examining text in the vicinity of point. +* Buffer Contents:: Examining text in a general fashion. +* Comparing Text:: Comparing substrings of buffers. +* Insertion:: Adding new text to a buffer. +* Commands for Insertion:: User-level commands to insert text. +* Deletion:: Removing text from a buffer. +* User-Level Deletion:: User-level commands to delete text. +* The Kill Ring:: Where removed text sometimes is saved for + later use. +* Undo:: Undoing changes to the text of a buffer. +* Maintaining Undo:: How to enable and disable undo information. + How to control how much information is kept. +* Filling:: Functions for explicit filling. +* Margins:: How to specify margins for filling commands. +* Adaptive Fill:: Adaptive Fill mode chooses a fill prefix + from context. +* Auto Filling:: How auto-fill mode is implemented to break lines. +* Sorting:: Functions for sorting parts of the buffer. +* Columns:: Computing horizontal positions, and using them. +* Indentation:: Functions to insert or adjust indentation. +* Case Changes:: Case conversion of parts of the buffer. +* Text Properties:: Assigning Lisp property lists to text characters. +* Substitution:: Replacing a given character wherever it appears. +* Transposition:: Swapping two portions of a buffer. +* Registers:: How registers are implemented. Accessing + the text or position stored in a register. +* Base 64:: Conversion to or from base 64 encoding. +* MD5 Checksum:: Compute the MD5 "message digest"/"checksum". +* Atomic Changes:: Installing several buffer changes "atomically". +* Change Hooks:: Supplying functions to be run when text is changed. + +The Kill Ring + +* Kill Ring Concepts:: What text looks like in the kill ring. +* Kill Functions:: Functions that kill text. +* Yanking:: How yanking is done. +* Yank Commands:: Commands that access the kill ring. +* Low-Level Kill Ring:: Functions and variables for kill ring access. +* Internals of Kill Ring:: Variables that hold kill-ring data. + +Indentation + +* Primitive Indent:: Functions used to count and insert indentation. +* Mode-Specific Indent:: Customize indentation for different modes. +* Region Indent:: Indent all the lines in a region. +* Relative Indent:: Indent the current line based on previous lines. +* Indent Tabs:: Adjustable, typewriter-like tab stops. +* Motion by Indent:: Move to first non-blank character. + +Text Properties + +* Examining Properties:: Looking at the properties of one character. +* Changing Properties:: Setting the properties of a range of text. +* Property Search:: Searching for where a property changes value. +* Special Properties:: Particular properties with special meanings. +* Format Properties:: Properties for representing formatting of text. +* Sticky Properties:: How inserted text gets properties from + neighboring text. +* Saving Properties:: Saving text properties in files, and reading + them back. +* Lazy Properties:: Computing text properties in a lazy fashion + only when text is examined. +* Clickable Text:: Using text properties to make regions of text + do something when you click on them. +* Links and Mouse-1:: How to make @key{Mouse-1} follow a link. +* Fields:: The @code{field} property defines + fields within the buffer. +* Not Intervals:: Why text properties do not use + Lisp-visible text intervals. + +Non-ASCII Characters + +* Text Representations:: Unibyte and multibyte representations +* Converting Representations:: Converting unibyte to multibyte and vice versa. +* Selecting a Representation:: Treating a byte sequence as unibyte or multi. +* Character Codes:: How unibyte and multibyte relate to + codes of individual characters. +* Character Sets:: The space of possible character codes + is divided into various character sets. +* Chars and Bytes:: More information about multibyte encodings. +* Splitting Characters:: Converting a character to its byte sequence. +* Scanning Charsets:: Which character sets are used in a buffer? +* Translation of Characters:: Translation tables are used for conversion. +* Coding Systems:: Coding systems are conversions for saving files. +* Input Methods:: Input methods allow users to enter various + non-ASCII characters without special keyboards. +* Locales:: Interacting with the POSIX locale. + +Coding Systems + +* Coding System Basics:: Basic concepts. +* Encoding and I/O:: How file I/O functions handle coding systems. +* Lisp and Coding Systems:: Functions to operate on coding system names. +* User-Chosen Coding Systems:: Asking the user to choose a coding system. +* Default Coding Systems:: Controlling the default choices. +* Specifying Coding Systems:: Requesting a particular coding system + for a single file operation. +* Explicit Encoding:: Encoding or decoding text without doing I/O. +* Terminal I/O Encoding:: Use of encoding for terminal I/O. +* MS-DOS File Types:: How DOS "text" and "binary" files + relate to coding systems. + +Searching and Matching + +* String Search:: Search for an exact match. +* Searching and Case:: Case-independent or case-significant searching. +* Regular Expressions:: Describing classes of strings. +* Regexp Search:: Searching for a match for a regexp. +* POSIX Regexps:: Searching POSIX-style for the longest match. +* Match Data:: Finding out which part of the text matched, + after a string or regexp search. +* Search and Replace:: Commands that loop, searching and replacing. +* Standard Regexps:: Useful regexps for finding sentences, pages,... + +Regular Expressions + +* Syntax of Regexps:: Rules for writing regular expressions. +* Regexp Example:: Illustrates regular expression syntax. +* Regexp Functions:: Functions for operating on regular expressions. + +Syntax of Regular Expressions + +* Regexp Special:: Special characters in regular expressions. +* Char Classes:: Character classes used in regular expressions. +* Regexp Backslash:: Backslash-sequences in regular expressions. + +The Match Data + +* Replacing Match:: Replacing a substring that was matched. +* Simple Match Data:: Accessing single items of match data, + such as where a particular subexpression started. +* Entire Match Data:: Accessing the entire match data at once, as a list. +* Saving Match Data:: Saving and restoring the match data. + +Syntax Tables + +* Syntax Basics:: Basic concepts of syntax tables. +* Syntax Descriptors:: How characters are classified. +* Syntax Table Functions:: How to create, examine and alter syntax tables. +* Syntax Properties:: Overriding syntax with text properties. +* Motion and Syntax:: Moving over characters with certain syntaxes. +* Parsing Expressions:: Parsing balanced expressions + using the syntax table. +* Standard Syntax Tables:: Syntax tables used by various major modes. +* Syntax Table Internals:: How syntax table information is stored. +* Categories:: Another way of classifying character syntax. + +Syntax Descriptors + +* Syntax Class Table:: Table of syntax classes. +* Syntax Flags:: Additional flags each character can have. + +Parsing Expressions + +* Motion via Parsing:: Motion functions that work by parsing. +* Position Parse:: Determining the syntactic state of a position. +* Parser State:: How Emacs represents a syntactic state. +* Low-Level Parsing:: Parsing across a specified region. +* Control Parsing:: Parameters that affect parsing. + +Abbrevs And Abbrev Expansion + +* Abbrev Mode:: Setting up Emacs for abbreviation. +* Abbrev Tables:: Creating and working with abbrev tables. +* Defining Abbrevs:: Specifying abbreviations and their expansions. +* Abbrev Files:: Saving abbrevs in files. +* Abbrev Expansion:: Controlling expansion; expansion subroutines. +* Standard Abbrev Tables:: Abbrev tables used by various major modes. + +Processes + +* Subprocess Creation:: Functions that start subprocesses. +* Shell Arguments:: Quoting an argument to pass it to a shell. +* Synchronous Processes:: Details of using synchronous subprocesses. +* Asynchronous Processes:: Starting up an asynchronous subprocess. +* Deleting Processes:: Eliminating an asynchronous subprocess. +* Process Information:: Accessing run-status and other attributes. +* Input to Processes:: Sending input to an asynchronous subprocess. +* Signals to Processes:: Stopping, continuing or interrupting + an asynchronous subprocess. +* Output from Processes:: Collecting output from an asynchronous subprocess. +* Sentinels:: Sentinels run when process run-status changes. +* Query Before Exit:: Whether to query if exiting will kill a process. +* Transaction Queues:: Transaction-based communication with subprocesses. +* Network:: Opening network connections. +* Network Servers:: Network servers let Emacs accept net connections. +* Datagrams:: UDP network connections. +* Low-Level Network:: Lower-level but more general function + to create connections and servers. +* Misc Network:: Additional relevant functions for network connections. +* Byte Packing:: Using bindat to pack and unpack binary data. + +Receiving Output from Processes + +* Process Buffers:: If no filter, output is put in a buffer. +* Filter Functions:: Filter functions accept output from the process. +* Decoding Output:: Filters can get unibyte or multibyte strings. +* Accepting Output:: How to wait until process output arrives. + +Low-Level Network Access + +* Proc: Network Processes. Using @code{make-network-process}. +* Options: Network Options. Further control over network connections. +* Features: Network Feature Testing. + Determining which network features work on + the machine you are using. + +Packing and Unpacking Byte Arrays + +* Bindat Spec:: Describing data layout. +* Bindat Functions:: Doing the unpacking and packing. +* Bindat Examples:: Samples of what bindat.el can do for you! + +Emacs Display + +* Refresh Screen:: Clearing the screen and redrawing everything on it. +* Forcing Redisplay:: Forcing redisplay. +* Truncation:: Folding or wrapping long text lines. +* The Echo Area:: Displaying messages at the bottom of the screen. +* Warnings:: Displaying warning messages for the user. +* Invisible Text:: Hiding part of the buffer text. +* Selective Display:: Hiding part of the buffer text (the old way). +* Temporary Displays:: Displays that go away automatically. +* Overlays:: Use overlays to highlight parts of the buffer. +* Width:: How wide a character or string is on the screen. +* Line Height:: Controlling the height of lines. +* Faces:: A face defines a graphics style + for text characters: font, colors, etc. +* Fringes:: Controlling window fringes. +* Scroll Bars:: Controlling vertical scroll bars. +* Display Property:: Enabling special display features. +* Images:: Displaying images in Emacs buffers. +* Buttons:: Adding clickable buttons to Emacs buffers. +* Abstract Display:: Emacs' Widget for Object Collections. +* Blinking:: How Emacs shows the matching open parenthesis. +* Usual Display:: The usual conventions for displaying nonprinting chars. +* Display Tables:: How to specify other conventions. +* Beeping:: Audible signal to the user. +* Window Systems:: Which window system is being used. + +The Echo Area + +* Displaying Messages:: Explicitly displaying text in the echo area. +* Progress:: Informing user about progress of a long operation. +* Logging Messages:: Echo area messages are logged for the user. +* Echo Area Customization:: Controlling the echo area. + +Reporting Warnings + +* Warning Basics:: Warnings concepts and functions to report them. +* Warning Variables:: Variables programs bind to customize their warnings. +* Warning Options:: Variables users set to control display of warnings. + +Overlays + +* Managing Overlays:: Creating and moving overlays. +* Overlay Properties:: How to read and set properties. + What properties do to the screen display. +* Finding Overlays:: Searching for overlays. + +Faces + +* Defining Faces:: How to define a face with @code{defface}. +* Face Attributes:: What is in a face? +* Attribute Functions:: Functions to examine and set face attributes. +* Displaying Faces:: How Emacs combines the faces specified for + a character. +* Font Selection:: Finding the best available font for a face. +* Face Functions:: How to define and examine faces. +* Auto Faces:: Hook for automatic face assignment. +* Font Lookup:: Looking up the names of available fonts + and information about them. +* Fontsets:: A fontset is a collection of fonts + that handle a range of character sets. + +Fringes + +* Fringe Size/Pos:: Specifying where to put the window fringes. +* Fringe Indicators:: Displaying indicator icons in the window fringes. +* Fringe Cursors:: Displaying cursors in the right fringe. +* Fringe Bitmaps:: Specifying bitmaps for fringe indicators. +* Customizing Bitmaps:: Specifying your own bitmaps to use in the fringes. +* Overlay Arrow:: Display of an arrow to indicate position. + +The @code{display} Property + +* Specified Space:: Displaying one space with a specified width. +* Pixel Specification:: Specifying space width or height in pixels. +* Other Display Specs:: Displaying an image; magnifying text; moving it + up or down on the page; adjusting the width + of spaces within text. +* Display Margins:: Displaying text or images to the side of + the main text. + +Images + +* Image Descriptors:: How to specify an image for use in @code{:display}. +* XBM Images:: Special features for XBM format. +* XPM Images:: Special features for XPM format. +* GIF Images:: Special features for GIF format. +* PostScript Images:: Special features for PostScript format. +* Other Image Types:: Various other formats are supported. +* Defining Images:: Convenient ways to define an image for later use. +* Showing Images:: Convenient ways to display an image once + it is defined. +* Image Cache:: Internal mechanisms of image display. + +Buttons + +* Button Properties:: Button properties with special meanings. +* Button Types:: Defining common properties for classes of buttons. +* Making Buttons:: Adding buttons to Emacs buffers. +* Manipulating Buttons:: Getting and setting properties of buttons. +* Button Buffer Commands:: Buffer-wide commands and bindings for buttons. + +Abstract Display + +* Abstract Display Functions:: Functions in the Ewoc package. +* Abstract Display Example:: Example of using Ewoc. + +Display Tables + +* Display Table Format:: What a display table consists of. +* Active Display Table:: How Emacs selects a display table to use. +* Glyphs:: How to define a glyph, and what glyphs mean. + +Operating System Interface + +* Starting Up:: Customizing Emacs start-up processing. +* Getting Out:: How exiting works (permanent or temporary). +* System Environment:: Distinguish the name and kind of system. +* User Identification:: Finding the name and user id of the user. +* Time of Day:: Getting the current time. +* Time Conversion:: Converting a time from numeric form to a string, or + to calendrical data (or vice versa). +* Time Parsing:: Converting a time from numeric form to text + and vice versa. +* Processor Run Time:: Getting the run time used by Emacs. +* Time Calculations:: Adding, subtracting, comparing times, etc. +* Timers:: Setting a timer to call a function at a certain time. +* Idle Timers:: Setting a timer to call a function when Emacs has + been idle for a certain length of time. +* Terminal Input:: Accessing and recording terminal input. +* Terminal Output:: Controlling and recording terminal output. +* Sound Output:: Playing sounds on the computer's speaker. +* X11 Keysyms:: Operating on key symbols for X Windows +* Batch Mode:: Running Emacs without terminal interaction. +* Session Management:: Saving and restoring state with X Session Management. + +Starting Up Emacs + +* Startup Summary:: Sequence of actions Emacs performs at start-up. +* Init File:: Details on reading the init file (@file{.emacs}). +* Terminal-Specific:: How the terminal-specific Lisp file is read. +* Command-Line Arguments:: How command-line arguments are processed, + and how you can customize them. + +Getting Out of Emacs + +* Killing Emacs:: Exiting Emacs irreversibly. +* Suspending Emacs:: Exiting Emacs reversibly. + +Terminal Input + +* Input Modes:: Options for how input is processed. +* Recording Input:: Saving histories of recent or all input events. + +Tips and Conventions + +* Coding Conventions:: Conventions for clean and robust programs. +* Key Binding Conventions:: Which keys should be bound by which programs. +* Programming Tips:: Making Emacs code fit smoothly in Emacs. +* Compilation Tips:: Making compiled code run fast. +* Warning Tips:: Turning off compiler warnings. +* Documentation Tips:: Writing readable documentation strings. +* Comment Tips:: Conventions for writing comments. +* Library Headers:: Standard headers for library packages. + +GNU Emacs Internals + +* Building Emacs:: How the dumped Emacs is made. +* Pure Storage:: A kludge to make preloaded Lisp functions sharable. +* Garbage Collection:: Reclaiming space for Lisp objects no longer used. +* Memory Usage:: Info about total size of Lisp objects made so far. +* Writing Emacs Primitives:: Writing C code for Emacs. +* Object Internals:: Data formats of buffers, windows, processes. + +Object Internals + +* Buffer Internals:: Components of a buffer structure. +* Window Internals:: Components of a window structure. +* Process Internals:: Components of a process structure. +@end detailmenu +@end menu + +@c include intro.texi +@c include objects.texi +@c include numbers.texi +@c include strings.texi + +@c include lists.texi +@c include sequences.texi +@c include hash.texi +@c include symbols.texi +@c include eval.texi + +@c include control.texi +@c include variables.texi +@c include functions.texi +@c include macros.texi + +@c include customize.texi +@c include loading.texi +@c include compile.texi +@c include advice.texi + +@c include debugging.texi +@c include streams.texi +@c include minibuf.texi +@c include commands.texi + +@c include keymaps.texi +@c include modes.texi +@c include help.texi +@c include files.texi + +@c include backups.texi + +@c ================ Beginning of Volume 2 ================ +@include buffers.texi +@include windows.texi +@include frames.texi + +@include positions.texi +@include markers.texi +@include text.texi +@include nonascii.texi + +@include searching.texi +@include syntax.texi +@include abbrevs.texi +@include processes.texi + +@include display.texi +@include os.texi + +@c MOVE to Emacs Manual: include misc-modes.texi + +@c appendices + +@c REMOVE this: include non-hacker.texi + +@include anti.texi +@include doclicense.texi +@include gpl.texi +@include tips.texi +@include internals.texi +@include errors.texi +@include locals.texi +@include maps.texi +@include hooks.texi + +@include index.texi + +@ignore +@node New Symbols, , Index, Top +@unnumbered New Symbols Since the Previous Edition + +@printindex tp +@end ignore + +@bye + + +These words prevent "local variables" above from confusing Emacs. + +@ignore + arch-tag: dfdbecf8-fec2-49c1-8427-3e8ac8b0b849 +@end ignore diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi new file mode 100644 index 00000000000..bd8f7bc2d36 --- /dev/null +++ b/doc/lispref/windows.texi @@ -0,0 +1,2446 @@ +@c -*-texinfo-*- +@c This is part of the GNU Emacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, +@c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +@c See the file elisp.texi for copying conditions. +@setfilename ../info/windows +@node Windows, Frames, Buffers, Top +@chapter Windows + + This chapter describes most of the functions and variables related to +Emacs windows. See @ref{Display}, for information on how text is +displayed in windows. + +@menu +* Basic Windows:: Basic information on using windows. +* Splitting Windows:: Splitting one window into two windows. +* Deleting Windows:: Deleting a window gives its space to other windows. +* Selecting Windows:: The selected window is the one that you edit in. +* Cyclic Window Ordering:: Moving around the existing windows. +* Buffers and Windows:: Each window displays the contents of a buffer. +* Displaying Buffers:: Higher-level functions for displaying a buffer + and choosing a window for it. +* Choosing Window:: How to choose a window for displaying a buffer. +* Window Point:: Each window has its own location of point. +* Window Start:: The display-start position controls which text + is on-screen in the window. +* Textual Scrolling:: Moving text up and down through the window. +* Vertical Scrolling:: Moving the contents up and down on the window. +* Horizontal Scrolling:: Moving the contents sideways on the window. +* Size of Window:: Accessing the size of a window. +* Resizing Windows:: Changing the size of a window. +* Coordinates and Windows:: Converting coordinates to windows. +* Window Tree:: The layout and sizes of all windows in a frame. +* Window Configurations:: Saving and restoring the state of the screen. +* Window Hooks:: Hooks for scrolling, window size changes, + redisplay going past a certain point, + or window configuration changes. +@end menu + +@node Basic Windows +@section Basic Concepts of Emacs Windows +@cindex window +@cindex selected window + + A @dfn{window} in Emacs is the physical area of the screen in which a +buffer is displayed. The term is also used to refer to a Lisp object that +represents that screen area in Emacs Lisp. It should be +clear from the context which is meant. + + Emacs groups windows into frames. A frame represents an area of +screen available for Emacs to use. Each frame always contains at least +one window, but you can subdivide it vertically or horizontally into +multiple nonoverlapping Emacs windows. + + In each frame, at any time, one and only one window is designated as +@dfn{selected within the frame}. The frame's cursor appears in that +window, but the other windows have ``non-selected'' cursors, normally +less visible. At any time, one frame is the selected frame; and the +window selected within that frame is @dfn{the selected window}. The +selected window's buffer is usually the current buffer (except when +@code{set-buffer} has been used). @xref{Current Buffer}. + +@defvar cursor-in-non-selected-windows +If this variable is @code{nil}, Emacs displays only one cursor, +in the selected window. Other windows have no cursor at all. +@end defvar + + For practical purposes, a window exists only while it is displayed in +a frame. Once removed from the frame, the window is effectively deleted +and should not be used, @emph{even though there may still be references +to it} from other Lisp objects. Restoring a saved window configuration +is the only way for a window no longer on the screen to come back to +life. (@xref{Deleting Windows}.) + + Each window has the following attributes: + +@itemize @bullet +@item +containing frame + +@item +window height + +@item +window width + +@item +window edges with respect to the screen or frame + +@item +the buffer it displays + +@item +position within the buffer at the upper left of the window + +@item +amount of horizontal scrolling, in columns + +@item +point + +@item +the mark + +@item +how recently the window was selected + +@item +fringe settings + +@item +display margins + +@item +scroll-bar settings +@end itemize + +@cindex multiple windows + Users create multiple windows so they can look at several buffers at +once. Lisp libraries use multiple windows for a variety of reasons, but +most often to display related 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. + + The meaning of ``window'' in Emacs is similar to what it means in the +context of general-purpose window systems such as X, but not identical. +The X Window System places X windows on the screen; Emacs uses one or +more X windows as frames, and subdivides them into +Emacs windows. When you use Emacs on a character-only terminal, Emacs +treats the whole terminal screen as one frame. + +@cindex terminal screen +@cindex screen of terminal +@cindex tiled windows + Most window systems support arbitrarily located overlapping windows. +In contrast, Emacs windows are @dfn{tiled}; they never overlap, and +together they fill the whole screen or frame. Because of the way in +which Emacs creates new windows and resizes them, not all conceivable +tilings of windows on an Emacs frame are actually possible. +@xref{Splitting Windows}, and @ref{Size of Window}. + + @xref{Display}, for information on how the contents of the +window's buffer are displayed in the window. + +@defun windowp object +This function returns @code{t} if @var{object} is a window. +@end defun + +@node Splitting Windows +@section Splitting Windows +@cindex splitting windows +@cindex window splitting + + 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: @code{pop-to-buffer} and @code{display-buffer} +(@pxref{Displaying Buffers}). + + The functions described here do not accept a buffer as an argument. +The two ``halves'' of the split window initially display the same buffer +previously visible in the window that was split. + +@deffn Command split-window &optional window size horizontal +This function splits a new window out of @var{window}'s screen area. +It returns the new window. + +If @var{horizontal} is non-@code{nil}, then @var{window} splits into +two side by side windows. The original window @var{window} keeps the +leftmost @var{size} columns, and gives the rest of the columns to the +new window. Otherwise, it splits into windows one above the other, and +@var{window} keeps the upper @var{size} lines and gives the rest of the +lines to the new window. The original window is therefore the +left-hand or upper of the two, and the new window is the right-hand or +lower. + +If @var{window} is omitted or @code{nil}, that stands for the selected +window. When you split the selected window, it remains selected. + +If @var{size} is omitted or @code{nil}, then @var{window} is divided +evenly into two parts. (If there is an odd line, it is allocated to +the new window.) When @code{split-window} is called interactively, +all its arguments are @code{nil}. + +If splitting would result in making a window that is smaller than +@code{window-min-height} or @code{window-min-width}, the function +signals an error and does not split the window at all. + +The following example starts with one window on a screen that is 50 +lines high by 80 columns wide; then it splits the window. + +@smallexample +@group +(setq w (selected-window)) + @result{} #<window 8 on windows.texi> +(window-edges) ; @r{Edges in order:} + @result{} (0 0 80 50) ; @r{left--top--right--bottom} +@end group + +@group +;; @r{Returns window created} +(setq w2 (split-window w 15)) + @result{} #<window 28 on windows.texi> +@end group +@group +(window-edges w2) + @result{} (0 15 80 50) ; @r{Bottom window;} + ; @r{top is line 15} +@end group +@group +(window-edges w) + @result{} (0 0 80 15) ; @r{Top window} +@end group +@end smallexample + +The screen looks like this: + +@smallexample +@group + __________ + | | line 0 + | w | + |__________| + | | line 15 + | w2 | + |__________| + line 50 + column 0 column 80 +@end group +@end smallexample + +Next, split the top window horizontally: + +@smallexample +@group +(setq w3 (split-window w 35 t)) + @result{} #<window 32 on windows.texi> +@end group +@group +(window-edges w3) + @result{} (35 0 80 15) ; @r{Left edge at column 35} +@end group +@group +(window-edges w) + @result{} (0 0 35 15) ; @r{Right edge at column 35} +@end group +@group +(window-edges w2) + @result{} (0 15 80 50) ; @r{Bottom window unchanged} +@end group +@end smallexample + +@need 3000 +Now the screen looks like this: + +@smallexample +@group + column 35 + __________ + | | | line 0 + | w | w3 | + |___|______| + | | line 15 + | w2 | + |__________| + line 50 + column 0 column 80 +@end group +@end smallexample + +Normally, Emacs indicates the border between two side-by-side windows +with a scroll bar (@pxref{Layout Parameters,Scroll Bars}) or @samp{|} +characters. The display table can specify alternative border +characters; see @ref{Display Tables}. +@end deffn + +@deffn Command split-window-vertically &optional size +This function splits the selected window into two windows, one above the +other, leaving the upper of the two windows selected, with @var{size} +lines. (If @var{size} is negative, then the lower of the two windows +gets @minus{} @var{size} lines and the upper window gets the rest, but +the upper window is still the one selected.) However, if +@code{split-window-keep-point} (see below) is @code{nil}, then either +window can be selected. + +In other respects, this function is similar to @code{split-window}. +In particular, the upper window is the original one and the return +value is the new, lower window. +@end deffn + +@defopt split-window-keep-point +If this variable is non-@code{nil} (the default), then +@code{split-window-vertically} behaves as described above. + +If it is @code{nil}, then @code{split-window-vertically} adjusts point +in each of the two windows to avoid scrolling. (This is useful on +slow terminals.) It selects whichever window contains the screen line +that point was previously on. + +This variable only affects the behavior of @code{split-window-vertically}. +It has no effect on the other functions described here. +@end defopt + +@deffn Command split-window-horizontally &optional size +This function splits the selected window into two windows +side-by-side, leaving the selected window on the left with @var{size} +columns. If @var{size} is negative, the rightmost window gets +@minus{} @var{size} columns, but the leftmost window still remains +selected. + +This function is basically an interface to @code{split-window}. +You could define a simplified version of the function like this: + +@smallexample +@group +(defun split-window-horizontally (&optional arg) + "Split selected window into two windows, side by side..." + (interactive "P") +@end group +@group + (let ((size (and arg (prefix-numeric-value arg)))) + (and size (< size 0) + (setq size (+ (window-width) size))) + (split-window nil size t))) +@end group +@end smallexample +@end deffn + +@defun one-window-p &optional no-mini all-frames +This function returns non-@code{nil} if there is only one window. The +argument @var{no-mini}, if non-@code{nil}, means don't count the +minibuffer even if it is active; otherwise, the minibuffer window is +counted when it is active. + +The argument @var{all-frames} specifies which frames to consider. Here +are the possible values and their meanings: + +@table @asis +@item @code{nil} +Count the windows in the selected frame, plus the minibuffer used +by that frame even if it lies in some other frame. + +@item @code{t} +Count all windows in all existing frames. + +@item @code{visible} +Count all windows in all visible frames. + +@item 0 +Count all windows in all visible or iconified frames. + +@item anything else +Count precisely the windows in the selected frame, and no others. +@end table +@end defun + +@node Deleting Windows +@section Deleting Windows +@cindex deleting windows + +A window remains visible on its frame unless you @dfn{delete} it by +calling certain functions that delete windows. A deleted window cannot +appear on the screen, but continues to exist as a Lisp object until +there are no references to it. There is no way to cancel the deletion +of a window aside from restoring a saved window configuration +(@pxref{Window Configurations}). Restoring a window configuration also +deletes any windows that aren't part of that configuration. + + When you delete a window, the space it took up is given to one +adjacent sibling. + +@c Emacs 19 feature +@defun window-live-p window +This function returns @code{nil} if @var{window} is deleted, and +@code{t} otherwise. + +@strong{Warning:} Erroneous information or fatal errors may result from +using a deleted window as if it were live. +@end defun + +@deffn Command delete-window &optional window +This function removes @var{window} from display, and returns @code{nil}. +If @var{window} is omitted, then the selected window is deleted. An +error is signaled if there is only one window when @code{delete-window} +is called. +@end deffn + +@deffn Command delete-other-windows &optional window +This function makes @var{window} the only window on its frame, by +deleting the other windows in that frame. If @var{window} is omitted or +@code{nil}, then the selected window is used by default. + +The return value is @code{nil}. +@end deffn + +@deffn Command delete-windows-on buffer-or-name &optional frame +This function deletes all windows showing @var{buffer-or-name}. If +there are no windows showing @var{buffer-or-name}, it does nothing. +@var{buffer-or-name} must be a buffer or the name of an existing +buffer. + +@code{delete-windows-on} operates frame by frame. If a frame has +several windows showing different buffers, then those showing +@var{buffer-or-name} are removed, and the others expand to fill the +space. If all windows in some frame are showing @var{buffer-or-name} +(including the case where there is only one window), then the frame +winds up with a single window showing another buffer chosen with +@code{other-buffer}. @xref{The Buffer List}. + +The argument @var{frame} controls which frames to operate on. This +function does not use it in quite the same way as the other functions +which scan all windows; specifically, the values @code{t} and @code{nil} +have the opposite of their meanings in other functions. Here are the +full details: + +@itemize @bullet +@item +If it is @code{nil}, operate on all frames. +@item +If it is @code{t}, operate on the selected frame. +@item +If it is @code{visible}, operate on all visible frames. +@item +If it is 0, operate on all visible or iconified frames. +@item +If it is a frame, operate on that frame. +@end itemize + +This function always returns @code{nil}. +@end deffn + +@node Selecting Windows +@section Selecting Windows +@cindex selecting a window + + When a window is selected, the buffer in the window becomes the current +buffer, and the cursor will appear in it. + +@defun selected-window +This function returns the selected window. This is the window in +which the cursor appears and to which many commands apply. +@end defun + +@defun select-window window &optional norecord +This function makes @var{window} the selected window. The cursor then +appears in @var{window} (on redisplay). Unless @var{window} was +already selected, @code{select-window} makes @var{window}'s buffer the +current buffer. + +Normally @var{window}'s selected buffer is moved to the front of the +buffer list, but if @var{norecord} is non-@code{nil}, the buffer list +order is unchanged. + +The return value is @var{window}. + +@example +@group +(setq w (next-window)) +(select-window w) + @result{} #<window 65 on windows.texi> +@end group +@end example +@end defun + +@defmac save-selected-window forms@dots{} +This macro records the selected frame, as well as the selected window +of each frame, executes @var{forms} in sequence, then restores the +earlier selected frame and windows. It also saves and restores the +current buffer. It returns the value of the last form in @var{forms}. + +This macro does not save or restore anything about the sizes, +arrangement or contents of windows; therefore, if the @var{forms} +change them, the change persists. If the previously selected window +of some frame is no longer live at the time of exit from @var{forms}, +that frame's selected window is left alone. If the previously +selected window is no longer live, then whatever window is selected at +the end of @var{forms} remains selected. +@end defmac + +@defmac with-selected-window window forms@dots{} +This macro selects @var{window} (without changing the buffer list), +executes @var{forms} in sequence, then restores the previously +selected window and current buffer. It is just like +@code{save-selected-window}, except that it explicitly selects +@var{window}, also without altering the buffer list sequence. +@end defmac + +@cindex finding windows + The following functions choose one of the windows on the screen, +offering various criteria for the choice. + +@defun get-lru-window &optional frame dedicated +This function returns the window least recently ``used'' (that is, +selected). If any full-width windows are present, it only considers +these. 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. A minibuffer window is never a +candidate. Dedicated windows are never candidates unless the +@var{dedicated} argument is non-@code{nil}, so if all +existing windows are dedicated, the value is @code{nil}. + +The argument @var{frame} controls which windows are considered. + +@itemize @bullet +@item +If it is @code{nil}, consider windows on the selected frame. +@item +If it is @code{t}, consider windows on all frames. +@item +If it is @code{visible}, consider windows on all visible frames. +@item +If it is 0, consider windows on all visible or iconified frames. +@item +If it is a frame, consider windows on that frame. +@end itemize +@end defun + +@defun get-largest-window &optional frame dedicated +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. A minibuffer window is never a candidate. +Dedicated windows are never candidates unless the +@var{dedicated} argument is non-@code{nil}, so if all existing windows +are dedicated, the value is @code{nil}. + +If there are two candidate windows of the same size, this function +prefers the one that comes first in the cyclic ordering of windows +(see following section), starting from the selected window. + +The argument @var{frame} controls which set of windows to +consider. See @code{get-lru-window}, above. +@end defun + +@cindex window that satisfies a predicate +@cindex conditional selection of windows +@defun get-window-with-predicate predicate &optional minibuf all-frames default +This function returns a window satisfying @var{predicate}. It cycles +through all visible windows using @code{walk-windows} (@pxref{Cyclic +Window Ordering}), calling @var{predicate} on each one of them +with that window as its argument. The function returns the first +window for which @var{predicate} returns a non-@code{nil} value; if +that never happens, it returns @var{default}. + +The optional arguments @var{minibuf} and @var{all-frames} specify the +set of windows to include in the scan. See the description of +@code{next-window} in @ref{Cyclic Window Ordering}, for details. +@end defun + +@node Cyclic Window Ordering +@comment node-name, next, previous, up +@section Cyclic Ordering of Windows +@cindex cyclic ordering of windows +@cindex ordering of windows, cyclic +@cindex window ordering, cyclic + + When you use the command @kbd{C-x o} (@code{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 @dfn{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 windows were split. + + If the first split was vertical (into windows one above each other), +and then the subwindows were split horizontally, then the ordering is +left to right in the top of the frame, and then left to right in the +next lower part of the frame, and so on. If the first split was +horizontal, 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. + +@defun next-window &optional window minibuf all-frames +@cindex minibuffer window, and @code{next-window} +This function returns the window following @var{window} in the cyclic +ordering of windows. This is the window that @kbd{C-x o} would select +if typed when @var{window} is selected. If @var{window} is the only +window visible, then this function returns @var{window}. If omitted, +@var{window} defaults to the selected window. + +The value of the argument @var{minibuf} determines whether the +minibuffer is included in the window order. Normally, when +@var{minibuf} is @code{nil}, the minibuffer is included if it is +currently active; this is the behavior of @kbd{C-x o}. (The minibuffer +window is active while the minibuffer is in use. @xref{Minibuffers}.) + +If @var{minibuf} is @code{t}, then the cyclic ordering includes the +minibuffer window even if it is not active. + +If @var{minibuf} is neither @code{t} nor @code{nil}, then the minibuffer +window is not included even if it is active. + +The argument @var{all-frames} specifies which frames to consider. Here +are the possible values and their meanings: + +@table @asis +@item @code{nil} +Consider all the windows in @var{window}'s frame, plus the minibuffer +used by that frame even if it lies in some other frame. If the +minibuffer counts (as determined by @var{minibuf}), then all windows on +all frames that share that minibuffer count too. + +@item @code{t} +Consider all windows in all existing frames. + +@item @code{visible} +Consider all windows in all visible frames. (To get useful results, you +must ensure @var{window} is in a visible frame.) + +@item 0 +Consider all windows in all visible or iconified frames. + +@item a frame +Consider all windows on that frame. + +@item anything else +Consider precisely the windows in @var{window}'s frame, and no others. +@end table + +This example assumes there are two windows, both displaying the +buffer @samp{windows.texi}: + +@example +@group +(selected-window) + @result{} #<window 56 on windows.texi> +@end group +@group +(next-window (selected-window)) + @result{} #<window 52 on windows.texi> +@end group +@group +(next-window (next-window (selected-window))) + @result{} #<window 56 on windows.texi> +@end group +@end example +@end defun + +@defun previous-window &optional window minibuf all-frames +This function returns the window preceding @var{window} in the cyclic +ordering of windows. The other arguments specify which windows to +include in the cycle, as in @code{next-window}. +@end defun + +@deffn Command other-window count &optional all-frames +This function selects the @var{count}th following window in the cyclic +order. If count is negative, then it moves back @minus{}@var{count} +windows in the cycle, rather than forward. It returns @code{nil}. + +The argument @var{all-frames} has the same meaning as in +@code{next-window}, but the @var{minibuf} argument of @code{next-window} +is always effectively @code{nil}. + +In an interactive call, @var{count} is the numeric prefix argument. +@end deffn + +@c Emacs 19 feature +@defun walk-windows proc &optional minibuf all-frames +This function cycles through all windows. It calls the function +@code{proc} once for each window, with the window as its sole +argument. + +The optional arguments @var{minibuf} and @var{all-frames} specify the +set of windows to include in the scan. See @code{next-window}, above, +for details. +@end defun + +@defun window-list &optional frame minibuf window +This function returns a list of the windows on @var{frame}, starting +with @var{window}. If @var{frame} is @code{nil} or omitted, +@code{window-list} uses the selected frame instead; if @var{window} is +@code{nil} or omitted, it uses the selected window. + +The value of @var{minibuf} determines if the minibuffer window is +included in the result list. If @var{minibuf} is @code{t}, the result +always includes the minibuffer window. If @var{minibuf} is @code{nil} +or omitted, that includes the minibuffer window if it is active. If +@var{minibuf} is neither @code{nil} nor @code{t}, the result never +includes the minibuffer window. +@end defun + +@node Buffers and Windows +@section Buffers and Windows +@cindex examining windows +@cindex windows, controlling precisely +@cindex buffers, controlled in windows + + This section describes low-level functions to examine windows or to +display buffers in windows in a precisely controlled fashion. +@iftex +See the following section for +@end iftex +@ifnottex +@xref{Displaying Buffers}, for +@end ifnottex +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. + +@defun set-window-buffer window buffer-or-name &optional keep-margins +This function makes @var{window} display @var{buffer-or-name} as its +contents. It returns @code{nil}. @var{buffer-or-name} must be a +buffer, or the name of an existing buffer. This is the fundamental +primitive for changing which buffer is displayed in a window, and all +ways of doing that call this function. + +@example +@group +(set-window-buffer (selected-window) "foo") + @result{} nil +@end group +@end example + +Normally, displaying @var{buffer} in @var{window} resets the window's +display margins, fringe widths, scroll bar settings, and position +based on the local variables of @var{buffer}. However, if +@var{keep-margins} is non-@code{nil}, the display margins and fringe +widths of @var{window} remain unchanged. @xref{Fringes}. +@end defun + +@defvar buffer-display-count +This buffer-local variable records the number of times a buffer is +displayed in a window. It is incremented each time +@code{set-window-buffer} is called for the buffer. +@end defvar + +@defun window-buffer &optional window +This function returns the buffer that @var{window} is displaying. If +@var{window} is omitted, this function returns the buffer for the +selected window. + +@example +@group +(window-buffer) + @result{} #<buffer windows.texi> +@end group +@end example +@end defun + +@defun get-buffer-window buffer-or-name &optional all-frames +This function returns a window currently displaying +@var{buffer-or-name}, or @code{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. +@xref{Cyclic Window Ordering}. + +The argument @var{all-frames} controls which windows to consider. + +@itemize @bullet +@item +If it is @code{nil}, consider windows on the selected frame. +@item +If it is @code{t}, consider windows on all frames. +@item +If it is @code{visible}, consider windows on all visible frames. +@item +If it is 0, consider windows on all visible or iconified frames. +@item +If it is a frame, consider windows on that frame. +@end itemize +@end defun + +@defun get-buffer-window-list buffer-or-name &optional minibuf all-frames +This function returns a list of all the windows currently displaying +@var{buffer-or-name}. + +The two optional arguments work like the optional arguments of +@code{next-window} (@pxref{Cyclic Window Ordering}); they are @emph{not} +like the single optional argument of @code{get-buffer-window}. Perhaps +we should change @code{get-buffer-window} in the future to make it +compatible with the other functions. +@end defun + +@defvar buffer-display-time +This variable records the time at which a buffer was last made visible +in a window. It is always local in each buffer; each time +@code{set-window-buffer} is called, it sets this variable to +@code{(current-time)} in the specified buffer (@pxref{Time of Day}). +When a buffer is first created, @code{buffer-display-time} starts out +with the value @code{nil}. +@end defvar + +@node Displaying Buffers +@section Displaying Buffers in Windows +@cindex switching to a buffer +@cindex displaying a buffer + + 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. +@iftex +See the preceding section for +@end iftex +@ifnottex +@xref{Buffers and Windows}, for +@end ifnottex +low-level functions that give you more precise control. All of these +functions work by calling @code{set-window-buffer}. + + 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 in +windows, which would be gratuitous and surprise the user. Instead, use +@code{set-buffer} and @code{save-current-buffer} (@pxref{Current +Buffer}), which designate buffers as current for programmed access +without affecting the display of buffers in windows. + +@deffn Command switch-to-buffer buffer-or-name &optional norecord +This function makes @var{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 @code{set-buffer}, which makes @var{buffer-or-name} +the current buffer but does not display it in the selected window. +@xref{Current Buffer}. + +If @var{buffer-or-name} does not identify an existing buffer, then a new +buffer by that name is created. The major mode for the new buffer is +set according to the variable @code{default-major-mode}. @xref{Auto +Major Mode}. If @var{buffer-or-name} is @code{nil}, +@code{switch-to-buffer} chooses a buffer using @code{other-buffer}. + +Normally the specified buffer is put at the front of the buffer list +(both the selected frame's buffer list and the frame-independent buffer +list). This affects the operation of @code{other-buffer}. However, if +@var{norecord} is non-@code{nil}, this is not done. @xref{The Buffer +List}. + +The @code{switch-to-buffer} function is often used interactively, as +the binding of @kbd{C-x b}. It is also used frequently in programs. It +returns the buffer that it switched to. +@end deffn + +The next two functions are similar to @code{switch-to-buffer}, except +for the described features. + +@deffn Command switch-to-buffer-other-window buffer-or-name &optional norecord +This function makes @var{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 +@code{switch-to-buffer}. + +The currently selected window is absolutely never used to do the job. +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. + +This function updates the buffer list just like @code{switch-to-buffer} +unless @var{norecord} is non-@code{nil}. +@end deffn + +@defun pop-to-buffer buffer-or-name &optional other-window norecord +This function makes @var{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 within +its frame. The return value is the buffer that was switched to. +If @var{buffer-or-name} is @code{nil}, that means to choose some +other buffer, but you don't specify which. + +If the variable @code{pop-up-frames} is non-@code{nil}, +@code{pop-to-buffer} looks for a window in any visible frame already +displaying the buffer; if there is one, it returns that window and makes +it be selected within its frame. If there is none, it creates a new +frame and displays the buffer in it. + +If @code{pop-up-frames} is @code{nil}, then @code{pop-to-buffer} +operates entirely within the selected frame. (If the selected frame has +just a minibuffer, @code{pop-to-buffer} operates within the most +recently selected frame that was not just a minibuffer.) + +If the variable @code{pop-up-windows} is non-@code{nil}, windows may +be split to create a new window that is different from the original +window. For details, see @ref{Choosing Window}. + +If @var{other-window} is non-@code{nil}, @code{pop-to-buffer} finds or +creates another window even if @var{buffer-or-name} is already visible +in the selected window. Thus @var{buffer-or-name} could end up +displayed in two windows. On the other hand, if @var{buffer-or-name} is +already displayed in the selected window and @var{other-window} is +@code{nil}, then the selected window is considered sufficient display +for @var{buffer-or-name}, so that nothing needs to be done. + +All the variables that affect @code{display-buffer} affect +@code{pop-to-buffer} as well. @xref{Choosing Window}. + +If @var{buffer-or-name} is a string that does not name an existing +buffer, a buffer by that name is created. The major mode for the new +buffer is set according to the variable @code{default-major-mode}. +@xref{Auto Major Mode}. + +This function updates the buffer list just like @code{switch-to-buffer} +unless @var{norecord} is non-@code{nil}. +@end defun + +@deffn Command replace-buffer-in-windows buffer-or-name +This function replaces @var{buffer-or-name} with some other buffer in all +windows displaying it. It chooses the other buffer with +@code{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 +@var{buffer-or-name} is no longer displayed. + +This function returns @code{nil}. +@end deffn + +@node Choosing Window +@section Choosing a Window for Display + + This section describes the basic facility that chooses a window to +display a buffer in---@code{display-buffer}. All the higher-level +functions and commands use this subroutine. Here we describe how to use +@code{display-buffer} and how to customize it. + +@deffn Command display-buffer buffer-or-name &optional not-this-window frame +This command makes @var{buffer-or-name} appear in some window, like +@code{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. @var{buffer-or-name} must be a buffer, or +the name of an existing buffer. + +If @var{not-this-window} is non-@code{nil}, it means to display the +specified buffer 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 @var{buffer-or-name} is +already being displayed in any window, that is good enough, so this +function does nothing. + +@code{display-buffer} returns the window chosen to display +@var{buffer-or-name}. + +If the argument @var{frame} is non-@code{nil}, it specifies which frames +to check when deciding whether the buffer is already displayed. If the +buffer is already displayed in some window on one of these frames, +@code{display-buffer} simply returns that window. Here are the possible +values of @var{frame}: + +@itemize @bullet +@item +If it is @code{nil}, consider windows on the selected frame. +(Actually, the last non-minibuffer frame.) +@item +If it is @code{t}, consider windows on all frames. +@item +If it is @code{visible}, consider windows on all visible frames. +@item +If it is 0, consider windows on all visible or iconified frames. +@item +If it is a frame, consider windows on that frame. +@end itemize + +Precisely how @code{display-buffer} finds or creates a window depends on +the variables described below. +@end deffn + +@defopt display-buffer-reuse-frames +If this variable is non-@code{nil}, @code{display-buffer} searches +existing frames for a window displaying the buffer. If the buffer is +already displayed in a window in some frame, @code{display-buffer} makes +the frame visible and raises it, to use that window. If the buffer is +not already displayed, or if @code{display-buffer-reuse-frames} is +@code{nil}, @code{display-buffer}'s behavior is determined by other +variables, described below. +@end defopt + +@defopt pop-up-windows +This variable controls whether @code{display-buffer} makes new windows. +If it is non-@code{nil} and there is only one window, then that window +is split. If it is @code{nil}, then @code{display-buffer} does not +split the single window, but uses it whole. +@end defopt + +@defopt split-height-threshold +This variable determines when @code{display-buffer} may split a window, +if there are multiple windows. @code{display-buffer} always splits the +largest window if it has at least this many lines. If the largest +window is not this tall, it is split only if it is the sole window and +@code{pop-up-windows} is non-@code{nil}. +@end defopt + +@defopt even-window-heights +This variable determines if @code{display-buffer} should even out window +heights if the buffer gets displayed in an existing window, above or +beneath another existing window. If @code{even-window-heights} is +@code{t}, the default, window heights will be evened out. If +@code{even-window-heights} is @code{nil}, the original window heights +will be left alone. +@end defopt + +@c Emacs 19 feature +@defopt pop-up-frames +This variable controls whether @code{display-buffer} makes new frames. +If it is non-@code{nil}, @code{display-buffer} looks for an existing +window already displaying the desired buffer, on any visible frame. If +it finds one, it returns that window. Otherwise it makes a new frame. +The variables @code{pop-up-windows} and @code{split-height-threshold} do +not matter if @code{pop-up-frames} is non-@code{nil}. + +If @code{pop-up-frames} is @code{nil}, then @code{display-buffer} either +splits a window or reuses one. + +@xref{Frames}, for more information. +@end defopt + +@c Emacs 19 feature +@defopt pop-up-frame-function +This variable specifies how to make a new frame if @code{pop-up-frames} +is non-@code{nil}. + +Its value should be a function of no arguments. When +@code{display-buffer} makes a new frame, it does so by calling that +function, which should return a frame. The default value of the +variable is a function that creates a frame using parameters from +@code{pop-up-frame-alist}. +@end defopt + +@defopt pop-up-frame-alist +This variable holds an alist specifying frame parameters used when +@code{display-buffer} makes a new frame. @xref{Frame Parameters}, for +more information about frame parameters. +@end defopt + +@defopt special-display-buffer-names +A list of buffer names for buffers that should be displayed specially. +If the buffer's name is in this list, @code{display-buffer} handles the +buffer specially. + +By default, special display means to give the buffer a dedicated frame. + +If an element is a list, instead of a string, then the @sc{car} of the +list is the buffer name, and the rest of the list says how to create +the frame. There are two possibilities for the rest of the list (its +@sc{cdr}). It can be an alist, specifying frame parameters, or it can +contain a function and arguments to give to it. (The function's first +argument is always the buffer to be displayed; the arguments from the +list come after that.) + +For example: + +@example +(("myfile" (minibuffer) (menu-bar-lines . 0))) +@end example + +@noindent +specifies to display a buffer named @samp{myfile} in a dedicated frame +with specified @code{minibuffer} and @code{menu-bar-lines} parameters. + +The list of frame parameters can also use the phony frame parameters +@code{same-frame} and @code{same-window}. If the specified frame +parameters include @code{(same-window . @var{value})} and @var{value} +is non-@code{nil}, that means to display the buffer in the current +selected window. Otherwise, if they include @code{(same-frame . +@var{value})} and @var{value} is non-@code{nil}, that means to display +the buffer in a new window in the currently selected frame. +@end defopt + +@defopt special-display-regexps +A list of regular expressions that specify buffers that should be +displayed specially. If the buffer's name matches any of the regular +expressions in this list, @code{display-buffer} handles the buffer +specially. + +By default, special display means to give the buffer a dedicated frame. + +If an element is a list, instead of a string, then the @sc{car} of the +list is the regular expression, and the rest of the list says how to +create the frame. See above, under @code{special-display-buffer-names}. +@end defopt + +@defun special-display-p buffer-name +This function returns non-@code{nil} if displaying a buffer +named @var{buffer-name} with @code{display-buffer} would +create a special frame. The value is @code{t} if it would +use the default frame parameters, or else the specified list +of frame parameters. +@end defun + +@defvar special-display-function +This variable holds the function to call to display a buffer specially. +It receives the buffer as an argument, and should return the window in +which it is displayed. + +The default value of this variable is +@code{special-display-popup-frame}. +@end defvar + +@defun special-display-popup-frame buffer &optional args +This function makes @var{buffer} visible in a frame of its own. If +@var{buffer} is already displayed in a window in some frame, it makes +the frame visible and raises it, to use that window. Otherwise, it +creates a frame that will be dedicated to @var{buffer}. This +function returns the window it used. + +If @var{args} is an alist, it specifies frame parameters for the new +frame. + +If @var{args} is a list whose @sc{car} is a symbol, then @code{(car +@var{args})} is called as a function to actually create and set up the +frame; it is called with @var{buffer} as first argument, and @code{(cdr +@var{args})} as additional arguments. + +This function always uses an existing window displaying @var{buffer}, +whether or not it is in a frame of its own; but if you set up the above +variables in your init file, before @var{buffer} was created, then +presumably the window was previously made by this function. +@end defun + +@defopt special-display-frame-alist +@anchor{Definition of special-display-frame-alist} +This variable holds frame parameters for +@code{special-display-popup-frame} to use when it creates a frame. +@end defopt + +@defopt same-window-buffer-names +A list of buffer names for buffers that should be displayed in the +selected window. If the buffer's name is in this list, +@code{display-buffer} handles the buffer by switching to it in the +selected window. +@end defopt + +@defopt same-window-regexps +A list of regular expressions that specify buffers that should be +displayed in the selected window. If the buffer's name matches any of +the regular expressions in this list, @code{display-buffer} handles the +buffer by switching to it in the selected window. +@end defopt + +@defun same-window-p buffer-name +This function returns @code{t} if displaying a buffer +named @var{buffer-name} with @code{display-buffer} would +put it in the selected window. +@end defun + +@c Emacs 19 feature +@defvar display-buffer-function +This variable is the most flexible way to customize the behavior of +@code{display-buffer}. If it is non-@code{nil}, it should be a function +that @code{display-buffer} calls to do the work. The function should +accept two arguments, the first two arguments that @code{display-buffer} +received. It should choose or create a window, display the specified +buffer in it, and then return the window. + +This hook takes precedence over all the other options and hooks +described above. +@end defvar + +@c Emacs 19 feature +@cindex dedicated window +A window can be marked as ``dedicated'' to its buffer. Then +@code{display-buffer} will not try to use that window to display any +other buffer. + +@defun window-dedicated-p window +This function returns non-@code{nil} if @var{window} is marked as +dedicated; otherwise @code{nil}. +@end defun + +@defun set-window-dedicated-p window flag +This function marks @var{window} as dedicated if @var{flag} is +non-@code{nil}, and nondedicated otherwise. +@end defun + +@node Window Point +@section Windows and Point +@cindex window position +@cindex window point +@cindex position in window +@cindex point in window + + 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. + +@itemize @bullet +@item +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. + +@item +Selecting a window sets the value of point in its buffer from the +window's value of point. Conversely, deselecting a window sets the +window's value of point from that of the buffer. 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. + +@item +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. +@end itemize + +@noindent +@xref{Positions}, for more details on buffer positions. + +@cindex cursor + 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. + +@defun window-point &optional window +This function returns the current position of point in @var{window}. +For a nonselected window, this is the value point would have (in that +window's buffer) if that window were selected. If @var{window} is +@code{nil}, the selected window is used. + +When @var{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 @code{save-excursion} +forms. But that value is hard to find. +@end defun + +@defun set-window-point window position +This function positions point in @var{window} at position +@var{position} in @var{window}'s buffer. It returns @var{position}. + +If @var{window} is selected, and its buffer is current, +this simply does @code{goto-char}. +@end defun + +@node Window Start +@section The Window Start Position +@cindex window start position + + Each window contains a marker used to keep track of a buffer position +that specifies where in the buffer display should start. This position +is called the @dfn{display-start} position of the window (or just the +@dfn{start}). 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. + +@defun window-start &optional window +@cindex window top line +This function returns the display-start position of window +@var{window}. If @var{window} is @code{nil}, the selected window is +used. For example, + +@example +@group +(window-start) + @result{} 7058 +@end group +@end example + +When you create a window, or display a different buffer in it, the +display-start position is set to a display-start position recently used +for the same buffer, or 1 if the buffer doesn't have any. + +Redisplay updates the window-start position (if you have not specified +it explicitly since the previous redisplay)---for example, to make sure +point appears on the screen. Nothing except redisplay automatically +changes the window-start position; if you move point, do not expect the +window-start position to change in response until after the next +redisplay. + +For a realistic example of using @code{window-start}, see the +description of @code{count-lines}. @xref{Definition of count-lines}. +@end defun + +@defun window-end &optional window update +This function returns the position of the end of the display in window +@var{window}. If @var{window} is @code{nil}, the selected window is +used. + +Simply changing the buffer text or moving point does not update the +value that @code{window-end} returns. The value is updated only when +Emacs redisplays and redisplay completes without being preempted. + +If the last redisplay of @var{window} was preempted, and did not finish, +Emacs does not know the position of the end of display in that window. +In that case, this function returns @code{nil}. + +If @var{update} is non-@code{nil}, @code{window-end} always returns an +up-to-date value for where the window ends, based on the current +@code{window-start} value. If the saved value is valid, +@code{window-end} returns that; otherwise it computes the correct +value by scanning the buffer text. + +Even if @var{update} is non-@code{nil}, @code{window-end} does not +attempt to scroll the display if point has moved off the screen, the +way real redisplay would do. It does not alter the +@code{window-start} value. In effect, it reports where the displayed +text will end if scrolling is not required. +@end defun + +@defun set-window-start window position &optional noforce +This function sets the display-start position of @var{window} to +@var{position} in @var{window}'s buffer. It returns @var{position}. + +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 using +@code{nil} for @var{noforce}, it means you want display to start at +@var{position} even if that would put the location of point off the +screen. If this does place point off screen, the display routines move +point to the left margin on the middle line in the window. + +For example, if point @w{is 1} and you set the start of the window @w{to +2}, then point would be ``above'' the top of the window. The display +routines will automatically move point if it is still 1 when redisplay +occurs. Here is an example: + +@example +@group +;; @r{Here is what @samp{foo} looks like before executing} +;; @r{the @code{set-window-start} expression.} +@end group + +@group +---------- Buffer: foo ---------- +@point{}This is the contents of buffer foo. +2 +3 +4 +5 +6 +---------- Buffer: foo ---------- +@end group + +@group +(set-window-start + (selected-window) + (1+ (window-start))) +@result{} 2 +@end group + +@group +;; @r{Here is what @samp{foo} looks like after executing} +;; @r{the @code{set-window-start} expression.} +---------- Buffer: foo ---------- +his is the contents of buffer foo. +2 +3 +@point{}4 +5 +6 +---------- Buffer: foo ---------- +@end group +@end example + +If @var{noforce} is non-@code{nil}, and @var{position} would place point +off screen at the next redisplay, then redisplay computes a new window-start +position that works well with point, and thus @var{position} is not used. +@end defun + +@defun pos-visible-in-window-p &optional position window partially +This function returns non-@code{nil} if @var{position} is within the +range of text currently visible on the screen in @var{window}. It +returns @code{nil} if @var{position} is scrolled vertically out of +view. Locations that are partially obscured are not considered +visible unless @var{partially} is non-@code{nil}. The argument +@var{position} defaults to the current position of point in +@var{window}; @var{window}, to the selected window. + +If @var{position} is @code{t}, that means to check the last visible +position in @var{window}. + +The @code{pos-visible-in-window-p} function considers only vertical +scrolling. If @var{position} is out of view only because @var{window} +has been scrolled horizontally, @code{pos-visible-in-window-p} returns +non-@code{nil} anyway. @xref{Horizontal Scrolling}. + +If @var{position} is visible, @code{pos-visible-in-window-p} returns +@code{t} if @var{partially} is @code{nil}; if @var{partially} is +non-@code{nil}, and the character after @var{position} is fully +visible, it returns a list of the form @code{(@var{x} @var{y})}, where +@var{x} and @var{y} are the pixel coordinates relative to the top left +corner of the window; otherwise it returns an extended list of the +form @code{(@var{x} @var{y} @var{rtop} @var{rbot} @var{rowh} +@var{vpos})}, where the @var{rtop} and @var{rbot} specify the number +of off-window pixels at the top and bottom of the row at +@var{position}, @var{rowh} specifies the visible height of that row, +and @var{vpos} specifies the vertical position (zero-based row number) +of that row. + +Here is an example: + +@example +@group +;; @r{If point is off the screen now, recenter it now.} +(or (pos-visible-in-window-p + (point) (selected-window)) + (recenter 0)) +@end group +@end example +@end defun + +@defun window-line-height &optional line window +This function returns information about text line @var{line} in @var{window}. +If @var{line} is one of @code{header-line} or @code{mode-line}, +@code{window-line-height} returns information about the corresponding +line of the window. Otherwise, @var{line} is a text line number +starting from 0. A negative number counts from the end of the window. +The argument @var{line} defaults to the current line in @var{window}; +@var{window}, to the selected window. + +If the display is not up to date, @code{window-line-height} returns +@code{nil}. In that case, @code{pos-visible-in-window-p} may be used +to obtain related information. + +If there is no line corresponding to the specified @var{line}, +@code{window-line-height} returns @code{nil}. Otherwise, it returns +a list @code{(@var{height} @var{vpos} @var{ypos} @var{offbot})}, +where @var{height} is the height in pixels of the visible part of the +line, @var{vpos} and @var{ypos} are the vertical position in lines and +pixels of the line relative to the top of the first text line, and +@var{offbot} is the number of off-window pixels at the bottom of the +text line. If there are off-window pixels at the top of the (first) +text line, @var{ypos} is negative. +@end defun + +@node Textual Scrolling +@section Textual Scrolling +@cindex textual scrolling +@cindex scrolling textually + + @dfn{Textual scrolling} means moving the text up or down through a +window. It works by changing the value of the window's display-start +location. It may also change the value of @code{window-point} to keep +point on the screen. + + Textual scrolling was formerly called ``vertical scrolling,'' but we +changed its name to distinguish it from the new vertical fractional +scrolling feature (@pxref{Vertical Scrolling}). + + In the commands @code{scroll-up} and @code{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 @code{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 textual scrolling functions (aside from +@code{scroll-other-window}) have unpredictable results if the current +buffer is different from the buffer that is displayed in the selected +window. @xref{Current Buffer}. + + If the window contains a row which is taller than the height of the +window (for example in the presence of a large image), the scroll +functions will adjust the window vscroll to scroll the partially +visible row. To disable this feature, Lisp code may bind the variable +`auto-window-vscroll' to @code{nil} (@pxref{Vertical Scrolling}). + +@deffn Command scroll-up &optional count +This function scrolls the text in the selected window upward +@var{count} lines. If @var{count} is negative, scrolling is actually +downward. + +If @var{count} is @code{nil} (or omitted), then the length of scroll +is @code{next-screen-context-lines} lines less than the usable height of +the window (not counting its mode line). + +@code{scroll-up} returns @code{nil}, unless it gets an error +because it can't scroll any further. +@end deffn + +@deffn Command scroll-down &optional count +This function scrolls the text in the selected window downward +@var{count} lines. If @var{count} is negative, scrolling is actually +upward. + +If @var{count} is omitted or @code{nil}, then the length of the scroll +is @code{next-screen-context-lines} lines less than the usable height of +the window (not counting its mode line). + +@code{scroll-down} returns @code{nil}, unless it gets an error because +it can't scroll any further. +@end deffn + +@deffn Command scroll-other-window &optional count +This function scrolls the text in another window upward @var{count} +lines. Negative values of @var{count}, or @code{nil}, are handled +as in @code{scroll-up}. + +You can specify which buffer to scroll by setting the variable +@code{other-window-scroll-buffer} to a buffer. If that buffer isn't +already displayed, @code{scroll-other-window} displays it in some +window. + +When the selected window is the minibuffer, the next window is normally +the one at the top left corner. You can specify a different window to +scroll, when the minibuffer is selected, by setting the variable +@code{minibuffer-scroll-window}. This variable has no effect when any +other window is selected. When it is non-@code{nil} and the +minibuffer is selected, it takes precedence over +@code{other-window-scroll-buffer}. @xref{Definition of +minibuffer-scroll-window}. + +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, +@code{scroll-other-window} attempts to scroll the minibuffer. If the +minibuffer contains just one line, it has nowhere to scroll to, so the +line reappears after the echo area momentarily displays the message +@samp{Beginning of buffer}. +@end deffn + +@c Emacs 19 feature +@defvar other-window-scroll-buffer +If this variable is non-@code{nil}, it tells @code{scroll-other-window} +which buffer to scroll. +@end defvar + +@defopt scroll-margin +This option specifies the size of the scroll margin---a minimum number +of lines between point and the top or bottom of a window. Whenever +point gets within this many lines of the top or bottom of the window, +redisplay scrolls the text automatically (if possible) to move point +out of the margin, closer to the center of the window. +@end defopt + +@defopt scroll-conservatively +This variable controls how scrolling is done automatically when point +moves off the screen (or into the scroll margin). If the value is a +positive integer @var{n}, then redisplay scrolls the text up to +@var{n} lines in either direction, if that will bring point back into +proper view. This action is called @dfn{conservative scrolling}. +Otherwise, scrolling happens in the usual way, under the control of +other variables such as @code{scroll-up-aggressively} and +@code{scroll-down-aggressively}. + +The default value is zero, which means that conservative scrolling +never happens. +@end defopt + +@defopt scroll-down-aggressively +The value of this variable should be either @code{nil} or a fraction +@var{f} between 0 and 1. If it is a fraction, that specifies where on +the screen to put point when scrolling down. More precisely, when a +window scrolls down because point is above the window start, the new +start position is chosen to put point @var{f} part of the window +height from the top. The larger @var{f}, the more aggressive the +scrolling. + +A value of @code{nil} is equivalent to .5, since its effect is to center +point. This variable automatically becomes buffer-local when set in any +fashion. +@end defopt + +@defopt scroll-up-aggressively +Likewise, for scrolling up. The value, @var{f}, specifies how far +point should be placed from the bottom of the window; thus, as with +@code{scroll-up-aggressively}, a larger value scrolls more aggressively. +@end defopt + +@defopt scroll-step +This variable is an older variant of @code{scroll-conservatively}. The +difference is that it if its value is @var{n}, that permits scrolling +only by precisely @var{n} lines, not a smaller number. This feature +does not work with @code{scroll-margin}. The default value is zero. +@end defopt + +@defopt scroll-preserve-screen-position +If this option is @code{t}, scrolling which would move the current +point position out of the window chooses the new position of point +so that the vertical position of the cursor is unchanged, if possible. + +If it is non-@code{nil} and not @code{t}, then the scrolling functions +always preserve the vertical position of point, if possible. +@end defopt + +@defopt 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, @code{scroll-up} +with an argument of @code{nil} scrolls so that this many lines at the +bottom of the window appear instead at the top. The default value is +@code{2}. +@end defopt + +@deffn Command recenter &optional count +@cindex centering point +This function scrolls the text in the selected window so that point is +displayed at a specified vertical position within the window. It does +not ``move point'' with respect to the text. + +If @var{count} is a nonnegative number, that puts the line containing +point @var{count} lines down from the top of the window. If +@var{count} is a negative number, then it counts upward from the +bottom of the window, so that @minus{}1 stands for the last usable +line in the window. If @var{count} is a non-@code{nil} list, then it +stands for the line in the middle of the window. + +If @var{count} is @code{nil}, @code{recenter} puts the line containing +point in the middle of the window, then clears and redisplays the entire +selected frame. + +When @code{recenter} is called interactively, @var{count} is the raw +prefix argument. Thus, typing @kbd{C-u} as the prefix sets the +@var{count} to a non-@code{nil} list, while typing @kbd{C-u 4} sets +@var{count} to 4, which positions the current line four lines from the +top. + +With an argument of zero, @code{recenter} positions the current line at +the top of the window. This action is so handy that some people make a +separate key binding to do this. For example, + +@example +@group +(defun line-to-top-of-window () + "Scroll current line to top of window. +Replaces three keystroke sequence C-u 0 C-l." + (interactive) + (recenter 0)) + +(global-set-key [kp-multiply] 'line-to-top-of-window) +@end group +@end example +@end deffn + +@node Vertical Scrolling +@section Vertical Fractional Scrolling +@cindex vertical fractional scrolling + + @dfn{Vertical fractional scrolling} means shifting the image in the +window up or down by a specified multiple or fraction of a line. +Each window has a @dfn{vertical scroll position}, +which is a number, never less than zero. It specifies how far to raise +the contents of the window. Raising the window contents generally makes +all or part of some lines disappear off the top, and all or part of some +other lines appear at the bottom. The usual value is zero. + + The vertical scroll position is measured in units of the normal line +height, which is the height of the default font. Thus, if the value is +.5, that means the window contents are scrolled up half the normal line +height. If it is 3.3, that means the window contents are scrolled up +somewhat over three times the normal line height. + + What fraction of a line the vertical scrolling covers, or how many +lines, depends on what the lines contain. A value of .5 could scroll a +line whose height is very short off the screen, while a value of 3.3 +could scroll just part of the way through a tall line or an image. + +@defun window-vscroll &optional window pixels-p +This function returns the current vertical scroll position of +@var{window}. If @var{window} is @code{nil}, the selected window is +used. If @var{pixels-p} is non-@code{nil}, the return value is +measured in pixels, rather than in units of the normal line height. + +@example +@group +(window-vscroll) + @result{} 0 +@end group +@end example +@end defun + +@defun set-window-vscroll window lines &optional pixels-p +This function sets @var{window}'s vertical scroll position to +@var{lines}. The argument @var{lines} should be zero or positive; if +not, it is taken as zero. + +If @var{window} is @code{nil}, the selected window is used. + +The actual vertical scroll position must always correspond +to an integral number of pixels, so the value you specify +is rounded accordingly. + +The return value is the result of this rounding. + +@example +@group +(set-window-vscroll (selected-window) 1.2) + @result{} 1.13 +@end group +@end example + +If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of +pixels. In this case, the return value is @var{lines}. +@end defun + +@defvar auto-window-vscroll +If this variable is non-@code{nil}, the line-move, scroll-up, and +scroll-down functions will automatically modify the window vscroll to +scroll through display rows that are taller that the height of the +window, for example in the presence of large images. +@end defvar + +@node Horizontal Scrolling +@section Horizontal Scrolling +@cindex horizontal scrolling + + @dfn{Horizontal scrolling} means shifting the image in the window left +or right by a specified multiple of the normal character width. Each +window has a @dfn{horizontal scroll position}, which is a number, never +less than zero. It specifies how far to shift the contents left. +Shifting the window contents left generally makes all or part of some +characters disappear off the left, and all or part of some other +characters appear at the right. The usual value is zero. + + The horizontal scroll position is measured in units of the normal +character width, which is the width of space in the default font. Thus, +if the value is 5, that means the window contents are scrolled left by 5 +times the normal character width. How many characters actually +disappear off to the left depends on their width, and could vary from +line to line. + + Because we read from side to side in the ``inner loop,'' and from top +to bottom in the ``outer loop,'' the effect of horizontal scrolling is +not like that of textual or vertical scrolling. Textual scrolling +involves selection of a portion of text to display, and vertical +scrolling moves the window contents contiguously; but horizontal +scrolling causes part of @emph{each line} to go off screen. + + 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 edge +to be revealed by it; so this is not allowed. Scrolling to the left is +allowed; it scrolls the first columns of text 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. + +@vindex auto-hscroll-mode + If @code{auto-hscroll-mode} is set, redisplay automatically alters +the horizontal scrolling of a window as necessary to ensure that point +is always visible. However, you can still set the horizontal +scrolling value explicitly. The value you specify serves as a lower +bound for automatic scrolling, i.e. automatic scrolling will not +scroll a window to a column less than the specified one. + +@deffn Command scroll-left &optional count set-minimum +This function scrolls the selected window @var{count} columns to the +left (or to the right if @var{count} is negative). The default +for @var{count} is the window width, minus 2. + +The return value is the total amount of leftward horizontal scrolling in +effect after the change---just like the value returned by +@code{window-hscroll} (below). + +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 right have no effect. + +If @var{set-minimum} is non-@code{nil}, the new scroll amount becomes +the lower bound for automatic scrolling; that is, automatic scrolling +will not scroll a window to a column less than the value returned by +this function. Interactive calls pass non-@code{nil} for +@var{set-minimum}. +@end deffn + +@deffn Command scroll-right &optional count set-minimum +This function scrolls the selected window @var{count} columns to the +right (or to the left if @var{count} is negative). The default +for @var{count} is the window width, minus 2. Aside from the direction +of scrolling, this works just like @code{scroll-left}. +@end deffn + +@defun window-hscroll &optional window +This function returns the total leftward horizontal scrolling of +@var{window}---the number of columns by which the text in @var{window} +is scrolled left past the left margin. + +The value is never negative. It is zero when no horizontal scrolling +has been done in @var{window} (which is usually the case). + +If @var{window} is @code{nil}, the selected window is used. + +@example +@group +(window-hscroll) + @result{} 0 +@end group +@group +(scroll-left 5) + @result{} 5 +@end group +@group +(window-hscroll) + @result{} 5 +@end group +@end example +@end defun + +@defun set-window-hscroll window columns +This function sets horizontal scrolling of @var{window}. The value of +@var{columns} specifies the amount of scrolling, in terms of columns +from the left margin. The argument @var{columns} should be zero or +positive; if not, it is taken as zero. Fractional values of +@var{columns} are not supported at present. + +Note that @code{set-window-hscroll} may appear not to work if you test +it by evaluating a call with @kbd{M-:} in a simple way. What happens +is that the function sets the horizontal scroll value and returns, but +then redisplay adjusts the horizontal scrolling to make point visible, +and this overrides what the function did. You can observe the +function's effect if you call it while point is sufficiently far from +the left margin that it will remain visible. + +The value returned is @var{columns}. + +@example +@group +(set-window-hscroll (selected-window) 10) + @result{} 10 +@end group +@end example +@end defun + + Here is how you can determine whether a given position @var{position} +is off the screen due to horizontal scrolling: + +@example +@group +(defun hscroll-on-screen (window position) + (save-excursion + (goto-char position) + (and + (>= (- (current-column) (window-hscroll window)) 0) + (< (- (current-column) (window-hscroll window)) + (window-width window))))) +@end group +@end example + +@node Size of Window +@section The Size of a Window +@cindex window size +@cindex size of 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. But +the width does not count the scroll bar or the column of @samp{|} +characters that separates side-by-side windows. + + The following three functions return size information about a window: + +@defun window-height &optional window +This function returns the number of lines in @var{window}, including +its mode line and header line, if any. If @var{window} fills its +entire frame except for the echo area, this is typically one less than +the value of @code{frame-height} on that frame. + +If @var{window} is @code{nil}, the function uses the selected window. + +@example +@group +(window-height) + @result{} 23 +@end group +@group +(split-window-vertically) + @result{} #<window 4 on windows.texi> +@end group +@group +(window-height) + @result{} 11 +@end group +@end example +@end defun + +@defun window-body-height &optional window +Like @code{window-height} but the value does not include the +mode line (if any) or the header line (if any). +@end defun + +@defun window-width &optional window +This function returns the number of columns in @var{window}. If +@var{window} fills its entire frame, this is the same as the value of +@code{frame-width} on that frame. The width does not include the +window's scroll bar or the column of @samp{|} characters that separates +side-by-side windows. + +If @var{window} is @code{nil}, the function uses the selected window. + +@example +@group +(window-width) + @result{} 80 +@end group +@end example +@end defun + +@defun window-full-width-p &optional window +This function returns non-@code{nil} if @var{window} is as wide as +the frame that contains it; otherwise @code{nil}. +If @var{window} is @code{nil}, the function uses the selected window. +@end defun + +@defun window-edges &optional window +This function returns a list of the edge coordinates of @var{window}. +If @var{window} is @code{nil}, the selected window is used. + +The order of the list is @code{(@var{left} @var{top} @var{right} +@var{bottom})}, all elements relative to 0, 0 at the top left corner of +the frame. The element @var{right} of the value is one more than the +rightmost column used by @var{window}, and @var{bottom} is one more than +the bottommost row used by @var{window} and its mode-line. + +The edges include the space used by the window's scroll bar, display +margins, fringes, header line, and mode line, if it has them. Also, +if the window has a neighbor on the right, its right edge value +includes the width of the separator line between the window and that +neighbor. Since the width of the window does not include this +separator, the width does not usually equal the difference between the +right and left edges. +@end defun + +@defun window-inside-edges &optional window +This is similar to @code{window-edges}, but the edge values +it returns include only the text area of the window. They +do not include the header line, mode line, scroll bar or +vertical separator, fringes, or display margins. +@end defun + +Here are the results obtained on a typical 24-line terminal with just +one window, with menu bar enabled: + +@example +@group +(window-edges (selected-window)) + @result{} (0 1 80 23) +@end group +@group +(window-inside-edges (selected-window)) + @result{} (0 1 80 22) +@end group +@end example + +@noindent +The bottom edge is at line 23 because the last line is the echo area. +The bottom inside edge is at line 22, which is the window's mode line. + +If @var{window} is at the upper left corner of its frame, and there is +no menu bar, then @var{bottom} returned by @code{window-edges} is the +same as the value of @code{(window-height)}, @var{right} is almost the +same as the value of @code{(window-width)}, and @var{top} and +@var{left} are zero. For example, the edges of the following window +are @w{@samp{0 0 8 5}}. Assuming that the frame 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 @samp{xxxxxxxxx}. + +@example +@group + 0 + _______ + 0 | | + | | + | | + | | + xxxxxxxxx 4 + + 7 +@end group +@end example + +In the following example, let's suppose that the frame is 7 +columns wide. Then the edges of the left window are @w{@samp{0 0 4 3}} +and the edges of the right window are @w{@samp{4 0 7 3}}. +The inside edges of the left window are @w{@samp{0 0 3 2}}, +and the inside edges of the right window are @w{@samp{4 0 7 2}}, + +@example +@group + ___ ___ + | | | + | | | + xxxxxxxxx + + 0 34 7 +@end group +@end example + +@defun window-pixel-edges &optional window +This function is like @code{window-edges} except that, on a graphical +display, the edge values are measured in pixels instead of in +character lines and columns. +@end defun + +@defun window-inside-pixel-edges &optional window +This function is like @code{window-inside-edges} except that, on a +graphical display, the edge values are measured in pixels instead of +in character lines and columns. +@end defun + +@node Resizing Windows +@section Changing the Size of a Window +@cindex window resizing +@cindex resize window +@cindex changing window size +@cindex window size, changing + + 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. + +@deffn Command enlarge-window size &optional horizontal +This function makes the selected window @var{size} lines taller, +stealing lines from neighboring windows. It takes the lines from one +window at a time until that window is used up, then takes from another. +If a window from which lines are stolen shrinks below +@code{window-min-height} lines, that window disappears. + +If @var{horizontal} is non-@code{nil}, this function makes +@var{window} wider by @var{size} columns, stealing columns instead of +lines. If a window from which columns are stolen shrinks below +@code{window-min-width} columns, that window disappears. + +If the requested size would exceed that of the window's frame, then the +function makes the window occupy the entire height (or width) of the +frame. + +If there are various other windows from which lines or columns can be +stolen, and some of them specify fixed size (using +@code{window-size-fixed}, see below), they are left untouched while +other windows are ``robbed.'' If it would be necessary to alter the +size of a fixed-size window, @code{enlarge-window} gets an error +instead. + +If @var{size} is negative, this function shrinks the window by +@minus{}@var{size} lines or columns. If that makes the window smaller +than the minimum size (@code{window-min-height} and +@code{window-min-width}), @code{enlarge-window} deletes the window. + +@code{enlarge-window} returns @code{nil}. +@end deffn + +@deffn Command enlarge-window-horizontally columns +This function makes the selected window @var{columns} wider. +It could be defined as follows: + +@example +@group +(defun enlarge-window-horizontally (columns) + (interactive "p") + (enlarge-window columns t)) +@end group +@end example +@end deffn + +@deffn Command shrink-window size &optional horizontal +This function is like @code{enlarge-window} but negates the argument +@var{size}, making the selected window smaller by giving lines (or +columns) to the other windows. If the window shrinks below +@code{window-min-height} or @code{window-min-width}, then it disappears. + +If @var{size} is negative, the window is enlarged by @minus{}@var{size} +lines or columns. +@end deffn + +@deffn Command shrink-window-horizontally columns +This function makes the selected window @var{columns} narrower. +It could be defined as follows: + +@example +@group +(defun shrink-window-horizontally (columns) + (interactive "p") + (shrink-window columns t)) +@end group +@end example +@end deffn + +@defun adjust-window-trailing-edge window delta horizontal +This function makes the selected window @var{delta} lines taller or +@var{delta} columns wider, by moving the bottom or right edge. This +function does not delete other windows; if it cannot make the +requested size adjustment, it signals an error. On success, this +function returns @code{nil}. +@end defun + +@defun fit-window-to-buffer &optional window max-height min-height +This function makes @var{window} the right height to display its +contents exactly. If @var{window} is omitted or @code{nil}, it uses +the selected window. + +The argument @var{max-height} specifies the maximum height the window +is allowed to be; @code{nil} means use the frame height. The argument +@var{min-height} specifies the minimum height for the window; +@code{nil} means use @code{window-min-height}. All these height +values include the mode-line and/or header-line. +@end defun + +@deffn Command shrink-window-if-larger-than-buffer &optional window +This command shrinks @var{window} vertically to be as small as +possible while still showing the full contents of its buffer---but not +less than @code{window-min-height} lines. If @var{window} is not +given, it defaults to the selected window. + +However, the command does nothing if the window is already too small to +display the whole text of the buffer, or if part of the contents are +currently scrolled off screen, or if the window is not the full width of +its frame, or if the window is the only window in its frame. + +This command returns non-@code{nil} if it actually shrank the window +and @code{nil} otherwise. +@end deffn + +@defvar window-size-fixed +If this variable is non-@code{nil}, in any given buffer, +then the size of any window displaying the buffer remains fixed +unless you explicitly change it or Emacs has no other choice. + +If the value is @code{height}, then only the window's height is fixed; +if the value is @code{width}, then only the window's width is fixed. +Any other non-@code{nil} value fixes both the width and the height. + +This variable automatically becomes buffer-local when set. + +Explicit size-change functions such as @code{enlarge-window} +get an error if they would have to change a window size which is fixed. +Therefore, when you want to change the size of such a window, +you should bind @code{window-size-fixed} to @code{nil}, like this: + +@example +(let ((window-size-fixed nil)) + (enlarge-window 10)) +@end example + +Note that changing the frame size will change the size of a +fixed-size window, if there is no other alternative. +@end defvar + +@cindex minimum window size + The following two variables constrain the window-structure-changing +functions to a minimum height and width. + +@defopt window-min-height +The value of this variable determines how short a window may become +before it is automatically deleted. Making a window smaller than +@code{window-min-height} automatically deletes it, and no window may +be created shorter than this. The default value is 4. + +The absolute minimum window height is one; actions that change window +sizes reset this variable to one if it is less than one. +@end defopt + +@defopt window-min-width +The value of this variable determines how narrow a window may become +before it is automatically deleted. Making a window smaller than +@code{window-min-width} automatically deletes it, and no window may be +created narrower than this. The default value is 10. + +The absolute minimum window width is two; actions that change window +sizes reset this variable to two if it is less than two. +@end defopt + +@node Coordinates and Windows +@section Coordinates and Windows + +This section describes how to relate screen coordinates to windows. + +@defun window-at x y &optional frame +This function returns the window containing the specified cursor +position in the frame @var{frame}. The coordinates @var{x} and @var{y} +are measured in characters and count from the top left corner of the +frame. If they are out of range, @code{window-at} returns @code{nil}. + +If you omit @var{frame}, the selected frame is used. +@end defun + +@defun coordinates-in-window-p coordinates window +This function checks whether a particular frame position falls within +the window @var{window}. + +The argument @var{coordinates} is a cons cell of the form @code{(@var{x} +. @var{y})}. The coordinates @var{x} and @var{y} are measured in +characters, and count from the top left corner of the screen or frame. + +The value returned by @code{coordinates-in-window-p} is non-@code{nil} +if the coordinates are inside @var{window}. The value also indicates +what part of the window the position is in, as follows: + +@table @code +@item (@var{relx} . @var{rely}) +The coordinates are inside @var{window}. The numbers @var{relx} and +@var{rely} are the equivalent window-relative coordinates for the +specified position, counting from 0 at the top left corner of the +window. + +@item mode-line +The coordinates are in the mode line of @var{window}. + +@item header-line +The coordinates are in the header line of @var{window}. + +@item vertical-line +The coordinates are in the vertical line between @var{window} and its +neighbor to the right. This value occurs only if the window doesn't +have a scroll bar; positions in a scroll bar are considered outside the +window for these purposes. + +@item left-fringe +@itemx right-fringe +The coordinates are in the left or right fringe of the window. + +@item left-margin +@itemx right-margin +The coordinates are in the left or right margin of the window. + +@item nil +The coordinates are not in any part of @var{window}. +@end table + +The function @code{coordinates-in-window-p} does not require a frame as +argument because it always uses the frame that @var{window} is on. +@end defun + +@node Window Tree +@section The Window Tree +@cindex window tree + + A @dfn{window tree} specifies the layout, size, and relationship +between all windows in one frame. + +@defun window-tree &optional frame +This function returns the window tree for frame @var{frame}. +If @var{frame} is omitted, the selected frame is used. + +The return value is a list of the form @code{(@var{root} @var{mini})}, +where @var{root} represents the window tree of the frame's +root window, and @var{mini} is the frame's minibuffer window. + +If the root window is not split, @var{root} is the root window itself. +Otherwise, @var{root} is a list @code{(@var{dir} @var{edges} @var{w1} +@var{w2} ...)} where @var{dir} is @code{nil} for a horizontal split, +and @code{t} for a vertical split, @var{edges} gives the combined size and +position of the subwindows in the split, and the rest of the elements +are the subwindows in the split. Each of the subwindows may again be +a window or a list representing a window split, and so on. The +@var{edges} element is a list @code{(@var{left}@var{ top}@var{ right}@var{ bottom})} +similar to the value returned by @code{window-edges}. +@end defun + +@node Window Configurations +@section Window Configurations +@cindex window configurations +@cindex saving window information + + A @dfn{window configuration} records the entire layout of one +frame---all windows, their sizes, which buffers they contain, what +part of each buffer is displayed, and the values of point and the +mark; also their fringes, margins, and scroll bar settings. It also +includes the values of @code{window-min-height}, +@code{window-min-width} and @code{minibuffer-scroll-window}. An +exception is made for point in the selected window for the current +buffer; its value is not saved in the window configuration. + + You can bring back an entire previous layout by restoring a window +configuration previously saved. If you want to record all frames +instead of just one, use a frame configuration instead of a window +configuration. @xref{Frame Configurations}. + +@defun current-window-configuration &optional frame +This function returns a new object representing @var{frame}'s current +window configuration. If @var{frame} is omitted, the selected frame +is used. +@end defun + +@defun set-window-configuration configuration +This function restores the configuration of windows and buffers as +specified by @var{configuration}, for the frame that @var{configuration} +was created for. + +The argument @var{configuration} must be a value that was previously +returned by @code{current-window-configuration}. This configuration is +restored in the frame from which @var{configuration} was made, whether +that frame is selected or not. This always counts as a window size +change and triggers execution of the @code{window-size-change-functions} +(@pxref{Window Hooks}), because @code{set-window-configuration} doesn't +know how to tell whether the new configuration actually differs from the +old one. + +If the frame which @var{configuration} was saved from is dead, all this +function does is restore the three variables @code{window-min-height}, +@code{window-min-width} and @code{minibuffer-scroll-window}. In this +case, the function returns @code{nil}. Otherwise, it returns @code{t}. + +Here is a way of using this function to get the same effect +as @code{save-window-excursion}: + +@example +@group +(let ((config (current-window-configuration))) + (unwind-protect + (progn (split-window-vertically nil) + @dots{}) + (set-window-configuration config))) +@end group +@end example +@end defun + +@defspec save-window-excursion forms@dots{} +This special form records the window configuration, executes @var{forms} +in sequence, then restores the earlier window configuration. The window +configuration includes, for each window, the value of point and the +portion of the buffer that is visible. It also includes the choice of +selected window. However, it does not include the value of point in +the current buffer; use @code{save-excursion} also, if you wish to +preserve that. + +Don't use this construct when @code{save-selected-window} is sufficient. + +Exit from @code{save-window-excursion} always triggers execution of the +@code{window-size-change-functions}. (It doesn't know how to tell +whether the restored configuration actually differs from the one in +effect at the end of the @var{forms}.) + +The return value is the value of the final form in @var{forms}. +For example: + +@example +@group +(split-window) + @result{} #<window 25 on control.texi> +@end group +@group +(setq w (selected-window)) + @result{} #<window 19 on control.texi> +@end group +@group +(save-window-excursion + (delete-other-windows w) + (switch-to-buffer "foo") + 'do-something) + @result{} do-something + ;; @r{The screen is now split again.} +@end group +@end example +@end defspec + +@defun window-configuration-p object +This function returns @code{t} if @var{object} is a window configuration. +@end defun + +@defun compare-window-configurations config1 config2 +This function compares two window configurations as regards the +structure of windows, but ignores the values of point and mark and the +saved scrolling positions---it can return @code{t} even if those +aspects differ. + +The function @code{equal} can also compare two window configurations; it +regards configurations as unequal if they differ in any respect, even a +saved point or mark. +@end defun + +@defun window-configuration-frame config +This function returns the frame for which the window configuration +@var{config} was made. +@end defun + + Other primitives to look inside of window configurations would make +sense, but are not implemented because we did not need them. See the +file @file{winner.el} for some more operations on windows +configurations. + +@node Window Hooks +@section Hooks for Window Scrolling and Changes +@cindex hooks for window operations + +This section describes how a Lisp program can take action whenever a +window displays a different part of its buffer or a different buffer. +There are three actions that can change this: scrolling the window, +switching buffers in the window, and changing the size of the window. +The first two actions run @code{window-scroll-functions}; the last runs +@code{window-size-change-functions}. + +@defvar window-scroll-functions +This variable holds a list of functions that Emacs should call before +redisplaying a window with scrolling. It is not a normal hook, because +each function is called with two arguments: the window, and its new +display-start position. + +Displaying a different buffer in the window also runs these functions. + +These functions must be careful in using @code{window-end} +(@pxref{Window Start}); if you need an up-to-date value, you must use +the @var{update} argument to ensure you get it. + +@strong{Warning:} don't use this feature to alter the way the window +is scrolled. It's not designed for that, and such use probably won't +work. +@end defvar + +@defvar window-size-change-functions +This variable holds a list of functions to be called if the size of any +window changes for any reason. The functions are called just once per +redisplay, and just once for each frame on which size changes have +occurred. + +Each function receives the frame as its sole argument. There is no +direct way to find out which windows on that frame have changed size, or +precisely how. However, if a size-change function records, at each +call, the existing windows and their sizes, it can also compare the +present sizes and the previous sizes. + +Creating or deleting windows counts as a size change, and therefore +causes these functions to be called. Changing the frame size also +counts, because it changes the sizes of the existing windows. + +It is not a good idea to use @code{save-window-excursion} (@pxref{Window +Configurations}) in these functions, because that always counts as a +size change, and it would cause these functions to be called over and +over. In most cases, @code{save-selected-window} (@pxref{Selecting +Windows}) is what you need here. +@end defvar + +@defvar redisplay-end-trigger-functions +This abnormal hook is run whenever redisplay in a window uses text that +extends past a specified end trigger position. You set the end trigger +position with the function @code{set-window-redisplay-end-trigger}. The +functions are called with two arguments: the window, and the end trigger +position. Storing @code{nil} for the end trigger position turns off the +feature, and the trigger value is automatically reset to @code{nil} just +after the hook is run. +@end defvar + +@defun set-window-redisplay-end-trigger window position +This function sets @var{window}'s end trigger position at +@var{position}. +@end defun + +@defun window-redisplay-end-trigger &optional window +This function returns @var{window}'s current end trigger position. +If @var{window} is @code{nil} or omitted, it uses the selected window. +@end defun + +@defvar window-configuration-change-hook +A normal hook that is run every time you change the window configuration +of an existing frame. This includes splitting or deleting windows, +changing the sizes of windows, or displaying a different buffer in a +window. The frame whose window configuration has changed is the +selected frame when this hook runs. +@end defvar + +@ignore + arch-tag: 3f6c36e8-df49-4986-b757-417feed88be3 +@end ignore |