• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.10/emacs-93/emacs/lisp/

Lines Matching +defs:dired +defs:file +defs:marker

0 ;;; dired.el --- directory-browsing commands
10 ;; This file is part of GNU Emacs.
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
32 ;; Rewritten in 1990/1991 to add tree features, file marking and
40 (defgroup dired nil
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.")
67 ; Don't use absolute file names as /bin should be in any PATH and people
72 (defvar dired-chown-program
75 (if (file-exists-p "/usr/sbin/chown")
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.
110 A value of t means move to first file."
114 :group 'dired)
117 (defcustom dired-keep-marker-rename t
125 :group 'dired-mark)
128 (defcustom dired-keep-marker-copy ?C
134 :group 'dired-mark)
137 (defcustom dired-keep-marker-hardlink ?H
143 :group 'dired-mark)
146 (defcustom dired-keep-marker-symlink ?Y
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.
160 The target is used in the prompt for file copy, rename etc."
162 :group 'dired)
165 (defcustom dired-copy-preserve-time t
166 "*If non-nil, Dired preserves the last-modified time in a file copy.
169 :group 'dired)
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
195 "Hook run after each time a file or directory is read by Dired.
196 After each listing of a file or directory, this hook is run
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))
226 ;; The code depends on dynamic scoping on the marker char.
230 (defvar dired-del-marker ?D
233 (defvar dired-shrink-to-fit t
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
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]*"
253 "Regexp for optional initial inode and file size as made by `ls -i -s'.")
259 (defvar dired-re-mark "^[^ \n]")
261 ;; Important: the match ends just after the marker."
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
324 :group 'dired-faces
326 (defvar dired-marked-face 'dired-marked
329 (defface dired-flagged
332 :group 'dired-faces
334 (defvar dired-flagged-face 'dired-flagged
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
364 :group 'dired-faces
366 (defvar dired-ignored-face 'dired-ignored
369 (defvar dired-font-lock-keywords
373 (list dired-subdir-regexp '(1 dired-header-face))
376 (list dired-re-mark '(0 dired-mark-face))
379 ;; file name itself. We search for Dired defined regexps, and then use the
380 ;; Dired defined function `dired-move-to-filename' before searching for the
381 ;; simple regexp ".+". It is that regexp which matches the file name.
384 (list (concat "^[" (char-to-string dired-marker-char) "]")
385 '(".+" (dired-move-to-filename) nil (0 dired-marked-face)))
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)))
400 ;; However, we don't need to highlight the file name, only the
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)))
422 ;; start of that file name. So we do this complex MATCH-ANCHORED form.
424 '(".+" (dired-move-to-filename) nil (0 dired-ignored-face))))
439 (dired-move-to-filename)))
440 nil (0 dired-ignored-face))))
449 (defmacro dired-mark-if (predicate msg)
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)
476 (defmacro dired-map-over-marks (body arg &optional show-progress
479 If no marked file could be found, execute BODY on the current line.
484 If ARG is otherwise non-nil, use current file instead.
486 redisplay the dired buffer after each file is processed.
494 If DISTINGUISH-ONE-MARKED is non-nil, then if we find just one marked file,
505 (dired-repeat-over-lines
513 ;; non-nil, non-integer ARG means use current file:
515 (let ((regexp (dired-marker-regexp)) next-position)
518 ;; remember position of next marked file before BODY
519 ;; can insert lines before the just found file,
520 ;; confusing us by finding the same marked file again
523 (point-marker))
532 (set-marker next-position nil)
534 (point-marker)))))
541 (dired-move-to-filename)))
543 (defun dired-get-marked-files (&optional localp arg filter distinguish-one-marked)
546 first marked file.
547 Values returned are normally absolute file names.
548 Optional arg LOCALP as in `dired-get-filename'.
551 If ARG is otherwise non-nil, use file. Usually ARG comes from
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)
569 (dolist (file all-of-them)
570 (if (funcall filter file)
571 (push file result)))
575 ;; The dired command
577 (defun dired-read-dir-and-switches (str)
582 dired-listing-switches))
586 (if (next-read-file-uses-dialog-p)
589 (read-file-name (format "Dired %s(directory): " str)
592 ;;;###autoload (define-key ctl-x-map "d" 'dired)
594 (defun dired (dirname &optional switches)
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."
638 (string= (file-name-as-directory dirname) dirname))
639 (setq dirname (abbreviate-file-name
640 (expand-file-name (directory-file-name dirname))))
641 (if find-file-visit-truename
642 (setq dirname (file-truename dirname)))
643 ;; If the argument was syntactically a directory name not a file name,
644 ;; or if it happens to name a file that is a directory,
647 ;; and not just file-directory-p
648 ;; is that file-directory-p is slow over ftp.
649 (if (or initially-was-dirname (file-directory-p dirname))
650 (setq dirname (file-name-as-directory dirname)))
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)
660 (not (let ((attributes (file-attributes dirname))
661 (modtime (visited-file-modtime)))
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)))
673 (not (when noconfirm (file-remote-p dirname)))
674 (file-readable-p dirname)
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).
682 ;; The user can type `g' easily, and it is more consistent with find-file.
684 ;; buffer's old value, so call dired-sort-other, which does
687 ;; like find-file 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
706 (setq buffer (create-file-buffer (directory-file-name dirname)))))
710 ;; file list may have changed
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
725 (file-name-directory dirname))
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
753 (setq dirname (expand-file-name dirname))
754 (let (found (blist dired-buffers)) ; was (buffer-list)
755 (or mode (setq mode 'dired-mode))
762 dired-directory ;; nil during find-alternate-file
764 (expand-file-name
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))
789 (setq dirname (expand-file-name dirname))
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)
797 (make-local-variable 'file-name-coding-system)
798 (setq file-name-coding-system
799 (or coding-system-for-read file-name-coding-system))
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)
811 (let ((attributes (file-attributes dirname)))
813 (set-visited-file-modtime (nth 5 attributes))))
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 ()
824 ;; Insert listing for the specified dir (and maybe file list)
825 ;; already in dired-directory, assuming a clean buffer.
826 (let (dir file-list)
827 (if (consp dired-directory)
828 (setq dir (car dired-directory)
829 file-list (cdr dired-directory))
830 (setq dir dired-directory
831 file-list nil))
832 (setq dir (expand-file-name dir))
833 (if (and (equal "" (file-name-nondirectory dir))
834 (not file-list))
836 (dired-insert-directory dir dired-actual-switches nil nil t)
837 (if (not (file-readable-p
838 (directory-file-name (file-name-directory dir))))
842 (dired-insert-directory dir dired-actual-switches
843 file-list (not file-list) t)))))
845 (defun dired-align-file (beg end)
846 "Align the fields of a file to the ones of surrounding lines.
847 BEG..END is the line where the file info is located."
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
867 (let (file file-col other other-col)
868 ;; Check the there is indeed a file, and that there is anoter adjacent
869 ;; file with which to align, and that additional spaces are needed to
871 (when (and (setq file (progn (goto-char beg)
872 (dired-move-to-filename nil end)))
873 (setq file-col (current-column))
877 (dired-move-to-filename))
880 (dired-move-to-filename))))
882 (/= file other)
884 (> other-col file-col))
887 (when (and (< other file)
890 (dired-move-to-filename))
896 (if (> other file) (setq other (copy-marker other)))
897 (setq file (copy-marker file))
901 (while (and (> other-col file-col)
904 (> file (point)))
914 ;; other-col > file-col. ]
938 (setq file-col (+ spaces file-col))
939 (if (> file-col other-col)
940 (setq spaces (- spaces (- file-col other-col))))
944 (eq (dired-move-to-filename) (marker-position file)))
949 (set-marker file nil)))))
952 (defun dired-insert-directory (dir switches &optional file-list wildcard hdr)
957 in that case, DIR should be a file name that uses wildcards.
963 (if (or dired-use-ls-dired (file-remote-p dir))
964 (setq switches (concat "--dired " switches)))
968 (if file-list
969 (dolist (f file-list)
973 (dired-align-file beg (point))))
976 (if (not (string-match "b" dired-actual-switches))
978 (setq end (point-marker))
991 (set-marker end nil)))
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
1007 (insert " " (directory-file-name (file-name-directory dir)) ":\n"))
1010 (insert " wildcard " (file-name-nondirectory dir) "\n")))))
1012 (defun dired-insert-set-properties (beg end)
1013 "Make the file names highlight when the mouse is on them."
1018 (if (dired-move-to-filename)
1022 (dired-move-to-end-of-filename)
1025 help-echo "mouse-2: visit this file in other window")))
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))
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)
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)
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)
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)
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)
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)
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
1306 :help "Move to next directory-file line"))
1308 '(menu-item "Next Dirline" dired-next-dirline
1309 :help "Move to previous directory-file line"))
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
1341 :help "Diff file at cursor with its latest backup"))
1343 '(menu-item "Diff..." dired-diff
1344 :help "Compare file at cursor with another file"))
1346 '(menu-item "View This File" dired-view-file
1347 :help "Examine file at cursor in read-only mode"))
1349 '(menu-item "Display in Other Window" dired-display-file
1350 :help "Display file at cursor in other window"))
1351 (define-key map [menu-bar immediate find-file-other-window]
1352 '(menu-item "Find in Other Window" dired-find-file-other-window
1353 :help "Edit file at cursor in other window"))
1354 (define-key map [menu-bar immediate find-file]
1355 '(menu-item "Find This File" dired-find-file
1356 :help "Edit file at cursor"))
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
1374 '(menu-item "Downcase" dired-downcase
1376 ;; letter-case for file names.
1377 :enable (or (not (fboundp 'msdos-long-file-names))
1378 (msdos-long-file-names))
1381 '(menu-item "Upcase" dired-upcase
1382 :enable (or (not (fboundp 'msdos-long-file-names))
1383 (msdos-long-file-names))
1386 '(menu-item "Hardlink..." dired-do-hardlink-regexp
1389 '(menu-item "Symlink..." dired-do-symlink-regexp
1393 '(menu-item "Rename..." dired-do-rename-regexp
1396 '(menu-item "Copy..." dired-do-copy-regexp
1399 '(menu-item "Flag..." dired-flag-files-regexp
1402 '(menu-item "Mark..." dired-mark-files-regexp
1405 '(menu-item "Mark Containing..." dired-mark-files-containing-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
1419 :help "Replace marker with another character"))
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
1436 '(menu-item "Flag Garbage Files" dired-flag-garbage-files
1439 '(menu-item "Flag Backup Files" dired-flag-backup-files
1442 '(menu-item "Flag Auto-save Files" dired-flag-auto-save-files
1445 '(menu-item "Flag" dired-flag-file-deletion
1446 :help "Flag current line's file for deletion"))
1448 '(menu-item "Unmark" dired-unmark
1449 :help "Unmark or unflag current line's file"))
1451 '(menu-item "Mark" dired-mark
1452 :help "Mark current line's file for future operations"))
1454 '(menu-item "Toggle Marks" dired-toggle-marks
1464 [menu-bar operate image-dired-delete-tag]
1465 '(menu-item "Delete Image Tag..." image-dired-delete-tag
1468 [menu-bar operate image-dired-tag-files]
1469 '(menu-item "Add Image Tags..." image-dired-tag-files
1472 [menu-bar operate image-dired-dired-comment-files]
1473 '(menu-item "Add Image Comment..." image-dired-dired-comment-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
1487 '(menu-item "Search Files..." dired-do-search
1490 '(menu-item "Change Owner..." dired-do-chown
1494 '(menu-item "Change Group..." dired-do-chgrp
1498 '(menu-item "Change Mode..." dired-do-chmod
1501 '(menu-item "Change Timestamp..." dired-do-touch
1504 '(menu-item "Load" dired-do-load
1507 '(menu-item "Byte-compile" dired-do-byte-compile
1510 '(menu-item "Compress" dired-do-compress
1513 '(menu-item "Print..." dired-do-print
1516 '(menu-item "Hardlink to..." dired-do-hardlink
1519 '(menu-item "Symlink to..." dired-do-symlink
1523 '(menu-item "Shell Command..." dired-do-shell-command
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)
1551 compress, load or byte-compile them, change their file attributes
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
1562 to operate on the current file only. Prefix arguments override marks.
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] \
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.
1664 (dired-build-subdir-alist)
1665 (message "Change in dired buffer undone.
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)
1683 "Goto ARG'th next directory file line."
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)
1695 "Goto ARG'th previous directory file line."
1697 (dired-next-dirline (- arg)))
1699 (defun dired-up-directory (&optional other-window)
1704 (let* ((dir (dired-current-directory))
1705 (up (file-name-directory (directory-file-name dir))))
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 ()
1717 "Get the current line's file name, with an error if file does not exist."
1720 (let ((raw (dired-get-filename nil t))
1721 file-name)
1723 (error "No file on this line"))
1724 (setq file-name (file-name-sans-versions raw t))
1725 (if (file-exists-p file-name)
1726 file-name
1727 (if (file-symlink-p file-name)
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 ()
1734 "In Dired, visit the file or directory named on this line."
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)
1750 "In Dired, visit the file or directory name you click on."
1752 (let (window pos file)
1757 (error "No file chosen"))
1760 (setq file (dired-get-file-for-visit)))
1761 (if (file-directory-p file)
1762 (or (and (cdr dired-subdir-alist)
1763 (dired-goto-subdir file))
1766 (dired-other-window file)))
1768 (find-file-other-window (file-name-sans-versions file t)))))
1770 (defun dired-view-file ()
1771 "In Dired, examine a file in view mode, returning to Dired when done.
1772 When file is a directory, show it in this buffer if it is inserted.
1775 (let ((file (dired-get-file-for-visit)))
1776 (if (file-directory-p file)
1777 (or (and (cdr dired-subdir-alist)
1778 (dired-goto-subdir file))
1779 (dired file))
1780 (view-file file))))
1782 (defun dired-find-file-other-window ()
1783 "In Dired, visit this file or directory in another window."
1785 (find-file-other-window (dired-get-file-for-visit)))
1787 (defun dired-display-file ()
1788 "In Dired, display this file or directory in another window."
1790 (display-buffer (find-file-noselect (dired-get-file-for-visit))))
1793 ;;; Functions for extracting and manipulating file names in Dired buffers.
1795 (defun dired-get-filename (&optional localp no-error-if-not-filep)
1796 "In Dired, return name of file mentioned on this line.
1805 (let (case-fold-search file p1 p2 already-absolute)
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))))
1809 ;; nil if no file on this line, but no-error-if-not-filep is t:
1810 (if (setq file (and p1 p2 (buffer-substring p1 p2)))
1812 ;; Get rid of the mouse-face property that file names have.
1813 (set-text-properties 0 (length file) nil file)
1814 ;; Unquote names quoted by ls or by dired-insert-directory.
1817 (setq file
1822 (or (dired-string-replace-match
1823 "\\([^\\]\\|\\`\\)\"" file "\\1\\\\\"" nil t)
1824 file)
1829 (not (multibyte-string-p file)))
1830 (setq file (string-to-multibyte file)))))
1831 (and file (file-name-absolute-p file)
1832 ;; A relative file name can start with ~.
1834 (not (eq (aref file 0) ?~))
1837 ((null file)
1840 file)
1842 (member file '("." "..")))
1845 (file-name-nondirectory file))
1847 (let ((handler (find-file-name-handler file nil)))
1852 (concat "/:" file)
1853 file)))
1855 file)
1856 ((equal (dired-current-directory) "/")
1857 (setq file (concat (dired-current-directory localp) file))
1858 (let ((handler (find-file-name-handler file nil)))
1863 (concat "/:" file)
1864 file)))
1866 (concat (dired-current-directory localp) file)))))
1868 (defun dired-string-replace-match (regexp string newtext
1885 (defun dired-make-absolute (file &optional dir)
1886 ;;"Convert FILE (a file name relative to DIR) to an absolute file name."
1887 ;; We can't always use expand-file-name as this would get rid of `.'
1892 ;; dired-get-filename.
1893 (concat (or dir default-directory) file))
1895 (defun dired-make-relative (file &optional dir ignore)
1896 "Convert FILE (an absolute file name) to a name relative to DIR.
1898 DIR must be a directory name, not a file name."
1903 (setq dir (expand-file-name dir)))
1904 (if (string-match (concat "^" (regexp-quote dir)) file)
1905 (substring file (match-end 0))
1907 ;;; (error "%s: not in directory tree growing at %s" file dir))
1908 file))
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)
1933 ;; Ha! There *is* a file. Our regexp-from-hell just failed to find it.
1939 (error "No file on this line")))))
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))
1950 (let (opoint file-type executable symlink hidden case-fold-search used-F eol)
1952 (setq used-F (string-match "F" dired-actual-switches)
1959 (save-excursion ;; Find out what kind of file this is:
1963 ;; "----------" (plain file with zero perms)
1965 dired-permission-flags-regexp nil t)
1966 (setq file-type (char-after (match-beginning 1))
1967 symlink (eq file-type ?l)
1977 (or no-error (error "No file on this line"))))
1984 dired-ls-F-marks-symlinks
1992 (or (memq file-type '(?d ?s ?p))
1999 "File line is hidden, type \\[dired-hide-subdir] to unhide")
2000 "No file on this line")))
2009 (defun dired-copy-filename-as-kill (&optional arg)
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
2019 You can then feed the file name(s) to other commands with \\[yank]."
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.
2050 (setq dir (file-name-as-directory dir))
2051 (let ((alist dired-buffers) result elt buf)
2056 (if (dired-in-this-tree dir (car elt))
2058 (and (assoc dir dired-subdir-alist)
2059 (or (null file)
2061 (file-name-nondirectory dired-directory)))
2063 (string-match (dired-glob-regexp wildcards)
2064 file))))
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'."
2110 (let ((expanded-default (expand-file-name 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)
2133 (string-match (concat "^" (regexp-quote dir)) file)))
2135 (defun dired-normalize-subdir (dir)
2136 ;; Prepend default-directory to DIR if relative file name.
2137 ;; dired-get-filename must be able to make a valid file name from a
2138 ;; file and its directory DIR.
2139 (file-name-as-directory
2140 (if (file-name-absolute-p dir)
2142 (expand-file-name dir default-directory))))
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)
2223 ;; Avoid taking a file name ending in a colon
2229 (save-match-data (looking-at dired-re-perms)))
2241 (expand-file-name new-dir-name))))
2245 (dired-alist-add-1 new-dir-name
2250 (point-marker)))))
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 ()
2264 ;; Position point on first nontrivial file after point.
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
2269 (file-name-nondirectory
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."
2282 ;; FILE must be an absolute file name.
2288 (list (expand-file-name
2289 (read-file-name "Goto file: "
2290 (dired-current-directory))))
2292 (setq file (directory-file-name file)) ; does no harm if no directory
2294 (setq dir (or (file-name-directory file)
2295 (error "File name `%s' is not absolute" file)))
2297 ;; The hair here is to get the result of dired-goto-subdir
2299 (if (if (string= dir (expand-file-name default-directory))
2301 (and (cdr dired-subdir-alist)
2302 (dired-goto-subdir dir)))
2303 (let ((base (file-name-nondirectory file))
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)
2350 Optional argument means return a file name relative to `default-directory'."
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)))
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
2398 ;; to e.g. recursive-delete-file and put it somewhere else.
2399 (defun dired-delete-file (file &optional recursive) "\
2408 ;; (and (file-directory-p fn) (not (file-symlink-p fn)))
2410 (if (not (eq t (car (file-attributes file))))
2411 (delete-file file)
2414 (directory-files file t dired-re-no-dot)) ; Not empty.
2417 (dired-make-relative file)))))
2420 (dired-delete-file (car files) recursive)
2422 (delete-directory file))))
2424 (defun dired-do-flagged-delete (&optional nomessage)
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)
2446 `dired-recursive-deletes' controls whether
2448 ;; This is more consistent with the file marking feature than
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)
2463 ;; (car L) *must* be the *last* (bottommost) file in the dired buffer.
2471 ;; canonicalize file list for pop up
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)))
2483 (dired-delete-file fn dired-recursive-deletes)
2487 (dired-fun-in-all-buffers
2488 (file-name-directory fn) (file-name-nondirectory fn)
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)
2512 file))
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)
2529 ;; Clean up after a deleted file or directory 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)
2544 ;; Return a string for use in a prompt, either the current file
2545 ;; name, or the marker and a count of marked files.
2549 ;; more than 1 file:
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)
2599 (defcustom dired-no-confirm nil
2604 :group 'dired
2612 (defun dired-mark-pop-up (bufname op-symbol files function &rest args)
2614 Displays the file names in a buffer named BUFNAME;
2616 This uses function `dired-pop-to-buffer' to do that.
2620 The window is not shown if there is just one file or
2621 OP-SYMBOL is a member of the list in `dired-no-confirm'.
2623 in the case of one marked file, to distinguish that from using
2624 just the current file."
2626 (if (or (eq dired-no-confirm t)
2627 (memq op-symbol dired-no-confirm)
2628 ;; If FILES defaulted to the current line's file.
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.
2671 ;; Commands to mark or flag file(s) at or near current line.
2673 (defun dired-repeat-over-lines (arg function)
2674 ;; This version skips non-file lines.
2675 (let ((pos (make-marker)))
2680 (while (and (not (eobp)) (dired-between-files)) (forward-line 1))
2683 (move-marker pos (1+ (point))))
2691 (while (and (not (bobp)) (dired-between-files)) (forward-line -1))
2694 (move-marker pos nil)
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)
2726 ;; Return FILE's marker, or nil if unmarked.
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)
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)
2769 (let ((dired-marker-char ?\040))
2770 (dired-mark arg)))
2772 (defun dired-flag-file-deletion (arg)
2773 "In Dired, flag the current line's file for deletion.
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 ()
2797 (or (dired-between-files)
2798 (looking-at dired-re-dot)
2805 (list ?\040 dired-marker-char)
2806 (list dired-marker-char ?\040))))
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)
2826 (list (dired-read-regexp (concat (if current-prefix-arg "Unmark" "Mark")
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)))
2834 (and fn (string-match regexp (file-name-nondirectory fn)))))
2835 "matching file")))
2837 (defun dired-mark-files-containing-regexp (regexp &optional marker-char)
2842 (list (dired-read-regexp (concat (if current-prefix-arg "Unmark" "Mark")
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)))
2850 (when (and fn (file-readable-p fn)
2851 (not (file-directory-p fn)))
2852 (let ((prebuf (get-file-buffer fn)))
2862 (insert-file-contents fn)
2866 "matching file")))
2868 (defun dired-flag-files-regexp (regexp)
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)
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)
2884 "Mark all directory file lines except `.' and `..'.
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)))
2890 "directory file")))
2892 (defun dired-mark-executables (unflag-p)
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
2902 (defun dired-flag-auto-save-files (&optional unflag-p)
2906 (let ((dired-marker-char (if unflag-p ?\040 dired-del-marker)))
2907 (dired-mark-if
2921 (not (looking-at dired-re-dir))
2922 (let ((fn (dired-get-filename t t)))
2923 (if fn (auto-save-file-name-p
2924 (file-name-nondirectory fn)))))
2925 "auto save file")))
2927 (defcustom dired-garbage-files-regexp
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)
2946 (let ((dired-marker-char (if unflag-p ?\s dired-del-marker)))
2947 (dired-mark-if
2948 ;; Don't call backup-file-name-p unless the last character looks like
2949 ;; it might be the end of a backup file name. This isn't very general,
2959 (not (looking-at dired-re-dir))
2960 (let ((fn (dired-get-filename t t)))
2961 (if fn (backup-file-name-p fn))))
2962 "backup file")))
2964 (defun dired-change-marks (&optional old new)
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)
2993 "Remove a specific mark (or any mark) from every file.
2996 With prefix arg, query for each marked file.
3004 Type SPC or `y' to unmark one file, DEL or `n' to skip to next,
3008 (re-search-forward dired-re-mark nil t)
3011 (let ((file (dired-get-filename t t)))
3012 (and file
3013 (dired-query 'query "Unmark file `%s'? "
3014 file))))
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)
3073 FAILURES is a list of file names that we failed to operate on,
3074 or nil if file names are not applicable."
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)
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.
3269 URI is the file to handle, ACTION is one of copy, move, link or ask.
3271 (require 'dired-aux)
3272 (let* ((from (dnd-get-local-file-name uri t))
3273 (to (if from (concat (dired-current-directory)
3274 (file-name-nondirectory from))
3280 ;; If copying a directory and dired-recursive-copies is nil,
3281 ;; dired-copy-file silently fails. Pop up a notice.
3282 (if (and (file-directory-p from)
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.
3307 URI is the file to handle. If the hostname in the URI isn't local, do nothing.
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)
3321 "Auxiliary information to be saved in desktop file."
3323 ;; Value of `dired-directory'.
3324 (if (consp dired-directory)
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'.
3334 (function (lambda (f) (desktop-file-name (car f) desktop-dirname)))
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'.
3344 (let* ((dired-dir (car desktop-buffer-misc))
3345 (dir (if (consp dired-dir) (car dired-dir) dired-dir)))
3346 (if (file-directory-p (file-name-directory dir))
3348 (dired dired-dir)
3350 ;; from `dired-subdir-alist'.
3351 (mapcar 'dired-maybe-insert-subdir (cdr desktop-buffer-misc))
3354 (when desktop-missing-file-warning (sit-for 1))
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