|
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: 54618 (0xd55a) Types: TextFile Names: »lispref-12«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89 └─⟦c06c473ab⟧ »./UNRELEASED/lispref.tar.Z« └─⟦1b57a2ffe⟧ └─⟦this⟧ »lispref-12«
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: Changing File Names and Attributes, Prev: Contents of Directories, Up: Files, Next: File Names Changing File Names and Attributes ================================== You can use the functions in this section to rename, copy, delete, link, and set the modes of files. * Function: add-name-to-file OLDNAME NEWNAME &optional OK-IF-ALREADY-EXISTS This function gives the file named OLDNAME the additional name NEWNAME. This means that NEWNAME will be a new ``hard link'' to OLDNAME. This function is meaningless on VMS, where multiple names for one file are not allowed. If a file by the name of NEWNAME already exists: * It is an error if OK-IF-ALREADY-EXISTS is `nil'. * Confirmation is requested if OK-IF-ALREADY-EXISTS is a number. * No confirmation is requested if OK-IF-ALREADY-EXISTS is any other value, in which case the old file is removed. In the first part of the following example, we list two files, `foo' and `foo3'. % ls -l fo* -rw-rw-rw- 1 rms 29 Aug 18 20:32 foo -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3 Then we evaluate the form `(add-name-to-file "~/lewis/foo" "~/lewis/foo2")'. Again we list the files. This shows two links to `foo' and `foo2'. (add-name-to-file "~/lewis/foo1" "~/lewis/foo2") => nil % ls -l fo* -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo2 -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3 Finally, we evaluate `(add-name-to-file "~/lewis/foo" "~/lewis/foo3" t)', and again list the files. Now there are three links to `foo', `foo2', and `foo3'). The old contents of `foo3' are lost. (add-name-to-file "~/lewis/foo1" "~/lewis/foo3") => nil % ls -l fo* -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo2 -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo3 * Command: rename-file FILENAME NEWNAME &optional OK-IF-ALREADY-EXISTS This function renames FILENAME as NEWNAME. If FILENAME has names (i.e., hard links) other than filename, it continues to have those names. If a file by the name of NEWNAME already exists: * The function signals a `file-already-exists' error, unless OK-IF-ALREADY-EXISTS is non-`nil'. * Emacs requests confirmation if NEWNAME already exists if OK-IF-ALREADY-EXISTS is numeric. When called interactively, Emacs prompts for FILENAME and NEWNAME in the minibuffer. In interactive use, Emacs requests confirmation if NEWNAME already exists. * Function: copy-file OLDNAME NEWNAME &optional OK-IF-EXISTS TIME This function copies the file OLDNAME to NEWNAME. It is an error if OLDNAME does not exist. If a file by the name of NEWNAME already exists: * It is an error if OK-IF-EXISTS is either `nil' or not supplied. * Emacs requests confirmation if OK-IF-EXISTS is a number. * Emacs does *not* request confirmation if OK-IF-EXISTS is any other value, in which case the old file is removed. If TIME is non-`nil', then this functions gives the new file the same last-modified time that the old one has. (This works on only some operating systems.) * Function: delete-file FILENAME This function deletes the file FILENAME. This function is essentially the same as the shell command `rm FILENAME'. If FILENAME has multiple names, it continues to exist with the other names. It is an error if the file does not exist, or is not deletable. (In Unix, a file is deletable if it is writable or its directory is writable.) * Command: make-symbolic-link FILENAME NEWNAME &optional OK-IF-EXISTS This function makes a symbolic link to FILENAME, named NEWNAME. It signals a `file-already-exists' error if NEWNAME already exists unless OK-IF-EXISTS is non-`nil'. If OK-IF-EXISTS is numeric, then Emacs requests confirmation if NEWNAME already exists. If it is `t', then the old file is simply deleted. When called interactively, FILENAME and NEWNAME are prompted for in the minibuffer. OK-IF-EXISTS is set to the processed prefix argument. * Function: set-file-modes FILE-NAME MODE This function sets mode bits of FILE-NAME to MODE (which must be a integer). Only the 12 low bits of MODE are used. ▶1f◀ File: lispref Node: File Names, Prev: Changing File Names and Attributes, Up: Files File Names ========== Files are generally referred to by their names; Emacs is no exception to this. File names in Emacs are represented as strings. The functions which read, write or move files all expect a file name argument. In addition to operating on files themselves, Emacs Lisp programs often need to operate on the names: to take them apart, and use the pieces to construct related file names. This section describes how to manipulate file names. The functions in this section do not actually operate on files, so they can operate on file names which do not refer to an existing file or directory. On VMS, all these functions understand both VMS file name syntax and Unix syntax. This is so that all the standard Lisp libraries can specify file names in Unix syntax and then work properly on either system without change. ▶1f◀ File: lispref Node: File Name Components, Up: File Names, Next: Directory Names File Name Components -------------------- The operating system groups files into directories. To specify a file, you must specify the directory, and the file's name in that directory. Therefore, a file name in Emacs is considered to have two main parts: the directory name, and "nondirectory" part or file name within the directory. Concatenating these two parts reproduces the original file name. Either part may be empty. On Unix, the directory part is everything up to and including the last slash; the nondirectory part is the rest. The rules in VMS syntax are complicated. For some purposes, the nondirectory part is further subdivided into the name and the version number. On Unix, only backup files have version numbers in their names; on VMS, every file has a version number, but most of the time the file name actually used in Emacs omits the version number. Version numbers are found mostly in directory lists. * Function: file-name-directory FILENAME This function returns the directory component in FILENAME. It returns `nil' if FILENAME does not include a directory. On Unix, the function returns a string ending in a slash. On VMS, it returns a string ending in one of the three characters `:', `]', or `>'. (file-name-directory "lewis/foo") ; Unix example => "lewis/" (file-name-directory "foo") ; Unix example => nil (file-name-directory "[X]FOO.TMP") ; VMS example => [X] * Function: file-name-nondirectory FILENAME This function returns the file name from FILENAME without its directory component (if any). (file-name-nondirectory "lewis/foo") => "foo" (file-name-nondirectory "foo") => "foo" (file-name-nondirectory "[X]FOO.TMP") => "FOO.TMP" * Function: file-name-sans-versions FILENAME This function returns FILENAME without any file version numbers, backup version numbers, or trailing tildes. (file-name-sans-versions "~rms/foo.~1~") => "~rms/foo" (file-name-sans-versions "~rms/foo~") => "~rms/foo" (file-name-sans-versions "~rms/foo") => "~rms/foo" ;; The following example applies to VMS only. (file-name-sans-versions "foo;23") => "foo" ▶1f◀ File: lispref Node: Directory Names, Prev: File Name Components, Up: File Names, Next: Relative File Names Directory Names --------------- A directory name is the name of a directory, which is a special kind of file. This file also has a file name, which is its name when considered as a file in its own right. These two different names for the same entity are related by a syntactic transformation. On Unix, this is simple: a directory name ends in a slash, whereas the directory's name as a file lacks that slash. (This is not quite identical to the conventions of Unix terminology.) On VMS, the relationship is more complicated. Though the difference between a directory name and its name as a file may be small, it is crucial. When an Emacs variable or function argument is described as being a directory name, a file name of a directory is not acceptable. All of these functions take a single argument, FILENAME, which must be a string. Environment variables such as `$HOME', and the symbols `~', and `..', are *not* expanded. Use `expand-file-name' or `substitute-in-file-name' for that (*Note Relative File Names::). * Function: file-name-as-directory FILENAME This function returns a string representing FILENAME in a form that the operating system will interpret as the name of a directory. In Unix, this means that the string has a slash appended to it. In VMS, the function converts a string of the form `[X]Y.DIR.1' to the form `[X.Y]'. (file-name-as-directory "~rms/lewis") => "~rms/lewis/" * Function: directory-file-name DIRNAME This function returns a string representing DIRNAME in a form that the operating system will interpret as the name of a file. On Unix, this means that the string has a final slash removed. On VMS, the function converts a string of the form `[X.Y]' to `[X]Y.DIR.1'. (directory-file-name "~lewis/") => "~lewis" ▶1f◀ File: lispref Node: Relative File Names, Prev: Directory Names, Up: File Names, Next: File Name Expansion Absolute and Relative File Names -------------------------------- All the directories in the file system form a tree starting at the root directory. A file name can specify all the directory names starting from the root of the tree; then it is called an "absolute" file name. Or it can specify the position of the file in the tree relative to a default directory; then it is called an "relative" file name. On Unix, an absolute file name starts with a slash or a tilde (`~'), and a relative one does not. The rules on VMS are complicated. * Function: file-name-absolute-p FILENAME This function returns `t' if file FILENAME specifies an absolute file name, `nil' otherwise. On VMS, this function understands both Unix syntax and VMS syntax. (file-name-absolute-p "~rms/foo") => t (file-name-absolute-p "rms/foo") => nil (file-name-absolute-p "$HOME") => nil (file-name-absolute-p "/user/rms/foo") => t ▶1f◀ File: lispref Node: File Name Expansion, Prev: Relative File Names, Up: File Names, Next: Unique File Names Functions that Expand Filenames ------------------------------- "Expanding" a file name means converting a relative file name to an absolute one. Since this is done relative to a directory, you must specify the directory name as well as the file name to be expanded. Expansion also canonicalizes file names by simplifying redundancies such as `./' and `NAME/../'. * Function: expand-file-name FILENAME &optional DIRECTORY This function converts FILENAME to an absolute file name. If DIRECTORY is supplied, then it is the directory to start with if FILENAME is relative. Otherwise, the current buffer's value of `default-directory' is used. Filenames containing `.' or `..' are expanded to their canonical form. Adjacent `/'s condensed into a single `/'. `~' as a file is expanded into the user's home directory. See `substitute-in-file-name' below for the details. But note that `expand-file-name' does *not* expand environment variables. (`substitute-in-file-name' does that.) (expand-file-name "foo") => "/xcssun/users/rms/lewis/foo" (expand-file-name "../foo") => "/xcssun/users/rms/foo" (expand-file-name "foo" "/usr/spool") => "/usr/spool/foo" (expand-file-name "$HOME/foo") => "/xcssun/users/rms/lewis/$HOME/foo" * Function: substitute-in-file-name FILENAME This function replaces environment variables names in FILENAME with the values to which they are set by the operating system. Following standard Unix shell syntax, `$' begins an environment variable. The environment variable name is the series of alphanumeric characters (including underscores) that follow the `$'. If the character following the `$' is a `{', then the variable name is everything up to the matching `}'. If a `~' or a `/' appears following a `/', everything through the first `/' is discarded. Here we assume that the environment variable `HOME', which is the user's home directory name, is `/xcssun/users/rms'. (substitute-in-file-name "bar/~/foo") => "~/foo" (substitute-in-file-name "$HOME/foo") => "/xcssun/users/rms/foo" (substitute-in-file-name "/usr/local/$HOME/foo") => "/xcssun/users/rms/foo" On VMS, `$' substitution is not done; this function does little on VMS. ▶1f◀ File: lispref Node: Unique File Names, Prev: File Name Expansion, Up: File Names, Next: Filename Completion Generating Unique File Names ---------------------------- Some programs need to construct temporary files. Here is the usual way to construct a name for such a file: (concat "/tmp/" (make-temp-name NAME-OF-APPLICATION)) The directory `/tmp/' is chosen because that is the standard place on Unix for temporary files. The task of `make-temp-name' is to prevent two different users or two different jobs from trying to use the same name. * Function: make-temp-name STRING This function generates string that can be used as a unique name. The name will start with the prefix STRING, and finish with a number which is different in each Emacs job. (make-temp-name "foo") => "foo021304" (make-temp-name "foo") => "foo021304" To prevent conflicts among different application libraries run in the same Emacs, each application should have its own STRING. The number added to the end of the name distinguishes between the same application running in different Emacses. ▶1f◀ File: lispref Node: Filename Completion, Prev: Unique File Names, Up: File Names Filename Completion ------------------- This section describes low-level subroutines for completing a filename. For other completion functions, *Note Completion::, and *Note Lisp Symbol Completion::. * Function: file-name-all-completions PARTIAL-FILENAME DIRECTORY This function returns a list of all possible completions for a file whose name starts with PARTIAL-FILENAME in directory DIRECTORY. The order of the completions is the order of the files in DIRECTORY, which is not normally sorted. PARTIAL-FILENAME must contain no directory and no slash. The current buffer's default directory is prepended to DIRECTORY, if DIRECTORY is not an absolute file name. In the following example, suppose that the current default directory, `~rms/lewis', has five files whose names begin with `f': `foo', `file~', `file.texinfo', `file.texinfo.~1~', and `file.texinfo.~2~'. (file-name-all-completions "f" "~rms/lewis") => ("foo" "file~" "file.texinfo.~2~" "file.texinfo.~1~" "file.texinfo") (file-name-all-completions "fo" "") => ("foo") * Function: file-name-completion FILENAME DIRECTORY This function completes the file name FILENAME in directory DIRECTORY. It returns the longest prefix common to all filenames in DIRECTORY that start with FILENAME. If only one match exists, and FILENAME matches exactly, the function returns `t'. The function returns `nil' if DIRECTORY contains no name starting with FILENAME. In the following example, suppose that the current default direction, `~rms/lewis', has five files whose names begin with `f': `foo', `file~', `file.texinfo', `file.texinfo.~1~', and `file.texinfo.~2~'. (file-name-completion "fi" "") => "file" (file-name-completion "file.texinfo.~1" "") => "file.texinfo.~1~" (file-name-completion "file.texinfo.~1~" "") => t (file-name-completion "file.texinfo.~3" "") => nil * User Option: completion-ignored-extensions The filename completion functions usually ignore all filenames that end in any string in this list. The variable looks somewhat like this: completion-ignored-extensions => (".o" ".elc" "~" ".dvi") ▶1f◀ File: lispref Node: Backups and Auto Saving, Prev: Files, Up: Top, Next: Buffers 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:: * Auto Saving:: * Reverting:: ▶1f◀ File: lispref Node: Backup Files, Prev: Backups and Auto Saving, Up: Backups and Auto Saving, Next: Auto Saving Backup Files ============ A "backup file" is a copy of the old contents of a file you are editing. Emacs makes a backup file the first time you save a buffer into the visited file. This means that the backup file contains the contents of the file as it was before editing started in the current editing session. The contents of the backup file are not normally changed during the current editing session. By default, Emacs makes a single backup file for each file you edit. You can alternatively request numbered backups; then each new backup file gets a new name. It is up to you to delete old numbered backups when you don't want them any more. 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 hard links; it also can affect the owner of the file. * Menu: * Making Backups:: * Rename or Copy:: * Backup Names:: ▶1f◀ File: lispref Node: Making Backups, Prev: Backup Files, Up: Backup Files, Next: Rename or Copy Making Backup Files ------------------- * Function: backup-buffer This function makes a backup of the file visited by the current buffer, if appropriate. It is called by `save-buffer' before saving the buffer the first time. * Variable: buffer-backed-up This buffer-local variable indicates whether this buffer's file has been backed up on account of this buffer. If it is non-`nil', then the backup file has been written. The file is backed up just before the file is saved for the first time. * Variable: make-backup-files This global variable determines whether or not backup files will be created. If it is non-`nil', then Emacs will create a backup of each file when it is saved for the first time. The following example shows how to change the `make-backup-files' variable only in your `RMAIL' buffer and not elsewhere. Setting it `nil' stops Emacs from making backups of your `RMAIL' file, which may save disk space. (You would put this code in your `.emacs' file.) (setq rmail-mode-hook (function (lambda () (make-local-variable 'make-backup-files) (setq make-backup-files nil))) ▶1f◀ File: lispref Node: Rename or Copy, Prev: Making Backups, Up: Backup Files, Next: Backup Names Backup by Renaming or by Copying? --------------------------------- There are two ways that Emacs can make a backup: * Emacs can rename the original file into a backup file, and then write the buffer being saved into a new file. In this case, any other names (e.g., hard links) that the old file had will now refer to the backup file. The new file will be owned by the user and its group will be the user's default group. * Emacs can copy the original file into a backup file, and then overwrite the original file with new contents. In this case, any other names (e.g., hard links) that the original file had will still refer to the most current version of the file. The file's owner and group will be unchanged. The first method, of renaming, is the default. The variable `backup-by-copying', if non-`nil', says to use the second method, which is to copy the file and then write the buffer on top of the original. The variable `file-precious-flag', if non-`nil', also has this effect, as a sideline of its other significance. *Note Saving Buffers::. The variables `backup-by-copying-when-linked' and `backup-by-copying-when-mismatch', if non-`nil', cause the second method to be used in certain special cases. They have no effect on the treatment of files that don't fall into the special cases. * Variable: backup-by-copying This global variable determines whether backup files will be made by copying. If it is non-`nil', then Emacs will always copy the current contents of the file into the backup file before writing the buffer to be saved to the file. (In many circumstances, this has the same effect as `file-precious-flag'.) * Variable: backup-by-copying-when-linked This global variable determines whether backups for files with multiple names (hard links) will be made by copying. If it is non-`nil', then Emacs will use copying to create backups for those files. This variable is relevant only if `backup-by-copying' is `nil', since copying is always used when that variable is non-`nil'. * Variable: backup-by-copying-when-mismatch This global variable determines whether Emacs will make backups by copying when renaming would cause either the owner or the group of the file to change. If it is non-`nil' then Emacs will create backups for those file by copying. Renaming may still be used (subject to control of other variables) when it would not result in changing the owner or group of the file; that is, for files which are owned by the user and whose group matches the default for a new file created there by the user. This variable is relevant only if `backup-by-copying' is `nil', since copying is always used when that variable is non-`nil'. ▶1f◀ File: lispref Node: Backup Names, Prev: Rename or Copy, Up: Backup Files Naming Backup Files ------------------- * Function: backup-file-name-p FILENAME This function returns a non-`nil' value if FILENAME is a possible name for a backup file. A file with the name FILENAME need not exist; the function just checks the name. (backup-file-name-p "foo") => nil (backup-file-name-p "foo~") => 3 In the standard release, the body of this function consists of the following line: (string-match "~$" file) In other words, the function returns a non-`nil' value if the filename ends with a `~' This simple expression is given its own name as a function so that you can redefine it for customization. * Function: make-backup-file-name FILENAME This function creates a non-numeric backup file name to be used when FILENAME is backed up. On Unix, the value is just FILENAME with a tilde appended. In the standard release, the body of this function consists of the following line: (concat file "~") You can change the backup file names for all backup files by redefining this function. In the following example, `make-backup-file-name' is redefined to prepend a `.' as well as to append a tilde. (defun make-backup-file-name (filename) (concat "." filename "~")) (make-backup-file-name "backups.texinfo") => ".backups.texinfo~" * Function: find-backup-file-name FILENAME This function computes the file name for a new backup file for FILENAME. If numerous backup files for FILENAME exist (which implies that the backups must be numeric backups), then this function also makes a list of old backup files that are ripe for deletion. The global variables `kept-old-versions' and `kept-new-versions' determine which old backup versions Emacs will keep (by not including them in the list of backup files ripe for deletion). `find-backup-file-name' returns a list whose CAR is the name for the new backup file and whose CDR is a list of old versions. In the example, `~rms/lewis/foo.~5~' is the name for the new backup file and `~rms/lewis/foo.~3~' is the ``excess'' version that you should consider deleting now. (find-backup-file-name "~rms/lewis/foo") => ("~rms/lewis/foo.~5~" "~rms/lewis/foo.~3~") * User Option: kept-old-versions The value of this variable is the number of oldest versions to keep when a new numbered backup is made. If there are backups numbered 1, 2, 3, 5, and 6, and the value of `kept-old-versions' is 2, then the ``oldest'' backups 1 and 2 will be kept, and 3 will be flagged for deletion, unless (in this example) the value of `kept-new-versions' is greater than 2. * User Option: kept-new-versions The value of this variable is the number of a file's most recent versions to keep when a new numbered backup is made. It includes the new backup. It must be greater than 0. Thus, if the value of `kept-new-versions' is 2, then the two most recent backups of a file will be kept. ▶1f◀ File: lispref Node: Auto Saving, Prev: Backup Files, Up: Backups and Auto Saving, Next: Reverting Auto Saving =========== Emacs saves all files that you are visiting from time to time without being asked. This is called ``auto saving''. (Emacs counts your keystrokes; by default, your work is saved after 300 keystrokes.) Auto saving prevents you from losing more than a limited amount of work if the system crashes. *Note Auto Saving: Protection Against Disasters: (emacs)Auto Save. * Variable: buffer-auto-save-file-name This buffer-local variable is the name of the file used for auto saving the current buffer. It is `nil' if the buffer should not be auto saved. buffer-auto-save-file-name => "/xcssun/users/rms/lewis/#file.texinfo#" * Command: auto-save-mode ARG When used interactively without being passed an argument this command is a toggle switch. It turns on auto saving of the contents of the current buffer if it is off and vice-versa. When passed ARG, the command turns auto saving on if the value of ARG is positive, otherwise it turns auto saving off. * Function: auto-save-file-name-p FILENAME This function returns a non-`nil' value if FILENAME is a string that could possibly be returned by `make-auto-save-file-name'. According to the usual naming convention, any name that begins and ends with hash marks (`#') is a possible auto-save file name, and any other name isn't. (make-auto-save-file-name) => "/xcssun/users/rms/lewis/#file.texinfo#" (auto-save-file-name-p "#file.texinfo#") => 0 (auto-save-file-name-p "file.texinfo") => nil In the standard release, the body of this function consists of the following line: (string-match "^#.*#$" filename) This function exists so that you can customize it if you wish to change the naming convention for auto-save files. * Variable: auto-save-visited-file-name If this global variable is non-`nil', then Emacs will auto save buffers in the files they are visiting. That is, the same name is used as the file currently has. Normally, auto-save files have other names that created by `make-auto-save-file-name'. * Function: make-auto-save-file-name This function returns the file name to use for auto saving the current buffer. This is just the file name with hash marks (`#') appended and prepended to it. This function does not look at the variable `auto-save-visited-file-name'; that should be checked before this function is called. (make-auto-save-file-name) => "/xcssun/users/rms/lewis/#file-backup.texinfo#" The body of `make-auto-save-file-name' consists of the following lines: (if buffer-file-name (concat (file-name-directory buffer-file-name) "#" (file-name-nondirectory buffer-file-name) "#") (expand-file-name (concat "#%" (buffer-name) "#")))) This exists as a separate function so that you can redefine it to customize the naming convention for auto-save files. * Function: recent-auto-save-p This function returns `t' if the current buffer has been auto-saved since the last time it was read in or saved. * Function: set-buffer-auto-saved This function marks the current buffer as auto-saved. The buffer will not be auto-saved again until the buffer changes. It returns `nil'. * User Option: auto-save-interval The value of this variable is the number of characters that Emacs may read from the keyboard between auto-saves. When this number is reached, then Emacs will auto-save each file again. * Command: do-auto-save &optional NO-MESSAGE This function auto-saves all buffers that need to be auto-saved. This is all buffers that have auto-saving enabled and that have been changed since the last time they were auto-saved. If NO-MESSAGE is non-`nil', then Emacs will not print out its standard message: `Auto-saving...'. * Function: delete-auto-save-file-if-necessary This function deletes the auto-save files for the current buffer if variable `delete-auto-save-files' is non-`nil'. This function is called every time you save the buffer. * Variable: delete-auto-save-files This global variable is used by the function `delete-auto-save-file-if-necessary'. If it is non-`nil', then auto-save files for the buffers will be deleted when you save the buffer. In other words, if the value of `delete-auto-save-files' is non-`nil', Emacs will delete auto-save files when a true save is done (in the visited file). This saves on disk space and unclutters your directory. * Function: rename-auto-save-file This function adjusts the current buffer's auto-save file name for current conditions. Assuming that the visited file has been renamed, this function renames the auto-save file, too. If the visited file name has not changed, this function does nothing. ▶1f◀ File: lispref Node: Reverting, Prev: Auto Saving, Up: Backups and Auto Saving Reverting ========= If you have made extensive changes to a file and then change your mind about them, you can get rid of them by reading in the previous version of the file with the `revert-buffer' command. *Note Reverting a Buffer: (emacs)Reverting. * Command: revert-buffer &optional NO-AUTOSAVE-OFFER-P NOCONFIRM This command replaces the buffer text with the text of the visited file on disk. This action undoes all changes since the file was visited or saved. If the latest auto-save file is more recent than the visited file, Emacs asks the user whether to use that instead. When the value of the `no-autosave-offer-p' argument is non-`nil', Emacs does not offer to use the auto-save file. This argument is the prefix argument when the function is called interactively. When the value of the `noconfirm' argument is non-`nil', Emacs does not ask for confirmation for the reversion action. This means that the buffer is deleted and replaced by the text from the file on the disk, without asking the user if he or she really wants that. If the value of the `revert-buffer-function' variable is non-`nil', it is called as a function to do the work. * Variable: revert-buffer-function The value of this variable is the function to use to revert this buffer; but if the value of this variable is `nil', then the `revert-buffer' function carries out its default action. Modes such as Dired mode, in which the text being edited does not consist of a file's contents but can be regenerated, set this variable locally. * Command: recover-file FILENAME This function visits FILENAME, but gets the contents from its last auto-save file. The `after-find-file' function displays a message suggesting the use of `recover-file' if the auto-save file is newer than the file just visited. This situation may be the result of a crash. By using `recover-file', you may recover a great deal of work. It is an error if there is no auto-save file for FILENAME, or if FILENAME is newer than its auto-save file. If FILENAME does not exist, but its auto-save file does, that is ok. This last situation may occur if you visited a nonexistent file and never actually saved it. This function is for interactive use. ▶1f◀ File: lispref Node: Buffers, Prev: Backups and Auto Saving, Up: Top, Next: Windows Buffers ******* A "buffer" is a Lisp object containing characters. Buffers are used to hold the contents of files when they are visited, but buffers need not have an associated file. While several buffers may exist at one time, exactly one buffer is designated the "current buffer". Most editing commands act on the contents of the current buffer. Each buffer, including the current buffer, may or may not be displayed in a window. * Menu: * Buffer Basics:: * Buffer Names:: * Buffer File Name:: * Buffer Contents:: * Buffer Modification:: * Modification Time:: * Read Only Buffers:: * The Buffer List:: * Creating Buffers:: * Killing Buffers:: * Changing Buffers:: ▶1f◀ File: lispref Node: Buffer Basics, Prev: Buffers, Up: Buffers, Next: Buffer Names Buffer Basics ============= The contents of a buffer may be viewed as an extendable string; insertions and deletions may occur in any part of the buffer. A Lisp buffer object has information about one specific buffer. Some of this information is directly accessible to the programmer through variables; other information is only accessible through functions that modify it or return it. (For example, the width of a tab character is directly accessible through a variable, while the value of point is accessible only through a primitive function.) Buffer-specific information that is directly accessible is stored in "buffer-local" variables. These buffer-local bindings exactly parallel the global value cell of a symbol, if any, but they are ``seen'' by the evaluator before the actual global value cell. This means you can set buffer-local variables, such as `fill-column' or `comment-column', to different values for each buffer. For more information about buffer-local variables and functions that relate to them, *Note Buffer Local Variables::. For functions and variables that relate to saving the contents of buffers to files, *Note Writing to Files::. For functions and variables that relate to the display of buffers in windows, *Note Windows::. * Function: bufferp OBJECT This function returns `t' if OBJECT is a buffer, `nil' otherwise. * Function: current-buffer This function returns the current buffer. There is always one and only one buffer designated the current buffer. Many editing commands act on the current buffer. It need not be displayed in a window. (current-buffer) => #<buffer buffers.texinfo> ▶1f◀ File: lispref Node: Buffer Names, Prev: Buffer Basics, Up: Buffers, Next: Buffer File Name Buffer Names ============ Each buffer has a unique name. The buffer name may be used in place of the buffer object in many functions that operate on buffers. Buffers that are generally ephemeral and uninteresting to the user have names starting with a space; this prevents the buffer from being listed by the `list-buffers' or `buffer-menu' command. Many of the following functions accept either a buffer or a buffer name (a string) as an argument. Any argument called BUFFER-OR-NAME is assumed to be one or the other, and it is an error if it is not. Any argument called BUFFER must be an actual buffer, not a string. * Function: buffer-name &optional BUFFER This function returns the name of BUFFER as a string. If BUFFER is not supplied, it defaults to the current buffer. If the result of `buffer-name' is `nil', then BUFFER has been killed. (buffer-name) => "buffers.texinfo" (setq foo (get-buffer "temp")) => #<buffer temp> (kill-buffer foo) => nil (buffer-name foo) => nil foo => #<killed buffer> * Command: rename-buffer NEWNAME This function renames the current buffer to NEWNAME. It is an error if NEWNAME is not a string, or if there is already a buffer with that name. It returns `nil'. You can use this command to rename the `*shell*' buffer to some other name, which makes it possible for you to create a second shell buffer inside of Emacs. * Function: get-buffer BUFFER-OR-NAME This function returns the buffer BUFFER-OR-NAME. If BUFFER-OR-NAME is a string and there is no buffer of that name, `nil' is returned. The argument passed to `get-buffer' is almost always the name of a buffer. Although BUFFER-OR-NAME may be a buffer, this would not be very useful. (setq b (get-buffer "lewis")) => #<buffer lewis> (get-buffer b) => #<buffer lewis> (get-buffer "Frazzle-nots") => nil ▶1f◀ File: lispref Node: Buffer File Name, Prev: Buffer Names, Up: Buffers, Next: Buffer Contents Buffer File Name ================ The "buffer file name" is the name of the file that is visited in that buffer. When a buffer is not visiting a file, its buffer file name is `nil'. For functions and variables that relate to saving the contents of buffers to files, *Note Writing to Files::. * Function: buffer-file-name &optional BUFFER This function returns the absolute file name of the file that the buffer is visiting. If BUFFER is not supplied, it defaults to the current buffer. If the buffer is not visiting any file, this returns `nil'. (buffer-file-name (other-buffer)) => "/usr/user/lewis/manual/files.texinfo" * Variable: buffer-file-name This buffer-local variable contains the name of the file being visited in the current buffer, or `nil' if it is not visiting a file. buffer-file-name => "/usr/user/lewis/manual/buffers.texinfo" * Function: get-file-buffer FILENAME This function returns the buffer visiting file FILENAME. If there is no such buffer, it returns NIL. FILENAME must be a string. (get-file-buffer "buffers.texinfo") => #<buffer buffers.texinfo> In unusual circumstances, there can be more than one buffer visiting the same file name. In such cases, this function returns the first such buffer in the buffer list. * Command: set-visited-file-name FILENAME This function changes the name of the file visited in current buffer to FILENAME. The *next time* the buffer is saved it will go in the newly specified file. If the buffer had no visited file, this can give it one. If FILENAME is `nil' or is the empty string, that stands for ``no visited file''. In this case, the buffer will not have a visited file when this function returns, whether or not it had one previously. Also see `clear-visited-file-modtime' and `verify-visited-file-modtime' in *Note Buffer Modification::. When `set-visited-file-name' is called interactively, Emacs prompts for FILENAME in the minibuffer. ▶1f◀ File: lispref Node: Buffer Contents, Prev: Buffer File Name, Up: Buffers, Next: Buffer Modification Buffer Contents =============== The following functions return information about the buffer contents, including their limits. *Note Text::, for functions that modify the contents, and *Note Searching and Matching::, for functions that search the contents. * Function: buffer-substring START END This function returns a string containing a copy of the text of the region defined by positions START and END in the current buffer. If the arguments are not between the values returned by `(point-min)' and `(point-max)', Emacs signals an `args-out-of-range' error ---------- Buffer: foo ---------- This is the contents of buffer foo ---------- Buffer: foo ---------- (buffer-substring 1 10) => "This is t" (buffer-substring (point-max) 10) => "he contents of buffer foo " * Function: buffer-size This function returns the total number of characters in the current buffer. This number is one less than the number `point-max' returns in the absence of a clipping restriction (*Note Clipping Restrictions::). (buffer-size) => 35 (point-max) => 36 * Variable: 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. * Function: buffer-end FLAG This function returns `(point-min)' if FLAG is less than `1', `(point-max)' otherwise. * Function: point-min This function returns the minimum accessible value of the point in the current buffer. This is `1', unless a clipping restriction is in effect, in which case it is the position of the start of the clipping restriction. (*Note Clipping Restrictions::.) * Function: point-max This function returns the maximum accessible value of the point in the current buffer. This is `(1+ (buffer-size))', unless a clipping restriction is in effect, in which case it is the position of the end of the clipping restriction. (*Note Clipping Restrictions::). * Function: buffer-string This function returns the contents of the current buffer as a string. (buffer-string) => "This is the contents of buffer foo " ▶1f◀ File: lispref Node: Buffer Modification, Prev: Buffer Contents, Up: Buffers, Next: Modification Time Buffer Modification =================== Emacs keeps a flag called the "modified flag" for each buffer, to record whether you have changed the text of the buffer. This flag is set to `t' whenever you alter the contents, and cleared to `nil' when you save the buffer. Thus, the flag indicates whether there are unsaved changes. The flag value is normally indicated in the mode line (*Note Major Line Information::), and controls saving (*Note Saving Buffers::) and auto-saving (*Note Auto Saving::). Lisp programs also set the flag explicitly. The Lisp function `set-visited-file-name' sets the flag to `t'; even if the text is unchanged since some other file was visited in the buffer, the text does not match the new visited file. * Function: buffer-modified-p &optional BUFFER This function returns `t' if the buffer has been modified since it was last read in from a file or saved, `nil' otherwise. If BUFFER is not supplied, the current buffer is tested. * Function: set-buffer-modified-p FLAG This function marks the current buffer as modified if FLAG is `t' (or any non-`nil' value). It marks the buffer as unmodified if the flag is `nil'. Another effect of calling this function is to cause redisplay of the mode line for the current buffer, unconditionally. * Command: not-modified Mark current buffer as unmodified, not needing to be saved. Don't use this function in programs! For functions that modify buffers, *Note Text::. ▶1f◀ File: lispref Node: Modification Time, Prev: Buffer Modification, Up: Buffers, Next: Read Only Buffers Comparison of Modification Time =============================== If you visit a file and make changes in the buffer, and meanwhile the file itself is changed on disk, saving the buffer would overwrite the changes in the file. Occasionally, if the file was changed inadvertently, this may be what you want. Most of the time, it would lose valuable information. Emacs therefore checks the file's modification time using the functions described below before saving the file. * Function: verify-visited-file-modtime BUFFER This function compares Emacs's record of the modification time for the file that the buffer is visiting and compares it to the actual modification time of the file as recorded by the operating system. The two will be the same unless some other process has written the file since Emacs visited or saved it. The function returns `t' if the last actual modification time and Emacs's recorded modification time are the same, `nil' otherwise. * Function: clear-visited-file-modtime This function clears out the record of the last modification time of the file being visited by the current buffer. This means that the next attempt to save this buffer will certainly not complain of a discrepancy among file modification times. This is used in `set-visited-file-name' and other exceptional places where the usual test to avoid overwriting a changed file is undesirable. * Function: ask-user-about-supersession-threat FN Ask a user who is about to modify an obsolete buffer what to do. An "obsolete buffer" is one for which the associated file on disk is newer than the last save-time of the buffer. This means some other program probably altered the file. This function is called automatically by Emacs on the proper occasions. You can redefine this function to do what you prefer. Depending on the user's answer, the function may return normally, in which case the modification of the buffer proceeds, or it may signal a `file-supersession' error (with data `(FN)'), in which case the proposed buffer modification is not allowed. ▶1f◀ File: lispref Node: Read Only Buffers, Prev: Modification Time, Up: Buffers, Next: The Buffer List Read Only Buffers ================= A buffer may be designated as "read-only". This means that the buffer's contents may not be modified, although you may change your view of the contents by scrolling, narrowing, or widening. * Variable: buffer-read-only This buffer-local variable specifies whether the buffer is read-only. If it is `nil', then the buffer is not read-only, otherwise it is. * Command: toggle-read-only This command changes whether the current buffer is read-only, regardless of whether it is visiting a file. Don't use this command in programs! * Function: barf-if-buffer-read-only This function signals a `buffer-read-only' error if the current buffer is read-only. *Note Interactive Call::, for another way to signal an error if the current buffer is read-only. Read-only buffers are used in two kinds of situations. * A buffer visiting a file is made read-only if the file is write-protected. Here, the purpose is to show the user that editing the buffer is probably futile. If the user wants to make changes anyway, he or she can use `toggle-read-only'. * Modes such as Dired and Rmail make buffers read-only when altering the contents with the usual editing commands is probably a mistake. The special commands of the mode in question bind `buffer-read-only' to `nil' (with `let') around the places where they change the text. ▶1f◀ File: lispref Node: The Buffer List, Prev: Read Only Buffers, Up: Buffers, Next: Creating Buffers The Buffer List =============== The "buffer list" is a list of all buffers that have not been killed. The order of the buffers in the list is based primarily on how recently each buffer has been displayed in the selected window. Several functions, including `other-buffer', depend on this order. * Function: buffer-list This function returns a list of all buffers, including those whose names begin with a space. (buffer-list) => (#<buffer buffers.texinfo> #<buffer *Minibuf-1*> #<buffer buffer.c> #<buffer *Help*> #<buffer TAGS>) ;; Notice the name of the minibuffer begins with a space! (mapcar (function buffer-name) (buffer-list)) => ("buffers.texinfo" " *Minibuf-1*" "buffer.c" "*Help*" "TAGS") * Command: list-buffers &optional FILES-ONLY This function displays a listing of the names of existing buffers. It clears the buffer `*Buffer List*', then inserts the listing into that buffer and displays it in a window. All buffers that have names starting with spaces are omitted from the display. If FILES-ONLY is non-`nil', then the list shows only buffers that are visiting files. In the listing, the current buffer has a dot in the first column. If the column labeled `M' contains a `*', then that buffer has been modified. If the column labeled `R' contains a `%', then that buffer is `read-only'. `list-buffers' returns `nil'. The buffers are listed in the order which they appear in the buffer list. This is the order in which they are chosen as the default buffer by such functions as `other-buffer'. (list-buffers) => nil ---------- Buffer: *Buffer List* ---------- MR Buffer Size Mode File -- ------ ---- ---- ---- .* buffers.texinfo 17870 Texinfo /lewis/buffers.texinfo buffer.c 43204 C /lewis/buffer.c * *Help* 131 Fundamental TAGS 190930 Fundamental /lewis/TAGS *% *Buffer List* 0 Buffer Menu ---------- Buffer: *Buffer List* ---------- (list-buffers t) => nil ---------- Buffer: *Buffer List* ---------- MR Buffer Size Mode File -- ------ ---- ---- ---- .* buffers.texinfo 17870 Texinfo /lewis/buffers.texinfo buffer.c 43204 C /lewis/buffer.c % TAGS 190930 Fundamental /lewis/TAGS ---------- Buffer: *Buffer List* ---------- * Command: bury-buffer &optional BUFFER-OR-NAME This function puts BUFFER-OR-NAME at the end of the buffer list without changing the order of any of the other buffers on the list. There it is the least desirable candidate for `other-buffer' to return, and appears last in the list displayed by `list-buffers'. If BUFFER-OR-NAME is not supplied, it defaults to the current buffer. If BUFFER-OR-NAME is the current buffer, then the current buffer is replaced in the selected window by the buffer selected by `other-buffer'. If the current buffer is displayed in a window other than the selected one, it remains there. When called interactively, this function buries the current buffer. * Function: other-buffer &optional BUFFER-OR-NAME This function returns the most recently current buffer other than BUFFER-OR-NAME. If BUFFER-OR-NAME is not supplied (or if it is not a buffer), then `other-buffer' returns the first buffer on the buffer list that is not visible in any window. If no other buffer exists, the buffer `*scratch*' is returned. ▶1f◀