comparison lisp/ediff/ediff-util.el @ 78:c7528f8e288d r20-0b34

Import from CVS: tag r20-0b34
author cvs
date Mon, 13 Aug 2007 09:05:42 +0200
parents 131b0175ea99
children 1ce6082ce73f
comparison
equal deleted inserted replaced
77:6cb4f478e7bc 78:c7528f8e288d
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, 21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 ;; Boston, MA 02111-1307, USA. 22 ;; Boston, MA 02111-1307, USA.
23 23
24 ;;; Code: 24 ;;; Code:
25 25
26 (require 'ediff-init)
27 (require 'ediff-mult)
28
29 ;; Pacify compiler and avoid the need in checking for boundp 26 ;; Pacify compiler and avoid the need in checking for boundp
30 (defvar ediff-patch-diagnostics nil) 27 (defvar ediff-patch-diagnostics nil)
31 (defvar ediff-patchbufer nil) 28 (defvar ediff-patchbufer nil)
29 (and noninteractive
30 (eval-when-compile
31 (let ((load-path (cons (expand-file-name ".") load-path)))
32 (load-file "ediff-init.el")
33 (load-file "ediff-help.el"))))
32 ;; end pacifier 34 ;; end pacifier
35
36 (require 'ediff-init)
37 (require 'ediff-help)
38 (require 'ediff-mult)
39
40 ;;(if ediff-xemacs-p
41 ;; (require 'ediff-tbar)
42 ;; (defun ediff-use-toolbar-p () nil))
43 ;;
44 ;; for the time being
45 (defun ediff-use-toolbar-p () nil)
33 46
34 47
35 ;;; Functions 48 ;;; Functions
36 49
37 (defun ediff-mode () 50 (defun ediff-mode ()
98 (defun ediff-setup-keymap () 111 (defun ediff-setup-keymap ()
99 "Set up the keymap used in the control buffer of Ediff." 112 "Set up the keymap used in the control buffer of Ediff."
100 (setq ediff-mode-map (make-sparse-keymap)) 113 (setq ediff-mode-map (make-sparse-keymap))
101 (suppress-keymap ediff-mode-map) 114 (suppress-keymap ediff-mode-map)
102 115
116 (define-key ediff-mode-map
117 (if ediff-emacs-p [mouse-2] [button2]) 'ediff-help-for-quick-help)
118 (define-key ediff-mode-map "\C-m" 'ediff-help-for-quick-help)
119
103 (define-key ediff-mode-map "p" 'ediff-previous-difference) 120 (define-key ediff-mode-map "p" 'ediff-previous-difference)
104 (define-key ediff-mode-map "\C-?" 'ediff-previous-difference) 121 (define-key ediff-mode-map "\C-?" 'ediff-previous-difference)
105 (define-key ediff-mode-map [backspace] 'ediff-previous-difference) 122 (define-key ediff-mode-map [backspace] 'ediff-previous-difference)
106 (define-key ediff-mode-map [delete] 'ediff-previous-difference) 123 (define-key ediff-mode-map [delete] 'ediff-previous-difference)
107 (define-key ediff-mode-map "\C-h" (if ediff-no-emacs-help-in-control-buffer 124 (define-key ediff-mode-map "\C-h" (if ediff-no-emacs-help-in-control-buffer
181 (define-key ediff-mode-map "B" 'ediff-toggle-read-only) 198 (define-key ediff-mode-map "B" 'ediff-toggle-read-only)
182 (define-key ediff-mode-map "w" nil) 199 (define-key ediff-mode-map "w" nil)
183 (define-key ediff-mode-map "wa" 'ediff-save-buffer) 200 (define-key ediff-mode-map "wa" 'ediff-save-buffer)
184 (define-key ediff-mode-map "wb" 'ediff-save-buffer) 201 (define-key ediff-mode-map "wb" 'ediff-save-buffer)
185 (define-key ediff-mode-map "wd" 'ediff-save-buffer) 202 (define-key ediff-mode-map "wd" 'ediff-save-buffer)
203 (define-key ediff-mode-map "=" 'ediff-inferior-compare-regions)
186 (if (fboundp 'ediff-show-patch-diagnostics) 204 (if (fboundp 'ediff-show-patch-diagnostics)
187 (define-key ediff-mode-map "P" 'ediff-show-patch-diagnostics)) 205 (define-key ediff-mode-map "P" 'ediff-show-patch-diagnostics))
188 (if ediff-3way-job 206 (if ediff-3way-job
189 (progn 207 (progn
190 (define-key ediff-mode-map "wc" 'ediff-save-buffer) 208 (define-key ediff-mode-map "wc" 'ediff-save-buffer)
208 226
209 ;; Common startup entry for all Ediff functions 227 ;; Common startup entry for all Ediff functions
210 ;; It now returns control buffer so other functions can do post-processing 228 ;; It now returns control buffer so other functions can do post-processing
211 (defun ediff-setup (buffer-A file-A buffer-B file-B buffer-C file-C 229 (defun ediff-setup (buffer-A file-A buffer-B file-B buffer-C file-C
212 startup-hooks setup-parameters) 230 startup-hooks setup-parameters)
213 (setq file-A (expand-file-name file-A)) 231 ;; ediff-convert-standard-filename puts file names in the form appropriate
214 (setq file-B (expand-file-name file-B)) 232 ;; for the OS at hand.
233 (setq file-A (ediff-convert-standard-filename (expand-file-name file-A)))
234 (setq file-B (ediff-convert-standard-filename (expand-file-name file-B)))
215 (if (stringp file-C) 235 (if (stringp file-C)
216 (setq file-C (expand-file-name file-C))) 236 (setq file-C
237 (ediff-convert-standard-filename (expand-file-name file-C))))
217 (let* ((control-buffer-name 238 (let* ((control-buffer-name
218 (ediff-unique-buffer-name "*Ediff Control Panel" "*")) 239 (ediff-unique-buffer-name "*Ediff Control Panel" "*"))
219 (control-buffer (ediff-eval-in-buffer buffer-A 240 (control-buffer (ediff-eval-in-buffer buffer-A
220 (get-buffer-create control-buffer-name)))) 241 (get-buffer-create control-buffer-name))))
221 (ediff-eval-in-buffer control-buffer 242 (ediff-eval-in-buffer control-buffer
459 (ediff-set-help-message) 480 (ediff-set-help-message)
460 (insert ediff-help-message) 481 (insert ediff-help-message)
461 (shrink-window-if-larger-than-buffer) 482 (shrink-window-if-larger-than-buffer)
462 (or (ediff-multiframe-setup-p) 483 (or (ediff-multiframe-setup-p)
463 (ediff-indent-help-message)) 484 (ediff-indent-help-message))
485 (ediff-set-help-overlays)
486
464 (set-buffer-modified-p nil) 487 (set-buffer-modified-p nil)
465 (ediff-refresh-mode-lines) 488 (ediff-refresh-mode-lines)
466 (setq ediff-control-window (selected-window)) 489 (setq ediff-control-window (selected-window))
467 (setq ediff-window-config-saved 490 (setq ediff-window-config-saved
468 (format "\%S\%S\%S\%S\%S\%S\%S" 491 (format "%S%S%S%S%S%S%S"
469 ediff-control-window 492 ediff-control-window
470 ediff-window-A 493 ediff-window-A
471 ediff-window-B 494 ediff-window-B
472 ediff-window-C 495 ediff-window-C
473 ediff-split-window-function 496 ediff-split-window-function
474 (ediff-multiframe-setup-p) 497 (ediff-multiframe-setup-p)
475 ediff-wide-display-p)) 498 ediff-wide-display-p))
499 (if (not (ediff-multiframe-setup-p))
500 (ediff-make-bottom-toolbar)) ; checks if toolbar is requested
476 (goto-char (point-min)) 501 (goto-char (point-min))
477 (skip-chars-forward ediff-whitespace))) 502 (skip-chars-forward ediff-whitespace)))
478 503
479 ;; assuming we are in control window, calculate length of the first line in
480 ;; help message
481 (defun ediff-help-message-line-length ()
482 (save-excursion
483 (goto-char (point-min))
484 (if ediff-use-long-help-message
485 (next-line 1))
486 (end-of-line)
487 (current-column)))
488
489
490 (defun ediff-indent-help-message ()
491 (let* ((shift (/ (max 0 (- (window-width (selected-window))
492 (ediff-help-message-line-length)))
493 2))
494 (str (make-string shift ?\ )))
495 (save-excursion
496 (goto-char (point-min))
497 (while (< (point) (point-max))
498 (insert str)
499 (beginning-of-line)
500 (forward-line 1)))))
501
502
503 (defun ediff-set-help-message ()
504 (setq ediff-long-help-message
505 (cond ((and ediff-long-help-message-function
506 (or (symbolp ediff-long-help-message-function)
507 (consp ediff-long-help-message-function)))
508 (funcall ediff-long-help-message-function))
509 (ediff-word-mode
510 (concat ediff-long-help-message-head
511 ediff-long-help-message-word-mode
512 ediff-long-help-message-tail))
513 (ediff-narrow-job
514 (concat ediff-long-help-message-head
515 ediff-long-help-message-narrow2
516 ediff-long-help-message-tail))
517 (ediff-merge-job
518 (concat ediff-long-help-message-head
519 ediff-long-help-message-merge
520 ediff-long-help-message-tail))
521 (ediff-diff3-job
522 (concat ediff-long-help-message-head
523 ediff-long-help-message-compare3
524 ediff-long-help-message-tail))
525 (t
526 (concat ediff-long-help-message-head
527 ediff-long-help-message-compare2
528 ediff-long-help-message-tail))))
529 (setq ediff-brief-help-message
530 (cond ((and ediff-brief-help-message-function
531 (or (symbolp ediff-brief-help-message-function)
532 (consp ediff-brief-help-message-function)))
533 (funcall ediff-brief-help-message-function))
534 ((stringp ediff-brief-help-message-function)
535 ediff-brief-help-message-function)
536 ((ediff-multiframe-setup-p) ediff-brief-message-string)
537 (t ; long brief msg, not multiframe --- put in the middle
538 ediff-brief-message-string)
539 ))
540 (setq ediff-help-message (if ediff-use-long-help-message
541 ediff-long-help-message
542 ediff-brief-help-message))
543 (run-hooks 'ediff-display-help-hook))
544 504
545 505
546 506
547 ;;; Commands for working with Ediff 507 ;;; Commands for working with Ediff
548 508
768 ;; never grab mouse on quit in this place 728 ;; never grab mouse on quit in this place
769 (ediff-reset-mouse 729 (ediff-reset-mouse
770 control-frame 730 control-frame
771 (eq this-command 'ediff-quit)))) 731 (eq this-command 'ediff-quit))))
772 )) 732 ))
773 (ediff-eval-in-buffer control-buf 733
774 (ediff-refresh-mode-lines)) 734 (ediff-restore-highlighting)
735 (ediff-eval-in-buffer control-buf (ediff-refresh-mode-lines))
775 )) 736 ))
776 737
777 ;; this function returns to the window it was called from 738 ;; this function returns to the window it was called from
778 ;; (which was the control window) 739 ;; (which was the control window)
779 (defun ediff-recenter-one-window (buf-type) 740 (defun ediff-recenter-one-window (buf-type)
879 (message "Re-highlighting all difference regions") 840 (message "Re-highlighting all difference regions")
880 (setq ediff-use-faces t 841 (setq ediff-use-faces t
881 ediff-highlight-all-diffs t))) 842 ediff-highlight-all-diffs t)))
882 843
883 (if (and ediff-use-faces ediff-highlight-all-diffs) 844 (if (and ediff-use-faces ediff-highlight-all-diffs)
884 (ediff-color-background-regions) 845 (ediff-paint-background-regions)
885 (ediff-color-background-regions 'unhighlight)) 846 (ediff-paint-background-regions 'unhighlight))
886 847
887 (ediff-unselect-and-select-difference 848 (ediff-unselect-and-select-difference
888 ediff-current-difference 'select-only)) 849 ediff-current-difference 'select-only))
889 ) 850 )
851
890 852
891 (defun ediff-toggle-autorefine () 853 (defun ediff-toggle-autorefine ()
892 "Toggle auto-refine mode." 854 "Toggle auto-refine mode."
893 (interactive) 855 (interactive)
894 (ediff-barf-if-not-control-buffer) 856 (ediff-barf-if-not-control-buffer)
999 'buffer-read-only nil buf-type))) 961 'buffer-read-only nil buf-type)))
1000 (t 962 (t
1001 (setq toggle-ro-cmd 'toggle-read-only) 963 (setq toggle-ro-cmd 'toggle-read-only)
1002 (beep 1) (beep 1) 964 (beep 1) (beep 1)
1003 (message 965 (message
1004 "Boy, this is risky! Better don't change this file...") 966 "Boy, this is risky! Don't modify this file...")
1005 (sit-for 3)))) ; let the user see the warning 967 (sit-for 3)))) ; let the user see the warning
1006 (if (and toggle-ro-cmd 968 (if (and toggle-ro-cmd
1007 (string-match "toggle-read-only" (symbol-name toggle-ro-cmd))) 969 (string-match "toggle-read-only" (symbol-name toggle-ro-cmd)))
1008 (save-excursion 970 (save-excursion
1009 (save-window-excursion 971 (save-window-excursion
972 (select-window (ediff-get-visible-buffer-window buf))
1010 (command-execute toggle-ro-cmd))) 973 (command-execute toggle-ro-cmd)))
1011 (error "Don't know how to toggle read-only in buffer %S" buf)) 974 (error "Don't know how to toggle read-only in buffer %S" buf))
1012 975
1013 ;; Check if we made the current buffer updatable, but its file is RO. 976 ;; Check if we made the current buffer updatable, but its file is RO.
1014 ;; Signal a warning in this case. 977 ;; Signal a warning in this case.
1017 (file-exists-p file) 980 (file-exists-p file)
1018 (not (file-writable-p file))) 981 (not (file-writable-p file)))
1019 (message "Warning: file %s is read-only" 982 (message "Warning: file %s is read-only"
1020 (ediff-abbreviate-file-name file) (beep 1))) 983 (ediff-abbreviate-file-name file) (beep 1)))
1021 )))) 984 ))))
1022 985
1023 986
1024 ;; This is a simple-minded check for whether a file is under version control 987 ;; checkout if visited file is checked in
1025 ;; and is checked out. 988 (defun ediff-maybe-checkout (buf)
989 (let ((file (buffer-file-name buf))
990 (checkout-function (key-binding "\C-x\C-q")))
991 (if (and (ediff-file-checked-in-p file)
992 (or (beep 1) t)
993 (y-or-n-p
994 (format
995 "File %s is under version control. Check it out? "
996 (ediff-abbreviate-file-name file))))
997 (ediff-eval-in-buffer buf
998 (command-execute checkout-function)))))
999
1000
1001 ;; This is a simple-minded check for whether a file is under version control.
1026 ;; If file,v exists but file doesn't, this file is considered to be not checked 1002 ;; If file,v exists but file doesn't, this file is considered to be not checked
1027 ;; in and not checked out for the purpose of patching (since patch won't be 1003 ;; in and not checked out for the purpose of patching (since patch won't be
1028 ;; able to read such a file anyway). 1004 ;; able to read such a file anyway).
1029 ;; FILE is a string representing file name 1005 ;; FILE is a string representing file name
1006 (defun ediff-file-under-version-control (file)
1007 (let* ((filedir (file-name-directory file))
1008 (file-nondir (file-name-nondirectory file))
1009 (trial (concat file-nondir ",v"))
1010 (full-trial (concat filedir trial))
1011 (full-rcs-trial (concat filedir "RCS/" trial)))
1012 (and (stringp file)
1013 (file-exists-p file)
1014 (or
1015 (and
1016 (file-exists-p full-trial)
1017 ;; in FAT FS, `file,v' and `file' may turn out to be the same!
1018 ;; don't be fooled by this!
1019 (not (equal (file-attributes file)
1020 (file-attributes full-trial))))
1021 ;; check if a version is in RCS/ directory
1022 (file-exists-p full-rcs-trial)))
1023 ))
1024
1030 (defun ediff-file-checked-out-p (file) 1025 (defun ediff-file-checked-out-p (file)
1031 (and (stringp file) 1026 (and (ediff-file-under-version-control file)
1032 (file-exists-p file) 1027 (file-writable-p file)))
1033 (file-writable-p file)
1034 (or
1035 (file-exists-p (concat file ",v"))
1036 (file-exists-p (concat "RCS/" file ",v")))
1037 ))
1038 (defun ediff-file-checked-in-p (file) 1028 (defun ediff-file-checked-in-p (file)
1039 (and (stringp file) 1029 (and (ediff-file-under-version-control file)
1040 (file-exists-p file) 1030 (not (file-writable-p file))))
1041 (not (file-writable-p file))
1042 (or
1043 (file-exists-p (concat file ",v"))
1044 (file-exists-p (concat "RCS/" file ",v")))
1045 ))
1046 1031
1047 (defun ediff-swap-buffers () 1032 (defun ediff-swap-buffers ()
1048 "Rotate the display of buffers A, B, and C." 1033 "Rotate the display of buffers A, B, and C."
1049 (interactive) 1034 (interactive)
1050 (ediff-barf-if-not-control-buffer) 1035 (ediff-barf-if-not-control-buffer)
1173 (funcall ediff-make-wide-display-function) 1158 (funcall ediff-make-wide-display-function)
1174 ;;(sit-for (if ediff-xemacs-p 0.4 0)) 1159 ;;(sit-for (if ediff-xemacs-p 0.4 0))
1175 (ediff-eval-in-buffer ctl-buf 1160 (ediff-eval-in-buffer ctl-buf
1176 (setq ediff-window-B nil) ; force update of window config 1161 (setq ediff-window-B nil) ; force update of window config
1177 (ediff-recenter 'no-rehighlight))))) 1162 (ediff-recenter 'no-rehighlight)))))
1178 1163
1164 ;;;###autoload
1179 (defun ediff-toggle-multiframe () 1165 (defun ediff-toggle-multiframe ()
1180 "Switch from the multiframe display to single-frame display and back. 1166 "Switch from the multiframe display to single-frame display and back.
1181 For a permanent change, set the variable `ediff-window-setup-function', 1167 For a permanent change, set the variable `ediff-window-setup-function',
1182 which see." 1168 which see."
1183 (interactive) 1169 (interactive)
1184 (ediff-barf-if-not-control-buffer) 1170 (let (set-func)
1185 (or (ediff-window-display-p) 1171 (or (ediff-window-display-p)
1186 (error "%sEmacs is not running as a window application" 1172 (error "%sEmacs is not running as a window application"
1187 (if ediff-emacs-p "" "X"))) 1173 (if ediff-emacs-p "" "X")))
1174
1175 (setq set-func (if (ediff-in-control-buffer-p) 'setq 'setq-default))
1176
1188 (cond ((eq ediff-window-setup-function 'ediff-setup-windows-multiframe) 1177 (cond ((eq ediff-window-setup-function 'ediff-setup-windows-multiframe)
1189 (setq ediff-window-setup-function 'ediff-setup-windows-plain)) 1178 (eval
1179 (list
1180 set-func
1181 'ediff-window-setup-function ''ediff-setup-windows-plain)))
1190 ((eq ediff-window-setup-function 'ediff-setup-windows-plain) 1182 ((eq ediff-window-setup-function 'ediff-setup-windows-plain)
1191 (setq ediff-window-setup-function 'ediff-setup-windows-multiframe))) 1183 (if (ediff-in-control-buffer-p)
1192 (setq ediff-window-B nil) 1184 (ediff-kill-bottom-toolbar))
1193 (ediff-recenter 'no-rehighlight)) 1185 (eval
1186 (list
1187 set-func
1188 'ediff-window-setup-function ''ediff-setup-windows-multiframe))))
1189 (if (ediff-in-control-buffer-p)
1190 (progn
1191 (setq ediff-window-B nil)
1192 (ediff-recenter 'no-rehighlight)))))
1193
1194 ;; if was using toolbar, kill it
1195 (defun ediff-kill-bottom-toolbar ()
1196 ;; Using ctl-buffer or ediff-control-window for LOCALE does not
1197 ;; work properly in XEmacs 19.14: we have to use
1198 ;;(selected-frame).
1199 ;; The problem with this is that any previous bottom-toolbar
1200 ;; will not re-appear after our cleanup here. Is there a way
1201 ;; to do "push" and "pop" toolbars ? --marcpa
1202 (if (ediff-use-toolbar-p)
1203 (progn
1204 (set-specifier bottom-toolbar (list (selected-frame) nil))
1205 (set-specifier bottom-toolbar-visible-p (list (selected-frame) nil)))))
1206
1207 ;; if wants to use toolbar, make it
1208 (defun ediff-make-bottom-toolbar ()
1209 (if (ediff-use-toolbar-p)
1210 (progn
1211 (set-specifier bottom-toolbar (list (selected-frame) ediff-toolbar))
1212 (set-specifier bottom-toolbar-visible-p (list (selected-frame) t))
1213 (set-specifier bottom-toolbar-height (list (selected-frame) 34)))))
1194 1214
1195 ;; Merging 1215 ;; Merging
1196 1216
1197 (defun ediff-toggle-show-clashes-only () 1217 (defun ediff-toggle-show-clashes-only ()
1198 "Toggle the mode where only the regions where both buffers differ with the ancestor are shown." 1218 "Toggle the mode where only the regions where both buffers differ with the ancestor are shown."
2186 ediff-wide-bounds) 2206 ediff-wide-bounds)
2187 (mapcar (function (lambda (overl) 2207 (mapcar (function (lambda (overl)
2188 (if (ediff-overlayp overl) 2208 (if (ediff-overlayp overl)
2189 (ediff-delete-overlay overl)))) 2209 (ediff-delete-overlay overl))))
2190 ediff-narrow-bounds) 2210 ediff-narrow-bounds)
2191 2211
2192 ;; restore buffer mode line id's in buffer-A/B/C 2212 ;; restore buffer mode line id's in buffer-A/B/C
2193 (let ((control-buffer ediff-control-buffer) 2213 (let ((control-buffer ediff-control-buffer)
2194 (meta-buffer ediff-meta-buffer)) 2214 (meta-buffer ediff-meta-buffer)
2215 ;; suitable working frame
2216 (warp-frame (if (and (ediff-window-display-p) (eq ediff-grab-mouse t))
2217 (cond ((window-live-p ediff-window-A)
2218 (window-frame ediff-window-A))
2219 ((window-live-p ediff-window-B)
2220 (window-frame ediff-window-B))
2221 (t (next-frame))))))
2195 (condition-case nil 2222 (condition-case nil
2196 (ediff-eval-in-buffer ediff-buffer-A 2223 (ediff-eval-in-buffer ediff-buffer-A
2197 (setq ediff-this-buffer-ediff-sessions 2224 (setq ediff-this-buffer-ediff-sessions
2198 (delq control-buffer ediff-this-buffer-ediff-sessions)) 2225 (delq control-buffer ediff-this-buffer-ediff-sessions))
2199 (kill-local-variable 'mode-line-buffer-identification) 2226 (kill-local-variable 'mode-line-buffer-identification)
2231 (setq ediff-session-registry 2258 (setq ediff-session-registry
2232 (delq ediff-control-buffer ediff-session-registry)) 2259 (delq ediff-control-buffer ediff-session-registry))
2233 (ediff-update-registry) 2260 (ediff-update-registry)
2234 ;; restore state of buffers to what it was before ediff 2261 ;; restore state of buffers to what it was before ediff
2235 (ediff-restore-protected-variables) 2262 (ediff-restore-protected-variables)
2263
2264 ;; If the user interrupts (canceling saving the merge buffer), continue
2265 ;; normally.
2266 (condition-case nil
2267 (if (ediff-merge-job)
2268 (run-hooks 'ediff-quit-merge-hook))
2269 (quit))
2270
2236 ;; good place to kill buffers A/B/C 2271 ;; good place to kill buffers A/B/C
2237 (run-hooks 'ediff-cleanup-hook) 2272 (run-hooks 'ediff-cleanup-hook)
2238 (let ((ediff-keep-variants ediff-keep-variants)) 2273 (let ((ediff-keep-variants ediff-keep-variants))
2239 (if reverse-default-keep-variants 2274 (if reverse-default-keep-variants
2240 (setq ediff-keep-variants (not ediff-keep-variants))) 2275 (setq ediff-keep-variants (not ediff-keep-variants)))
2241 (or ediff-keep-variants (ediff-janitor 'ask))) 2276 (or ediff-keep-variants (ediff-janitor 'ask)))
2242 2277
2243 (run-hooks 'ediff-quit-hook) 2278 (run-hooks 'ediff-quit-hook)
2244 (ediff-cleanup-meta-buffer meta-buffer) 2279 (ediff-cleanup-meta-buffer meta-buffer)
2280
2281 ;; warp mouse into a working window
2282 (setq warp-frame ; if mouse is over a reasonable frame, use it
2283 (cond ((and ediff-xemacs-p (window-live-p (car (mouse-position))))
2284 (window-frame (car (mouse-position))))
2285 ((frame-live-p (car (mouse-position)))
2286 (car (mouse-position)))
2287 (t warp-frame)))
2288 (if (frame-live-p warp-frame)
2289 (set-mouse-position (if ediff-emacs-p
2290 warp-frame
2291 (frame-selected-window warp-frame))
2292 2 1))
2293
2245 (if (ediff-buffer-live-p meta-buffer) 2294 (if (ediff-buffer-live-p meta-buffer)
2246 (ediff-show-meta-buffer meta-buffer)) 2295 (ediff-show-meta-buffer meta-buffer))
2247 )) 2296 ))
2248 2297
2249 2298
2275 (ediff-kill-buffer-carefully ediff-msg-buffer) 2324 (ediff-kill-buffer-carefully ediff-msg-buffer)
2276 (ediff-kill-buffer-carefully ediff-debug-buffer) 2325 (ediff-kill-buffer-carefully ediff-debug-buffer)
2277 2326
2278 (if (and (ediff-window-display-p) (frame-live-p ctl-frame)) 2327 (if (and (ediff-window-display-p) (frame-live-p ctl-frame))
2279 (delete-frame ctl-frame)) 2328 (delete-frame ctl-frame))
2329 ;; Hide bottom toolbar. --marcpa
2330 (if (not (ediff-multiframe-setup-p))
2331 (ediff-kill-bottom-toolbar))
2332
2280 (ediff-kill-buffer-carefully ctl-buf) 2333 (ediff-kill-buffer-carefully ctl-buf)
2281 2334
2282 (delete-other-windows) 2335 (delete-other-windows)
2283 2336
2284 ;; display only if not visible 2337 ;; display only if not visible
2288 (error)) 2341 (error))
2289 (condition-case nil 2342 (condition-case nil
2290 (or (ediff-get-visible-buffer-window buff-A) 2343 (or (ediff-get-visible-buffer-window buff-A)
2291 (progn 2344 (progn
2292 (if (ediff-get-visible-buffer-window buff-B) 2345 (if (ediff-get-visible-buffer-window buff-B)
2293 (split-window-vertically)) 2346 (funcall ediff-split-window-function))
2294 (switch-to-buffer buff-A))) 2347 (switch-to-buffer buff-A)))
2295 (error)) 2348 (error))
2296 (if three-way-job 2349 (if three-way-job
2297 (condition-case nil 2350 (condition-case nil
2298 (or (ediff-get-visible-buffer-window buff-C) 2351 (or (ediff-get-visible-buffer-window buff-C)
2299 (progn 2352 (progn
2300 (if (or (ediff-get-visible-buffer-window buff-A) 2353 (if (or (ediff-get-visible-buffer-window buff-A)
2301 (ediff-get-visible-buffer-window buff-B)) 2354 (ediff-get-visible-buffer-window buff-B))
2302 (split-window-vertically)) 2355 (funcall ediff-split-window-function))
2303 (switch-to-buffer buff-C) 2356 (switch-to-buffer buff-C)
2304 (balance-windows))) 2357 (balance-windows)))
2305 (error))) 2358 (error)))
2306 (message "") 2359 (message "")
2307 )) 2360 ))
2334 (or (not (ediff-buffer-live-p ediff-buffer-C)) 2387 (or (not (ediff-buffer-live-p ediff-buffer-C))
2335 (buffer-modified-p ediff-buffer-C) 2388 (buffer-modified-p ediff-buffer-C)
2336 (and ask (not (y-or-n-p (format "Kill buffer C [%s]? " 2389 (and ask (not (y-or-n-p (format "Kill buffer C [%s]? "
2337 (buffer-name ediff-buffer-C))))) 2390 (buffer-name ediff-buffer-C)))))
2338 (ediff-kill-buffer-carefully ediff-buffer-C)))) 2391 (ediff-kill-buffer-carefully ediff-buffer-C))))
2392
2393 (defun ediff-maybe-save-and-delete-merge ()
2394 "Default hook to run on quitting a merge job.
2395 If `ediff-autostore-merges' is nil, this does nothing.
2396 If it is t, it saves the merge buffer in the file `ediff-merge-store-file'
2397 or asks the user, if the latter is nil. It then then asks the user whether to
2398 delete the merge buffer.
2399 If `ediff-autostore-merges' is neither nil nor t, the merge buffer is saved
2400 only if this merge job is part of a group, i.e., was invoked from within
2401 `ediff-merge-directories', `ediff-merge-directory-revisions', and such."
2402 (let ((merge-store-file ediff-merge-store-file))
2403 (if ediff-autostore-merges
2404 (cond ((stringp ediff-merge-store-file)
2405 ;; store, ask to delete
2406 (ediff-write-merge-buffer-then-kill
2407 ediff-buffer-C merge-store-file 'show-file))
2408 ((eq ediff-autostore-merges t)
2409 ;; ask for file name
2410 (setq merge-store-file
2411 (read-file-name "Save the result of the merge in: "))
2412 (ediff-write-merge-buffer-then-kill
2413 ediff-buffer-C merge-store-file))
2414 ((and (ediff-buffer-live-p ediff-meta-buffer)
2415 (ediff-eval-in-buffer ediff-meta-buffer
2416 (ediff-merge-metajob)))
2417 ;; This case shouldn't occur, as the parent metajob must pass on
2418 ;; a file name, ediff-merge-store-file, where to save the result
2419 ;; of the merge.
2420 ;; Ask where to save anyway--will decide what to do here later.
2421 (setq merge-store-file
2422 (read-file-name "The result of the merge goes into: "))
2423 (ediff-write-merge-buffer-then-kill
2424 ediff-buffer-C merge-store-file))))
2425 ))
2426
2427 (defun ediff-write-merge-buffer-then-kill (buf file &optional show-file)
2428 (ediff-eval-in-buffer buf
2429 (if (or (not (file-exists-p file))
2430 (y-or-n-p (format "File %s exists, overwrite? " file)))
2431 (progn
2432 (write-region (point-min) (point-max) file)
2433 (if show-file
2434 (progn
2435 (message "Merge buffer saved in: %s" file)
2436 (sit-for 2)))
2437 (if (y-or-n-p "Merge buffer saved in file. Now kill the buffer? ")
2438 (ediff-kill-buffer-carefully buf))))))
2339 2439
2340 ;; The default way of suspending Ediff. 2440 ;; The default way of suspending Ediff.
2341 ;; Buries Ediff buffers, kills all windows. 2441 ;; Buries Ediff buffers, kills all windows.
2342 (defun ediff-default-suspend-function () 2442 (defun ediff-default-suspend-function ()
2343 (let* ((buf-A ediff-buffer-A) 2443 (let* ((buf-A ediff-buffer-A)
2581 (or (eq flag 'unselect-only) 2681 (or (eq flag 'unselect-only)
2582 (ediff-select-difference n)) 2682 (ediff-select-difference n))
2583 (setq ediff-current-difference n) 2683 (setq ediff-current-difference n)
2584 ) ; end protected section 2684 ) ; end protected section
2585 2685
2586 (ediff-eval-in-buffer control-buf 2686 (ediff-eval-in-buffer control-buf (ediff-refresh-mode-lines))
2587 (ediff-refresh-mode-lines))
2588 ))) 2687 )))
2589 2688
2590 2689
2591 (defun ediff-read-file-name (prompt default-dir default-file) 2690 (defun ediff-read-file-name (prompt default-dir default-file)
2592 ; This is a modified version of a similar function in `emerge.el'. 2691 ; This is a modified version of a similar function in `emerge.el'.
2616 (read-file-name 2715 (read-file-name
2617 (format "%s%s " 2716 (format "%s%s "
2618 prompt 2717 prompt
2619 (cond (default-file 2718 (cond (default-file
2620 (concat " (default " default-file "):")) 2719 (concat " (default " default-file "):"))
2621 ;;((string-match "[?:!,;][ \t]*$" prompt) "")
2622 (t (concat " (default " default-dir "):")))) 2720 (t (concat " (default " default-dir "):"))))
2623 default-dir 2721 default-dir
2624 (or default-file default-dir) 2722 (or default-file default-dir)
2625 t ; must match, no-confirm 2723 t ; must match, no-confirm
2626 (if default-file (file-name-directory default-file)) 2724 (if default-file (file-name-directory default-file))
2671 (if end end (point-max)) 2769 (if end end (point-max))
2672 f 2770 f
2673 nil ; don't append---erase 2771 nil ; don't append---erase
2674 'no-message) 2772 'no-message)
2675 (set-file-modes f ediff-temp-file-mode) 2773 (set-file-modes f ediff-temp-file-mode)
2676 f))) 2774 (ediff-convert-standard-filename (expand-file-name f)))))
2677 2775
2678 ;; Quote metacharacters (using \) when executing diff in Unix, but not in 2776 ;; Quote metacharacters (using \) when executing diff in Unix, but not in
2679 ;; EMX OS/2 2777 ;; EMX OS/2
2680 ;;(defun ediff-protect-metachars (str) 2778 ;;(defun ediff-protect-metachars (str)
2681 ;; (or (memq system-type '(emx vax-vms axp-vms)) 2779 ;; (or (memq system-type '(emx vax-vms axp-vms))
2794 (raise-frame (selected-frame))))) 2892 (raise-frame (selected-frame)))))
2795 (if (frame-live-p ediff-control-frame) 2893 (if (frame-live-p ediff-control-frame)
2796 (ediff-reset-mouse ediff-control-frame)) 2894 (ediff-reset-mouse ediff-control-frame))
2797 (if (window-live-p ediff-control-window) 2895 (if (window-live-p ediff-control-window)
2798 (select-window ediff-control-window))) 2896 (select-window ediff-control-window)))
2799 2897
2800 2898
2801 2899 (defun ediff-inferior-compare-regions ()
2802 ;; will simplify it in due time, when emacs acquires before/after strings 2900 "Compare regions in an active Ediff session.
2901 Like ediff-regions-linewise but is called from under an active Ediff session on
2902 the files that belong to that session.
2903
2904 After quitting the session invoked via this function, type C-l to the parent
2905 Ediff Control Panel to restore highlighting."
2906 (interactive)
2907 (let ((answer "")
2908 (possibilities (list ?A ?B ?C))
2909 (zmacs-regions t)
2910 quit-now
2911 begA begB endA endB bufA bufB)
2912
2913 (cond ((ediff-merge-job)
2914 (setq bufB ediff-buffer-C)
2915 (while (cond ((memq answer '(?A ?a))
2916 (setq bufA ediff-buffer-A)
2917 nil)
2918 ((memq answer '(?B ?b))
2919 (setq bufA ediff-buffer-B)
2920 nil)
2921 ((equal answer ""))
2922 (t (beep 1)
2923 (message "Valid values are A or B")
2924 (sit-for 2)
2925 t))
2926 (let ((cursor-in-echo-area t))
2927 (message "Which buffer to compare to the merge buffer (A/B)? ")
2928 (setq answer (read-char-exclusive)))))
2929
2930 ((ediff-3way-comparison-job)
2931 (while (cond ((memq answer possibilities)
2932 (setq possibilities (delq answer possibilities))
2933 (setq bufA
2934 (eval
2935 (intern (format "ediff-buffer-%c" answer))))
2936 nil)
2937 ((equal answer ""))
2938 (t (beep 1)
2939 (message
2940 "Valid values are %s"
2941 (mapconcat 'char-to-string possibilities " or "))
2942 (sit-for 2)
2943 t))
2944 (let ((cursor-in-echo-area t))
2945 (message "Enter the 1st buffer you want to compare (%s): "
2946 (mapconcat 'char-to-string possibilities "/"))
2947 (setq answer (capitalize (read-char-exclusive)))))
2948 (setq answer "") ; silence error msg
2949 (while (cond ((memq answer possibilities)
2950 (setq possibilities (delq answer possibilities))
2951 (setq bufB
2952 (eval
2953 (intern (format "ediff-buffer-%c" answer))))
2954 nil)
2955 ((equal answer ""))
2956 (t (beep 1)
2957 (message
2958 "Valid values are %s"
2959 (mapconcat 'char-to-string possibilities " or "))
2960 (sit-for 2)
2961 t))
2962 (let ((cursor-in-echo-area t))
2963 (message "Enter the 2nd buffer you want to compare (%s): "
2964 (mapconcat 'char-to-string possibilities "/"))
2965 (setq answer (capitalize (read-char-exclusive))))))
2966 (t ; 2way comparison
2967 (setq bufA ediff-buffer-A
2968 bufB ediff-buffer-B)))
2969
2970 (ediff-eval-in-buffer bufA
2971 (or (mark t)
2972 (error "You forgot to specify a region in buffer %s" (buffer-name)))
2973 (setq begA (region-beginning)
2974 endA (region-end))
2975 (goto-char begA)
2976 (beginning-of-line)
2977 (setq begA (point))
2978 (goto-char endA)
2979 (end-of-line)
2980 (or (eobp) (forward-char)) ; include the newline char
2981 (setq endA (point)))
2982 (ediff-eval-in-buffer bufB
2983 (or (mark t)
2984 (error "You forgot to specify a region in buffer %s" (buffer-name)))
2985 (setq begB (region-beginning)
2986 endB (region-end))
2987 (goto-char begB)
2988 (beginning-of-line)
2989 (setq begB (point))
2990 (goto-char endB)
2991 (end-of-line)
2992 (or (eobp) (forward-char)) ; include the newline char
2993 (setq endB (point)))
2994
2995 (ediff-unselect-and-select-difference
2996 ediff-current-difference 'unselect-only)
2997 (ediff-paint-background-regions 'unhighlight)
2998
2999 (ediff-eval-in-buffer bufA
3000 (goto-char begA)
3001 (set-mark endA)
3002 (narrow-to-region begA endA)
3003 ;; (ediff-activate-mark)
3004 )
3005 ;; (sit-for 0)
3006 (ediff-eval-in-buffer bufB
3007 (goto-char begB)
3008 (set-mark endB)
3009 (narrow-to-region begB endB)
3010 ;; (ediff-activate-mark)
3011 )
3012 ;; (sit-for 0)
3013
3014 (or (y-or-n-p
3015 "Please check the selected regions. Continue? ")
3016 (setq quit-now t))
3017
3018 (ediff-eval-in-buffer bufA
3019 (widen))
3020 (ediff-eval-in-buffer bufB
3021 (widen))
3022 (if quit-now
3023 (error "Thank you. Come back another day..."))
3024
3025 (ediff-regions-internal
3026 bufA begA endA bufB begB endB
3027 nil ; startup hook
3028 'ediff-regions-linewise ; job name
3029 nil) ; no word mode
3030 ))
3031
3032
3033
2803 (defun ediff-remove-flags-from-buffer (buffer overlay) 3034 (defun ediff-remove-flags-from-buffer (buffer overlay)
2804 (ediff-eval-in-buffer buffer 3035 (ediff-eval-in-buffer buffer
2805 (let ((inhibit-read-only t)) 3036 (let ((inhibit-read-only t))
2806 (if ediff-xemacs-p 3037 (if ediff-xemacs-p
2807 (ediff-overlay-put overlay 'begin-glyph nil) 3038 (ediff-overlay-put overlay 'begin-glyph nil)
2808 ;; before-string is not yet implemented in emacs.
2809 ;; when it will be, I will be able to delete much of the rest of
2810 ;; this function
2811 (ediff-overlay-put overlay 'before-string nil)) 3039 (ediff-overlay-put overlay 'before-string nil))
2812 3040
2813 (if ediff-xemacs-p 3041 (if ediff-xemacs-p
2814 (ediff-overlay-put overlay 'end-glyph nil) 3042 (ediff-overlay-put overlay 'end-glyph nil)
2815 ;; after-string is not yet implemented in emacs.
2816 (ediff-overlay-put overlay 'after-string nil)) 3043 (ediff-overlay-put overlay 'after-string nil))
2817 ))) 3044 )))
2818 3045
2819 3046
2820 3047
2821 ;; will simplify it in due time, when emacs acquires before/after strings
2822 (defun ediff-place-flags-in-buffer (buf-type buffer ctl-buffer diff) 3048 (defun ediff-place-flags-in-buffer (buf-type buffer ctl-buffer diff)
2823 (ediff-eval-in-buffer buffer 3049 (ediff-eval-in-buffer buffer
2824 (ediff-place-flags-in-buffer1 buf-type ctl-buffer diff))) 3050 (ediff-place-flags-in-buffer1 buf-type ctl-buffer diff)))
2825 3051
2826 3052
2891 (ediff-overlay-start diff-overlay) 3117 (ediff-overlay-start diff-overlay)
2892 (ediff-overlay-end diff-overlay)) 3118 (ediff-overlay-end diff-overlay))
2893 )) 3119 ))
2894 3120
2895 3121
2896 3122 ;; Restore highlighting to what it should be according to ediff-use-faces,
2897 (defun ediff-highlight-diff-in-one-buffer (n buf-type) 3123 ;; ediff-highlighting-style, and ediff-highlight-all-diffs variables.
2898 (if (ediff-buffer-live-p (ediff-get-buffer buf-type)) 3124 (defun ediff-restore-highlighting (&optional ctl-buf)
2899 (let* ((buff (ediff-get-buffer buf-type)) 3125 (ediff-eval-in-buffer (or ctl-buf (current-buffer))
2900 (last (ediff-eval-in-buffer buff (point-max))) 3126 (if (and (ediff-has-face-support-p)
2901 (begin (ediff-get-diff-posn buf-type 'beg n)) 3127 ediff-use-faces
2902 (end (ediff-get-diff-posn buf-type 'end n)) 3128 ediff-highlight-all-diffs)
2903 (xtra (if (equal begin end) 1 0)) 3129 (ediff-paint-background-regions))
2904 (end-hilit (min last (+ end xtra))) 3130 (ediff-select-difference ediff-current-difference)))
2905 (current-diff-overlay 3131
2906 (symbol-value
2907 (intern (format "ediff-current-diff-overlay-%S" buf-type))))
2908 )
2909
2910 (if ediff-xemacs-p
2911 (ediff-move-overlay current-diff-overlay begin end-hilit)
2912 (ediff-move-overlay current-diff-overlay begin end-hilit buff))
2913 ;; giving priority of 0 and then changing it may look funny, but
2914 ;; this overcomes an obscure Emacs bug.
2915 (ediff-overlay-put current-diff-overlay 'priority 0)
2916 (ediff-overlay-put current-diff-overlay 'priority
2917 (ediff-highest-priority begin end-hilit buff))
2918 (ediff-overlay-put current-diff-overlay 'ediff-diff-num n)
2919
2920 ;; unhighlight the background overlay for diff n so it won't
2921 ;; interfere with the current diff overlay
2922 (ediff-set-overlay-face (ediff-get-diff-overlay n buf-type) nil)
2923 )))
2924
2925
2926 (defun ediff-unhighlight-diff-in-one-buffer (buf-type)
2927 (if (ediff-buffer-live-p (ediff-get-buffer buf-type))
2928 (let ((current-diff-overlay
2929 (symbol-value
2930 (intern (format "ediff-current-diff-overlay-%S" buf-type))))
2931 (overlay
2932 (ediff-get-diff-overlay ediff-current-difference buf-type))
2933 )
2934
2935 (ediff-move-overlay current-diff-overlay 1 1)
2936
2937 ;; rehighlight the overlay in the background of the
2938 ;; current difference region
2939 (ediff-set-overlay-face
2940 overlay
2941 (if (and (ediff-has-face-support-p)
2942 ediff-use-faces ediff-highlight-all-diffs)
2943 (ediff-background-face buf-type ediff-current-difference)))
2944 )))
2945
2946 (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
2947 (ediff-unselect-and-select-difference -1)
2948 (if (and (ediff-has-face-support-p) ediff-use-faces)
2949 (let* ((inhibit-quit t)
2950 (current-diff-overlay-var
2951 (intern (format "ediff-current-diff-overlay-%S" buf-type)))
2952 (current-diff-overlay (symbol-value current-diff-overlay-var)))
2953 (ediff-color-background-regions 'unhighlight)
2954 (if (ediff-overlayp current-diff-overlay)
2955 (ediff-delete-overlay current-diff-overlay))
2956 (set current-diff-overlay-var nil)
2957 )))
2958 3132
2959 3133
2960 ;; null out difference overlays so they won't slow down future 3134 ;; null out difference overlays so they won't slow down future
2961 ;; editing operations 3135 ;; editing operations
2962 ;; VEC is either a difference vector or a fine-diff vector 3136 ;; VEC is either a difference vector or a fine-diff vector
2971 )) 3145 ))
2972 (symbol-value vec-var))) 3146 (symbol-value vec-var)))
2973 ;; allow them to be garbage collected 3147 ;; allow them to be garbage collected
2974 (set vec-var nil)) 3148 (set vec-var nil))
2975 3149
2976 (defun ediff-color-background-regions (&optional unhighlight)
2977 (ediff-color-background-regions-in-one-buffer
2978 'A unhighlight)
2979 (ediff-color-background-regions-in-one-buffer
2980 'B unhighlight)
2981 (ediff-color-background-regions-in-one-buffer
2982 'C unhighlight)
2983 (ediff-color-background-regions-in-one-buffer
2984 'Ancestor unhighlight))
2985
2986 (defun ediff-color-background-regions-in-one-buffer (buf-type unhighlight)
2987 (let ((diff-vector
2988 (eval (intern (format "ediff-difference-vector-%S" buf-type))))
2989 overl diff-num)
2990 (mapcar (function
2991 (lambda (rec)
2992 (setq overl (ediff-get-diff-overlay-from-diff-record rec)
2993 diff-num (ediff-overlay-get overl 'ediff-diff-num))
2994 (ediff-set-overlay-face
2995 overl
2996 (if (not unhighlight)
2997 (ediff-background-face buf-type diff-num))
2998 )))
2999 diff-vector)))
3000 3150
3001 3151
3002 ;;; Misc 3152 ;;; Misc
3003
3004 ;; These two functions are here to neutralize XEmacs unwillingless to
3005 ;; handle overlays whose buffers were deleted.
3006 (defun ediff-move-overlay (overlay beg end &optional buffer)
3007 "Calls `move-overlay' in Emacs and `set-extent-endpoints' in Lemacs.
3008 Checks if overlay's buffer exists before actually doing the move."
3009 (let ((buf (and overlay (ediff-overlay-buffer overlay))))
3010 (if (ediff-buffer-live-p buf)
3011 (if ediff-xemacs-p
3012 (set-extent-endpoints overlay beg end)
3013 (move-overlay overlay beg end buffer))
3014 ;; buffer's dead
3015 (if overlay
3016 (ediff-delete-overlay overlay)))))
3017
3018 (defun ediff-overlay-put (overlay prop value)
3019 "Calls `overlay-put' or `set-extent-property' depending on Emacs version.
3020 Checks if overlay's buffer exists."
3021 (if (ediff-buffer-live-p (ediff-overlay-buffer overlay))
3022 (if ediff-xemacs-p
3023 (set-extent-property overlay prop value)
3024 (overlay-put overlay prop value))
3025 (ediff-delete-overlay overlay)))
3026
3027 3153
3028 ;; In Emacs, this just makes overlay. In the future, when Emacs will start 3154 ;; In Emacs, this just makes overlay. In the future, when Emacs will start
3029 ;; supporting sticky overlays, this function will make a sticky overlay. 3155 ;; supporting sticky overlays, this function will make a sticky overlay.
3030 ;; BEG and END are expressions telling where overlay starts. 3156 ;; BEG and END are expressions telling where overlay starts.
3031 ;; If they are numbers or buffers, then all is well. Otherwise, they must 3157 ;; If they are numbers or buffers, then all is well. Otherwise, they must
3233 3359
3234 (defun ediff-deactivate-mark () 3360 (defun ediff-deactivate-mark ()
3235 (if ediff-xemacs-p 3361 (if ediff-xemacs-p
3236 (zmacs-deactivate-region) 3362 (zmacs-deactivate-region)
3237 (deactivate-mark))) 3363 (deactivate-mark)))
3364 (defun ediff-activate-mark ()
3365 (if ediff-emacs-p
3366 (setq mark-active t)
3367 (zmacs-activate-region)))
3238 3368
3239 (cond ((fboundp 'nuke-selective-display) 3369 (cond ((fboundp 'nuke-selective-display)
3240 ;; XEmacs 19.12 has nuke-selective-display 3370 ;; XEmacs 19.12 has nuke-selective-display
3241 (fset 'ediff-nuke-selective-display 'nuke-selective-display)) 3371 (fset 'ediff-nuke-selective-display 'nuke-selective-display))
3242 (t 3372 (t
3460 3590
3461 3591
3462 ;;; Local Variables: 3592 ;;; Local Variables:
3463 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) 3593 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
3464 ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1) 3594 ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
3595 ;;; eval: (put 'ediff-eval-in-buffer 'edebug-form-spec '(form body))
3465 ;;; End: 3596 ;;; End:
3466 3597
3467 (provide 'ediff-util) 3598 (provide 'ediff-util)
3468 3599
3469 ;;; ediff-util.el ends here 3600 ;;; ediff-util.el ends here