aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/dirvish-config.el53
1 files changed, 36 insertions, 17 deletions
diff --git a/modules/dirvish-config.el b/modules/dirvish-config.el
index 438d21fa..86ecfd2d 100644
--- a/modules/dirvish-config.el
+++ b/modules/dirvish-config.el
@@ -32,26 +32,45 @@
;;; ----------------------------- Dired Ediff Files -----------------------------
+(defun cj/--ediff-pair-from-files (files prompt-fn newer-than-p)
+ "Return a (OLDER . NEWER) cons for ediff'ing FILES.
+
+FILES is the list of marked file paths. PROMPT-FN is a thunk used to
+acquire a second file when only one is marked. NEWER-THAN-P is a binary
+predicate (a b) -> non-nil when A is newer than B.
+
+Signals `user-error' for zero or 3+ files; the latter matches the original
+contract, the former replaces a latent crash where the caller fell through
+to (file-newer-than-file-p nil ...).
+
+Pure helper used by `cj/dired-ediff-files'."
+ (let ((n (length files)))
+ (cond
+ ((zerop n)
+ (user-error "No files marked"))
+ ((> n 2)
+ (user-error "No more than 2 files should be marked"))
+ (t
+ (let ((file1 (car files))
+ (file2 (or (cadr files) (funcall prompt-fn))))
+ (if (funcall newer-than-p file1 file2)
+ (cons file2 file1)
+ (cons file1 file2)))))))
+
(defun cj/dired-ediff-files ()
"Ediff two selected files within Dired."
(interactive)
- (let ((files (dired-get-marked-files))
- (wnd (current-window-configuration)))
- (if (<= (length files) 2)
- (let ((file1 (car files))
- (file2 (if (cdr files)
- (cadr files)
- (read-file-name
- "file: "
- (dired-dwim-target-directory)))))
- (if (file-newer-than-file-p file1 file2)
- (ediff-files file2 file1)
- (ediff-files file1 file2))
- (add-hook 'ediff-after-quit-hook-internal
- (lambda ()
- (setq ediff-after-quit-hook-internal nil)
- (set-window-configuration wnd))))
- (error "No more than 2 files should be marked"))))
+ (let* ((wnd (current-window-configuration))
+ (pair (cj/--ediff-pair-from-files
+ (dired-get-marked-files)
+ (lambda ()
+ (read-file-name "file: " (dired-dwim-target-directory)))
+ #'file-newer-than-file-p)))
+ (ediff-files (car pair) (cdr pair))
+ (add-hook 'ediff-after-quit-hook-internal
+ (lambda ()
+ (setq ediff-after-quit-hook-internal nil)
+ (set-window-configuration wnd)))))
;; ------------------------ Create Playlist From Marked ------------------------