;;; dired.el --- directory-browsing commands
-;; Copyright (C) 1985, 86, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 86, 92, 93, 94, 95, 96, 1997, 2000 Free Software Foundation, Inc.
;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
;; Maintainer: FSF
(set-buffer old-buf)
buffer))
+(defvar dired-buffers nil
+ ;; Enlarged by dired-advertise
+ ;; Queried by function dired-buffers-for-dir. When this detects a
+ ;; killed buffer, it is removed from this list.
+ "Alist of expanded directories and their associated dired buffers.")
+
(defun dired-find-buffer-nocreate (dirname &optional mode)
;; This differs from dired-buffers-for-dir in that it does not consider
;; subdirs of default-directory and searches for the first match only.
(when (re-search-forward "total [0-9]+$" nil t)
(insert " free ")
(let ((beg (point)))
- (call-process dired-free-space-program nil t nil
- dired-free-space-args
- (expand-file-name dir-or-list))
- (goto-char beg)
- (forward-line 1)
- (skip-chars-forward "^ \t")
- (forward-word 2)
- (skip-chars-forward " \t")
- (delete-region beg (point))
- (forward-word 1)
- (delete-region (point)
- (progn (forward-line 1) (point))))))))
+ (if (zerop (call-process dired-free-space-program nil t nil
+ dired-free-space-args
+ (expand-file-name dir-or-list)))
+ (progn
+ (goto-char beg)
+ (forward-line 1)
+ (skip-chars-forward "^ \t")
+ (forward-word 2)
+ (skip-chars-forward " \t")
+ (delete-region beg (point))
+ (forward-word 1)
+ (delete-region (point)
+ (progn (forward-line 1) (point))))
+ ;; The dired-free-space-program failed; delete its output
+ (delete-region (- beg 7) (point))))))))
;; Quote certain characters, unless ls quoted them for us.
(if (not (string-match "b" dired-actual-switches))
(save-excursion
(define-key map "M" 'dired-do-chmod)
(define-key map "O" 'dired-do-chown)
(define-key map "P" 'dired-do-print)
- (define-key map "Q" 'dired-do-query-replace)
+ (define-key map "Q" 'dired-do-query-replace-regexp)
(define-key map "R" 'dired-do-rename)
(define-key map "S" 'dired-do-symlink)
(define-key map "X" 'dired-do-shell-command)
(define-key map "*\C-p" 'dired-prev-marked-file)
(define-key map "*t" 'dired-do-toggle)
;; Lower keys for commands not operating on all the marked files
+ (define-key map "a" 'dired-find-alternate-file)
(define-key map "d" 'dired-flag-file-deletion)
(define-key map "e" 'dired-find-file)
(define-key map "f" 'dired-find-file)
+ (define-key map "w" 'dired-show-file-type)
(define-key map "\C-m" 'dired-advertised-find-file)
(define-key map "g" 'revert-buffer)
(define-key map "h" 'describe-mode)
;; Make menu bar items.
+ ;; No need to fo this, now that top-level items are fewer.
+ ;;;;
;; Get rid of the Edit menu bar item to save space.
- (define-key map [menu-bar edit] 'undefined)
+ ;(define-key map [menu-bar edit] 'undefined)
(define-key map [menu-bar subdir]
(cons "Subdir" (make-sparse-keymap "Subdir")))
(define-key map [menu-bar subdir hide-all]
- '("Hide All" . dired-hide-all))
+ '(menu-item "Hide All" dired-hide-all
+ :help "Hide all subdirectories, leave only header lines"))
(define-key map [menu-bar subdir hide-subdir]
- '("Hide Subdir" . dired-hide-subdir))
+ '(menu-item "Hide/UnHide Subdir" dired-hide-subdir
+ :help "Hide or unhide current directory listing"))
(define-key map [menu-bar subdir tree-down]
- '("Tree Down" . dired-tree-down))
+ '(menu-item "Tree Down" dired-tree-down
+ :help "Go to first subdirectory header down the tree"))
(define-key map [menu-bar subdir tree-up]
- '("Tree Up" . dired-tree-up))
+ '(menu-item "Tree Up" dired-tree-up
+ :help "Go to first subdirectory header up the tree"))
(define-key map [menu-bar subdir up]
- '("Up Directory" . dired-up-directory))
+ '(menu-item "Up Directory" dired-up-directory
+ :help "Edit the parent directory"))
(define-key map [menu-bar subdir prev-subdir]
- '("Prev Subdir" . dired-prev-subdir))
+ '(menu-item "Prev Subdir" dired-prev-subdir
+ :help "Go to previous subdirectory header line"))
(define-key map [menu-bar subdir next-subdir]
- '("Next Subdir" . dired-next-subdir))
+ '(menu-item "Next Subdir" dired-next-subdir
+ :help "Go to next subdirectory header line"))
(define-key map [menu-bar subdir prev-dirline]
- '("Prev Dirline" . dired-prev-dirline))
+ '(menu-item "Prev Dirline" dired-prev-dirline
+ :help "Move to next directory-file line"))
(define-key map [menu-bar subdir next-dirline]
- '("Next Dirline" . dired-next-dirline))
+ '(menu-item "Next Dirline" dired-next-dirline
+ :help "Move to previous directory-file line"))
(define-key map [menu-bar subdir insert]
- '("Insert This Subdir" . dired-maybe-insert-subdir))
+ '(menu-item "Insert This Subdir" dired-maybe-insert-subdir
+ :help "Insert contents of subdirectory"))
(define-key map [menu-bar immediate]
(cons "Immediate" (make-sparse-keymap "Immediate")))
(define-key map [menu-bar immediate revert-buffer]
- '("Update Buffer" . revert-buffer))
+ '(menu-item "Refresh" revert-buffer
+ :help "Update contents of shown directories"))
(define-key map [menu-bar immediate dashes]
'("--"))
(define-key map [menu-bar immediate backup-diff]
- '("Compare with Backup" . dired-backup-diff))
+ '(menu-item "Compare with Backup" dired-backup-diff
+ :help "Diff file at cursor with its latest backup"))
(define-key map [menu-bar immediate diff]
- '("Diff" . dired-diff))
+ '(menu-item "Diff..." dired-diff
+ :help "Compare file at cursor with another file"))
(define-key map [menu-bar immediate view]
- '("View This File" . dired-view-file))
+ '(menu-item "View This File" dired-view-file
+ :help "Examine file at cursor in read-only mode"))
(define-key map [menu-bar immediate display]
- '("Display in Other Window" . dired-display-file))
+ '(menu-item "Display in Other Window" dired-display-file
+ :help "Display file at cursor in other window"))
(define-key map [menu-bar immediate find-file-other-window]
- '("Find in Other Window" . dired-find-file-other-window))
+ '(menu-item "Find in Other Window" dired-find-file-other-window
+ :help "Edit file at cursor in other window"))
(define-key map [menu-bar immediate find-file]
- '("Find This File" . dired-find-file))
+ '(menu-item "Find This File" dired-find-file
+ :help "Edit file at cursor"))
(define-key map [menu-bar immediate create-directory]
- '("Create Directory..." . dired-create-directory))
+ '(menu-item "Create Directory..." dired-create-directory))
(define-key map [menu-bar regexp]
(cons "Regexp" (make-sparse-keymap "Regexp")))
(define-key map [menu-bar regexp downcase]
- '("Downcase" . dired-downcase))
+ '(menu-item "Downcase" dired-downcase
+ ;; When running on plain MS-DOS, there's only one
+ ;; letter-case for file names.
+ :enable (or (not (fboundp 'msdos-long-file-names))
+ (msdos-long-file-names))
+ :help "Rename marked files to lower-case name"))
(define-key map [menu-bar regexp upcase]
- '("Upcase" . dired-upcase))
+ '(menu-item "Upcase" dired-upcase
+ :enable (or (not (fboundp 'msdos-long-file-names))
+ (msdos-long-file-names))
+ :help "Rename marked files to upper-case name"))
(define-key map [menu-bar regexp hardlink]
- '("Hardlink..." . dired-do-hardlink-regexp))
+ '(menu-item "Hardlink..." dired-do-hardlink-regexp
+ :help "Make hard links for files matching regexp"))
(define-key map [menu-bar regexp symlink]
- '("Symlink..." . dired-do-symlink-regexp))
+ '(menu-item "Symlink..." dired-do-symlink-regexp
+ :visible (fboundp 'make-symbolic-link)
+ :help "Make symbolic links for files matching regexp"))
(define-key map [menu-bar regexp rename]
- '("Rename..." . dired-do-rename-regexp))
+ '(menu-item "Rename..." dired-do-rename-regexp
+ :help "Rename marked files matching regexp"))
(define-key map [menu-bar regexp copy]
- '("Copy..." . dired-do-copy-regexp))
+ '(menu-item "Copy..." dired-do-copy-regexp
+ :help "Copy marked files matching regexp"))
(define-key map [menu-bar regexp flag]
- '("Flag..." . dired-flag-files-regexp))
+ '(menu-item "Flag..." dired-flag-files-regexp
+ :help "Flag files matching regexp for deletion"))
(define-key map [menu-bar regexp mark]
- '("Mark..." . dired-mark-files-regexp))
+ '(menu-item "Mark..." dired-mark-files-regexp
+ :help "Mark files matching regexp for future operations"))
(define-key map [menu-bar regexp mark-cont]
- '("Mark Containing..." . dired-mark-files-containing-regexp))
+ '(menu-item "Mark Containing..." dired-mark-files-containing-regexp
+ :help "Mark files whose contents matches regexp"))
(define-key map [menu-bar mark]
(cons "Mark" (make-sparse-keymap "Mark")))
(define-key map [menu-bar mark prev]
- '("Previous Marked" . dired-prev-marked-file))
+ '(menu-item "Previous Marked" dired-prev-marked-file
+ :help "Move to previous marked file"))
(define-key map [menu-bar mark next]
- '("Next Marked" . dired-next-marked-file))
+ '(menu-item "Next Marked" dired-next-marked-file
+ :help "Move to next marked file"))
(define-key map [menu-bar mark marks]
- '("Change Marks..." . dired-change-marks))
+ '(menu-item "Change Marks..." dired-change-marks
+ :help "Replace marker with another character"))
(define-key map [menu-bar mark unmark-all]
- '("Unmark All" . dired-unmark-all-marks))
+ '(menu-item "Unmark All" dired-unmark-all-marks))
(define-key map [menu-bar mark symlinks]
- '("Mark Symlinks" . dired-mark-symlinks))
+ '(menu-item "Mark Symlinks" dired-mark-symlinks
+ :visible (fboundp 'make-symbolic-link)
+ :help "Mark all symbolic links"))
(define-key map [menu-bar mark directories]
- '("Mark Directories" . dired-mark-directories))
+ '(menu-item "Mark Directories" dired-mark-directories
+ :help "Mark all directories except `.' and `..'"))
(define-key map [menu-bar mark directory]
- '("Mark Old Backups" . dired-clean-directory))
+ '(menu-item "Mark Old Backups" dired-clean-directory
+ :help "Flag old numbered backups for deletion"))
(define-key map [menu-bar mark executables]
- '("Mark Executables" . dired-mark-executables))
+ '(menu-item "Mark Executables" dired-mark-executables
+ :help "Mark all executable files"))
(define-key map [menu-bar mark garbage-files]
- '("Flag Garbage Files" . dired-flag-garbage-files))
+ '(menu-item "Flag Garbage Files" dired-flag-garbage-files
+ :help "Flag unneeded files for deletion"))
(define-key map [menu-bar mark backup-files]
- '("Flag Backup Files" . dired-flag-backup-files))
+ '(menu-item "Flag Backup Files" dired-flag-backup-files
+ :help "Flag all backup files for deletion"))
(define-key map [menu-bar mark auto-save-files]
- '("Flag Auto-save Files" . dired-flag-auto-save-files))
+ '(menu-item "Flag Auto-save Files" dired-flag-auto-save-files
+ :help "Flag auto-save files for deletion"))
(define-key map [menu-bar mark deletion]
- '("Flag" . dired-flag-file-deletion))
+ '(menu-item "Flag" dired-flag-file-deletion
+ :help "Flag current line's file for deletion"))
(define-key map [menu-bar mark unmark]
- '("Unmark" . dired-unmark))
+ '(menu-item "Unmark" dired-unmark
+ :help "Unmark or unflag current line's file"))
(define-key map [menu-bar mark mark]
- '("Mark" . dired-mark))
+ '(menu-item "Mark" dired-mark
+ :help "Mark current line's file for future operations"))
(define-key map [menu-bar mark toggle-marks]
- '("Toggle Marks" . dired-do-toggle))
+ '(menu-item "Toggle Marks" dired-do-toggle
+ :help "Mark unmarked files, unmark marked ones"))
(define-key map [menu-bar operate]
(cons "Operate" (make-sparse-keymap "Operate")))
(define-key map [menu-bar operate query-replace]
- '("Query Replace in Files..." . dired-do-query-replace))
+ '(menu-item "Query Replace in Files..." dired-do-query-replace-regexp
+ :help "Replace regexp in marked files"))
(define-key map [menu-bar operate search]
- '("Search Files..." . dired-do-search))
+ '(menu-item "Search Files..." dired-do-search
+ :help "Search marked files for regexp"))
(define-key map [menu-bar operate chown]
- '("Change Owner..." . dired-do-chown))
+ '(menu-item "Change Owner..." dired-do-chown
+ :visible (not (memq system-type '(ms-dos windows-nt)))
+ :help "Change the owner of marked files"))
(define-key map [menu-bar operate chgrp]
- '("Change Group..." . dired-do-chgrp))
+ '(menu-item "Change Group..." dired-do-chgrp
+ :visible (not (memq system-type '(ms-dos windows-nt)))
+ :help "Change the group of marked files"))
(define-key map [menu-bar operate chmod]
- '("Change Mode..." . dired-do-chmod))
+ '(menu-item "Change Mode..." dired-do-chmod
+ :help "Change mode (attributes) of marked files"))
(define-key map [menu-bar operate load]
- '("Load" . dired-do-load))
+ '(menu-item "Load" dired-do-load
+ :help "Load marked Emacs Lisp files"))
(define-key map [menu-bar operate compile]
- '("Byte-compile" . dired-do-byte-compile))
+ '(menu-item "Byte-compile" dired-do-byte-compile
+ :help "Byte-compile marked Emacs Lisp files"))
(define-key map [menu-bar operate compress]
- '("Compress" . dired-do-compress))
+ '(menu-item "Compress" dired-do-compress
+ :help "Compress/uncompress marked files"))
(define-key map [menu-bar operate print]
- '("Print" . dired-do-print))
+ '(menu-item "Print..." dired-do-print
+ :help "Ask for print command and print marked files"))
(define-key map [menu-bar operate hardlink]
- '("Hardlink to..." . dired-do-hardlink))
+ '(menu-item "Hardlink to..." dired-do-hardlink
+ :help "Make hard links for current or marked files"))
(define-key map [menu-bar operate symlink]
- '("Symlink to..." . dired-do-symlink))
+ '(menu-item "Symlink to..." dired-do-symlink
+ :visible (fboundp 'make-symbolic-link)
+ :help "Make symbolic links for current or marked files"))
(define-key map [menu-bar operate command]
- '("Shell Command..." . dired-do-shell-command))
+ '(menu-item "Shell Command..." dired-do-shell-command
+ :help "Run a shell command on each of marked files"))
(define-key map [menu-bar operate delete]
- '("Delete" . dired-do-delete))
+ '(menu-item "Delete" dired-do-delete
+ :help "Delete current file or all marked files"))
(define-key map [menu-bar operate rename]
- '("Rename to..." . dired-do-rename))
+ '(menu-item "Rename to..." dired-do-rename
+ :help "Rename current file or move marked files"))
(define-key map [menu-bar operate copy]
- '("Copy to..." . dired-do-copy))
+ '(menu-item "Copy to..." dired-do-copy
+ :help "Copy current file or all marked files"))
(setq dired-mode-map map)))
\f
;; case-fold-search nil
buffer-read-only t
selective-display t ; for subdirectory hiding
- mode-line-buffer-identification '("%17b"))
+ mode-line-buffer-identification
+ (propertized-buffer-identification "%17b"))
(set (make-local-variable 'revert-buffer-function)
(function dired-revert))
(set (make-local-variable 'page-delimiter)
(error "File is a symlink to a nonexistent target")
(error "File no longer exists; type `g' to update Dired buffer")))))
+(defun dired-find-alternate-file ()
+ "In dired, visit this file or directory instead of the dired buffer."
+ (interactive)
+ (set-buffer-modified-p nil)
+ (find-alternate-file (dired-get-filename)))
+
(defun dired-mouse-find-file-other-window (event)
"In dired, visit the file or directory name you click on."
(interactive "e")
(western (concat "\\(" month s dd "\\|" dd s month "\\)"
;; weiand: changed: year potentially unaligned
;;old s "\\(" HH:MM "\\|" s yyyy "\\|" yyyy s "\\)"))
- s "\\(" HH:MM "\\|" s "?" yyyy "\\|" yyyy s
-"\\)"))
+ s "\\(" HH:MM
+ "\\|" yyyy s s "?"
+ "\\|" s "?" yyyy
+ "\\)"))
(japanese (concat mm k s dd k s "\\(" s HH:MM "\\|" yyyy k "\\)")))
;; The "[0-9]" below requires the previous column to end in a digit.
;; This avoids recognizing `1 may 1997' as a date in the line:
\f
;; Keeping Dired buffers in sync with the filesystem and with each other
-(defvar dired-buffers nil
- ;; Enlarged by dired-advertise
- ;; Queried by function dired-buffers-for-dir. When this detects a
- ;; killed buffer, it is removed from this list.
- "Alist of expanded directories and their associated dired buffers.")
-
(defun dired-buffers-for-dir (dir &optional file)
;; Return a list of buffers that dired DIR (top level or in-situ subdir).
;; If FILE is non-nil, include only those whose wildcard pattern (if any)
(save-excursion
(let ((count 0)
(buffer-read-only nil)
- new-dir-name)
+ new-dir-name
+ (R-ftp-base-dir-regex
+ ;; Used to expand subdirectory names correctly in recursive
+ ;; ange-ftp listings.
+ (and (string-match "R" dired-actual-switches)
+ (string-match "\\`/.*:\\(/.*\\)" default-directory)
+ (concat "\\`" (match-string 1 default-directory)))))
(goto-char (point-min))
(setq dired-subdir-alist nil)
(while (and (re-search-forward dired-subdir-regexp nil t)
(save-excursion
(goto-char (match-beginning 1))
(setq new-dir-name
- (expand-file-name (buffer-substring (point) (match-end 1))))
+ (buffer-substring-no-properties (point) (match-end 1))
+ new-dir-name
+ (save-match-data
+ (if (and R-ftp-base-dir-regex
+ (not (string= new-dir-name default-directory))
+ (string-match R-ftp-base-dir-regex new-dir-name))
+ (concat default-directory
+ (substring new-dir-name (match-end 0)))
+ (expand-file-name new-dir-name))))
(delete-region (point) (match-end 1))
(insert new-dir-name))
(setq count (1+ count))
;; Point must be at beginning of line
;; Should be equivalent to (save-excursion (not (dired-move-to-filename)))
;; but is about 1.5..2.0 times as fast. (Actually that's not worth it)
- (or (looking-at "^$\\|^. *$\\|^. total\\|^. wildcard")
+ (or (looking-at "^$\\|^. *$\\|^. total\\|^. wildcard\\|^. used")
(and (looking-at dired-subdir-regexp)
(save-excursion (not (dired-move-to-filename))))))
;; `dired-sort-by-date-regexp' or `dired-sort-by-name-regexp' set the
;; minor mode accordingly, others appear literally in the mode line.
;; With optional second arg NO-REVERT, don't refresh the listing afterwards.
+ (dired-sort-R-check switches)
(setq dired-actual-switches switches)
(if (eq major-mode 'dired-mode) (dired-sort-set-modeline))
(or no-revert (revert-buffer)))
+
+(make-variable-buffer-local
+ (defvar dired-subdir-alist-pre-R nil
+ "Value of `dired-subdir-alist' before -R switch added."))
+
+(defun dired-sort-R-check (switches)
+ "Additional processing of -R in ls option string SWITCHES.
+Saves `dired-subdir-alist' when R is set and restores saved value
+minus any directories explicitly deleted when R is cleared.
+To be called first in body of `dired-sort-other', etc."
+ (cond
+ ((and (string-match "R" switches)
+ (not (string-match "R" dired-actual-switches)))
+ ;; Adding -R to ls switches -- save `dired-subdir-alist':
+ (setq dired-subdir-alist-pre-R dired-subdir-alist))
+ ((and (string-match "R" dired-actual-switches)
+ (not (string-match "R" switches)))
+ ;; Deleting -R from ls switches -- revert to pre-R subdirs
+ ;; that are still present:
+ (setq dired-subdir-alist
+ (if dired-subdir-alist-pre-R
+ (let (subdirs)
+ (while dired-subdir-alist-pre-R
+ (if (assoc (caar dired-subdir-alist-pre-R)
+ dired-subdir-alist)
+ ;; subdir still present...
+ (setq subdirs
+ (cons (car dired-subdir-alist-pre-R)
+ subdirs)))
+ (setq dired-subdir-alist-pre-R
+ (cdr dired-subdir-alist-pre-R)))
+ (reverse subdirs))
+ ;; No pre-R subdir alist, so revert to main directory
+ ;; listing:
+ (list (car (reverse dired-subdir-alist))))))))
\f
;; To make this file smaller, the less common commands
;; go in a separate file. But autoload them here
If there is already something hidden, make everything visible again.
Use \\[dired-hide-subdir] to (un)hide a particular subdirectory."
t)
+
+(autoload 'dired-show-file-type "dired-aux"
+ "Print the type of FILE, according to the `file' command.
+If FILE is a symbolic link and the optional argument DEREF-SYMLINKS is
+true then the type of the file linked to by FILE is printed instead."
+ t)
\f
(if (eq system-type 'vax-vms)
(load "dired-vms"))