123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791 |
- @node Files, Buffers, Fixit, Top
- @chapter File Handling
- @cindex files
- The basic unit of stored data in Unix is the @dfn{file}. To edit a file,
- you must tell Emacs to examine the file and prepare a buffer containing a
- copy of the file's text. This is called @dfn{visiting} the file. Editing
- commands apply directly to text in the buffer; that is, to the copy inside
- Emacs. Your changes appear in the file itself only when you @dfn{save} the
- buffer back into the file.
- @cindex files, remote
- @cindex remote files
- Emacs is also able to handle ``remote files'' which are stored on
- other hosts. Not only is Emacs somewhat aware of the special issues
- involved with network file systems, but it can also use FTP and ssh (or
- rsh) to make local copies of the files, and refresh them on the remote
- host automatically when you save the buffer. The FTP interface is
- provided by the standard @samp{efs} package @ref{Top, EFS, , efs}. The
- ssh/rsh interface is provided by the optional @samp{tramp} package
- @ref{Top, TRAMP, , tramp}. These packages attempt to implement all of
- the operations described below, making remote file use transparent
- (except for unavoidable network delays).
- In addition to visiting and saving files, Emacs can delete, copy, rename,
- and append to files, and operate on file directories.
- @menu
- * File Names:: How to type and edit file name arguments.
- * Visiting:: Visiting a file prepares Emacs to edit the file.
- * Saving:: Saving makes your changes permanent.
- * Reverting:: Reverting cancels all the changes not saved.
- * Auto Save:: Auto Save periodically protects against loss of data.
- * Version Control:: Version control systems (RCS and SCCS).
- * ListDir:: Listing the contents of a file directory.
- * Comparing Files:: Finding where two files differ.
- * Dired:: ``Editing'' a directory to delete, rename, etc.
- the files in it.
- * Misc File Ops:: Other things you can do on files.
- @end menu
- @node File Names, Visiting, Files, Files
- @section File Names
- @cindex file names
- Most Emacs commands that operate on a file require you to specify the
- file name. (Saving and reverting are exceptions; the buffer knows which
- file name to use for them.) File names are specified in the minibuffer
- (@pxref{Minibuffer}). @dfn{Completion} is available, to make it easier to
- specify long file names. @xref{Completion}.
- There is always a @dfn{default file name} which is used if you
- enter an empty argument by typing just @key{RET}. Normally the default
- file name is the name of the file visited in the current buffer; this
- makes it easy to operate on that file with any of the Emacs file
- commands.
- The syntax for accessing remote files unfortunately varies depending on
- the method used. The syntax for using FTP is
- @samp{/@var{user}@@@var{remote-host}:@var{path-on-remote-host}}. The
- syntax for using ssh is
- @samp{/[@var{user}@@@var{remote-host}]@var{path-on-remote-host}}.
- In both cases the @samp{@var{user}@@} portion is optional (it defaults
- to your local user name). @var{path-on-remote-host} may use the
- @samp{~} notation to indicate @var{user}'s home directory on the remote
- host. The default file name will reflect the remote host information.
- @vindex default-directory
- Each buffer has a default directory, normally the same as the
- directory of the file visited in that buffer. When Emacs reads a file
- name, the default directory is used if you do not specify a directory.
- If you specify a directory in a relative fashion, with a name that does
- not start with a slash, it is interpreted with respect to the default
- directory. The default directory of the current buffer is kept in the
- variable @code{default-directory}, which has a separate value in every
- buffer. The value of the variable should end with a slash.
- For example, if the default file name is @file{/u/rms/gnu/gnu.tasks} then
- the default directory is @file{/u/rms/gnu/}. If you type just @samp{foo},
- which does not specify a directory, it is short for @file{/u/rms/gnu/foo}.
- @samp{../.login} would stand for @file{/u/rms/.login}. @samp{new/foo}
- would stand for the filename @file{/u/rms/gnu/new/foo}.
- When visiting a remote file via EFS or TRAMP, the remote directory
- becomes the default directory (@pxref{Visiting}) for that buffer, just
- as a local directory would.
- @vindex default-directory-alist
- The variable @code{default-directory-alist} takes an alist of major
- modes and their opinions on @code{default-directory} as a Lisp
- expression to evaluate. A resulting value of @code{nil} is ignored in
- favor of @code{default-directory}.
- @findex make-directory
- @findex remove-directory
- @cindex creating directories
- @cindex removing directories
- You can create a new directory with the function @code{make-directory},
- which takes as an argument a file name string. The current directory is
- displayed in the minibuffer when the function is called; you can delete
- the old directory name and supply a new directory name. For example, if
- the current directory is @file{/u/rms/gnu}, you can delete @file{gnu}
- and type @file{oryx} and @key{RET} to create @file{/u/rms/oryx}.
- Removing a directory is similar to creating one. To remove a directory,
- use @code{remove-directory}; it takes one argument, a file name string.
- The command @kbd{M-x pwd} prints the current buffer's default directory,
- and the command @kbd{M-x cd} sets it (to a value read using the
- minibuffer). A buffer's default directory changes only when the @code{cd}
- command is used. A file-visiting buffer's default directory is initialized
- to the directory of the file that is visited there. If a buffer is created
- with @kbd{C-x b}, its default directory is copied from that of the
- buffer that was current at the time.
- @vindex insert-default-directory
- The default directory name actually appears in the minibuffer when the
- minibuffer becomes active to read a file name. This serves two
- purposes: it shows you what the default is, so that you can type a
- relative file name and know with certainty what it will mean, and it
- allows you to edit the default to specify a different directory. To
- inhibit the insertion of the default directory, set the variable
- @code{insert-default-directory} to @code{nil}.
- Note that it is legitimate to type an absolute file name after you
- enter the minibuffer, ignoring the presence of the default directory
- name. The final minibuffer contents may look invalid, but that is not
- so. @xref{Minibuffer File}.
- @samp{$} in a file name is used to substitute environment variables. For
- example, if you have used the shell command @samp{setenv FOO rms/hacks} to
- set up an environment variable named @samp{FOO}, then you can use
- @file{/u/$FOO/test.c} or @file{/u/$@{FOO@}/test.c} as an abbreviation for
- @file{/u/rms/hacks/test.c}. The environment variable name consists of all
- the alphanumeric characters after the @samp{$}; alternatively, it may be
- enclosed in braces after the @samp{$}. Note that the @samp{setenv} command
- affects Emacs only if done before Emacs is started.
- To access a file with @samp{$} in its name, type @samp{$$}. This pair
- is converted to a single @samp{$} at the same time variable substitution
- is performed for single @samp{$}. The Lisp function that performs the
- substitution is called @code{substitute-in-file-name}. The substitution
- is performed only on filenames read as such using the minibuffer.
- @node Visiting, Saving, File Names, Files
- @section Visiting Files
- @cindex visiting files
- @c WideCommands
- @table @kbd
- @item C-x C-f
- Visit a file (@code{find-file}).
- @item C-x C-v
- Visit a different file instead of the one visited last
- (@code{find-alternate-file}).
- @item C-x 4 C-f
- Visit a file, in another window (@code{find-file-other-window}). Don't
- change this window.
- @item C-x 5 C-f
- Visit a file, in another frame (@code{find-file-other-frame}). Don't
- change this window or frame.
- @end table
- @cindex files
- @cindex visiting
- @cindex saving
- @dfn{Visiting} a file means copying its contents into an Emacs buffer
- so you can edit it. Emacs creates a new buffer for each file you
- visit. We say that the buffer is visiting the file that it was created
- to hold. Emacs constructs the buffer name from the file name by
- throwing away the directory and keeping just the file name. For example,
- a file named @file{/usr/rms/emacs.tex} is displayed in a buffer named
- @samp{emacs.tex}. If a buffer with that name exists, a unique
- name is constructed by appending @samp{<2>}, @samp{<3>},and so on, using
- the lowest number that makes a name that is not already in use.
- Each window's mode line shows the name of the buffer that is being displayed
- in that window, so you can always tell what buffer you are editing.
- The changes you make with Emacs are made in the Emacs buffer. They do
- not take effect in the file that you visit, or any other permanent
- place, until you @dfn{save} the buffer. Saving the buffer means that
- Emacs writes the current contents of the buffer into its visited file.
- @xref{Saving}.
- @cindex modified (buffer)
- If a buffer contains changes that have not been saved, the buffer is said
- to be @dfn{modified}. This is important because it implies that some
- changes will be lost if the buffer is not saved. The mode line displays
- two stars near the left margin if the buffer is modified.
- @kindex C-x 5 C-f
- @findex find-file
- @findex find-file-other-frame
- To visit a file, use the command @kbd{C-x C-f} (@code{find-file}). Follow
- the command with the name of the file you wish to visit, terminated by a
- @key{RET}. If you are using XEmacs under X, you can also use the
- @b{Open...} command from the @b{File} menu bar item.
- The file name is read using the minibuffer (@pxref{Minibuffer}), with
- defaulting and completion in the standard manner (@pxref{File Names}).
- While in the minibuffer, you can abort @kbd{C-x C-f} by typing @kbd{C-g}.
- @kbd{C-x C-f} has completed successfully when text appears on the
- screen and a new buffer name appears in the mode line. If the specified
- file does not exist and could not be created or cannot be read, an error
- results. The error message is printed in the echo area, and includes
- the name of the file that Emacs was trying to visit.
- If you visit a file that is already in Emacs, @kbd{C-x C-f} does not make
- another copy. It selects the existing buffer containing that file.
- However, before doing so, it checks that the file itself has not changed
- since you visited or saved it last. If the file has changed, Emacs
- prints a warning message. @xref{Interlocking,,Simultaneous Editing}.
- @findex find-this-file
- You can switch to a specific file called out in the current buffer by
- calling the function @code{find-this-file}. By providing a prefix
- argument, this function calls @code{filename-at-point} and switches to a
- buffer visiting the file @var{filename}. It creates one if none already
- exists. You can use this function to edit the file mentioned in the
- buffer you are working in or to test if the file exists. You can do that
- by using the minibuffer completion after snatching the all or part of
- the filename.
- @vindex find-file-use-truenames
- @vindex buffer-file-name
- If the variable @code{find-file-use-truenames}'s value is
- non-@code{nil}, a buffer's visited filename will always be traced back
- to the real file. The filename will never be a symbolic link, and there
- will never be a symbolic link anywhere in its directory path. In other
- words, the @code{buffer-file-name} and @code{buffer-file-truename} will
- be equal.
- @vindex find-file-compare-truenames
- @vindex buffer-file-truename
- If the variable @code{find-file-compare-truenames} value is
- non-@code{nil}, the @code{find-file} command will check the
- @code{buffer-file-truename} of all visited files when deciding whether a
- given file is already in a buffer, instead of just
- @code{buffer-file-name}. If you attempt to visit another file which is
- a symbolic link to a file that is already in a buffer, the existing
- buffer will be found instead of a newly created one. This works if any
- component of the pathname (including a non-terminal component) is a
- symbolic link as well, but doesn't work with hard links (nothing does).
- @cindex creating files
- If you want to create a file, just visit it. Emacs prints
- @samp{(New File)} in the echo area, but in other respects behaves as if you
- had visited an existing empty file. If you make any changes and save them,
- the file is created.
- @kindex C-x C-v
- @findex find-alternate-file
- If you visit a nonexistent file unintentionally (because you typed the
- wrong file name), use the @kbd{C-x C-v} (@code{find-alternate-file})
- command to visit the file you wanted. @kbd{C-x C-v} is similar to @kbd{C-x
- C-f}, but it kills the current buffer (after first offering to save it if
- it is modified). @kbd{C-x C-v} is allowed even if the current buffer
- is not visiting a file.
- @vindex find-file-run-dired
- If the file you specify is actually a directory, Dired is called on
- that directory (@pxref{Dired}). To inhibit this, set the variable
- @code{find-file-run-dired} to @code{nil}; then it is an error to try to
- visit a directory.
- @kindex C-x 4 f
- @findex find-file-other-window
- @kbd{C-x 4 f} (@code{find-file-other-window}) is like @kbd{C-x C-f}
- except that the buffer containing the specified file is selected in another
- window. The window that was selected before @kbd{C-x 4 f} continues to
- show the same buffer it was already showing. If you use this command when
- only one window is being displayed, that window is split in two, with one
- window showing the same buffer as before, and the other one showing the
- newly requested file. @xref{Windows}.
- @kindex C-x 5 C-f
- @findex find-file-other-frame
- @kbd{C-x 5 C-f} (@code{find-file-other-frame}) is like @kbd{C-x C-f}
- except that it creates a new frame in which the file is displayed.
- @findex find-this-file-other-window
- Use the function @code{find-this-file-other-window} to edit a file
- mentioned in the buffer you are editing or to test if that file exists.
- To do this, use the minibuffer completion after snatching the part or
- all of the filename. By providing a prefix argument, the function calls
- @code{filename-at-point} and switches you to a buffer visiting the file
- @var{filename} in another window. The function creates a buffer if none
- already exists. This function is similar to @code{find-file-other-window}.
- @vindex find-file-hooks
- @vindex find-file-not-found-hooks
- There are two hook variables that allow extensions to modify the
- operation of visiting files. Visiting a file that does not exist runs the
- functions in the list @code{find-file-not-found-hooks}; the value of this
- variable is expected to be a list of functions which are
- called one by one until one of them returns non-@code{nil}. Any visiting
- of a file, whether extant or not, expects @code{find-file-hooks} to
- contain list of functions and calls them all, one by one. In both cases
- the functions receive no arguments. Visiting a nonexistent file
- runs the @code{find-file-not-found-hooks} first.
- @node Saving, Reverting, Visiting, Files
- @section Saving Files
- @dfn{Saving} a buffer in Emacs means writing its contents back into the file
- that was visited in the buffer.
- @table @kbd
- @item C-x C-s
- Save the current buffer in its visited file (@code{save-buffer}).
- @item C-x s
- Save any or all buffers in their visited files (@code{save-some-buffers}).
- @item M-~
- Forget that the current buffer has been changed (@code{not-modified}).
- @item C-x C-w
- Save the current buffer in a specified file, and record that file as
- the one visited in the buffer (@code{write-file}).
- @item M-x set-visited-file-name
- Change file the name under which the current buffer will be saved.
- @end table
- @kindex C-x C-s
- @findex save-buffer
- To save a file and make your changes permanent, type
- @kbd{C-x C-s} (@code{save-buffer}). After saving is finished, @kbd{C-x C-s}
- prints a message such as:
- @example
- Wrote /u/rms/gnu/gnu.tasks
- @end example
- @noindent
- If the selected buffer is not modified (no changes have been made in it
- since the buffer was created or last saved), Emacs does not save it
- because it would have no effect. Instead, @kbd{C-x C-s} prints a message
- in the echo area saying:
- @example
- (No changes need to be saved)
- @end example
- @kindex C-x s
- @findex save-some-buffers
- The command @kbd{C-x s} (@code{save-some-buffers}) can save any or all
- modified buffers. First it asks, for each modified buffer, whether to
- save it. The questions should be answered with @kbd{y} or @kbd{n}.
- @kbd{C-x C-c}, the key that kills Emacs, invokes
- @code{save-some-buffers} and therefore asks the same questions.
- @kindex M-~
- @findex not-modified
- If you have changed a buffer and do not want the changes to be saved,
- you should take some action to prevent it. Otherwise, you are liable to
- save it by mistake each time you use @code{save-some-buffers} or a
- related command. One thing you can do is type @kbd{M-~}
- (@code{not-modified}), which removes the indication that the buffer
- is modified. If you do this, none of the save commands will believe
- that the buffer needs to be saved. (@samp{~} is often used as a
- mathematical symbol for `not'; thus @kbd{Meta-~} is `not', metafied.)
- You could also use @code{set-visited-file-name} (see below) to mark the
- buffer as visiting a different file name, not in use for
- anything important.
- You can also undo all the changes made since the file was visited or
- saved, by reading the text from the file again. This is called
- @dfn{reverting}. @xref{Reverting}. Alternatively, you can undo all the
- changes by repeating the undo command @kbd{C-x u}; but this only works
- if you have not made more changes than the undo mechanism can remember.
- @findex set-visited-file-name
- @kbd{M-x set-visited-file-name} alters the name of the file that the
- current buffer is visiting. It prompts you for the new file name in the
- minibuffer. You can also use @code{set-visited-file-name} on a buffer
- that is not visiting a file. The buffer's name is changed to correspond
- to the file it is now visiting unless the new name is already used by a
- different buffer; in that case, the buffer name is not changed.
- @code{set-visited-file-name} does not save the buffer in the newly
- visited file; it just alters the records inside Emacs so that it will
- save the buffer in that file. It also marks the buffer as ``modified''
- so that @kbd{C-x C-s} @i{will} save.
- @kindex C-x C-w
- @findex write-file
- If you wish to mark a buffer as visiting a different file and save it
- right away, use @kbd{C-x C-w} (@code{write-file}). It is precisely
- equivalent to @code{set-visited-file-name} followed by @kbd{C-x C-s}.
- @kbd{C-x C-s} used on a buffer that is not visiting a file has the
- same effect as @kbd{C-x C-w}; that is, it reads a file name, marks the
- buffer as visiting that file, and saves it there. The default file name in
- a buffer that is not visiting a file is made by combining the buffer name
- with the buffer's default directory.
- If Emacs is about to save a file and sees that the date of the latest
- version on disk does not match what Emacs last read or wrote, Emacs
- notifies you of this fact, because it probably indicates a problem caused
- by simultaneous editing and requires your immediate attention.
- @xref{Interlocking,, Simultaneous Editing}.
- @vindex require-final-newline
- If the variable @code{require-final-newline} is non-@code{nil}, Emacs
- puts a newline at the end of any file that doesn't already end in one,
- every time a file is saved or written.
- @vindex write-file-hooks
- @vindex after-save-hook
- Use the hook variable @code{write-file-hooks} to implement other ways
- to write files, and specify things to be done before files are written. The
- value of this variable should be a list of Lisp functions. When a file
- is to be written, the functions in the list are called, one by one, with
- no arguments. If one of them returns a non-@code{nil} value, Emacs
- takes this to mean that the file has been written in some suitable
- fashion; the rest of the functions are not called, and normal writing is
- not done. Use the hook variable @code{after-save-hook} to list
- all the functions to be called after writing out a buffer to a file.
- @menu
- * Backup:: How Emacs saves the old version of your file.
- * Interlocking:: How Emacs protects against simultaneous editing
- of one file by two users.
- @end menu
- @node Backup, Interlocking, Saving, Saving
- @subsection Backup Files
- @cindex backup file
- @vindex make-backup-files
- Because Unix does not provide version numbers in file names, rewriting a
- file in Unix automatically destroys all record of what the file used to
- contain. Thus, saving a file from Emacs throws away the old contents of
- the file---or it would, except that Emacs carefully copies the old contents
- to another file, called the @dfn{backup} file, before actually saving.
- (Make sure that the variable @code{make-backup-files} is non-@code{nil}.
- Backup files are not written if this variable is @code{nil}).
- At your option, Emacs can keep either a single backup file or a series of
- numbered backup files for each file you edit.
- Emacs makes a backup for a file only the first time a file is saved
- from one buffer. No matter how many times you save a file, its backup file
- continues to contain the contents from before the file was visited.
- Normally this means that the backup file contains the contents from before
- the current editing session; however, if you kill the buffer and then visit
- the file again, a new backup file is made by the next save.
- @menu
- * Names: Backup Names. How backup files are named;
- Choosing single or numbered backup files.
- * Deletion: Backup Deletion. Emacs deletes excess numbered backups.
- * Copying: Backup Copying. Backups can be made by copying or renaming.
- @end menu
- @node Backup Names, Backup Deletion, Backup, Backup
- @subsubsection Single or Numbered Backups
- If you choose to have a single backup file (the default),
- the backup file's name is constructed by appending @samp{~} to the
- file name being edited; thus, the backup file for @file{eval.c} is
- @file{eval.c~}.
- If you choose to have a series of numbered backup files, backup file
- names are made by appending @samp{.~}, the number, and another @samp{~} to
- the original file name. Thus, the backup files of @file{eval.c} would be
- called @file{eval.c.~1~}, @file{eval.c.~2~}, and so on, through names
- like @file{eval.c.~259~} and beyond.
- If protection stops you from writing backup files under the usual names,
- the backup file is written as @file{%backup%~} in your home directory.
- Only one such file can exist, so only the most recently made backup is
- available.
- @vindex version-control
- The choice of single backup or numbered backups is controlled by the
- variable @code{version-control}. Its possible values are:
- @table @code
- @item t
- Make numbered backups.
- @item nil
- Make numbered backups for files that have numbered backups already.
- Otherwise, make single backups.
- @item never
- Never make numbered backups; always make single backups.
- @end table
- @noindent
- @code{version-control} may be set locally in an individual buffer to
- control the making of backups for that buffer's file. For example,
- Rmail mode locally sets @code{version-control} to @code{never} to make sure
- that there is only one backup for an Rmail file. @xref{Locals}.
- @node Backup Deletion, Backup Copying, Backup Names, Backup
- @subsubsection Automatic Deletion of Backups
- @vindex kept-old-versions
- @vindex kept-new-versions
- To prevent unlimited consumption of disk space, Emacs can delete numbered
- backup versions automatically. Generally Emacs keeps the first few backups
- and the latest few backups, deleting any in between. This happens every
- time a new backup is made. The two variables that control the deletion are
- @code{kept-old-versions} and @code{kept-new-versions}. Their values are, respectively
- the number of oldest (lowest-numbered) backups to keep and the number of
- newest (highest-numbered) ones to keep, each time a new backup is made.
- The values are used just after a new backup version is made;
- that newly made backup is included in the count in @code{kept-new-versions}.
- By default, both variables are 2.
- @vindex delete-old-versions
- If @code{delete-old-versions} is non-@code{nil}, excess
- middle versions are deleted without notification. If it is @code{nil}, the
- default, you are asked whether the excess middle versions should
- really be deleted.
- You can also use Dired's @kbd{.} (Period) command to delete old versions.
- @xref{Dired}.
- @node Backup Copying, , Backup Deletion, Backup
- @subsubsection Copying vs.@: Renaming
- You can make backup files by copying the old file or by renaming it.
- This makes a difference when the old file has multiple names. If you
- rename the old file into the backup file, the alternate names
- become names for the backup file. If you copy the old file instead,
- the alternate names remain names for the file that you are editing,
- and the contents accessed by those names will be the new contents.
- How you make a backup file may also affect the file's owner
- and group. If you use copying, they do not change. If renaming is used,
- you become the file's owner, and the file's group becomes the default
- (different operating systems have different defaults for the group).
- Having the owner change is usually a good idea, because then the owner
- is always the person who last edited the file. Occasionally there is a
- file whose owner should not change. Since most files should change
- owners, it is a good idea to use local variable lists to set
- @code{backup-by-copying-when-mismatch} for the special cases where the
- owner should not change (@pxref{File Variables}).
- @vindex backup-by-copying
- @vindex backup-by-copying-when-linked
- @vindex backup-by-copying-when-mismatch
- Three variables control the choice of renaming or copying.
- Normally, renaming is done. If the variable @code{backup-by-copying} is
- non-@code{nil}, copying is used. Otherwise, if the variable
- @code{backup-by-copying-when-linked} is non-@code{nil}, copying is
- done for files that have multiple names, but renaming may still be done when
- the file being edited has only one name. If the variable
- @code{backup-by-copying-when-mismatch} is non-@code{nil}, copying is
- done if renaming would cause the file's owner or group to change. @refill
- @node Interlocking, , Backup, Saving
- @subsection Protection Against Simultaneous Editing
- @cindex file dates
- @cindex simultaneous editing
- Simultaneous editing occurs when two users visit the same file, both
- make changes, and both save their changes. If no one was informed that
- this was happening, and you saved first, you would later find that your
- changes were lost. On some systems, Emacs notices immediately when the
- second user starts to change a file already being edited, and issues a
- warning. When this is not possible, or if the second user has started
- to change the file despite the warning, Emacs checks when the file is
- saved, and issues a second warning when a user is about to overwrite a
- file containing another user's changes. If you are the user editing the
- file, you can take corrective action at this point and prevent actual
- loss of work.
- @findex ask-user-about-lock
- When you make the first modification in an Emacs buffer that is visiting
- a file, Emacs records that you have locked the file. (It does this by
- writing another file in a directory reserved for this purpose.) The lock
- is removed when you save the changes. The idea is that the file is locked
- whenever the buffer is modified. If you begin to modify the buffer while
- the visited file is locked by someone else, this constitutes a collision,
- and Emacs asks you what to do. It does this by calling the Lisp function
- @code{ask-user-about-lock}, which you can redefine to customize what it
- does. The standard definition of this function asks you a
- question and accepts three possible answers:
- @table @kbd
- @item s
- Steal the lock. Whoever was already changing the file loses the lock,
- and you get the lock.
- @item p
- Proceed. Go ahead and edit the file despite its being locked by someone else.
- @item q
- Quit. This causes an error (@code{file-locked}) and the modification you
- were trying to make in the buffer does not actually take place.
- @end table
- Note that locking works on the basis of a file name; if a file has
- multiple names, Emacs does not realize that the two names are the same file
- and cannot prevent two users from editing it simultaneously under different
- names. However, basing locking on names means that Emacs can interlock the
- editing of new files that do not really exist until they are saved.
- Some systems are not configured to allow Emacs to make locks. On
- these systems, Emacs cannot detect trouble in advance, but it can still
- detect it in time to prevent you from overwriting someone else's changes.
- Every time Emacs saves a buffer, it first checks the last-modification
- date of the existing file on disk to see that it has not changed since the
- file was last visited or saved. If the date does not match, it implies
- that changes were made in the file in some other way, and these changes are
- about to be lost if Emacs actually does save. To prevent this, Emacs
- prints a warning message and asks for confirmation before saving.
- Occasionally you will know why the file was changed and know that it does
- not matter; then you can answer @kbd{yes} and proceed. Otherwise, you should
- cancel the save with @kbd{C-g} and investigate the situation.
- The first thing you should do when notified that simultaneous editing
- has already taken place is to list the directory with @kbd{C-u C-x C-d}
- (@pxref{ListDir,,Directory Listing}). This will show the file's current
- author. You should attempt to contact that person and ask him not to
- continue editing. Often the next step is to save the contents of your
- Emacs buffer under a different name, and use @code{diff} to compare the
- two files.@refill
- Simultaneous editing checks are also made when you visit a file that
- is already visited with @kbd{C-x C-f} and when you start to modify a
- file. This is not strictly necessary, but it is useful to find out
- about such a problem as early as possible, when corrective action takes
- less work.
- @findex set-default-file-modes
- @cindex file protection
- Another way to protect your file is to set the read, write, and
- executable permissions for the file. Use the function
- @code{set-default-file-modes} to set the UNIX @code{umask} value to the
- @var{nmask} argument. The @code{umask} value is the default protection
- mode for new files.
- @node Reverting, Auto Save, Saving, Files
- @section Reverting a Buffer
- @findex revert-buffer
- @cindex drastic changes
- If you have made extensive changes to a file and then change your mind
- about them, you can get rid of all changes by reading in the previous
- version of the file. To do this, use @kbd{M-x revert-buffer}, which
- operates on the current buffer. Since reverting a buffer can result in
- very extensive changes, you must confirm it with @kbd{yes}.
- You may request that @code{revert-buffer} check for an auto-save file
- that is more recent than the visited file by providing a prefix
- argument. If a recent auto-save file exists, @code{revert-buffer}
- offers to read the auto-save file instead of the visited file
- (@pxref{Auto Save}). Emacs asks you about the auto-save file before the
- request for confirmation of the @kbd{revert-buffer} operation, and
- demands @kbd{y} or @kbd{n} as an answer. If you have started to type
- @kbd{yes} to confirm the revert operation, the @kbd{y} will answer the
- question about using the auto-save file, but the @kbd{es} will not be
- valid confirmation for the reversion. This gives you a chance to cancel
- the operation with @kbd{C-g} and try again with the answers you really
- intend.
- @code{revert-buffer} preserves the value of point (in characters from
- the beginning of the file). If the file was edited only slightly, you
- will be at approximately the same piece of text after reverting as
- before. If you have made more extensive changes, after reversion point
- may be in a totally different context than your last edits before
- reversion.
- A buffer reverted from its visited file is marked ``not modified'' until
- you make a change. The buffer's modes will also be recalculated, by
- @code{normal-mode}.
- Some kinds of buffers whose contents reflect data bases other than files,
- such as Dired buffers, can also be reverted. For them, reverting means
- refreshing their contents from the appropriate data. Buffers created
- randomly with @kbd{C-x b} cannot be reverted; @code{revert-buffer}
- reports an error when asked to do so.
- @node Auto Save, Version Control, Reverting, Files
- @section Auto-Saving: Protection Against Disasters
- @cindex Auto-Save mode
- @cindex crashes
- Emacs saves all the visited files from time to time (based on counting
- your keystrokes) without being asked. This is called @dfn{auto-saving}.
- It prevents you from losing more than a limited amount of work if the
- system crashes.
- When Emacs determines it is time for auto-saving, each buffer is
- considered and is auto-saved if auto-saving is turned on for it and it has
- changed since the last time it was auto-saved. If any auto-saving is
- done, the message @samp{Auto-saving...} is displayed in the echo area until
- auto-saving is finished. Errors occurring during auto-saving are caught
- so that they do not interfere with the execution of commands you have been
- typing.
- @menu
- * Files: Auto Save Files.
- * Control: Auto Save Control.
- * Recover:: Recovering text from auto-save files.
- @end menu
- @node Auto Save Files, Auto Save Control, Auto Save, Auto Save
- @subsection Auto-Save Files
- Auto-saving does not normally write to the files you visited, because
- it can be undesirable to save a program that is in an inconsistent
- state when you have made only half of a planned change. Instead, auto-saving
- is done in a different file called the @dfn{auto-save file}, and the
- visited file is changed only when you save explicitly, for example,
- with @kbd{C-x C-s}.
- Normally, the name of the auto-save file is generated by appending
- @samp{#} to the front and back of the visited file name. Thus, a buffer
- visiting file @file{foo.c} would be auto-saved in a file @file{#foo.c#}.
- Most buffers that are not visiting files are auto-saved only if you
- request it explicitly; when they are auto-saved, the auto-save file name
- is generated by appending @samp{#%} to the front and @samp{#} to the
- back of buffer name. For example, the @samp{*mail*} buffer in which you
- compose messages to be sent is auto-saved in a file named
- @file{#%*mail*#}. Names of auto-save files are generated this way
- unless you customize the functions @code{make-auto-save-file-name} and
- @code{auto-save-file-name-p} to do something different. The file name
- to be used for auto-saving a buffer is calculated at the time auto-saving is
- turned on in that buffer.
- @vindex auto-save-visited-file-name
- If you want auto-saving to be done in the visited file, set the variable
- @code{auto-save-visited-file-name} to be non-@code{nil}. In this mode,
- there is really no difference between auto-saving and explicit saving.
- @vindex delete-auto-save-files
- Emacs deletes a buffer's auto-save file when you explicitly save the
- buffer. To inhibit the deletion, set the variable
- @code{delete-auto-save-files} to @code{nil}. Changing the visited file
- name with @kbd{C-x C-w} or @code{set-visited-file-name} renames any
- auto-save file to correspond to the new visited name.
- @node Auto Save Control, Recover, Auto Save Files, Auto Save
- @subsection Controlling Auto-Saving
- @vindex auto-save-default
- @findex auto-save-mode
- Each time you visit a file, auto-saving is turned on for that file's
- buffer if the variable @code{auto-save-default} is non-@code{nil} (but
- not in batch mode; @pxref{Entering Emacs}). The default for this
- variable is @code{t}, so Emacs auto-saves buffers that visit files by
- default. You can use the command @kbd{M-x auto-save-mode} to turn
- auto-saving for a buffer on or off. Like other minor mode commands,
- @kbd{M-x auto-save-mode} turns auto-saving on with a positive argument,
- off with a zero or negative argument; with no argument, it toggles.
- @vindex auto-save-interval
- @findex do-auto-save
- Emacs performs auto-saving periodically based on counting how many
- characters you have typed since the last time auto-saving happened. The
- variable @code{auto-save-interval} specifies the number of characters
- between auto-saves. By default, it is 300. Emacs also auto-saves
- whenever you call the function @code{do-auto-save}.
- Emacs also does auto-saving whenever it gets a fatal error. This
- includes killing the Emacs job with a shell command such as @code{kill
- -emacs}, or disconnecting a phone line or network connection.
- @vindex auto-save-timeout
- You can set the number of seconds of idle time before an auto-save is
- done. Setting the value of the variable @code{auto-save-timeout} to zero or
- @code{nil} will disable auto-saving due to idleness.
- The actual amount of idle time between auto-saves is logarithmically
- related to the size of the current buffer. This variable is the number
- of seconds after which an auto-save will happen when the current buffer
- is 50k or less; the timeout will be 2 1/4 times this in a 200k buffer, 3
- 3/4 times this in a 1000k buffer, and 4 1/2 times this in a 2000k
- buffer.
- For this variable to have any effect, you must do @code{(require 'timer)}.
- @node Recover, , Auto Save Control, Auto Save
- @subsection Recovering Data from Auto-Saves
- @findex recover-file
- If you want to use the contents of an auto-save file to recover from a
- loss of data, use the command @kbd{M-x recover-file @key{RET} @var{file}
- @key{RET}}. Emacs visits @var{file} and then (after your confirmation)
- restores the contents from the auto-save file @file{#@var{file}#}. You
- can then save the file with @kbd{C-x C-s} to put the recovered text into
- @var{file} itself. For example, to recover file @file{foo.c} from its
- auto-save file @file{#foo.c#}, do:@refill
- @example
- M-x recover-file @key{RET} foo.c @key{RET}
- C-x C-s
- @end example
- Before asking for confirmation, @kbd{M-x recover-file} displays a
- directory listing describing the specified file and the auto-save file,
- so you can compare their sizes and dates. If the auto-save file
- is older, @kbd{M-x recover-file} does not offer to read it.
- Auto-saving is disabled by @kbd{M-x recover-file} because using
- this command implies that the auto-save file contains valuable data
- from a past session. If you save the data in the visited file and
- then go on to make new changes, turn auto-saving back on
- with @kbd{M-x auto-save-mode}.
- @node Version Control, ListDir, Auto Save, Files
- @section Version Control
- @cindex version control
- @dfn{Version control systems} are packages that can record multiple
- versions of a source file, usually storing the unchanged parts of the
- file just once. Version control systems also record history information
- such as the creation time of each version, who created it, and a
- description of what was changed in that version.
- The GNU project recommends the version control system known as RCS,
- which is free software and available from the Free Software Foundation.
- Emacs supports use of either RCS or SCCS (a proprietary, but widely
- used, version control system that is not quite as powerful as RCS)
- through a facility called VC. The same Emacs commands work with either
- RCS or SCCS, so you hardly have to know which one of them you are
- using.
- @menu
- * Concepts of VC:: Basic version control information;
- checking files in and out.
- * Editing with VC:: Commands for editing a file maintained
- with version control.
- * Variables for Check-in/out:: Variables that affect the commands used
- to check files in or out.
- * Log Entries:: Logging your changes.
- * Change Logs and VC:: Generating a change log file from log
- entries.
- * Old Versions:: Examining and comparing old versions.
- * VC Status:: Commands to view the VC status of files and
- look at log entries.
- * Renaming and VC:: A command to rename both the source and
- master file correctly.
- * Snapshots:: How to make and use snapshots, a set of
- file versions that can be treated as a unit.
- * Version Headers:: Inserting version control headers into
- working files.
- @end menu
- @node Concepts of VC, Editing with VC, Version Control, Version Control
- @subsection Concepts of Version Control
- @cindex RCS
- @cindex SCCS
- @cindex master file
- @cindex registered file
- @cindex work file
- When a file is under version control, we also say that it is
- @dfn{registered} in the version control system. Each registered file
- has a corresponding @dfn{master file} which represents the file's
- present state plus its change history, so that you can reconstruct from
- it either the current version or any specified earlier version. Usually
- the master file also records a @dfn{log entry} for each version describing
- what was changed in that version.
- The file that is maintained under version control is sometimes called
- the @dfn{work file} corresponding to its master file.
- @cindex checking out files
- @cindex checking in files
- @cindex locking and version control
- To examine a file, you @dfn{check it out}. This extracts a version
- of the source file (typically, the most recent) from the master file.
- If you want to edit the file, you must check it out @dfn{locked}. Only
- one user can do this at a time for any given source file. (This kind
- of locking is completely unrelated to the locking that Emacs uses to
- detect simultaneous editing of a file.)
- When you are done with your editing, you must @dfn{check in} the new
- version. This records the new version in the master file, and unlocks
- the source file so that other people can lock it and thus modify it.
- Checkin and checkout are the basic operations of version control. You
- can do both of them with a single Emacs command: @w{@kbd{C-x C-q}}
- (@code{vc-toggle-read-only}).
- A @dfn{snapshot} is a coherent collection of versions of the various
- files that make up a program. @xref{Snapshots}.
- @node Editing with VC, Variables for Check-in/out, Concepts of VC, Version Control
- @subsection Editing with Version Control
- When you visit a file that is maintained using version control, the
- mode line displays @samp{RCS} or @samp{SCCS} to inform you that version
- control is in use, and also (in case you care) which low-level system
- the file is actually stored in. Normally, such a source file is
- read-only, and the mode line indicates this with @samp{%%}. With RCS,
- the mode line also indicates the number of the head version, which is
- normally also the version you are looking at.
- These are the commands for editing a file maintained with
- version control:
- @table @kbd
- @item C-x C-q
- Check the visited file in or out.
- @item C-x v u
- Revert the buffer and the file to the last checked in version.
- @item C-x v c
- Remove the last-entered change from the master for the visited file.
- This undoes your last check-in.
- @item C-x v i
- Register the visited file in version control.
- @end table
- @noindent
- (@kbd{C-x v} is the prefix key for version control commands; all of these
- commands except for @kbd{C-x C-q} start with @kbd{C-x v}.)
- @kindex C-x C-q @r{(version control)}
- When you want to modify a file maintained with version control, type
- @kbd{C-x C-q} (@code{vc-toggle-read-only}). This @dfn{checks out} the
- file, and tells RCS or SCCS to lock the file. This means making the
- file writable for you (but not for anyone else).
- @cindex log entry
- When you are finished editing the file, type @kbd{C-x C-q} again.
- When used on a file that is checked out, this command checks the file
- in. But check-in does not start immediately; first, you must enter the
- @dfn{log entry}---a description of the changes in the new version.
- @kbd{C-x C-q} pops up a buffer for you to enter this in. When you are
- finished typing in the log entry, type @kbd{C-c C-c} to terminate it; this is
- when actual check-in takes place.
- Once you have checked in your changes, the file is unlocked, so that
- other users can lock it and modify it.
- @vindex vc-make-backup-files
- Emacs does not save backup files for source files that are maintained
- with version control. If you want to make backup files despite version
- control, set the variable @code{vc-make-backup-files} to a
- non-@code{nil} value.
- @vindex vc-keep-workfiles
- Normally the work file exists all the time, whether it is locked or
- not. If you set @code{vc-keep-workfiles} to @code{nil}, then checking
- in a new version with @kbd{C-x C-q} deletes the work file; but any
- attempt to visit the file with Emacs creates it again.
- It is not impossible to lock a file that someone else has locked. If
- you try to check out a file that is locked, @kbd{C-x C-q} asks you
- whether you want to ``steal the lock.'' If you say yes, the file
- becomes locked by you, but a message is sent to the person who had
- formerly locked the file, to inform him of what has happened. The mode
- line indicates that a file is locked by someone else by displaying the
- login name of that person, before the version number.
- @kindex C-x v u
- @findex vc-revert-buffer
- If you want to discard your current set of changes and revert to the
- last version checked in, use @kbd{C-x v u} (@code{vc-revert-buffer}).
- This cancels your last check-out, leaving the file unlocked. If you want
- to make a different set of changes, you must first check the file out
- again. @kbd{C-x v u} requires confirmation, unless it sees that
- you haven't made any changes since the last checked-in version.
- @kbd{C-x v u} is also the command to use if you lock a file and then
- don't actually change it.
- @kindex C-x v c
- @findex vc-cancel-version
- You can cancel a change after checking it in, with @kbd{C-x v c}
- (@code{vc-cancel-version}). This command discards all record of the
- most recent checked in version, so be careful about using it. It
- requires confirmation with @kbd{yes}. By default, @kbd{C-x v c} reverts
- your workfile and buffer to the previous version (the one that precedes
- the version that is deleted), but you can prevent the reversion by
- giving the command a prefix argument. Then the buffer does not change.
- This command with a prefix argument is useful when you have checked in
- a change and then discover a trivial error in it; you can cancel the
- erroneous check-in, fix the error, and repeat the check-in.
- Be careful when invoking @kbd{C-x v c}, as it is easy to throw away a
- lot of work with it. To help you be careful, this command always
- requires confirmation with @samp{yes}.
- @kindex C-x v i
- @findex vc-register
- @vindex vc-default-back-end
- You can register the visited file for version control using
- @w{@kbd{C-x v i}} (@code{vc-register}). If the variable
- @code{vc-default-back-end} is non-@code{nil}, it specifies which
- version control system to use; otherwise, this uses RCS if it is
- installed on your system and SCCS if not. After @kbd{C-x v i},
- the file is unlocked and read-only. Type @kbd{C-x C-q} if you wish to
- edit it.
- By default, the initial version number is 1.1. If you want to use a
- different number, give @kbd{C-x v i} a prefix argument; then it reads
- the initial version number using the minibuffer.
- @vindex vc-initial-comment
- If @code{vc-initial-comment} is non-@code{nil}, @kbd{C-x v i} reads
- an initial comment (much like a log entry) to describe the purpose of
- this source file.
- @kindex C-u C-x v v
- @findex vc-next-action
- To specify the version number for a subsequent checkin, use the
- command @kbd{C-u C-x v v}. @kbd{C-x v v} (@code{vc-next-action}) is the
- command that @kbd{C-x C-q} uses to do the ``real work'' when the visited
- file uses version control. When used for checkin, and given a prefix
- argument, it reads the version number with the minibuffer.
- @node Variables for Check-in/out, Log Entries, Editing with VC, Version Control
- @subsection Variables Affecting Check-in and Check-out
- @c There is no need to tell users about vc-master-templates.
- @vindex vc-suppress-confirm
- If @code{vc-suppress-confirm} is non-@code{nil}, then @kbd{C-x C-q}
- and @kbd{C-x v i} can save the current buffer without asking, and
- @kbd{C-x v u} also operates without asking for confirmation.
- (This variable does not affect @kbd{C-x v c}; that is so drastic
- that it should always ask for confirmation.)
- @vindex vc-command-messages
- VC mode does much of its work by running the shell commands for RCS
- and SCCS. If @code{vc-command-messages} is non-@code{nil}, VC displays
- messages to indicate which shell commands it runs, and additional
- messages when the commands finish.
- Normally, VC assumes that it can deduce the locked/unlocked state of
- files by looking at the file permissions of the work file; this is
- fast. However, if the @file{RCS} or @file{SCCS} subdirectory is
- actually a symbolic link, then VC does not trust the file permissions to
- reflect this status.
- @vindex vc-mistrust-permissions
- You can specify the criterion for whether to trust the file permissions
- by setting the variable @code{vc-mistrust-permissions}. Its value may
- be @code{t} (always mistrust the file permissions and check the master
- file), @code{nil} (always trust the file permissions), or a function of
- one argument which makes the decision. The argument is the directory
- name of the @file{RCS} or @file{SCCS} subdirectory. A non-@code{nil}
- value from the function says to mistrust the file permissions.
- If you find that the file permissions of work files are changed
- erroneously, set @code{vc-mistrust-permissions} to @code{t}. Then VC
- always checks the master file to determine the file's status.
- @vindex vc-path
- You can specify additional directories to search for version control
- programs by setting the variable @code{vc-path}. These directories
- are searched before the usual search path. The proper result usually
- happens automatically.
- @node Log Entries, Change Logs and VC, Variables for Check-in/out, Version Control
- @subsection Log Entries
- When you're editing an initial comment or log entry for inclusion in a
- master file, finish your entry by typing @kbd{C-c C-c}.
- @table @kbd
- @item C-c C-c
- Finish the comment edit normally (@code{vc-finish-logentry}).
- This finishes check-in.
- @end table
- To abort check-in, just don't type @kbd{C-c C-c} in that buffer. You
- can switch buffers and do other editing. As long as you don't try to
- check in another file, the entry you were editing remains in its
- buffer, and you can go back to that buffer at any time to complete the
- check-in.
- If you change several source files for the same reason, it is often
- convenient to specify the same log entry for many of the files. To do
- this, use the history of previous log entries. The commands @kbd{M-n},
- @kbd{M-p}, @kbd{M-s} and @kbd{M-r} for doing this work just like the
- minibuffer history commands (except that these versions are used outside
- the minibuffer).
- @vindex vc-log-mode-hook
- Each time you check in a file, the log entry buffer is put into VC Log
- mode, which involves running two hooks: @code{text-mode-hook} and
- @code{vc-log-mode-hook}.
- @node Change Logs and VC, Old Versions, Log Entries, Version Control
- @subsection Change Logs and VC
- If you use RCS for a program and also maintain a change log file for
- it (@pxref{Change Log}), you can generate change log entries
- automatically from the version control log entries:
- @table @kbd
- @item C-x v a
- @kindex C-x v a
- @findex vc-update-change-log
- Visit the current directory's change log file and create new entries for
- versions checked in since the most recent entry in the change log file
- (@code{vc-update-change-log}).
- This command works with RCS only; it does not work with SCCS.
- @end table
- For example, suppose the first line of @file{ChangeLog} is dated 10
- April 1992, and that the only check-in since then was by Nathaniel
- Bowditch to @file{rcs2log} on 8 May 1992 with log text @samp{Ignore log
- messages that start with `#'.}. Then @kbd{C-x v a} visits
- @file{ChangeLog} and inserts text like this:
- @smallexample
- @group
- Fri May 8 21:45:00 1992 Nathaniel Bowditch (nat@@apn.org)
- * rcs2log: Ignore log messages that start with `#'.
- @end group
- @end smallexample
- @noindent
- You can then edit the new change log entry further as you wish.
- Normally, the log entry for file @file{foo} is displayed as @samp{*
- foo: @var{text of log entry}}. The @samp{:} after @file{foo} is omitted
- if the text of the log entry starts with @w{@samp{(@var{functionname}):
- }}. For example, if the log entry for @file{vc.el} is
- @samp{(vc-do-command): Check call-process status.}, then the text in
- @file{ChangeLog} looks like this:
- @smallexample
- @group
- Wed May 6 10:53:00 1992 Nathaniel Bowditch (nat@@apn.org)
- * vc.el (vc-do-command): Check call-process status.
- @end group
- @end smallexample
- When @kbd{C-x v a} adds several change log entries at once, it groups
- related log entries together if they all are checked in by the same
- author at nearly the same time. If the log entries for several such
- files all have the same text, it coalesces them into a single entry.
- For example, suppose the most recent checkins have the following log
- entries:
- @example
- @exdent For @file{vc.texinfo}:
- Fix expansion typos.
- @exdent For @file{vc.el}:
- Don't call expand-file-name.
- @exdent For @file{vc-hooks.el}:
- Don't call expand-file-name.
- @end example
- They appear like this in @file{ChangeLog}:
- @smallexample
- @group
- Wed Apr 1 08:57:59 1992 Nathaniel Bowditch (nat@@apn.org)
- * vc.texinfo: Fix expansion typos.
- * vc.el, vc-hooks.el: Don't call expand-file-name.
- @end group
- @end smallexample
- Normally, @kbd{C-x v a} separates log entries by a blank line, but you
- can mark several related log entries to be clumped together (without an
- intervening blank line) by starting the text of each related log entry
- with a label of the form @w{@samp{@{@var{clumpname}@} }}. The label
- itself is not copied to @file{ChangeLog}. For example, suppose the log
- entries are:
- @example
- @exdent For @file{vc.texinfo}:
- @{expand@} Fix expansion typos.
- @exdent For @file{vc.el}:
- @{expand@} Don't call expand-file-name.
- @exdent For @file{vc-hooks.el}:
- @{expand@} Don't call expand-file-name.
- @end example
- @noindent
- Then the text in @file{ChangeLog} looks like this:
- @smallexample
- @group
- Wed Apr 1 08:57:59 1992 Nathaniel Bowditch (nat@@apn.org)
- * vc.texinfo: Fix expansion typos.
- * vc.el, vc-hooks.el: Don't call expand-file-name.
- @end group
- @end smallexample
- A log entry whose text begins with @samp{#} is not copied to
- @file{ChangeLog}. For example, if you merely fix some misspellings in
- comments, you can log the change with an entry beginning with @samp{#}
- to avoid putting such trivia into @file{ChangeLog}.
- @node Old Versions, VC Status, Change Logs and VC, Version Control
- @subsection Examining And Comparing Old Versions
- @table @kbd
- @item C-x v ~ @var{version} @key{RET}
- Examine version @var{version} of the visited file, in a buffer of its
- own (@code{vc-version-other-window}).
- @item C-x v =
- Compare the current buffer contents with the latest checked-in version
- of the file.
- @item C-u C-x v = @var{file} @key{RET} @var{oldvers} @key{RET} @var{newvers} @key{RET}
- Compare the specified two versions of @var{file}.
- @end table
- @findex vc-version-other-window
- @kindex C-x v ~
- You can examine any version of a file by first visiting it, and then
- using @kbd{C-x v ~ @var{version} @key{RET}}
- (@code{vc-version-other-window}). This puts the text of version
- @var{version} in a file named @file{@var{filename}.~@var{version}~},
- then visits it in a separate window.
- @findex vc-diff
- @kindex C-x v =
- To compare two versions of a file, use the command @kbd{C-x v =}
- (@code{vc-diff}).
- Plain @kbd{C-x v =} compares the current buffer contents (saving them
- in the file if necessary) with the last checked-in version of the file.
- With a prefix argument, @kbd{C-x v =} reads a file name and two version
- numbers, then compares those versions of the specified file.
- If you supply a directory name instead of the name of a work file,
- this command compares the two specified versions of all registered files
- in that directory and its subdirectories. You can also specify a
- snapshot name (@pxref{Snapshots}) instead of one or both version
- numbers.
- You can specify a checked-in version by its number; you can specify
- the most recent checked-in version with an empty version number.
- This command works by running the @code{vcdiff} utility, getting the
- options from the variable @code{diff-switches}. It displays the output
- in a special buffer in another window. Unlike the @kbd{M-x diff}
- command, @kbd{C-x v =} does not try to find the changes in the old and
- new versions. This is because one or both versions normally do not
- exist as files. They exist only in the records of the master file.
- @xref{Comparing Files}, for more information about @kbd{M-x diff}.
- @node VC Status, Renaming and VC, Old Versions, Version Control
- @subsection VC Status Commands
- @kindex C-x v l
- @findex vc-print-log
- To view the detailed version control status and history of a file,
- type @kbd{C-x v l} (@code{vc-print-log}). It displays the history of
- changes to the current file, including the text of the log entries. The
- output appears in a separate window.
- @kindex C-x v d
- @findex vc-directory
- When you are working on a large program, it's often useful to find all
- the files that are currently locked, or all the files maintained in
- version control at all. You can use @kbd{C-x v d} (@code{vc-directory})
- to show all the locked files in or beneath the current directory. This
- includes all files that are locked by any user. @kbd{C-u C-x v d} lists
- all files in or beneath the current directory that are maintained with
- version control.
- The list of files is displayed as a buffer that uses an augmented
- Dired mode. The names of the users locking various files are shown (in
- parentheses) in place of the owner and group. All the normal Dired
- commands work in this buffer. Most interactive VC commands work also,
- and apply to the file name on the current line.
- The @kbd{C-x v v} command (@code{vc-next-action}), when used in the
- augmented Dired buffer, operates on all the marked files (or the file on
- the current line). If it operates on more than one file, it handles
- each file according to its current state; thus, it may check out one
- file and check in another (because it is already checked out). If it
- has to check in any files, it reads a single log entry, then uses that
- text for all the files being checked in. This can be convenient for
- registering or checking in several files at once, as part of the same
- change.
- @node Renaming and VC, Snapshots, VC Status, Version Control
- @subsection Renaming VC Work Files and Master Files
- @findex vc-rename-file
- When you rename a registered file, you must also rename its master
- file correspondingly to get proper results. Use @code{vc-rename-file}
- to rename the source file as you specify, and rename its master file
- accordingly. It also updates any snapshots (@pxref{Snapshots}) that
- mention the file, so that they use the new name; despite this, the
- snapshot thus modified may not completely work (@pxref{Snapshot
- Caveats}).
- You cannot use @code{vc-rename-file} on a file that is locked by
- someone else.
- @node Snapshots, Version Headers, Renaming and VC, Version Control
- @subsection Snapshots
- @cindex snapshots and version control
- A @dfn{snapshot} is a named set of file versions (one for each
- registered file) that you can treat as a unit. One important kind of
- snapshot is a @dfn{release}, a (theoretically) stable version of the
- system that is ready for distribution to users.
- @menu
- * Making Snapshots:: The snapshot facilities.
- * Snapshot Caveats:: Things to be careful of when using snapshots.
- @end menu
- @node Making Snapshots, Snapshot Caveats, Snapshots, Snapshots
- @subsubsection Making and Using Snapshots
- There are two basic commands for snapshots; one makes a
- snapshot with a given name, the other retrieves a named snapshot.
- @table @code
- @kindex C-x v s
- @findex vc-create-snapshot
- @item C-x v s @var{name} @key{RET}
- Define the last saved versions of every registered file in or under the
- current directory as a snapshot named @var{name}
- (@code{vc-create-snapshot}).
- @kindex C-x v r
- @findex vc-retrieve-snapshot
- @item C-x v r @var{name} @key{RET}
- Check out all registered files at or below the current directory level
- using whatever versions correspond to the snapshot @var{name}
- (@code{vc-retrieve-snapshot}).
- This command reports an error if any files are locked at or below the
- current directory, without changing anything; this is to avoid
- overwriting work in progress.
- @end table
- A snapshot uses a very small amount of resources---just enough to record
- the list of file names and which version belongs to the snapshot. Thus,
- you need not hesitate to create snapshots whenever they are useful.
- You can give a snapshot name as an argument to @kbd{C-x v =} or
- @kbd{C-x v ~} (@pxref{Old Versions}). Thus, you can use it to compare a
- snapshot against the current files, or two snapshots against each other,
- or a snapshot against a named version.
- @node Snapshot Caveats, , Making Snapshots, Snapshots
- @subsubsection Snapshot Caveats
- @cindex named configurations (RCS)
- VC's snapshot facilities are modeled on RCS's named-configuration
- support. They use RCS's native facilities for this, so under VC
- snapshots made using RCS are visible even when you bypass VC.
- @c worded verbosely to avoid overfull hbox.
- For SCCS, VC implements snapshots itself. The files it uses contain
- name/file/version-number triples. These snapshots are visible only
- through VC.
- A snapshot is a set of checked-in versions. So make sure that all the
- files are checked in and not locked when you make a snapshot.
- File renaming and deletion can create some difficulties with snapshots.
- This is not a VC-specific problem, but a general design issue in version
- control systems that no one has solved very well yet.
- If you rename a registered file, you need to rename its master along
- with it (the command @code{vc-rename-file} does this automatically). If
- you are using SCCS, you must also update the records of the snapshot, to
- mention the file by its new name (@code{vc-rename-file} does this,
- too). An old snapshot that refers to a master file that no longer
- exists under the recorded name is invalid; VC can no longer retrieve
- it. It would be beyond the scope of this manual to explain enough about
- RCS and SCCS to explain how to update the snapshots by hand.
- Using @code{vc-rename-file} makes the snapshot remain valid for
- retrieval, but it does not solve all problems. For example, some of the
- files in the program probably refer to others by name. At the very
- least, the makefile probably mentions the file that you renamed. If you
- retrieve an old snapshot, the renamed file is retrieved under its new
- name, which is not the name that the makefile expects. So the program
- won't really work as retrieved.
- @node Version Headers, , Snapshots, Version Control
- @subsection Inserting Version Control Headers
- Sometimes it is convenient to put version identification strings
- directly into working files. Certain special strings called
- @dfn{version headers} are replaced in each successive version by the
- number of that version.
- @kindex C-x v h
- @findex vc-insert-headers
- You can use the @kbd{C-x v h} command (@code{vc-insert-headers}) to
- insert a suitable header string.
- @table @kbd
- @item C-x v h
- Insert headers in a file for use with your version-control system.
- @end table
- @vindex vc-header-alist
- The default header string is @samp{\$Id\$} for RCS and @samp{\%W\%}
- for SCCS. (The actual strings inserted do not have the backslashes
- in them. They were placed in the Info source file so that the
- strings don't get interpreted as version-control headers when the
- Info source files are maintained under version control.) You can
- specify other headers to insert by setting the variable
- @code{vc-header-alist}. Its value is a list of elements of the form
- @code{(@var{program} . @var{string})} where @var{program} is @code{RCS}
- or @code{SCCS} and @var{string} is the string to use.
- Instead of a single string, you can specify a list of strings; then
- each string in the list is inserted as a separate header on a line of
- its own.
- It is often necessary to use ``superfluous'' backslashes when writing
- the strings that you put in this variable. This is to prevent the
- string in the constant from being interpreted as a header itself if the
- Emacs Lisp file containing it is maintained with version control.
- @vindex vc-comment-alist
- Each header is inserted surrounded by tabs, inside comment delimiters,
- on a new line at the start of the buffer. Normally the ordinary comment
- start and comment end strings of the current mode are used, but for
- certain modes, there are special comment delimiters for this purpose;
- the variable @code{vc-comment-alist} specifies them. Each element of
- this list has the form @code{(@var{mode} @var{starter} @var{ender})}.
- @vindex vc-static-header-alist
- The variable @code{vc-static-header-alist} specifies further strings
- to add based on the name of the buffer. Its value should be a list of
- elements of the form @code{(@var{regexp} . @var{format})}. Whenever
- @var{regexp} matches the buffer name, @var{format} is inserted as part
- of the header. A header line is inserted for each element that matches
- the buffer name, and for each string specified by
- @code{vc-header-alist}. The header line is made by processing the
- string from @code{vc-header-alist} with the format taken from the
- element. The default value for @code{vc-static-header-alist} is:
- @example
- @group
- (("\\.c$" .
- "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n\
- #endif /* lint */\n"))
- @end group
- @end example
- @noindent
- which specifies insertion of a string of this form:
- @example
- @group
- #ifndef lint
- static char vcid[] = "@var{string}";
- #endif /* lint */
- @end group
- @end example
- @node ListDir, Comparing Files, Version Control, Files
- @section Listing a File Directory
- @cindex file directory
- @cindex directory listing
- Files are organized by Unix into @dfn{directories}. A @dfn{directory
- listing} is a list of all the files in a directory. Emacs provides
- directory listings in brief format (file names only) and verbose format
- (sizes, dates, and authors included).
- @table @kbd
- @item C-x C-d @var{dir-or-pattern}
- Print a brief directory listing (@code{list-directory}).
- @item C-u C-x C-d @var{dir-or-pattern}
- Print a verbose directory listing.
- @end table
- @findex list-directory
- @kindex C-x C-d
- To print a directory listing, use @kbd{C-x C-d}
- (@code{list-directory}). This command prompts in the minibuffer for a
- file name which is either a directory to be listed or pattern
- containing wildcards for the files to be listed. For example,
- @example
- C-x C-d /u2/emacs/etc @key{RET}
- @end example
- @noindent
- lists all the files in directory @file{/u2/emacs/etc}. An example of
- specifying a file name pattern is:
- @example
- C-x C-d /u2/emacs/src/*.c @key{RET}
- @end example
- Normally, @kbd{C-x C-d} prints a brief directory listing containing just
- file names. A numeric argument (regardless of value) tells it to print a
- verbose listing (like @code{ls -l}).
- @vindex list-directory-brief-switches
- @vindex list-directory-verbose-switches
- Emacs obtains the text of a directory listing by running @code{ls} in
- an inferior process. Two Emacs variables control the switches passed to
- @code{ls}: @code{list-directory-brief-switches} is a string giving the
- switches to use in brief listings (@code{"-CF"} by default).
- @code{list-directory-verbose-switches} is a string giving the switches
- to use in a verbose listing (@code{"-l"} by default).
- The variable @code{directory-abbrev-alist} is an alist of abbreviations
- for file directories. The list consists of elements of the form
- @code{(FROM . TO)}, each meaning to replace @code{FROM} with @code{TO}
- when it appears in a directory name. This replacement is done when
- setting up the default directory of a newly visited file. Every @code{FROM}
- string should start with `@samp{^}'.
- Use this feature when you have directories which you normally refer to
- via absolute symbolic links. Make @code{TO} the name of the link, and
- @code{FROM} the name it is linked to.
- @node Comparing Files, Dired, ListDir, Files
- @section Comparing Files
- @cindex comparing files
- @findex diff
- @vindex diff-switches
- The command @kbd{M-x diff} compares two files, displaying the
- differences in an Emacs buffer named @samp{*Diff*}. It works by running
- the @code{diff} program, using options taken from the variable
- @code{diff-switches}, whose value should be a string.
- The buffer @samp{*Diff*} has Compilation mode as its major mode, so
- you can use @kbd{C-x `} to visit successive changed locations in the two
- source files. You can also move to a particular hunk of changes and
- type @kbd{C-c C-c} to find the corresponding source location. You can
- also use the other special commands of Compilation mode: @key{SPC} and
- @key{DEL} for scrolling, and @kbd{M-p} and @kbd{M-n} for cursor motion.
- @xref{Compilation}.
- @findex diff-backup
- The command @kbd{M-x diff-backup} compares a specified file with its most
- recent backup. If you specify the name of a backup file,
- @code{diff-backup} compares it with the source file that it is a backup
- of.
- @findex compare-windows
- @cindex comparing files
- The command @kbd{M-x compare-windows} compares the text in the current
- window with that in the next window. Comparison starts at point in each
- window. Point moves forward in each window, a character at a time in each
- window, until the next characters in the two windows are different. Then
- the command is finished. For more information about windows in Emacs,
- @ref{Windows}.
- @vindex compare-ignore-case
- With a numeric argument, @code{compare-windows} ignores changes in
- whitespace. If the variable @code{compare-ignore-case} is
- non-@code{nil}, it ignores differences in case as well.
- @node Dired, Misc File Ops, Comparing Files, Files
- @section Dired, the Directory Editor
- @cindex Dired
- @cindex deletion (of files)
- Dired makes it easy to delete or visit many of the files in a single
- directory at once. It creates an Emacs buffer containing a listing of the
- directory. You can use the normal Emacs commands to move around in this
- buffer and special Dired commands to operate on the files.
- @menu
- * Enter: Dired Enter. How to invoke Dired.
- * Edit: Dired Edit. Editing the Dired buffer.
- * Deletion: Dired Deletion. Deleting files with Dired.
- * Immed: Dired Immed. Other file operations through Dired.
- @end menu
- @node Dired Enter, Dired Edit, Dired, Dired
- @subsection Entering Dired
- @findex dired
- @kindex C-x d
- @vindex dired-listing-switches
- To invoke dired, type @kbd{C-x d} or @kbd{M-x dired}. The command reads a
- directory name or wildcard file name pattern as a minibuffer argument just
- like the @code{list-directory} command, @kbd{C-x C-d}. Where @code{dired}
- differs from @code{list-directory} is in naming the buffer after the
- directory name or the wildcard pattern used for the listing, and putting
- the buffer into Dired mode so that the special commands of Dired are
- available in it. The variable @code{dired-listing-switches} is a string
- used as an argument to @code{ls} in making the directory; this string
- @i{must} contain @samp{-l}.
- @findex dired-other-window
- @kindex C-x 4 d
- To display the Dired buffer in another window rather than in the selected
- window, use @kbd{C-x 4 d} (@code{dired-other-window)} instead of @kbd{C-x d}.
- @node Dired Edit, Dired Deletion, Dired Enter, Dired
- @subsection Editing in Dired
- Once the Dired buffer exists, you can switch freely between it and other
- Emacs buffers. Whenever the Dired buffer is selected, certain special
- commands are provided that operate on files that are listed. The Dired
- buffer is ``read-only'', and inserting text in it is not useful, so
- ordinary printing characters such as @kbd{d} and @kbd{x} are used for Dired
- commands. Most Dired commands operate on the file described by the line
- that point is on. Some commands perform operations immediately; others
- ``flag'' a file to be operated on later.
- Most Dired commands that operate on the current line's file also treat a
- numeric argument as a repeat count, meaning to act on the files of the
- next few lines. A negative argument means to operate on the files of the
- preceding lines, and leave point on the first of those lines.
- All the usual Emacs cursor motion commands are available in Dired
- buffers. Some special purpose commands are also provided. The keys
- @kbd{C-n} and @kbd{C-p} are redefined so that they try to position
- the cursor at the beginning of the filename on the line, rather than
- at the beginning of the line.
- For extra convenience, @key{SPC} and @kbd{n} in Dired are equivalent to
- @kbd{C-n}. @kbd{p} is equivalent to @kbd{C-p}. Moving by lines is done so
- often in Dired that it deserves to be easy to type. @key{DEL} (move up and
- unflag) is often useful simply for moving up.@refill
- The @kbd{g} command in Dired runs @code{revert-buffer} to reinitialize
- the buffer from the actual disk directory and show any changes made in the
- directory by programs other than Dired. All deletion flags in the Dired
- buffer are lost when this is done.
- @node Dired Deletion, Dired Immed, Dired Edit, Dired
- @subsection Deleting Files With Dired
- The primary use of Dired is to flag files for deletion and then delete
- them.
- @table @kbd
- @item d
- Flag this file for deletion.
- @item u
- Remove deletion-flag on this line.
- @item @key{DEL}
- Remove deletion-flag on previous line, moving point to that line.
- @item x
- Delete the files that are flagged for deletion.
- @item #
- Flag all auto-save files (files whose names start and end with @samp{#})
- for deletion (@pxref{Auto Save}).
- @item ~
- Flag all backup files (files whose names end with @samp{~}) for deletion
- (@pxref{Backup}).
- @item .@: @r{(Period)}
- Flag excess numeric backup files for deletion. The oldest and newest
- few backup files of any one file are exempt; the middle ones are flagged.
- @end table
- You can flag a file for deletion by moving to the line describing the
- file and typing @kbd{d} or @kbd{C-d}. The deletion flag is visible as a
- @samp{D} at the beginning of the line. Point is moved to the beginning of
- the next line, so that repeated @kbd{d} commands flag successive files.
- The files are flagged for deletion rather than deleted immediately to
- avoid the danger of deleting a file accidentally. Until you direct Dired
- to delete the flagged files, you can remove deletion flags using the
- commands @kbd{u} and @key{DEL}. @kbd{u} works just like @kbd{d}, but
- removes flags rather than making flags. @key{DEL} moves upward, removing
- flags; it is like @kbd{u} with numeric argument automatically negated.
- To delete the flagged files, type @kbd{x}. This command first displays a
- list of all the file names flagged for deletion, and requests confirmation
- with @kbd{yes}. Once you confirm, all the flagged files are deleted, and their
- lines are deleted from the text of the Dired buffer. The shortened Dired
- buffer remains selected. If you answer @kbd{no} or quit with @kbd{C-g}, you
- return immediately to Dired, with the deletion flags still present and no
- files actually deleted.
- The @kbd{#}, @kbd{~}, and @kbd{.} commands flag many files for
- deletion, based on their names. These commands are useful precisely
- because they do not actually delete any files; you can remove the
- deletion flags from any flagged files that you really wish to keep.@refill
- @kbd{#} flags for deletion all files that appear to have been made by
- auto-saving (that is, files whose names begin and end with @samp{#}).
- @kbd{~} flags for deletion all files that appear to have been made as
- backups for files that were edited (that is, files whose names end with
- @samp{~}).
- @vindex dired-kept-versions
- @kbd{.} (Period) flags just some of the backup files for deletion: only
- numeric backups that are not among the oldest few nor the newest few
- backups of any one file. Normally @code{dired-kept-versions} (not
- @code{kept-new-versions}; that applies only when saving) specifies the
- number of newest versions of each file to keep, and
- @code{kept-old-versions} specifies the number of oldest versions to keep.
- Period with a positive numeric argument, as in @kbd{C-u 3 .}, specifies the
- number of newest versions to keep, overriding @code{dired-kept-versions}.
- A negative numeric argument overrides @code{kept-old-versions}, using minus
- the value of the argument to specify the number of oldest versions of each
- file to keep.@refill
- @node Dired Immed, , Dired Deletion, Dired
- @subsection Immediate File Operations in Dired
- Some file operations in Dired take place immediately when they are
- requested.
- @table @kbd
- @item C
- Copies the file described on the current line. You must supply a file name
- to copy to, using the minibuffer.
- @item f
- Visits the file described on the current line. It is just like typing
- @kbd{C-x C-f} and supplying that file name. If the file on this line is a
- subdirectory, @kbd{f} actually causes Dired to be invoked on that
- subdirectory. @xref{Visiting}.
- @item o
- Like @kbd{f}, but uses another window to display the file's buffer. The
- Dired buffer remains visible in the first window. This is like using
- @kbd{C-x 4 C-f} to visit the file. @xref{Windows}.
- @item R
- Renames the file described on the current line. You must supply a file
- name to rename to, using the minibuffer.
- @item v
- Views the file described on this line using @kbd{M-x view-file}. Viewing a
- file is like visiting it, but is slanted toward moving around in the file
- conveniently and does not allow changing the file. @xref{Misc File
- Ops,View File}. Viewing a file that is a directory runs Dired on that
- directory.@refill
- @end table
- @node Misc File Ops, , Dired, Files
- @section Miscellaneous File Operations
- Emacs has commands for performing many other operations on files.
- All operate on one file; they do not accept wildcard file names.
- @findex add-name-to-file
- You can use the command @kbd{M-x add-name-to-file} to add a name to an
- existing file without removing the old name. The new name must belong
- on the file system that the file is on.
- @findex append-to-file
- @kbd{M-x append-to-file} adds the text of the region to the end of the
- specified file.
- @findex copy-file
- @cindex copying files
- @kbd{M-x copy-file} reads the file @var{old} and writes a new file
- named @var{new} with the same contents. Confirmation is required if a
- file named @var{new} already exists, because copying overwrites the old
- contents of the file @var{new}.
- @findex delete-file
- @cindex deletion (of files)
- @kbd{M-x delete-file} deletes a specified file, like the @code{rm}
- command in the shell. If you are deleting many files in one directory, it
- may be more convenient to use Dired (@pxref{Dired}).
- @findex insert-file
- @kbd{M-x insert-file} inserts a copy of the contents of a specified
- file into the current buffer at point, leaving point unchanged before the
- contents and the mark after them. @xref{Mark}.
- @findex make-symbolic-link
- @kbd{M-x make-symbolic-link} reads two file names @var{old} and
- @var{linkname}, and then creates a symbolic link named @var{linkname}
- and pointing at @var{old}. Future attempts to open file
- @var{linkname} will then refer to the file named @var{old} at the time
- the opening is done, or will result in an error if the name @var{old} is
- not in use at that time. Confirmation is required if you create the
- link while @var{linkname} is in use. Note that not all systems support
- symbolic links.
- @findex rename-file
- @kbd{M-x rename-file} reads two file names @var{old} and @var{new} using
- the minibuffer, then renames file @var{old} as @var{new}. If a file named
- @var{new} already exists, you must confirm with @kbd{yes} or renaming is not
- done; this is because renaming causes the previous meaning of the
- name @var{new} to be lost. If @var{old} and @var{new} are on different
- file systems, the file @var{old} is copied and deleted.
- @findex view-file
- @cindex viewing
- @kbd{M-x view-file} allows you to scan or read a file by sequential
- screenfuls. It reads a file name argument using the minibuffer. After
- reading the file into an Emacs buffer, @code{view-file} reads and displays
- one windowful. You can then type @key{SPC} to scroll forward one window,
- or @key{DEL} to scroll backward. Various other commands are provided for
- moving around in the file, but none for changing it; type @kbd{C-h} while
- viewing a file for a list of them. Most commands are the default Emacs
- cursor motion commands. To exit from viewing, type @kbd{C-c}.
|