Mercurial > emacs
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))) |