]> code.delx.au - gnu-emacs/blobdiff - lisp/dired.el
Remove.
[gnu-emacs] / lisp / dired.el
index 987d8ddd899d7f3264d86c706325647d862016b9..d7217b60f217c14f238dce068c6790591f99e297 100644 (file)
@@ -1,9 +1,11 @@
 ;;; dired.el --- directory-browsing commands
 
-;; Copyright (C) 1985, 86, 92, 93, 94, 95, 96, 1997, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 86, 92, 93, 94, 95, 96, 1997, 2000, 2001
+;;  Free Software Foundation, Inc.
 
 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
 ;; Maintainer: FSF
+;; Keywords: files
 
 ;; This file is part of GNU Emacs.
 
@@ -40,7 +42,7 @@
   :group 'environment)
 
 (defgroup dired-mark nil
-  "Handling marks in dired."
+  "Handling marks in Dired."
   :prefix "dired-"
   :group 'dired)
 
   "*Switches passed to `ls' for dired.  MUST contain the `l' option.
 May contain all other options that don't contradict `-l';
 may contain even `F', `b', `i' and `s'.  See also the variable
-`dired-ls-F-marks-symlinks' concerning the `F' switch."
+`dired-ls-F-marks-symlinks' concerning the `F' switch.
+On systems such as MS-DOS and MS-Windows, which use `ls' emulation in Lisp,
+some of the `ls' switches are not supported; see the doc string of
+`insert-directory' on ls-lisp.el for more details."
   :type 'string
   :group 'dired)
 
@@ -740,7 +745,7 @@ If DIRNAME is already in a dired buffer, that buffer is used without refresh."
               (save-excursion
                 (dired-move-to-end-of-filename)
                 (point))
-              '(mouse-face 'highlight
+              '(mouse-face highlight
                 help-echo "mouse-2: visit this file in other window")))
        (error nil))
       (forward-line 1))))
@@ -941,7 +946,6 @@ If DIRNAME is already in a dired buffer, that buffer is used without refresh."
     (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)
@@ -959,6 +963,7 @@ If DIRNAME is already in a dired buffer, that buffer is used without refresh."
     (define-key map "u" 'dired-unmark)
     (define-key map "v" 'dired-view-file)
     (define-key map "x" 'dired-do-flagged-delete)
+    (define-key map "y" 'dired-show-file-type)
     (define-key map "+" 'dired-create-directory)
     ;; moving
     (define-key map "<" 'dired-prev-dirline)
@@ -1197,7 +1202,7 @@ If DIRNAME is already in a dired buffer, that buffer is used without refresh."
 (defun dired-mode (&optional dirname switches)
   "\
 Mode for \"editing\" directory listings.
-In dired, you are \"editing\" a list of the files in a directory and
+In Dired, you are \"editing\" a list of the files in a directory and
   \(optionally) its subdirectories, in the format of `ls -lR'.
   Each directory is a page: use \\[backward-page] and \\[forward-page] to move pagewise.
 \"Editing\" means that you can run shell commands on files, visit,
@@ -1303,7 +1308,9 @@ In the latter case, you have to do \\[dired-build-subdir-alist] to
 parse the buffer again."
   (interactive)
   (let (buffer-read-only)
-    (undo)))
+    (undo)
+    (message "Change in Dired buffer undone.
+Actual changes in files cannot be undone by Emacs.")))
 
 (defun dired-next-line (arg)
   "Move down lines then position at filename.
@@ -1337,7 +1344,7 @@ Optional prefix ARG says how many lines to move; default is one line."
   (dired-next-dirline (- arg)))
 
 (defun dired-up-directory (&optional other-window)
-  "Run dired on parent directory of current directory.
+  "Run Dired on parent directory of current directory.
 Find the parent directory either in this buffer or another buffer.
 Creates a buffer if necessary."
   (interactive "P")
@@ -1353,62 +1360,67 @@ Creates a buffer if necessary."
            (dired up))
          (dired-goto-file dir)))))
 
