comparison lisp/ediff-util.el @ 42602:633233bf2bbf

2002-01-07 Michael Kifer <kifer@cs.stonybrook.edu> * viper-init.el (viper-cond-compile-for-xemacs-or-emacs): new macro that replaces viper-emacs-p and viper-xemacs-p in many cases. Used to reduce the number of warnings. * viper-cmd.el: use viper-cond-compile-for-xemacs-or-emacs. (viper-standard-value): moved here from viper.el. (viper-set-unread-command-events): moved to viper-util.el (viper-check-minibuffer-overlay): make sure viper-minibuffer-overlay is moved to cover the entire input field. * viper-util.el: use viper-cond-compile-for-xemacs-or-emacs. (viper-read-key-sequence, viper-set-unread-command-events, viper-char-symbol-sequence-p, viper-char-array-p): moved here. * viper-ex.el: use viper-cond-compile-for-xemacs-or-emacs. * viper-keym.el: use viper-cond-compile-for-xemacs-or-emacs. * viper-mous.el: use viper-cond-compile-for-xemacs-or-emacs. * viper-macs.el (viper-char-array-p, viper-char-symbol-sequence-p, viper-event-vector-p): moved to viper-util.el * viper.el (viper-standard-value): moved to viper-cmd.el. Use viper-cond-compile-for-xemacs-or-emacs. * ediff-help.el: use ediff-cond-compile-for-xemacs-or-emacs. * ediff-hook.el: use ediff-cond-compile-for-xemacs-or-emacs. * ediff-init.el (ediff-cond-compile-for-xemacs-or-emacs): new macro designed to be used in many places where ediff-emacs-p or ediff-xemacs-p was previously used. Reduces the number of warnings. Use ediff-cond-compile-for-xemacs-or-emacs in many places in lieue of ediff-xemacs-p. (ediff-make-current-diff-overlay, ediff-highlight-diff-in-one-buffer, ediff-convert-fine-diffs-to-overlays, ediff-empty-diff-region-p, ediff-whitespace-diff-region-p, ediff-get-region-contents): moved to ediff-util.el. (ediff-event-key): moved here. * ediff-merge.el: got rid of unreferenced variables. * ediff-mult.el: use ediff-cond-compile-for-xemacs-or-emacs. * ediff-util.el: use ediff-cond-compile-for-xemacs-or-emacs. (ediff-cleanup-mess): improved the way windows are set up after quitting ediff. (ediff-janitor): use ediff-dispose-of-variant-according-to-user. (ediff-dispose-of-variant-according-to-user): new function designed to be smarter and also understands indirect buffers. (ediff-highlight-diff-in-one-buffer, ediff-unhighlight-diff-in-one-buffer, ediff-unhighlight-diffs-totally-in-one-buffer, ediff-highlight-diff, ediff-highlight-diff, ediff-unhighlight-diff, ediff-unhighlight-diffs-totally, ediff-empty-diff-region-p, ediff-whitespace-diff-region-p, ediff-get-region-contents, ediff-make-current-diff-overlay): moved here. (ediff-format-bindings-of): new function by Hannu Koivisto <azure@iki.fi>. (ediff-setup): make sure the merge buffer is always widened and modifiable. (ediff-write-merge-buffer-and-maybe-kill): refuse to write the result of a merge into a file visited by another buffer. (ediff-arrange-autosave-in-merge-jobs): check if the merge file is visited by another buffer and ask to save/delete that buffer. (ediff-verify-file-merge-buffer): new function to do the above. * ediff-vers.el: load ediff-init.el at compile time. * ediff-wind.el: use ediff-cond-compile-for-xemacs-or-emacs. * ediff.el (ediff-windows, ediff-regions-wordwise, ediff-regions-linewise): use indirect buffers to improve robustness and make it possible to compare regions of the same buffer (even overlapping regions). (ediff-clone-buffer-for-region-comparison, ediff-clone-buffer-for-window-comparison): new functions. (ediff-files-internal): refuse to compare identical files. (ediff-regions-internal): get rid of the warning about comparing regions of the same buffer. * ediff-diff.el (ediff-convert-fine-diffs-to-overlays): moved here. Plus the following fixes courtesy of Dave Love: Doc fixes. (ediff-word-1): Use word class and move - to the front per regexp documentation. (ediff-wordify): Bind forward-word-function outside loop. (ediff-copy-to-buffer): Use insert-buffer-substring rather than consing buffer contents. (ediff-goto-word): Move syntax table setting outside loop.
author Michael Kifer <kifer@cs.stonybrook.edu>
date Tue, 08 Jan 2002 04:36:01 +0000
parents 3ce98f3e0608
children 69c91aaa067a
comparison
equal deleted inserted replaced
42601:ddd4802ff361 42602:633233bf2bbf
1 ;;; ediff-util.el --- the core commands and utilities of ediff 1 ;;; ediff-util.el --- the core commands and utilities of ediff
2 2
3 ;; Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01 Free Software Foundation, Inc. 3 ;; Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01, 02 Free Software Foundation, Inc.
4 4
5 ;; Author: Michael Kifer <kifer@cs.sunysb.edu> 5 ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
6 6
7 ;; This file is part of GNU Emacs. 7 ;; This file is part of GNU Emacs.
8 8
9 ;; GNU Emacs is free software; you can redistribute it and/or modify 9 ;; GNU Emacs is free software; you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by 10 ;; it under the terms of the GNU General Public License as published by
294 (make-local-variable 'ediff-default-variant) 294 (make-local-variable 'ediff-default-variant)
295 (make-local-variable 'ediff-merge-window-share) 295 (make-local-variable 'ediff-merge-window-share)
296 (make-local-variable 'ediff-window-setup-function) 296 (make-local-variable 'ediff-window-setup-function)
297 (make-local-variable 'ediff-keep-variants) 297 (make-local-variable 'ediff-keep-variants)
298 298
299 (ediff-cond-compile-for-xemacs-or-emacs
300 (make-local-hook 'ediff-after-quit-hook-internal) ; xemacs form
301 nil ; emacs form
302 )
303
299 ;; unwrap set up parameters passed as argument 304 ;; unwrap set up parameters passed as argument
300 (while setup-parameters 305 (while setup-parameters
301 (set (car (car setup-parameters)) (cdr (car setup-parameters))) 306 (set (car (car setup-parameters)) (cdr (car setup-parameters)))
302 (setq setup-parameters (cdr setup-parameters))) 307 (setq setup-parameters (cdr setup-parameters)))
303 308
315 ;; Don't delete variants in case of ediff-buffer-* jobs without asking. 320 ;; Don't delete variants in case of ediff-buffer-* jobs without asking.
316 ;; This is because u may loose work---dangerous. 321 ;; This is because u may loose work---dangerous.
317 (if (string-match "buffer" (symbol-name ediff-job-name)) 322 (if (string-match "buffer" (symbol-name ediff-job-name))
318 (setq ediff-keep-variants t)) 323 (setq ediff-keep-variants t))
319 324
320 (if ediff-xemacs-p 325 (ediff-cond-compile-for-xemacs-or-emacs
321 (make-local-hook 'pre-command-hook)) 326 (make-local-hook 'pre-command-hook) ; xemacs form
327 nil ; emacs form
328 )
322 329
323 (if (ediff-window-display-p) 330 (if (ediff-window-display-p)
324 (add-hook 'pre-command-hook 'ediff-spy-after-mouse nil 'local)) 331 (add-hook 'pre-command-hook 'ediff-spy-after-mouse nil 'local))
325 (setq ediff-mouse-pixel-position (mouse-pixel-position)) 332 (setq ediff-mouse-pixel-position (mouse-pixel-position))
326 333
349 (ediff-unique-buffer-name "*ediff-merge" "*"))) 356 (ediff-unique-buffer-name "*ediff-merge" "*")))
350 (save-excursion 357 (save-excursion
351 (set-buffer buffer-C) 358 (set-buffer buffer-C)
352 (insert-buffer buf) 359 (insert-buffer buf)
353 (funcall (ediff-with-current-buffer buf major-mode)) 360 (funcall (ediff-with-current-buffer buf major-mode))
361 (widen) ; merge buffer is always widened
354 (add-hook 'local-write-file-hooks 'ediff-set-merge-mode nil t) 362 (add-hook 'local-write-file-hooks 'ediff-set-merge-mode nil t)
355 ))) 363 )))
356 (setq buffer-read-only nil 364 (setq buffer-read-only nil
357 ediff-buffer-A buffer-A 365 ediff-buffer-A buffer-A
358 ediff-buffer-B buffer-B 366 ediff-buffer-B buffer-B
449 ) 457 )
450 458
451 (if ediff-3way-job 459 (if ediff-3way-job
452 (ediff-with-current-buffer ediff-buffer-C 460 (ediff-with-current-buffer ediff-buffer-C
453 (ediff-nuke-selective-display) 461 (ediff-nuke-selective-display)
462 ;; the merge bufer should never be narrowed
463 ;; (it can happen if it is on rmail-mode or similar)
464 (if (ediff-with-current-buffer control-buffer ediff-merge-job)
465 (widen))
454 (run-hooks 'ediff-prepare-buffer-hook) 466 (run-hooks 'ediff-prepare-buffer-hook)
455 ;; add control-buffer to the list of sessions 467 ;; add control-buffer to the list of sessions
456 (or (memq control-buffer ediff-this-buffer-ediff-sessions) 468 (or (memq control-buffer ediff-this-buffer-ediff-sessions)
457 (setq ediff-this-buffer-ediff-sessions 469 (setq ediff-this-buffer-ediff-sessions
458 (cons control-buffer 470 (cons control-buffer
459 ediff-this-buffer-ediff-sessions))) 471 ediff-this-buffer-ediff-sessions)))
460 (if ediff-make-buffers-readonly-at-startup 472 (if ediff-make-buffers-readonly-at-startup
461 (setq buffer-read-only t)) 473 (setq buffer-read-only t)
474 (setq buffer-read-only nil))
462 )) 475 ))
463 476
464 (if (ediff-buffer-live-p ediff-ancestor-buffer) 477 (if (ediff-buffer-live-p ediff-ancestor-buffer)
465 (ediff-with-current-buffer ediff-ancestor-buffer 478 (ediff-with-current-buffer ediff-ancestor-buffer
466 (ediff-nuke-selective-display) 479 (ediff-nuke-selective-display)
470 (setq ediff-this-buffer-ediff-sessions 483 (setq ediff-this-buffer-ediff-sessions
471 (cons control-buffer 484 (cons control-buffer
472 ediff-this-buffer-ediff-sessions))) 485 ediff-this-buffer-ediff-sessions)))
473 )) 486 ))
474 487
475 ;; must come after setting up ediff-narrow-bounds AND after 488 ;; the following must be after setting up ediff-narrow-bounds AND after
476 ;; nuking selective display 489 ;; nuking selective display
477 (funcall ediff-setup-diff-regions-function file-A file-B file-C) 490 (funcall ediff-setup-diff-regions-function file-A file-B file-C)
478 (setq ediff-number-of-differences (length ediff-difference-vector-A)) 491 (setq ediff-number-of-differences (length ediff-difference-vector-A))
479 (setq ediff-current-difference -1) 492 (setq ediff-current-difference -1)
480 493
573 (setq ediff-autostore-merges t 586 (setq ediff-autostore-merges t
574 ediff-merge-store-file merge-buffer-file)) 587 ediff-merge-store-file merge-buffer-file))
575 (if (stringp ediff-merge-store-file) 588 (if (stringp ediff-merge-store-file)
576 (progn 589 (progn
577 ;; save before leaving ctl buffer 590 ;; save before leaving ctl buffer
591 (ediff-verify-file-merge-buffer ediff-merge-store-file)
578 (setq merge-buffer-file ediff-merge-store-file) 592 (setq merge-buffer-file ediff-merge-store-file)
579 (ediff-with-current-buffer ediff-buffer-C 593 (ediff-with-current-buffer ediff-buffer-C
580 (set-visited-file-name merge-buffer-file)))) 594 (set-visited-file-name merge-buffer-file))))
581 (ediff-with-current-buffer ediff-buffer-C 595 (ediff-with-current-buffer ediff-buffer-C
582 (setq buffer-offer-save t) ; ask before killing buffer 596 (setq buffer-offer-save t) ; ask before killing buffer
1324 ;;(selected-frame). 1338 ;;(selected-frame).
1325 ;; The problem with this is that any previous bottom-toolbar 1339 ;; The problem with this is that any previous bottom-toolbar
1326 ;; will not re-appear after our cleanup here. Is there a way 1340 ;; will not re-appear after our cleanup here. Is there a way
1327 ;; to do "push" and "pop" toolbars ? --marcpa 1341 ;; to do "push" and "pop" toolbars ? --marcpa
1328 (if (ediff-use-toolbar-p) 1342 (if (ediff-use-toolbar-p)
1329 (progn 1343 (ediff-cond-compile-for-xemacs-or-emacs
1330 (set-specifier bottom-toolbar (list (selected-frame) nil)) 1344 (progn ; xemacs
1331 (set-specifier bottom-toolbar-visible-p (list (selected-frame) nil))))) 1345 (set-specifier bottom-toolbar (list (selected-frame) nil))
1346 (set-specifier bottom-toolbar-visible-p (list (selected-frame) nil)))
1347 nil ; emacs
1348 )
1349 ))
1332 1350
1333 ;; If wants to use toolbar, make it. 1351 ;; If wants to use toolbar, make it.
1334 ;; If not, zero the toolbar for XEmacs. 1352 ;; If not, zero the toolbar for XEmacs.
1335 ;; Do nothing for Emacs. 1353 ;; Do nothing for Emacs.
1336 (defun ediff-make-bottom-toolbar (&optional frame) 1354 (defun ediff-make-bottom-toolbar (&optional frame)
1337 (if (ediff-window-display-p) 1355 (if (ediff-window-display-p)
1338 (progn 1356 (progn
1339 (setq frame (or frame (selected-frame))) 1357 (setq frame (or frame (selected-frame)))
1340 (cond ((ediff-use-toolbar-p) ; this checks for XEmacs 1358 (cond ((ediff-use-toolbar-p) ; this checks for XEmacs
1341 (set-specifier 1359 (ediff-cond-compile-for-xemacs-or-emacs
1342 bottom-toolbar 1360 (progn ; xemacs
1343 (list frame (if (ediff-3way-comparison-job) 1361 (set-specifier
1344 ediff-toolbar-3way ediff-toolbar))) 1362 bottom-toolbar
1345 (set-specifier bottom-toolbar-visible-p (list frame t)) 1363 (list frame (if (ediff-3way-comparison-job)
1346 (set-specifier bottom-toolbar-height 1364 ediff-toolbar-3way ediff-toolbar)))
1347 (list frame ediff-toolbar-height))) 1365 (set-specifier bottom-toolbar-visible-p (list frame t))
1366 (set-specifier bottom-toolbar-height
1367 (list frame ediff-toolbar-height)))
1368 nil ; emacs
1369 )
1370 )
1348 ((ediff-has-toolbar-support-p) 1371 ((ediff-has-toolbar-support-p)
1349 (set-specifier bottom-toolbar-height (list frame 0))) 1372 (ediff-cond-compile-for-xemacs-or-emacs
1373 (set-specifier bottom-toolbar-height (list frame 0)) ; xemacs
1374 nil ; emacs
1375 )
1376 )
1350 )) 1377 ))
1351 )) 1378 ))
1352 1379
1353 ;; Merging 1380 ;; Merging
1354 1381
1905 (if (eq arg '-) (setq arg -1)) ; translate neg arg to -1 1932 (if (eq arg '-) (setq arg -1)) ; translate neg arg to -1
1906 (if (numberp arg) (ediff-jump-to-difference arg)) 1933 (if (numberp arg) (ediff-jump-to-difference arg))
1907 1934
1908 (let* ((key1 (aref keys 0)) 1935 (let* ((key1 (aref keys 0))
1909 (key2 (aref keys 1)) 1936 (key2 (aref keys 1))
1910 (char1 (if (and ediff-xemacs-p (eventp key1)) (event-key key1) key1)) 1937 (char1 (ediff-event-key key1))
1911 (char2 (if (and ediff-xemacs-p (eventp key1)) (event-key key2) key2)) 1938 (char2 (ediff-event-key key2))
1912 ediff-verbose-p) 1939 ediff-verbose-p)
1913 (ediff-copy-diff ediff-current-difference 1940 (ediff-copy-diff ediff-current-difference
1914 (ediff-char-to-buftype char1) 1941 (ediff-char-to-buftype char1)
1915 (ediff-char-to-buftype char2)) 1942 (ediff-char-to-buftype char2))
1916 ;; recenter with rehighlighting, but no messages 1943 ;; recenter with rehighlighting, but no messages
2378 (ediff-clear-diff-vector 'ediff-difference-vector-C 'fine-diffs-also) 2405 (ediff-clear-diff-vector 'ediff-difference-vector-C 'fine-diffs-also)
2379 (ediff-clear-diff-vector 'ediff-difference-vector-Ancestor 'fine-diffs-also) 2406 (ediff-clear-diff-vector 'ediff-difference-vector-Ancestor 'fine-diffs-also)
2380 2407
2381 (ediff-delete-temp-files) 2408 (ediff-delete-temp-files)
2382 2409
2383 ;; Restore visibility range. This affects only ediff-*-regions/windows. 2410 ;; Restore the visibility range. This affects only ediff-*-regions/windows.
2384 ;; Since for other job names ediff-visible-region sets 2411 ;; Since for other job names ediff-visible-region sets
2385 ;; ediff-visible-bounds to ediff-wide-bounds, the settings below are 2412 ;; ediff-visible-bounds to ediff-wide-bounds, the settings below are
2386 ;; ignored for such jobs. 2413 ;; ignored for such jobs.
2387 (if ediff-quit-widened 2414 (if ediff-quit-widened
2388 (setq ediff-visible-bounds ediff-wide-bounds) 2415 (setq ediff-visible-bounds ediff-wide-bounds)
2460 (run-hooks 'ediff-quit-merge-hook)) 2487 (run-hooks 'ediff-quit-merge-hook))
2461 (quit)) 2488 (quit))
2462 2489
2463 (run-hooks 'ediff-cleanup-hook) 2490 (run-hooks 'ediff-cleanup-hook)
2464 2491
2465 ;; now kill buffers A/B/C, if requested 2492 (ediff-janitor
2466 (let ((ediff-keep-variants ediff-keep-variants)) 2493 'ask
2467 (if reverse-default-keep-variants 2494 ;; reverse-default-keep-variants is t if the user quits with a prefix arg
2468 (setq ediff-keep-variants (not ediff-keep-variants))) 2495 (if reverse-default-keep-variants
2469 (or ediff-keep-variants (ediff-janitor 'ask))) 2496 (not ediff-keep-variants)
2497 ediff-keep-variants))
2470 2498
2471 ;; one hook here is ediff-cleanup-mess, which kills the control buffer and 2499 ;; one hook here is ediff-cleanup-mess, which kills the control buffer and
2472 ;; other auxiliary buffers. we made it into a hook to let the users do their 2500 ;; other auxiliary buffers. we made it into a hook to let the users do their
2473 ;; own cleanup, if needed. 2501 ;; own cleanup, if needed.
2474 (run-hooks 'ediff-quit-hook) 2502 (run-hooks 'ediff-quit-hook)
2546 (ediff-kill-bottom-toolbar)) 2574 (ediff-kill-bottom-toolbar))
2547 2575
2548 (ediff-kill-buffer-carefully ctl-buf) 2576 (ediff-kill-buffer-carefully ctl-buf)
2549 2577
2550 (if (frame-live-p main-frame) 2578 (if (frame-live-p main-frame)
2551 (progn 2579 (select-frame main-frame))
2552 (select-frame main-frame)
2553 (delete-other-windows)))
2554 2580
2555 ;; display only if not visible 2581 ;; display only if not visible
2556 (condition-case nil 2582 (condition-case nil
2557 (or (ediff-get-visible-buffer-window buff-B) 2583 (or (ediff-get-visible-buffer-window buff-B)
2558 (switch-to-buffer buff-B)) 2584 (switch-to-buffer buff-B))
2559 (error)) 2585 (error))
2560 (condition-case nil 2586 (condition-case nil
2561 (or (ediff-get-visible-buffer-window buff-A) 2587 (or (ediff-get-visible-buffer-window buff-A)
2562 (progn 2588 (progn
2563 (if (ediff-get-visible-buffer-window buff-B) 2589 (if (and (ediff-get-visible-buffer-window buff-B)
2590 (ediff-buffer-live-p buff-A))
2564 (funcall ediff-split-window-function)) 2591 (funcall ediff-split-window-function))
2565 (switch-to-buffer buff-A))) 2592 (switch-to-buffer buff-A)))
2566 (error)) 2593 (error))
2567 (if three-way-job 2594 (if three-way-job
2568 (condition-case nil 2595 (condition-case nil
2569 (or (ediff-get-visible-buffer-window buff-C) 2596 (or (ediff-get-visible-buffer-window buff-C)
2570 (progn 2597 (progn
2571 (if (or (ediff-get-visible-buffer-window buff-A) 2598 (if (and (or (ediff-get-visible-buffer-window buff-A)
2572 (ediff-get-visible-buffer-window buff-B)) 2599 (ediff-get-visible-buffer-window buff-B))
2600 (ediff-buffer-live-p buff-C))
2573 (funcall ediff-split-window-function)) 2601 (funcall ediff-split-window-function))
2574 (switch-to-buffer buff-C) 2602 (switch-to-buffer buff-C)
2575 (balance-windows))) 2603 (balance-windows)))
2576 (error))) 2604 (error)))
2577 (message "") 2605 (message "")
2578 )) 2606 ))
2579 2607
2580 (defun ediff-janitor (&optional ask) 2608 (defun ediff-janitor (ask keep-variants)
2581 "Kill buffers A, B, and, possibly, C, if these buffers aren't modified. 2609 "Kill buffers A, B, and, possibly, C, if these buffers aren't modified.
2582 In merge jobs, buffer C is never deleted. 2610 In merge jobs, buffer C is not deleted here, but rather according to
2583 However, the side effect of cleaning up may be that you cannot compare the same 2611 ediff-quit-merge-hook.
2584 buffer in two separate Ediff sessions: quitting one of them will delete this 2612 A side effect of cleaning up may be that you should be careful when comparing
2585 buffer in another session as well." 2613 the same buffer in two separate Ediff sessions: quitting one of them might
2586 (or (not (ediff-buffer-live-p ediff-buffer-A)) 2614 delete this buffer in another session as well."
2587 (buffer-modified-p ediff-buffer-A) 2615 (ediff-dispose-of-variant-according-to-user
2588 (and ask 2616 ediff-buffer-A 'A ask keep-variants)
2589 (not (y-or-n-p (format "Kill buffer A [%s]? " 2617 (ediff-dispose-of-variant-according-to-user
2590 (buffer-name ediff-buffer-A))))) 2618 ediff-buffer-B 'B ask keep-variants)
2591 (ediff-kill-buffer-carefully ediff-buffer-A))
2592 (or (not (ediff-buffer-live-p ediff-buffer-B))
2593 (buffer-modified-p ediff-buffer-B)
2594 (and ask
2595 (not (y-or-n-p (format "Kill buffer B [%s]? "
2596 (buffer-name ediff-buffer-B)))))
2597 (ediff-kill-buffer-carefully ediff-buffer-B))
2598 (if ediff-merge-job ; don't del buf C if merging--del ancestor buf instead 2619 (if ediff-merge-job ; don't del buf C if merging--del ancestor buf instead
2599 (or (not (ediff-buffer-live-p ediff-ancestor-buffer)) 2620 (ediff-dispose-of-variant-according-to-user
2600 (buffer-modified-p ediff-ancestor-buffer) 2621 ediff-ancestor-buffer 'Ancestor ask keep-variants)
2601 (and ask 2622 (ediff-dispose-of-variant-according-to-user
2602 (not (y-or-n-p (format "Kill the ancestor buffer [%s]? " 2623 ediff-buffer-C 'C ask keep-variants)
2603 (buffer-name ediff-ancestor-buffer))))) 2624 ))
2604 (ediff-kill-buffer-carefully ediff-ancestor-buffer)) 2625
2605 (or (not (ediff-buffer-live-p ediff-buffer-C)) 2626 ;; Kill the variant buffer, according to user directives (ask, kill
2606 (buffer-modified-p ediff-buffer-C) 2627 ;; unconditionaly, keep)
2607 (and ask (not (y-or-n-p (format "Kill buffer C [%s]? " 2628 ;; BUFF is the buffer, BUFF-TYPE is either 'A, or 'B, 'C, 'Ancestor
2608 (buffer-name ediff-buffer-C))))) 2629 (defun ediff-dispose-of-variant-according-to-user (buff bufftype ask keep-variants)
2609 (ediff-kill-buffer-carefully ediff-buffer-C)))) 2630 ;; if this is indirect buffer, kill it and substitute with direct buf
2631 (if (ediff-with-current-buffer buff ediff-temp-indirect-buffer)
2632 (let ((wind (ediff-get-visible-buffer-window buff))
2633 (base (buffer-base-buffer buff))
2634 (modified-p (buffer-modified-p buff)))
2635 (if (and (window-live-p wind) (ediff-buffer-live-p base))
2636 (set-window-buffer wind base))
2637 ;; Kill indirect buffer even if it is modified, because the base buffer
2638 ;; is still there. Note that if the base buffer is dead then so will be
2639 ;; the indirect buffer
2640 (ediff-with-current-buffer buff
2641 (set-buffer-modified-p nil))
2642 (ediff-kill-buffer-carefully buff)
2643 (ediff-with-current-buffer base
2644 (set-buffer-modified-p modified-p)))
2645 ;; otherwise, ask or use the value of keep-variants
2646 (or (not (ediff-buffer-live-p buff))
2647 keep-variants
2648 (buffer-modified-p buff)
2649 (and ask
2650 (not (y-or-n-p (format "Kill buffer %S [%s]? "
2651 bufftype (buffer-name buff)))))
2652 (ediff-kill-buffer-carefully buff))
2653 ))
2610 2654
2611 (defun ediff-maybe-save-and-delete-merge (&optional save-and-continue) 2655 (defun ediff-maybe-save-and-delete-merge (&optional save-and-continue)
2612 "Default hook to run on quitting a merge job. 2656 "Default hook to run on quitting a merge job.
2613 This can also be used to save merge buffer in the middle of an Ediff session. 2657 This can also be used to save merge buffer in the middle of an Ediff session.
2614 2658
2623 `ediff-merge-directories', `ediff-merge-directory-revisions', and such." 2667 `ediff-merge-directories', `ediff-merge-directory-revisions', and such."
2624 (let ((merge-store-file ediff-merge-store-file) 2668 (let ((merge-store-file ediff-merge-store-file)
2625 (ediff-autostore-merges ; fake ediff-autostore-merges, if necessary 2669 (ediff-autostore-merges ; fake ediff-autostore-merges, if necessary
2626 (if save-and-continue t ediff-autostore-merges))) 2670 (if save-and-continue t ediff-autostore-merges)))
2627 (if ediff-autostore-merges 2671 (if ediff-autostore-merges
2628 (cond ((stringp ediff-merge-store-file) 2672 (cond ((stringp merge-store-file)
2629 ;; store, ask to delete 2673 ;; store, ask to delete
2630 (ediff-write-merge-buffer-and-maybe-kill 2674 (ediff-write-merge-buffer-and-maybe-kill
2631 ediff-buffer-C merge-store-file 'show-file save-and-continue)) 2675 ediff-buffer-C merge-store-file 'show-file save-and-continue))
2632 ((eq ediff-autostore-merges t) 2676 ((eq ediff-autostore-merges t)
2633 ;; ask for file name 2677 ;; ask for file name
2645 ;; write merge buffer. If the optional argument save-and-continue is non-nil, 2689 ;; write merge buffer. If the optional argument save-and-continue is non-nil,
2646 ;; then don't kill the merge buffer 2690 ;; then don't kill the merge buffer
2647 (defun ediff-write-merge-buffer-and-maybe-kill (buf file 2691 (defun ediff-write-merge-buffer-and-maybe-kill (buf file
2648 &optional 2692 &optional
2649 show-file save-and-continue) 2693 show-file save-and-continue)
2650 (ediff-with-current-buffer buf 2694 (if (not (eq (find-buffer-visiting file) buf))
2651 (if (or (not (file-exists-p file)) 2695 (let ((warn-message
2652 (y-or-n-p (format "File %s exists, overwrite? " file))) 2696 (format "Another buffer is visiting file %s. Too dangerous to save the merge buffer"
2653 (progn 2697 file)))
2654 (write-region (point-min) (point-max) file) 2698 (beep)
2655 (if show-file 2699 (message warn-message)
2656 (progn 2700 (with-output-to-temp-buffer ediff-msg-buffer
2657 (message "Merge buffer saved in: %s" file) 2701 (princ "\n\n")
2658 (set-buffer-modified-p nil) 2702 (princ warn-message)
2659 (sit-for 3))) 2703 (princ "\n\n")
2660 (if (and 2704 )
2661 (not save-and-continue) 2705 (sit-for 2))
2662 (y-or-n-p "Merge buffer saved. Now kill the buffer? ")) 2706 (ediff-with-current-buffer buf
2663 (ediff-kill-buffer-carefully buf)))))) 2707 (if (or (not (file-exists-p file))
2708 (y-or-n-p (format "File %s exists, overwrite? " file)))
2709 (progn
2710 ;;(write-region (point-min) (point-max) file)
2711 (ediff-with-current-buffer buf
2712 (set-visited-file-name file)
2713 (save-buffer))
2714 (if show-file
2715 (progn
2716 (message "Merge buffer saved in: %s" file)
2717 (set-buffer-modified-p nil)
2718 (sit-for 3)))
2719 (if (and
2720 (not save-and-continue)
2721 (y-or-n-p "Merge buffer saved. Now kill the buffer? "))
2722 (ediff-kill-buffer-carefully buf)))))
2723 ))
2664 2724
2665 ;; The default way of suspending Ediff. 2725 ;; The default way of suspending Ediff.
2666 ;; Buries Ediff buffers, kills all windows. 2726 ;; Buries Ediff buffers, kills all windows.
2667 (defun ediff-default-suspend-function () 2727 (defun ediff-default-suspend-function ()
2668 (let* ((buf-A ediff-buffer-A) 2728 (let* ((buf-A ediff-buffer-A)
2924 2984
2925 (ediff-with-current-buffer control-buf (ediff-refresh-mode-lines)) 2985 (ediff-with-current-buffer control-buf (ediff-refresh-mode-lines))
2926 ))) 2986 )))
2927 2987
2928 2988
2989
2990 (defun ediff-highlight-diff-in-one-buffer (n buf-type)
2991 (if (ediff-buffer-live-p (ediff-get-buffer buf-type))
2992 (let* ((buff (ediff-get-buffer buf-type))
2993 (last (ediff-with-current-buffer buff (point-max)))
2994 (begin (ediff-get-diff-posn buf-type 'beg n))
2995 (end (ediff-get-diff-posn buf-type 'end n))
2996 (xtra (if (equal begin end) 1 0))
2997 (end-hilit (min last (+ end xtra)))
2998 (current-diff-overlay
2999 (symbol-value
3000 (ediff-get-symbol-from-alist
3001 buf-type ediff-current-diff-overlay-alist))))
3002
3003 (if ediff-xemacs-p
3004 (ediff-move-overlay current-diff-overlay begin end-hilit)
3005 (ediff-move-overlay current-diff-overlay begin end-hilit buff))
3006 (ediff-overlay-put current-diff-overlay 'priority
3007 (ediff-highest-priority begin end-hilit buff))
3008 (ediff-overlay-put current-diff-overlay 'ediff-diff-num n)
3009
3010 ;; unhighlight the background overlay for diff n so it won't
3011 ;; interfere with the current diff overlay
3012 (ediff-set-overlay-face (ediff-get-diff-overlay n buf-type) nil)
3013 )))
3014
3015
3016 (defun ediff-unhighlight-diff-in-one-buffer (buf-type)
3017 (if (ediff-buffer-live-p (ediff-get-buffer buf-type))
3018 (let ((current-diff-overlay
3019 (symbol-value
3020 (ediff-get-symbol-from-alist
3021 buf-type ediff-current-diff-overlay-alist)))
3022 (overlay
3023 (ediff-get-diff-overlay ediff-current-difference buf-type))
3024 )
3025
3026 (ediff-move-overlay current-diff-overlay 1 1)
3027
3028 ;; rehighlight the overlay in the background of the
3029 ;; current difference region
3030 (ediff-set-overlay-face
3031 overlay
3032 (if (and (ediff-has-face-support-p)
3033 ediff-use-faces ediff-highlight-all-diffs)
3034 (ediff-background-face buf-type ediff-current-difference)))
3035 )))
3036
3037 (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
3038 (ediff-unselect-and-select-difference -1)
3039 (if (and (ediff-has-face-support-p) ediff-use-faces)
3040 (let* ((inhibit-quit t)
3041 (current-diff-overlay-var
3042 (ediff-get-symbol-from-alist
3043 buf-type ediff-current-diff-overlay-alist))
3044 (current-diff-overlay (symbol-value current-diff-overlay-var)))
3045 (ediff-paint-background-regions 'unhighlight)
3046 (if (ediff-overlayp current-diff-overlay)
3047 (ediff-delete-overlay current-diff-overlay))
3048 (set current-diff-overlay-var nil)
3049 )))
3050
3051
3052 (defsubst ediff-highlight-diff (n)
3053 "Put face on diff N. Invoked for X displays only."
3054 (ediff-highlight-diff-in-one-buffer n 'A)
3055 (ediff-highlight-diff-in-one-buffer n 'B)
3056 (ediff-highlight-diff-in-one-buffer n 'C)
3057 (ediff-highlight-diff-in-one-buffer n 'Ancestor)
3058 )
3059
3060
3061 (defsubst ediff-unhighlight-diff ()
3062 "Remove overlays from buffers A, B, and C."
3063 (ediff-unhighlight-diff-in-one-buffer 'A)
3064 (ediff-unhighlight-diff-in-one-buffer 'B)
3065 (ediff-unhighlight-diff-in-one-buffer 'C)
3066 (ediff-unhighlight-diff-in-one-buffer 'Ancestor)
3067 )
3068
3069 ;; delete highlighting overlays, restore faces to their original form
3070 (defsubst ediff-unhighlight-diffs-totally ()
3071 (ediff-unhighlight-diffs-totally-in-one-buffer 'A)
3072 (ediff-unhighlight-diffs-totally-in-one-buffer 'B)
3073 (ediff-unhighlight-diffs-totally-in-one-buffer 'C)
3074 (ediff-unhighlight-diffs-totally-in-one-buffer 'Ancestor)
3075 )
3076
3077
2929 ;; This is adapted from a similar function in `emerge.el'. 3078 ;; This is adapted from a similar function in `emerge.el'.
2930 ;; PROMPT should not have a trailing ': ', so that it can be modified 3079 ;; PROMPT should not have a trailing ': ', so that it can be modified
2931 ;; according to context. 3080 ;; according to context.
2932 ;; If DEFAULT-FILE is set, it should be used as the default value. 3081 ;; If DEFAULT-FILE is set, it should be used as the default value.
2933 ;; If DEFAULT-DIR is non-nil, use it as the default directory. 3082 ;; If DEFAULT-DIR is non-nil, use it as the default directory.
2934 ;; Otherwise, use the value of Emacs' variable `default-directory.' 3083 ;; Otherwise, use the value of Emacs' variable `default-directory.'
2935 (defun ediff-read-file-name (prompt default-dir default-file) 3084 (defun ediff-read-file-name (prompt default-dir default-file &optional no-dirs)
2936 ;; hack default-dir if it is not set 3085 ;; hack default-dir if it is not set
2937 (setq default-dir 3086 (setq default-dir
2938 (file-name-as-directory 3087 (file-name-as-directory
2939 (ediff-abbreviate-file-name 3088 (ediff-abbreviate-file-name
2940 (expand-file-name (or default-dir 3089 (expand-file-name (or default-dir
2961 t ; must match, no-confirm 3110 t ; must match, no-confirm
2962 (if default-file (file-name-directory default-file)) 3111 (if default-file (file-name-directory default-file))
2963 ) 3112 )
2964 default-dir 3113 default-dir
2965 )) 3114 ))
2966 ;; If user enters a directory name, expand the default file in that 3115 ;; If user entered a directory name, expand the default file in that
2967 ;; directory. This allows the user to enter a directory name for the 3116 ;; directory. This allows the user to enter a directory name for the
2968 ;; B-file and diff against the default-file in that directory instead 3117 ;; B-file and diff against the default-file in that directory instead
2969 ;; of a DIRED listing! 3118 ;; of a DIRED listing!
2970 (if (and (file-directory-p f) default-file) 3119 (if (and (file-directory-p f) default-file)
2971 (setq f (expand-file-name 3120 (setq f (expand-file-name
2972 (file-name-nondirectory default-file) f))) 3121 (file-name-nondirectory default-file) f)))
3122 (if (and no-dirs (file-directory-p f))
3123 (error "File %s is a directory" f))
2973 f)) 3124 f))
2974 3125
2975 ;; If PREFIX is given, then it is used as a prefix for the temp file 3126 ;; If PREFIX is given, then it is used as a prefix for the temp file
2976 ;; name. Otherwise, `ediff' is used. If FILE is given, use this 3127 ;; name. Otherwise, `ediff' is used. If FILE is given, use this
2977 ;; file and don't create a new one. 3128 ;; file and don't create a new one.
3029 (let ((file proposed-name)) 3180 (let ((file proposed-name))
3030 (while (condition-case () 3181 (while (condition-case ()
3031 (progn 3182 (progn
3032 (if (or (file-exists-p file) (not keep-proposed-name)) 3183 (if (or (file-exists-p file) (not keep-proposed-name))
3033 (setq file (make-temp-name proposed-name))) 3184 (setq file (make-temp-name proposed-name)))
3034 (write-region "" nil file nil 'silent nil 'excl) 3185 ;; the with-temp-buffer thing is a workaround for an XEmacs
3186 ;; bug: write-region complains that we are trying to visit a
3187 ;; file in an indirect buffer, failing to notice that the
3188 ;; VISIT flag is unset and that we are actually writing from a
3189 ;; string and not from any buffer.
3190 (with-temp-buffer
3191 (write-region "" nil file nil 'silent nil 'excl))
3035 nil) 3192 nil)
3036 (file-already-exists t)) 3193 (file-already-exists t))
3037 ;; the file was somehow created by someone else between 3194 ;; the file was somehow created by someone else between
3038 ;; `make-temp-name' and `write-region', let's try again. 3195 ;; `make-temp-name' and `write-region', let's try again.
3039 nil) 3196 nil)
3062 ;; First check if the file has been modified since the buffer visited it. 3219 ;; First check if the file has been modified since the buffer visited it.
3063 (if (verify-visited-file-modtime (current-buffer)) 3220 (if (verify-visited-file-modtime (current-buffer))
3064 (if (buffer-modified-p) 3221 (if (buffer-modified-p)
3065 ;; If buffer is not obsolete and is modified, offer to save 3222 ;; If buffer is not obsolete and is modified, offer to save
3066 (if (yes-or-no-p 3223 (if (yes-or-no-p
3067 (format "Buffer out of sync with visited file. Save file %s? " 3224 (format "Buffer %s has been modified. Save it in file %s? "
3225 (buffer-name)
3068 buffer-file-name)) 3226 buffer-file-name))
3069 (condition-case nil 3227 (condition-case nil
3070 (save-buffer) 3228 (save-buffer)
3071 (error 3229 (error
3072 (beep) 3230 (beep)
3074 (error "Buffer is out of sync for file %s" buffer-file-name)) 3232 (error "Buffer is out of sync for file %s" buffer-file-name))
3075 ;; If buffer is not obsolete and is not modified, do nothing 3233 ;; If buffer is not obsolete and is not modified, do nothing
3076 nil) 3234 nil)
3077 ;; If buffer is obsolete, offer to revert 3235 ;; If buffer is obsolete, offer to revert
3078 (if (yes-or-no-p 3236 (if (yes-or-no-p
3079 (format "Buffer is out of sync with visited file. REVERT file %s? " 3237 (format "File %s was modified since visited by buffer %s. REVERT file %s? "
3238 buffer-file-name
3239 (buffer-name)
3080 buffer-file-name)) 3240 buffer-file-name))
3081 (progn 3241 (progn
3082 (if file-magic 3242 (if file-magic
3083 (erase-buffer)) 3243 (erase-buffer))
3084 (revert-buffer t t)) 3244 (revert-buffer t t))
3085 (error "Buffer out of sync for file %s" buffer-file-name)))) 3245 (error "Buffer out of sync for file %s" buffer-file-name))))
3246
3247 ;; if there is another buffer visiting the file of the merge buffer, offer to
3248 ;; save and delete the buffer; else bark
3249 (defun ediff-verify-file-merge-buffer (file)
3250 (let ((buff (if (stringp file) (find-buffer-visiting file)))
3251 warn-message)
3252 (or (null buff)
3253 (progn
3254 (setq warn-message
3255 (format "Buffer %s is visiting %s. Save and kill the buffer? "
3256 (buffer-name buff) file))
3257 (with-output-to-temp-buffer ediff-msg-buffer
3258 (princ "\n\n")
3259 (princ warn-message)
3260 (princ "\n\n"))
3261 (if (y-or-n-p
3262 (message warn-message))
3263 (with-current-buffer buff
3264 (save-buffer)
3265 (kill-buffer (current-buffer)))
3266 (error "Too dangerous to merge versions of a file visited by another buffer"))))
3267 ))
3268
3086 3269
3087 3270
3088 (defun ediff-filename-magic-p (file) 3271 (defun ediff-filename-magic-p (file)
3089 (or (ediff-file-compressed-p file) 3272 (or (ediff-file-compressed-p file)
3090 (ediff-file-remote-p file))) 3273 (ediff-file-remote-p file)))
3385 (if ediff-xemacs-p 3568 (if ediff-xemacs-p
3386 (ediff-overlay-put curr-overl 'end-glyph flag) 3569 (ediff-overlay-put curr-overl 'end-glyph flag)
3387 (ediff-overlay-put curr-overl 'after-string flag)) 3570 (ediff-overlay-put curr-overl 'after-string flag))
3388 )) 3571 ))
3389 3572
3573
3574 ;;; Some diff region tests
3575
3576 ;; t if diff region is empty.
3577 ;; In case of buffer C, t also if it is not a 3way
3578 ;; comparison job (merging jobs return t as well).
3579 (defun ediff-empty-diff-region-p (n buf-type)
3580 (if (eq buf-type 'C)
3581 (or (not ediff-3way-comparison-job)
3582 (= (ediff-get-diff-posn 'C 'beg n)
3583 (ediff-get-diff-posn 'C 'end n)))
3584 (= (ediff-get-diff-posn buf-type 'beg n)
3585 (ediff-get-diff-posn buf-type 'end n))))
3586
3587 ;; Test if diff region is white space only.
3588 ;; If 2-way job and buf-type = C, then returns t.
3589 (defun ediff-whitespace-diff-region-p (n buf-type)
3590 (or (and (eq buf-type 'C) (not ediff-3way-job))
3591 (ediff-empty-diff-region-p n buf-type)
3592 (let ((beg (ediff-get-diff-posn buf-type 'beg n))
3593 (end (ediff-get-diff-posn buf-type 'end n)))
3594 (ediff-with-current-buffer (ediff-get-buffer buf-type)
3595 (save-excursion
3596 (goto-char beg)
3597 (skip-chars-forward ediff-whitespace)
3598 (>= (point) end))))))
3599
3600
3601 (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end)
3602 (ediff-with-current-buffer
3603 (ediff-with-current-buffer ctrl-buf (ediff-get-buffer buf-type))
3604 (buffer-substring
3605 (or start (ediff-get-diff-posn buf-type 'beg n ctrl-buf))
3606 (or end (ediff-get-diff-posn buf-type 'end n ctrl-buf)))))
3390 3607
3391 ;; Returns positions of difference sectors in the BUF-TYPE buffer. 3608 ;; Returns positions of difference sectors in the BUF-TYPE buffer.
3392 ;; BUF-TYPE should be a symbol -- `A', `B', or `C'. 3609 ;; BUF-TYPE should be a symbol -- `A', `B', or `C'.
3393 ;; POS is either `beg' or `end'--it specifies whether you want the position at 3610 ;; POS is either `beg' or `end'--it specifies whether you want the position at
3394 ;; the beginning of a difference or at the end. 3611 ;; the beginning of a difference or at the end.
3465 (or (number-or-marker-p beg) 3682 (or (number-or-marker-p beg)
3466 (setq beg (eval beg))) 3683 (setq beg (eval beg)))
3467 (or (number-or-marker-p end) 3684 (or (number-or-marker-p end)
3468 (setq end (eval end))) 3685 (setq end (eval end)))
3469 (setq overl 3686 (setq overl
3470 (if ediff-xemacs-p 3687 (ediff-cond-compile-for-xemacs-or-emacs
3471 (make-extent beg end buff) 3688 (make-extent beg end buff) ; xemacs
3472 ;; advance front and rear of the overlay 3689 ;; advance front and rear of the overlay
3473 (make-overlay beg end buff nil 'rear-advance))) 3690 (make-overlay beg end buff nil 'rear-advance) ; emacs
3691 ))
3474 3692
3475 ;; never detach 3693 ;; never detach
3476 (ediff-overlay-put 3694 (ediff-overlay-put
3477 overl (if ediff-emacs-p 'evaporate 'detachable) nil) 3695 overl (if ediff-emacs-p 'evaporate 'detachable) nil)
3478 ;; make overlay open-ended 3696 ;; make overlay open-ended
3481 (progn 3699 (progn
3482 (ediff-overlay-put overl 'start-open nil) 3700 (ediff-overlay-put overl 'start-open nil)
3483 (ediff-overlay-put overl 'end-open nil))) 3701 (ediff-overlay-put overl 'end-open nil)))
3484 (ediff-overlay-put overl 'ediff-diff-num 0) 3702 (ediff-overlay-put overl 'ediff-diff-num 0)
3485 overl)))) 3703 overl))))
3704
3705
3706 (defun ediff-make-current-diff-overlay (type)
3707 (if (ediff-has-face-support-p)
3708 (let ((overlay (ediff-get-symbol-from-alist
3709 type ediff-current-diff-overlay-alist))
3710 (buffer (ediff-get-buffer type))
3711 (face (face-name
3712 (symbol-value
3713 (ediff-get-symbol-from-alist
3714 type ediff-current-diff-face-alist)))))
3715 (set overlay
3716 (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer))
3717 (ediff-set-overlay-face (symbol-value overlay) face)
3718 (ediff-overlay-put (symbol-value overlay) 'ediff ediff-control-buffer))
3719 ))
3486 3720
3487 3721
3488 ;; Like other-buffer, but prefers visible buffers and ignores temporary or 3722 ;; Like other-buffer, but prefers visible buffers and ignores temporary or
3489 ;; other insignificant buffers (those beginning with "^[ *]"). 3723 ;; other insignificant buffers (those beginning with "^[ *]").
3490 ;; Gets one arg--buffer name or a list of buffer names (it won't return 3724 ;; Gets one arg--buffer name or a list of buffer names (it won't return
3693 (progn 3927 (progn
3694 (if (ediff-buffer-live-p ctl-buf) 3928 (if (ediff-buffer-live-p ctl-buf)
3695 (set-buffer ctl-buf)) 3929 (set-buffer ctl-buf))
3696 (setq buffer-name (buffer-name)) 3930 (setq buffer-name (buffer-name))
3697 (require 'reporter) 3931 (require 'reporter)
3698 (reporter-submit-bug-report "kifer@cs.sunysb.edu" 3932 (reporter-submit-bug-report "kifer@cs.stonybrook.edu"
3699 (ediff-version) 3933 (ediff-version)
3700 varlist 3934 varlist
3701 nil 3935 nil
3702 'delete-other-windows 3936 'delete-other-windows
3703 salutation)) 3937 salutation))
3727 (syntax-table)))) 3961 (syntax-table))))
3728 ) 3962 )
3729 3963
3730 3964
3731 (defun ediff-deactivate-mark () 3965 (defun ediff-deactivate-mark ()
3732 (if ediff-xemacs-p 3966 (ediff-cond-compile-for-xemacs-or-emacs
3733 (zmacs-deactivate-region) 3967 (zmacs-deactivate-region) ; xemacs
3734 (deactivate-mark))) 3968 (deactivate-mark) ; emacs
3969 ))
3735 (defun ediff-activate-mark () 3970 (defun ediff-activate-mark ()
3736 (if ediff-emacs-p 3971 (ediff-cond-compile-for-xemacs-or-emacs
3737 (setq mark-active t) 3972 (zmacs-activate-region) ; xemacs
3738 (zmacs-activate-region))) 3973 (setq mark-active t) ; emacs
3974 ))
3739 3975
3740 (cond ((fboundp 'nuke-selective-display) 3976 (cond ((fboundp 'nuke-selective-display)
3741 ;; XEmacs 19.12 has nuke-selective-display 3977 ;; XEmacs 19.12 has nuke-selective-display
3742 (fset 'ediff-nuke-selective-display 'nuke-selective-display)) 3978 (fset 'ediff-nuke-selective-display 'nuke-selective-display))
3743 (t 3979 (t
3846 (defun ediff-profile () 4082 (defun ediff-profile ()
3847 "Toggle profiling Ediff commands." 4083 "Toggle profiling Ediff commands."
3848 (interactive) 4084 (interactive)
3849 (ediff-barf-if-not-control-buffer) 4085 (ediff-barf-if-not-control-buffer)
3850 4086
3851 (if ediff-xemacs-p 4087 (ediff-cond-compile-for-xemacs-or-emacs
3852 (make-local-hook 'post-command-hook)) 4088 (make-local-hook 'post-command-hook) ; xemacs form
4089 nil ; emacs form
4090 )
3853 4091
3854 (let ((pre-hook 'pre-command-hook) 4092 (let ((pre-hook 'pre-command-hook)
3855 (post-hook 'post-command-hook)) 4093 (post-hook 'post-command-hook))
3856 (if (not (equal ediff-command-begin-time '(0 0 0))) 4094 (if (not (equal ediff-command-begin-time '(0 0 0)))
3857 (progn (remove-hook pre-hook 'ediff-save-time) 4095 (progn (remove-hook pre-hook 'ediff-save-time)
3908 (defun ediff-member (elt lis comparison-func) 4146 (defun ediff-member (elt lis comparison-func)
3909 (while (and lis (not (funcall comparison-func (car lis) elt))) 4147 (while (and lis (not (funcall comparison-func (car lis) elt)))
3910 (setq lis (cdr lis))) 4148 (setq lis (cdr lis)))
3911 lis) 4149 lis)
3912 4150
4151 ;; Make a readable representation of the invocation sequence for FUNC-DEF.
4152 ;; It would either be a key or M-x something.
4153 (defun ediff-format-bindings-of (func-def)
4154 (let ((desc (car (where-is-internal func-def
4155 overriding-local-map
4156 nil nil))))
4157 (if desc
4158 (key-description desc)
4159 (format "M-x %s" func-def))))
4160
3913 ;; this uses comparison-func to decide who is a member, and this determines how 4161 ;; this uses comparison-func to decide who is a member, and this determines how
3914 ;; intersection looks like 4162 ;; intersection looks like
3915 (defun ediff-intersection (lis1 lis2 comparison-func) 4163 (defun ediff-intersection (lis1 lis2 comparison-func)
3916 (let ((result (list 'a))) 4164 (let ((result (list 'a)))
3917 (while lis1 4165 (while lis1
3943 (nconc result (list (car lis1)))) 4191 (nconc result (list (car lis1))))
3944 (setq lis1 (cdr lis1))) 4192 (setq lis1 (cdr lis1)))
3945 (cdr result))) 4193 (cdr result)))
3946 4194
3947 (if (fboundp 'copy-sequence) 4195 (if (fboundp 'copy-sequence)
3948 (defalias 'ediff-copy-list 'copy-sequence) 4196 (fset 'ediff-copy-list (symbol-function 'copy-sequence))
3949 (defun ediff-copy-list (list) 4197 (defun ediff-copy-list (list)
3950 (if (consp list) 4198 (if (consp list)
3951 ;;;(let ((res nil)) 4199 ;;;(let ((res nil))
3952 ;;; (while (consp list) (push (pop list) res)) 4200 ;;; (while (consp list) (push (pop list) res))
3953 ;;; (prog1 (nreverse res) (setcdr res list))) 4201 ;;; (prog1 (nreverse res) (setcdr res list)))