X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/328b4b7052a5d464e52818ff0f1a33b96e5e761c..223a2a62985b8bad856872a2cb3ff827f76949fb:/lisp/ediff-mult.el diff --git a/lisp/ediff-mult.el b/lisp/ediff-mult.el index 230938ee8e..b889ca680b 100644 --- a/lisp/ediff-mult.el +++ b/lisp/ediff-mult.el @@ -126,6 +126,7 @@ Useful commands: h:\tmark session for hiding (toggle) x:\thide marked sessions; with prefix arg: unhide m:\tmark session for a non-hiding operation (toggle) + uh/um:\tunmark all sessions marked for hiding/operation n,SPC:\tnext session p,DEL:\tprevious session E:\tbrowse Ediff on-line manual @@ -293,7 +294,11 @@ buffers." (define-key ediff-meta-buffer-map [delete] 'ediff-previous-meta-item) (define-key ediff-meta-buffer-map [backspace] 'ediff-previous-meta-item) (or (ediff-one-filegroup-metajob) - (define-key ediff-meta-buffer-map "=" 'ediff-meta-mark-equal-files)) + (progn + (define-key ediff-meta-buffer-map "=" nil) + (define-key ediff-meta-buffer-map "==" 'ediff-meta-mark-equal-files) + (define-key ediff-meta-buffer-map "=m" 'ediff-meta-mark-equal-files) + (define-key ediff-meta-buffer-map "=h" 'ediff-meta-mark-equal-files))) (if ediff-no-emacs-help-in-control-buffer (define-key ediff-meta-buffer-map "\C-h" 'ediff-previous-meta-item)) (if ediff-emacs-p @@ -682,17 +687,23 @@ behavior." (or (ediff-one-filegroup-metajob jobname) (ediff-draw-dir-diffs ediff-dir-difference-list)) - (define-key ediff-meta-buffer-map "h" 'ediff-mark-for-hiding) + (define-key + ediff-meta-buffer-map "h" 'ediff-mark-for-hiding-at-pos) + (define-key ediff-meta-buffer-map "x" 'ediff-hide-marked-sessions) + (define-key + ediff-meta-buffer-map "m" 'ediff-mark-for-operation-at-pos) + (define-key ediff-meta-buffer-map "u" nil) (define-key - ediff-meta-buffer-map "x" 'ediff-hide-marked-sessions) - (define-key ediff-meta-buffer-map "m" 'ediff-mark-for-operation) + ediff-meta-buffer-map "um" 'ediff-unmark-all-for-operation) + (define-key + ediff-meta-buffer-map "uh" 'ediff-unmark-all-for-hiding) (cond ((ediff-collect-diffs-metajob jobname) (define-key ediff-meta-buffer-map "P" 'ediff-collect-custom-diffs)) ((ediff-patch-metajob jobname) (define-key ediff-meta-buffer-map "P" 'ediff-meta-show-patch))) - (define-key ediff-meta-buffer-map "u" 'ediff-up-meta-hierarchy) + (define-key ediff-meta-buffer-map "^" 'ediff-up-meta-hierarchy) (define-key ediff-meta-buffer-map "D" 'ediff-show-dir-diffs))) (if (eq ediff-metajob-name 'ediff-registry) @@ -802,11 +813,13 @@ behavior." (insert " P:\tshow patch appropriately for the context (session or group)\n"))) (insert - " u:\tshow parent session group\n") + " ^:\tshow parent session group\n") (or (ediff-one-filegroup-metajob) (insert " D:\tshow differences among directories\n" - " =:\tmark identical files in each session\n\n")) + " ==:\tfor each session, show which files are identical\n" + " =h:\tlike ==, but also marks those sessions for hiding\n" + " =m:\tlike ==, but also marks those sessions for operation\n\n")) (insert "\n") (if (and (stringp regexp) (> (length regexp) 0)) @@ -1257,28 +1270,37 @@ Useful commands: (if (numberp session-number) (ediff-overlay-put overl 'ediff-meta-session-number session-number)))) -(defun ediff-mark-for-hiding (unmark) +(defun ediff-mark-for-hiding-at-pos (unmark) "Mark session for hiding. With prefix arg, unmark." (interactive "P") (let* ((pos (ediff-event-point last-command-event)) (meta-buf (ediff-event-buffer last-command-event)) ;; ediff-get-meta-info gives error if meta-buf or pos are invalid (info (ediff-get-meta-info meta-buf pos)) - (session-buf (ediff-get-session-buffer info)) (session-number (ediff-get-session-number-at-pos pos))) - (if (eq (ediff-get-session-status info) ?H) - (setq unmark t)) - (if unmark - (ediff-set-session-status info nil) - (if (ediff-buffer-live-p session-buf) - (error "Can't hide active session, %s" (buffer-name session-buf))) - (ediff-set-session-status info ?H)) - (or unmark - (ediff-next-meta-item 1)) - (ediff-update-meta-buffer meta-buf nil session-number) + (ediff-mark-session-for-hiding info unmark) + (ediff-next-meta-item 1) + (save-excursion + (ediff-update-meta-buffer meta-buf nil session-number)) )) -(defun ediff-mark-for-operation (unmark) +;; Returns whether session was marked or unmarked +(defun ediff-mark-session-for-hiding (info unmark) + (let ((session-buf (ediff-get-session-buffer info)) + ignore) + (cond ((eq unmark 'mark) (setq unmark nil)) + ((eq (ediff-get-session-status info) ?H) (setq unmark t)) + (unmark ; says unmark, but the marker is different from H + (setq ignore t))) + (cond (ignore) + (unmark (ediff-set-session-status info nil)) +;;; (if (ediff-buffer-live-p session-buf) +;;; (error "Can't hide active session, %s" (buffer-name session-buf))) + (t (ediff-set-session-status info ?H)))) + unmark) + + +(defun ediff-mark-for-operation-at-pos (unmark) "Mark session for a group operation. With prefix arg, unmark." (interactive "P") (let* ((pos (ediff-event-point last-command-event)) @@ -1286,16 +1308,27 @@ Useful commands: ;; ediff-get-meta-info gives error if meta-buf or pos are invalid (info (ediff-get-meta-info meta-buf pos)) (session-number (ediff-get-session-number-at-pos pos))) - (if (eq (ediff-get-session-status info) ?*) - (setq unmark t)) - (if unmark - (ediff-set-session-status info nil) - (ediff-set-session-status info ?*)) - (or unmark - (ediff-next-meta-item 1)) - (ediff-update-meta-buffer meta-buf nil session-number) + (ediff-mark-session-for-operation info unmark) + (ediff-next-meta-item 1) + (save-excursion + (ediff-update-meta-buffer meta-buf nil session-number)) )) + +;; returns whether session was unmarked. +;; remember: this is a toggle op +(defun ediff-mark-session-for-operation (info unmark) + (let (ignore) + (cond ((eq unmark 'mark) (setq unmark nil)) + ((eq (ediff-get-session-status info) ?*) (setq unmark t)) + (unmark ; says unmark, but the marker is different from * + (setq ignore t))) + (cond (ignore) + (unmark (ediff-set-session-status info nil)) + (t (ediff-set-session-status info ?*)))) + unmark) + + (defun ediff-hide-marked-sessions (unhide) "Hide marked sessions. With prefix arg, unhide." (interactive "P") @@ -1456,7 +1489,7 @@ all marked sessions must be active." ;; ediff-get-meta-info gives error if meta-buf or pos are invalid (info (ediff-get-meta-info meta-buf pos)) (session-buf (ediff-get-session-buffer info)) - (session-number (ediff-get-session-number-at-pos pos)) + (session-number (ediff-get-session-number-at-pos pos meta-buf)) merge-autostore-dir file1 file2 file3 regexp) (setq file1 (ediff-get-session-objA-name info) @@ -1897,9 +1930,13 @@ If this is a session registry buffer then just bury it." overl (car overl-list))) overl))) -(defsubst ediff-get-session-number-at-pos (point) - (ediff-overlay-get - (ediff-get-meta-overlay-at-pos point) 'ediff-meta-session-number)) +(defsubst ediff-get-session-number-at-pos (point &optional meta-buffer) + (setq meta-buffer (if (ediff-buffer-live-p meta-buffer) + meta-buffer + (current-buffer))) + (ediff-with-current-buffer meta-buffer + (ediff-overlay-get + (ediff-get-meta-overlay-at-pos point) 'ediff-meta-session-number))) ;; Return location of the next meta overlay after point @@ -1976,11 +2013,31 @@ If this is a session registry buffer then just bury it." (ediff-patch-file-internal meta-patchbuf file startup-hooks))))) +(defun ediff-unmark-all-for-operation () + "Unmark all sessions marked for operation." + (interactive) + (let ((list (cdr ediff-meta-list))) + (while (setq elt (car list)) + (ediff-mark-session-for-operation elt 'unmark) + (setq list (cdr list)))) + (ediff-update-meta-buffer (current-buffer) 'must-redraw)) + +(defun ediff-unmark-all-for-hiding () + "Unmark all sessions marked for hiding." + (interactive) + (let ((list (cdr ediff-meta-list))) + (while (setq elt (car list)) + (ediff-mark-session-for-hiding elt 'unmark) + (setq list (cdr list)))) + (ediff-update-meta-buffer (current-buffer) 'must-redraw)) + + (defun ediff-meta-mark-equal-files () "Run though the session list and mark identical files. This is used only for sessions that involve 2 or 3 files at the same time." (interactive) (let ((list (cdr ediff-meta-list)) + marked1 marked2 marked3 fileinfo1 fileinfo2 fileinfo3 elt) (while (setq elt (car list)) (setq fileinfo1 (ediff-get-session-objA elt) @@ -1990,24 +2047,38 @@ This is used only for sessions that involve 2 or 3 files at the same time." (ediff-set-file-eqstatus fileinfo2 nil) (ediff-set-file-eqstatus fileinfo3 nil) - (ediff-mark-if-equal fileinfo1 fileinfo2) + (setq marked1 t + marked2 t + marked3 t) + (or (ediff-mark-if-equal fileinfo1 fileinfo2) + (setq marked1 nil)) (if (ediff-metajob3) (progn - (ediff-mark-if-equal fileinfo1 fileinfo3) - (ediff-mark-if-equal fileinfo2 fileinfo3))) + (or (ediff-mark-if-equal fileinfo1 fileinfo3) + (setq marked2 nil)) + (or (ediff-mark-if-equal fileinfo2 fileinfo3) + (setq marked3 nil)))) + (if (and marked1 marked2 marked3) + (cond ((eq last-command-char ?h) + (ediff-mark-session-for-hiding elt 'mark)) + ((eq last-command-char ?m) + (ediff-mark-session-for-operation elt 'mark)) + )) (setq list (cdr list)))) (ediff-update-meta-buffer (current-buffer) 'must-redraw)) ;; mark files 1 and 2 as equal, if they are. +;; returns t, if something was marked (defun ediff-mark-if-equal (fileinfo1 fileinfo2) (let ((f1 (car fileinfo1)) (f2 (car fileinfo2))) - (or (file-directory-p f1) - (file-directory-p f2) - (if (ediff-same-file-contents f1 f2) - (progn - (ediff-set-file-eqstatus fileinfo1 t) - (ediff-set-file-eqstatus fileinfo2 t)))))) + (cond ((file-directory-p f1) nil) + ((file-directory-p f2) nil) + ((ediff-same-file-contents f1 f2) + (ediff-set-file-eqstatus fileinfo1 t) + (ediff-set-file-eqstatus fileinfo2 t) + t)) + ))