-;; Force `f' rather than `e' in the mode doc:
-(defalias 'dired-advertised-find-file 'dired-find-file)
-(defun dired-find-file ()
-  "In dired, visit the file or directory named on this line."
+(defun dired-get-file-for-visit ()
+  "Get the current line's file name, with an error if file does not exist."
   (interactive)
   (let ((file-name (file-name-sans-versions (dired-get-filename) t)))
     (if (file-exists-p file-name)
-       (find-file file-name)
+       file-name
       (if (file-symlink-p file-name)
          (error "File is a symlink to a nonexistent target")
        (error "File no longer exists; type `g' to update Dired buffer")))))
 
+;; Force `f' rather than `e' in the mode doc:
+(defalias 'dired-advertised-find-file 'dired-find-file)
+(defun dired-find-file ()
+  "In Dired, visit the file or directory named on this line."
+  (interactive)
+  (find-file (dired-get-file-for-visit)))
+
 (defun dired-find-alternate-file ()
-  "In dired, visit this file or directory instead of the dired buffer."
+  "In Dired, visit this file or directory instead of the dired buffer."
   (interactive)
   (set-buffer-modified-p nil)
-  (find-alternate-file (dired-get-filename)))
+  (find-alternate-file (dired-get-file-for-visit)))
 
 (defun dired-mouse-find-file-other-window (event)
-  "In dired, visit the file or directory name you click on."
+  "In Dired, visit the file or directory name you click on."
   (interactive "e")
   (let (file)
     (save-excursion
       (set-buffer (window-buffer (posn-window (event-end event))))
       (save-excursion
        (goto-char (posn-point (event-end event)))
-       (setq file (dired-get-filename))))
+       (setq file (dired-get-file-for-visit))))
     (select-window (posn-window (event-end event)))
     (find-file-other-window (file-name-sans-versions file t))))
 
 (defun dired-view-file ()
-  "In dired, examine a file in view mode, returning to dired when done.
+  "In Dired, examine a file in view mode, returning to dired when done.
 When file is a directory, show it in this buffer if it is inserted;
 otherwise, display it in another buffer."
   (interactive)
-  (if (file-directory-p (dired-get-filename))
-      (or (and (cdr dired-subdir-alist)
-              (dired-goto-subdir (dired-get-filename)))
-         (dired (dired-get-filename)))
-    (view-file (dired-get-filename))))
+  (let ((file (dired-get-file-for-visit)))
+    (if (file-directory-p file)
+       (or (and (cdr dired-subdir-alist)
+                (dired-goto-subdir file))
+           (dired file))
+      (view-file file))))
 
 (defun dired-find-file-other-window ()
-  "In dired, visit this file or directory in another window."
+  "In Dired, visit this file or directory in another window."
   (interactive)
-  (find-file-other-window (file-name-sans-versions (dired-get-filename) t)))
+  (find-file-other-window (dired-get-file-for-visit)))
 
 (defun dired-display-file ()
-  "In dired, display this file or directory in another window."
+  "In Dired, display this file or directory in another window."
   (interactive)
-  (let ((file (file-name-sans-versions (dired-get-filename) t)))
-    (display-buffer (find-file-noselect file))))
+  (display-buffer (find-file-noselect (dired-get-file-for-visit))))
 \f
-;;; Functions for extracting and manipulating file names in dired buffers.
+;;; Functions for extracting and manipulating file names in Dired buffers.
 
 (defun dired-get-filename (&optional localp no-error-if-not-filep)
-  "In dired, return name of file mentioned on this line.
+  "In Dired, return name of file mentioned on this line.
 Value returned normally includes the directory name.
 Optional arg LOCALP with value `no-dir' means don't include directory
   name in result.  A value of `verbatim' means to return the name exactly as
@@ -1503,35 +1515,28 @@ DIR must be a directory name, not a file name."
 (defvar dired-move-to-filename-regexp
   (let* ((l "\\([A-Za-z]\\|[^\0-\177]\\)")
         ;; In some locales, month abbreviations are as short as 2 letters,
-        ;; and they can be padded on the right with spaces.
-        ;; weiand: changed: month ends potentially with . or , or .,
-;;old   (month (concat l l "+ *"))
-        (month (concat l l "+[.]?,? *"))
-        ;; Recognize any non-ASCII character.
-        ;; The purpose is to match a Kanji character.
-        (k "[^\0-\177]")
-        ;; (k "[^\x00-\x7f\x80-\xff]")
+        ;; and they can be followed by ".".
+        (month (concat l l "+\\.?"))
         (s " ")
         (yyyy "[0-9][0-9][0-9][0-9]")
-        (mm "[ 0-1][0-9]")
-;;old   (dd "[ 0-3][0-9]")
-        (dd "[ 0-3][0-9][.]?")
+        (dd "[ 0-3][0-9]")
         (HH:MM "[ 0-2][0-9]:[0-5][0-9]")
         (seconds "[0-6][0-9]\\([.,][0-9]+\\)?")
         (zone "[-+][0-2][0-9][0-5][0-9]")
         (iso-mm-dd "[01][0-9]-[0-3][0-9]")
         (iso-time (concat HH:MM "\\(:" seconds "\\( ?" zone "\\)?\\)?"))
         (iso (concat "\\(\\(" yyyy "-\\)?" iso-mm-dd "[ T]" iso-time
-                     "\\|" yyyy "-" iso-mm-dd " ?\\)"))
-        (western (concat "\\(" month s dd "\\|" dd s month "\\)"
-         ;; weiand: changed: year potentially unaligned
-;;old                    s "\\(" HH:MM "\\|" s yyyy "\\|" yyyy s "\\)"))
-                         s "\\(" HH:MM
-                                 "\\|" yyyy s s "?"
-                                 "\\|" s "?" yyyy
-                            "\\)"))
+                     "\\|" yyyy "-" iso-mm-dd "\\)"))
+        (western (concat "\\(" month s "+" dd "\\|" dd "\\.?" s month "\\)"
+                         s "+"
+                         "\\(" HH:MM "\\|" yyyy "\\)"))
+        (western-comma (concat month s "+" dd "," s "+" yyyy))
+        ;; Japanese MS-Windows ls-lisp has one-digit months, and
+        ;; omits the Kanji characters after month and day-of-month.
+        (mm "[ 0-1]?[0-9]")
         (japanese
-         (concat mm k s dd k "?" s "+" "\\(" HH:MM "\\|" yyyy k "?" "\\)")))
+         (concat mm l "?" s dd l "?" s "+"
+                 "\\(" HH:MM "\\|" yyyy l "?" "\\)")))
         ;; 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:
         ;; -r--r--r--   1 may      1997        1168 Oct 19 16:49 README
