• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.9.5/emacs-92/emacs/lisp/

Lines Matching +defs:dired +defs:get +defs:marked +defs:files

0 ;;; dired.el --- directory-browsing commands
8 ;; Keywords: files
40 (defgroup dired nil
43 :group 'files)
45 (defgroup dired-mark nil
47 :prefix "dired-"
48 :group 'dired)
52 (defcustom dired-listing-switches "-al"
56 `dired-ls-F-marks-symlinks' concerning the `F' switch.
61 :group 'dired)
63 (defvar dired-subdir-switches nil
65 If nil, `dired-listing-switches' is used.")
72 (defvar dired-chown-program
80 (defvar dired-use-ls-dired (not (not (string-match "gnu" system-configuration)))
81 "Non-nil means Dired should use `ls --dired'.")
83 (defvar dired-chmod-program "chmod"
86 (defvar dired-touch-program "touch"
90 (defcustom dired-ls-F-marks-symlinks nil
104 :group 'dired-mark)
107 (defcustom dired-trivial-filenames "^\\.\\.?$\\|^#"
108 "*Regexp of files to skip when finding first file of a directory.
114 :group 'dired)
117 (defcustom dired-keep-marker-rename t
118 ;; Use t as default so that moved files "take their markers with them".
119 "*Controls marking of renamed files.
120 If t, files keep their previous marks when they are renamed.
121 If a character, renamed files (whether previously marked or not)
122 are afterward marked with that character."
125 :group 'dired-mark)
128 (defcustom dired-keep-marker-copy ?C
129 "*Controls marking of copied files.
130 If t, copied files are marked if and as the corresponding original files were.
131 If a character, copied files are unconditionally marked with that character."
134 :group 'dired-mark)
137 (defcustom dired-keep-marker-hardlink ?H
139 If t, they are marked if and as the files linked to were marked.
140 If a character, new links are unconditionally marked with that character."
143 :group 'dired-mark)
146 (defcustom dired-keep-marker-symlink ?Y
148 If t, they are marked if and as the files linked to were marked.
149 If a character, new links are unconditionally marked with that character."
152 :group 'dired-mark)
155 (defcustom dired-dwim-target nil
157 This means: if there is a dired buffer displayed in the next window,
158 use its current subdir, instead of the current subdir of this dired buffer.
162 :group 'dired)
165 (defcustom dired-copy-preserve-time t
169 :group 'dired)
171 ; These variables were deleted and the replacements are on files.el.
173 (defvaralias 'dired-free-space-program 'directory-free-space-program)
174 (defvaralias 'dired-free-space-args 'directory-free-space-args)
178 (defcustom dired-load-hook nil
181 :group 'dired
184 (defcustom dired-mode-hook nil
185 "Run at the very end of `dired-mode'."
186 :group 'dired
189 (defcustom dired-before-readin-hook nil
190 "This hook is run before a dired buffer is read in (created or reverted)."
191 :group 'dired
194 (defcustom dired-after-readin-hook nil
198 :group 'dired
200 ;; Note this can't simply be run inside function `dired-ls' as the hook
201 ;; functions probably depend on the dired-subdir-alist to be OK.
203 (defcustom dired-dnd-protocol-alist
204 '(("^file:///" . dired-dnd-handle-local-file)
205 ("^file://" . dired-dnd-handle-file)
206 ("^file:" . dired-dnd-handle-local-file))
207 "The functions to call when a drop in `dired-mode' is made.
210 new dired buffers."
214 :group 'dired)
218 (defvar dired-marker-char ?* ; the answer is 42
220 ;; (let ((dired-marker-char ?X))
223 ;; For example, commands operating on two sets of files, A and B.
224 ;; Or marking files with digits 0-9. This could implicate
225 ;; concentric sets or an order for the marked files.
230 (defvar dired-del-marker ?D
231 "Character used to flag files for deletion.")
233 (defvar dired-shrink-to-fit t
236 "Non-nil means Dired shrinks the display buffer to fit the marked files.")
238 (defvar dired-flagging-regexp nil);; Last regexp used to flag files.
240 (defvar dired-file-version-alist)
243 (defvar dired-directory nil
244 "The directory name or wildcard spec that this dired directory lists.
245 Local to each dired buffer. May be a list, in which case the car is the
246 directory name and the cdr is the list of files to mention.
249 (defvar dired-actual-switches nil
250 "The value of `dired-listing-switches' used to make this buffer's text.")
252 (defvar dired-re-inode-size "[0-9 \t]*"
259 (defvar dired-re-mark "^[^ \n]")
260 ;; "Regexp matching a marked line.
262 (defvar dired-re-maybe-mark "^. ")
265 (defvar dired-re-dir (concat dired-re-maybe-mark dired-re-inode-size "d[^:]"))
266 (defvar dired-re-sym (concat dired-re-maybe-mark dired-re-inode-size "l[^:]"))
267 (defvar dired-re-exe;; match ls permission string of an executable file
270 (concat dired-re-maybe-mark dired-re-inode-size x)))
275 (defvar dired-re-perms "[-bcdlps][-r][-w].[-r][-w].[-r][-w].")
276 (defvar dired-re-dot "^.* \\.\\.?/?$")
279 (defvar dired-subdir-alist nil
285 (defvar dired-switches-alist nil
288 (make-variable-buffer-local 'dired-switches-alist)
290 (defvaralias 'dired-move-to-filename-regexp
293 (defvar dired-subdir-regexp "^. \\([^\n\r]+\\)\\(:\\)[\n\r]"
300 (defgroup dired-faces nil
302 :group 'dired
305 (defface dired-header
308 :group 'dired-faces
310 (defvar dired-header-face 'dired-header
313 (defface dired-mark
315 "Face used for dired marks."
316 :group 'dired-faces
318 (defvar dired-mark-face 'dired-mark
319 "Face name used for dired marks.")
321 (defface dired-marked
323 "Face used for marked files."
324 :group 'dired-faces
326 (defvar dired-marked-face 'dired-marked
327 "Face name used for marked files.")
329 (defface dired-flagged
331 "Face used for flagged files."
332 :group 'dired-faces
334 (defvar dired-flagged-face 'dired-flagged
335 "Face name used for flagged files.")
337 (defface dired-warning
340 :group 'dired-faces
342 (defvar dired-warning-face 'dired-warning
345 (defface dired-directory
348 :group 'dired-faces
350 (defvar dired-directory-face 'dired-directory
353 (defface dired-symlink
356 :group 'dired-faces
358 (defvar dired-symlink-face 'dired-symlink
361 (defface dired-ignored
363 "Face used for files suffixed with `completion-ignored-extensions'."
364 :group 'dired-faces
366 (defvar dired-ignored-face 'dired-ignored
367 "Face name used for files suffixed with `completion-ignored-extensions'.")
369 (defvar dired-font-lock-keywords
373 (list dired-subdir-regexp '(1 dired-header-face))
376 (list dired-re-mark '(0 dired-mark-face))
380 ;; Dired defined function `dired-move-to-filename' before searching for the
383 ;; Marked files.
384 (list (concat "^[" (char-to-string dired-marker-char) "]")
385 '(".+" (dired-move-to-filename) nil (0 dired-marked-face)))
387 ;; Flagged files.
388 (list (concat "^[" (char-to-string dired-del-marker) "]")
389 '(".+" (dired-move-to-filename) nil (0 dired-flagged-face)))
396 ;;; (list (concat dired-re-maybe-mark dired-re-inode-size
398 ;;; '(1 dired-warning-face)
399 ;;; '(".+" (dired-move-to-filename) nil (0 dired-warning-face)))
404 (list (concat dired-re-maybe-mark dired-re-inode-size
406 '(1 dired-warning-face))
407 (list (concat dired-re-maybe-mark dired-re-inode-size
409 '(1 dired-warning-face))
412 (list dired-re-dir
413 '(".+" (dired-move-to-filename) nil (0 dired-directory-face)))
416 (list dired-re-sym
417 '(".+" (dired-move-to-filename) nil (0 dired-symlink-face)))
424 '(".+" (dired-move-to-filename) nil (0 dired-ignored-face))))
438 (unless (get-text-property (1- (point)) 'mouse-face)
439 (dired-move-to-filename)))
440 nil (0 dired-ignored-face))))
449 (defmacro dired-mark-if (predicate msg)
450 "Mark all files for which PREDICATE evals to non-nil.
452 MSG is a noun phrase for the type of files being marked.
454 Return value is the number of files marked, or nil if none were marked."
464 (insert dired-marker-char)
470 (dired-plural-s count)
471 (if (eq dired-marker-char ?\040) "un" "")
472 (if (eq dired-marker-char dired-del-marker)
473 "flagged" "marked"))))
476 (defmacro dired-map-over-marks (body arg &optional show-progress
477 distinguish-one-marked)
478 "Eval BODY with point on each marked line. Return a list of BODY's results.
479 If no marked file could be found, execute BODY on the current line.
481 files instead of the marked files.
483 the next ARG (instead of the marked) files can be chained easily.
486 redisplay the dired buffer after each file is processed.
487 No guarantee is made about the position on the marked line.
494 If DISTINGUISH-ONE-MARKED is non-nil, then if we find just one marked file,
505 (dired-repeat-over-lines
515 (let ((regexp (dired-marker-regexp)) next-position)
518 ;; remember position of next marked file before BODY
520 ;; confusing us by finding the same marked file again
535 (if (and ,distinguish-one-marked (= (length results) 1))
541 (dired-move-to-filename)))
543 (defun dired-get-marked-files (&optional localp arg filter distinguish-one-marked)
544 "Return the marked files' names as list of strings.
546 first marked file.
548 Optional arg LOCALP as in `dired-get-filename'.
549 Optional second argument ARG specifies files near point
550 instead of marked files. If ARG is an integer, use the next ARG files.
554 some of the files--those for which (funcall FILTER FILENAME) is non-nil.
556 If DISTINGUISH-ONE-MARKED is non-nil, then if we find just one marked file,
561 (dired-map-over-marks
562 (dired-get-filename localp)
563 arg nil distinguish-one-marked)))
566 (if (and distinguish-one-marked (eq (car all-of-them) t))
575 ;; The dired command
577 (defun dired-read-dir-and-switches (str)
582 dired-listing-switches))
585 ;; only select directories or files when popped up, not both.
592 ;;;###autoload (define-key ctl-x-map "d" 'dired)
594 (defun dired (dirname &optional switches)
595 "\"Edit\" directory DIRNAME--delete, rename, print, etc. some files in it.
598 Dired displays a list of files in DIRNAME (which may also have
599 shell wildcards appended to select certain files). If DIRNAME is a cons,
601 list of files to make directory entries for.
602 \\<dired-mode-map>\
604 You can flag files for deletion with \\[dired-flag-file-deletion] and then
605 delete them by typing \\[dired-do-flagged-delete].
608 If DIRNAME is already in a dired buffer, that buffer is used without refresh."
610 (interactive (dired-read-dir-and-switches ""))
611 (switch-to-buffer (dired-noselect dirname switches)))
613 ;;;###autoload (define-key ctl-x-4-map "d" 'dired-other-window)
615 (defun dired-other-window (dirname &optional switches)
616 "\"Edit\" directory DIRNAME. Like `dired' but selects in another window."
617 (interactive (dired-read-dir-and-switches "in other window "))
618 (switch-to-buffer-other-window (dired-noselect dirname switches)))
620 ;;;###autoload (define-key ctl-x-5-map "d" 'dired-other-frame)
622 (defun dired-other-frame (dirname &optional switches)
623 "\"Edit\" directory DIRNAME. Like `dired' but makes a new frame."
624 (interactive (dired-read-dir-and-switches "in other frame "))
625 (switch-to-buffer-other-frame (dired-noselect dirname switches)))
628 (defun dired-noselect (dir-or-list &optional switches)
629 "Like `dired' but returns the dired buffer as value, does not select it."
654 (dired-internal-noselect dir-or-list switches)))
656 ;; The following is an internal dired function. It returns non-nil if
657 ;; the directory visited by the current dired buffer has changed on
659 (defun dired-directory-changed-p (dirname)
666 (defun dired-buffer-stale-p (&optional noconfirm)
667 "Return non-nil if current dired buffer needs updating.
671 (if (consp dired-directory) (car dired-directory) dired-directory)))
675 (dired-directory-changed-p dirname))))
677 ;; Separate function from dired-noselect for the sake of dired-vms.el.
678 (defun dired-internal-noselect (dir-or-list &optional switches mode)
679 ;; If there is an existing dired buffer for DIRNAME, just leave
680 ;; buffer as it is (don't even call dired-revert).
684 ;; buffer's old value, so call dired-sort-other, which does
688 ;; Optional argument MODE is passed to dired-find-buffer-nocreate,
692 ;; note that buffer already is in dired-mode, if found
699 (setq buffer (dired-find-buffer-nocreate dirname mode)
704 ;; or whatever, now that dired-mode does not
711 (setq dired-directory dir-or-list)
712 ;; this calls dired-revert
713 (dired-sort-other switches))
715 ((when (dired-directory-changed-p dirname)
722 ;; because dired-noselect ensures that the name
726 (or switches (setq switches dired-listing-switches))
728 (dired-mode dir-or-list switches))
729 ;; default-directory and dired-actual-switches are set now
730 ;; (buffer-local), so we can call dired-readin:
733 (progn (dired-readin)
735 ;; dired-readin can fail if parent directories are inaccessible.
739 (dired-initial-position dirname))
743 (defvar dired-buffers nil
744 ;; Enlarged by dired-advertise
745 ;; Queried by function dired-buffers-for-dir. When this detects a
747 "Alist of expanded directories and their associated dired buffers.")
749 (defun dired-find-buffer-nocreate (dirname &optional mode)
750 ;; This differs from dired-buffers-for-dir in that it does not consider
754 (let (found (blist dired-buffers)) ; was (buffer-list)
755 (or mode (setq mode 'dired-mode))
762 dired-directory ;; nil during find-alternate-file
765 (if (consp dired-directory)
766 (car dired-directory)
767 dired-directory))))
775 ;; Read in a new dired buffer
777 (defun dired-readin ()
778 "Read in a new dired buffer.
779 Differs from `dired-insert-subdir' in that it accepts
783 ;; default-directory and dired-actual-switches must be buffer-local
786 (if (consp dired-directory)
787 (setq dirname (car dired-directory))
788 (setq dirname dired-directory))
791 ;; This hook which may want to modify dired-actual-switches
792 ;; based on dired-directory, e.g. with ange-ftp to a SysV host
794 (run-hooks 'dired-before-readin-hook)
805 (dired-readin-insert))
808 ;; dired-build-subdir-alist will call dired-clear-alist first
809 (set (make-local-variable 'dired-subdir-alist) nil)
810 (dired-build-subdir-alist)
816 ;; dired-readin's output, nothing else. The hook can
817 ;; successfully use dired functions (e.g. dired-get-filename)
818 ;; as the subdir-alist has been built in dired-readin.
819 (run-hooks 'dired-after-readin-hook))))
821 ;; Subroutines of dired-readin
823 (defun dired-readin-insert ()
825 ;; already in dired-directory, assuming a clean buffer.
827 (if (consp dired-directory)
828 (setq dir (car dired-directory)
829 file-list (cdr dired-directory))
830 (setq dir dired-directory
836 (dired-insert-directory dir dired-actual-switches nil nil t)
841 ;; unless we have an explicit list of files.
842 (dired-insert-directory dir dired-actual-switches
845 (defun dired-align-file (beg end)
851 ;; just big enough for that one output. Thus when dired refreshes one
858 ;; `dired-move-to-filename'. To this end, we limit ourselves to
872 (dired-move-to-filename nil end)))
877 (dired-move-to-filename))
880 (dired-move-to-filename))))
890 (dired-move-to-filename))
944 (eq (dired-move-to-filename) (marker-position file)))
952 (defun dired-insert-directory (dir switches &optional file-list wildcard hdr)
955 If FILE-LIST is non-nil, list only those files.
963 (if (or dired-use-ls-dired (file-remote-p dir))
964 (setq switches (concat "--dired " switches)))
973 (dired-align-file beg (point))))
976 (if (not (string-match "b" dired-actual-switches))
992 (dired-insert-set-properties opoint (point))
993 ;; If we used --dired and it worked, the lines are already indented.
1004 ;; Note that dired-build-subdir-alist will replace the name
1012 (defun dired-insert-set-properties (beg end)
1018 (if (dired-move-to-filename)
1022 (dired-move-to-end-of-filename)
1030 ;; Reverting a dired buffer
1032 (defun dired-revert (&optional arg noconfirm)
1033 "Reread the dired buffer.
1034 Must also be called after `dired-actual-switches' have changed.
1040 (ofile (dired-get-filename nil t))
1041 (mark-alist nil) ; save marked files
1042 (hidden-subdirs (dired-remember-hidden))
1043 (old-subdir-alist (cdr (reverse dired-subdir-alist))) ; except pwd
1047 (setq mark-alist;; only after dired-remember-hidden since this unhides:
1048 (dired-remember-marks (point-min) (point-max)))
1050 (dired-uncache
1051 (if (consp dired-directory) (car dired-directory) dired-directory))
1052 ;; Run dired-after-readin-hook just once, below.
1053 (let ((dired-after-readin-hook nil))
1054 (dired-readin)
1055 (dired-insert-old-subdirs old-subdir-alist))
1056 (dired-mark-remembered mark-alist) ; mark files that were marked
1058 ;; have been reinserted (else omitting in dired-x would omit marked files)
1059 (run-hooks 'dired-after-readin-hook) ; no need to narrow
1060 (or (and ofile (dired-goto-file ofile)) ; move cursor to where it
1062 (dired-move-to-filename)
1065 (if (dired-goto-subdir dir)
1066 (dired-hide-subdir 1))))
1073 ;; Subroutines of dired-revert
1076 (defun dired-remember-marks (beg end)
1077 "Return alist of files and their marks, from BEG to END."
1084 (while (re-search-forward dired-re-mark end t)
1085 (if (setq fil (dired-get-filename nil t))
1090 (defun dired-mark-remembered (alist)
1091 "Mark all files remembered in ALIST.
1099 (if (dired-goto-file fil)
1105 (defun dired-remember-hidden ()
1107 (let ((l dired-subdir-alist) dir pos result)
1118 (defun dired-insert-old-subdirs (old-subdir-alist)
1121 (or (string-match "R" dired-actual-switches)
1129 (dired-uncache dir)
1130 (dired-insert-subdir dir))
1133 (defun dired-uncache (dir)
1135 (let ((handler (find-file-name-handler dir 'dired-uncache)))
1137 (funcall handler 'dired-uncache dir))))
1140 ;; dired mode key bindings and initialization
1142 (defvar dired-mode-map
1144 ;; (define-key dired-mode-map "\C-d" 'dired-flag-file-deletion)
1147 (define-key map [mouse-2] 'dired-mouse-find-file-other-window)
1149 ;; Commands to mark or flag certain categories of files
1150 (define-key map "#" 'dired-flag-auto-save-files)
1151 (define-key map "." 'dired-clean-directory)
1152 (define-key map "~" 'dired-flag-backup-files)
1153 (define-key map "&" 'dired-flag-garbage-files)
1154 ;; Upper case keys (except !) for operating on the marked files
1155 (define-key map "A" 'dired-do-search)
1156 (define-key map "C" 'dired-do-copy)
1157 (define-key map "B" 'dired-do-byte-compile)
1158 (define-key map "D" 'dired-do-delete)
1159 (define-key map "G" 'dired-do-chgrp)
1160 (define-key map "H" 'dired-do-hardlink)
1161 (define-key map "L" 'dired-do-load)
1162 (define-key map "M" 'dired-do-chmod)
1163 (define-key map "O" 'dired-do-chown)
1164 (define-key map "P" 'dired-do-print)
1165 (define-key map "Q" 'dired-do-query-replace-regexp)
1166 (define-key map "R" 'dired-do-rename)
1167 (define-key map "S" 'dired-do-symlink)
1168 (define-key map "T" 'dired-do-touch)
1169 (define-key map "X" 'dired-do-shell-command)
1170 (define-key map "Z" 'dired-do-compress)
1171 (define-key map "!" 'dired-do-shell-command)
1173 (define-key map "=" 'dired-diff)
1174 (define-key map "\M-=" 'dired-backup-diff)
1176 (define-key map "\M-\C-?" 'dired-unmark-all-files)
1177 (define-key map "\M-\C-d" 'dired-tree-down)
1178 (define-key map "\M-\C-u" 'dired-tree-up)
1179 (define-key map "\M-\C-n" 'dired-next-subdir)
1180 (define-key map "\M-\C-p" 'dired-prev-subdir)
1181 ;; move to marked files
1182 (define-key map "\M-{" 'dired-prev-marked-file)
1183 (define-key map "\M-}" 'dired-next-marked-file)
1185 ;; We used to get to the submap via a symbol dired-regexp-prefix,
1189 (define-key map "%u" 'dired-upcase)
1190 (define-key map "%l" 'dired-downcase)
1191 (define-key map "%d" 'dired-flag-files-regexp)
1192 (define-key map "%g" 'dired-mark-files-containing-regexp)
1193 (define-key map "%m" 'dired-mark-files-regexp)
1194 (define-key map "%r" 'dired-do-rename-regexp)
1195 (define-key map "%C" 'dired-do-copy-regexp)
1196 (define-key map "%H" 'dired-do-hardlink-regexp)
1197 (define-key map "%R" 'dired-do-rename-regexp)
1198 (define-key map "%S" 'dired-do-symlink-regexp)
1201 (define-key map "**" 'dired-mark-executables)
1202 (define-key map "*/" 'dired-mark-directories)
1203 (define-key map "*@" 'dired-mark-symlinks)
1204 (define-key map "*%" 'dired-mark-files-regexp)
1205 (define-key map "*c" 'dired-change-marks)
1206 (define-key map "*s" 'dired-mark-subdir-files)
1207 (define-key map "*m" 'dired-mark)
1208 (define-key map "*u" 'dired-unmark)
1209 (define-key map "*?" 'dired-unmark-all-files)
1210 (define-key map "*!" 'dired-unmark-all-marks)
1211 (define-key map "U" 'dired-unmark-all-marks)
1212 (define-key map "*\177" 'dired-unmark-backward)
1213 (define-key map "*\C-n" 'dired-next-marked-file)
1214 (define-key map "*\C-p" 'dired-prev-marked-file)
1215 (define-key map "*t" 'dired-toggle-marks)
1216 ;; Lower keys for commands not operating on all the marked files
1217 (define-key map "a" 'dired-find-alternate-file)
1218 (define-key map "d" 'dired-flag-file-deletion)
1219 (define-key map "e" 'dired-find-file)
1220 (define-key map "f" 'dired-find-file)
1221 (define-key map "\C-m" 'dired-advertised-find-file)
1224 (define-key map "i" 'dired-maybe-insert-subdir)
1225 (define-key map "j" 'dired-goto-file)
1226 (define-key map "k" 'dired-do-kill-lines)
1227 (define-key map "l" 'dired-do-redisplay)
1228 (define-key map "m" 'dired-mark)
1229 (define-key map "n" 'dired-next-line)
1230 (define-key map "o" 'dired-find-file-other-window)
1231 (define-key map "\C-o" 'dired-display-file)
1232 (define-key map "p" 'dired-previous-line)
1234 (define-key map "s" 'dired-sort-toggle-or-edit)
1235 (define-key map "t" 'dired-toggle-marks)
1236 (define-key map "u" 'dired-unmark)
1237 (define-key map "v" 'dired-view-file)
1238 (define-key map "w" 'dired-copy-filename-as-kill)
1239 (define-key map "x" 'dired-do-flagged-delete)
1240 (define-key map "y" 'dired-show-file-type)
1241 (define-key map "+" 'dired-create-directory)
1243 (define-key map "<" 'dired-prev-dirline)
1244 (define-key map ">" 'dired-next-dirline)
1245 (define-key map "^" 'dired-up-directory)
1246 (define-key map " " 'dired-next-line)
1247 (define-key map "\C-n" 'dired-next-line)
1248 (define-key map "\C-p" 'dired-previous-line)
1249 (define-key map [down] 'dired-next-line)
1250 (define-key map [up] 'dired-previous-line)
1252 (define-key map "$" 'dired-hide-subdir)
1253 (define-key map "\M-$" 'dired-hide-all)
1255 (define-key map "?" 'dired-summary)
1256 (define-key map "\177" 'dired-unmark-backward)
1257 (define-key map [remap undo] 'dired-undo)
1258 (define-key map [remap advertised-undo] 'dired-undo)
1259 ;; thumbnail manipulation (image-dired)
1260 (define-key map "\C-td" 'image-dired-display-thumbs)
1261 (define-key map "\C-tt" 'image-dired-tag-files)
1262 (define-key map "\C-tr" 'image-dired-delete-tag)
1263 (define-key map "\C-tj" 'image-dired-jump-thumbnail-buffer)
1264 (define-key map "\C-ti" 'image-dired-dired-display-image)
1265 (define-key map "\C-tx" 'image-dired-dired-display-external)
1266 (define-key map "\C-ta" 'image-dired-display-thumbs-append)
1267 (define-key map "\C-t." 'image-dired-display-thumb)
1268 (define-key map "\C-tc" 'image-dired-dired-comment-files)
1269 (define-key map "\C-tf" 'image-dired-mark-tagged-files)
1270 (define-key map "\C-t\C-t" 'image-dired-dired-insert-marked-thumbs)
1271 (define-key map "\C-te" 'image-dired-dired-edit-comment-and-tags)
1284 '(menu-item "Hide All" dired-hide-all
1287 '(menu-item "Hide/UnHide Subdir" dired-hide-subdir
1290 '(menu-item "Tree Down" dired-tree-down
1293 '(menu-item "Tree Up" dired-tree-up
1296 '(menu-item "Up Directory" dired-up-directory
1299 '(menu-item "Prev Subdir" dired-prev-subdir
1302 '(menu-item "Next Subdir" dired-next-subdir
1305 '(menu-item "Prev Dirline" dired-prev-dirline
1308 '(menu-item "Next Dirline" dired-next-dirline
1311 '(menu-item "Insert This Subdir" dired-maybe-insert-subdir
1318 [menu-bar immediate image-dired-dired-display-external]
1319 '(menu-item "Display Image Externally" image-dired-dired-display-external
1322 [menu-bar immediate image-dired-dired-display-image]
1323 '(menu-item "Display Image" image-dired-dired-display-image
1337 '(menu-item "Compare Directories..." dired-compare-directories
1338 :help "Mark files with different attributes in two dired buffers"))
1340 '(menu-item "Compare with Backup" dired-backup-diff
1343 '(menu-item "Diff..." dired-diff
1346 '(menu-item "View This File" dired-view-file
1349 '(menu-item "Display in Other Window" dired-display-file
1352 '(menu-item "Find in Other Window" dired-find-file-other-window
1355 '(menu-item "Find This File" dired-find-file
1358 '(menu-item "Create Directory..." dired-create-directory))
1366 [menu-bar regexp image-dired-mark-tagged-files]
1367 '(menu-item "Mark From Image Tag..." image-dired-mark-tagged-files
1368 :help "Mark files whose image tags matches regexp"))
1374 '(menu-item "Downcase" dired-downcase
1379 :help "Rename marked files to lower-case name"))
1381 '(menu-item "Upcase" dired-upcase
1384 :help "Rename marked files to upper-case name"))
1386 '(menu-item "Hardlink..." dired-do-hardlink-regexp
1387 :help "Make hard links for files matching regexp"))
1389 '(menu-item "Symlink..." dired-do-symlink-regexp
1391 :help "Make symbolic links for files matching regexp"))
1393 '(menu-item "Rename..." dired-do-rename-regexp
1394 :help "Rename marked files matching regexp"))
1396 '(menu-item "Copy..." dired-do-copy-regexp
1397 :help "Copy marked files matching regexp"))
1399 '(menu-item "Flag..." dired-flag-files-regexp
1400 :help "Flag files matching regexp for deletion"))
1402 '(menu-item "Mark..." dired-mark-files-regexp
1403 :help "Mark files matching regexp for future operations"))
1405 '(menu-item "Mark Containing..." dired-mark-files-containing-regexp
1406 :help "Mark files whose contents matches regexp"))
1412 '(menu-item "Previous Marked" dired-prev-marked-file
1413 :help "Move to previous marked file"))
1415 '(menu-item "Next Marked" dired-next-marked-file
1416 :help "Move to next marked file"))
1418 '(menu-item "Change Marks..." dired-change-marks
1421 '(menu-item "Unmark All" dired-unmark-all-marks))
1423 '(menu-item "Mark Symlinks" dired-mark-symlinks
1427 '(menu-item "Mark Directories" dired-mark-directories
1430 '(menu-item "Mark Old Backups" dired-clean-directory
1433 '(menu-item "Mark Executables" dired-mark-executables
1434 :help "Mark all executable files"))
1435 (define-key map [menu-bar mark garbage-files]
1436 '(menu-item "Flag Garbage Files" dired-flag-garbage-files
1437 :help "Flag unneeded files for deletion"))
1438 (define-key map [menu-bar mark backup-files]
1439 '(menu-item "Flag Backup Files" dired-flag-backup-files
1440 :help "Flag all backup files for deletion"))
1441 (define-key map [menu-bar mark auto-save-files]
1442 '(menu-item "Flag Auto-save Files" dired-flag-auto-save-files
1443 :help "Flag auto-save files for deletion"))
1445 '(menu-item "Flag" dired-flag-file-deletion
1448 '(menu-item "Unmark" dired-unmark
1451 '(menu-item "Mark" dired-mark
1454 '(menu-item "Toggle Marks" dired-toggle-marks
1455 :help "Mark unmarked files, unmark marked ones"))
1464 [menu-bar operate image-dired-delete-tag]
1465 '(menu-item "Delete Image Tag..." image-dired-delete-tag
1466 :help "Delete image tag from current or marked files"))
1468 [menu-bar operate image-dired-tag-files]
1469 '(menu-item "Add Image Tags..." image-dired-tag-files
1470 :help "Add image tags to current or marked files"))
1472 [menu-bar operate image-dired-dired-comment-files]
1473 '(menu-item "Add Image Comment..." image-dired-dired-comment-files
1474 :help "Add image comment to current or marked files"))
1476 [menu-bar operate image-dired-display-thumbs]
1477 '(menu-item "Display Image-Dired" image-dired-display-thumbs
1478 :help "Display image-dired for current or marked image files"))
1484 '(menu-item "Query Replace in Files..." dired-do-query-replace-regexp
1485 :help "Replace regexp in marked files"))
1487 '(menu-item "Search Files..." dired-do-search
1488 :help "Search marked files for regexp"))
1490 '(menu-item "Change Owner..." dired-do-chown
1492 :help "Change the owner of marked files"))
1494 '(menu-item "Change Group..." dired-do-chgrp
1496 :help "Change the group of marked files"))
1498 '(menu-item "Change Mode..." dired-do-chmod
1499 :help "Change mode (attributes) of marked files"))
1501 '(menu-item "Change Timestamp..." dired-do-touch
1502 :help "Change timestamp of marked files"))
1504 '(menu-item "Load" dired-do-load
1505 :help "Load marked Emacs Lisp files"))
1507 '(menu-item "Byte-compile" dired-do-byte-compile
1508 :help "Byte-compile marked Emacs Lisp files"))
1510 '(menu-item "Compress" dired-do-compress
1511 :help "Compress/uncompress marked files"))
1513 '(menu-item "Print..." dired-do-print
1514 :help "Ask for print command and print marked files"))
1516 '(menu-item "Hardlink to..." dired-do-hardlink
1517 :help "Make hard links for current or marked files"))
1519 '(menu-item "Symlink to..." dired-do-symlink
1521 :help "Make symbolic links for current or marked files"))
1523 '(menu-item "Shell Command..." dired-do-shell-command
1524 :help "Run a shell command on each of marked files"))
1526 '(menu-item "Delete" dired-do-delete
1527 :help "Delete current file or all marked files"))
1529 '(menu-item "Rename to..." dired-do-rename
1530 :help "Rename current file or move marked files"))
1532 '(menu-item "Copy to..." dired-do-copy
1533 :help "Copy current file or all marked files"))
1536 "Local keymap for `dired-mode' buffers.")
1540 (put 'dired-mode 'mode-class 'special)
1544 (defun dired-mode (&optional dirname switches)
1547 In Dired, you are \"editing\" a list of the files in a directory and
1550 \"Editing\" means that you can run shell commands on files, visit,
1553 files for later commands or \"flag\" them for deletion, either file
1554 by file or all files matching certain criteria.
1555 You can move using the usual cursor motion commands.\\<dired-mode-map>
1557 Instead, type \\[dired-flag-file-deletion] to flag a file for Deletion.
1558 Type \\[dired-mark] to Mark a file or subdirectory for later commands.
1559 Most commands operate on the marked files and use the current file
1560 if no files are marked. Use a numeric prefix argument to operate on
1561 the next ARG (or previous -ARG if ARG<0) files, or just `1'
1563 Mark-using commands display a list of failures afterwards. Type \\[dired-summary]
1565 Type \\[dired-unmark] to Unmark a file or all files of a subdirectory.
1566 Type \\[dired-unmark-backward] to back up one line and unflag.
1567 Type \\[dired-do-flagged-delete] to eXecute the deletions requested.
1568 Type \\[dired-advertised-find-file] to Find the current line's file
1569 (or dired it in another buffer, if it is a directory).
1570 Type \\[dired-find-file-other-window] to find file or dired directory in Other window.
1571 Type \\[dired-maybe-insert-subdir] to Insert a subdirectory in this buffer.
1572 Type \\[dired-do-rename] to Rename a file or move the marked files to another directory.
1573 Type \\[dired-do-copy] to Copy files.
1574 Type \\[dired-sort-toggle-or-edit] to toggle Sorting by name/date or change the `ls' switches.
1581 directories again, type \\[dired-do-redisplay] \
1582 to relist a single or the marked files or a
1583 subdirectory, or type \\[dired-build-subdir-alist] to parse the buffer
1589 `dired-listing-switches'
1590 `dired-trivial-filenames'
1591 `dired-shrink-to-fit'
1592 `dired-marker-char'
1593 `dired-del-marker'
1594 `dired-keep-marker-rename'
1595 `dired-keep-marker-copy'
1596 `dired-keep-marker-hardlink'
1597 `dired-keep-marker-symlink'
1601 `dired-before-readin-hook'
1602 `dired-after-readin-hook'
1603 `dired-mode-hook'
1604 `dired-load-hook'
1607 \\{dired-mode-map}"
1608 ;; Not to be called interactively (e.g. dired-directory will be set
1611 (use-local-map dired-mode-map)
1612 (dired-advertise) ; default-directory is already set
1613 (setq major-mode 'dired-mode
1621 (function dired-revert))
1623 (function dired-buffer-stale-p))
1626 (set (make-local-variable 'dired-directory)
1630 (expand-file-name (if (listp dired-directory)
1631 (car dired-directory)
1632 dired-directory)))
1633 (set (make-local-variable 'dired-actual-switches)
1634 (or switches dired-listing-switches))
1636 '(dired-font-lock-keywords t nil nil beginning-of-line))
1638 'dired-desktop-buffer-misc-data)
1639 (setq dired-switches-alist nil)
1640 (dired-sort-other dired-actual-switches t)
1643 (append dired-dnd-protocol-alist dnd-protocol-alist)))
1644 (run-mode-hooks 'dired-mode-hook))
1647 ;; Idiosyncratic dired commands that don't deal with marks.
1649 (defun dired-summary ()
1650 "Summarize basic Dired commands and show recent dired errors."
1652 (dired-why)
1657 (defun dired-undo ()
1658 "Undo in a dired buffer.
1659 This doesn't recover lost files, it just undoes changes in the buffer itself.
1664 (dired-build-subdir-alist)
1665 (message "Change in dired buffer undone.
1666 Actual changes in files cannot be undone by Emacs."))
1668 (defun dired-next-line (arg)
1673 (dired-move-to-filename))
1675 (defun dired-previous-line (arg)
1680 (dired-move-to-filename))
1682 (defun dired-next-dirline (arg &optional opoint)
1687 (re-search-forward dired-re-dir nil t arg)
1689 (re-search-backward dired-re-dir nil t (- arg)))
1690 (dired-move-to-filename) ; user may type `i' or `f'
1694 (defun dired-prev-dirline (arg)
1697 (dired-next-dirline (- arg)))
1699 (defun dired-up-directory (&optional other-window)
1704 (let* ((dir (dired-current-directory))
1706 (or (dired-goto-file (directory-file-name dir))
1707 ;; Only try dired-goto-subdir if buffer has more than one dir.
1708 (and (cdr dired-subdir-alist)
1709 (dired-goto-subdir up))
1712 (dired-other-window up)
1713 (dired up))
1714 (dired-goto-file dir)))))
1716 (defun dired-get-file-for-visit ()
1719 ;; We pass t for second arg so that we don't get error for `.' and `..'.
1720 (let ((raw (dired-get-filename nil t))
1729 (error "File no longer exists; type `g' to update dired buffer")))))
1732 (defalias 'dired-advertised-find-file 'dired-find-file)
1733 (defun dired-find-file ()
1736 ;; Bind `find-file-run-dired' so that the command works on directories
1738 (let ((find-file-run-dired t))
1739 (find-file (dired-get-file-for-visit))))
1741 (defun dired-find-alternate-file ()
1742 "In Dired, visit this file or directory instead of the dired buffer."
1745 (find-alternate-file (dired-get-file-for-visit)))
1747 ;;;###autoload (put 'dired-find-alternate-file 'disabled t)
1749 (defun dired-mouse-find-file-other-window (event)
1760 (setq file (dired-get-file-for-visit)))
1762 (or (and (cdr dired-subdir-alist)
1763 (dired-goto-subdir file))
1766 (dired-other-window file)))
1770 (defun dired-view-file ()
1775 (let ((file (dired-get-file-for-visit)))
1777 (or (and (cdr dired-subdir-alist)
1778 (dired-goto-subdir file))
1779 (dired file))
1782 (defun dired-find-file-other-window ()
1785 (find-file-other-window (dired-get-file-for-visit)))
1787 (defun dired-display-file ()
1790 (display-buffer (find-file-noselect (dired-get-file-for-visit))))
1795 (defun dired-get-filename (&optional localp no-error-if-not-filep)
1807 (if (setq p1 (dired-move-to-filename (not no-error-if-not-filep)))
1808 (setq p2 (dired-move-to-end-of-filename no-error-if-not-filep))))
1814 ;; Unquote names quoted by ls or by dired-insert-directory.
1822 (or (dired-string-replace-match
1850 ;; For instance, .gz files when auto-compression-mode is on.
1851 (if (and handler (not (get handler 'safe-magic)))
1856 ((equal (dired-current-directory) "/")
1857 (setq file (concat (dired-current-directory localp) file))
1861 ;; For instance, .gz files when auto-compression-mode is on.
1862 (if (and handler (not (get handler 'safe-magic)))
1866 (concat (dired-current-directory localp) file)))))
1868 (defun dired-string-replace-match (regexp string newtext
1885 (defun dired-make-absolute (file &optional dir)
1887 ;; We can't always use expand-file-name as this would get rid of `.'
1892 ;; dired-get-filename.
1895 (defun dired-make-relative (file &optional dir ignore)
1911 ;;; Functions for finding the file name in a dired buffer line.
1913 (defvar dired-permission-flags-regexp
1919 (defun dired-move-to-filename (&optional raise-error eol)
1925 ;; First try assuming `ls --dired' was used.
1926 (let ((change (next-single-property-change (point) 'dired-filename nil eol)))
1932 ((re-search-forward dired-permission-flags-regexp eol t)
1941 (defun dired-move-to-end-of-filename (&optional no-error)
1945 ;; (dired-move-to-filename t).
1948 (if (get-text-property (point) 'dired-filename)
1949 (goto-char (next-single-property-change (point) 'dired-filename))
1952 (setq used-F (string-match "F" dired-actual-switches)
1965 dired-permission-flags-regexp nil t)
1984 dired-ls-F-marks-symlinks
1999 "File line is hidden, type \\[dired-hide-subdir] to unhide")
2009 (defun dired-copy-filename-as-kill (&optional arg)
2010 "Copy names of marked (or next ARG) files into the kill ring.
2012 With a zero prefix arg, use the absolute file name of each marked file.
2013 With \\[universal-argument], use the file name relative to the dired buffer's
2017 prefix arg and marked files are ignored in this case.
2022 (or (dired-get-subdir)
2026 (dired-get-marked-files))
2028 (dired-get-marked-files t))
2030 (dired-get-marked-files
2032 (dired-get-marked-files 'no-dir))
2043 (defun dired-buffers-for-dir (dir &optional file)
2044 ;; Return a list of buffers that dired DIR (top level or in-situ subdir).
2048 ;; As a side effect, killed dired buffers for DIR are removed from
2049 ;; dired-buffers.
2051 (let ((alist dired-buffers) result elt buf)
2056 (if (dired-in-this-tree dir (car elt))
2058 (and (assoc dir dired-subdir-alist)
2061 (file-name-nondirectory dired-directory)))
2063 (string-match (dired-glob-regexp wildcards)
2067 (setq dired-buffers (delq elt dired-buffers)))
2071 (defun dired-glob-regexp (pattern)
2107 (defun dired-advertise ()
2108 ;;"Advertise in variable `dired-buffers' that we dired `default-directory'."
2111 (if (memq (current-buffer) (dired-buffers-for-dir expanded-default))
2113 (setq dired-buffers
2115 dired-buffers)))))
2117 (defun dired-unadvertise (dir)
2118 ;; Remove DIR from the buffer alist in variable dired-buffers.
2121 ;; Removing is also done as a side-effect in dired-buffer-for-dir.
2122 (setq dired-buffers
2123 (delq (assoc (expand-file-name dir) dired-buffers) dired-buffers)))
2130 (defun dired-in-this-tree (file dir)
2135 (defun dired-normalize-subdir (dir)
2137 ;; dired-get-filename must be able to make a valid file name from a
2144 (defun dired-get-subdir ()
2148 (let ((cur-dir (dired-current-directory)))
2151 (dired-get-subdir-min (assoc cur-dir
2152 dired-subdir-alist))))
2155 ;(defun dired-get-subdir-min (elt)
2157 ;; can't use macro, must be redefinable for other alist format in dired-nstd.
2158 (defalias 'dired-get-subdir-min 'cdr)
2160 (defun dired-get-subdir-max (elt)
2162 (goto-char (dired-get-subdir-min elt))
2163 (dired-subdir-max)))
2165 (defun dired-clear-alist ()
2166 (while dired-subdir-alist
2167 (set-marker (dired-get-subdir-min (car dired-subdir-alist)) nil)
2168 (setq dired-subdir-alist (cdr dired-subdir-alist))))
2170 (defun dired-subdir-index (dir)
2173 (let (found (index 0) (alist dired-subdir-alist))
2180 (defun dired-next-subdir (arg &optional no-error-if-not-found no-skip)
2184 ;; position was found in dired-subdir-alist.
2186 (let ((this-dir (dired-current-directory))
2189 (setq index (- (dired-subdir-index this-dir) arg))
2191 (dired-get-subdir-min (nth index dired-subdir-alist))))
2201 (defun dired-build-subdir-alist (&optional switches)
2202 "Build `dired-subdir-alist' by parsing the buffer.
2205 instead of `dired-actual-switches'."
2207 (dired-clear-alist)
2212 (switches (or switches dired-actual-switches))
2221 (setq dired-subdir-alist nil)
2222 (while (re-search-forward dired-subdir-regexp nil t)
2229 (save-match-data (looking-at dired-re-perms)))
2245 (dired-alist-add-1 new-dir-name
2255 dired-subdir-alist))
2257 (defun dired-alist-add-1 (dir new-marker)
2259 (setq dired-subdir-alist
2260 (cons (cons (dired-normalize-subdir dir) new-marker)
2261 dired-subdir-alist)))
2263 (defun dired-goto-next-nontrivial-file ()
2265 (dired-goto-next-file);; so there is a file to compare with
2266 (if (stringp dired-trivial-filenames)
2268 (string-match dired-trivial-filenames
2270 (or (dired-get-filename nil t) ""))))
2272 (dired-move-to-filename))))
2274 (defun dired-goto-next-file ()
2275 (let ((max (1- (dired-subdir-max))))
2276 (while (and (not (dired-move-to-filename)) (< (point) max))
2279 (defun dired-goto-file (file)
2280 "Go to line describing file FILE in this dired buffer."
2290 (dired-current-directory))))
2297 ;; The hair here is to get the result of dired-goto-subdir
2301 (and (cdr dired-subdir-alist)
2302 (dired-goto-subdir dir)))
2305 (boundary (dired-subdir-max)))
2318 (if (equal base (dired-get-filename 'no-dir t))
2323 (setq found (dired-move-to-filename))
2331 (defun dired-initial-position (dirname)
2334 ;; You may redefine this function as you wish, e.g. like in dired-x.el.
2336 (if dired-trivial-filenames (dired-goto-next-nontrivial-file)))
2339 ;; These are hooks which make tree dired work.
2340 ;; They are in this file because other parts of dired need to call them.
2341 ;; But they don't call the rest of tree dired unless there are subdirs loaded.
2346 ;; dired-get-filename. Make it a defsubst?
2347 (defun dired-current-directory (&optional localp)
2352 (alist (or dired-subdir-alist
2353 ;; probably because called in a non-dired buffer
2360 alist (if (<= (dired-get-subdir-min elt) here)
2364 (dired-make-relative dir default-directory)
2370 (defun dired-subdir-max ()
2372 (if (or (null (cdr dired-subdir-alist)) (not (dired-next-subdir 1 t t)))
2377 ;; Deleting files
2379 (defcustom dired-recursive-deletes nil ; Default only delete empty directories.
2391 :group 'dired)
2394 (defvar dired-re-no-dot "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")
2396 ;; Delete file, possibly delete a directory and all its files.
2397 ;; This function is usefull outside of dired. One could change it's name
2399 (defun dired-delete-file (file &optional recursive) "\
2406 (let (files)
2413 (setq files
2414 (directory-files file t dired-re-no-dot)) ; Not empty.
2417 (dired-make-relative file)))))
2419 (while files ; Recursively delete (possibly asking).
2420 (dired-delete-file (car files) recursive)
2421 (setq files (cdr files))))
2424 (defun dired-do-flagged-delete (&optional nomessage)
2425 "In Dired, delete the files flagged for deletion.
2427 if there are no flagged files.
2428 `dired-recursive-deletes' controls whether
2431 (let* ((dired-marker-char dired-del-marker)
2432 (regexp (dired-marker-regexp))
2436 (dired-internal-do-deletions
2438 (dired-map-over-marks (cons (dired-get-filename) (point))
2444 (defun dired-do-delete (&optional arg)
2445 "Delete all marked (or next ARG) files.
2446 `dired-recursive-deletes' controls whether
2449 ;; dired-do-flagged-delete.
2451 (dired-internal-do-deletions
2453 (dired-map-over-marks (cons (dired-get-filename) (point))
2457 (defvar dired-deletion-confirmer 'yes-or-no-p) ; or y-or-n-p?
2459 (defun dired-internal-do-deletions (l arg)
2460 ;; L is an alist of files to delete, with their buffer positions.
2463 ;; (car L) *must* be the *last* (bottommost) file in the dired buffer.
2466 ;; Also, for subdirs in natural order, a subdir's files are deleted
2468 (let ((files (mapcar (function car) l))
2472 (setq files (nreverse (mapcar (function dired-make-relative) files)))
2473 (if (dired-mark-pop-up
2474 " *Deletions*" 'delete files dired-deletion-confirmer
2475 (format "Delete %s " (dired-mark-prompt arg files)))
2477 (let (failures);; files better be in reverse order for this loop!
2483 (dired-delete-file fn dired-recursive-deletes)
2484 ;; if we get here, removing worked
2487 (dired-fun-in-all-buffers
2489 (function dired-delete-entry) fn))
2491 (dired-log "%s\n" err)
2495 (message "%d deletion%s done" count (dired-plural-s count))
2496 (dired-log-summary
2499 (dired-plural-s count))
2502 (dired-move-to-filename))
2504 (defun dired-fun-in-all-buffers (directory file fun &rest args)
2505 ;; In all buffers dired'ing DIRECTORY, run FUN with ARGS.
2511 (dolist (buf (dired-buffers-for-dir (expand-file-name directory)
2519 (defun dired-delete-entry (file)
2521 (and (dired-goto-file file)
2525 (dired-clean-up-after-deletion file))
2527 ;; This is a separate function for the sake of dired-x.el.
2528 (defun dired-clean-up-after-deletion (fn)
2530 (save-excursion (and (cdr dired-subdir-alist)
2531 (dired-goto-subdir fn)
2532 (dired-kill-subdir))))
2537 (defun dired-marker-regexp ()
2538 (concat "^" (regexp-quote (char-to-string dired-marker-char))))
2540 (defun dired-plural-s (count)
2543 (defun dired-mark-prompt (arg files)
2545 ;; name, or the marker and a count of marked files.
2546 (let ((count (length files)))
2548 (car files)
2553 ;;(format "[%s %d files]" (if (> arg 0) "next" "previous")
2555 (format "[next %d files]" arg)
2556 (format "%c [%d files]" dired-marker-char count)))))
2558 (defun dired-pop-to-buffer (buf)
2560 ;; If dired-shrink-to-fit is t, make its window fit its contents.
2561 (if (not dired-shrink-to-fit)
2562 (pop-to-buffer (get-buffer-create buf))
2567 ((and (> (window-height (setq w2 (get-largest-window)))
2572 ((and (> (window-height (setq w2 (get-lru-window)))
2599 (defcustom dired-no-confirm nil
2604 :group 'dired
2612 (defun dired-mark-pop-up (bufname op-symbol files function &rest args)
2613 "Return FUNCTION's result on ARGS after showing which files are marked.
2616 This uses function `dired-pop-to-buffer' to do that.
2618 FUNCTION should not manipulate files, just read input
2621 OP-SYMBOL is a member of the list in `dired-no-confirm'.
2622 FILES is the list of marked files. It can also be (t FILENAME)
2623 in the case of one marked file, to distinguish that from using
2626 (if (or (eq dired-no-confirm t)
2627 (memq op-symbol dired-no-confirm)
2629 (= (length files) 1))
2631 (with-current-buffer (get-buffer-create bufname)
2635 ;; just one file that was marked, rather than the current line file.
2636 (dired-format-columns-of-files (if (eq (car files) t) (cdr files) files))
2640 (dired-pop-to-buffer bufname)
2643 (defun dired-format-columns-of-files (files)
2645 ;; i.e., (car files) = first file in buffer.
2647 (let* ((maxlen (+ 2 (apply 'max (mapcar 'length files))))
2650 (nfiles (length files))
2655 (setq files (nconc (copy-sequence files) ; fill up with empty fns
2657 (setcdr (nthcdr (1- (length files)) files) files) ; make circular
2661 (insert (car files))
2662 (setq files (nthcdr rows files)
2667 files (cdr files)))
2673 (defun dired-repeat-over-lines (arg function)
2680 (while (and (not (eobp)) (dired-between-files)) (forward-line 1))
2691 (while (and (not (bobp)) (dired-between-files)) (forward-line -1))
2695 (dired-move-to-filename)))
2697 (defun dired-between-files ()
2701 (save-excursion (not (dired-move-to-filename))))
2703 (defun dired-next-marked-file (arg &optional wrap opoint)
2704 "Move to the next marked file, wrapping around the end of the buffer."
2708 (re-search-forward dired-re-mark nil t arg)
2710 (re-search-backward dired-re-mark nil t (- arg)))
2711 (dired-move-to-filename)
2715 (error "No next marked file"))
2716 (message "(Wraparound for next marked file)")
2718 (dired-next-marked-file arg nil opoint))))
2720 (defun dired-prev-marked-file (arg &optional wrap)
2721 "Move to the previous marked file, wrapping around the end of the buffer."
2723 (dired-next-marked-file (- arg) wrap))
2725 (defun dired-file-marker (file)
2728 (and (dired-goto-file file)
2734 (defun dired-mark-files-in-region (start end)
2741 (while (and (< (point) end) (dired-between-files))
2743 (if (and (not (looking-at dired-re-dot))
2744 (dired-get-filename nil t))
2747 (insert dired-marker-char)))
2750 (defun dired-mark (arg)
2751 "Mark the current (or next ARG) files.
2752 If on a subdir headerline, mark all its files except `.' and `..'.
2754 Use \\[dired-unmark-all-files] to remove all marks
2755 and \\[dired-unmark] on a subdir to remove the marks in
2758 (if (dired-get-subdir)
2759 (save-excursion (dired-mark-subdir-files))
2761 (dired-repeat-over-lines
2763 (function (lambda () (delete-char 1) (insert dired-marker-char)))))))
2765 (defun dired-unmark (arg)
2766 "Unmark the current (or next ARG) files.
2767 If looking at a subdir, unmark all its files except `.' and `..'."
2769 (let ((dired-marker-char ?\040))
2770 (dired-mark arg)))
2772 (defun dired-flag-file-deletion (arg)
2776 If on a subdir headerline, mark all its files except `.' and `..'."
2778 (let ((dired-marker-char dired-del-marker))
2779 (dired-mark arg)))
2781 (defun dired-unmark-backward (arg)
2785 (dired-unmark (- arg)))
2787 (defun dired-toggle-marks ()
2788 "Toggle marks: marked files become unmarked, and vice versa.
2789 Files marked with other flags (such as `D') are not affected.
2797 (or (dired-between-files)
2798 (looking-at dired-re-dot)
2805 (list ?\040 dired-marker-char)
2806 (list dired-marker-char ?\040))))
2810 ;;; Commands to mark or flag files based on their characteristics or names.
2812 (defvar dired-regexp-history nil
2815 (defun dired-read-regexp (prompt)
2816 (read-from-minibuffer prompt nil nil nil 'dired-regexp-history))
2818 (defun dired-mark-files-regexp (regexp &optional marker-char)
2819 "Mark all files matching REGEXP for use in later commands.
2821 `.' and `..' are never marked.
2824 object files--just `.o' will mark more than you might think."
2826 (list (dired-read-regexp (concat (if current-prefix-arg "Unmark" "Mark")
2827 " files (regexp): "))
2829 (let ((dired-marker-char (or marker-char dired-marker-char)))
2830 (dired-mark-if
2831 (and (not (looking-at dired-re-dot))
2833 (let ((fn (dired-get-filename nil t)))
2837 (defun dired-mark-files-containing-regexp (regexp &optional marker-char)
2838 "Mark all files with contents containing REGEXP for use in later commands.
2840 `.' and `..' are never marked."
2842 (list (dired-read-regexp (concat (if current-prefix-arg "Unmark" "Mark")
2843 " files containing (regexp): "))
2845 (let ((dired-marker-char (or marker-char dired-marker-char)))
2846 (dired-mark-if
2847 (and (not (looking-at dired-re-dot))
2849 (let ((fn (dired-get-filename nil t)))
2852 (let ((prebuf (get-file-buffer fn)))
2855 ;; Grep might be better if there are a lot of files
2868 (defun dired-flag-files-regexp (regexp)
2869 "In Dired, flag all files containing the specified REGEXP for deletion.
2873 (interactive (list (dired-read-regexp "Flag for deletion (regexp): ")))
2874 (dired-mark-files-regexp regexp dired-del-marker))
2876 (defun dired-mark-symlinks (unflag-p)
2878 With prefix argument, unflag all those files."
2880 (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char)))
2881 (dired-mark-if (looking-at dired-re-sym) "symbolic link")))
2883 (defun dired-mark-directories (unflag-p)
2885 With prefix argument, unflag all those files."
2887 (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char)))
2888 (dired-mark-if (and (looking-at dired-re-dir)
2889 (not (looking-at dired-re-dot)))
2892 (defun dired-mark-executables (unflag-p)
2893 "Mark all executable files.
2894 With prefix argument, unflag all those files."
2896 (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char)))
2897 (dired-mark-if (looking-at dired-re-exe) "executable file")))
2899 ;; dired-x.el has a dired-mark-sexp interactive command: mark
2900 ;; files for which PREDICATE returns non-nil.
2902 (defun dired-flag-auto-save-files (&optional unflag-p)
2903 "Flag for deletion files whose names suggest they are auto save files.
2904 A prefix argument says to unflag those files instead."
2906 (let ((dired-marker-char (if unflag-p ?\040 dired-del-marker)))
2907 (dired-mark-if
2916 ;; appear on real auto-save files.
2921 (not (looking-at dired-re-dir))
2922 (let ((fn (dired-get-filename t t)))
2927 (defcustom dired-garbage-files-regexp
2929 ;; files, not just TeX stuff. -- fx
2933 "Regular expression to match \"garbage\" files for `dired-flag-garbage-files'."
2935 :group 'dired)
2937 (defun dired-flag-garbage-files ()
2938 "Flag for deletion all files that match `dired-garbage-files-regexp'."
2940 (dired-flag-files-regexp dired-garbage-files-regexp))
2942 (defun dired-flag-backup-files (&optional unflag-p)
2943 "Flag all backup files (names ending with `~') for deletion.
2944 With prefix argument, unflag these files."
2946 (let ((dired-marker-char (if unflag-p ?\s dired-del-marker)))
2947 (dired-mark-if
2955 ;; appear on real backup files.
2959 (not (looking-at dired-re-dir))
2960 (let ((fn (dired-get-filename t t)))
2964 (defun dired-change-marks (&optional old new)
2966 OLD and NEW are both characters used to mark files."
2982 (dired-get-filename 'no-dir t))
2987 (defun dired-unmark-all-marks ()
2988 "Remove all marks from all files in the dired buffer."
2990 (dired-unmark-all-files ?\r))
2992 (defun dired-unmark-all-files (mark &optional arg)
2996 With prefix arg, query for each marked file.
3005 `!' to unmark all remaining files with no more questions."))
3008 (re-search-forward dired-re-mark nil t)
3011 (let ((file (dired-get-filename t t)))
3013 (dired-query 'query "Unmark file `%s'? "
3023 ;; Logging failures operating on files, and showing the results.
3025 (defvar dired-log-buffer "*Dired log*")
3027 (defun dired-why ()
3032 (if (get-buffer dired-log-buffer)
3034 (window (display-buffer (get-buffer dired-log-buffer))))
3044 (defun dired-log (log &rest args)
3048 ;; End each bunch of errors with (dired-log t):
3052 (with-current-buffer (get-buffer-create dired-log-buffer)
3070 (defun dired-log-summary (string failures)
3077 (with-current-buffer dired-log-buffer
3086 (dired-log (concat "\n" string "\n"))
3087 (dired-log t))
3096 (defvar dired-ls-sorting-switches "SXU"
3103 variable `dired-listing-switches'. To temporarily override the listing
3104 format, use `\\[universal-argument] \\[dired]'.")
3106 (defvar dired-sort-by-date-regexp
3107 (concat "^-[^" dired-ls-sorting-switches
3108 "]*t[^" dired-ls-sorting-switches "]*$")
3111 (defvar dired-sort-by-name-regexp
3112 (concat "^-[^t" dired-ls-sorting-switches "]+$")
3115 (defvar dired-sort-inhibit nil
3117 The idea is to set this buffer-locally in special dired buffers.")
3119 (defun dired-sort-set-modeline ()
3120 ;; Set modeline display according to dired-actual-switches.
3124 (when (eq major-mode 'dired-mode)
3128 dired-sort-by-name-regexp dired-actual-switches)
3131 dired-sort-by-date-regexp dired-actual-switches)
3134 (concat "Dired " dired-actual-switches)))))
3137 (defun dired-sort-toggle-or-edit (&optional arg)
3138 "Toggle between sort by date/name and refresh the dired buffer.
3141 (when dired-sort-inhibit
3142 (error "Cannot sort this dired buffer"))
3144 (dired-sort-other
3145 (read-string "ls switches (must contain -l): " dired-actual-switches))
3146 (dired-sort-toggle)))
3148 (defun dired-sort-toggle ()
3150 (setq dired-actual-switches
3152 (if (string-match " " dired-actual-switches)
3154 (if (string-match " -t\\'" dired-actual-switches)
3155 (substring dired-actual-switches 0 (match-beginning 0))
3156 (concat dired-actual-switches " -t"))
3160 (dired-replace-in-string (concat "[-lt"
3161 dired-ls-sorting-switches "]")
3163 dired-actual-switches)
3164 (if (string-match (concat "[t" dired-ls-sorting-switches "]")
3165 dired-actual-switches)
3168 (dired-sort-set-modeline)
3171 ;; Some user code loads dired especially for this.
3173 (defun dired-replace-in-string (regexp newtext string)
3184 (defun dired-sort-other (switches &optional no-revert)
3185 "Specify new `ls' SWITCHES for current dired buffer.
3186 Values matching `dired-sort-by-date-regexp' or `dired-sort-by-name-regexp'
3189 (dired-sort-R-check switches)
3190 (setq dired-actual-switches switches)
3191 (dired-sort-set-modeline)
3194 (defvar dired-subdir-alist-pre-R nil
3195 "Value of `dired-subdir-alist' before -R switch added.")
3196 (make-variable-buffer-local 'dired-subdir-alist-pre-R)
3198 (defun dired-sort-R-check (switches)
3200 Saves `dired-subdir-alist' when R is set and restores saved value
3202 To be called first in body of `dired-sort-other', etc."
3205 (not (string-match "R" dired-actual-switches)))
3206 ;; Adding -R to ls switches -- save `dired-subdir-alist':
3207 (setq dired-subdir-alist-pre-R dired-subdir-alist))
3208 ((and (string-match "R" dired-actual-switches)
3212 (setq dired-subdir-alist
3213 (if dired-subdir-alist-pre-R
3215 (while dired-subdir-alist-pre-R
3216 (if (assoc (caar dired-subdir-alist-pre-R)
3217 dired-subdir-alist)
3220 (cons (car dired-subdir-alist-pre-R)
3222 (setq dired-subdir-alist-pre-R
3223 (cdr dired-subdir-alist-pre-R)))
3227 (list (car (reverse dired-subdir-alist))))))))
3233 (defcustom dired-recursive-copies nil
3244 :group 'dired)
3246 (defun dired-dnd-popup-notice ()
3248 "Recursive copies not enabled.\nSee variable dired-recursive-copies."))
3251 (defun dired-dnd-do-ask-action (uri)
3252 ;; No need to get actions and descriptions from the source,
3264 (dired-dnd-handle-local-file uri action)
3267 (defun dired-dnd-handle-local-file (uri action)
3268 "Copy, move or link a file to the dired directory.
3271 (require 'dired-aux)
3272 (let* ((from (dnd-get-local-file-name uri t))
3273 (to (if from (concat (dired-current-directory)
3280 ;; If copying a directory and dired-recursive-copies is nil,
3281 ;; dired-copy-file silently fails. Pop up a notice.
3283 (not dired-recursive-copies))
3284 (dired-dnd-popup-notice)
3286 (dired-copy-file from to 1)
3287 (dired-relist-entry to)
3291 (dired-rename-file from to 1)
3292 (dired-relist-entry to)
3297 (dired-relist-entry to)
3301 (dired-dnd-do-ask-action uri))
3305 (defun dired-dnd-handle-file (uri action)
3306 "Copy, move or link a file to the dired directory if it is a local file.
3310 (let ((local-file (dnd-get-local-file-uri uri)))
3311 (if local-file (dired-dnd-handle-local-file local-file action)
3320 (defun dired-desktop-buffer-misc-data (desktop-dirname)
3323 ;; Value of `dired-directory'.
3324 (if (consp dired-directory)
3325 ;; Directory name followed by list of files.
3326 (cons (desktop-file-name (car dired-directory) desktop-dirname)
3327 (cdr dired-directory))
3329 (desktop-file-name dired-directory desktop-dirname))
3330 ;; Subdirectories in `dired-subdir-alist'.
3335 dired-subdir-alist)))))
3337 (defun dired-restore-desktop-buffer (desktop-buffer-file-name
3340 "Restore a dired buffer specified in a desktop file."
3341 ;; First element of `desktop-buffer-misc' is the value of `dired-directory'.
3343 ;; a directory name followed by list of files.
3344 (let* ((dired-dir (car desktop-buffer-misc))
3345 (dir (if (consp dired-dir) (car dired-dir) dired-dir)))
3348 (dired dired-dir)
3350 ;; from `dired-subdir-alist'.
3351 (mapcar 'dired-maybe-insert-subdir (cdr desktop-buffer-misc))
3358 '(dired-mode . dired-restore-desktop-buffer))
3363 (load "dired-vms"))
3365 (provide 'dired)
3367 (run-hooks 'dired-load-hook) ; for your customizations
3370 ;;; dired.el ends here