]> code.delx.au - gnu-emacs/blobdiff - lisp/dired-aux.el
Merged in changes from CVS trunk.
[gnu-emacs] / lisp / dired-aux.el
index fe8e33cfd48a8685973c72a01490574ac33bc39b..b31d20782f38f25e6a0ec75ffefb73747bcce678 100644 (file)
@@ -64,7 +64,10 @@ With prefix arg, prompt for second argument SWITCHES,
                                   (if default
                                       (concat "(default " default ") ")
                                     ""))
-                          (dired-current-directory) default t)
+                          (if default
+                              (dired-current-directory)
+                            (dired-dwim-target-directory))
+                          default t)
           (if current-prefix-arg
               (read-string "Options for diff: "
                            (if (stringp diff-switches)
@@ -93,6 +96,8 @@ With prefix arg, prompt for argument SWITCHES which is options for `diff'."
 Compare file attributes of files in the current directory
 with file attributes in directory DIR2 using PREDICATE on pairs of files
 with the same name.  Mark files for which PREDICATE returns non-nil.
+Mark files with different names if PREDICATE is nil (or interactively
+when the user enters empty input at the predicate prompt).
 
 PREDICATE is a Lisp expression that can refer to the following variables:
 
@@ -115,7 +120,7 @@ Examples of PREDICATE:
    (list (read-file-name (format "Compare %s with: "
                                 (dired-current-directory))
                         (dired-dwim-target-directory))
-        (read-minibuffer "Mark if (lisp expr): ")))
+         (read-from-minibuffer "Mark if (lisp expr or RET): " nil nil t nil "nil")))
   (let* ((dir1 (dired-current-directory))
          (file-alist1 (dired-files-attributes dir1))
          (file-alist2 (dired-files-attributes dir2))
@@ -183,8 +188,20 @@ List has a form of (file-name full-file-name (attribute-list))"
              (file-attributes full-file-name))))
    (directory-files dir)))
 \f
+
+(defun dired-touch-initial (files)
+  "Create initial input value for `touch' command."
+  (let (initial)
+    (while files
+      (let ((current (nth 5 (file-attributes (car files)))))
+        (if (and initial (not (equal initial current)))
+            (setq initial (current-time) files nil)
+          (setq initial current))
+        (setq files (cdr files))))
+    (format-time-string "%Y%m%d%H%M.%S" initial)))
+
 (defun dired-do-chxxx (attribute-name program op-symbol arg)
-  ;; Change file attributes (mode, group, owner) of marked files and
+  ;; Change file attributes (mode, group, owner, timestamp) of marked files and
   ;; refresh their file lines.
   ;; ATTRIBUTE-NAME is a string describing the attribute to the user.
   ;; PROGRAM is the program used to change the attribute.
@@ -194,14 +211,18 @@ List has a form of (file-name full-file-name (attribute-list))"
         (new-attribute
          (dired-mark-read-string
           (concat "Change " attribute-name " of %s to: ")
-          nil op-symbol arg files))
+          (if (eq op-symbol 'touch) (dired-touch-initial files))
+          op-symbol arg files))
         (operation (concat program " " new-attribute))
         failures)
     (setq failures
          (dired-bunch-files 10000
                             (function dired-check-process)
                             (append
-                             (list operation program new-attribute)
+                             (list operation program)
+                             (if (eq op-symbol 'touch)
+                                 '("-t") nil)
+                             (list new-attribute)
                              (if (string-match "gnu" system-configuration)
                                  '("--") nil))
                             files))
@@ -234,6 +255,12 @@ This calls chmod, thus symbolic modes like `g+w' are allowed."
       (error "chown not supported on this system"))
   (dired-do-chxxx "Owner" dired-chown-program 'chown arg))
 
+(defun dired-do-touch (&optional arg)
+  "Change the timestamp of the marked (or next ARG) files.
+This calls touch."
+  (interactive "P")
+  (dired-do-chxxx "Timestamp" dired-touch-program 'touch arg))
+
 ;; Process all the files in FILES in batches of a convenient size,
 ;; by means of (FUNCALL FUNCTION ARGS... SOME-FILES...).
 ;; Batches are chosen to need less than MAX chars for the file names,
@@ -659,6 +686,8 @@ and use this command with a prefix argument (the value does not matter)."
     ;; For .z, try gunzip.  It might be an old gzip file,
     ;; or it might be from compact? pack? (which?) but gunzip handles both.
     ("\\.z\\'" "" "gunzip")
+    ("\\.dz\\'" "" "dictunzip")
+    ("\\.tbz\\'" ".tar" "bunzip2")
     ("\\.bz2\\'" "" "bunzip2")
     ;; This item controls naming for compression.
     ("\\.tar\\'" ".tgz" nil))