@@ -1539,8 +1544,9 @@ DIR must be a directory name, not a file name."
         ;; The ".*" below finds the last match if there are multiple matches.
         ;; This avoids recognizing `jservice  10  1024' as a date in the line:
         ;; drwxr-xr-x  3 jservice  10  1024 Jul  2  1997 esg-host
-    (concat ".*[0-9][kMGTPEZY]?" 
-           s "\\(" western "\\|" japanese "\\|" iso "\\)" s))
+    (concat ".*[0-9][kMGTPEZY]?" s
+           "\\(" western "\\|" western-comma "\\|" japanese "\\|" iso "\\)"
+           s "+"))
   "Regular expression to match up to the file name in a directory listing.
 The default value is designed to recognize dates and times
 regardless of the language.")
@@ -1785,21 +1791,24 @@ regardless of the language.")
          nil                           ; return nil if not found
        (error "%s directory" (if (> arg 0) "Last" "First"))))))
 
-(defun dired-build-subdir-alist ()
+(defun dired-build-subdir-alist (&optional switches)
   "Build `dired-subdir-alist' by parsing the buffer.
-Returns the new value of the alist."
+Returns the new value of the alist.
+If optional arg SWITCHES is non-nil, use its value
+instead of `dired-actual-switches'."
   (interactive)
   (dired-clear-alist)
   (save-excursion
-    (let ((count 0)
-         (buffer-read-only nil)
-         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)))))
+    (let* ((count 0)
+          (buffer-read-only nil)
+          (switches (or switches dired-actual-switches))
+          new-dir-name
+          (R-ftp-base-dir-regex
+           ;; Used to expand subdirectory names correctly in recursive
+           ;; ange-ftp listings.
+           (and (string-match "R" 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)
@@ -1996,7 +2005,7 @@ Anything else, ask for each sub-directory."
       (delete-directory file))))
 
 (defun dired-do-flagged-delete (&optional nomessage)
-  "In dired, delete the files flagged for deletion.
+  "In Dired, delete the files flagged for deletion.
 If NOMESSAGE is non-nil, we don't display any message
 if there are no flagged files."
   (interactive)
@@ -2303,7 +2312,7 @@ If looking at a subdir, unmark all its files except `.' and `..'."
     (dired-mark arg)))
 
 (defun dired-flag-file-deletion (arg)
-  "In dired, flag the current line's file for deletion.
+  "In Dired, flag the current line's file for deletion.
 With prefix arg, repeat over several lines.
 
 If on a subdir headerline, mark all its files except `.' and `..'."
@@ -2312,7 +2321,7 @@ If on a subdir headerline, mark all its files except `.' and `..'."
     (dired-mark arg)))
 
 (defun dired-unmark-backward (arg)
-  "In dired, move up lines and remove deletion flag there.
+  "In Dired, move up lines and remove deletion flag there.
 Optional prefix ARG says how many lines to unflag; default is one line."
   (interactive "p")
   (dired-unmark (- arg)))
@@ -2399,7 +2408,7 @@ A prefix argument means to unmark them instead.
      "matching file")))
 
 (defun dired-flag-files-regexp (regexp)
-  "In dired, flag all files containing the specified REGEXP for deletion.
+  "In Dired, flag all files containing the specified REGEXP for deletion.
 The match is against the non-directory part of the filename.  Use `^'
   and `$' to anchor matches.  Exclude subdirs by hiding them.
 `.' and `..' are never flagged."