Mercurial > hg > xemacs-beta
diff man/dired.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/dired.texi Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,3334 @@ +\input texinfo @c -*-texinfo-*- + +@comment !Date: 1993/12/21 22:31:56 ! !Revision: 1.1 ! + +@comment %**start of header (This is for running Texinfo on a region.) +@setfilename ../info/dired.info +@settitle Tree Dired Version 6 +@c @setchapternewpage odd +@comment %**end of header (This is for running Texinfo on a region.) + +@iftex +@finalout +@end iftex + +@ifinfo +This file documents Tree Dired, the GNU Emacs Directory Browser, and +most of the extra features available as an option. + +Copyright (C) 1991, 1992 Free Software Foundation + +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. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries copying permission notice +identical to this one except for the removal of this paragraph (this +paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +section entitled ``GNU General Public License'' is included exactly as +in the original, and provided that the entire resulting derived work is +distributed under the terms of a permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that the section entitled ``GNU General Public License'' may be +included in a translation approved by the author instead of in the +original English. +@end ifinfo + +@titlepage +@sp 6 +@center @titlefont{Tree Dired} +@sp 2 +@center @titlefont{The GNU Emacs} +@sp 1 +@center @titlefont{Directory Editor} +@sp 4 +@c @@center !Date: 1993/12/21 22:31:56 ! +@sp 1 +@c @@center !Revision: 1.1 ! +@sp 5 +@center Sebastian Kremer +@center sk@@thp.uni-koeln.de + +@page + +@noindent +!Date: 1993/12/21 22:31:56 ! + +@noindent +!Revision: 1.1 ! + +@vskip 0pt plus 1filll +Copyright @copyright{} 1991, 1992 Free Software Foundation + +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. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries copying permission notice +identical to this one except for the removal of this paragraph (this +paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +section entitled ``GNU General Public License'' is included exactly as +in the original, and provided that the entire resulting derived work is +distributed under the terms of a permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that the section entitled ``GNU General Public License'' may be +included in a translation approved by the author instead of in the +original English. +@end titlepage + +@ifinfo + +@node Top, Dired, (dir), (dir) + +This file documents Tree Dired (version 6), the GNU Emacs Directory +Editor, including the optional ``Dired Extra'' features. + +Tree Dired is an enhanced version of the Classic (18.xx Emacs) Dired and +will be the Dired of Emacs 19. It is known to work with Emacs 18.55 and +18.57 (and probably most earlier versions). +@c and also with prerelease versions of Emacs 19, but I don't write that +@c since I don't want to be bombarded with questions like `when it will +@c be ready'... + +@noindent +Revision of this manual: + +@noindent +!Id: dired.texinfo,v 1.1 1993/12/21 22:31:56 jwz Exp ! + +@noindent +Report bugs to: +@example +Sebastian Kremer <sk@@thp.uni-koeln.de> +@end example + +@menu +* Dired:: Dired, the Directory Editor +* Tree Dired Extra:: Tree Dired Extra features +* Dired Internals:: Dired Internals +* Dired Known Problems:: Known Problems with Dired + + --- Indices --- + +* Dired Variable Index:: +* Dired Function Index:: +* Dired Key Index:: +* Dired Concept Index:: + + --- The Detailed Node Listing --- + +Dired, the Directory Editor + +* Entering Dired:: +* Editing in Dired:: +* Listing Files in Dired:: +* Marking Files in Dired:: +* Mark-using Commands:: +* Commands That Do Not Use Marks:: +* Subdirectories in Dired:: +* Hiding Directories in Dired:: +* Acknowledgement:: +* Dired Customization:: + +Mark-using Commands + +* Copy and Move Into a Directory:: +* Renaming and More With Regexps:: +* Other File Creating Commands:: +* Deleting Files With Dired:: +* Dired Shell Commands:: +* Compressing and Uncompressing:: +* Changing File Attributes:: +* Loading and Byte-compiling Emacs Lisp Files:: +* Printing the Marked Files:: + +Dired Customization + +* Dired User Options:: +* Dired Configuration:: +* Dired Hooks:: + +Tree Dired Extra features + +* Tree Dired Extra Features:: +* Dired Minibuffer History:: +* Inserting All Marked Subdirectories:: +* Dynamic Dired Markers:: +* Omitting Files in Dired:: +* Advanced Dired Mark Commands:: +* Virtual Dired:: +* Multiple Dired Directories:: +* Dired Local Variables:: +* Making Relative Symbolic Links in Dired:: +* Letting Dired Guess What Shell Command to Apply:: +* dired-trns.el:: Filename Transformers for Dired Shell Commands +* dired-cd.el:: Changing the Working Directory for Dired Shell Commands +* dired-nstd.el:: Nested Dired format +* find-dired.el:: Feeding Find Output to Dired + +Dired Internals + +* Tree Dired Internals:: +* Dired Mark Internals:: +@end menu + +@end ifinfo + +@node Dired, Tree Dired Extra, Top, Top +@chapter 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 (and possibly its subdirectories) at once. It makes an Emacs +buffer containing a listing of the directories, in the format of +@code{ls -lR}. You can use the normal Emacs commands to move around in +this buffer, and special Dired commands to operate on the files. You +can run shell commands on files, visit, compress, load or byte-compile +them, change their file attributes and insert subdirectories into the +same buffer. You can ``mark'' files for later commands or ``flag'' them +for deletion, either file by file or all files matching certain +criteria. + +@menu +* Entering Dired:: +* Editing in Dired:: +* Listing Files in Dired:: +* Marking Files in Dired:: +* Mark-using Commands:: +* Commands That Do Not Use Marks:: +* Subdirectories in Dired:: +* Hiding Directories in Dired:: +* Acknowledgement:: +* Dired Customization:: +@end menu + +@node Entering Dired, Editing in Dired, Dired, Dired +@section Entering Dired + +@findex Dired +@kindex C-x d +@vindex dired-listing-switches +@noindent +To invoke Dired, do @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}. Invoking +Dired with a prefix argument lets you enter the listing switches for the +directory. + +Dired assumes you meant to use a wildcard if the last component of the +name is not an existing file. Note that only the last pathname +component may contain wildcards. With wildcards it uses the shell to do +the filename globbing, whereas usually it calls @samp{ls} directly. +Because of this, you might have to quote characters that are special to +the shell. For example, to dired all auto-save files in your +@file{~/mail/} directory, use @samp{~/mail/\#*} as argument to Dired. +Note the backslash needed to quote @samp{#} (at the beginning of a word) +to the shell. + +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}. Most other switches are also allowed, especially @samp{-F}, +@samp{-i} and @samp{-s}. For the @samp{-F} switch to work you may have +to set the variable @code{dired-ls-F-marks-symlinks}, depending on what +kind of @samp{ls} program you are using. +@xref{Dired Configuration}. +@refill + +When a Dired buffer for the given directory already exists, it is simply +selected without refreshing it. You can type @kbd{g} if you suspect it +is out of date. + +@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}.@refill + +@node Editing in Dired, Listing Files in Dired, Entering Dired, Dired +@section Editing in Dired + +@noindent +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, and digits are prefix arguments.@refill + +@cindex Current file (in Dired) +The file described by the line that point is on is called the +@dfn{current file}. The directory this file is in is the @dfn{current +Dired directory}. Note that there may be several directories in one +Dired buffer as long as they belong to the same tree. The top level +directory, the @dfn{root} of the tree, is used as the working directory +of the buffer.@refill + +Some or all directories can be @dfn{hidden}, leaving only their +headerlines visible, and exlcuding their files from Dired operations. + +@cindex Marking files (in Dired) +Files can be @dfn{marked} for later commands. Marking means putting a +special character, usually @samp{*}, in the first column of the file +line. To @dfn{flag} a file means to mark it for later deletion. This +special case of ``marking'' is distinguished so that you do not delete +files accidentally. Internally, the only difference between marking and +flagging is the character used to mark the file: @samp{*} (an asterisk) +for a marked file, and @samp{D} for files flagged for deletion. + +@cindex Mark-using commands +Most Dired commands operate on the ``marked'' files and default to the +current file. They are the @dfn{mark-using} commands. Deleting is the +only mark-using command that does not default to the current file. + +Dired buffers ``know'' about each other. For example, copying from +@var{dir1} into @var{dir2} will update @var{dir2}'s Dired buffer(s). +When you move files or directories, file and dired buffers are kept up +to date and refer to the new location. But Dired only knows about files +changed by itself, not by other parts of Emacs or programs outside +Emacs. + +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 also +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 + +@node Listing Files in Dired, Marking Files in Dired, Editing in Dired, Dired +@section Listing Files in Dired + +@cindex Headerline +@cindex Non-file line +@cindex File line +@noindent +Initially the Dired buffer shows the directory you selected. The first +line shows the full directory name. It is an example of a +@dfn{headerline} of a directory. Note that it is terminated by a colon +(@samp{:}) that is not part of the directory name. The second line +usually displays the total size of all files in the directory or +the wildcard used. Both are examples of @dfn{non-file lines}. +Applying a command to a non-file line signals an error. The other lines +of the directory, called the @dfn{file lines}, show information about +each file such as permission bits, size and date of last modification, +and the name of the file.@refill + +For example, the listing + +@example + /home/sk/lib/emacs/lisp: + total 4973 + -rw-r--r-- 1 sk users 231608 Feb 6 16:58 ChangeLog + drwxr-sr-x 2 sk users 2048 Feb 6 11:07 RCS + -r--r--r-- 1 sk users 141389 Feb 6 10:45 dired.el + -r--r--r-- 1 sk users 113033 Feb 5 16:21 dired.texi + @dots{} + + /home/sk/lib/emacs/lisp/RCS: + total 4798 + -r--r--r-- 1 sk users 231748 Feb 6 16:59 dired.texi,v + -r--r--r-- 1 sk users 763898 Feb 6 10:45 dired.el,v + @dots{} +@end example + +has a headerline for the @file{lisp} directory, a total line saying +there are 4973 K in all the files of that directory (your @samp{ls} +program may use units of blocks instead), and several file lines. After +that, a headerline for the @file{RCS} subdirectory with its total line +and its files follows. + +Here is an example of a wildcard listing: + +@example + /home/sk/lib/emacs/lisp: + wildcard dired* + -rw-r--r-- 1 sk users 113036 Feb 6 16:59 dired.texi + -r--r--r-- 1 sk users 81267 Feb 6 16:29 dired.elc + -r--r--r-- 1 sk users 38436 Feb 6 16:28 dired-x.elc + -r--r--r-- 1 sk users 60258 Feb 6 16:27 dired-x.el + -r--r--r-- 1 sk users 141389 Feb 6 10:45 dired.el + @dots{} +@end example + +Since @samp{ls} does not provide a total count when called with a wildcard +argument, the second line now gives instead the wildcard used, here +@samp{dired*}. If there would have been a directory matching the +wildcard, e.g. a @samp{dired/} subdirectory, its file line would be +shown, but it would not have been expanded automatically. + +Filenames may have embedded and trailing (but not leading) spaces. +Leading spaces are not recognized because different @samp{ls} programs +differ in the amount of whitespace the insert before the filename. +Filenames may @emph{not} contain newlines or @samp{^M}'s. You can get +away with @samp{^M}'s in filenames if you do + +@example + (setq selective-display nil) +@end example + +@noindent +in the Dired buffer (inside @code{dired-mode-hook}, @xref{Dired +Hooks}.). But this also disables the @kbd{=} and @kbd{$} hiding +commands, @xref{Hiding Directories in Dired}.@refill + +Other unprintable characters than @samp{^M} or newline (@samp{^J}) in +filenames are no problem for Dired. But your @samp{ls} program may not +output them correctly (e.g., replacing all unprintable characters with a +question mark @samp{?}). Dired can do nothing if @samp{ls} suppresses +information about the filenames. But some (System V derived) @samp{ls} +programs have a @samp{-b} switch to quote control characters, e.g. +@samp{\n} for a newline character, or @samp{\007} for a ASCII bell +character (@kbd{C-g}), so you might want to add @samp{b} to your +switches (see below). Dired translates the quoted control character +escapes when a @samp{-b} switch was used. The @samp{-b} switch is the +recommended method to cope with funny filenames containing newlines or +leading spaces. But check if your @samp{ls} understands @samp{-b} and really +quotes newlines and spaces. Dired is known to work with GNU @samp{ls +-b}, but other @samp{ls -b} don't quote spaces, so leading spaces still +don't work with these @samp{ls} programs. +@refill + +The appearance of the listing is determined by the listing switches +used, for example whether you display or suppress @samp{.} files with +the @samp{-a} and @samp{-A} switches, use the @samp{-F} switch to tag +filenames etc. It may additionally be restricted to certain files if you +used wildcards to display only those files matching a shell file +wildcard.@refill + +@cindex Dired listing switches +Dired has commands that change the listing switches for this buffer. +They are mainly used to set the sort mode, but can also be used to +change other formatting options. The buffer is automatically refreshed +after the switches are changed to let the new format take effect. + +The default value for the switches comes from the variable +@code{dired-listing-switches}; a prefix argument to @code{dired} can be +use to determine the switches used for a specific buffer. +@xref{Entering Dired}. Each Dired buffer has its own value for the +switches, stored in the variable @code{dired-actual-switches}.@refill +@vindex dired-actual-switches + +@vindex dired-sort-by-name-regexp +@vindex dired-sort-by-date-regexp +The Dired modeline displays @samp{by name} or @samp{by date} to indicate +the sort mode. It uses the regexps in the variables +@code{dired-sort-by-date-regexp} and @code{dired-sort-by-name-regexp} to +decide what should be displayed. If neither of the regexps matches, the +listing switches are displayed literally. You can use this to always +display the literal switches instead of @samp{by name} or @samp{by +date}: set them to a regexp that never matches any listing switches, for +example @samp{^$}.@refill + +@vindex dired-ls-sorting-switches +Most @samp{ls} programs can only sort by name (without @samp{-t}) or by +date (with @samp{-t}), nothing else. GNU @samp{ls} additionally sorts +on size with @samp{-S}, on extension with @samp{-X}, and unsorted (in +directory order) with @samp{-U}. So anything that does not contain +these is sort "by name". However, this is configurable in the variable +@code{dired-ls-sorting-switches}, which defaults to @code{"SXU"}. It +contains a string of @samp{ls} switches (single letters) except @samp{t} that +influence sorting. It is consulted at load time, so if you redefine it, +you must do it before Dired is loaded.@refill + +@table @kbd + +@item s +@kindex s +@findex dired-sort-toggle-or-edit +(@code{dired-sort-toggle-or-edit}) Toggle between sort by name/date and +refresh the dired buffer. With a prefix argument you can edit the +current listing switches instead. + +@end table + +@cindex Refreshing a Dired listing +After some time the listing may become out of date because of actions by +other programs than Dired. You can refresh the complete Dired buffer +from disk or only refresh the lines of certain files or a single file. + +@table @kbd + +@item l +@kindex l +@findex dired-do-redisplay +(@code{dired-do-redisplay}) Redisplay all marked (or, with a prefix +argument, the next @var{N}) files. As always, if no files are marked, +the current file is used. + +If on a headerline, redisplay that subdirectory. In that case, +a prefix arg lets you edit the @samp{ls} switches used for the new listing. + + +@kindex g +@findex revert-buffer +@item g +(@code{revert-buffer}) The @kbd{g} command in Dired ultimately runs +@code{dired-revert} to reinitialize the buffer from the actual disk +directory (or directories). All marks and flags in the Dired buffer are +restored, except of course for files that have vanished. Hidden +subdirectories are hidden again. @xref{Hiding Directories in Dired}. +@refill + +@item k +@kindex k +@findex dired-kill-line-or-subdir +(@code{dired-kill-line-or-subdir}) Kill this line (but not this file). +Optional prefix argument is a repeat factor. +If file is displayed as expanded subdirectory, kill that as well. + +If on a subdirectory line, kill that subdirectory. Reinsert it with +@kbd{i} (@code{dired-maybe-insert-subdir}), @xref{Subdirectories in +Dired}. + +Killing a file line means that the line is removed from the Dired +buffer. The file is not touched, and the line will reappear when the +buffer is refreshed (using @kbd{g}, @code{revert-buffer}). A killed +subdirectory will not reappear after reverting the buffer, since @kbd{g} +only list those subdirectories that were listed before. + +@item M-k +@kindex M-k +@findex dired-do-kill +(@code{dired-do-kill}) Kill all marked lines (not files). With a prefix +argument, kill all lines not marked or flagged. + +(For file marking, @xref{Marking Files in Dired}.) + +@item C-x u +@kindex C-x u +@item C-_ +@kindex C-_ +@findex dired-undo +(@code{dired-undo}) Undo in a Dired buffer. This doesn't recover lost +files, it is just normal undo with a temporarily writable buffer. You +can use it to recover marks, killed lines or subdirs. In the latter +case, you have to do @kbd{M-x dired-build-subdir-alist} to parse the +buffer again for the new subdirectory list.@refill + +@end table + + +@node Marking Files in Dired, Mark-using Commands, Listing Files in Dired, Dired +@section Marking Files in Dired + +@noindent +This section describes commands to mark and unmark single files, and +commands to mark several files at once if they match certain criteria. +There also is a command to move to the next marked file. + +As always, hidden subdirs are not affected. @xref{Hiding Directories in +Dired}. + +@table @kbd + +@item m +@kindex m +@findex dired-mark-subdir-or-file +(@code{dired-mark-subdir-or-file}) If on a file line, mark the current +file. A numeric argument tells how many next or previous files to mark. +If on a subdirectory header line, mark all its files except `.' and `..'. + +@item u +@kindex u +@findex dired-unmark-subdir-or-file +(@code{dired-unmark-subdir-or-file}) Like @kbd{m}, only unmarking +instead of marking. + +@item DEL +@kindex DEL +@findex dired-backup-unflag +(@code{dired-backup-unflag}) Move up lines and remove flags there. +Optional prefix argument says how many lines to unflag; default is one +line. + +@item M-DEL +@kindex M-DEL +@findex dired-unflag-all-files +(@code{dired-unflag-all-files}) Remove a specific or all flags from +every file. With an argument, queries for each marked file. Type your +help character, usually +@kbd{C-h}, at that time for help. + +@item * +@kindex * +@findex dired-mark-executables +(@code{dired-mark-executables}) Mark all executable files. With prefix +argument, unflag all those files. + +@item @@ +@kindex @@ +@findex dired-mark-symlinks +(@code{dired-mark-symlinks}) Mark all symbolic links. With prefix +argument, unflag all those files. + +@item / +@kindex / +@findex dired-mark-directories +(@code{dired-mark-directories}) Mark all directory files except `.' and +`..'. With prefix argument, unflag all those files. + +@item %m +@kindex %m +@findex dired-mark-files-regexp +(@code{dired-mark-files-regexp}) Mark all files matching @var{regexp} +for use in later commands. A prefix argument means to unmark them +instead. @file{.} and @file{..} are never marked. + +The match is against the non-directory part of the filename. Use +@samp{^} and @samp{$} to anchor matches. Exclude subdirs by hiding +them. + +This is an Emacs regexp, not a shell wildcard. E.g., use @samp{\.o$} +for object files - just @samp{.o} will mark more than you might think. +By default, the match is case sensitive (just like filenames), since +@code{case-fold-search} is set to @code{nil} in Dired buffers. + +@item M-@} +@kindex M-@} +@findex dired-next-marked-file +(@code{dired-next-marked-file}) Move to the next marked file, wrapping +around the end of the buffer. + +@item M-@{ +@kindex M-@{ +@findex dired-prev-marked-file +(@code{dired-prev-marked-file}) Move to the previous marked file, +wrapping around the beginning of the buffer. + +@end table + +@node Mark-using Commands, Commands That Do Not Use Marks, Marking Files in Dired, Dired +@section Mark-using Commands + +@cindex Mark-using commands +Most Dired commands operate on the ``marked'' files and default to the +current file. They are the ``mark-using'' commands. Deleting is the +only mark-using command that does not default to the current file. + +@cindex Numeric argument to Dired's mark-using commands +@cindex Prefix argument to Dired's mark-using commands +@cindex Repeat count for Dired's mark-using commands +@cindex Mark-using commands, use of prefix argument as repeat count +Mark-using Dired commands treat a numeric argument as a repeat count, +meaning to act on the files of the next few lines instead of on the +marked files. That is, when you give a prefix argument the marks are +not consulted at all. A negative argument means to operate on the files +of the preceding lines. Either set of files is called @dfn{marked +files} below, whether they really come from marks or from a prefix +argument. The prompt of a mark-using command always makes clear which +set of files is operated upon: it mentions either the marker character +@samp{*} or the @samp{next @var{N}} files, where a negative @var{N} +really means the previous @var{-N} files.@refill + +@cindex Prefix argument via digit keys +Thus you can use a prefix argument of @code{1} to apply a command to just the +current file, e.g, if you don't want to disturb the other files you +marked. As digits are prefix arguments in Dired, simply type @kbd{1} +followed by the command. + +Many mark-using commands treat a prefix of @var{N=0} specially, since it +would otherwise be a no-op. + +@cindex Why something went wrong in Dired +@cindex Error logging in Dired +@kindex W +All mark-using commands display a list of files for which they failed. +Type @kbd{W} to see why a (mark-using or other) command failed. Error +messages from shell commands (@samp{stderr}) cannot be redirected +separately and goes together with the usual output (@samp{stdout}). + +@menu +* Copy and Move Into a Directory:: +* Renaming and More With Regexps:: +* Other File Creating Commands:: +* Deleting Files With Dired:: +* Dired Shell Commands:: +* Compressing and Uncompressing:: +* Changing File Attributes:: +* Loading and Byte-compiling Emacs Lisp Files:: +* Printing the Marked Files:: +@end menu + +@node Copy and Move Into a Directory, Renaming and More With Regexps, Mark-using Commands, Mark-using Commands +@subsection Copy, Move etc. Into a Directory + +@cindex Target commands in Dired +@cindex Dired target commands +@noindent +This section explains commands that create a new file for each marked +file, for example by copying (@kbd{c}) or moving (@kbd{r}) files. They +prompt in the minibuffer for a @var{target} argument, usually the target +directory in which the new files are created. But if there is but one +marked file, the target may also be a plain file. (Otherwise you could +not simply rename or copy a single file within the same directory.) +Even with one marked file the target may still be an (existing) +directory. + +@cindex Target default in Dired +@cindex Default target in Dired +@vindex dired-dwim-target +The target prompt displays a @dfn{default target} that will be used if +you just type @kbd{RET}. Normally the default target is the current +Dired directory, so if you want to copy into some specific subdirectory, +move point into that subdirectory before typing @kbd{c}. But if there +is a Dired buffer in the next window, and @code{dired-dwim-target} is +true, its current Dired directory is used. This makes it easy to copy +from one Dired buffer into another if both are displayed. On the other +hand you have to use @kbd{C-x 1} to make other Dired buffers vanish if +you do not want to have them as default targets. To make Dired never +look at the next window, set the variable @code{dired-dwim-target} to +nil (@samp{dwim} means Do What I Mean). @xref{Dired User Options}, on +how to set cutomization variables. + +@cindex Overwriting of files in Dired +As a general rule, Dired will not let you remove or overwrite a file +without explicit confirmation. Dired asks you for each existing target +file whether or not to overwrite just this file (answer @kbd{y} or +@kbd{n}) or all remaining files (answer @kbd{!}). You can also type +your help character, usually @kbd{C-h}, at that time for help. + +@table @kbd +@findex dired-do-copy +@kindex c +@vindex dired-copy-preserve-time +@item c +(@code{dired-do-copy}) Copy the marked (or next @var{N}) files into a +directory, or copy a single file. + +Thus, a zero prefix argument (@var{N-0}) copies nothing. But it toggles +the variable @code{dired-copy-preserve-time}.@* +@xref{Dired User Options}, on how to set customization variables. + +@findex dired-do-move +@kindex r +@item r +(@code{dired-do-move}) Move the marked files into a directory. If +there is just one marked file, rename that file. As the marked files +default to the current file, this can also be used to simply rename the +current file. + +Dired silently changes the visited file name of buffers associated with +moved files so that they refer to the new location of the file. + +When a directory is renamed, its headerlines in Dired buffers are +updated, and any buffers visiting affected files have their visited file +name changed to refer to the new location. Their buffer name is changed +if no buffer with such a name already exists. Affected files are all +those which contain the directory somewhere in their absolute path name. + +A zero prefix arguments does not move any files, but toggles the +variable @code{dired-dwim-target}. + +@findex dired-do-hardlink +@kindex H +@item H +(@code{dired-do-hardlink}) Make hard links from the target directory +to each marked file. +@findex dired-do-symlink +@kindex Y +@item Y +(@code{dired-do-symlink}) Make symbolic links from the target +directory to each marked file. +@end table + +@vindex dired-keep-marker-copy +@vindex dired-keep-marker-hardlink +@vindex dired-keep-marker-symlink +Linking is very similar to copying in that new files are created while +the old files stay. If you want each newly copied or linked file to be +marked with the same marker that its original has, set the variables +@code{dired-keep-marker-copy}, @code{dired-keep-marker-hardlink} or +@code{dired-keep-marker-symlink} to @code{t}. Set them to @code{nil} to +not give these newly created files marks. The default is to mark them +with @samp{C}, @samp{H} and @samp{Y}, respectively. + +@vindex dired-keep-marker-move +Moving differs from copying and linking in that the old file is removed +as part of the creation of the new file. Thus it makes sense to set the +variable @code{dired-keep-marker-move} to @code{t} (the default) so that +moved files ``take their markers with them''. + +@node Renaming and More With Regexps, Other File Creating Commands, Copy and Move Into a Directory, Mark-using Commands +@subsection Renaming (and More) With Regexps + +@cindex Regexp commands in Dired +@cindex Dired regexp commands +A second class of Commands uses regular expressions to construct a new +filename from each marked file. @xref{Regexps,Syntax of Regular +Expressions,Regular Expressions,emacs,The GNU Emacs Manual}. The commands +to make new names by regexp conversion are the same as those to make +them in another directory, except that they share a prefix char, @kbd{%}. + +@table @kbd + +@item %r +@kindex %r +@findex dired-rename-regexp +(@code{dired-rename-regexp}) Rename files with regexps + +@item %c +@kindex %c +@findex dired-do-copy-regexp +(@code{dired-do-copy-regexp}) +Copy files with regexps. + +@item %H +@kindex %H +@findex dired-do-hardlink-regexp +(@code{dired-do-hardlink-regexp}) +Make hard links with regexps. + +@item %Y +@kindex %Y +@findex dired-do-symlink-regexp +(@code{dired-do-symlink-regexp}) +Make symbolic links with regexps. + +@end table + +These commands prompt in the minibuffer for a @var{regexp} and a +@var{newname}. For each marked file matching @var{regexp}, a new +filename is constructed from @var{newname}. The match can be anywhere +in the file name, it need not span the whole filename. Use @samp{^} and +@samp{$} to anchor matches that should span the whole filename. Only +the first match in the filename is replaced with @var{newtext}. (It +would be easy to change this to replace all matches, but probably harder +to use.) + +@samp{\&} in @var{newname} stands for the entire text being replaced. +@samp{\@var{d}} in @var{newname}, where @var{d} is a digit, stands for +whatever matched the @var{d}'th parenthesized grouping in @var{regexp}. +As each match is found, the user must type a character saying whether or +not to apply the command to just this file (@kbd{y} or @kbd{n}) or to +all remaining files(@kbd{!}). For help type your help character, +usually @kbd{C-h}, at that time.@refill + +For example, if you want to rename all @file{.lsp} files to @file{.el} +files, type first @kbd{%m} with @samp{\.lsp$} as regexp to mark all +@file{.lsp} files. Then type @kbd{%r} with @samp{\.lsp$} and @samp{.el} +as @var{regexp} and @var{newtext} arguments. Dired will prompt you for +each file to be renamed. + +Or to append @file{.old} to all marked files, use @kbd{%r} @samp{$} +@kbd{RET} @samp{.old} @kbd{RET}, replacing the empty string at the end +of each file name with @samp{.old}. + +You can use the regexp @samp{\(.+\)\.\(.+\)$} to make the +basename as @samp{\1} and the extension as @samp{\2} available in +@var{newtext}. + +With a zero prefix arg, renaming by regexp affects the complete +pathname. Usually only the non-directory part of file names is used and +changed, and renaming only takes place within the current directory. +The zero prefix argument can be used to change the directory part as +well. + +Often you will want to apply the command to all files matching the same +@var{regexp} that you use in the command. Simply use the @kbd{%m} +command with @var{regexp} as argument, which will then also be the +default for the next regexp using command.@refill For example, to remove +a @file{V17I12-} prefix from several filenames, use @kbd{%m} +@samp{^V17I12-} @kbd{RET} @kbd{%r} @kbd{RET} @kbd{RET}, in effect +replacing the prefix with the empy string. + +@node Other File Creating Commands, Deleting Files With Dired, Renaming and More With Regexps, Mark-using Commands +@subsection Other File Creating Commands + +@cindex Case-changing Dired commands +@cindex Dired case-changing commands +Commands to change the case of file names: + +@table @kbd +@findex dired-upcase +@kindex %u +@item %u +(@code{dired-upcase}) Rename each marked file to upper case. +@findex dired-downcase +@kindex %l +@item %l +(@code{dired-downcase}) Rename each marked file to lower case. +@end table + +@node Deleting Files With Dired, Dired Shell Commands, Other File Creating Commands, Mark-using Commands +@subsection Deleting Files With Dired + +@noindent +Deleting is a special mark-using command. It uses a special marker, +@samp{D}, and does not default to the current file if no files are +marked to prevent accidental deletions.@refill + +@xref{Dired Customization}, variable @code{dired-del-marker} to make +deleting behave exactly like any mark-using command.@refill + +@table @kbd + +@findex dired-flag-file-deleted +@kindex d +@item d +(@code{dired-flag-file-deleted}) Flag this file for deletion. If on a +subdirectory headerline, mark all its files except @file{.} and @file{..}. + +@findex dired-unmark-subdir-or-file +@kindex u +@item u +(@code{dired-unmark-subdir-or-file}) Remove deletion-flag on this line. + +@findex dired-backup-unflag +@kindex @key{DEL} +@item @key{DEL} +(@code{dired-backup-unflag}) Remove deletion-flag on previous line, +moving point to that line. + +@findex dired-flag-regexp-files +@kindex %d +@item %d +(@code{dired-flag-regexp-files}) Flag all files containing the specified +@var{regexp} for deletion. + +The match is against the non-directory part of the filename. Use +@samp{^} and @samp{$} to anchor matches. Exclude subdirs by hiding +them. + +The special directories @file{.} and @file{..} are never flagged. + +@findex dired-do-deletions +@kindex x +@item x +(@code{dired-do-deletions}) Delete the files that are flagged for +deletion (with @samp{D}). + +@findex dired-do-delete +@kindex X +@item X +(@code{dired-do-delete}) Delete the @samp{*}-marked (as opposed to the +@samp{D}-flagged) files. + +@findex dired-flag-auto-save-files +@kindex # +@item # +(@code{dired-flag-auto-save-files}) Flag all auto-save files (files +whose names start and end with @samp{#}) for deletion (@pxref{Auto +Save,Auto-Saving: Protection Against Disasters,Auto Save,emacs,The GNU Emacs +Manual}). + +@findex dired-flag-backup-files +@kindex ~ +@item ~ +(@code{dired-flag-backup-files}) Flag all backup files (files whose +names end with @samp{~}) for deletion (@pxref{Backup,Backup +Files,Backup,emacs,The GNU Emacs Manual}). + +@findex dired-clean-directory +@kindex . +@item .@: @r{(Period)} +(@code{dired-clean-directory}) 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. + +Deletions proceed from the end of the buffer, so if subdirs are in a +natural order in the buffer, it usually works to flag @samp{dir1}, +@samp{dir1/dir2} and @samp{dir1/dir2/*} (by typing @kbd{d} on the +directory headerlines) and delete everything, including @samp{dir1/dir2} +and @samp{dir1}. Using shell commands (e.g. @samp{rm -rf}) to remove +complete directories may be quicker than having Dired remove each file +separately. (@xref{Dired Shell Commands}.) However, like all actions +external to Dired, this does not update the display.@refill +@c and does not offer to kill buffers of deleted files. + +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 Shell Commands, Compressing and Uncompressing, Deleting Files With Dired, Mark-using Commands +@subsection Shell Commands on Marked files + +@cindex Shell commands (in Dired) +@noindent +You can run arbitrary shell commands on the marked files. If there is +output, it goes to a separate buffer. + +@table @kbd + +@findex dired-do-shell-command +@kindex ! +@item ! +(@code{dired-do-shell-command}) Run a shell command on the marked +files. + +@end table + +A command string is prompted for in the minibuffer. The list of marked +files is appended to the command string unless asterisks @samp{*} +indicate the place(s) where the list should go. Thus,@refill + +@example +command -flags +@end example + +is equivalent to + +@example +command -flags * +@end example + +The filenames are inserted in the order they appear in the buffer. The +file listed topmost in the buffer will be the leftmost in the list. + +Currently, there is no way to insert a real @samp{*} into the command. + +As with all mark-using commands, if no files are marked or a specific +numeric prefix arg is given, the current or the next @var{N} files are +used. The prompt mentions the file(s) or the marker, as appropriate. + +However, for shell commands, a zero argument is special. It means to run +command on each marked file separately: + +@example +cmd * |foo +@end example + +results in + +@example +cmd F1 |foo; @dots{}; cmd F@var{n} |foo +@end example + +Usually + +@example +cmd F1 @dots{} F@var{n} |foo +@end example + +would be executed.@refill + +No automatic redisplay is attempted because Dired cannot know what files +should be redisplayed for a general shell command. For example, a +@samp{tar cvf} will not change the marked files at all, but rather +create a new file, while a @samp{ci -u -m'@dots{}' *} will probably change +the permission bits of all marked files. + +Type @kbd{l} to redisplay just the marked files, or @kbd{l} on a +directory headerline to redisplay just that directory, or @kbd{g} to +redisplay all directories.@refill + +The shell command has the top level directory as working directory, so +output files usually are created there instead of in a subdirectory, +which may sometimes be surprising if all files come from the same +subdirectory. Just remember that an Emacs buffer can have but one +working directory, and this is the top level directory in Dired +buffers. + +Examples for shell commands: + +@itemize @bullet + +@item +Type @kbd{!} and + +@example +tar cvf foo.tar +@end example + +@noindent +to tar all marked files into a @file{foo.tar} file. Dired does not know +that a new file has been created and you have to type @kbd{g} to refresh +the listing. If you have several subdirectories in your Dired buffer, +the names given to @samp{tar} will be relative to the top level +directory, and the output file @file{foo.tar} will also be created +there.@refill + +You can use + +@example +tar cvf - * | compress -c > foo.tar.Z +@end example + +@noindent +as an alternative to immediately compress the tar file. + +@item +Type @kbd{0 !} and + +@example +uudecode +@end example + +@noindent +to uudecode each of the marked files. Note the use of the zero prefix +argument to apply the shell command to each file separately (uudecode +doesn't accept a list of input files). Type @kbd{g} afterwards to see +the created files. + +@item +Type @kbd{0 !} and + +@example +uuencode * * >*.uu +@end example + +@noindent +to uuencode each of the marked files, writing into a corresponding +@file{.uu} file. Note the use of the zero prefix argument to apply the +shell command to each file separately. Type @kbd{g} afterwards to see +the created @file{.uu} files. + +@item +Type @kbd{1 !} and + +@example +mail joe@@somewhere <* +@end example + +@noindent +to mail the current file (note the prefix argument @samp{1}) to user +@samp{joe@@somewhere}.@refill + +@item +@cindex running the current file +@cindex executing the current file +@cindex current file, how to run it +Here is a Dired shell command to execute the current file, assuming no +other files are marked (else just give the prefix @kbd{1} to @kbd{!}): +@example +./* +@end example +which will be expanded to @samp{./@var{cmd}}, thus @var{cmd} will be +executed.. (Just @samp{./} would be expanded to @samp{./ @var{cmd}}, +with an intervening @kbd{SPC}.) This will work even if you don't have +@file{.} in your @code{$PATH}. If @file{.} is in your path (not a good +idea, as you will find out if you dired a directory containing a file +named @file{ls}), a single @kbd{SPC} as command would also work. + +@c <<NEED MORE AND BETTER EXAMPLES HERE>> +@end itemize + +@node Compressing and Uncompressing, Changing File Attributes, Dired Shell Commands, Mark-using Commands +@subsection Compressing and Uncompressing + +@noindent +You can compress or uncompress the marked files. Dired refuses to +compress files ending in @file{.Z} (which are already compressed) or +symbolic links (the link would be overwritten by a plain, compressed +file) and to uncompress files not ending in @file{.Z}. + +@table @kbd + +@findex dired-do-compress +@kindex C +@item C +(@code{dired-do-compress}) Compress the marked files. + +@findex dired-do-uncompress +@kindex U +@item U +(@code{dired-do-uncompress}) Uncompress the marked files. +@end table + +@node Changing File Attributes, Loading and Byte-compiling Emacs Lisp Files, Compressing and Uncompressing, Mark-using Commands +@subsection Changing File Attributes + +@noindent +You can change the file attributes (mode, group, owner) of marked files. + +@table @kbd + +@findex dired-do-chmod +@kindex M +@item M +(@code{dired-do-chmod}) Change the mode (also called ``permission +bits'') of the marked files. This calls the @samp{chmod} program, thus +symbolic modes like @samp{g+w} are allowed. + +Multiple switches like @samp{-fR g+w} are not understood, though. Use +@kbd{!} (@code{dired-do-shell-command}) for that. + +@findex dired-do-chgrp +@kindex G +@item G +(@code{dired-do-chgrp}) Change the group of the marked files. + +@vindex dired-chown-program +@findex dired-do-chown +@kindex O +@item O +(@code{dired-do-chown}) Change the owner of the marked files. This +usually works for the superuser only. It uses the program in the +variable @code{dired-chown-program} to do the change.@refill +@end table + +@node Loading and Byte-compiling Emacs Lisp Files, Printing the Marked Files, Changing File Attributes, Mark-using Commands +@subsection Loading and Byte-compiling Emacs Lisp Files + +@noindent +You can load and byte-compile GNU Emacs Lisp files. Errors are caught and +reported after all files have been processed. + +@table @kbd + +@findex dired-do-load +@kindex L +@item L +(@code{dired-do-load}) Load the marked elisp files. + +@findex dired-do-byte-compile +@kindex B +@item B +(@code{dired-do-byte-compile}) Byte compile the marked elisp files. +@end table + +@node Printing the Marked Files, , Loading and Byte-compiling Emacs Lisp Files, Mark-using Commands +@subsection Printing the Marked Files + +@table @kbd +@findex dired-do-print +@kindex P +@vindex lpr-command +@vindex lpr-switches +@item P +(@code{dired-do-print}) Print the marked (or next @var{N}) files. +Uses the shell command coming from variables @code{lpr-command} and +@code{lpr-switches} as default. + +Since internally this is just a special case of +@code{dired-do-shell-command}, you can use @samp{*} and pipes like for +shell command, e.g., +@example +(setq lpr-command: "lwf") +(setq lpr-switches: '("-l -m * | lpr -Palw")) +@end example +to print with the shell command @samp{lwf -l -m * | lpr -Palw}, where +@samp{*} will be substituted by the marked files. The @code{lpr-buffer} +and @code{lpr-region} don't know about @samp{*} or @samp{|}, though, only +Dired does. +@end table + +@node Commands That Do Not Use Marks, Subdirectories in Dired, Mark-using Commands, Dired +@section Commands That Do Not Use Marks + +@noindent +These are commands that visit files. +@xref{Visiting,Visiting Files,Visiting,emacs,The GNU Emacs Manual}. + +@table @kbd + +@findex dired-advertised-find-file +@kindex f +@item f +(@code{dired-advertised-find-file}) 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. + +@findex dired-find-file-other-window +@kindex o +@item o +(@code{dired-find-file-other-window}) 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,Multiple Windows,Windows,emacs,The GNU Emacs Manual}. + +@findex dired-view-file +@kindex v +@item v +(@code{dired-view-file}) 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,Miscellaneous File +Operations,emacs,The GNU Emacs Manual}. @refill Viewing a file that is a +directory goes to its headerline if it is in this buffer. Otherwise, it +is displayed in another buffer. + +@c Forgot that this only works for my version of C-x C-r... +@c +@c You might think that a @code{dired-view-file-other-window} command is +@c missing, but it is easy to use @kbd{o} followed by @kbd{C-x C-r} +@c @kbd{RET}, which will first visit the file in the other window, then +@c @samp{find-file-read-only} it (@kbd{RET} defaulting to the current +@c buffer's file). + +@end table + +@cindex Diffing files in Dired +@noindent +Commands to diff a file: + +@table @kbd + +@findex dired-diff +@kindex D +@item D +(@code{dired-diff}) Compare file at point with another file (default: +file at mark), by running the system command @samp{diff}. The other +file is the first file given to @samp{diff}. + +@findex dired-backup-diff +@kindex M-~ +@item M-~ +(@code{dired-backup-diff}) Diff this file with its backup file. Uses +the latest backup, if there are several numerical backups. If this file +is a backup, diff it with its original. The backup file is the first +file given to @samp{diff}. +@end table + +@noindent +Other commands: + +@table @kbd +@findex dired-create-directory +@kindex + +@cindex Creating a directory in Dired +@cindex Directory, how to create one in Dired +@item + +(@code{dired-create-directory}) Create a directory. +@end table + +@table @kbd +@findex dired-why +@kindex W +@cindex Why something went wrong in Dired +@cindex Error logging in Dired +@item W +(@code{dired-why}) Pop up a buffer with error log output from Dired. +All mark-using commands log errors there. (Standard error from shell +commands cannot be logged separately, it goes into the usual shell +command output buffer.) A group of errors from a single command ends +with a formfeed, so that you can use @kbd{C-x [} (@code{backward-page}) +to find the beginning of new error logs that are reported by a command. + +@end table + +@node Subdirectories in Dired, Hiding Directories in Dired, Commands That Do Not Use Marks, Dired +@section Subdirectories in Dired + +@noindent +Thise section explains how to @dfn{insert} (or @dfn{expand}) +subdirectories in the same Dired buffer and move around in them. +@cindex Inserting subdirectories in same Dired buffer +@cindex Expanding subdirectories in Dired + +You can display subdirectories in your Dired buffer by using @samp{-R} +in your Dired listing switches. But you do not usually want to have a +complete recursive listing in all your Dired buffers. So there is a +command to insert a single directory: + +@table @kbd + +@findex dired-maybe-insert-subdir +@kindex i +@item i +@cindex Inserted subdirectory +@cindex Expanded subdirectory +@cindex In-situ subdirectory +@cindex Headerline +(@code{dired-maybe-insert-subdir}) Insert this subdirectory into the +same Dired buffer. If it is already present, just move to it (type +@kbd{l}, @code{dired-do-redisplay} to refresh it). Else inserts it as +@samp{ls -lR} would have done. With a prefix arg, you may edit the ls +switches used for this listing. You can add @samp{R} to the switches to +expand the whole tree starting at this subdirectory. This function +takes some pains to conform to @samp{ls -lR} output. For example, it adds the +headerline for the inserted subdirectory.@refill + +The mark is dropped before moving, so @kbd{C-x C-x} takes you back to +the old position in the buffer. + +@end table + +Dired changes the buffer-local value of the variable +@code{page-delimiter} to @code{"\n\n"}, so that subdirectories become +pages. Thus, the page moving commands @kbd{C-x [} and @kbd{C-x ]} +(@code{backward-page} and @code{forward-page}) can be used to move to +the beginning (i.e., the headerlines) of subdirectories. + +In addition, the following commands move around directory-wise, usually +putting you on a file line instead of on a headerline. For a mnemonic, +note that they all look like rotated versions of each other, and that +they move in the direction they point to. + +@table @kbd + +@findex dired-prev-dirline +@kindex < +@item < +(@code{dired-prev-dirline}) Goto previous directory file line. + +@findex dired-next-dirline +@kindex > +@item > +(@code{dired-next-dirline}) Goto next directory file line. + +@findex dired-up-directory +@kindex ^ +@item ^ +(@code{dired-up-directory}) Dired parent directory. Tries first to find +its file line, then its header line in this buffer, then its Dired +buffer, finally creating a new Dired buffer if necessary. + +@findex dired-view-file +@kindex v +@item v +(@code{dired-view-file}) When the current file is not a directory, view +it. When file is a directory, tries to go to its subdirectory. + +@comment actually, it is not always inverse +This command is inverse to the @kbd{^} command and it is very convenient +to use these two commands together. + +@end table + +The following commands move up and down in the directory tree: + +@table @kbd + +@findex dired-tree-up +@kindex M-C-u +@item M-C-u +(@code{dired-tree-up}) Go up to the parent directory's headerline. + +@findex dired-tree-down +@kindex M-C-d +@item M-C-d +(@code{dired-tree-down}) Go down in the tree, to the first +subdirectory's headerline. + +@end table + +The following commands move forwards and backwards to subdirectory headerlines: + +@table @kbd + +@findex dired-next-subdir +@kindex M-C-n +@item M-C-n +(@code{dired-next-subdir}) Go to next subdirectory headerline, +regardless of level. + +@findex dired-prev-subdir +@kindex M-C-p +@item M-C-p +(@code{dired-prev-subdir}) Go to previous subdirectory headerline, +regardless of level. + +@end table + +@node Hiding Directories in Dired, Acknowledgement, Subdirectories in Dired, Dired +@section Hiding Directories in Dired + +@cindex Hiding in Dired +@noindent +@dfn{Hiding} a subdirectory means to make it invisible, except for its +headerline. Files inside a hidden subdirectory are never considered by +Dired. For example, mark-using commands will not ``see'' files in a +hidden directory. Thus you can use hiding to temporarily exclude +subdirectories from operations without having to remove the markers. + +The hiding commands toggle, that is they unhide what was hidden and vice +versa. + +@table @kbd + +@findex dired-hide-subdir +@kindex $ +@item $ +(@code{dired-hide-subdir}) Hide or unhide the current subdirectory and +move to next directory. Optional prefix argument is a repeat factor. + +@findex dired-hide-all +@kindex = +@item = +(@code{dired-hide-all}) Hide all subdirectories, leaving only their +header lines. If there is already something hidden, make everything +visible again. Use this command to get an overview in very deep +directory trees or to move quickly to subdirs far away. +@end table + +@node Acknowledgement, Dired Customization, Hiding Directories in Dired, Dired +@section Acknowledgement + +@noindent +I would like to thank + +@itemize @bullet +@item +Richard Stallman for providing a pre-release version of @file{dired.el} +from Emacs 19, critical comments and many helpful suggestions +@item +Andy Norman for the collaboration that made Tree Dired and ange-ftp such +a successful combination +@item +Jamie Zawinski for insisting on and writing nested Dired format, and for +lots of other things +@item +Michael Ernst for the ``omitting'' code and helpful discussion about +Dired design +@item +Hans Chalupsky for providing FTP service and writing +@file{dired-trns.el} +@item +Roland McGrath for @file{find-dired.el} and bug fixes for the diffing +commands +@item +Kevin Gallagher for sending me existing VMS Dired fixes +@item +Hal R. Brand for VMS support and porting his old dired fixes to Tree +Dired +@item +Hugh Secker-Walker for writing @file{dired-cd.el} +@item +Tom Wurgler for ideas such as the @dfn{dired-jump-back} command +@item +Cengiz Alaettinoglu, who found more bugs in Tree Dired than anybody else +(except me) +@end itemize +@noindent +and all other beta testers and people who reported bugs or just said +``thanks''. + +@node Dired Customization, , Acknowledgement, Dired +@section Dired Customization + +@noindent +You can customize Dired by setting some variables in your @file{~/.emacs} +file. Other variables are intended to be configured when Dired is +installed. Finally, there are so-called `hook' variables. + +@menu +* Dired User Options:: +* Dired Configuration:: +* Dired Hooks:: +@end menu + +@node Dired User Options, Dired Configuration, Dired Customization, Dired Customization +@subsection Customization of Dired + +@noindent +The following variables are for personal customization in your +@file{~/.emacs} file. For example, include a line similar to the +following + +@example +(setq dired-listing-switches "-Alt") ; sort on time, ignore . and .. +@end example + +to set your favorite Dired listing switches. + +@c Should actually use @defopt here, but this is in Texinfo2 only. + +@table @code + +@vindex dired-listing-switches +@item dired-listing-switches + +Default: @code{"-al"} + +Switches passed to @samp{ls} for Dired. @i{Must} contain the @samp{l} option. + +@vindex dired-trivial-filenames +@item dired-trivial-filenames + +Default: @code{"^\\.\\.?$\\|^#"} + +Regexp of files to skip when moving point to the first file of a new +directory listing. Nil means move to the subdirectory line, t means move to +first file. + +@vindex dired-marker-char +@item dired-marker-char + +Default: @code{?*} (@samp{?*} is the Lisp notation for the character +@samp{*}.) + +In Dired, character used to mark files for later commands. + +This is a variable so that one can write things like + +@example +(let ((dired-marker-char ?X)) + ;; great code using X markers ... + ) +@end example + +@vindex dired-del-marker +@item dired-del-marker + +Default: @code{?D} + +Character used to flag files for deletion. + +Usually, marking for commands and flagging for deletion are separate +features. (Internally they use the same marking mechanism.) You type +@kbd{d} to flag with @samp{D} and @kbd{x} to delete the @samp{D}-flagged +files.@refill + +This explains how to make deletion behave just like a special case of +the general file marking feature, so that you type @kbd{m} to mark with +@samp{*} (as usual) and @kbd{d} to delete the @samp{*} (or next @var{N}) +files: In your @file{~/.emacs}, include + +@example +(setq dired-del-marker dired-marker-char) ; use * also for deletions +(setq dired-load-hook + (function + (lambda () + ;; other customizations here + ;; let "d" do the actual deletion: + (define-key dired-mode-map "d" 'dired-do-delete)))) +@end example + +If you do not like that @kbd{d} defaults to the current file if there +are no marks, replace the @code{define-key} statement in +@code{dired-load-hook} above with this one: + +@example + (define-key dired-mode-map "d" 'dired-do-deletions) +@end example + +@vindex dired-shrink-to-fit +@item dired-shrink-to-fit + +Default: @code{(if (fboundp 'baud-rate) (> (baud-rate) search-slow-speed) t)} + +Whether Dired shrinks the display buffer to fit the marked files. + +@vindex dired-no-confirm +@item dired-no-confirm + +Default: @code{nil} + +If non-nil, list of commands Dired should not confirm. Confirmation for +commands that require an argument to be entered (like the shell command +for @kbd{!}) means a list of marked files is displayed in a pop-up +buffer. Confirmation for commands that do not require an argument (like +compressing with @kbd{C}) means you have to confirm by typing @kbd{y} or +@kbd{SPC}. + +Except @code{nil}, it can be a sublist of + +@example +'(byte-compile chgrp chmod chown compress copy delete hardlink load + move print shell symlink uncompress) +@end example + +to suppress confirmation for just those commands. + +@c @vindex dired-deletion-confirmer +@c But you can +@c set the variable @code{dired-deletion-confirmer} to another function +@c than @code{yes-or-no-p}, its default value. Using @code{y-or-no-p} will +@c confirm with only a single key stroke, @key{y} or @key{n}, and using +@c @code{identity} will effectively switch off confirmation. + +@vindex dired-keep-marker-move +@item dired-keep-marker-move + +Default: @code{t} + +If nil, moved files are not marked. + +If t, moved marked files are marked with the same marker they had before +(maybe none if you used the prefix argument to specify the next @var{N} +files). + +If a character, moved files (marked or not) are marked with that +character. + +This also applies to the following, similar variables for copied, and +hard or symbolically linked files: + +@vindex dired-keep-marker-copy +@item dired-keep-marker-copy + +Default: @code{?C} + +@vindex dired-keep-marker-hardlink +@item dired-keep-marker-hardlink + +Default: @code{?H} + +@vindex dired-keep-marker-symlink +@item dired-keep-marker-symlink + +Default: @code{?Y} + +@vindex dired-dwim-target +@item dired-dwim-target + +Default: @code{nil} + +If non-nil, Dired tries to guess a default target directory: If there is +a Dired buffer displayed in the next window, use its current subdirectory, +instead of the current subdirectory of this Dired buffer. + +The target is used in the prompt for file copy, move etc., +@xref{Copy and Move Into a Directory}. + +@item dired-copy-preserve-time +@vindex dired-copy-preserve-time + +Default: @code{nil} + +If non-nil, Dired preserves the last-modified time in a file copy. +(This works on only some systems.) Use @kbd{c} (@code{dired-do-copy}) +with a zero prefix argument to toggle its value. The prompt of copy +commands will display @samp{Copy [-p]} instead of just @samp{Copy} if +preservation of file times is turned on. + +@item dired-backup-if-overwrite +@vindex dired-backup-if-overwrite + +Default: @code{nil} + +Non-nil if Dired should ask about making backups before overwriting files. +Special value @code{'always} suppresses confirmation. + +@end table + +@node Dired Configuration, Dired Hooks, Dired User Options, Dired Customization +@subsection Dired Configuration + +The following variables should have already been installed correctly by +your system manager. If not, you can still set them in your +@file{~/.emacs} file.@refill + +@table @code + +@vindex dired-chown-program +@item dired-chown-program +Pathname of chown command, default @code{"chown"} (or +@code{"/etc/chown"} on System V derived systems.) + +@vindex dired-ls-program +@item dired-ls-program +Absolute or relative name of the @samp{ls} program used by Dired, +default @code{"ls"}. + +@vindex dired-ls-F-marks-symlinks +@item dired-ls-F-marks-symlinks +Set this to @code{t} if dired-ls-program with @samp{-lF} marks the +symbolic link itself with a trailing @samp{@@} (usually the case under +Ultrix). + +Example: If + +@example +ln -s foo bar; ls -F bar +@end example + +gives + +@example +bar -> foo +@end example + +set it to @code{nil}, if it gives + +@example +bar@@ -> foo +@end example + +set it to @code{t}. + +Dired checks if there is really a @@ appended. Thus, if you have a +marking @samp{ls} program on one host and a non-marking one on another +host, and do not care about symbolic links which really end in a @@, you +can always set this variable to @code{t}. + +@end table + + +@node Dired Hooks, , Dired Configuration, Dired Customization +@subsection Dired Hooks + +@noindent +Hook variables can contain functions that are run at certain times in +Dired. + +@table @code + +@vindex dired-load-hook +@item dired-load-hook + +Run after loading Dired. You can customize key bindings or load +extensions with this. For example: + +@example +(setq dired-load-hook + (function + (lambda () + ;; Load extras: + (load "dired-x") + ;; How to define your own key bindings: + (define-key dired-mode-map " " 'scroll-up) + (define-key dired-mode-map "b" 'scroll-down)))) +@end example + +@vindex dired-mode-hook +@item dired-mode-hook + +Run at the very end of @code{dired-mode}, after most buffer local +variables have been initialized (e.g., @code{default-directory} and +@code{dired-directory}), but before the directory listing has been read +in. + +Do buffer local things here, for example: + +@example +(setq dired-mode-hook + (function + (lambda () + (dired-extra-startup) ;; dired-extra support + ;; How to set (local) variables in each new Dired buffer: + (setq case-fold-search t) + (setq truncate-lines t)))) +@end example + +Since the listing has not yet been inserted you could still change +@code{dired-actual-switches}. For example, if you use +@file{ange-ftp.el}, you might want to replace the @samp{-A} with the +@samp{-a} switch, depending on whether @code{default-directory} +corresponds to a System V hosts that does not understand all BSD +@samp{ls} switches. The @code{dired.README} file gives an example. If +you set @code{dired-actual-switches} remember that you may also have to +set @code{dired-sort-mode} to the appropriate string so that the +modeline looks right. + +Do not set @code{dired-mode-hook} inside your @code{dired-load-hook}, +simply set it somewhere in your @file{~/.emacs} (before Dired is loaded, +if you explicitly load Dired). This is so that extensions packages +loaded via the load hook can add things to the @code{dired-mode-hook} at +the front or at the end, as they see fit. + +In case you set @code{truncate-lines} to @code{t} as in the above +example, here is a function to toggle the value of +@code{truncate-lines}, in Dired and other buffers: +@example +(defun set-truncate-lines () + "Toggle value of truncate-lines and refresh window display." + (interactive) + (setq truncate-lines (not truncate-lines)) + ;; now refresh window display (an idiom from simple.el): + (save-excursion + (set-window-start (selected-window) + (window-start (selected-window))))) +@end example +You could bind it to @kbd{C-x 4 $}: +@example +(define-key ctl-x-4-map "$" 'set-truncate-lines) +@end example +It is sometimes useful to toggle @code{truncate-lines} in Dired buffers +to make long filenames completely visible and get the listing properly +aligned again. + +@vindex dired-before-readin-hook +@item dired-before-readin-hook +This hook is run before a dired buffer is newly read in (created or reverted). + +@vindex dired-after-readin-hook +@item dired-after-readin-hook + +After each listing of a file or directory, this hook is run with the +buffer narrowed to the listing. + +The @code{dired-subdir-alist} has already been updated so that the usual +Dired functions like @code{dired-get-filename} work. It is possible to +modify the buffer with this hook. The package @file{dired-x.el} does +this to implement omitting certain uninteresting files from a Dired +buffer. Under X11, highlighting of certain files is also possible (see +package @file{dired-x11.el}). + +@end table + +@node Tree Dired Extra, Dired Internals, Dired, Top +@chapter Tree Dired Extra features + +Numerous ``extra'' features are available, such as omitting certain +files from listings, minibuffer history, RCS related commands, and more. + +@menu +* Tree Dired Extra Features:: +* Dired Minibuffer History:: +* Inserting All Marked Subdirectories:: +* Dynamic Dired Markers:: +* Omitting Files in Dired:: +* Advanced Dired Mark Commands:: +* Virtual Dired:: +* Multiple Dired Directories:: +* Dired Local Variables:: +* Making Relative Symbolic Links in Dired:: +* Letting Dired Guess What Shell Command to Apply:: +* dired-trns.el:: Filename Transformers for Dired Shell Commands +* dired-cd.el:: Changing the Working Directory for Dired Shell Commands +* dired-nstd.el:: Nested Dired format +* find-dired.el:: Feeding Find Output to Dired +@end menu + +@node Tree Dired Extra Features, Dired Minibuffer History, Tree Dired Extra, Tree Dired Extra +@section Tree Dired Extra Features + +The rest of this manual describes the extra features provided by the +file @file{dired-x.el} and some other files. + +To take advantage of these features, you must load the file and set some +variables and hooks. See the accompanying @file{dired-x.README} +file for details and a template of code to insert in your @file{.emacs}. + +Miscellanous features not fitting anywhere else: + +Variables: + +@table @code + +@item dired-find-subdir +@vindex dired-find-subdir +Default: @code{nil} + +If non-nil, Dired does not make a new buffer for a directory if it +can be found (perhaps as subdirectory) in some existing Dired buffer. + +If there are several Dired buffers for a directory, the most recently +used is chosen. + +Dired avoids switching to the current buffer, so that if you have a +normal and a wildcard buffer for the same directory, @kbd{C-x d RET} +will toggle between those two. + +@end table + +@table @kbd + +@findex dired-goto-file +@kindex M-g +@item M-g +(@code{dired-goto-file}) Goto file line of a file (or directory). + +@findex dired-goto-subdir +@kindex M-G +@item M-G +(@code{dired-goto-subdir}) Goto headerline of an inserted directory. +This commands reads its argument with completion over the names of the +inserted subdirectories. +@end table + +@table @kbd + +@findex dired-do-background-shell-command +@kindex & +@cindex Input to Dired shell commands +@cindex Interactive Dired shell commands +@cindex Background Dired shell commands +@item & +(@code{dired-do-background-shell-command}) Run a shell command on the +marked files, in the background. This requires @file{background.el} +from Olin Shiver's comint package to work. Note that you can type input +to the command in its buffer. + +@item w +@kindex w +@findex dired-copy-filename-as-kill +(@code{dired-copy-filename-as-kill}) The @kbd{w} command puts the names +of the marked (or next @var{N}) files into the kill ring, as if you had +killed them with @kbd{C-w}. With a zero prefix argument @var{N}=0, use the +complete pathname of each file. With a raw (just @kbd{C-u}) prefix argument, +use the relative pathname of each marked file. As a special case, if no +prefix argument is given and point is on a directory headerline, it +gives you the name of that directory, without looking for marked files. + +@vindex dired-marked-files +The list of names is also stored onto the variable @code{dired-marked-files} +for use, e.g., in an @kbd{ESC ESC} (@code{eval-expression}) command. + +As this command also displays what was pushed onto the kill ring you can +use it to display the list of currently marked files in the +echo area (unless you happen to be on a subdirectory headerline). + +You can then feed the file name to other Emacs commands with @kbd{C-y}. +For example, say you want to rename a long filename to a slightly +different name. First type @kbd{w} to push the old name onto the kill +ring. Then type @kbd{r} to rename it and use @kbd{C-y} inside @kbd{r}'s +minibuffer prompt to insert the old name at a convenient place. + +@item T +@kindex T +@findex dired-do-toggle +(@code{dired-do-toggle}) Toggle marks. That is, currently marked +files become unmarked and vice versa. Files marked with other flags +(such as `D') are not affected. The special directories `.' and `..' +are never toggled. + +@end table + +@node Dired Minibuffer History, Inserting All Marked Subdirectories, Tree Dired Extra Features, Tree Dired Extra +@section Minibuffer History for Dired Shell Commands + +@cindex History of Minibuffer input +@cindex Minibuffer History +@cindex Gmhist +@kindex ! +@kindex & +@kindex M-p +@kindex M-n +If @file{dired-x.el} determines at load-time that the Gmhist package is +available, the Dired shell commands @kbd{!} and @kbd{&} maintain a +history of commands. Use @kbd{M-p} and @kbd{M-n} to scroll through them +while you are prompted in the minibuffer for a shell command. +@xref{Gmhist Keys in the Minibuffer,Gmhist Keys in the Minibuffer,Gmhist +Keys in the Minibuffer,gmhist,The Gmhist Manual}, for more info. + +Gmhist also handles defaults: + +@table @code + +@vindex dired-dangerous-shell-command +@item dired-dangerous-shell-command +Default: @code{"rm"} + +Regexp for dangerous shell commands that should never be the default. +It is deliberately chosen to match @samp{rm} anywhere in the command, +e.g. in @samp{rmdir}. +@end table + +@node Inserting All Marked Subdirectories, Dynamic Dired Markers, Dired Minibuffer History, Tree Dired Extra +@section Insert all marked subdirectories + +@table @kbd + +@kindex I +@findex dired-do-insert-subdir +@item I +(@code{dired-do-insert-subdir}) Insert all marked subdirectories that +are not already inserted. Non-directories are silently ignored. + +Thus type @kbd{/I} to insert one more level of subdirectories. You can +repeat this until no new directories are inserted to fully expand the +directory tree in this buffer. As a faster alternative, use the prefix +argument for @kbd{C-x d} (@code{dired}) to add @samp{R} to the switches. + +@end table + +@node Dynamic Dired Markers, Omitting Files in Dired, Inserting All Marked Subdirectories, Tree Dired Extra +@section Dynamic Marker Characters + +@cindex Dynamic marker characters +@cindex Marker characters in Dired, changing them +@cindex Changing marker character in Dired +@cindex Stack of marker characters in Dired +You can change the marker character from its usual value @code{*} to +something else. Use this to mark a different set of files while keeping +the information on the already marked files. You can nest several +marker characters. The current stack of marker characters is displayed +in the Dired mode line, and all prompts of mark-using commands mention +to which marker they apply. + +@table @kbd + +@item ( +@kindex ( +@findex dired-set-marker-char +(@code{dired-set-marker-char}) Set the marker character to something +else. Use @kbd{)} to restore the previous value. + +@item ) +@kindex ) +@findex dired-restore-marker-char +(@code{dired-restore-marker-char}) Restore the marker character to its +previous value. Uses @code{dired-default-marker} if the marker stack is +empty. +@end table + +@kindex A +@kindex Z +@kindex m +@kindex ( +Instead of using @kbd{m} inside a @kbd{(}@dots{}@kbd{)}, you can mark +files ``in passing'' with, say @samp{Z} without changing the +current marker character. You will probably later use @kbd{(} to +temporarily make @samp{Z} to the marker and do something on the +@samp{Z}-files, and then return using @code{)}. + +@table @code + +@item dired-mark-keys +Default: @code{'("Z")} + +List of keys (strings) that insert themselves as file markers. + +@end table + + +@node Omitting Files in Dired, Advanced Dired Mark Commands, Dynamic Dired Markers, Tree Dired Extra +@section Omitting Files in Dired + +@cindex Omitting Files in Dired +@dfn{Omitting} a file means removing it from the directory listing. +Omitting is useful for keeping Dired buffers free of uninteresting files +(for instance, auto-save, auxiliary, backup, and revision control files) +so that the user can concentrate on the interesting files. Like hidden +files, omitted files are never seen by Dired. +@xref{Dired Hiding,Hiding in Dired,Hiding in Dired,dired,Tree Dired Manual}. +Omitting differs from hiding in several respects: + +@itemize @bullet + +@item +Omitting works on individual files, not on directories; an entire +directory cannot be omitted (though each of its files could be). + +@item +Omitting is wholesale; if omitting is turned on for a dired buffer, then +all ``uninteresting'' files listed in that buffer are omitted. The user +does not omit (or unomit) files one at a time. + +@item +Omitting can be automatic; uninteresting file lines in the buffer can +be removed before the user ever sees them. + +@item +Marked files are never omitted. +@end itemize + +@table @kbd + +@item M-o +@kindex M-o +@findex dired-omit-toggle +(@code{dired-omit-toggle}) +Toggle between displaying and omitting ``uninteresting'' files. +With a prefix argument, don't toggle and just mark the files, but don't +actually omit them. +@end table + +In order to make omitting work, you must have @code{dired-omit-expunge} +on your @code{dired-after-readin-hook}, and you must call +@code{dired-omit-startup} (or @code{dired-extra-startup}, which calls +@code{dired-omit-startup}) in your @code{dired-mode-hook}. Simply +loading @file{dired-x.el} inside @code{dired-load-hook} takes care of +all this. + +The following variables can be used to customize omitting. + +@table @code + +@vindex dired-omit-files-p +@item dired-omit-files-p + +Default: @code{nil} + +@cindex How to make omitting the default in Dired +If non-nil, ``uninteresting'' files are not listed. Uninteresting files +are those whose filenames match regexp @code{dired-omit-files}, plus those +ending with extensions in @code{dired-omit-extensions}. @kbd{M-o} +(@code{dired-omit-toggle}) toggles its value, which is buffer-local. Do + +@example +(setq dired-omit-files-p t) +@end example + +inside your @code{dired-mode-hook} to have omitting initially turned on +in every Dired buffer. Since @file{dired-x.el} prepends the form +@samp{(dired-extra-startup)} to what you put yourself in your +@code{dired-mode-hook}, the @code{setq} will take place after +@code{dired-omit-files-p} has already been made local to the current +Dired buffer, so modelines of non-dired buffers are not affected. For +this to work you shouldn't set @code{dired-mode-hook} inside +@code{dired-load-hook}, but directly in your @file{~/.emacs} (before +Dired is loaded, if you explicitly load Dired). + +You can then use @kbd{M-o} to unomit in that buffer. + +@vindex dired-omit-files +@item dired-omit-files + +Default: @code{"^#\\|\\.$"} + +Filenames matching this buffer-local regexp will not be displayed. +This only has effect when @code{dired-omit-files-p} is t. + +The default value omits the special directories @file{.} and @file{..} +and autosave files (plus other files ending in ``.''). + +@vindex dired-omit-extensions +@item dired-omit-extensions + +Default: The elements of @code{completion-ignored-extensions}, +@code{latex-unclean-extensions}, @code{bibtex-unclean-extensions} and +@code{texinfo-unclean-extensions}. + +If non-nil, a list of extensions (strings) to omit from Dired listings. +Its format is the same as that of @code{completion-ignored-extensions}. + +@vindex dired-omit-localp +@item dired-omit-localp + +Default: @code{'no-dir} + +The @var{localp} argument @code{dired-omit-expunge} passes to +@code{dired-get-filename}. If it is @code{'no-dir}, omitting is much +faster, but you can only match against the non-directory part of the +filename. Set it to @code{nil} if you need to match the whole pathname +or @code{t} to match the pathname relative to the buffer's top-level +directory. + +@item dired-omit-marker-char +@vindex dired-omit-marker-char + +Default: @kbd{C-o} + +Temporary marker used by by Dired to implement omitting. +Should never be used as marker by the user or other packages. +@cindex Omitting additional files +There is one exception to this rule: by doing +@example +(setq dired-mark-keys "\C-o") +;; i.e., the value of dired-omit-marker-char +;; (which is not defined yet) +@end example +anywhere in your @file{~/.emacs}, you will bind the @kbd{C-o} key to +insert a @key{C-o} marker, thus causing these files to be omitted in +addition to the usually omitted files. Unfortunately the files you +omitted manually this way will show up again after reverting the buffer, +unlike the others. + +@end table + +@cindex RCS files, how to omit them in Dired +@cindex Omitting RCS files in Dired +To avoid seeing RCS files and the RCS directory, do +@example +(setq dired-omit-files "\\.$\\|#\\|^RCS$\\|,v$") +@end example +This assumes @code{dired-omit-localp} has its default value of +@code{'no-dir} to make the @code{^}-anchored matches work. As a slower +alternative, with @code{dired-omit-localp} set to @code{nil}, you can +use @code{/} instead of @code{^} in the regexp. + +@cindex Tib files, how to omit them in Dired +@cindex Omitting tib files in Dired +If you use tib, the bibliography program for use with @TeX{} and +La@TeX{}, you might want to omit the @file{INDEX} and the @file{-t.tex} +files: +@example +(setq dired-omit-files "\\.$\\|#\\|^INDEX$\\|-t\\.tex$") +@end example + +@node Advanced Dired Mark Commands, Virtual Dired, Omitting Files in Dired, Tree Dired Extra +@section Advanced Mark Commands + +@table @kbd + +@item M-( +@kindex M-( +@findex dired-mark-sexp +@cindex Lisp expression, marking files with in Dired +@cindex Mark file by lisp expression +(@code{dired-mark-sexp}) Mark files for which @var{predicate} returns non-nil. +With a prefix argument, unflag those files instead. + +The @var{predicate} is a lisp expression that can refer to the following +symbols: +@table @code +@item inode +[@i{integer}] the inode of the file (only for @samp{ls -i} output) +@item s +[@i{integer}] the size of the file for @samp{ls -s} output (usually in blocks or, +with @samp{-k}, in KBytes) +@item mode +[@i{string}] file permission bits, e.g., @samp{"-rw-r--r--"} +@item nlink +[@i{integer}] number of links to file +@item uid +[@i{string}] owner +@item gid +[@i{string}] group (If the gid is not displayed by @samp{ls}, this +will still be set (to the same as uid)) +@item size +[@i{integer}] file size in bytes +@item time +[@i{string}] the time that @samp{ls} displays, e.g., @samp{"Feb 12 14:17"} +@item name +[@i{string}] the name of the file +@item sym +[@i{string}] if file is a symbolic link, the linked-to name, else @samp{""} +@end table + +@noindent +For example, use +@example +(equal 0 size) +@end example +to mark all zero length files. + +To find out all not yet compiled Emacs lisp files in a directory, dired +all @file{.el} files in the lisp directory using the wildcard +@samp{*.el}. Then use @kbd{M-(} with +@example +(not (file-exists-p (concat name "c"))) +@end example +to mark all @file{.el} files without a corresponding @file{.elc} file. + +@item M-M +@kindex M-M +@cindex Marker character, how to replace it +@cindex Replacing one marker character with another +(@code{dired-do-unmark}) Unmark marked files by replacing the marker +with another character. The new character defaults to a space, +effectively unmarking them. + +@item , +@kindex , +@cindex RCS controlled files, how to mark them +@cindex Marking RCS controlled files +(@code{dired-mark-rcs-files}) Mark all files that are under RCS control. +With prefix argument, unflag all those files. Mentions RCS files for +which a working file was not found in this buffer. Type @kbd{W} +(@code{dired-why}) to see them again. + +@item C-m C-c +@kindex C-m C-c +@cindex Compilation files, how to mark them +@cindex Marking compilation files +@cindex List of files, how to mark them +@cindex Marking a list of files from a buffer +(@kbd{C-m C-c} is the suggested binding for +@code{dired-mark-files-compilation-buffer}, it is not bound by default.) +Mark the files mentioned in the @samp{*compilation*} buffer. With an +argument, you may specify the other buffer and your own regexp instead of +@code{compilation-error-regexp}. Use @samp{^.+$} (the default with a +prefix argument) to match complete lines. In conjunction with narrowing the +other buffer you can mark an arbitrary list of files, one per line, with +this command. If your regexp contains a subexpression, i.e. +@samp{\(@var{...}\)}, that subexpression is taken for the file name, +else the whole match is used. Thus you can easily strip pre- and +suffixes from filenames by using @samp{@var{prefix}\(.+\)@var{postfix}} +as regexp. + +This is especially useful for a list of files obtained from @kbd{M-x +grep} or output from a similar shell command. + +@item C-m C-d +@kindex C-m C-d +@cindex Corresponding files, how to mark them +@cindex List of files, how to mark them +(@kbd{C-m C-d} is the suggested binding for +@code{dired-mark-files-from-other-dired-buffer}, it is not bound by default.) +Mark those files in this Dired buffer that have the same name as the +marked files in the Dired buffer in the other window. + +In short, mark the corresponding files from the other Dired buffer. + +@end table + +@table @kbd +@item F +@kindex F +@cindex Visiting several files at once +@cindex Simultaneous visiting of several files +@findex dired-do-find-file +(@code{dired-do-find-file}) Visit all marked files at once, and +display them simultaneously. If you want to keep the dired buffer +displayed, type @kbd{C-x 2} first. If you want just the marked files +displayed and nothing else, type @kbd{C-x 1} first. + +The current window is split across all files. Remaining lines go to the +last window. + +The number of files that can be displayed this way is restricted by the +height of the current window and the variable @code{window-min-height}. + +@end table + +@table @code + +@item dired-mark-extension +@findex dired-mark-extension +Mark all files with a certain extension for use in later commands. +A @samp{.} is not automatically prepended to the string entered. + +When called from lisp, @var{extension} may also be a list of extensions +and an optional argument @var{marker-char} specifies the marker used. + +@item dired-flag-extension +@findex dired-flag-extension +Flag all files with a certain extension for deletion. +A @samp{.} is @emph{not} automatically prepended to the string entered. + +@item dired-clean-patch +@findex dired-clean-patch +Flag dispensable files created by the @samp{patch} program for deletion. +See variable @code{patch-unclean-extensions}. + +@item dired-clean-tex +@findex dired-clean-tex +Flag dispensable files created by @TeX{}, La@TeX{} and @samp{texinfo} +for deletion. See variables @code{tex-unclean-extensions}, +@code{texinfo-unclean-extensions}, @code{latex-unclean-extensions} and +@code{bibtex-unclean-extensions}. + +@end table + +Variables used by the above cleanup commands (and in the default value +for variable @code{dired-omit-extensions}): + +@table @code + +@item patch-unclean-extensions +@vindex patch-unclean-extensions +Default: @code{'(".rej" ".orig")} + +List of extensions of dispensable files created by the @samp{patch} program. + +@item tex-unclean-extensions +@vindex tex-unclean-extensions +Default: @code{'(".toc" ".log" ".aux")} + +List of extensions of dispensable files created by @TeX{}. + +@item texinfo-unclean-extensions +@vindex texinfo-unclean-extensions +Default: @code{'(".cp" ".cps" ".fn" ".fns" ".ky" ".kys" ".pg" ".pgs" +".tp" ".tps" ".vr" ".vrs")} + +List of extensions of dispensable files created by texinfo. + +@item latex-unclean-extensions +@vindex latex-unclean-extensions +Default: @code{'(".idx" ".lof" ".lot" ".glo")} + +List of extensions of dispensable files created by LaTeX. + +@item bibtex-unclean-extensions +@vindex bibtex-unclean-extensions +Default: @code{'(".blg" ".bbl")} + +List of extensions of dispensable files created by BibTeX. + +@end table + + +@node Virtual Dired, Multiple Dired Directories, Advanced Dired Mark Commands, Tree Dired Extra +@section Virtual Dired + +@cindex Virtual Dired +@cindex Perusing ls listings +@cindex ls listings, how to peruse them in Dired +Using @dfn{Virtual Dired} means putting a buffer with Dired-like +contents in Dired mode. The files described by the buffer contents need +not actually exist. This is useful if you want to peruse an @samp{ls -lR} +output file, for example one you got from an FTP server. You can use +all motion commands usually available in Tree Dired. You can also use +it to save a Dired buffer in a file and resume it in a later session. + +@findex dired-virtual +@kindex g +@findex dired-virtual-revert +Type @kbd{M-x dired-virtual} to put the current buffer into virtual +Dired mode. You will be prompted for the top level directory of this +buffer, with a default value guessed from the buffer contents. To +convert the virtual to a real Dired buffer again, type @kbd{g} (which +calls @code{dired-virtual-revert}) in the virtual Dired buffer and +answer @samp{y}. You don't have to do this, though: you can relist +single subdirectories using @kbd{l} (@code{dired-do-redisplay}) on the subdirectory +headerline, leaving the buffer in virtual Dired mode all the time. + +@findex dired-virtual-mode +@vindex auto-mode-alist +The function @samp{dired-virtual-mode} is specially designed to turn on +virtual Dired mode from the @code{auto-mode-alist}. To automatically +edit all @file{*.dired} files in virtual Dired mode, put this into your +@file{~/.emacs}: + +@example +(setq auto-mode-alist (cons '("[^/]\\.dired$" . dired-virtual-mode) + auto-mode-alist)) +@end example + +The regexp is a bit more complicated than usual to exclude ".dired" +local variable files. + +@node Multiple Dired Directories, Dired Local Variables, Virtual Dired, Tree Dired Extra +@section Multiple Dired Directories and Non-Dired Commands + +@cindex Multiple Dired directories +@cindex Working directory +An Emacs buffer can have but one working directory, stored in the +buffer-local variable @code{default-directory}. A Dired buffer may have +several subdirectories inserted, but still has but one working +directory: that of the top level Dired directory in that buffer. For +some commands it is appropriate that they use the current Dired +directory instead of @code{default-directory}, e.g., @code{find-file} and +@code{compile}. + +A general mechanism is provided for special handling of the working +directory in special major modes: + +@table @code +@item default-directory-alist +@vindex default-directory-alist +Default: @code{((dired-mode . (dired-current-directory)))} + +Alist of major modes and their opinion on @code{default-directory}, as a +lisp expression to evaluate. A resulting value of @code{nil} is ignored +in favor of @code{default-directory}. + +@item default-directory +@findex default-directory +Function with usage like variable @code{default-directory}, but knows about the +special cases in variable @code{default-directory-alist}. +@end table + +The following dired-x commands take special care about the current +Dired directory: + +@table @code + +@item find-this-file +@findex find-this-file +@findex find-file +@kindex C-x C-f +Bind this to @kbd{C-x C-f} as a replacement for @code{find-file} that +will prompt for the filename within the current Dired subdirectory, not +the top level directory. + +@item find-this-file-other-window +@findex find-this-file-other-window +@findex find-file-other-window +@kindex C-x 4 C-f +Bind this to @kbd{C-x 4 C-f} as a replacement for +@code{find-file-other-window}. + +@item dired-smart-shell-command +@findex dired-smart-shell-command +@findex shell-command +@kindex M-! +Like function @code{shell-command}, but in the current Tree Dired directory. +Bound to @kbd{M-!} in Dired buffers. + +@item dired-smart-background-shell-command +@findex dired-smart-background-shell-command +@findex background +@kindex M-& +Like function @code{background}, but in the current Tree Dired directory. +Bound to @kbd{M-&} in Dired buffers. + +@item dired-jump-back +@findex dired-jump-back +@kindex C-x j +(Suggested binding @kbd{C-x j}) Jump back to dired: If in a file, dired +the current directory and move to file's line. If in Dired already, pop +up a level and goto old directory's line. In case the proper Dired file +line cannot be found, refresh the Dired buffer and try again. + +@item dired-jump-back-other-window +@findex dired-jump-back-other-window +@kindex C-x 4 j +(Suggested binding @kbd{C-x 4 j}) Like @code{dired-jump-back}, but to +other window. + +@item dired-vm +@kindex V +@findex dired-vm +@vindex vm-folder-directory +(@kbd{V}) Run VM on this file (assumed to be a UNIX mail folder). +Further `v' commands from within VM in that folder will default to the +folder's directory, not the usual @code{vm-folder-directory}. + +@vindex dired-vm-read-only-folders +If you give this command a prefix argument, it will visit the folder +read-only. This only works in VM 5, not VM 4. + +If the variable @code{dired-vm-read-only-folders} is t, @code{dired-vm} +will visit all folders read-only. If it is neither @code{nil} nor +@code{t}, e.g., the symbol @code{'if-file-read-only}, only files not +writable by you are visited read-only. This is the recommended value if +you run VM 5. + +@item dired-rmail +@findex dired-rmail +Run Rmail on this file (assumed to be mail folder in Rmail/BABYL format). + +@end table + +@c subsection Narrow and Widen in a Dired Buffer + +@node Dired Local Variables, Making Relative Symbolic Links in Dired, Multiple Dired Directories, Tree Dired Extra +@section Local Variables for Dired Directories + +@cindex Local Variables for Dired Directories +@vindex dired-local-variables-file +When Dired visits a directory, it looks for a file whose name is the +value of variable @code{dired-local-variables-file} (default: +@file{.dired}). If such a file is found, Dired will temporarily insert +it into the Dired buffer and run @code{hack-local-variables}. +@xref{File Variables,Local Variables in Files,Local Variables in +Files,emacs,The GNU Emacs Manual}. You can set +@code{dired-local-variables-file} to @code{nil} to suppress this. + +For example, put + +@example +Local Variables: +dired-actual-switches: "-lat" +dired-sort-mode: " by date" +End: +@end example + +into a @file{.dired} file of a directory to sort by date only in that +directory. Note that since @code{dired-hack-local-variables} is run +inside @code{dired-mode-hook} the modeline has already been set, so you +have to update that for yourself by setting @code{dired-sort-mode} in +addition to changing the switches. + +@node Making Relative Symbolic Links in Dired, Letting Dired Guess What Shell Command to Apply, Dired Local Variables, Tree Dired Extra +@section Making Relative Symbolic Links in Dired + +In GNU Emacs version 18, the built-in function @code{make-symbolic-link} +always calls @code{expand-file-name} on its arguments, so relative +symlinks (e.g. @samp{foo -> ../bar/foo}) are impossible to create. + +Dired Extra uses @code{call-process} and @samp{ln -s} for a workaround. + +@table @code + +@item dired-make-symbolic-link +@findex dired-make-symbolic-link +Arguments @var{name1} @var{name2} and optional +@var{ok-if-already-exists}. Create file @var{name2}, a symbolic link +pointing to @var{name1} (which may be any string whatsoever and is +passed untouched to @samp{ln -s}). @var{ok-if-already-exists} means that +@var{name2} will be overwritten if it already exists. If it is an +integer, user will be asked about this. On error, signals a file-error. + +@item dired-make-relative-symlink +@findex dired-make-relative-symlink +Three arguments: @var{file1} @var{file2} and optional +@var{ok-if-already-exists}. Make a symbolic link @var{file2} (pointing +to @var{file1}). The link is relative (if possible), for example + +@example +(dired-make-relative-symlink "/vol/tex/bin/foo" + "/vol/local/bin/foo") +@end example + +@noindent +results in a link + +@example +/vol/local/bin/foo -> ../../tex/bin/foo +@end example + +@item dired-do-relsymlink +@findex dired-do-relsymlink +(binding @kbd{S}) Symbolically link all marked (or next @var{N}) files +into a directory, or make a symbolic link to the current file. This +creates relative symbolic links like + +@example + foo -> ../bar/foo +@end example + +@noindent +not absolute ones like +@example + foo -> /ugly/path/that/may/change/any/day/bar/foo +@end example + +@item dired-do-relsymlink-regexp +@findex dired-do-relsymlink-regexp +(@kbd{%S}) Symbolically link all marked files containing @var{regexp} to +@var{newname}, using relative (not absolute) names. See functions +@code{dired-rename-regexp} and @code{dired-do-relsymlink} for more info. + +@end table + +@node Letting Dired Guess What Shell Command to Apply, dired-trns.el, Making Relative Symbolic Links in Dired, Tree Dired Extra +@section Letting Dired Guess What Shell Command to Apply + +Based upon the name of a filename, Dired tries to guess what shell +command you might want to apply to it. For example, if you have point +on a file named @file{foo.tar} and you press @kbd{!}, Dired will guess +you want to @samp{tar xvf} it and suggest that as the default shell +command. + +If you are using the @file{gmhist} package (@xref{Dired Minibuffer +History}), the default will be mentioned in brackets and you can type +@kbd{M-p} to get the default into the minibuffer so that you can edit +it, e.g., changing @samp{tar xvf} to @samp{tar tvf}. If there are +several commands for a given file, e.g., @samp{xtex} and @samp{dvips} +for a @file{.dvi} file, you can type @kbd{M-p} several times to see each +of the matching commands. + +Dired only tries to guess a command for a single file, never for a list +of marked files. + +@table @code + +@item dired-auto-shell-command-alist-default +@vindex dired-auto-shell-command-alist-default + +Predefined rules for shell commands. Set this to nil to turn guessing off. +The elements of @code{dired-auto-shell-command-alist} (defined by the +user) will override these rules.@refill + +@item dired-auto-shell-command-alist +@vindex dired-auto-shell-command-alist + +If non-nil, an alist of file regexps and their suggested commands +overriding the predefined rules in +@code{dired-auto-shell-command-alist-default}.@refill + +Each element of the alist looks like + +@example +(@var{regexp} @var{command}@dots{}) +@end example + +where each @var{command} can either be a string or a lisp expression +that evaluates to a string. If several @var{COMMAND}s are given, all +will temporarily be pushed on the history. + +These rules take precedence over the predefined rules in the variable +@code{dired-auto-shell-command-alist-default} (to which they are +prepended when @file{dired-x} is loaded). + +You can set this variable in your @file{~/.emacs}. For example, +to add rules for @samp{.foo} and @samp{.bar} file extensions, write + +@example +(setq dired-auto-shell-command-alist + (list + (list "\\.foo$" "@var{foo-command}");; fixed rule + ;; possibly more rules... + (list "\\.bar$";; rule with condition test + '(if @var{condition} + "@var{bar-command-1}" + "@var{bar-command-2}")))) +@end example + +@noindent +This will override any predefined rules for the same extensions. + +@item dired-guess-have-gnutar +@vindex dired-guess-have-gnutar + +Default: @code{nil} + +If non-nil, name of the GNU tar executable (e.g., @samp{"tar"} or +@samp{"gnutar"}). GNU tar's @samp{z} switch is used for compressed tar +files. If you don't have GNU tar, set this to nil: a pipe using +@samp{zcat} is then used. + +@end table + +@node dired-trns.el, dired-cd.el, Letting Dired Guess What Shell Command to Apply, Tree Dired Extra +@section Filename Transformers for Dired Shell Commands + +@cindex Transformer +@cindex Basename of a file, how to use in Dired shell commands +@cindex Extension of a file, how to use in Dired shell commands +File name @dfn{transformers} are functions that take a filename (a string) +as an argument and transform it into some other string (e.g., a filename +without an extension). This package makes transformers available in +Dired shell commands. + +For example, running the Dired shell command (type @kbd{!} or @kbd{M-x} +@code{dired-do-shell-command})@refill + +@example +echo * [b] [db] +@end example + +would list the full name, the basename, and the absolute basename of +each marked file. + +Each transformer is associated with a dispatch character. The associations +are stored in a keymap for fast and easy lookup. The dispatch character +is used to activate the associated transformer function at a particular +position in a shell command issued in Dired. The dispatch character +must be enclosed in brackets to distinguish it from normal letters. + +To take advantage of this package, simply load it after loading Dired, +e.g., in your @code{dired-load-hook}. You can then use transformers like +"[b]" for the basename in your Dired shell commands (see below). + +You can define your own transformers using the macro @code{dired-trans-define}. + +@table @code + +@item dired-trans-define +@findex dired-trans-define +Macro that assigns the transformer function @code{(lambda (file) +@var{body})} to @var{char} (a character or string). @var{body} must +return a string: the transformed file. +@end table + +Several transformers are predefined: + +@table @samp + +@item * +returns the unmodified filename (equivalent to @samp{[dbe]}). + +@item n +returns the Name component of a filename without directory information + +@item d +returns the Directory component of a filename + +@item b +returns the Basename of a filename, i.e., the name of the file without +directory and extension (see variable @code{dired-trans-re-ext}) +A basename with directory component can be obtained by @samp{[db]}. + +@item e +returns the Extension of a filename (i.e., whatever +@code{dired-trans-re-ext} splits off) + +@item v +returns a file without directory and without @file{,v} suffixes if any. + +@item z +returns a file without directory and without @file{.Z} suffixes if any. + +@end table + +@noindent +The following variables can be used to customize @file{dired-trns.el}: + +@table @code + +@item dired-trans-re-ext +@vindex dired-trans-re-ext +Default: @code{"\\.[^.]*\\(\\.Z\\)?$"} + +The part of a filename matching this regexp will be viewed as extension. + +@item dired-trans-starters +@vindex dired-trans-starters +Default: @code{"[#[]"} + +User definable set of characters to be used to indicate the start of a +transformer sequence. + +@item dired-trans-enders +@vindex dired-trans-enders +Default: @code{"[]# ]"} + +User definable set of characters to be used to indicate the end of a +transformer sequence. + +@end table + +@node dired-cd.el, dired-nstd.el, dired-trns.el, Tree Dired Extra +@section Changing the Working Directory for Dired Shell Commands + +The package @file{dired-cd.el} permits the working directory of the +Dired shell commands @kbd{!} (@code{dired-do-shell-command}) and @kbd{&} +(@code{dired-do-background-shell-command}) to be the files' subdirectory +under certain circumstances. Loading this extension does not change the +behavior of Dired until the variables @code{dired-cd-same-subdir} and/or +@code{dired-cd-on-each} are non-nil. + +@vindex dired-cd-same-subdir +If @code{dired-cd-same-subdir} is non-nil and if all the selected files +(marked, non-zero numeric argument, etc.) are in the same subdirectory, +then @code{dired-do-shell-command} and +@code{dired-do-background-shell-command} cause the shell to perform a +@samp{cd} into that directory before the commands are executed. Also, +the selected filenames are provided to the command without any directory +components. + +@vindex dired-cd-on-each +If @code{dired-cd-on-each} is non-nil and if the @samp{on-each} option +is specified (numeric argument of zero), then @kbd{!} +(@code{dired-do-shell-command}) and @kbd{&} +(@code{dired-mark-background-shell-command}) use a subshell to perform a +@samp{cd} into the subdirectory of each file before the commands on that +file are executed. Also, each filename is provided to the command +without any directory components. Note that this behavior occurs +regardless of whether the files are all in the same directory or not. + +After the above @samp{cd} wrapping has occured, the existing +@code{dired-shell-stuff-it} is used to do the actual file-name quoting +and substitution into the command. Thus, custom versions of this +procedure should work, e.g., the @samp{dired-trans} package will transform +commands correctly. However, since filenames lack any directory +components, features that use the directory components will fail, e.g. +the @samp{[d]} transform specifier will be empty. + +To use this package, load it in your @code{dired-load-hook}. Do + +@example +(setq dired-cd-same-subdir t) +@end example + +@noindent +and perhaps + +@example +(setq dired-cd-on-each t) +@end example + +@noindent +in your @file{~/.emacs}. By default, @code{dired-cd} doesn't change the +behavior of Dired when it is loaded. + +@vindex dired-cd-same-subdir +If @code{dired-cd-same-subdir} is non-nil, then the shell commands +@samp{cd} to the appropriate directory if all the selected files are in +that directory; however, on-each behavior (with zero prefix argument) is +not changed. + +@vindex dired-cd-on-each +If @code{dired-cd-on-each} is non-nil, then each instance of the command +for an on-each shell command runs in the file's directory regardless of +whether the files are all in the same directory. + +@node dired-nstd.el, find-dired.el, dired-cd.el, Tree Dired Extra +@section Nested Dired format + +[NO DOCUMENTATION YET] + +This is still buggy, @xref{Dired Known Problems}. + +@node find-dired.el, , dired-nstd.el, Tree Dired Extra +@section Feeding Find Output to Dired + +@cindex Find and Dired +The @code{find-dired} command runs the @samp{find} command in a buffer +and starts Dired on the inserted file lines, even while @samp{find} is +still running. For example, with @samp{-type d} as argument, you will +get a Dired buffer that contains all subdirectories of a given +directory, but none of the other files. + +Note that @samp{find} just gives you file lines, not inserted +subdirectories with associated headerlines as repeated use of the +@kbd{i} (@code{dired-maybe-insert-subdir}) command would. Also, the +names contain slashes if they are in a subdirectory, which never occurs +in a normal Dired buffer. Dired understands these names anyway and you +can for example type @kbd{f} on such lines as usual. However, while +@samp{find} is still running you shouldn't type @kbd{i} to insert +subdirectories, since new @samp{find} output is always appended at the +end. Use @kbd{f} or @kbd{o} instead to dired the specific subdirectory +in a new Dired buffer. After @samp{find} has finished (as indicated by +a message and the modeline) all Dired commands work as usual. + +@table @code + +@item find-dired +@findex find-dired +Run @samp{find} on a directory @var{dir}, with find arguments +@var{args}, and go into dired-mode on a buffer of the output. The +command run (after changing into @var{dir}) is +@example +find . \( @var{args} \) -ls +@end example + +@item find-name-dired +@findex find-name-dired +Search @var{dir} recursively for files matching the globbing pattern +@var{pattern}, and run Dired on those files. @var{pattern} is a shell +wildcard (not an Emacs regexp) and need not be quoted. The command +run (after changing into @var{dir}) is +@example + find . -name '@var{pattern}' -ls +@end example + +@item find-grep-dired +@findex find-grep-dired +Find files in directory @var{dir} containing a regexp @var{arg} and +start Dired on output. The command run (after changing into @var{dir}) +is +@example +find . -exec grep -s @var{arg} @{@} \; -ls +@end example +@end table + +@node Dired Internals, Dired Known Problems, Tree Dired Extra, Top +@appendix Dired Internals + +This is a short introduction about how Dired's Tree and Mark features +work. You are encouraged to read the code (@file{dired.el}) for more +information. + +@menu +* Tree Dired Internals:: +* Dired Mark Internals:: +@end menu + +@node Tree Dired Internals, Dired Mark Internals, Dired Internals, Dired Internals +@section Tree Dired Internals + +@cindex Internals of Tree Dired +@cindex Tree Dired Internals +@vindex dired-subdir-alist +@vindex default-directory +In Tree Dired, instead of just one directory, all or part of the +directory @emph{tree} starting at the top level directory (the working +directory or @code{default-directory} of the buffer) may be in a +Dired buffer. Each file line belongs to exactly one of those +subdirectories. After the @code{ls} program has inserted its output, +Dired parses the buffer once to find out where the subdirectory +boundaries are and saves them in the variable @code{dired-subdir-alist}. +The beginning of the headerline inserted by @code{ls} serves as boundary +between subdirectories. + +@kindex i +@findex dired-maybe-insert-subdir +Subsequent @kbd{i} (@code{dired-maybe-insert-subdir}) commands update this +alist and insert the appropriate headerline. Each retrieval of the +filename on the current line first extracts the basename (assuming a +more or less standard @code{ls} output format), and then function +@code{dired-current-directory} looks up the current Dired directory in +@code{dired-subdir-alist}. The lookup is keyed on buffer position, as +each buffer position is between exactly two subdirectory boundaries. (The end +of the buffer serves as an implicit subdirectory boundary.) + +@table @code + +@item dired-subdir-alist +@vindex dired-subdir-alist +Association list of subdirectories and their buffer positions: + +@example +((@var{lastdir} . @var{lastmarker}) @dots{} (@var{default-directory} . @var{firstmarker})). +@end example + +The markers point right before the beginning of the line, so that they +separate subdirectories adjacent in the buffer. The directories must be +in the form returned by @code{file-name-as-directory}. + +@item dired-subdir-regexp +@vindex dired-subdir-regexp +Value: "^. \\([^ \n\r]+\\)\\(:\\)[\n\r]" + +Regexp matching a maybe hidden subdirectory line in @samp{ls -lR} +output. Subexpression 1 is subdirectory proper, no trailing colon. The +match starts at the beginning of the line and ends after the end of the +line (@samp{\n} or @samp{\r}). Subexpression 2 must end right before +the @samp{\n} or @code{\r}. This is so that Dired can easily check +whether a subdirectory is hidden or not: hidden lines end with @samp{\r} +(@kbd{C-m}) instead of a newline. + +This regexp used to be @code{"^. \\(/[^\n\r]*\\)\\(:\\)[\n\r]"}, +allowing spaces, but disallowing relative filenames (which occur when +browsing ls -lR listing in virtual Dired mode, so I changed it). + +Note that @code{"^. \\([^\n\r]+\\)\\(:\\)[\n\r]"} (desirable since it +allows both spaces and relative names) will not always work: if you have +a file that ends in a colon, its whole line (including permission bits, +date etc.) would be mistaken for a subdirectory headerline when parsing +@samp{ls -lR} output. + +@code{dired-subdir-regexp} is only relevant for parsing @samp{ls -lR} +output. If Dired inserts subdirectories itself (using +@code{dired-insert-subdir}), they will always be absolute and there is +no restriction on the format of filenames, e.g., they can contain +spaces. + +@end table + +@node Dired Mark Internals, , Tree Dired Internals, Dired Internals +@section Dired Mark Internals + +This is a short overview about how marking files and retrieving marked +files in Dired works. + +@cindex Internal of Dired file marking +@cindex Dired file marking internals +@cindex File marking internals in Dired +@cindex Marking files in Dired, internals of +@code{ls} output is indented two spaces two make room for an optional +marker character in front of each file line. Marking simply replaces the +first space with the marker character, usually @code{*} or, for +deletions, @code{D}. Indenting just by one would leave the markers +adjacent to the permission bits. + +@table @code + +@item dired-mark-if +@findex dired-mark-if +The macro @code{dired-mark-if} is used internally to mark files matching +certain criteria. It takes two arguments, the @var{predicate}, a lisp +expression evaluating non-nil on file lines to be marked, and @var{msg}, +a message to be displayed while scanning the buffer. @var{msg} may be +nil to suppress the message. + +@findex dired-mark-map +@item dired-mark-map +To operate on the marked files, all internal Dired functions ultimately +call the macro @code{dired-mark-map}. It takes two arguments, +@var{body} and @var{arg}, plus an optional argument @var{show-progress}: + +Perform @var{body} with point somewhere on each marked line (inside a +@code{save-excursion}) and return a list of @var{body}'s results. If no +marked file could be found, execute @var{body} on the current line. + +If @var{arg} is an integer, use the next @var{arg} (or previous +-@var{arg}, if @var{arg}<0) files instead of the marked files. In that +case point is dragged along. This is so that commands on the next ARG +(instead of the marked) files can be chained easily. Note that for +positive ARG point is left on the first file not operated upon, for +negative on the last file operated upon + +If @var{arg} is otherwise non-nil, use current file instead. + +If optional third argument @var{show-progress} evaluates to non-nil, we +redisplay the Dired buffer after each file is processed. No guarantee +is made about the position on the marked line. @var{body} must ensure +this itself if it depends on this. Search starts at the beginning of +the buffer, thus the @code{car} of the list corresponds to the line nearest to +the buffer's bottom. This is also true for (positive and negative) +integer values of @var{arg}. The @var{body} should not be too long as +it is expanded four times.@refill + +@c This warning should no longer apply. sk 6-Sep-1991 16:28 +@c Warning: @var{body} must not add new lines before point - this may cause +@c an endless loop. + +@end table + +@noindent +A common case is to retrieve the names of all marked files: + +@table @code + +@findex dired-mark-get-files +@item dired-mark-get-files +Return the marked files as list of strings. The list is in the same +order as the buffer, that is, the car is the first marked file. Values +returned are normally absolute pathnames. Optional argument @var{localp} +equal to @code{no-dir} means return the filename proper only, with no +directory information; any other non-nil value means make them relative +to default-directory. Optional second argument @var{arg} forces use of +other files. If @var{arg} is an integer, use the next @var{arg} files. +If @var{arg} is otherwise non-nil, use the current file. + +@end table + +@node Dired Known Problems, Dired Variable Index, Dired Internals, Top +@appendix Known Problems with Dired + +There are some problems with Dired that are either not Dired's fault, +hard to fix or not worth fixing. + +@itemize @bullet + +@item +Renaming directories usually works fine (all affected Dired and file +buffers are updated), but moving a directory between different +filesystems (those on different hard disks or different partitions) does +not work: it creates a plain target file containing the contents of the +original directory (inodes and filenames) or fails completely. + +Unfortunately Emacs' builtin function @code{rename-file} does not give +you a clear error message like @samp{cross-device link attempted}, but +rather a spurious @code{(file-error "Removing old name" "not owner")}, +at least in Emacs 18.55. + +On some systems renaming a directory always fails (even within +the same filesystem) with the spurious @samp{not owner} error. +@c This was reported for HP-UX. +@c +@c On one system (IBM Rs6000 running AIX 3.1.3) date lossage was reported, +@c but this was not reproducible. + +@item +If @file{foo} is a symlink to a non-existing file, @code{(file-exists-p +"foo")} returns nil. Thus, Dired will overwite such (strange) kinds of +symlinks without noticing. + +Dired could test both @code{file-symlink-p} and @code{file-exists-p}, +but this would slow down all file operations to catch a very rare case. + +@item +Copying a directory does not work - it results in a zero-length +target file. + +This comes from Emacs' @code{copy-file} function, not from Dired. + +If you really want to copy a directory (recursively), use `!' and +your favorite shell command to do it (e.g. cp -R or cp -r). + +@item +Initial spaces in a filename are not recognized. If I could be sure +that all @samp{ls} programs insert exactly one space between the time and +the filename, I could easily fix this. But @samp{ls} programs tend to vary +in their amount of white space, and even with one @samp{ls} program there +is a difference between year and clocktime formats +@example + drwxr-xr-x 2 ab027 thp 512 Aug 13 1990 thp/ + drwxr-xr-x 4 ab027 thp 512 Feb 3 21:59 ./ +@end example +If your @samp{ls} supports the @samp{-b} switch and quotes spaces with +that switch, simply add @samp{b} to your @code{dired-listing-switches}. +@xref{Listing Files in Dired}. + +Spaces anywhere but at the beginning do work. + +@item +In general, only commands that may have targets outside of the +current directory tree update other buffers (copy, move and link +commands). + +Especially, deletions, (un)compress, chmod/chgrp/chown update only +the current buffer. + +@item +Some compress programs make output even if all goes well. Dired +takes output as a sign of trouble and assumes that the subprocess +failed. + +Redefine function @code{dired-check-process-checker} suitably to +look closer at the generated output. In Emacs 19, the exit status +of compress will be checked. + +@item +Aliases like @samp{rm -i} for @samp{rm} or @samp{ls -F} for @samp{ls} +can cause problems in Dired's (and Emacs') shell command. (Aliases for +@samp{ls} only matter if you dired wildcards, because only then the shell is +used to run @samp{ls}.) Csh expands aliases only for interactive shells, which +is probably what you want. In Bash, you can achieve this by testing +@code{PS1} in your @file{~/.bashrc}: +@example + # `.bashrc' file + # this test fails when invoked by rsh + if [ "$@{PS1-no@}" != "no" ] # is this an interactive shell? + then + . ~/.bash_alias # if so, source aliases + fi +@end example + +@item +Directory names starting with @file{-} (a minus) may lose when they are +to be created or removed. If you care about this, and your rmdir +and mkdir understand about @file{--} meaning end of options, change +@file{emacs-19.el} accordingly. + +In Emacs 19 the @code{make-directory} and @code{remove-directory} +operations will be builtin, not implemented with @samp{rmdir} and +@samp{mkdir} subprocesses. + +@item +@file{dired-nstd.el}: This is still buggy. For example, after you've +compressed the last file it may not correctly return that file's +absolute pathname (@code{dired-current-directory} erronously returns nil +because of markers collapsed during redisplay), ultimately leading to +lisp errors. + +@c Not longer a problem as of dired-version 5.242, sk 28-Jan-1992 11:17. +@c @item +@c Symbolic links to directories are sometimes strange. On System V +@c derived systems (e.g., DG/UX, AIX/370), after +@c @example +@c mkdir dir; ln -s dir link +@c @end example +@c both @file{link} and @file{link/} are considered symbolic links by the +@c @samp{stat(2)} system call, while on BSD derived systems (e.g., Sun OS, +@c Mach, HP/UX, Ultrix) @file{link/} is considered a directory. In +@c general, the BSD behaviour is preferable, at least for Dired. On the +@c other systems it is cumbersome to get Dired to dereference those links. + +@item +The regexp-using @kbd{%}-commands get into an endless loop if you +specify a regular expression that matches the empty string. + +@item +Function @code{find-alternate-file} in Emacs 18.57 has a bug that causes +@kbd{C-x C-v RET} (which usually re-visits the current buffer) to fail +on Dired buffers. This is fixed in the version in @file{emacs-19.el}, +automatically loaded by Dired. + +@item +It is not possible to resort the Dired buffer without reverting it. That +would be hard to implement (and slow to run) given that ls date format +would have to be parsed for @samp{ls -t} sorting order. + +@end itemize + +@node Dired Variable Index, Dired Function Index, Dired Known Problems, Top +@unnumbered Dired Variable Index +@printindex vr + +@node Dired Function Index, Dired Key Index, Dired Variable Index, Top +@unnumbered Dired Function Index +@printindex fn + +@node Dired Key Index, Dired Concept Index, Dired Function Index, Top +@unnumbered Dired Key Index +@printindex ky + +@node Dired Concept Index, , Dired Key Index, Top +@unnumbered Dired Concept Index +@printindex cp + +@c @summarycontents +@contents + +@bye +