|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T l
Length: 51361 (0xc8a1)
Types: TextFile
Names: »lispref-11«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
└─⟦c06c473ab⟧ »./UNRELEASED/lispref.tar.Z«
└─⟦1b57a2ffe⟧
└─⟦this⟧ »lispref-11«
Info file: lispref, -*-Text-*-
produced by texinfo-format-buffer
from file: lispref.texinfo
This file documents GNU Emacs Lisp.
This is Edition 0.1 Beta of the GNU Emacs Lisp Reference Manual, for
Emacs Version 18, with some references to Emacs Version 19.
Please read this document for review purposes.
Published by the Free Software Foundation, 675 Massachusetts Avenue,
Cambridge, MA 02139 USA
Copyright (C) 1989 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the Foundation.
▶1f◀
File: lispref Node: Documentation, Prev: Major and Minor Modes, Up: Top, Next: Files
Documentation
*************
GNU Emacs Lisp has a simple to use facility for displaying the
documentation strings that are associated with functions and variables.
In addition, Emacs has powerful on-line help.
Documentation strings should be distinguished from manuals such as
this one, which can be examined inside Emacs using Info. A manual is
defined by its own source file; documentation strings are specified in
the source of the functions and variables documented.
* Menu:
* Documentation Basics::
* Documentation Strings::
* Help Functions::
▶1f◀
File: lispref Node: Documentation Basics, Prev: Documentation, Up: Documentation, Next: Documentation Strings
Documentation Basics
====================
A documentation string is written between double quotes, `"like
this"'.
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, you should make the first line
a complete sentence (or two compelte sentences) since some commands,
such as `apropos', print only the first line of a multi-line
documentation string. Also, you should not indent the second line of a
documentation string, if you have one, because that looks odd when you
use `C-h f' (`describe-function') or `C-h v' (`describe-variable').
In Emacs Lisp, the underlying principle is that adocumentation string
is kept with the function or variable which 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 on the variable's
property list under the property name `variable-documentation'.
The function `documentation-property' knows how to extract it.
However, to save space, the documentation for preloaded functions and
variables (including primitive functions and autoloaded functions)
stored in the `emacs/etc/DOC-VERSION' file. Both the `documentation'
and the `documentation-property' functions know how to access the
`emacs/etc/DOC-VERSION' file, and the process is transparent to the
user. In this case, the `variable-documentation' property of the symbol
is an integer offset into the `emacs/etc/DOC-VERSION' file. Keeping the
documentation strings out of the Emacs core image saves a significant
amount of space.
See `where-is-internal' and `describe-bindings' in *Note Global and
Local Keymaps::. Also, *Note Help: (emacs)Help..
The `emacs/etc' directory contains two utilities for printing the
`emacs/etc/DOC-VERSION' file in hardcopy. These are `sorted-doc.c' and
`digest-doc.c'.
In addition, documentation strings may contain several special
substrings. These substrings allow the functions which retrieve them to
substitute the actual (current) key bindings into the strings, using the
`substitute-command-keys' function. (*Note Documentation Strings::.)
▶1f◀
File: lispref Node: Documentation Strings, Prev: Documentation Basics, Up: Documentation, Next: Help Functions
Access to Documentation Strings
===============================
* Function: documentation-property SYMBOL PROPERTY
This function returns the documentation string that is SYMBOL's
PROPERTY. Use of this function differs from using `get', since
`documentation-property' is also able to access documentation
strings that are stored in the `emacs/etc/DOC-VERSION' file. In
addition, `documentation-property' runs `substitute-command-keys'
on the resulting string, so Emacs will display the actual (current)
keybindings.
(documentation-property 'command-line-processed
'variable-documentation)
=> "t once command line has been processed"
(symbol-plist 'command-line-processed)
=> (variable-documentation 188902)
* Function: documentation FUNCTION
This function returns the documentation string of FUNCTION. If
the documentation string is stored in the `emacs/etc/DOC-VERSION'
file, this function will access it there.
In addition, `documentation' runs `substitute-command-keys' on
the resulting string, so the value contains the actual (current)
keybindings.
Emacs signals a `void-function' error unless FUNCTION has a
function definition. However, FUNCTION does not need to have a
documentation string. If there is no documentation string, the
function returns `nil'.
Here is a function which uses `documentation' and
`documentation-property' to display the documentation strings for
several symbols in a `*Help*' buffer.
(defun describe-symbols (pattern)
"Describe the currently active Emacs Lisp symbols matching PATTERN.
All symbols that have PATTERN in their name are described
in the *Help* buffer."
(interactive "sDescribe symbols matching: ")
(let ((describe-func
(function
(lambda (s)
;; Print description of symbol.
(if (fboundp s) ; It is a function.
(princ
(format "%s\t%s\n%s\n\n" s
(if (commandp s)
(concat "Command: "
(or (mapconcat
'key-description
(where-is-internal s)
" ")))
"Function")
(or (documentation s)
"not documented"))))
(if (boundp s) ; It is a variable.
(princ
(format "%s\t%s\n%s\n\n" s
(if (user-variable-p s)
"Option "
"Variable")
(or
(documentation-property
s
'variable-documentation)
"not documented"))))))
sym-list)
;; Build a list of symbols that match pattern.
(mapatoms (function
(lambda (sym)
(if (string-match pattern
(symbol-name sym))
(setq sym-list (cons sym sym-list))
))))
;; Display the data.
(with-output-to-temp-buffer "*Help*"
(mapcar describe-func (sort sym-list 'string<))
(print-help-return-message))))
The `describe-symbols' function works like `apropos', but
provides more information.
(describe-symbols "goal")
---------- Buffer: *Help* ----------
goal-column Option
*Semipermanent goal column for vertical motion,
as set by C-x C-n, or nil.
set-goal-column Command: C-x C-n
Set the current horizontal position as a goal for C-n and C-p.
Those commands will move to this position in the line moved to
rather than trying to keep the same horizontal position.
With a non-nil argument, clears out the goal column
so that C-n and C-p resume vertical motion.
temporary-goal-column Variable
Current goal column for vertical motion.
It is the column where point was at the start of current run
of vertical motion commands.
---------- Buffer: *Help* ----------
* Function: Snarf-documentation FILENAME
This function is used only during Emacs initialization. It is
executed before the system dumps a runnable Emacs.
`Snarf-documentation' finds the file-offsets of the documentation
strings stored in the file FILENAME, and records them in the
in-core function definitions in place of the documentation strings.
FILENAME is found in the `emacs/etc' directory (usually FILENAME
is `"DOC-VERSION"'). When the dumped Emacs is later executed, the
file is found in the `exec-directory'.
* Function: substitute-command-keys STRING
This function returns STRING with modifications made to specially
formatted substrings such that the actual (current) keybindings are
listed. This permists the documentation to provide information
that is updated to contain information about the current key
bindings. (The key bindings may change between the time Emacs is
built and the time that the documentation is asked for.)
The following table lists the forms of the special substrings
that are recognized by `substitute-command-keys' and the forms with
which the special substrings are replaced.
`\[COMMAND]'
replaced by either a keystroke sequence that will invoke
COMMAND or `M-x COMMAND' if COMMAND is not bound to a key
sequence.
`\{MAPVAR} '
replaced by a summary (made by `describe-bindings') of the
value of MAPVAR, taken as a keymap.
`\<MAPVAR> '
make `substitute-command-keys' use the value of MAPVAR as the
keymap for future `\[COMMAND]' substrings. This special
string does not produce any replacement text itself; it only
affects the replacements done later.
Note: Each `\' must be doubled when written in a string in
Emacs Lisp.
Here are examples of each special substring:
(substitute-command-keys
"To abort recursive edit, type: \\[abort-recursive-edit]")
=> "To abort recursive edit, type: C-]"
(substitute-command-keys
"The keys which are defined for the minibuffer here are:
\\{minibuffer-local-must-match-map}")
=> "The keys which are defined for the minibuffer here are:
? minibuffer-completion-help
SPC minibuffer-complete-word
TAB minibuffer-complete
LFD minibuffer-complete-and-exit
RET minibuffer-complete-and-exit
C-g abort-recursive-edit
"
(substitute-command-keys
"To abort a recursive edit from the minibuffer, type
\\<minibuffer-local-must-match-map>\\[abort-recursive-edit]")
=> "To abort a recursive edit from the minibuffer, type C-g"
* Function: key-description STRING
This function returns a string for printing the Emacs standard
notation of the characters in STRING. See the examples for
`single-key-description'.
* Function: single-key-description CHARACTER
This function returns a string for printing CHARACTER in the
standard Emacs notation. Normal printing characters don't change,
control characters turn into a string starting with `C-', meta
characters turn into a string starting with `M-', and space,
linefeed, etc. are transformed to SPC, LFD, etc.
(single-key-description ?\C-x)
=> "C-x"
(key-description "\C-x \M-y \n \t \r \f123")
=> "C-x SPC M-y SPC LFD SPC TAB SPC RET SPC C-l 1 2 3"
* Function: text-char-description CHARACTER
This function returns a string for printing CHARACTER. This is
like `single-key-description', except that that control characters
are represented with a leading caret (uparrow).
(text-char-description ?\C-c)
=> "^C"
(text-char-description ?\M-m)
=> "M-m"
(text-char-description ?\C-\M-m)
=> "M-^M"
▶1f◀
File: lispref Node: Help Functions, Prev: Documentation Strings, Up: Documentation
Help Functions
==============
Emacs provides a variety of on-line help functions. You can get to
all of them by typing `C-h' and then a key. Here we describe some
program-level interfaces. For more information about the interactive
help commands, *Note Help: (emacs)Help..
In addition, `M-.' (`find-tag') is often helpful, as it brings you to
the source of a function or variable.
Emacs loads the default help commands from the `emacs/lisp/help.el'
library. In addition, Emacs has a `emacs/lisp/helper.el' library of
utilities. This latter library is for modes that want to provide help
without relinquishing control, such as the `electric' modes. (To
distinguish them from the regular help functions, all the functions in
the `emacs/lisp/helper.el' library have names beginning with `Helper'.)
* Command: apropos REGEXP &optional PREDICATE NOPRINT
This function finds all symbols whose names contain a match for
the regular expression REGEXP, and returns a list of them.
Normally it will also pop up a window with the `*Help*' buffer in
it, displaying the symbols and a one line description. (Since only
the first lines of documentation strings are displayed, try to make
the first lines of your documentation strings whole sentences.) If
NOPRINT is non-`nil', it does not display them, but just returns
the list.
If PREDICATE is non-`nil', then that predicate is called on each
symbol that has matched REGEXP and only symbols for which that
predicate returns a non-`nil' value are listed (and displayed).
When you call `apropos' interactively, Emacs prompts for REGEXP
in the minibuffer.
In the first of the following examples, Emacs finds all the
matches to `exec'. They are returned but not displayed. In the
second example, Emacs finds and returns only those symbols that are
also commands; in addition, they are then displayed in the `*Help*'
buffer.
(apropos "exec" nil t)
=> (Buffer-menu-execute command-execute exec-directory
exec-path execute-extended-command execute-kbd-macro
executing-kbd-macro executing-macro)
(apropos "exec" 'commandp)
=> (Buffer-menu-execute execute-extended-command)
---------- Buffer: *Help* ----------
Buffer-menu-execute
Function: Save and/or delete buffers marked with
M-x Buffer-menu-save or M-x Buffer-menu-delete commands.
execute-extended-command ESC x
Function: Read function name, then read its arguments and call it.
---------- Buffer: *Help* ----------
Typing `C-h a' (`command-apropos') calls `apropos', but the
command only displays information about symbols that are commands.
In the body of the `command-apropos' function, the call to
`apropos' looks like this:
(apropos string 'commandp)
* User Option: completion-auto-help
If this variable is non-`nil', Emacs automatically displays a
list of possible completions, whenever the user asks for completion
but nothing can be completed because the next character is not
unique.
* Function: help-command
This function is a keymap equivalent to `help-map'. It is
defined in `emacs/lisp/help.el' like this:
(define-key global-map "\C-h" 'help-command)
(fset 'help-command help-map)
* Variable: help-map
The value of this variable is a local keymap for characters
following the Help key.
* Function: print-help-return-message &optional FUNCTION
This function builds a message explaining how to restore the
previous state of the windows after a help command. After building
the message, it applies FUNCTION to it if FUNCTION is non-`nil'.
Otherwise it applies `message' to it, thus printing it in the echo
area.
This function expects to be called inside of a
`with-output-to-temp-buffer' special form, and expects the value of
`standard-output' to be the temporary buffer used by that special
form, which is what it will be if you do not change it.
See the example in the section describing the `documentation'
function (*Note Documentation Strings::).
The constructed message will be one of the forms shown below.
(print-help-return-message)
---------- Echo Area ----------
Type C-x 1 to remove help window.
---------- Echo Area ----------
---------- Echo Area ----------
Type C-x 4 b RET to restore old contents of help window.
---------- Echo Area ----------
Also, see the description of `where-is-internal'; this function
returns list of key sequences (of any length) that are bound to
COMMAND in the local keymap and the global keymap. *Note Global
and Local Keymaps::.
The following two functions are found in the library `helper'. You
must load that library with `(require 'helper)' in order to use them.
* Command: Helper-describe-bindings
This command pops up a window displaying the 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 a message: `Help (Type ? for further
options)', and then provides assistance for 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'.
* Variable: help-char
The value of this variable is the character that Emacs recognizes
as meaning Help. When Emacs reads this character (which is usually
8, the value of `C-h'), Emacs evaluates `(eval help-form)', and
displays the result if it is a string. If `help-form''s value is
`nil', this character is read normally.
* Variable: help-form
The value of this variable is a form to execute when the
character `help-char' is read. If the form returns a string, that
string is displayed. If `help-form' is `nil', then the help
character is not recognized.
▶1f◀
File: lispref Node: Files, Prev: Documentation, Up: Top, Next: Backups and Auto Saving
Files
*****
In Emacs, you can find, create, view, save, and otherwise work with
files and directories. Not all of the file-related functions are
described in this chapter; some are described in *Note Buffers::; and,
functions related to backups and auto saving are described in *Note
Backups and Auto Saving::.
* Menu:
* Visiting Files::
* Saving Buffers::
* Reading from Files::
* Writing to Files::
* File Locks::
* Information about Files::
* Contents of Directories::
* Changing File Names and Attributes::
* File Names::
▶1f◀
File: lispref Node: Visiting Files, Prev: Files, Up: Files, Next: Saving Buffers
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 entities. 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; thus, we
say the buffer is visiting that file. This copy is what you work on and
modify. Changes to the buffer do not change the file, until you save
the file. When you save the file, the buffer is copied to the file and
is thus saved permanently.
In spite of the distinction between files and buffers, people often
refer to a file when they mean a buffer and vice-versa. Indeed, most
people say, ``I am editing a file,'' rather than saying, ``I am editing
a buffer which I will soon save as a file of the same name.'' It is
almost always clear from context what people mean. When dealing with a
computer program, however, it is well to keep the distinction in mind,
since the computer is not as smart as a person.
For historical reasons, these functions are called `find-...', rather
than `visit-...'.
*Note Buffer File Name::, for functions and variables that relate to
the visited file name of a buffer.
* Command: find-file FILENAME
This function reads FILENAME into a buffer and displays that
buffer in the selected window, in which the user may edit it.
The body of the `find-file' function is very simple and looks like
this:
(switch-to-buffer (find-file-noselect filename))
(See `switch-to-buffer' in *Note Changing Buffers::.)
When `find-file' is called interactively, Emacs prompts for
FILENAME in the minibuffer.
* Function: find-file-noselect FILENAME
This function is the guts of all the file-visting functions. It
reads a file into a buffer and returns the buffer. You may then
display the buffer in a window if you wish, but this function does
not do so. The buffer is not made the current buffer. (If you
wish to edit the file, you have to switch to it.)
If no buffer is currently visiting FILENAME, then one is created
and the file is visited. If FILENAME does not exist, it is created
as empty, and Emacs displays a message `New file' in the echo area.
If a buffer is already visiting FILENAME, then
`find-file-noselect' verifies that the file has not changed since
it was last visited or saved, and returns that buffer. If the file
has changed, then this function offers to re-read the changed file.
If the user says `yes', any changes previously made in the buffer
will be lost.
The `find-file-noselect' function calls `after-find-file' after
the file is found. The `after-find-file' function sets the buffer
major mode, parses local variables, warns the user if there exists
an auto-save file more recent than the file just visited, and
finishes by running the hooks in `find-file-hooks'.
The `find-file-noselect' function returns the buffer visiting the
file.
(find-file-noselect "foo")
=> #<buffer foo>
Note that the `find-file-noselect' function checks whether a
buffer is already visiting FILENAME; if it is, the function
verifies that the file has not changed since it was last visited or
saved, and returns that buffer. If the file has changed, Emacs
offers to read in the changed file. If the user says `yes', any
changes made to the buffer will be lost.
* Command: find-alternate-file FILENAME
This function reads in the file FILENAME, and selects its buffer,
killing the previous buffer. If your current buffer contains an
empty file that you just visited by mistake, use this command to
visit the file you really want.
When this function is called interactively, Emacs prompts you for
FILENAME.
* Command: find-file-other-window FILENAME
This function visits the file FILENAME, and displays its buffer
in a window other than the selected window. If there are two or
more windows on the screen, then the non-selected window will be
used. If there is only one window, it will be split. The function
returns `nil'.
When this function is called interactively, Emacs prompts for
FILENAME.
* Command: find-file-read-only FILENAME
This function visits the file named FILENAME and selects its
buffer, just like `find-file', but it marks the buffer as
read-only. *Note Read Only Buffers::, for related functions and
variables.
When this function is called interactively, Emacs prompts for
FILENAME.
* Command: view-file FILENAME
This function views FILENAME in "View mode", returning to the
previous buffer when done. View mode is a mode that allows you to
skim rapidly through the file but does not let you modify it.
After loading the file, `view-file' calls the value of
`view-hook' if that is non-`nil'.
When this function is called interactively, Emacs prompts for
FILENAME in the minibuffer.
* 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 hooks are fun.
* Variable: find-file-not-found-hooks
The value of this variable is a list of functions to be called
when `find-file' or `find-file-noselect' is passed a nonexistent
FILENAME. These functions are called as soon as the error is
detected. `buffer-file-name' is already set up. The functions are
called in the order given, until one of them returns non-`nil'.
* Menu:
* Subroutines of Visiting::
▶1f◀
File: lispref Node: Subroutines of Visiting, Prev: Visiting Files, Up: Visiting Files
Subroutines of Visiting
-----------------------
The `find-file-noselect' function uses the `after-find-file' and
`create-file-buffer' functions.
* Function: after-find-file &optional ERROR WARN
This function is called by `find-file-noselect' and by the
default revert function (*Note Reverting::). It sets the buffer
major mode, and parses local variables.
If there was an error in opening the file, the calling function
should pass ERROR a non-`nil' value. In that case,
`after-find-file' issues a warning: `(New File)'. Note that, for
serious errors, you would not even call `after-find-file'. Only
``file not found'' errors get here with a non-`nil' ERROR.
If WARN is non-`nil', then Emacs will issue a warning if there
exists an auto-save file more recent than the visited file.
The last thing `after-find-file' does is call all the functions
in `find-file-hooks'.
* Function: create-file-buffer FILENAME
This function creates a suitably named buffer for visiting
FILENAME, and returns it. The string FILENAME (sans directory) is
used unchanged if that name is free; otherwise a string such as
`<2>' is appended to get an unused name. Also *Note Creating
Buffers::.
Note: `create-file-buffer' does *not* associate the new buffer
with any file and does not make it the current buffer.
(create-file-buffer "foo")
=> #<buffer foo>
(create-file-buffer "foo")
=> #<buffer foo<2>>
(create-file-buffer "foo")
=> #<buffer foo<3>>
This function is used by `find-file-noselect'.
▶1f◀
File: lispref Node: Saving Buffers, Prev: Visiting Files, Up: Files, Next: Reading from Files
Saving Buffers
==============
When you work on 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 work on and modify.
Changes to the buffer do not change the file, until you save the buffer
as a newly written file. The save buffer commands do this.
* 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. Otherwise, it does
nothing.
If BACKUP-OPTION is `nil', the `save-buffer' function make a
backup file only if this is the first save or if the buffer was
previously modified.
The `save-buffer' function is designed for interactive use; and
the value of BACKUP-OPTION then depends of the number of `C-u'
keystrokes prefixing the `save-buffer' command.
* With 1 or 3 `C-u''s, the `save-buffer' function marks this
version of the buffer to be backed up.
* With 2 or 3 `C-u''s, the `save-buffer' function
unconditionally backs up previous version.
If a file's name is `foo', the names of its numbered backup
versions are `foo.~V~', for various integers V, like this:
`foo.~1~', `foo.~2~', `foo.~3~', ..., `foo.~259~', and so on. A
non-numbered backup file is called `foo~'.
Numeric backups (rather than `foo~') will be made if the value of
`version-control' is not the symbol `never', and either there are
already numeric versions of the file being backed up or else
`version-control' is non-`nil'. (Thus, numeric backups will be
kept if the value of `version-control' is `t'.)
`dired-kept-versions' controls `dired''s `dired-clean-directory'
(`.') command. No one wants to save too many versions of a file,
since that takes up too much disk space. The variable
`kept-old-versions' tells the system how many of the oldest
versions to keep; and the variable `kept-new-versions' tells the
system how many new versions to keep. The defaults values are two
old versions and two new. Thus, if you had made a total of 77
versions of `foo', your directory would contain `foo.~1~',
`foo.~2~', `foo.~75~', `foo.~76~', and `foo', the current version.
If the value of the `trim-versions-without-asking' variable is
`nil', the system queries the user before deleting excess versions.
Otherwise it does it silently.
* Command: save-buffers-kill-emacs &optional KILL-SILENTLY-P
This function offers to save each buffer that needs to be saved,
and then kills this Emacs session. Called with a non-`nil' value
of the optional KILL-SILENTLY-P argument, this function saves all
the file-visiting buffers without querying the user or displaying
any message about saving, and then kills the session.
The body of the `save-buffers-kill-emacs' function consists of the
two following lines:
(save-some-buffers arg t)
(kill-emacs)
* Command: save-some-buffers &optional SAVE-SILENTLY-P EXITING
This command saves some modified file-visiting buffers.
Normally, Emacs asks the user about each buffer. If the function
is called with a non-`nil' value of the optional SAVE-SILENTLY-P
argument, this function saves all the file-visiting buffers without
querying the user.
The optional EXITING argument is for non-interactive use only; it
is set by the `save-buffers-kill-emacs' function and causes Emacs
to offer to save even certain buffers that are not visiting files,
as well. These are buffers that have a non-`nil' local value of
`buffer-offer-save'.
* Variable: buffer-offer-save
When this variable is non-`nil' in a buffer, Emacs offers to save
the buffer on exit even if the buffer is not visiting a file. The
variable is automatically local in all buffers. Normally, Mail
mode (used for editing outgoing mail) sets this to `t'.
* Command: write-file FILENAME
This function writes the current buffer into file FILENAME, makes
the buffer visit that file, and marks it not modified.
* Variable: write-file-hooks
The value of this variable is a list of functions to be called
before writing out a buffer to its visited file. If one of them
returns non-`nil', the file is considered already written and the
rest are not called, nor is the usual code for writing the file
executed.
If the `file-precious-flag' variable is `nil', the file is moved
to the backup file before any of the hooks are called, so if none
of the hooks save the file, but one returns non-`nil', the file
will not exist, although the backup will.
Here is an example of how to add a hook to the `write-file-hooks'
just once.
(or (memq 'my-write-file-hook write-file-hooks)
(setq write-file-hooks
(cons 'my-write-file-hook write-file-hooks)))
* Variable: file-precious-flag
If this global variable is non-`nil', then `save-buffer' protects
against I/O errors while saving files, by renaming the original
file to a temporary name before writing the new contents of the
file. If the new contents are successfully written, the renamed
original file is deleted. Otherwise, it is renamed back to the
original name. This procedure prevents problems such as a lack of
disk space from resulting in an invalid file.
Some modes set this non-`nil' locally in particular buffers.
* User Option: require-final-newline
This global variable determines whether files may be written out
that do *not* end with a newline. If the value of the variable is
`t', then Emacs silently puts a newline at the end of the file
whenever the file being saved does not already end in one. If the
value of the variable is non-`nil', but not `t', then Emacs asks
the user whether to add a newline in each such case.
If the value of the variable is `nil', then Emacs doesn't add
newlines at all. `nil' is the default value, but a few major modes
change it to `t'.
▶1f◀
File: lispref Node: Reading from Files, Prev: Saving Buffers, Up: Files, Next: Writing to Files
Reading from Files
==================
You can copy a file directly from the disk and insert it into a buffer
using the `insert-file-contents' function, or its interactive envelope,
`insert-file'.
* Command: insert-file FILENAME
This function inserts the contents of file FILENAME into the
current buffer after the point. It is an error if FILENAME is not
a readable file. This is for interactive use and does little more
than call `insert-file-contents'.
* Function: insert-file-contents FILENAME VISIT
This function inserts the contents of file FILENAME into the
current buffer after the point. If VISIT is non-`nil', the
buffer's visited filename and last save file modtime are set, and
it is marked unmodified, so that it is now visiting the file
FILENAME.
It is an error if FILENAME is not a readable file.
This function returns a list of the absolute file name and the
length of the data inserted.
▶1f◀
File: lispref Node: Writing to Files, Prev: Reading from Files, Up: Files, Next: File Locks
Writing to Files
================
You can write the contents of a buffer, or part of a buffer, directly
to a file on disk using the `append-to-file' and `write-region'
functions. Normally, this is done for files not visited by the buffer
in question.
* Command: append-to-file START END FILENAME
This function appends the contents of the region delimited by
START and END in the current buffer to the end of file FILENAME.
If that file does not exist, it is created.
This function returns `nil'.
It is an error if FILENAME does not specify a (possibly
non-existent) file which is writable in an existing directory.
* Command: write-region START END FILENAME &optional APPEND VISIT
This function writes the region (of the current buffer) delimited
by START and END into the file specified by FILENAME.
If APPEND is non-`nil', then the region will be appended to the
existing file contents (if any).
If VISIT is `t', then Emacs establishes an association between the
buffer and the file: the buffer is then visiting that file. It
also sets the last file modification time for the current buffer to
FILENAME's modtime, and marks the buffer as not modified.
Normally, this function prints a message `Wrote file FILENAME' in
the echo area. If VISIT is neither `t' nor `nil', then this
message is inhibited. This feature is useful for programs which
use files for internal purposes, files which the user does not need
to know about.
▶1f◀
File: lispref Node: File Locks, Prev: Writing to Files, Up: Files, Next: Information about Files
File Locks
==========
When two different people attempt to modify and save the same file at
the same time, the changes made by one person are lost as the changes
made by the other overwrite them. File locks are used to help avoid
such an unfortunate occurrence. Instead of destroying on person's work,
Emacs, aided by locks, will ask you what to do.
* Function: file-locked-p FILENAME
This function returns `nil' if the FILENAME is not locked by this
Emacs process. It returns `t' if it is locked by this Emacs, and
it returns the name of the user who has locked it if it is locked
by someone else.
(file-locked-p "foo")
=> nil
* Function: lock-buffer &optional FILENAME
This function locks FILENAME, if the current buffer is modified.
FILENAME defaults to the current buffer's visited file. Nothing is
done if the current buffer is not visiting a file, or is not
modified.
* Function: unlock-buffer
This function unlocks the file being visited in the current buffer,
if the buffer is modified. If the buffer is not modified, then the
file should not be locked, so this function does nothing. It also
does nothing if the current buffer is not visiting a file.
* Function: ask-user-about-lock FILE OTHER-USER
This function asks the user what to do when he or she has asked
to edit FILE but it is locked by OTHER-USER.
Depending on the user's answer, the `ask-user-about-lock'
function will do one of the following:
* The function may return `t', which grabs the lock on the file;
in this case the user may edit the file; and it becomes locked
to OTHER-USER.
* The function may return `nil', which allows the user to edit
the file even though it is locked.
* The function may signal a `file-locked' error, in which case
the user is refraining from editing the file. In this case,
Emacs displays the following error message:
error--> "File is locked" FILE OTHER-USER
where `file' is the name of the file and OTHER-USER is the
name of the user who has locked the file.
If you wish, you can replace the `ask-user-about-lock' function
with your own version that does what you prefer. The code for its
usual definition is in `userlock.el'.
▶1f◀
File: lispref Node: Information about Files, Prev: File Locks, Up: Files, Next: Contents of Directories
Information about Files
=======================
The functions described in this section are similar in as much as they
all operate on strings which are interpreted as file names. All have
names that begin with the word `file'. These functions all return
information about actual files or directories, so their arguments must
all exist as actual files or directories unless otherwise noted.
Most of the file-oriented functions take a single argument, FILENAME,
which must be a string. The file name is expanded using
`expand-file-name', so `~' is handled correctly, as are relative file
names (including `../'). Environment variables in filenames, such as
`$HOME', etc., are not substituted by these functions.
* Menu:
* Testing Accessibility::
* Distinguishing Kinds of Files::
* File Attributes::
▶1f◀
File: lispref Node: Testing Accessibility, Prev: Information about Files, Up: Information about Files, Next: Distinguishing Kinds of Files
Testing Accessibility
---------------------
* Function: file-exists-p FILENAME
This function returns `t' if a file named FILENAME exists. This
does not mean you can necessarily read the file, only that you can
do a directory listing on the directory which it is in.
If you do not have permission to do a directory listing on the
directory containing FILENAME, then the result will be `nil'.
* Function: file-readable-p FILENAME
This function returns `t' if a file named FILENAME exists and you
can read it. It returns `nil' otherwise.
(file-readable-p "file.texinfo")
=> t
(file-exists-p "/usr/spool/mqueue")
=> t
(file-readable-p "/usr/spool/mqueue")
=> nil
* Function: file-writable-p FILENAME
This functions returns `t' if FILENAME can be written or created
by you. It is writable if the file exists and you can write it.
It is creatable if the file does not exist, but the directory it
would be in does exist and you can write in that directory.
`file-writable-p' returns `nil' otherwise.
In the third example below, `foo' is not writable because the
parent directory does not exist, even though the user could create
it.
(file-writable-p "~rms/foo")
=> t
(file-writable-p "/foo")
=> nil
(file-writable-p "~rms/no-such-dir/foo")
=> nil
* Function: file-newer-than-file-p FILENAME1 FILENAME2
This functions returns `t' if the file FILENAME1 is newer than
file FILENAME2. If FILENAME1 does not exist, it returns `nil'. If
FILENAME2 does not exist, it returns `t'.
In the example, assume that the file `aug-19' was written on the
19th, and `aug-20' was written on the 20th. The file `no-file'
doesn't exist at all.
(file-newer-than-file-p "aug-19" "aug-20")
=> nil
(file-newer-than-file-p "aug-20" "aug-19")
=> t
(file-newer-than-file-p "aug-19" "no-file")
=> t
(file-newer-than-file-p "no-file" "aug-19")
=> nil
▶1f◀
File: lispref Node: Distinguishing Kinds of Files, Prev: Testing Accessibility, Up: Information about Files, Next: File Attributes
Distinguishing Kinds of Files
-----------------------------
* Function: file-symlink-p FILENAME
If FILENAME is a symbolic link, the `file-symlink-p' function
returns the file name to which it is linked. This may be the name
of a text file, a directory, or even another symbolic link, or of
no file at all.
If FILENAME is not a symbolic link (or there is no such file),
`file-symlink-p' returns `nil'.
(file-symlink-p "foo")
=> nil
(file-symlink-p "sym-link")
=> "foo"
(file-symlink-p "sym-link2")
=> "sym-link"
(file-symlink-p "/bin")
=> "/pub/bin"
* Function: file-directory-p FILENAME
This function returns `t' if FILENAME is the name of an existing
directory, `nil' otherwise.
(file-directory-p "~rms")
=> t
(file-directory-p "~rms/lewis/file.texinfo")
=> nil
(file-directory-p "~rms/lewis/no-such-file")
=> nil
(file-directory-p "$HOME")
=> nil
(file-directory-p (substitute-in-file-name "$HOME"))
=> t
▶1f◀
File: lispref Node: File Attributes, Prev: Distinguishing Kinds of Files, Up: Information about Files
Other Information about Files
-----------------------------
* Function: file-attributes FILENAME
This function returns a list of attributes of file FILENAME. If
the specified file cannot be opened, it returns `nil'.
The elements of the list, in order, are:
1. `t' for a directory, a string for a symbolic link (the name
linked to), or `nil' for a text file.
2. The number of links to the file.
3. The file's UID.
4. The file's GID.
5. The time of last access, as a list of two integers. The first
integer has the high-order 16 bits of time, the second has the
low 16 bits.
6. The time of last modification as a list of two integers (see
above).
7. The time of last status change as a list of two integers (see
above).
8. The size of the file in bytes.
9. The file's modes, as a string of ten letters or dashes as in
`ls -l'.
10. `t' if the file's GID would change if file were deleted and
recreated.
11. The file's inode number.
For example, here are the file attributes for `file.texinfo':
(file-attributes "file.texinfo")
=> (nil
1
2235
75
(8489 20284)
(8489 20284)
(8489 20285)
14906
"-rw-rw-rw-"
nil
20920)
and here is how the result is interpreted:
`nil'
is neither a directory nor a symbolic link.
`1'
has only one link to it, the name `file.texinfo'.
`2235'
is owned by the user with UID 2235.
`75'
is in the group with GID 75
`(8489 20284)'
was last accessed on Aug 19 00:09. Unfortunately, you cannot
convert this number into a time string in Emacs.
`(8489 20284)'
was last accessed on Aug 19 00:09. Unfortunately, you cannot
convert this number into a time string in Emacs.
`(8489 20285'
last had its inode changed on Aug 19 00:09. Unfortunately,
you cannot convert this number into a time string in Emacs.
`14906'
has 14906 characters in it.
`-rw-rw-rw-'
has a mode of read and write access for the owner, group, and
world.
`nil'
would retain the same `gid' if it were recreated.
`20920'
has an inode number of 20920
* Function: file-modes FILE-NAME
This function returns the mode bits of FILE-NAME, as a decimal
integer. The mode bits are the usual Unix mode bits. If the
low-order bit is 1, then the file is executable by others, if the
second lowest-order bit is 1, then the file is writable by others,
etc.
The highest value returnable is 4095 (7777 octal), meaning that
everyone has read, write, and execute permission, that the file has
the SUID bit set for both others and group, and that the file has
the sticky bit set.
(file-modes "~/junk/diffs")
=> 492 ; decimal integer
(format "%o" 492)
-| 754 ; convert to octal
(set-file-modes "~/junk/diffs" 4095)
=> nil
% ls -l diffs
=> -rwxr-xr-- 1 lewis 0 3063 Oct 30 16:00 diffs
* Function: file-nlinks FILENAME
This functions returns the number of names (i.e., hard links)
that file FILENAME has. If the file does not exist, then this
function returns `nil'.
% ls -l foo*
-rw-rw-rw- 2 rms 4 Aug 19 01:27 foo
-rw-rw-rw- 2 rms 4 Aug 19 01:27 foo1
(file-nlinks "foo")
=> 2
(file-nlinks "doesnt-exist")
=> nil
▶1f◀
File: lispref Node: Contents of Directories, Prev: Information about Files, Up: Files, Next: Changing File Names and Attributes
Contents of Directories
=======================
A directory is a kind of file which contains other files entered under
various names. Directories belong to Unix, not to Emacs.
Emacs can list the names of the files in a directory as a Lisp list,
or display the names in a buffer using the `ls' shell command. In the
latter case, Emacs will display information about each file, depending
on the value of switches passed to the `ls' command.
* Function: directory-files DIRECTORY &optional FULL-NAME MATCH-REGEXP
This function returns a list of the names of the files in the
directory DIRECTORY.
If FULL-NAME is non-`nil', the function returns the files' absolute
file names. Otherwise, if MATCH-REGEXP is non-`nil', function
returns only those file names that contain that regular
expression---the other file names are discarded from the list.
(directory-files "~lewis")
=> ("#foo#" "#foo.el#" "." ".."
"dired-mods.el" "file.texinfo" "file.texinfo.~1~")
It is an error if DIRECTORY is not the name of a readable
directory.
* Function: file-name-all-versions FILE DIRNAME
This function returns a list of all versions of the file named
FILE in directory DIRNAME.
* Command: list-directory DIRNAME &optional VERBOSE
This command displays a list of files in or matching DIRNAME. It
calls the shell command `ls', optionally passing it an appropriate
switch.
Wildcards in DIRNAME are processed by the shell.
A prefix argument (the function's second argument if it is called
noninteractively) causes the function to pass the value of
`list-directory-verbose-switches' to `ls' as a switch. Otherwise,
the function passes `list-directory-brief-switches' to `ls'.
* Variable: list-directory-brief-switches
This variable contains switches for `list-directory' to pass to
`ls' for a short or `brief' listing. The default value is `"-CF"'.
* Variable: list-directory-verbose-switches
This variable contains switches for `list-directory' to pass to
`ls' for a verbose or `long' listing. The default value is `"-l"'.
* Variable: default-directory
The value of this buffer-local variable is the default directory
for the current buffer. This is always a string ending with a
slash on Unix systems.
default-directory
=> "/user/lewis/manual/"
▶1f◀