diff options
| -rw-r--r-- | lisp/ediff-mult.el | 141 |
1 files changed, 104 insertions, 37 deletions
diff --git a/lisp/ediff-mult.el b/lisp/ediff-mult.el index c5d4e61d670..b889ca680b9 100644 --- a/lisp/ediff-mult.el +++ b/lisp/ediff-mult.el | |||
| @@ -126,6 +126,7 @@ Useful commands: | |||
| 126 | h:\tmark session for hiding (toggle) | 126 | h:\tmark session for hiding (toggle) |
| 127 | x:\thide marked sessions; with prefix arg: unhide | 127 | x:\thide marked sessions; with prefix arg: unhide |
| 128 | m:\tmark session for a non-hiding operation (toggle) | 128 | m:\tmark session for a non-hiding operation (toggle) |
| 129 | uh/um:\tunmark all sessions marked for hiding/operation | ||
| 129 | n,SPC:\tnext session | 130 | n,SPC:\tnext session |
| 130 | p,DEL:\tprevious session | 131 | p,DEL:\tprevious session |
| 131 | E:\tbrowse Ediff on-line manual | 132 | E:\tbrowse Ediff on-line manual |
| @@ -293,7 +294,11 @@ buffers." | |||
| 293 | (define-key ediff-meta-buffer-map [delete] 'ediff-previous-meta-item) | 294 | (define-key ediff-meta-buffer-map [delete] 'ediff-previous-meta-item) |
| 294 | (define-key ediff-meta-buffer-map [backspace] 'ediff-previous-meta-item) | 295 | (define-key ediff-meta-buffer-map [backspace] 'ediff-previous-meta-item) |
| 295 | (or (ediff-one-filegroup-metajob) | 296 | (or (ediff-one-filegroup-metajob) |
| 296 | (define-key ediff-meta-buffer-map "=" 'ediff-meta-mark-equal-files)) | 297 | (progn |
| 298 | (define-key ediff-meta-buffer-map "=" nil) | ||
| 299 | (define-key ediff-meta-buffer-map "==" 'ediff-meta-mark-equal-files) | ||
| 300 | (define-key ediff-meta-buffer-map "=m" 'ediff-meta-mark-equal-files) | ||
| 301 | (define-key ediff-meta-buffer-map "=h" 'ediff-meta-mark-equal-files))) | ||
| 297 | (if ediff-no-emacs-help-in-control-buffer | 302 | (if ediff-no-emacs-help-in-control-buffer |
| 298 | (define-key ediff-meta-buffer-map "\C-h" 'ediff-previous-meta-item)) | 303 | (define-key ediff-meta-buffer-map "\C-h" 'ediff-previous-meta-item)) |
| 299 | (if ediff-emacs-p | 304 | (if ediff-emacs-p |
| @@ -682,17 +687,23 @@ behavior." | |||
| 682 | 687 | ||
| 683 | (or (ediff-one-filegroup-metajob jobname) | 688 | (or (ediff-one-filegroup-metajob jobname) |
| 684 | (ediff-draw-dir-diffs ediff-dir-difference-list)) | 689 | (ediff-draw-dir-diffs ediff-dir-difference-list)) |
| 685 | (define-key ediff-meta-buffer-map "h" 'ediff-mark-for-hiding) | 690 | (define-key |
| 691 | ediff-meta-buffer-map "h" 'ediff-mark-for-hiding-at-pos) | ||
| 692 | (define-key ediff-meta-buffer-map "x" 'ediff-hide-marked-sessions) | ||
| 693 | (define-key | ||
| 694 | ediff-meta-buffer-map "m" 'ediff-mark-for-operation-at-pos) | ||
| 695 | (define-key ediff-meta-buffer-map "u" nil) | ||
| 686 | (define-key | 696 | (define-key |
| 687 | ediff-meta-buffer-map "x" 'ediff-hide-marked-sessions) | 697 | ediff-meta-buffer-map "um" 'ediff-unmark-all-for-operation) |
| 688 | (define-key ediff-meta-buffer-map "m" 'ediff-mark-for-operation) | 698 | (define-key |
| 699 | ediff-meta-buffer-map "uh" 'ediff-unmark-all-for-hiding) | ||
| 689 | (cond ((ediff-collect-diffs-metajob jobname) | 700 | (cond ((ediff-collect-diffs-metajob jobname) |
| 690 | (define-key | 701 | (define-key |
| 691 | ediff-meta-buffer-map "P" 'ediff-collect-custom-diffs)) | 702 | ediff-meta-buffer-map "P" 'ediff-collect-custom-diffs)) |
| 692 | ((ediff-patch-metajob jobname) | 703 | ((ediff-patch-metajob jobname) |
| 693 | (define-key | 704 | (define-key |
| 694 | ediff-meta-buffer-map "P" 'ediff-meta-show-patch))) | 705 | ediff-meta-buffer-map "P" 'ediff-meta-show-patch))) |
| 695 | (define-key ediff-meta-buffer-map "u" 'ediff-up-meta-hierarchy) | 706 | (define-key ediff-meta-buffer-map "^" 'ediff-up-meta-hierarchy) |
| 696 | (define-key ediff-meta-buffer-map "D" 'ediff-show-dir-diffs))) | 707 | (define-key ediff-meta-buffer-map "D" 'ediff-show-dir-diffs))) |
| 697 | 708 | ||
| 698 | (if (eq ediff-metajob-name 'ediff-registry) | 709 | (if (eq ediff-metajob-name 'ediff-registry) |
| @@ -802,11 +813,13 @@ behavior." | |||
| 802 | (insert | 813 | (insert |
| 803 | " P:\tshow patch appropriately for the context (session or group)\n"))) | 814 | " P:\tshow patch appropriately for the context (session or group)\n"))) |
| 804 | (insert | 815 | (insert |
| 805 | " u:\tshow parent session group\n") | 816 | " ^:\tshow parent session group\n") |
| 806 | (or (ediff-one-filegroup-metajob) | 817 | (or (ediff-one-filegroup-metajob) |
| 807 | (insert | 818 | (insert |
| 808 | " D:\tshow differences among directories\n" | 819 | " D:\tshow differences among directories\n" |
| 809 | " =:\tmark identical files in each session\n\n")) | 820 | " ==:\tfor each session, show which files are identical\n" |
| 821 | " =h:\tlike ==, but also marks those sessions for hiding\n" | ||
| 822 | " =m:\tlike ==, but also marks those sessions for operation\n\n")) | ||
| 810 | 823 | ||
| 811 | (insert "\n") | 824 | (insert "\n") |
| 812 | (if (and (stringp regexp) (> (length regexp) 0)) | 825 | (if (and (stringp regexp) (> (length regexp) 0)) |
| @@ -1257,28 +1270,37 @@ Useful commands: | |||
| 1257 | (if (numberp session-number) | 1270 | (if (numberp session-number) |
| 1258 | (ediff-overlay-put overl 'ediff-meta-session-number session-number)))) | 1271 | (ediff-overlay-put overl 'ediff-meta-session-number session-number)))) |
| 1259 | 1272 | ||
| 1260 | (defun ediff-mark-for-hiding (unmark) | 1273 | (defun ediff-mark-for-hiding-at-pos (unmark) |
| 1261 | "Mark session for hiding. With prefix arg, unmark." | 1274 | "Mark session for hiding. With prefix arg, unmark." |
| 1262 | (interactive "P") | 1275 | (interactive "P") |
| 1263 | (let* ((pos (ediff-event-point last-command-event)) | 1276 | (let* ((pos (ediff-event-point last-command-event)) |
| 1264 | (meta-buf (ediff-event-buffer last-command-event)) | 1277 | (meta-buf (ediff-event-buffer last-command-event)) |
| 1265 | ;; ediff-get-meta-info gives error if meta-buf or pos are invalid | 1278 | ;; ediff-get-meta-info gives error if meta-buf or pos are invalid |
| 1266 | (info (ediff-get-meta-info meta-buf pos)) | 1279 | (info (ediff-get-meta-info meta-buf pos)) |
| 1267 | (session-buf (ediff-get-session-buffer info)) | ||
| 1268 | (session-number (ediff-get-session-number-at-pos pos))) | 1280 | (session-number (ediff-get-session-number-at-pos pos))) |
| 1269 | (if (eq (ediff-get-session-status info) ?H) | 1281 | (ediff-mark-session-for-hiding info unmark) |
| 1270 | (setq unmark t)) | 1282 | (ediff-next-meta-item 1) |
| 1271 | (if unmark | 1283 | (save-excursion |
| 1272 | (ediff-set-session-status info nil) | 1284 | (ediff-update-meta-buffer meta-buf nil session-number)) |
| 1273 | (if (ediff-buffer-live-p session-buf) | ||
| 1274 | (error "Can't hide active session, %s" (buffer-name session-buf))) | ||
| 1275 | (ediff-set-session-status info ?H)) | ||
| 1276 | (or unmark | ||
| 1277 | (ediff-next-meta-item 1)) | ||
| 1278 | (ediff-update-meta-buffer meta-buf nil session-number) | ||
| 1279 | )) | 1285 | )) |
| 1280 | 1286 | ||
| 1281 | (defun ediff-mark-for-operation (unmark) | 1287 | ;; Returns whether session was marked or unmarked |
| 1288 | (defun ediff-mark-session-for-hiding (info unmark) | ||
| 1289 | (let ((session-buf (ediff-get-session-buffer info)) | ||
| 1290 | ignore) | ||
| 1291 | (cond ((eq unmark 'mark) (setq unmark nil)) | ||
| 1292 | ((eq (ediff-get-session-status info) ?H) (setq unmark t)) | ||
| 1293 | (unmark ; says unmark, but the marker is different from H | ||
| 1294 | (setq ignore t))) | ||
| 1295 | (cond (ignore) | ||
| 1296 | (unmark (ediff-set-session-status info nil)) | ||
| 1297 | ;;; (if (ediff-buffer-live-p session-buf) | ||
| 1298 | ;;; (error "Can't hide active session, %s" (buffer-name session-buf))) | ||
| 1299 | (t (ediff-set-session-status info ?H)))) | ||
| 1300 | unmark) | ||
| 1301 | |||
| 1302 | |||
| 1303 | (defun ediff-mark-for-operation-at-pos (unmark) | ||
| 1282 | "Mark session for a group operation. With prefix arg, unmark." | 1304 | "Mark session for a group operation. With prefix arg, unmark." |
| 1283 | (interactive "P") | 1305 | (interactive "P") |
| 1284 | (let* ((pos (ediff-event-point last-command-event)) | 1306 | (let* ((pos (ediff-event-point last-command-event)) |
| @@ -1286,16 +1308,27 @@ Useful commands: | |||
| 1286 | ;; ediff-get-meta-info gives error if meta-buf or pos are invalid | 1308 | ;; ediff-get-meta-info gives error if meta-buf or pos are invalid |
| 1287 | (info (ediff-get-meta-info meta-buf pos)) | 1309 | (info (ediff-get-meta-info meta-buf pos)) |
| 1288 | (session-number (ediff-get-session-number-at-pos pos))) | 1310 | (session-number (ediff-get-session-number-at-pos pos))) |
| 1289 | (if (eq (ediff-get-session-status info) ?*) | 1311 | (ediff-mark-session-for-operation info unmark) |
| 1290 | (setq unmark t)) | 1312 | (ediff-next-meta-item 1) |
| 1291 | (if unmark | 1313 | (save-excursion |
| 1292 | (ediff-set-session-status info nil) | 1314 | (ediff-update-meta-buffer meta-buf nil session-number)) |
| 1293 | (ediff-set-session-status info ?*)) | ||
| 1294 | (or unmark | ||
| 1295 | (ediff-next-meta-item 1)) | ||
| 1296 | (ediff-update-meta-buffer meta-buf nil session-number) | ||
| 1297 | )) | 1315 | )) |
| 1298 | 1316 | ||
| 1317 | |||
| 1318 | ;; returns whether session was unmarked. | ||
| 1319 | ;; remember: this is a toggle op | ||
| 1320 | (defun ediff-mark-session-for-operation (info unmark) | ||
| 1321 | (let (ignore) | ||
| 1322 | (cond ((eq unmark 'mark) (setq unmark nil)) | ||
| 1323 | ((eq (ediff-get-session-status info) ?*) (setq unmark t)) | ||
| 1324 | (unmark ; says unmark, but the marker is different from * | ||
| 1325 | (setq ignore t))) | ||
| 1326 | (cond (ignore) | ||
| 1327 | (unmark (ediff-set-session-status info nil)) | ||
| 1328 | (t (ediff-set-session-status info ?*)))) | ||
| 1329 | unmark) | ||
| 1330 | |||
| 1331 | |||
| 1299 | (defun ediff-hide-marked-sessions (unhide) | 1332 | (defun ediff-hide-marked-sessions (unhide) |
| 1300 | "Hide marked sessions. With prefix arg, unhide." | 1333 | "Hide marked sessions. With prefix arg, unhide." |
| 1301 | (interactive "P") | 1334 | (interactive "P") |
| @@ -1980,11 +2013,31 @@ If this is a session registry buffer then just bury it." | |||
| 1980 | (ediff-patch-file-internal meta-patchbuf file startup-hooks))))) | 2013 | (ediff-patch-file-internal meta-patchbuf file startup-hooks))))) |
| 1981 | 2014 | ||
| 1982 | 2015 | ||
| 2016 | (defun ediff-unmark-all-for-operation () | ||
| 2017 | "Unmark all sessions marked for operation." | ||
| 2018 | (interactive) | ||
| 2019 | (let ((list (cdr ediff-meta-list))) | ||
| 2020 | (while (setq elt (car list)) | ||
| 2021 | (ediff-mark-session-for-operation elt 'unmark) | ||
| 2022 | (setq list (cdr list)))) | ||
| 2023 | (ediff-update-meta-buffer (current-buffer) 'must-redraw)) | ||
| 2024 | |||
| 2025 | (defun ediff-unmark-all-for-hiding () | ||
| 2026 | "Unmark all sessions marked for hiding." | ||
| 2027 | (interactive) | ||
| 2028 | (let ((list (cdr ediff-meta-list))) | ||
| 2029 | (while (setq elt (car list)) | ||
| 2030 | (ediff-mark-session-for-hiding elt 'unmark) | ||
| 2031 | (setq list (cdr list)))) | ||
| 2032 | (ediff-update-meta-buffer (current-buffer) 'must-redraw)) | ||
| 2033 | |||
| 2034 | |||
| 1983 | (defun ediff-meta-mark-equal-files () | 2035 | (defun ediff-meta-mark-equal-files () |
| 1984 | "Run though the session list and mark identical files. | 2036 | "Run though the session list and mark identical files. |
| 1985 | This is used only for sessions that involve 2 or 3 files at the same time." | 2037 | This is used only for sessions that involve 2 or 3 files at the same time." |
| 1986 | (interactive) | 2038 | (interactive) |
| 1987 | (let ((list (cdr ediff-meta-list)) | 2039 | (let ((list (cdr ediff-meta-list)) |
| 2040 | marked1 marked2 marked3 | ||
| 1988 | fileinfo1 fileinfo2 fileinfo3 elt) | 2041 | fileinfo1 fileinfo2 fileinfo3 elt) |
| 1989 | (while (setq elt (car list)) | 2042 | (while (setq elt (car list)) |
| 1990 | (setq fileinfo1 (ediff-get-session-objA elt) | 2043 | (setq fileinfo1 (ediff-get-session-objA elt) |
| @@ -1994,24 +2047,38 @@ This is used only for sessions that involve 2 or 3 files at the same time." | |||
| 1994 | (ediff-set-file-eqstatus fileinfo2 nil) | 2047 | (ediff-set-file-eqstatus fileinfo2 nil) |
| 1995 | (ediff-set-file-eqstatus fileinfo3 nil) | 2048 | (ediff-set-file-eqstatus fileinfo3 nil) |
| 1996 | 2049 | ||
| 1997 | (ediff-mark-if-equal fileinfo1 fileinfo2) | 2050 | (setq marked1 t |
| 2051 | marked2 t | ||
| 2052 | marked3 t) | ||
| 2053 | (or (ediff-mark-if-equal fileinfo1 fileinfo2) | ||
| 2054 | (setq marked1 nil)) | ||
| 1998 | (if (ediff-metajob3) | 2055 | (if (ediff-metajob3) |
| 1999 | (progn | 2056 | (progn |
| 2000 | (ediff-mark-if-equal fileinfo1 fileinfo3) | 2057 | (or (ediff-mark-if-equal fileinfo1 fileinfo3) |
| 2001 | (ediff-mark-if-equal fileinfo2 fileinfo3))) | 2058 | (setq marked2 nil)) |
| 2059 | (or (ediff-mark-if-equal fileinfo2 fileinfo3) | ||
| 2060 | (setq marked3 nil)))) | ||
| 2061 | (if (and marked1 marked2 marked3) | ||
| 2062 | (cond ((eq last-command-char ?h) | ||
| 2063 | (ediff-mark-session-for-hiding elt 'mark)) | ||
| 2064 | ((eq last-command-char ?m) | ||
| 2065 | (ediff-mark-session-for-operation elt 'mark)) | ||
| 2066 | )) | ||
| 2002 | (setq list (cdr list)))) | 2067 | (setq list (cdr list)))) |
| 2003 | (ediff-update-meta-buffer (current-buffer) 'must-redraw)) | 2068 | (ediff-update-meta-buffer (current-buffer) 'must-redraw)) |
| 2004 | 2069 | ||
| 2005 | ;; mark files 1 and 2 as equal, if they are. | 2070 | ;; mark files 1 and 2 as equal, if they are. |
| 2071 | ;; returns t, if something was marked | ||
| 2006 | (defun ediff-mark-if-equal (fileinfo1 fileinfo2) | 2072 | (defun ediff-mark-if-equal (fileinfo1 fileinfo2) |
| 2007 | (let ((f1 (car fileinfo1)) | 2073 | (let ((f1 (car fileinfo1)) |
| 2008 | (f2 (car fileinfo2))) | 2074 | (f2 (car fileinfo2))) |
| 2009 | (or (file-directory-p f1) | 2075 | (cond ((file-directory-p f1) nil) |
| 2010 | (file-directory-p f2) | 2076 | ((file-directory-p f2) nil) |
| 2011 | (if (ediff-same-file-contents f1 f2) | 2077 | ((ediff-same-file-contents f1 f2) |
| 2012 | (progn | 2078 | (ediff-set-file-eqstatus fileinfo1 t) |
| 2013 | (ediff-set-file-eqstatus fileinfo1 t) | 2079 | (ediff-set-file-eqstatus fileinfo2 t) |
| 2014 | (ediff-set-file-eqstatus fileinfo2 t)))))) | 2080 | t)) |
| 2081 | )) | ||
| 2015 | 2082 | ||
| 2016 | 2083 | ||
| 2017 | 2084 | ||