comparison lisp/ediff-init.el @ 19047:f90d40b0bff5

new version
author Michael Kifer <kifer@cs.stonybrook.edu>
date Thu, 31 Jul 1997 04:04:23 +0000
parents 1405083241e8
children eb1cef5fa337
comparison
equal deleted inserted replaced
19046:689f3dc973f9 19047:f90d40b0bff5
95 ;; Ancestor buffer 95 ;; Ancestor buffer
96 (ediff-defvar-local ediff-ancestor-buffer nil "") 96 (ediff-defvar-local ediff-ancestor-buffer nil "")
97 ;; The Ediff control buffer 97 ;; The Ediff control buffer
98 (ediff-defvar-local ediff-control-buffer nil "") 98 (ediff-defvar-local ediff-control-buffer nil "")
99 99
100
101 ;; Association between buff-type and ediff-buffer-*
102 (defconst ediff-buffer-alist
103 '((?A . ediff-buffer-A)
104 (?B . ediff-buffer-B)
105 (?C . ediff-buffer-C)))
106
100 ;;; Macros 107 ;;; Macros
101 (defmacro ediff-odd-p (arg) 108 (defmacro ediff-odd-p (arg)
102 (` (eq (logand (, arg) 1) 1))) 109 (` (eq (logand (, arg) 1) 1)))
103 110
104 (defmacro ediff-buffer-live-p (buf) 111 (defmacro ediff-buffer-live-p (buf)
121 (` (cond ((memq (, arg) '(?a ?A)) 'A) 128 (` (cond ((memq (, arg) '(?a ?A)) 'A)
122 ((memq (, arg) '(?b ?B)) 'B) 129 ((memq (, arg) '(?b ?B)) 'B)
123 ((memq (, arg) '(?c ?C)) 'C) 130 ((memq (, arg) '(?c ?C)) 'C)
124 ) 131 )
125 )) 132 ))
126 133
134 ;; A-list is supposed to be of the form (A . symb) (B . symb)...)
135 ;; where the first part of any association is a buffer type and the second is
136 ;; an appropriate symbol. Given buffer-type, this function returns the
137 ;; symbol. This is used to avoid using `intern'
138 (defsubst ediff-get-symbol-from-alist (buf-type alist)
139 (cdr (assoc buf-type alist)))
140
141 (defconst ediff-difference-vector-alist
142 '((A . ediff-difference-vector-A)
143 (B . ediff-difference-vector-B)
144 (C . ediff-difference-vector-C)
145 (Ancestor . ediff-difference-vector-Ancestor)))
146
127 (defmacro ediff-get-difference (n buf-type) 147 (defmacro ediff-get-difference (n buf-type)
128 (` (aref 148 (` (aref
129 (symbol-value 149 (symbol-value
130 (intern (format "ediff-difference-vector-%S" (, buf-type)))) (, n)))) 150 (ediff-get-symbol-from-alist
151 (, buf-type) ediff-difference-vector-alist))
152 (, n))))
131 153
132 ;; Tell if it has been previously determined that the region has 154 ;; Tell if it has been previously determined that the region has
133 ;; no diffs other than the white space and newlines 155 ;; no diffs other than the white space and newlines
134 ;; The argument, N, is the diff region number used by Ediff to index the 156 ;; The argument, N, is the diff region number used by Ediff to index the
135 ;; diff vector. It is 1 less than the number seen by the user. 157 ;; diff vector. It is 1 less than the number seen by the user.
187 209
188 (defmacro ediff-get-fine-diff-vector (n buf-type) 210 (defmacro ediff-get-fine-diff-vector (n buf-type)
189 (` (ediff-get-fine-diff-vector-from-diff-record 211 (` (ediff-get-fine-diff-vector-from-diff-record
190 (ediff-get-difference (, n) (, buf-type))))) 212 (ediff-get-difference (, n) (, buf-type)))))
191 213
192 ;; Macro to switch to BUFFER, evaluate FORMS, returns to original buffer. 214 ;; Macro to switch to BUFFER, evaluate BODY, returns to original buffer.
193 ;; Differs from `save-excursion' in that it doesn't save the point and mark. 215 ;; Doesn't save the point and mark.
194 ;; This is essentially `emerge-eval-in-buffer' with the test for live buffers." 216 ;; This is `with-current-buffer' with the added test for live buffers."
195 (defmacro ediff-eval-in-buffer (buffer &rest forms) 217 (defmacro ediff-with-current-buffer (buffer &rest body)
196 (` (let ((StartBuffer (current-buffer))) 218 (` (if (ediff-buffer-live-p (, buffer))
197 (if (ediff-buffer-live-p (, buffer)) 219 (save-current-buffer
198 (unwind-protect 220 (set-buffer (, buffer))
199 (progn 221 (,@ body))
200 (set-buffer (, buffer)) 222 (or (eq this-command 'ediff-quit)
201 (,@ forms)) 223 (error ediff-KILLED-VITAL-BUFFER))
202 (set-buffer StartBuffer)) 224 )))
203 (or (eq this-command 'ediff-quit) 225
204 (error ediff-KILLED-VITAL-BUFFER))
205 ))))
206
207 226
208 (defsubst ediff-multiframe-setup-p () 227 (defsubst ediff-multiframe-setup-p ()
209 (and (ediff-window-display-p) ediff-multiframe)) 228 (and (ediff-window-display-p) ediff-multiframe))
210 229
211 (defmacro ediff-narrow-control-frame-p () 230 (defmacro ediff-narrow-control-frame-p ()
559 ;; The original values of ediff-protected-variables for buffer C 578 ;; The original values of ediff-protected-variables for buffer C
560 (ediff-defvar-local ediff-buffer-values-orig-C nil "") 579 (ediff-defvar-local ediff-buffer-values-orig-C nil "")
561 ;; The original values of ediff-protected-variables for buffer Ancestor 580 ;; The original values of ediff-protected-variables for buffer Ancestor
562 (ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "") 581 (ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "")
563 582
583 ;; association between buff-type and ediff-buffer-values-orig-*
584 (defconst ediff-buffer-values-orig-alist
585 '((A . ediff-buffer-values-orig-A)
586 (B . ediff-buffer-values-orig-B)
587 (C . ediff-buffer-values-orig-C)
588 (Ancestor . ediff-buffer-values-orig-Ancestor)))
589
564 ;; Buffer-local variables to be saved then restored during Ediff sessions 590 ;; Buffer-local variables to be saved then restored during Ediff sessions
565 (defconst ediff-protected-variables '( 591 (defconst ediff-protected-variables '(
566 ;;buffer-read-only 592 ;;buffer-read-only
567 mode-line-format)) 593 mode-line-format))
568 594
583 ;; different from the other two (used only in 3-way jobs. 609 ;; different from the other two (used only in 3-way jobs.
584 (ediff-defvar-local ediff-difference-vector-A nil "") 610 (ediff-defvar-local ediff-difference-vector-A nil "")
585 (ediff-defvar-local ediff-difference-vector-B nil "") 611 (ediff-defvar-local ediff-difference-vector-B nil "")
586 (ediff-defvar-local ediff-difference-vector-C nil "") 612 (ediff-defvar-local ediff-difference-vector-C nil "")
587 (ediff-defvar-local ediff-difference-vector-Ancestor nil "") 613 (ediff-defvar-local ediff-difference-vector-Ancestor nil "")
614 ;; A-list of diff vector types associated with buffer types
615 (defconst ediff-difference-vector-alist
616 '((A . ediff-difference-vector-A)
617 (B . ediff-difference-vector-B)
618 (C . ediff-difference-vector-C)
619 (Ancestor . ediff-difference-vector-Ancestor)))
588 620
589 ;; [ status status status ...] 621 ;; [ status status status ...]
590 ;; Each status: [state-of-merge state-of-ancestor] 622 ;; Each status: [state-of-merge state-of-ancestor]
591 ;; state-of-merge is default-A, default-B, prefer-A, or prefer-B. It 623 ;; state-of-merge is default-A, default-B, prefer-A, or prefer-B. It
592 ;; indicates the way a diff region was created in buffer C. 624 ;; indicates the way a diff region was created in buffer C.
741 (fset 'ediff-display-pixel-width 773 (fset 'ediff-display-pixel-width
742 (symbol-function 'x-display-pixel-width)) 774 (symbol-function 'x-display-pixel-width))
743 (fset 'ediff-display-pixel-height 775 (fset 'ediff-display-pixel-height
744 (symbol-function 'x-display-pixel-height)))) 776 (symbol-function 'x-display-pixel-height))))
745 777
778 ;; A-list of current-diff-overlay symbols asssociated with buf types
779 (defconst ediff-current-diff-overlay-alist
780 '((A . ediff-current-diff-overlay-A)
781 (B . ediff-current-diff-overlay-B)
782 (C . ediff-current-diff-overlay-C)
783 (Ancestor . ediff-current-diff-overlay-Ancestor)))
784
785 ;; A-list of current-diff-face-* symbols asssociated with buf types
786 (defconst ediff-current-diff-face-alist
787 '((A . ediff-current-diff-face-A)
788 (B . ediff-current-diff-face-B)
789 (C . ediff-current-diff-face-C)
790 (Ancestor . ediff-current-diff-face-Ancestor)))
791
746 792
747 (defun ediff-make-current-diff-overlay (type) 793 (defun ediff-make-current-diff-overlay (type)
748 (if (ediff-has-face-support-p) 794 (if (ediff-has-face-support-p)
749 (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type))) 795 (let ((overlay (ediff-get-symbol-from-alist
796 type ediff-current-diff-overlay-alist))
750 (buffer (ediff-get-buffer type)) 797 (buffer (ediff-get-buffer type))
751 (face (face-name 798 (face (face-name
752 (symbol-value 799 (symbol-value
753 (intern (format "ediff-current-diff-face-%S" type)))))) 800 (ediff-get-symbol-from-alist
801 type ediff-current-diff-face-alist)))))
754 (set overlay 802 (set overlay
755 (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer)) 803 (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer))
756 (ediff-set-overlay-face (symbol-value overlay) face) 804 (ediff-set-overlay-face (symbol-value overlay) face)
757 (ediff-overlay-put (symbol-value overlay) 'ediff ediff-control-buffer)) 805 (ediff-overlay-put (symbol-value overlay) 'ediff ediff-control-buffer))
758 )) 806 ))
1030 'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor) 1078 'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor)
1031 (ediff-set-face-pixmap 'ediff-even-diff-face-Ancestor 1079 (ediff-set-face-pixmap 'ediff-even-diff-face-Ancestor
1032 ediff-even-diff-pixmap))) 1080 ediff-even-diff-pixmap)))
1033 'ediff-even-diff-face-Ancestor)) 1081 'ediff-even-diff-face-Ancestor))
1034 "Face highlighting even-numbered differences in the ancestor buffer.") 1082 "Face highlighting even-numbered differences in the ancestor buffer.")
1035 1083
1084 ;; Association between buffer types and even-diff-face symbols
1085 (defconst ediff-even-diff-face-alist
1086 '((A . ediff-even-diff-face-A)
1087 (B . ediff-even-diff-face-B)
1088 (C . ediff-even-diff-face-C)
1089 (Ancestor . ediff-even-diff-face-Ancestor)))
1090
1036 (defvar ediff-odd-diff-face-A 1091 (defvar ediff-odd-diff-face-A
1037 (if (ediff-has-face-support-p) 1092 (if (ediff-has-face-support-p)
1038 (progn 1093 (progn
1039 (make-face 'ediff-odd-diff-face-A) 1094 (make-face 'ediff-odd-diff-face-A)
1040 (ediff-hide-face 'ediff-odd-diff-face-A) 1095 (ediff-hide-face 'ediff-odd-diff-face-A)
1095 (ediff-set-face-pixmap 'ediff-odd-diff-face-Ancestor 1150 (ediff-set-face-pixmap 'ediff-odd-diff-face-Ancestor
1096 ediff-odd-diff-pixmap))) 1151 ediff-odd-diff-pixmap)))
1097 'ediff-odd-diff-face-Ancestor)) 1152 'ediff-odd-diff-face-Ancestor))
1098 "Face used to highlight even-numbered differences in the ancestor buffer.") 1153 "Face used to highlight even-numbered differences in the ancestor buffer.")
1099 1154
1155 ;; Association between buffer types and odd-diff-face symbols
1156 (defconst ediff-odd-diff-face-alist
1157 '((A . ediff-odd-diff-face-A)
1158 (B . ediff-odd-diff-face-B)
1159 (C . ediff-odd-diff-face-C)
1160 (Ancestor . ediff-odd-diff-face-Ancestor)))
1161
1162 ;; A-list of fine-diff face symbols associated with buffer types
1163 (defconst ediff-fine-diff-face-alist
1164 '((A . ediff-fine-diff-face-A)
1165 (B . ediff-fine-diff-face-B)
1166 (C . ediff-fine-diff-face-C)
1167 (Ancestor . ediff-fine-diff-face-Ancestor)))
1168
1100 ;; Help echo 1169 ;; Help echo
1101 (put 'ediff-fine-diff-face-A 'ediff-help-echo 1170 (put 'ediff-fine-diff-face-A 'ediff-help-echo
1102 "A `refinement' of the current difference region") 1171 "A `refinement' of the current difference region")
1103 (put 'ediff-fine-diff-face-B 'ediff-help-echo 1172 (put 'ediff-fine-diff-face-B 'ediff-help-echo
1104 "A `refinement' of the current difference region") 1173 "A `refinement' of the current difference region")
1116 "Overlay for the current difference region in buffer B.") 1185 "Overlay for the current difference region in buffer B.")
1117 (ediff-defvar-local ediff-current-diff-overlay-C nil 1186 (ediff-defvar-local ediff-current-diff-overlay-C nil
1118 "Overlay for the current difference region in buffer C.") 1187 "Overlay for the current difference region in buffer C.")
1119 (ediff-defvar-local ediff-current-diff-overlay-Ancestor nil 1188 (ediff-defvar-local ediff-current-diff-overlay-Ancestor nil
1120 "Overlay for the current difference region in the ancestor buffer.") 1189 "Overlay for the current difference region in the ancestor buffer.")
1121 1190
1122 ;; Compute priority of ediff overlay. 1191 ;; Compute priority of ediff overlay.
1123 (defun ediff-highest-priority (start end buffer) 1192 (defun ediff-highest-priority (start end buffer)
1124 (let ((pos (max 1 (1- start))) 1193 (let ((pos (max 1 (1- start)))
1125 ovr-list) 1194 ovr-list)
1126 (if ediff-xemacs-p 1195 (if ediff-xemacs-p
1127 (1+ ediff-shadow-overlay-priority) 1196 (1+ ediff-shadow-overlay-priority)
1128 (ediff-eval-in-buffer buffer 1197 (ediff-with-current-buffer buffer
1129 (while (< pos (min (point-max) (1+ end))) 1198 (while (< pos (min (point-max) (1+ end)))
1130 (setq ovr-list (append (overlays-at pos) ovr-list)) 1199 (setq ovr-list (append (overlays-at pos) ovr-list))
1131 (setq pos (next-overlay-change pos))) 1200 (setq pos (next-overlay-change pos)))
1132 (1+ (apply '+ 1201 (1+ (apply '+
1133 (mapcar (function 1202 (mapcar (function
1238 (kill-buffer (get-buffer buf)))) 1307 (kill-buffer (get-buffer buf))))
1239 1308
1240 (defsubst ediff-background-face (buf-type dif-num) 1309 (defsubst ediff-background-face (buf-type dif-num)
1241 ;; The value of dif-num is always 1- the one that user sees. 1310 ;; The value of dif-num is always 1- the one that user sees.
1242 ;; This is why even face is used when dif-num is odd. 1311 ;; This is why even face is used when dif-num is odd.
1243 (intern (format (if (ediff-odd-p dif-num) 1312 (ediff-get-symbol-from-alist
1244 "ediff-even-diff-face-%S" 1313 buf-type (if (ediff-odd-p dif-num)
1245 "ediff-odd-diff-face-%S") 1314 ediff-even-diff-face-alist
1246 buf-type))) 1315 ediff-odd-diff-face-alist)
1316 ))
1247 1317
1248 1318
1249 ;; activate faces on diff regions in buffer 1319 ;; activate faces on diff regions in buffer
1250 (defun ediff-paint-background-regions-in-one-buffer (buf-type unhighlight) 1320 (defun ediff-paint-background-regions-in-one-buffer (buf-type unhighlight)
1251 (let ((diff-vector 1321 (let ((diff-vector
1252 (eval (intern (format "ediff-difference-vector-%S" buf-type)))) 1322 (eval (ediff-get-symbol-from-alist
1323 buf-type ediff-difference-vector-alist)))
1253 overl diff-num) 1324 overl diff-num)
1254 (mapcar (function 1325 (mapcar (function
1255 (lambda (rec) 1326 (lambda (rec)
1256 (setq overl (ediff-get-diff-overlay-from-diff-record rec) 1327 (setq overl (ediff-get-diff-overlay-from-diff-record rec)
1257 diff-num (ediff-overlay-get overl 'ediff-diff-num)) 1328 diff-num (ediff-overlay-get overl 'ediff-diff-num))
1277 'Ancestor unhighlight)) 1348 'Ancestor unhighlight))
1278 1349
1279 (defun ediff-highlight-diff-in-one-buffer (n buf-type) 1350 (defun ediff-highlight-diff-in-one-buffer (n buf-type)
1280 (if (ediff-buffer-live-p (ediff-get-buffer buf-type)) 1351 (if (ediff-buffer-live-p (ediff-get-buffer buf-type))
1281 (let* ((buff (ediff-get-buffer buf-type)) 1352 (let* ((buff (ediff-get-buffer buf-type))
1282 (last (ediff-eval-in-buffer buff (point-max))) 1353 (last (ediff-with-current-buffer buff (point-max)))
1283 (begin (ediff-get-diff-posn buf-type 'beg n)) 1354 (begin (ediff-get-diff-posn buf-type 'beg n))
1284 (end (ediff-get-diff-posn buf-type 'end n)) 1355 (end (ediff-get-diff-posn buf-type 'end n))
1285 (xtra (if (equal begin end) 1 0)) 1356 (xtra (if (equal begin end) 1 0))
1286 (end-hilit (min last (+ end xtra))) 1357 (end-hilit (min last (+ end xtra)))
1287 (current-diff-overlay 1358 (current-diff-overlay
1288 (symbol-value 1359 (symbol-value
1289 (intern (format "ediff-current-diff-overlay-%S" buf-type))))) 1360 (ediff-get-symbol-from-alist
1361 buf-type ediff-current-diff-overlay-alist))))
1290 1362
1291 (if ediff-xemacs-p 1363 (if ediff-xemacs-p
1292 (ediff-move-overlay current-diff-overlay begin end-hilit) 1364 (ediff-move-overlay current-diff-overlay begin end-hilit)
1293 (ediff-move-overlay current-diff-overlay begin end-hilit buff)) 1365 (ediff-move-overlay current-diff-overlay begin end-hilit buff))
1294 (ediff-overlay-put current-diff-overlay 'priority 1366 (ediff-overlay-put current-diff-overlay 'priority
1303 1375
1304 (defun ediff-unhighlight-diff-in-one-buffer (buf-type) 1376 (defun ediff-unhighlight-diff-in-one-buffer (buf-type)
1305 (if (ediff-buffer-live-p (ediff-get-buffer buf-type)) 1377 (if (ediff-buffer-live-p (ediff-get-buffer buf-type))
1306 (let ((current-diff-overlay 1378 (let ((current-diff-overlay
1307 (symbol-value 1379 (symbol-value
1308 (intern (format "ediff-current-diff-overlay-%S" buf-type)))) 1380 (ediff-get-symbol-from-alist
1381 buf-type ediff-current-diff-overlay-alist)))
1309 (overlay 1382 (overlay
1310 (ediff-get-diff-overlay ediff-current-difference buf-type)) 1383 (ediff-get-diff-overlay ediff-current-difference buf-type))
1311 ) 1384 )
1312 1385
1313 (ediff-move-overlay current-diff-overlay 1 1) 1386 (ediff-move-overlay current-diff-overlay 1 1)
1324 (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type) 1397 (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
1325 (ediff-unselect-and-select-difference -1) 1398 (ediff-unselect-and-select-difference -1)
1326 (if (and (ediff-has-face-support-p) ediff-use-faces) 1399 (if (and (ediff-has-face-support-p) ediff-use-faces)
1327 (let* ((inhibit-quit t) 1400 (let* ((inhibit-quit t)
1328 (current-diff-overlay-var 1401 (current-diff-overlay-var
1329 (intern (format "ediff-current-diff-overlay-%S" buf-type))) 1402 (ediff-get-symbol-from-alist
1403 buf-type ediff-current-diff-overlay-alist))
1330 (current-diff-overlay (symbol-value current-diff-overlay-var))) 1404 (current-diff-overlay (symbol-value current-diff-overlay-var)))
1331 (ediff-paint-background-regions 'unhighlight) 1405 (ediff-paint-background-regions 'unhighlight)
1332 (if (ediff-overlayp current-diff-overlay) 1406 (if (ediff-overlayp current-diff-overlay)
1333 (ediff-delete-overlay current-diff-overlay)) 1407 (ediff-delete-overlay current-diff-overlay))
1334 (set current-diff-overlay-var nil) 1408 (set current-diff-overlay-var nil)
1555 (defun ediff-whitespace-diff-region-p (n buf-type) 1629 (defun ediff-whitespace-diff-region-p (n buf-type)
1556 (or (and (eq buf-type 'C) (not ediff-3way-job)) 1630 (or (and (eq buf-type 'C) (not ediff-3way-job))
1557 (ediff-empty-diff-region-p n buf-type) 1631 (ediff-empty-diff-region-p n buf-type)
1558 (let ((beg (ediff-get-diff-posn buf-type 'beg n)) 1632 (let ((beg (ediff-get-diff-posn buf-type 'beg n))
1559 (end (ediff-get-diff-posn buf-type 'end n))) 1633 (end (ediff-get-diff-posn buf-type 'end n)))
1560 (ediff-eval-in-buffer (ediff-get-buffer buf-type) 1634 (ediff-with-current-buffer (ediff-get-buffer buf-type)
1561 (save-excursion 1635 (save-excursion
1562 (goto-char beg) 1636 (goto-char beg)
1563 (skip-chars-forward ediff-whitespace) 1637 (skip-chars-forward ediff-whitespace)
1564 (>= (point) end)))))) 1638 (>= (point) end))))))
1565 1639
1630 str)))) 1704 str))))
1631 1705
1632 1706
1633 1707
1634 (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end) 1708 (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end)
1635 (ediff-eval-in-buffer 1709 (ediff-with-current-buffer
1636 (ediff-eval-in-buffer ctrl-buf (ediff-get-buffer buf-type)) 1710 (ediff-with-current-buffer ctrl-buf (ediff-get-buffer buf-type))
1637 (buffer-substring 1711 (buffer-substring
1638 (or start (ediff-get-diff-posn buf-type 'beg n ctrl-buf)) 1712 (or start (ediff-get-diff-posn buf-type 'beg n ctrl-buf))
1639 (or end (ediff-get-diff-posn buf-type 'end n ctrl-buf))))) 1713 (or end (ediff-get-diff-posn buf-type 'end n ctrl-buf)))))
1640 1714
1641 ;; If ediff modified mode line, strip the modification 1715 ;; If ediff modified mode line, strip the modification
1676 fname)) 1750 fname))
1677 1751
1678 1752
1679 ;;; Local Variables: 1753 ;;; Local Variables:
1680 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) 1754 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
1681 ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1) 1755 ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
1682 ;;; eval: (put 'ediff-eval-in-buffer 'edebug-form-spec '(form body)) 1756 ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))
1683 ;;; End: 1757 ;;; End:
1684 1758
1685 (provide 'ediff-init) 1759 (provide 'ediff-init)
1686 1760
1687 1761