From 2fd5e67d925be2b5fc945be5aaba27904cc65022 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Wed, 19 Sep 2012 02:40:39 +0300 Subject: [PATCH] * lisp/dired-aux.el (dired-diff): Restore original functionality of getting the default value, but keep new feature of using the latest existing backup file (`diff-latest-backup-file'). --- etc/NEWS | 4 +-- lisp/ChangeLog | 6 +++++ lisp/dired-aux.el | 66 ++++++++++++++++++++++++++++++++--------------- lisp/dired.el | 17 +++++++----- 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index c972180bbbd..15c06181a9a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -468,8 +468,8 @@ file at point. mark/unmark/flag all files in the active region. *** The minibuffer default for `=' (`dired-diff) has changed. -It is now the backup file for the file at point, if one exists, rather -than the file at the mark. +It is now the backup file for the file at point, if one exists. +In Transient Mark mode the default is the file at the active mark. *** `M-=' is no longer bound to `dired-backup-diff' in Dired buffers. The global binding for `M-=', `count-words-region' is in effect. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 66927960d25..8036e819d4d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2012-09-18 Juri Linkov + + * dired-aux.el (dired-diff): Restore original functionality of + getting the default value, but keep new feature of using the + latest existing backup file (`diff-latest-backup-file'). + 2012-09-18 Juri Linkov * dired.el (dired-mark): If the region is active in Transient Mark diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index 54f9f03a69c..7ba67050337 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -51,33 +51,57 @@ into this list; they also should call `dired-log' to log the errors.") (defconst dired-star-subst-regexp "\\(^\\|[ \t]\\)\\*\\([ \t]\\|$\\)") (defconst dired-quark-subst-regexp "\\(^\\|[ \t]\\)\\?\\([ \t]\\|$\\)") +(declare-function diff-latest-backup-file "diff" (fn)) ; actually belongs into files.el + ;;;###autoload (defun dired-diff (file &optional switches) "Compare file at point with file FILE using `diff'. -If called interactively, prompt for FILE; if the file at point -has a backup file, use that as the default. +If called interactively, prompt for FILE. If the file at point +has a backup file, use that as the default. If the mark is active +in Transient Mark mode, use the file at the mark as the default. +\(That's the mark set by \\[set-mark-command], not by Dired's +\\[dired-mark] command.) + +FILE is the first file given to `diff'. The file at point +is the second file given to `diff'. -FILE is the first file given to `diff'. -With prefix arg, prompt for second argument SWITCHES, -which is the string of command switches for `diff'." +With prefix arg, prompt for second argument SWITCHES, which is +the string of command switches for the third argument of `diff'." (interactive (let* ((current (dired-get-filename t)) - (oldf (file-newest-backup current)) - (dir (if oldf (file-name-directory oldf)))) - (list (read-file-name - (format "Diff %s with%s: " - (file-name-nondirectory current) - (if oldf - (concat " (default " - (file-name-nondirectory oldf) - ")") - "")) - dir oldf t) - (if current-prefix-arg - (read-string "Options for diff: " - (if (stringp diff-switches) - diff-switches - (mapconcat 'identity diff-switches " "))))))) + ;; Get the latest existing backup file. + (oldf (diff-latest-backup-file current)) + ;; Get the file at the mark. + (file-at-mark (if (and transient-mark-mode mark-active) + (save-excursion (goto-char (mark t)) + (dired-get-filename t t)))) + (default-file (or file-at-mark + (and oldf (file-name-nondirectory oldf)))) + ;; Use it as default if it's not the same as the current file, + ;; and the target dir is current or there is a default file. + (default (if (and (not (equal default-file current)) + (or (equal (dired-dwim-target-directory) + (dired-current-directory)) + default-file)) + default-file)) + (target-dir (if default + (dired-current-directory) + (dired-dwim-target-directory))) + (defaults (dired-dwim-target-defaults (list current) target-dir))) + (list + (minibuffer-with-setup-hook + (lambda () + (set (make-local-variable 'minibuffer-default-add-function) nil) + (setq minibuffer-default defaults)) + (read-file-name + (format "Diff %s with%s: " current + (if default (format " (default %s)" default) "")) + target-dir default t)) + (if current-prefix-arg + (read-string "Options for diff: " + (if (stringp diff-switches) + diff-switches + (mapconcat 'identity diff-switches " "))))))) (let ((current (dired-get-filename t))) (when (or (equal (expand-file-name file) (expand-file-name current)) diff --git a/lisp/dired.el b/lisp/dired.el index abbd5acaf4f..0f453fe8f5d 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -3763,17 +3763,22 @@ Ask means pop up a menu for the user to select one of copy, move or link." ;;;;;; dired-run-shell-command dired-do-shell-command dired-do-async-shell-command ;;;;;; dired-clean-directory dired-do-print dired-do-touch dired-do-chown ;;;;;; dired-do-chgrp dired-do-chmod dired-compare-directories dired-backup-diff -;;;;;; dired-diff) "dired-aux" "dired-aux.el" "3650b53533253c50b10e2aa8c9005ebf") +;;;;;; dired-diff) "dired-aux" "dired-aux.el" "2a883f0d481a8d0292eb90c09ae36a8e") ;;; Generated autoloads from dired-aux.el (autoload 'dired-diff "dired-aux" "\ Compare file at point with file FILE using `diff'. -If called interactively, prompt for FILE; if the file at point -has a backup file, use that as the default. +If called interactively, prompt for FILE. If the file at point +has a backup file, use that as the default. If the mark is active +in Transient Mark mode, use the file at the mark as the default. +\(That's the mark set by \\[set-mark-command], not by Dired's +\\[dired-mark] command.) -FILE is the first file given to `diff'. -With prefix arg, prompt for second argument SWITCHES, -which is the string of command switches for `diff'. +FILE is the first file given to `diff'. The file at point +is the second file given to `diff'. + +With prefix arg, prompt for second argument SWITCHES, which is +the string of command switches for the third argument of `diff'. \(fn FILE &optional SWITCHES)" t nil) -- 2.39.2