This is ../info/lispref.info, produced by makeinfo version 4.0 from lispref/lispref.texi. INFO-DIR-SECTION XEmacs Editor START-INFO-DIR-ENTRY * Lispref: (lispref). XEmacs Lisp Reference Manual. END-INFO-DIR-ENTRY Edition History: GNU Emacs Lisp Reference Manual Second Edition (v2.01), May 1993 GNU Emacs Lisp Reference Manual Further Revised (v2.02), August 1993 Lucid Emacs Lisp Reference Manual (for 19.10) First Edition, March 1994 XEmacs Lisp Programmer's Manual (for 19.12) Second Edition, April 1995 GNU Emacs Lisp Reference Manual v2.4, June 1995 XEmacs Lisp Programmer's Manual (for 19.13) Third Edition, July 1995 XEmacs Lisp Reference Manual (for 19.14 and 20.0) v3.1, March 1996 XEmacs Lisp Reference Manual (for 19.15 and 20.1, 20.2, 20.3) v3.2, April, May, November 1997 XEmacs Lisp Reference Manual (for 21.0) v3.3, April 1998 Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. Copyright (C) 1994, 1995 Sun Microsystems, Inc. Copyright (C) 1995, 1996 Ben Wing. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled "GNU General Public License" is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled "GNU General Public License" may be included in a translation approved by the Free Software Foundation instead of in the original English.  File: lispref.info, Node: %-Constructs, Prev: Modeline Variables, Up: Modeline Format `%'-Constructs in the ModeLine ------------------------------ The following table lists the recognized `%'-constructs and what they mean. In any construct except `%%', you can add a decimal integer after the `%' to specify how many characters to display. `%b' The current buffer name, obtained with the `buffer-name' function. *Note Buffer Names::. `%f' The visited file name, obtained with the `buffer-file-name' function. *Note Buffer File Name::. `%F' The name of the selected frame. `%c' The current column number of point. `%l' The current line number of point. `%*' `%' if the buffer is read only (see `buffer-read-only'); `*' if the buffer is modified (see `buffer-modified-p'); `-' otherwise. *Note Buffer Modification::. `%+' `*' if the buffer is modified (see `buffer-modified-p'); `%' if the buffer is read only (see `buffer-read-only'); `-' otherwise. This differs from `%*' only for a modified read-only buffer. *Note Buffer Modification::. `%&' `*' if the buffer is modified, and `-' otherwise. `%s' The status of the subprocess belonging to the current buffer, obtained with `process-status'. *Note Process Information::. `%l' The current line number. `%S' The name of the selected frame; this is only meaningful under the X Window System. *Note Frame Name::. `%t' Whether the visited file is a text file or a binary file. (This is a meaningful distinction only on certain operating systems.) `%p' The percentage of the buffer text above the *top* of window, or `Top', `Bottom' or `All'. `%P' The percentage of the buffer text that is above the *bottom* of the window (which includes the text visible in the window, as well as the text above the top), plus `Top' if the top of the buffer is visible on screen; or `Bottom' or `All'. `%n' `Narrow' when narrowing is in effect; nothing otherwise (see `narrow-to-region' in *Note Narrowing::). `%C' Under XEmacs/mule, the mnemonic for `buffer-file-coding-system'. `%[' An indication of the depth of recursive editing levels (not counting minibuffer levels): one `[' for each editing level. *Note Recursive Editing::. `%]' One `]' for each recursive editing level (not counting minibuffer levels). `%%' The character `%'--this is how to include a literal `%' in a string in which `%'-constructs are allowed. `%-' Dashes sufficient to fill the remainder of the modeline. The following two `%'-constructs are still supported, but they are obsolete, since you can get the same results with the variables `mode-name' and `global-mode-string'. `%m' The value of `mode-name'. `%M' The value of `global-mode-string'. Currently, only `display-time' modifies the value of `global-mode-string'.  File: lispref.info, Node: Hooks, Prev: Modeline Format, Up: Modes Hooks ===== A "hook" is a variable where you can store a function or functions to be called on a particular occasion by an existing program. XEmacs provides hooks for the sake of customization. Most often, hooks are set up in the `.emacs' file, but Lisp programs can set them also. *Note Standard Hooks::, for a list of standard hook variables. Most of the hooks in XEmacs are "normal hooks". These variables contain lists of functions to be called with no arguments. The reason most hooks are normal hooks is so that you can use them in a uniform way. You can usually tell when a hook is a normal hook, because its name ends in `-hook'. The recommended way to add a hook function to a normal hook is by calling `add-hook' (see below). The hook functions may be any of the valid kinds of functions that `funcall' accepts (*note What Is a Function::). Most normal hook variables are initially void; `add-hook' knows how to deal with this. As for abnormal hooks, those whose names end in `-function' have a value that is a single function. Those whose names end in `-hooks' have a value that is a list of functions. Any hook that is abnormal is abnormal because a normal hook won't do the job; either the functions are called with arguments, or their values are meaningful. The name shows you that the hook is abnormal and that you should look at its documentation string to see how to use it properly. Major mode functions are supposed to run a hook called the "mode hook" as the last step of initialization. This makes it easy for a user to customize the behavior of the mode, by overriding the local variable assignments already made by the mode. But hooks are used in other contexts too. For example, the hook `suspend-hook' runs just before XEmacs suspends itself (*note Suspending XEmacs::). Here's an expression that uses a mode hook to turn on Auto Fill mode when in Lisp Interaction mode: (add-hook 'lisp-interaction-mode-hook 'turn-on-auto-fill) The next example shows how to use a hook to customize the way XEmacs formats C code. (People often have strong personal preferences for one format or another.) Here the hook function is an anonymous lambda expression. (add-hook 'c-mode-hook (function (lambda () (setq c-indent-level 4 c-argdecl-indent 0 c-label-offset -4 c-continued-statement-indent 0 c-brace-offset 0 comment-column 40)))) (setq c++-mode-hook c-mode-hook) The final example shows how the appearance of the modeline can be modified for a particular class of buffers only. (add-hook 'text-mode-hook (function (lambda () (setq modeline-format '(modeline-modified "Emacs: %14b" " " default-directory " " global-mode-string "%[(" mode-name minor-mode-alist "%n" modeline-process ") %]---" (-3 . "%p") "-%-"))))) At the appropriate time, XEmacs uses the `run-hooks' function to run particular hooks. This function calls the hook functions you have added with `add-hooks'. - Function: run-hooks &rest hookvar This function takes one or more hook variable names as arguments, and runs each hook in turn. Each HOOKVAR argument should be a symbol that is a hook variable. These arguments are processed in the order specified. If a hook variable has a non-`nil' value, that value may be a function or a list of functions. If the value is a function (either a lambda expression or a symbol with a function definition), it is called. If it is a list, the elements are called, in order. The hook functions are called with no arguments. For example, here's how `emacs-lisp-mode' runs its mode hook: (run-hooks 'emacs-lisp-mode-hook) - Function: add-hook hook function &optional append local This function is the handy way to add function FUNCTION to hook variable HOOK. The argument FUNCTION may be any valid Lisp function with the proper number of arguments. For example, (add-hook 'text-mode-hook 'my-text-hook-function) adds `my-text-hook-function' to the hook called `text-mode-hook'. You can use `add-hook' for abnormal hooks as well as for normal hooks. 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, FUNCTION goes at the front of the hook list, so it will be executed first (barring another `add-hook' call). If the optional argument APPEND is non-`nil', the new hook function goes at the end of the hook list and will be executed last. If LOCAL is non-`nil', that says to make the new hook function local to the current buffer. Before you can do this, you must make the hook itself buffer-local by calling `make-local-hook' (*not* `make-local-variable'). If the hook itself is not buffer-local, then the value of LOCAL makes no difference--the hook function is always global. - Function: remove-hook hook function &optional local This function removes FUNCTION from the hook variable HOOK. If LOCAL is non-`nil', that says to remove FUNCTION from the local hook list instead of from the global hook list. If the hook itself is not buffer-local, then the value of LOCAL makes no difference. - Function: make-local-hook hook This function makes the hook variable `hook' local to the current buffer. When a hook variable is local, it can have local and global hook functions, and `run-hooks' runs all of them. This function works by making `t' an element of the buffer-local value. That serves as a flag to use the hook functions in the default value of the hook variable as well as those in the local value. Since `run-hooks' understands this flag, `make-local-hook' works with all normal hooks. It works for only some non-normal hooks--those whose callers have been updated to understand this meaning of `t'. Do not use `make-local-variable' directly for hook variables; it is not sufficient.  File: lispref.info, Node: Documentation, Next: Files, Prev: Modes, Up: Top Documentation ************* XEmacs 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 XEmacs are not the same thing as the XEmacs 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. * Menu: * Documentation Basics:: Good style for doc strings. Where to put them. How XEmacs 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 XEmacs help facilities. * Obsoleteness:: Upgrading Lisp functionality over time.  File: lispref.info, Node: Documentation Basics, Next: Accessing Documentation, Up: Documentation Documentation Basics ==================== A documentation string is written using the Lisp syntax for strings, with double-quote characters surrounding the text of the string. This is because it really is a Lisp string object. The string serves as documentation when it is written in the proper place in the definition of a function or variable. In a function definition, the documentation string follows the argument list. In a variable definition, the documentation string follows the initial value of the variable. When you write a documentation string, make the first line a complete sentence (or two complete sentences) since some commands, such as `apropos', show only the first line of a multi-line documentation string. Also, you should not indent the second line of a documentation string, if you have one, because that looks odd when you use `C-h f' (`describe-function') or `C-h v' (`describe-variable'). *Note Documentation Tips::. Documentation strings may contain several special substrings, which stand for key bindings to be looked up in the current keymaps when the documentation is displayed. This allows documentation strings to refer to the keys for related commands and be accurate even when a user rearranges the key bindings. (*Note Accessing Documentation::.) Within the Lisp world, a documentation string is accessible through the function or variable that it describes: * The documentation for a function is stored in the function definition itself (*note Lambda Expressions::). The function `documentation' knows how to extract it. * The documentation for a variable is stored in the variable's property list under the property name `variable-documentation'. The function `documentation-property' knows how to extract it. To save space, the documentation for preloaded functions and variables (including primitive functions and autoloaded functions) is stored in the "internal doc file" `DOC'. The documentation for functions and variables loaded during the XEmacs session from byte-compiled files is stored in those very same byte-compiled files (*note Docs and Compilation::). XEmacs does not keep documentation strings in memory unless necessary. Instead, XEmacs maintains, for preloaded symbols, an integer offset into the internal doc file, and for symbols loaded from byte-compiled files, a list containing the filename of the byte-compiled file and an integer offset, in place of the documentation string. The functions `documentation' and `documentation-property' use that information to read the documentation from the appropriate file; this is transparent to the user. For information on the uses of documentation strings, see *Note Help: (emacs)Help. The `emacs/lib-src' directory contains two utilities that you can use to print nice-looking hardcopy for the file `emacs/etc/DOC-VERSION'. These are `sorted-doc.c' and `digest-doc.c'.  File: lispref.info, Node: Accessing Documentation, Next: Keys in Documentation, Prev: Documentation Basics, Up: Documentation Access to Documentation Strings =============================== - Function: documentation-property symbol property &optional verbatim This function returns the documentation string that is recorded in SYMBOL's property list under property PROPERTY. It retrieves the text from a file if necessary, and runs `substitute-command-keys' to substitute actual key bindings. (This substitution is not done if VERBATIM is non-`nil'; the VERBATIM argument exists only as of Emacs 19.) (documentation-property 'command-line-processed 'variable-documentation) => "t once command line has been processed" (symbol-plist 'command-line-processed) => (variable-documentation 188902) - Function: documentation function &optional verbatim This function returns the documentation string of FUNCTION. It reads the text from a file if necessary. Then (unless VERBATIM is non-`nil') it calls `substitute-command-keys', to return a value containing the actual (current) key bindings. The function `documentation' signals a `void-function' error if FUNCTION has no function definition. However, it is ok if the function definition has no documentation string. In that case, `documentation' returns `nil'. Here is an example of using the two functions, `documentation' and `documentation-property', to display the documentation strings for several symbols in a `*Help*' buffer. (defun describe-symbols (pattern) "Describe the XEmacs Lisp symbols matching PATTERN. All symbols that have PATTERN in their name are described in the `*Help*' buffer." (interactive "sDescribe symbols matching: ") (let ((describe-func (function (lambda (s) ;; Print description of symbol. (if (fboundp s) ; It is a function. (princ (format "%s\t%s\n%s\n\n" s (if (commandp s) (let ((keys (where-is-internal s))) (if keys (concat "Keys: " (mapconcat 'key-description keys " ")) "Keys: none")) "Function") (or (documentation s) "not documented")))) (if (boundp s) ; It is a variable. (princ (format "%s\t%s\n%s\n\n" s (if (user-variable-p s) "Option " "Variable") (or (documentation-property s 'variable-documentation) "not documented"))))))) sym-list) ;; Build a list of symbols that match pattern. (mapatoms (function (lambda (sym) (if (string-match pattern (symbol-name sym)) (setq sym-list (cons sym sym-list)))))) ;; Display the data. (with-output-to-temp-buffer "*Help*" (mapcar describe-func (sort sym-list 'string<)) (print-help-return-message)))) The `describe-symbols' function works like `apropos', but provides more information. (describe-symbols "goal") ---------- Buffer: *Help* ---------- goal-column Option *Semipermanent goal column for vertical motion, as set by C-x C-n, or nil. set-goal-column Command: C-x C-n Set the current horizontal position as a goal for C-n and C-p. Those commands will move to this position in the line moved to rather than trying to keep the same horizontal position. With a non-nil argument, clears out the goal column so that C-n and C-p resume vertical motion. The goal column is stored in the variable `goal-column'. 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* ---------- - Function: Snarf-documentation filename This function is used only during XEmacs initialization, just before the runnable XEmacs is dumped. It finds the file offsets of the documentation strings stored in the file FILENAME, and records them in the in-core function definitions and variable property lists in place of the actual strings. *Note Building XEmacs::. XEmacs finds the file FILENAME in the `lib-src' directory. When the dumped XEmacs is later executed, the same file is found in the directory `doc-directory'. The usual value for FILENAME is `DOC', but this can be changed by modifying the variable `internal-doc-file-name'. - Variable: internal-doc-file-name This variable holds the name of the file containing documentation strings of built-in symbols, usually `DOC'. The full pathname of the internal doc file is `(concat doc-directory internal-doc-file-name)'. - Variable: doc-directory This variable holds the name of the directory which contains the "internal doc file" that contains documentation strings for built-in and preloaded functions and variables. In most cases, this is the same as `exec-directory'. They may be different when you run XEmacs from the directory where you built it, without actually installing it. See `exec-directory' in *Note Help Functions::. In older Emacs versions, `exec-directory' was used for this. - Variable: data-directory This variable holds the name of the directory in which XEmacs finds certain system independent documentation and text files that come with XEmacs. In older Emacs versions, `exec-directory' was used for this.  File: lispref.info, Node: Keys in Documentation, Next: Describing Characters, Prev: Accessing Documentation, Up: Documentation Substituting Key Bindings 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 `substitute-command-keys'. You can also call that function yourself. Here is a list of the special sequences and what they mean: `\[COMMAND]' stands for a key sequence that will invoke COMMAND, or `M-x COMMAND' if COMMAND has no key bindings. `\{MAPVAR}' stands for a summary of the value of MAPVAR, which should be a keymap. The summary is made by `describe-bindings'. `\' stands for no text itself. It is used for a side effect: it specifies MAPVAR as the keymap for any following `\[COMMAND]' sequences in this documentation string. `\=' quotes the following character and is discarded; this `\=\=' puts `\=' into the output, and `\=\[' puts `\[' into the output. *Please note:* Each `\' must be doubled when written in a string in XEmacs Lisp. - Function: substitute-command-keys string This function scans 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. Here are examples of the special sequences: (substitute-command-keys "To abort recursive edit, type: \\[abort-recursive-edit]") => "To abort recursive edit, type: C-]" (substitute-command-keys "The keys that are defined for the minibuffer here are: \\{minibuffer-local-must-match-map}") => "The keys that are defined for the minibuffer here are: ? minibuffer-completion-help SPC minibuffer-complete-word TAB minibuffer-complete LFD minibuffer-complete-and-exit RET minibuffer-complete-and-exit C-g abort-recursive-edit " (substitute-command-keys "To abort a recursive edit from the minibuffer, type\ \\\\[abort-recursive-edit].") => "To abort a recursive edit from the minibuffer, type C-g." (substitute-command-keys "Substrings of the form \\=\\{MAPVAR} are replaced by summaries \(made by describe-bindings) of the value of MAPVAR, taken as a keymap. Substrings of the form \\=\\ specify to use the value of MAPVAR as the keymap for future \\=\\[COMMAND] substrings. \\=\\= quotes the following character and is discarded; thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ into the output.") => "Substrings of the form \{MAPVAR} are replaced by summaries (made by describe-bindings) of the value of MAPVAR, taken as a keymap. Substrings of the form \ specify to use the value of MAPVAR as the keymap for future \[COMMAND] substrings. \= quotes the following character and is discarded; thus, \=\= puts \= into the output, and \=\[ puts \[ into the output."  File: lispref.info, Node: Describing Characters, Next: Help Functions, Prev: Keys in Documentation, Up: Documentation Describing Characters for Help Messages ======================================= 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. - Function: key-description sequence This function returns a string containing the XEmacs standard notation for the input events in SEQUENCE. The argument SEQUENCE may be a string, vector or list. *Note Events::, for more information about valid events. See also the examples for `single-key-description', below. - Function: single-key-description key This function returns a string describing KEY in the standard XEmacs notation for keyboard input. A normal printing character appears as itself, but a control character turns into a string starting with `C-', a meta character turns into a string starting with `M-', and space, linefeed, etc. appear as `SPC', `LFD', etc. A symbol appears as the name of the symbol. An event that is a list appears as the name of the symbol in the CAR of the list. (single-key-description ?\C-x) => "C-x" (key-description "\C-x \M-y \n \t \r \f123") => "C-x SPC M-y SPC LFD SPC TAB SPC RET SPC C-l 1 2 3" (single-key-description 'kp_next) => "kp_next" (single-key-description '(shift button1)) => "Sh-button1" - Function: text-char-description character This function returns a string describing CHARACTER in the standard XEmacs notation for characters that appear in text--like `single-key-description', except that control characters are represented with a leading caret (which is how control characters in XEmacs buffers are usually displayed). (text-char-description ?\C-c) => "^C" (text-char-description ?\M-m) => "M-m" (text-char-description ?\C-\M-m) => "M-^M"  File: lispref.info, Node: Help Functions, Next: Obsoleteness, Prev: Describing Characters, Up: Documentation Help Functions ============== XEmacs provides a variety of on-line help functions, all accessible to the user as subcommands of the prefix `C-h', or on some keyboards, `help'. For more information about them, see *Note Help: (emacs)Help. Here we describe some program-level interfaces to the same information. - Command: apropos regexp &optional do-all predicate This function finds all symbols whose names contain a match for the regular expression REGEXP, and returns a list of them (*note Regular Expressions::). It also displays the symbols in a buffer named `*Help*', each with a one-line description. If DO-ALL is non-`nil', then `apropos' also shows key bindings for the functions that are found. If PREDICATE is non-`nil', it should be a function to be called on each symbol that has matched REGEXP. Only symbols for which PREDICATE returns a non-`nil' value are listed or displayed. In the first of the following examples, `apropos' finds all the symbols with names containing `exec'. In the second example, it finds and returns only those symbols that are also commands. (We don't show the output that results in the `*Help*' buffer.) (apropos "exec") => (Buffer-menu-execute command-execute exec-directory exec-path execute-extended-command execute-kbd-macro executing-kbd-macro executing-macro) (apropos "exec" nil 'commandp) => (Buffer-menu-execute execute-extended-command) `apropos' is used by various user-level commands, such as `C-h a' (`hyper-apropos'), a graphical front-end to `apropos'; and `C-h A' (`command-apropos'), which does an apropos over only those functions which are user commands. `command-apropos' calls `apropos', specifying a PREDICATE to restrict the output to symbols that are commands. The call to `apropos' looks like this: (apropos string t 'commandp) - Variable: help-map The value of this variable is a local keymap for characters following the Help key, `C-h'. - Prefix Command: help-command This symbol is not a function; its function definition is actually the keymap known as `help-map'. It is defined in `help.el' as follows: (define-key global-map "\C-h" 'help-command) (fset 'help-command help-map) - Function: 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 FUNCTION to it if FUNCTION is non-`nil'. Otherwise it calls `message' to display it in the echo area. This function expects to be called inside a `with-output-to-temp-buffer' special form, and expects `standard-output' to have the value bound by that special form. For an example of its use, see the long example in *Note Accessing Documentation::. - Variable: help-char The value of this variable is the help character--the character that XEmacs recognizes as meaning Help. By default, it is the character `?\^H' (ASCII 8), which is `C-h'. When XEmacs reads this character, if `help-form' is non-`nil' Lisp expression, it evaluates that expression, and displays the result in a window if it is a string. `help-char' can be a character or a key description such as `help' or `(meta h)'. Usually the value of `help-form''s value is `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 `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 `describe-prefix-bindings', which displays a list of all the subcommands of the prefix key. - Variable: help-form If this variable is non-`nil', its value is a form to evaluate whenever the character `help-char' is read. If evaluating the form produces a string, that string is displayed. A command that calls `next-command-event' or `next-event' probably should bind `help-form' to a non-`nil' expression while it does input. (The exception is when `C-h' is meaningful input.) 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 `minibuffer-help-form' (*note Minibuffer Misc::). - Variable: prefix-help-command This variable holds a function to print help for a prefix character. 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 `describe-prefix-bindings'. - Function: describe-prefix-bindings This function calls `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.) The following two functions are found in the library `helper'. They are for modes that want to provide help without relinquishing control, such as the "electric" modes. You must load that library with `(require 'helper)' in order to use them. Their names begin with `Helper' to distinguish them from the ordinary help functions. - Command: Helper-describe-bindings This command pops up a window displaying a help buffer containing a listing of all of the key bindings from both the local and global keymaps. It works by calling `describe-bindings'. - Command: Helper-help This command provides help for the current mode. It prompts the user in the minibuffer with the message `Help (Type ? for further options)', and then provides assistance in finding out what the key bindings are, and what the mode is intended for. It returns `nil'. This can be customized by changing the map `Helper-help-map'.  File: lispref.info, Node: Obsoleteness, Prev: Help Functions, Up: Documentation Obsoleteness ============ As you add functionality to a package, you may at times want to replace an older function with a new one. To preserve compatibility with existing code, the older function needs to still exist; but users of that function should be told to use the newer one instead. XEmacs Lisp lets you mark a function or variable as "obsolete", and indicate what should be used instead. - Function: make-obsolete function new This function indicates that FUNCTION is an obsolete function, and the function NEW should be used instead. The byte compiler will issue a warning to this effect when it encounters a usage of the older function, and the help system will also note this in the function's documentation. NEW can also be a string (if there is not a single function with the same functionality any more), and should be a descriptive statement, such as "use FOO or BAR instead" or "this function is unnecessary". - Function: make-obsolete-variable variable new This is like `make-obsolete' but is for variables instead of functions. - Function: define-obsolete-function-alias oldfun newfun This function combines `make-obsolete' and `define-function', declaring OLDFUN to be an obsolete variant of NEWFUN and defining OLDFUN as an alias for NEWFUN. - Function: define-obsolete-variable-alias oldvar newvar This is like `define-obsolete-function-alias' but for variables. Note that you should not normally put obsoleteness information explicitly in a function or variable's doc string. The obsoleteness information that you specify using the above functions will be displayed whenever the doc string is displayed, and by adding it explicitly the result is redundancy. Also, if an obsolete function is substantially the same as a newer one but is not actually an alias, you should consider omitting the doc string entirely (use a null string `""' as the doc string). That way, the user is told about the obsoleteness and is forced to look at the documentation of the new function, making it more likely that he will use the new function. - Function: function-obsoleteness-doc function If FUNCTION is obsolete, this function returns a string describing this. This is the message that is printed out during byte compilation or in the function's documentation. If FUNCTION is not obsolete, `nil' is returned. - Function: variable-obsoleteness-doc variable This is like `function-obsoleteness-doc' but for variables. The obsoleteness information is stored internally by putting a property `byte-obsolete-info' (for functions) or `byte-obsolete-variable' (for variables) on the symbol that specifies the obsolete function or variable. For more information, see the implementation of `make-obsolete' and `make-obsolete-variable' in `lisp/bytecomp/bytecomp-runtime.el'.  File: lispref.info, Node: Files, Next: Backups and Auto-Saving, Prev: Documentation, Up: Top Files ***** In XEmacs, you can find, create, view, save, and otherwise work with files and file directories. This chapter describes most of the file-related functions of XEmacs Lisp, but a few others are described in *Note Buffers::, and those related to backups and auto-saving are described in *Note 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 using `expand-file-name', so that `~' is handled correctly, as are relative file names (including `../'). These functions don't recognize environment variable substitutions such as `$HOME'. *Note File Name Expansion::. * 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 File Attributes:: 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. * Partial Files:: Treating a section of a buffer as a file. * Format Conversion:: Conversion to and from various file formats. * Files and MS-DOS:: Distinguishing text and binary files on MS-DOS.  File: lispref.info, Node: Visiting Files, Next: Saving Buffers, Up: Files Visiting Files ============== Visiting a file means reading a file into a buffer. Once this is done, we say that the buffer is "visiting" that file, and call the file "the visited file" of the buffer. A file and a buffer are two different things. A file is information recorded permanently in the computer (unless you delete it). A buffer, on the other hand, is information inside of XEmacs that will vanish at the end of the editing session (or when you kill the buffer). Usually, a buffer contains information that you have copied from a file; then we say the buffer is visiting that file. The copy in the buffer is what you modify with editing commands. Such changes to the buffer do not change the file; therefore, to make the changes permanent, you must "save" the buffer, which means copying the altered buffer contents back into the file. In spite of the distinction between files and buffers, people often refer to a file when they mean a buffer and vice-versa. Indeed, we say, "I am editing a file," rather than, "I am editing a buffer 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.  File: lispref.info, Node: Visiting Functions, Next: Subroutines of Visiting, Up: Visiting Files Functions for Visiting Files ---------------------------- This section describes the functions normally used to visit files. For historical reasons, these functions have names starting with `find-' rather than `visit-'. *Note 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 `insert-file-contents' in a temporary buffer. Visiting the file is not necessary and takes longer. *Note Reading from Files::. - Command: find-file filename This command selects a buffer visiting the file 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. The body of the `find-file' function is very simple and looks like this: (switch-to-buffer (find-file-noselect filename)) (See `switch-to-buffer' in *Note Displaying Buffers::.) When `find-file' is called interactively, it prompts for FILENAME in the minibuffer. - Function: find-file-noselect filename &optional nowarn This function is the guts of all the file-visiting functions. It finds or creates a buffer visiting the file FILENAME, and returns it. It uses an existing buffer if there is one, and otherwise creates a new buffer and reads the file into it. You may make the buffer current or display it in a window if you wish, but this function does not do so. When `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, then this function asks the user whether to reread the changed file. If the user says `yes', any changes previously made in the buffer are lost. If `find-file-noselect' needs to create a buffer, and there is no file named FILENAME, it displays the message `New file' in the echo area, and leaves the buffer empty. If NO-WARN is non-`nil', various warnings that XEmacs normally gives (e.g. if another buffer is already visiting FILENAME but FILENAME has been removed from disk since that buffer was created) are suppressed. The `find-file-noselect' function calls `after-find-file' after reading the file (*note 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 `find-file-hooks'. The `find-file-noselect' function returns the buffer that is visiting the file FILENAME. (find-file-noselect "/etc/fstab") => # - Command: find-file-other-window filename This command selects a buffer visiting the file FILENAME, but does so in a window other than the selected window. It may use another existing window or split a window; see *Note Displaying Buffers::. When this command is called interactively, it prompts for FILENAME. - Command: find-file-read-only filename This command selects a buffer visiting the file FILENAME, like `find-file', but it marks the buffer as read-only. *Note Read Only Buffers::, for related functions and variables. When this command is called interactively, it prompts for FILENAME. - Command: view-file filename This command visits FILENAME in View mode, and displays it in a recursive edit, returning to the previous buffer when done. View mode is a mode that allows you to skim rapidly through the file but does not let you modify it. Entering View mode runs the normal hook `view-mode-hook'. *Note Hooks::. When `view-file' is called interactively, it prompts for FILENAME. - Variable: find-file-hooks The value of this variable is a list of functions to be called after a file is visited. The file's local-variables specification (if any) will have been processed before the hooks are run. The buffer visiting the file is current when the hook functions are run. This variable works just like a normal hook, but we think that renaming it would not be advisable. - Variable: find-file-not-found-hooks The value of this variable is a list of functions to be called when `find-file' or `find-file-noselect' is passed a nonexistent file name. `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-`nil'. `buffer-file-name' is already set up. This is not a normal hook because the values of the functions are used and they may not all be called.  File: lispref.info, Node: Subroutines of Visiting, Prev: Visiting Functions, Up: Visiting Files Subroutines of Visiting ----------------------- The `find-file-noselect' function uses the `create-file-buffer' and `after-find-file' functions as subroutines. Sometimes it is useful to call them directly. - Function: create-file-buffer filename This function creates a suitably named buffer for visiting FILENAME, and returns it. It uses FILENAME (sans directory) as the name if that name is free; otherwise, it appends a string such as `<2>' to get an unused name. See also *Note Creating Buffers::. *Please note:* `create-file-buffer' does _not_ associate the new buffer with a file and does not select the buffer. It also does not use the default major mode. (create-file-buffer "foo") => # (create-file-buffer "foo") => #> (create-file-buffer "foo") => #> This function is used by `find-file-noselect'. It uses `generate-new-buffer' (*note Creating Buffers::). - Function: after-find-file &optional error warn noauto This function sets the buffer major mode, and parses local variables (*note Auto Major Mode::). It is called by `find-file-noselect' and by the default revert function (*note Reverting::). If reading the file got an error because the file does not exist, but its directory does exist, the caller should pass a non-`nil' value for ERROR. In that case, `after-find-file' issues a warning: `(New File)'. For more serious errors, the caller should usually not call `after-find-file'. If WARN is non-`nil', then this function issues a warning if an auto-save file exists and is more recent than the visited file. If NOAUTO is non-`nil', then this function does not turn on auto-save mode; otherwise, it does. The last thing `after-find-file' does is call all the functions in `find-file-hooks'.