1 |
;;; ediff-mult.el --- support for multi-file/multi-buffer processing in Ediff |
;;; ediff-mult.el --- support for multi-file/multi-buffer processing in Ediff |
2 |
|
|
3 |
;; Copyright (C) 1995, 1996, 1997, 2001 Free Software Foundation, Inc. |
;; Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 Free Software Foundation, Inc. |
4 |
|
|
5 |
;; Author: Michael Kifer <kifer@cs.sunysb.edu> |
;; Author: Michael Kifer <kifer@cs.stonybrook.edu> |
6 |
|
|
7 |
;; This file is part of GNU Emacs. |
;; This file is part of GNU Emacs. |
8 |
|
|
815 |
(erase-buffer) |
(erase-buffer) |
816 |
;; delete phony overlays that used to represent sessions before the buff |
;; delete phony overlays that used to represent sessions before the buff |
817 |
;; was redrawn |
;; was redrawn |
818 |
(if ediff-emacs-p |
(ediff-cond-compile-for-xemacs-or-emacs |
819 |
(mapcar 'delete-overlay (overlays-in 1 1)) |
(map-extents 'delete-extent) ; xemacs |
820 |
(map-extents 'delete-extent)) |
(mapcar 'delete-overlay (overlays-in 1 1)) ; emacs |
821 |
|
) |
822 |
|
|
823 |
(insert (format ediff-meta-buffer-message |
(insert (format ediff-meta-buffer-message |
824 |
(ediff-abbrev-jobname ediff-metajob-name))) |
(ediff-abbrev-jobname ediff-metajob-name))) |
919 |
(defun ediff-update-session-marker-in-dir-meta-buffer (session-num) |
(defun ediff-update-session-marker-in-dir-meta-buffer (session-num) |
920 |
(let (buffer-meta-overlays session-info overl buffer-read-only) |
(let (buffer-meta-overlays session-info overl buffer-read-only) |
921 |
(setq overl |
(setq overl |
922 |
(if ediff-xemacs-p |
(ediff-cond-compile-for-xemacs-or-emacs |
923 |
(map-extents |
(map-extents ; xemacs |
924 |
(lambda (ext maparg) |
(lambda (ext maparg) |
925 |
(if (and |
(if (and |
926 |
(ediff-overlay-get ext 'ediff-meta-info) |
(ediff-overlay-get ext 'ediff-meta-info) |
927 |
(eq (ediff-overlay-get ext 'ediff-meta-session-number) |
(eq (ediff-overlay-get ext 'ediff-meta-session-number) |
928 |
session-num)) |
session-num)) |
929 |
ext))) |
ext))) |
930 |
;; Emacs doesn't have map-extents, so try harder |
;; Emacs doesn't have map-extents, so try harder |
931 |
;; Splice overlay lists to get all buffer overlays |
;; Splice overlay lists to get all buffer overlays |
932 |
(setq buffer-meta-overlays (overlay-lists) |
(progn |
933 |
buffer-meta-overlays (append (car buffer-meta-overlays) |
(setq buffer-meta-overlays (overlay-lists) |
934 |
(cdr buffer-meta-overlays))) |
buffer-meta-overlays (append (car buffer-meta-overlays) |
935 |
(car |
(cdr buffer-meta-overlays))) |
936 |
(delq nil |
(car |
937 |
(mapcar |
(delq nil |
938 |
(lambda (overl) |
(mapcar |
939 |
(if (and |
(lambda (overl) |
940 |
(ediff-overlay-get overl 'ediff-meta-info) |
(if (and |
941 |
(eq (ediff-overlay-get |
(ediff-overlay-get overl 'ediff-meta-info) |
942 |
overl 'ediff-meta-session-number) |
(eq (ediff-overlay-get |
943 |
session-num)) |
overl 'ediff-meta-session-number) |
944 |
overl)) |
session-num)) |
945 |
buffer-meta-overlays))))) |
overl)) |
946 |
|
buffer-meta-overlays)))) |
947 |
|
)) |
948 |
(or overl |
(or overl |
949 |
(error |
(error |
950 |
"Bug in ediff-update-session-marker-in-dir-meta-buffer: no overlay with given number %S" |
"Bug in ediff-update-session-marker-in-dir-meta-buffer: no overlay with given number %S" |
1182 |
(erase-buffer) |
(erase-buffer) |
1183 |
;; delete phony overlays that used to represent sessions before the buff |
;; delete phony overlays that used to represent sessions before the buff |
1184 |
;; was redrawn |
;; was redrawn |
1185 |
(if ediff-emacs-p |
(ediff-cond-compile-for-xemacs-or-emacs |
1186 |
(mapcar 'delete-overlay (overlays-in 1 1)) |
(map-extents 'delete-extent) ; xemacs |
1187 |
(map-extents 'delete-extent)) |
(mapcar 'delete-overlay (overlays-in 1 1)) ; emacs |
1188 |
|
) |
1189 |
|
|
1190 |
(insert "This is a registry of all active Ediff sessions. |
(insert "This is a registry of all active Ediff sessions. |
1191 |
|
|
1511 |
|
|
1512 |
;; This function executes in meta buffer. It knows where event happened. |
;; This function executes in meta buffer. It knows where event happened. |
1513 |
(defun ediff-filegroup-action () |
(defun ediff-filegroup-action () |
1514 |
"Execute appropriate action for the selected session." |
"Execute appropriate action for a selected session." |
1515 |
(interactive) |
(interactive) |
1516 |
(let* ((pos (ediff-event-point last-command-event)) |
(let* ((pos (ediff-event-point last-command-event)) |
1517 |
(meta-buf (ediff-event-buffer last-command-event)) |
(meta-buf (ediff-event-buffer last-command-event)) |
1799 |
(setq frame (window-frame wind)) |
(setq frame (window-frame wind)) |
1800 |
(raise-frame frame) |
(raise-frame frame) |
1801 |
(ediff-reset-mouse frame))) |
(ediff-reset-mouse frame))) |
1802 |
|
(sit-for 0) ; sometimes needed to synch the display and ensure that the |
1803 |
|
; point ends up after the just completed session |
1804 |
(run-hooks 'ediff-show-session-group-hook) |
(run-hooks 'ediff-show-session-group-hook) |
1805 |
)) |
)) |
1806 |
|
|
1981 |
(let (result olist tmp) |
(let (result olist tmp) |
1982 |
(if (and point (ediff-buffer-live-p buf)) |
(if (and point (ediff-buffer-live-p buf)) |
1983 |
(ediff-with-current-buffer buf |
(ediff-with-current-buffer buf |
1984 |
(if ediff-xemacs-p |
(ediff-cond-compile-for-xemacs-or-emacs |
1985 |
(setq result |
(setq result ; xemacs |
1986 |
(if (setq tmp (extent-at point buf 'ediff-meta-info)) |
(if (setq tmp (extent-at point buf 'ediff-meta-info)) |
1987 |
(ediff-overlay-get tmp 'ediff-meta-info))) |
(ediff-overlay-get tmp 'ediff-meta-info))) |
1988 |
(setq olist (overlays-at point)) |
(progn ; emacs |
1989 |
(setq olist |
(setq olist (overlays-at point)) |
1990 |
(mapcar (lambda (elt) |
(setq olist |
1991 |
(unless (overlay-get elt 'invisible) |
(mapcar (lambda (elt) |
1992 |
(overlay-get elt 'ediff-meta-info))) |
(unless (overlay-get elt 'invisible) |
1993 |
olist)) |
(overlay-get elt 'ediff-meta-info))) |
1994 |
(while (and olist (null (car olist))) |
olist)) |
1995 |
(setq olist (cdr olist))) |
(while (and olist (null (car olist))) |
1996 |
(setq result (car olist))))) |
(setq olist (cdr olist))) |
1997 |
|
(setq result (car olist))) |
1998 |
|
) |
1999 |
|
)) |
2000 |
(if result |
(if result |
2001 |
result |
result |
2002 |
(if noerror |
(if noerror |
2006 |
|
|
2007 |
|
|
2008 |
(defun ediff-get-meta-overlay-at-pos (point) |
(defun ediff-get-meta-overlay-at-pos (point) |
2009 |
(if ediff-xemacs-p |
(ediff-cond-compile-for-xemacs-or-emacs |
2010 |
(extent-at point (current-buffer) 'ediff-meta-info) |
(extent-at point (current-buffer) 'ediff-meta-info) ; xemacs |
2011 |
(let* ((overl-list (overlays-at point)) |
;; emacs |
2012 |
(overl (car overl-list))) |
(let* ((overl-list (overlays-at point)) |
2013 |
(while (and overl (null (overlay-get overl 'ediff-meta-info))) |
(overl (car overl-list))) |
2014 |
(setq overl-list (cdr overl-list) |
(while (and overl (null (overlay-get overl 'ediff-meta-info))) |
2015 |
overl (car overl-list))) |
(setq overl-list (cdr overl-list) |
2016 |
overl))) |
overl (car overl-list))) |
2017 |
|
overl) |
2018 |
|
) |
2019 |
|
) |
2020 |
|
|
2021 |
(defsubst ediff-get-session-number-at-pos (point &optional meta-buffer) |
(defsubst ediff-get-session-number-at-pos (point &optional meta-buffer) |
2022 |
(setq meta-buffer (if (ediff-buffer-live-p meta-buffer) |
(setq meta-buffer (if (ediff-buffer-live-p meta-buffer) |
2032 |
(if (eobp) |
(if (eobp) |
2033 |
(goto-char (point-min)) |
(goto-char (point-min)) |
2034 |
(let ((overl (ediff-get-meta-overlay-at-pos point))) |
(let ((overl (ediff-get-meta-overlay-at-pos point))) |
2035 |
(if ediff-xemacs-p |
(ediff-cond-compile-for-xemacs-or-emacs |
2036 |
(progn |
(progn ; xemacs |
2037 |
(if overl |
(if overl |
2038 |
(setq overl (next-extent overl)) |
(setq overl (next-extent overl)) |
2039 |
(setq overl (next-extent (current-buffer)))) |
(setq overl (next-extent (current-buffer)))) |
2040 |
(if overl |
(if overl |
2041 |
(extent-start-position overl) |
(extent-start-position overl) |
2042 |
(point-max))) |
(point-max))) |
2043 |
(if overl |
;; emacs |
2044 |
;; note: end of current overlay is the beginning of the next one |
(if overl |
2045 |
(overlay-end overl) |
;; note: end of current overlay is the beginning of the next one |
2046 |
(next-overlay-change point)))) |
(overlay-end overl) |
2047 |
|
(next-overlay-change point)) |
2048 |
|
) |
2049 |
|
) |
2050 |
)) |
)) |
2051 |
|
|
2052 |
|
|
2054 |
(if (bobp) |
(if (bobp) |
2055 |
(goto-char (point-max)) |
(goto-char (point-max)) |
2056 |
(let ((overl (ediff-get-meta-overlay-at-pos point))) |
(let ((overl (ediff-get-meta-overlay-at-pos point))) |
2057 |
(if ediff-xemacs-p |
(ediff-cond-compile-for-xemacs-or-emacs |
2058 |
(progn |
(progn |
2059 |
(if overl |
(if overl |
2060 |
(setq overl (previous-extent overl)) |
(setq overl (previous-extent overl)) |
2061 |
(setq overl (previous-extent (current-buffer)))) |
(setq overl (previous-extent (current-buffer)))) |
2062 |
(if overl |
(if overl |
2063 |
(extent-start-position overl) |
(extent-start-position overl) |
2064 |
(point-min))) |
(point-min))) |
2065 |
(if overl (setq point (overlay-start overl))) |
(progn |
2066 |
;; to get to the beginning of prev overlay |
(if overl (setq point (overlay-start overl))) |
2067 |
(if (not (bobp)) |
;; to get to the beginning of prev overlay |
2068 |
;; trick to overcome an emacs bug--doesn't always find previous |
(if (not (bobp)) |
2069 |
;; overlay change correctly |
;; trick to overcome an emacs bug--doesn't always find previous |
2070 |
(setq point (1- point))) |
;; overlay change correctly |
2071 |
(setq point (previous-overlay-change point)) |
(setq point (1- point))) |
2072 |
;; If we are not over an overlay after subtracting 1, it means we are |
(setq point (previous-overlay-change point)) |
2073 |
;; in the description area preceding session records. In this case, |
;; If we are not over an overlay after subtracting 1, it means we are |
2074 |
;; goto the top of the registry buffer. |
;; in the description area preceding session records. In this case, |
2075 |
(or (car (overlays-at point)) |
;; goto the top of the registry buffer. |
2076 |
(setq point (point-min))) |
(or (car (overlays-at point)) |
2077 |
point)))) |
(setq point (point-min))) |
2078 |
|
point) |
2079 |
|
) |
2080 |
|
))) |
2081 |
|
|
2082 |
;; this is the action invoked when the user selects a patch from the meta |
;; this is the action invoked when the user selects a patch from the meta |
2083 |
;; buffer. |
;; buffer. |