comparison lisp/vc/emerge.el @ 111421:ac911360c429

Minor emerge changes. * lisp/vc/emerge.el (emerge-eval-in-buffer): Remove, and replace all uses with with-current-buffer. (diff, template): Give dynamic local variables a prefix. (emerge-line-numbers): Rename local `diff' to emerge-line-diff. (emerge-line-number-in-buf): Update for above name change. (emerge-combine-versions-internal): Rename local `template' to emerge-combine-template. (emerge-combine-versions-edit): Update for above name change.
author Glenn Morris <rgm@gnu.org>
date Sat, 06 Nov 2010 11:51:11 -0700
parents d928a6a7c3f2
children 56b71cddc9c5
comparison
equal deleted inserted replaced
111420:6ce85d43dfda 111421:ac911360c429
27 ;; There aren't really global variables, just dynamic bindings 27 ;; There aren't really global variables, just dynamic bindings
28 (defvar A-begin) 28 (defvar A-begin)
29 (defvar A-end) 29 (defvar A-end)
30 (defvar B-begin) 30 (defvar B-begin)
31 (defvar B-end) 31 (defvar B-end)
32 (defvar diff)
33 (defvar diff-vector) 32 (defvar diff-vector)
34 (defvar merge-begin) 33 (defvar merge-begin)
35 (defvar merge-end) 34 (defvar merge-end)
36 (defvar template)
37 (defvar valid-diff) 35 (defvar valid-diff)
38 36
39 ;;; Macros 37 ;;; Macros
40
41 (defmacro emerge-eval-in-buffer (buffer &rest forms)
42 "Macro to switch to BUFFER, evaluate FORMS, returns to original buffer.
43 Differs from `save-excursion' in that it doesn't save the point and mark."
44 `(let ((StartBuffer (current-buffer)))
45 (unwind-protect
46 (progn
47 (set-buffer ,buffer)
48 ,@forms)
49 (set-buffer StartBuffer))))
50 38
51 (defmacro emerge-defvar-local (var value doc) 39 (defmacro emerge-defvar-local (var value doc)
52 "Defines SYMBOL as an advertised variable. 40 "Defines SYMBOL as an advertised variable.
53 Performs a defvar, then executes `make-variable-buffer-local' on 41 Performs a defvar, then executes `make-variable-buffer-local' on
54 the variable. Also sets the `preserved' property, so that 42 the variable. Also sets the `preserved' property, so that
563 (setq emerge-last-dir-A (file-name-directory file-A)) 551 (setq emerge-last-dir-A (file-name-directory file-A))
564 (setq emerge-last-dir-B (file-name-directory file-B)) 552 (setq emerge-last-dir-B (file-name-directory file-B))
565 (if output-file 553 (if output-file
566 (setq emerge-last-dir-output (file-name-directory output-file))) 554 (setq emerge-last-dir-output (file-name-directory output-file)))
567 ;; Make sure the entire files are seen, and they reflect what is on disk 555 ;; Make sure the entire files are seen, and they reflect what is on disk
568 (emerge-eval-in-buffer 556 (with-current-buffer
569 buffer-A 557 buffer-A
570 (widen) 558 (widen)
571 (let ((temp (file-local-copy file-A))) 559 (let ((temp (file-local-copy file-A)))
572 (if temp 560 (if temp
573 (setq file-A temp 561 (setq file-A temp
574 startup-hooks 562 startup-hooks
575 (cons `(lambda () (delete-file ,file-A)) 563 (cons `(lambda () (delete-file ,file-A))
576 startup-hooks)) 564 startup-hooks))
577 ;; Verify that the file matches the buffer 565 ;; Verify that the file matches the buffer
578 (emerge-verify-file-buffer)))) 566 (emerge-verify-file-buffer))))
579 (emerge-eval-in-buffer 567 (with-current-buffer
580 buffer-B 568 buffer-B
581 (widen) 569 (widen)
582 (let ((temp (file-local-copy file-B))) 570 (let ((temp (file-local-copy file-B)))
583 (if temp 571 (if temp
584 (setq file-B temp 572 (setq file-B temp
597 (setq file-B (expand-file-name file-B)) 585 (setq file-B (expand-file-name file-B))
598 (setq output-file (and output-file (expand-file-name output-file))) 586 (setq output-file (and output-file (expand-file-name output-file)))
599 (let* ((merge-buffer-name (emerge-unique-buffer-name "*merge" "*")) 587 (let* ((merge-buffer-name (emerge-unique-buffer-name "*merge" "*"))
600 ;; create the merge buffer from buffer A, so it inherits buffer A's 588 ;; create the merge buffer from buffer A, so it inherits buffer A's
601 ;; default directory, etc. 589 ;; default directory, etc.
602 (merge-buffer (emerge-eval-in-buffer 590 (merge-buffer (with-current-buffer
603 buffer-A 591 buffer-A
604 (get-buffer-create merge-buffer-name)))) 592 (get-buffer-create merge-buffer-name))))
605 (emerge-eval-in-buffer 593 (with-current-buffer
606 merge-buffer 594 merge-buffer
607 (emerge-copy-modes buffer-A) 595 (emerge-copy-modes buffer-A)
608 (setq buffer-read-only nil) 596 (setq buffer-read-only nil)
609 (auto-save-mode 1) 597 (auto-save-mode 1)
610 (setq emerge-mode t) 598 (setq emerge-mode t)
623 (setq emerge-current-difference -1) 611 (setq emerge-current-difference -1)
624 (setq emerge-quit-hook quit-hooks) 612 (setq emerge-quit-hook quit-hooks)
625 (emerge-remember-buffer-characteristics) 613 (emerge-remember-buffer-characteristics)
626 (emerge-handle-local-variables)) 614 (emerge-handle-local-variables))
627 (emerge-setup-windows buffer-A buffer-B merge-buffer t) 615 (emerge-setup-windows buffer-A buffer-B merge-buffer t)
628 (emerge-eval-in-buffer merge-buffer 616 (with-current-buffer merge-buffer
629 (run-hooks 'startup-hooks 'emerge-startup-hook) 617 (run-hooks 'startup-hooks 'emerge-startup-hook)
630 (setq buffer-read-only t)))) 618 (setq buffer-read-only t))))
631 619
632 ;; Generate the Emerge difference list between two files 620 ;; Generate the Emerge difference list between two files
633 (defun emerge-make-diff-list (file-A file-B) 621 (defun emerge-make-diff-list (file-A file-B)
634 (setq emerge-diff-buffer (get-buffer-create "*emerge-diff*")) 622 (setq emerge-diff-buffer (get-buffer-create "*emerge-diff*"))
635 (emerge-eval-in-buffer 623 (with-current-buffer
636 emerge-diff-buffer 624 emerge-diff-buffer
637 (erase-buffer) 625 (erase-buffer)
638 (shell-command 626 (shell-command
639 (format "%s %s %s %s" 627 (format "%s %s %s %s"
640 emerge-diff-program emerge-diff-options 628 emerge-diff-program emerge-diff-options
646 emerge-A-buffer emerge-B-buffer emerge-merge-buffer 634 emerge-A-buffer emerge-B-buffer emerge-merge-buffer
647 (emerge-extract-diffs emerge-diff-buffer))) 635 (emerge-extract-diffs emerge-diff-buffer)))
648 636
649 (defun emerge-extract-diffs (diff-buffer) 637 (defun emerge-extract-diffs (diff-buffer)
650 (let (list) 638 (let (list)
651 (emerge-eval-in-buffer 639 (with-current-buffer
652 diff-buffer 640 diff-buffer
653 (goto-char (point-min)) 641 (goto-char (point-min))
654 (while (re-search-forward emerge-match-diff-line nil t) 642 (while (re-search-forward emerge-match-diff-line nil t)
655 (let* ((a-begin (string-to-number (buffer-substring (match-beginning 1) 643 (let* ((a-begin (string-to-number (buffer-substring (match-beginning 1)
656 (match-end 1)))) 644 (match-end 1))))
690 (nreverse list))) 678 (nreverse list)))
691 679
692 ;; Set up buffer of diff/diff3 error messages. 680 ;; Set up buffer of diff/diff3 error messages.
693 (defun emerge-prepare-error-list (ok-regexp) 681 (defun emerge-prepare-error-list (ok-regexp)
694 (setq emerge-diff-error-buffer (get-buffer-create "*emerge-diff-errors*")) 682 (setq emerge-diff-error-buffer (get-buffer-create "*emerge-diff-errors*"))
695 (emerge-eval-in-buffer 683 (with-current-buffer
696 emerge-diff-error-buffer 684 emerge-diff-error-buffer
697 (erase-buffer) 685 (erase-buffer)
698 (save-excursion (insert-buffer-substring emerge-diff-buffer)) 686 (save-excursion (insert-buffer-substring emerge-diff-buffer))
699 (delete-matching-lines ok-regexp))) 687 (delete-matching-lines ok-regexp)))
700 688
717 (setq emerge-last-dir-B (file-name-directory file-B)) 705 (setq emerge-last-dir-B (file-name-directory file-B))
718 (setq emerge-last-dir-ancestor (file-name-directory file-ancestor)) 706 (setq emerge-last-dir-ancestor (file-name-directory file-ancestor))
719 (if output-file 707 (if output-file
720 (setq emerge-last-dir-output (file-name-directory output-file))) 708 (setq emerge-last-dir-output (file-name-directory output-file)))
721 ;; Make sure the entire files are seen, and they reflect what is on disk 709 ;; Make sure the entire files are seen, and they reflect what is on disk
722 (emerge-eval-in-buffer 710 (with-current-buffer
723 buffer-A 711 buffer-A
724 (widen) 712 (widen)
725 (let ((temp (file-local-copy file-A))) 713 (let ((temp (file-local-copy file-A)))
726 (if temp 714 (if temp
727 (setq file-A temp 715 (setq file-A temp
728 startup-hooks 716 startup-hooks
729 (cons `(lambda () (delete-file ,file-A)) 717 (cons `(lambda () (delete-file ,file-A))
730 startup-hooks)) 718 startup-hooks))
731 ;; Verify that the file matches the buffer 719 ;; Verify that the file matches the buffer
732 (emerge-verify-file-buffer)))) 720 (emerge-verify-file-buffer))))
733 (emerge-eval-in-buffer 721 (with-current-buffer
734 buffer-B 722 buffer-B
735 (widen) 723 (widen)
736 (let ((temp (file-local-copy file-B))) 724 (let ((temp (file-local-copy file-B)))
737 (if temp 725 (if temp
738 (setq file-B temp 726 (setq file-B temp
739 startup-hooks 727 startup-hooks
740 (cons `(lambda () (delete-file ,file-B)) 728 (cons `(lambda () (delete-file ,file-B))
741 startup-hooks)) 729 startup-hooks))
742 ;; Verify that the file matches the buffer 730 ;; Verify that the file matches the buffer
743 (emerge-verify-file-buffer)))) 731 (emerge-verify-file-buffer))))
744 (emerge-eval-in-buffer 732 (with-current-buffer
745 buffer-ancestor 733 buffer-ancestor
746 (widen) 734 (widen)
747 (let ((temp (file-local-copy file-ancestor))) 735 (let ((temp (file-local-copy file-ancestor)))
748 (if temp 736 (if temp
749 (setq file-ancestor temp 737 (setq file-ancestor temp
766 (setq file-ancestor (expand-file-name file-ancestor)) 754 (setq file-ancestor (expand-file-name file-ancestor))
767 (setq output-file (and output-file (expand-file-name output-file))) 755 (setq output-file (and output-file (expand-file-name output-file)))
768 (let* ((merge-buffer-name (emerge-unique-buffer-name "*merge" "*")) 756 (let* ((merge-buffer-name (emerge-unique-buffer-name "*merge" "*"))
769 ;; create the merge buffer from buffer A, so it inherits buffer A's 757 ;; create the merge buffer from buffer A, so it inherits buffer A's
770 ;; default directory, etc. 758 ;; default directory, etc.
771 (merge-buffer (emerge-eval-in-buffer 759 (merge-buffer (with-current-buffer
772 buffer-A 760 buffer-A
773 (get-buffer-create merge-buffer-name)))) 761 (get-buffer-create merge-buffer-name))))
774 (emerge-eval-in-buffer 762 (with-current-buffer
775 merge-buffer 763 merge-buffer
776 (emerge-copy-modes buffer-A) 764 (emerge-copy-modes buffer-A)
777 (setq buffer-read-only nil) 765 (setq buffer-read-only nil)
778 (auto-save-mode 1) 766 (auto-save-mode 1)
779 (setq emerge-mode t) 767 (setq emerge-mode t)
794 (setq emerge-quit-hook quit-hooks) 782 (setq emerge-quit-hook quit-hooks)
795 (emerge-remember-buffer-characteristics) 783 (emerge-remember-buffer-characteristics)
796 (emerge-select-prefer-Bs) 784 (emerge-select-prefer-Bs)
797 (emerge-handle-local-variables)) 785 (emerge-handle-local-variables))
798 (emerge-setup-windows buffer-A buffer-B merge-buffer t) 786 (emerge-setup-windows buffer-A buffer-B merge-buffer t)
799 (emerge-eval-in-buffer merge-buffer 787 (with-current-buffer merge-buffer
800 (run-hooks 'startup-hooks 'emerge-startup-hook) 788 (run-hooks 'startup-hooks 'emerge-startup-hook)
801 (setq buffer-read-only t)))) 789 (setq buffer-read-only t))))
802 790
803 ;; Generate the Emerge difference list between two files with an ancestor 791 ;; Generate the Emerge difference list between two files with an ancestor
804 (defun emerge-make-diff3-list (file-A file-B file-ancestor) 792 (defun emerge-make-diff3-list (file-A file-B file-ancestor)
805 (setq emerge-diff-buffer (get-buffer-create "*emerge-diff*")) 793 (setq emerge-diff-buffer (get-buffer-create "*emerge-diff*"))
806 (emerge-eval-in-buffer 794 (with-current-buffer
807 emerge-diff-buffer 795 emerge-diff-buffer
808 (erase-buffer) 796 (erase-buffer)
809 (shell-command 797 (shell-command
810 (format "%s %s %s %s %s" 798 (format "%s %s %s %s %s"
811 emerge-diff3-program emerge-diff-options 799 emerge-diff3-program emerge-diff-options
818 emerge-A-buffer emerge-B-buffer emerge-merge-buffer 806 emerge-A-buffer emerge-B-buffer emerge-merge-buffer
819 (emerge-extract-diffs3 emerge-diff-buffer))) 807 (emerge-extract-diffs3 emerge-diff-buffer)))
820 808
821 (defun emerge-extract-diffs3 (diff-buffer) 809 (defun emerge-extract-diffs3 (diff-buffer)
822 (let (list) 810 (let (list)
823 (emerge-eval-in-buffer 811 (with-current-buffer
824 diff-buffer 812 diff-buffer
825 (while (re-search-forward "^====\\(.?\\)$" nil t) 813 (while (re-search-forward "^====\\(.?\\)$" nil t)
826 ;; leave point after matched line 814 ;; leave point after matched line
827 (beginning-of-line 2) 815 (beginning-of-line 2)
828 (let ((agreement (buffer-substring (match-beginning 1) (match-end 1)))) 816 (let ((agreement (buffer-substring (match-beginning 1) (match-end 1))))
926 (defun emerge-buffers (buffer-A buffer-B &optional startup-hooks quit-hooks) 914 (defun emerge-buffers (buffer-A buffer-B &optional startup-hooks quit-hooks)
927 "Run Emerge on two buffers." 915 "Run Emerge on two buffers."
928 (interactive "bBuffer A to merge: \nbBuffer B to merge: ") 916 (interactive "bBuffer A to merge: \nbBuffer B to merge: ")
929 (let ((emerge-file-A (emerge-make-temp-file "A")) 917 (let ((emerge-file-A (emerge-make-temp-file "A"))
930 (emerge-file-B (emerge-make-temp-file "B"))) 918 (emerge-file-B (emerge-make-temp-file "B")))
931 (emerge-eval-in-buffer 919 (with-current-buffer
932 buffer-A 920 buffer-A
933 (write-region (point-min) (point-max) emerge-file-A nil 'no-message)) 921 (write-region (point-min) (point-max) emerge-file-A nil 'no-message))
934 (emerge-eval-in-buffer 922 (with-current-buffer
935 buffer-B 923 buffer-B
936 (write-region (point-min) (point-max) emerge-file-B nil 'no-message)) 924 (write-region (point-min) (point-max) emerge-file-B nil 'no-message))
937 (emerge-setup (get-buffer buffer-A) emerge-file-A 925 (emerge-setup (get-buffer buffer-A) emerge-file-A
938 (get-buffer buffer-B) emerge-file-B 926 (get-buffer buffer-B) emerge-file-B
939 (cons `(lambda () 927 (cons `(lambda ()
951 (interactive 939 (interactive
952 "bBuffer A to merge: \nbBuffer B to merge: \nbAncestor buffer: ") 940 "bBuffer A to merge: \nbBuffer B to merge: \nbAncestor buffer: ")
953 (let ((emerge-file-A (emerge-make-temp-file "A")) 941 (let ((emerge-file-A (emerge-make-temp-file "A"))
954 (emerge-file-B (emerge-make-temp-file "B")) 942 (emerge-file-B (emerge-make-temp-file "B"))
955 (emerge-file-ancestor (emerge-make-temp-file "anc"))) 943 (emerge-file-ancestor (emerge-make-temp-file "anc")))
956 (emerge-eval-in-buffer 944 (with-current-buffer
957 buffer-A 945 buffer-A
958 (write-region (point-min) (point-max) emerge-file-A nil 'no-message)) 946 (write-region (point-min) (point-max) emerge-file-A nil 'no-message))
959 (emerge-eval-in-buffer 947 (with-current-buffer
960 buffer-B 948 buffer-B
961 (write-region (point-min) (point-max) emerge-file-B nil 'no-message)) 949 (write-region (point-min) (point-max) emerge-file-B nil 'no-message))
962 (emerge-eval-in-buffer 950 (with-current-buffer
963 buffer-ancestor 951 buffer-ancestor
964 (write-region (point-min) (point-max) emerge-file-ancestor nil 952 (write-region (point-min) (point-max) emerge-file-ancestor nil
965 'no-message)) 953 'no-message))
966 (emerge-setup-with-ancestor (get-buffer buffer-A) emerge-file-A 954 (emerge-setup-with-ancestor (get-buffer buffer-A) emerge-file-A
967 (get-buffer buffer-B) emerge-file-B 955 (get-buffer buffer-B) emerge-file-B
1091 (let ((buffer-A (get-buffer-create (format "%s,%s" file revision-A))) 1079 (let ((buffer-A (get-buffer-create (format "%s,%s" file revision-A)))
1092 (buffer-B (get-buffer-create (format "%s,%s" file revision-B))) 1080 (buffer-B (get-buffer-create (format "%s,%s" file revision-B)))
1093 (emerge-file-A (emerge-make-temp-file "A")) 1081 (emerge-file-A (emerge-make-temp-file "A"))
1094 (emerge-file-B (emerge-make-temp-file "B"))) 1082 (emerge-file-B (emerge-make-temp-file "B")))
1095 ;; Get the revisions into buffers 1083 ;; Get the revisions into buffers
1096 (emerge-eval-in-buffer 1084 (with-current-buffer
1097 buffer-A 1085 buffer-A
1098 (erase-buffer) 1086 (erase-buffer)
1099 (shell-command 1087 (shell-command
1100 (format "%s -q -p%s %s" emerge-rcs-co-program revision-A file) 1088 (format "%s -q -p%s %s" emerge-rcs-co-program revision-A file)
1101 t) 1089 t)
1102 (write-region (point-min) (point-max) emerge-file-A nil 'no-message) 1090 (write-region (point-min) (point-max) emerge-file-A nil 'no-message)
1103 (set-buffer-modified-p nil)) 1091 (set-buffer-modified-p nil))
1104 (emerge-eval-in-buffer 1092 (with-current-buffer
1105 buffer-B 1093 buffer-B
1106 (erase-buffer) 1094 (erase-buffer)
1107 (shell-command 1095 (shell-command
1108 (format "%s -q -p%s %s" emerge-rcs-co-program revision-B file) 1096 (format "%s -q -p%s %s" emerge-rcs-co-program revision-B file)
1109 t) 1097 t)
1129 (buffer-ancestor (get-buffer-create (format "%s,%s" file ancestor))) 1117 (buffer-ancestor (get-buffer-create (format "%s,%s" file ancestor)))
1130 (emerge-file-A (emerge-make-temp-file "A")) 1118 (emerge-file-A (emerge-make-temp-file "A"))
1131 (emerge-file-B (emerge-make-temp-file "B")) 1119 (emerge-file-B (emerge-make-temp-file "B"))
1132 (emerge-ancestor (emerge-make-temp-file "ancestor"))) 1120 (emerge-ancestor (emerge-make-temp-file "ancestor")))
1133 ;; Get the revisions into buffers 1121 ;; Get the revisions into buffers
1134 (emerge-eval-in-buffer 1122 (with-current-buffer
1135 buffer-A 1123 buffer-A
1136 (erase-buffer) 1124 (erase-buffer)
1137 (shell-command 1125 (shell-command
1138 (format "%s -q -p%s %s" emerge-rcs-co-program 1126 (format "%s -q -p%s %s" emerge-rcs-co-program
1139 revision-A file) 1127 revision-A file)
1140 t) 1128 t)
1141 (write-region (point-min) (point-max) emerge-file-A nil 'no-message) 1129 (write-region (point-min) (point-max) emerge-file-A nil 'no-message)
1142 (set-buffer-modified-p nil)) 1130 (set-buffer-modified-p nil))
1143 (emerge-eval-in-buffer 1131 (with-current-buffer
1144 buffer-B 1132 buffer-B
1145 (erase-buffer) 1133 (erase-buffer)
1146 (shell-command 1134 (shell-command
1147 (format "%s -q -p%s %s" emerge-rcs-co-program revision-B file) 1135 (format "%s -q -p%s %s" emerge-rcs-co-program revision-B file)
1148 t) 1136 t)
1149 (write-region (point-min) (point-max) emerge-file-B nil 'no-message) 1137 (write-region (point-min) (point-max) emerge-file-B nil 'no-message)
1150 (set-buffer-modified-p nil)) 1138 (set-buffer-modified-p nil))
1151 (emerge-eval-in-buffer 1139 (with-current-buffer
1152 buffer-ancestor 1140 buffer-ancestor
1153 (erase-buffer) 1141 (erase-buffer)
1154 (shell-command 1142 (shell-command
1155 (format "%s -q -p%s %s" emerge-rcs-co-program ancestor file) 1143 (format "%s -q -p%s %s" emerge-rcs-co-program ancestor file)
1156 t) 1144 t)
1377 (goto-char (point-min))) 1365 (goto-char (point-min)))
1378 (other-window 1) 1366 (other-window 1)
1379 (if pos 1367 (if pos
1380 (goto-char (point-min))) 1368 (goto-char (point-min)))
1381 ;; If diff/diff3 reports errors, display them rather than the merge buffer. 1369 ;; If diff/diff3 reports errors, display them rather than the merge buffer.
1382 (if (/= 0 (emerge-eval-in-buffer emerge-diff-error-buffer (buffer-size))) 1370 (if (/= 0 (with-current-buffer emerge-diff-error-buffer (buffer-size)))
1383 (progn 1371 (progn
1384 (ding) 1372 (ding)
1385 (message "Errors found in diff/diff3 output. Merge buffer is %s." 1373 (message "Errors found in diff/diff3 output. Merge buffer is %s."
1386 (buffer-name emerge-merge-buffer)) 1374 (buffer-name emerge-merge-buffer))
1387 (switch-to-buffer emerge-diff-error-buffer)))) 1375 (switch-to-buffer emerge-diff-error-buffer))))
1432 ;; force auto-save, because we will turn off auto-saving in buffers for the 1420 ;; force auto-save, because we will turn off auto-saving in buffers for the
1433 ;; duration 1421 ;; duration
1434 (do-auto-save) 1422 (do-auto-save)
1435 ;; remember and alter buffer characteristics 1423 ;; remember and alter buffer characteristics
1436 (setq emerge-A-buffer-values 1424 (setq emerge-A-buffer-values
1437 (emerge-eval-in-buffer 1425 (with-current-buffer
1438 emerge-A-buffer 1426 emerge-A-buffer
1439 (prog1 1427 (prog1
1440 (emerge-save-variables emerge-saved-variables) 1428 (emerge-save-variables emerge-saved-variables)
1441 (emerge-restore-variables emerge-saved-variables 1429 (emerge-restore-variables emerge-saved-variables
1442 emerge-merging-values)))) 1430 emerge-merging-values))))
1443 (setq emerge-B-buffer-values 1431 (setq emerge-B-buffer-values
1444 (emerge-eval-in-buffer 1432 (with-current-buffer
1445 emerge-B-buffer 1433 emerge-B-buffer
1446 (prog1 1434 (prog1
1447 (emerge-save-variables emerge-saved-variables) 1435 (emerge-save-variables emerge-saved-variables)
1448 (emerge-restore-variables emerge-saved-variables 1436 (emerge-restore-variables emerge-saved-variables
1449 emerge-merging-values))))) 1437 emerge-merging-values)))))
1450 1438
1451 (defun emerge-restore-buffer-characteristics () 1439 (defun emerge-restore-buffer-characteristics ()
1452 "Restore characteristics saved by `emerge-remember-buffer-characteristics'." 1440 "Restore characteristics saved by `emerge-remember-buffer-characteristics'."
1453 (let ((A-values emerge-A-buffer-values) 1441 (let ((A-values emerge-A-buffer-values)
1454 (B-values emerge-B-buffer-values)) 1442 (B-values emerge-B-buffer-values))
1455 (emerge-eval-in-buffer emerge-A-buffer 1443 (with-current-buffer emerge-A-buffer
1456 (emerge-restore-variables emerge-saved-variables 1444 (emerge-restore-variables emerge-saved-variables
1457 A-values)) 1445 A-values))
1458 (emerge-eval-in-buffer emerge-B-buffer 1446 (with-current-buffer emerge-B-buffer
1459 (emerge-restore-variables emerge-saved-variables 1447 (emerge-restore-variables emerge-saved-variables
1460 B-values)))) 1448 B-values))))
1461 1449
1462 ;; Move to line DESIRED-LINE assuming we are at line CURRENT-LINE. 1450 ;; Move to line DESIRED-LINE assuming we are at line CURRENT-LINE.
1463 ;; Return DESIRED-LINE. 1451 ;; Return DESIRED-LINE.
1468 (defun emerge-convert-diffs-to-markers (A-buffer 1456 (defun emerge-convert-diffs-to-markers (A-buffer
1469 B-buffer 1457 B-buffer
1470 merge-buffer 1458 merge-buffer
1471 lineno-list) 1459 lineno-list)
1472 (let* (marker-list 1460 (let* (marker-list
1473 (A-point-min (emerge-eval-in-buffer A-buffer (point-min))) 1461 (A-point-min (with-current-buffer A-buffer (point-min)))
1474 (offset (1- A-point-min)) 1462 (offset (1- A-point-min))
1475 (B-point-min (emerge-eval-in-buffer B-buffer (point-min))) 1463 (B-point-min (with-current-buffer B-buffer (point-min)))
1476 ;; Record current line number in each buffer 1464 ;; Record current line number in each buffer
1477 ;; so we don't have to count from the beginning. 1465 ;; so we don't have to count from the beginning.
1478 (a-line 1) 1466 (a-line 1)
1479 (b-line 1)) 1467 (b-line 1))
1480 (emerge-eval-in-buffer A-buffer (goto-char (point-min))) 1468 (with-current-buffer A-buffer (goto-char (point-min)))
1481 (emerge-eval-in-buffer B-buffer (goto-char (point-min))) 1469 (with-current-buffer B-buffer (goto-char (point-min)))
1482 (while lineno-list 1470 (while lineno-list
1483 (let* ((list-element (car lineno-list)) 1471 (let* ((list-element (car lineno-list))
1484 a-begin-marker 1472 a-begin-marker
1485 a-end-marker 1473 a-end-marker
1486 b-begin-marker 1474 b-begin-marker
1491 (a-end (aref list-element 1)) 1479 (a-end (aref list-element 1))
1492 (b-begin (aref list-element 2)) 1480 (b-begin (aref list-element 2))
1493 (b-end (aref list-element 3)) 1481 (b-end (aref list-element 3))
1494 (state (aref list-element 4))) 1482 (state (aref list-element 4)))
1495 ;; place markers at the appropriate places in the buffers 1483 ;; place markers at the appropriate places in the buffers
1496 (emerge-eval-in-buffer 1484 (with-current-buffer
1497 A-buffer 1485 A-buffer
1498 (setq a-line (emerge-goto-line a-begin a-line)) 1486 (setq a-line (emerge-goto-line a-begin a-line))
1499 (setq a-begin-marker (point-marker)) 1487 (setq a-begin-marker (point-marker))
1500 (setq a-line (emerge-goto-line a-end a-line)) 1488 (setq a-line (emerge-goto-line a-end a-line))
1501 (setq a-end-marker (point-marker))) 1489 (setq a-end-marker (point-marker)))
1502 (emerge-eval-in-buffer 1490 (with-current-buffer
1503 B-buffer 1491 B-buffer
1504 (setq b-line (emerge-goto-line b-begin b-line)) 1492 (setq b-line (emerge-goto-line b-begin b-line))
1505 (setq b-begin-marker (point-marker)) 1493 (setq b-begin-marker (point-marker))
1506 (setq b-line (emerge-goto-line b-end b-line)) 1494 (setq b-line (emerge-goto-line b-end b-line))
1507 (setq b-end-marker (point-marker))) 1495 (setq b-end-marker (point-marker)))
1757 "Reset horizontal scrolling in Emerge. 1745 "Reset horizontal scrolling in Emerge.
1758 This resets the horizontal scrolling of all three merge buffers 1746 This resets the horizontal scrolling of all three merge buffers
1759 to the left margin, if they are in windows." 1747 to the left margin, if they are in windows."
1760 (interactive) 1748 (interactive)
1761 (emerge-operate-on-windows 1749 (emerge-operate-on-windows
1762 (function (lambda (x) (set-window-hscroll (selected-window) 0))) 1750 (lambda (x) (set-window-hscroll (selected-window) 0))
1763 nil)) 1751 nil))
1764 1752
1765 ;; Attempt to show the region nicely. 1753 ;; Attempt to show the region nicely.
1766 ;; If there are min-lines lines above and below the region, then don't do 1754 ;; If there are min-lines lines above and below the region, then don't do
1767 ;; anything. 1755 ;; anything.
1867 (setq buffer-read-only nil) 1855 (setq buffer-read-only nil)
1868 (emerge-unselect-and-select-difference -1) 1856 (emerge-unselect-and-select-difference -1)
1869 (emerge-restore-buffer-characteristics) 1857 (emerge-restore-buffer-characteristics)
1870 ;; null out the difference markers so they don't slow down future editing 1858 ;; null out the difference markers so they don't slow down future editing
1871 ;; operations 1859 ;; operations
1872 (mapc (function (lambda (d) 1860 (mapc (lambda (d)
1873 (set-marker (aref d 0) nil) 1861 (set-marker (aref d 0) nil)
1874 (set-marker (aref d 1) nil) 1862 (set-marker (aref d 1) nil)
1875 (set-marker (aref d 2) nil) 1863 (set-marker (aref d 2) nil)
1876 (set-marker (aref d 3) nil) 1864 (set-marker (aref d 3) nil)
1877 (set-marker (aref d 4) nil) 1865 (set-marker (aref d 4) nil)
1878 (set-marker (aref d 5) nil))) 1866 (set-marker (aref d 5) nil))
1879 emerge-difference-list) 1867 emerge-difference-list)
1880 ;; allow them to be garbage collected 1868 ;; allow them to be garbage collected
1881 (setq emerge-difference-list nil) 1869 (setq emerge-difference-list nil)
1882 ;; restore the local map 1870 ;; restore the local map
1883 (use-local-map emerge-old-keymap) 1871 (use-local-map emerge-old-keymap)
1898 is neither the A nor the B variant. 1886 is neither the A nor the B variant.
1899 A prefix argument forces the variant to be selected 1887 A prefix argument forces the variant to be selected
1900 even if the difference has been edited." 1888 even if the difference has been edited."
1901 (interactive "P") 1889 (interactive "P")
1902 (let ((operate 1890 (let ((operate
1903 (function (lambda () 1891 (lambda ()
1904 (emerge-select-A-edit merge-begin merge-end A-begin A-end) 1892 (emerge-select-A-edit merge-begin merge-end A-begin A-end)
1905 (if emerge-auto-advance 1893 (if emerge-auto-advance
1906 (emerge-next-difference))))) 1894 (emerge-next-difference))))
1907 (operate-no-change 1895 (operate-no-change
1908 (function (lambda () 1896 (lambda () (if emerge-auto-advance
1909 (if emerge-auto-advance 1897 (emerge-next-difference)))))
1910 (emerge-next-difference))))))
1911 (emerge-select-version force operate-no-change operate operate))) 1898 (emerge-select-version force operate-no-change operate operate)))
1912 1899
1913 ;; Actually select the A variant 1900 ;; Actually select the A variant
1914 (defun emerge-select-A-edit (merge-begin merge-end A-begin A-end) 1901 (defun emerge-select-A-edit (merge-begin merge-end A-begin A-end)
1915 (emerge-eval-in-buffer 1902 (with-current-buffer
1916 emerge-merge-buffer 1903 emerge-merge-buffer
1917 (delete-region merge-begin merge-end) 1904 (delete-region merge-begin merge-end)
1918 (goto-char merge-begin) 1905 (goto-char merge-begin)
1919 (insert-buffer-substring emerge-A-buffer A-begin A-end) 1906 (insert-buffer-substring emerge-A-buffer A-begin A-end)
1920 (goto-char merge-begin) 1907 (goto-char merge-begin)
1927 is neither the A nor the B variant. 1914 is neither the A nor the B variant.
1928 A prefix argument forces the variant to be selected 1915 A prefix argument forces the variant to be selected
1929 even if the difference has been edited." 1916 even if the difference has been edited."
1930 (interactive "P") 1917 (interactive "P")
1931 (let ((operate 1918 (let ((operate
1932 (function (lambda () 1919 (lambda ()
1933 (emerge-select-B-edit merge-begin merge-end B-begin B-end) 1920 (emerge-select-B-edit merge-begin merge-end B-begin B-end)
1934 (if emerge-auto-advance 1921 (if emerge-auto-advance
1935 (emerge-next-difference))))) 1922 (emerge-next-difference))))
1936 (operate-no-change 1923 (operate-no-change
1937 (function (lambda () 1924 (lambda () (if emerge-auto-advance
1938 (if emerge-auto-advance 1925 (emerge-next-difference)))))
1939 (emerge-next-difference))))))
1940 (emerge-select-version force operate operate-no-change operate))) 1926 (emerge-select-version force operate operate-no-change operate)))
1941 1927
1942 ;; Actually select the B variant 1928 ;; Actually select the B variant
1943 (defun emerge-select-B-edit (merge-begin merge-end B-begin B-end) 1929 (defun emerge-select-B-edit (merge-begin merge-end B-begin B-end)
1944 (emerge-eval-in-buffer 1930 (with-current-buffer
1945 emerge-merge-buffer 1931 emerge-merge-buffer
1946 (delete-region merge-begin merge-end) 1932 (delete-region merge-begin merge-end)
1947 (goto-char merge-begin) 1933 (goto-char merge-begin)
1948 (insert-buffer-substring emerge-B-buffer B-begin B-end) 1934 (insert-buffer-substring emerge-B-buffer B-begin B-end)
1949 (goto-char merge-begin) 1935 (goto-char merge-begin)
2132 "Show the names of the buffers or files being operated on by Emerge. 2118 "Show the names of the buffers or files being operated on by Emerge.
2133 Use C-u l to reset the windows afterward." 2119 Use C-u l to reset the windows afterward."
2134 (interactive) 2120 (interactive)
2135 (delete-other-windows) 2121 (delete-other-windows)
2136 (let ((temp-buffer-show-function 2122 (let ((temp-buffer-show-function
2137 (function (lambda (buf) 2123 (lambda (buf)
2138 (split-window-vertically) 2124 (split-window-vertically)
2139 (switch-to-buffer buf) 2125 (switch-to-buffer buf)
2140 (other-window 1))))) 2126 (other-window 1))))
2141 (with-output-to-temp-buffer "*Help*" 2127 (with-output-to-temp-buffer "*Help*"
2142 (emerge-eval-in-buffer emerge-A-buffer 2128 (with-current-buffer emerge-A-buffer
2143 (if buffer-file-name 2129 (if buffer-file-name
2144 (progn 2130 (progn
2145 (princ "File A is: ") 2131 (princ "File A is: ")
2146 (princ buffer-file-name)) 2132 (princ buffer-file-name))
2147 (progn 2133 (progn
2148 (princ "Buffer A is: ") 2134 (princ "Buffer A is: ")
2149 (princ (buffer-name)))) 2135 (princ (buffer-name))))
2150 (princ "\n")) 2136 (princ "\n"))
2151 (emerge-eval-in-buffer emerge-B-buffer 2137 (with-current-buffer emerge-B-buffer
2152 (if buffer-file-name 2138 (if buffer-file-name
2153 (progn 2139 (progn
2154 (princ "File B is: ") 2140 (princ "File B is: ")
2155 (princ buffer-file-name)) 2141 (princ buffer-file-name))
2156 (progn 2142 (progn
2157 (princ "Buffer B is: ") 2143 (princ "Buffer B is: ")
2158 (princ (buffer-name)))) 2144 (princ (buffer-name))))
2159 (princ "\n")) 2145 (princ "\n"))
2160 (if emerge-ancestor-buffer 2146 (if emerge-ancestor-buffer
2161 (emerge-eval-in-buffer emerge-ancestor-buffer 2147 (with-current-buffer emerge-ancestor-buffer
2162 (if buffer-file-name 2148 (if buffer-file-name
2163 (progn 2149 (progn
2164 (princ "Ancestor file is: ") 2150 (princ "Ancestor file is: ")
2165 (princ buffer-file-name)) 2151 (princ buffer-file-name))
2166 (progn 2152 (progn
2227 (interactive) 2213 (interactive)
2228 (let ((n emerge-current-difference)) 2214 (let ((n emerge-current-difference))
2229 ;; check that this is a valid difference 2215 ;; check that this is a valid difference
2230 (emerge-validate-difference) 2216 (emerge-validate-difference)
2231 ;; get the point values and old difference 2217 ;; get the point values and old difference
2232 (let ((A-point (emerge-eval-in-buffer emerge-A-buffer 2218 (let ((A-point (with-current-buffer emerge-A-buffer
2233 (point-marker))) 2219 (point-marker)))
2234 (B-point (emerge-eval-in-buffer emerge-B-buffer 2220 (B-point (with-current-buffer emerge-B-buffer
2235 (point-marker))) 2221 (point-marker)))
2236 (merge-point (point-marker)) 2222 (merge-point (point-marker))
2237 (old-diff (aref emerge-difference-list n))) 2223 (old-diff (aref emerge-difference-list n)))
2238 ;; check location of the points, give error if they aren't in the 2224 ;; check location of the points, give error if they aren't in the
2239 ;; differences 2225 ;; differences
2311 (while (> size 0) 2297 (while (> size 0)
2312 (setq success t) 2298 (setq success t)
2313 (while success 2299 (while success
2314 (setq size (min size (- bottom-a top-a) (- bottom-b top-b) 2300 (setq size (min size (- bottom-a top-a) (- bottom-b top-b)
2315 (- bottom-m top-m))) 2301 (- bottom-m top-m)))
2316 (setq sa (emerge-eval-in-buffer emerge-A-buffer 2302 (setq sa (with-current-buffer emerge-A-buffer
2317 (buffer-substring top-a 2303 (buffer-substring top-a
2318 (+ size top-a)))) 2304 (+ size top-a))))
2319 (setq sb (emerge-eval-in-buffer emerge-B-buffer 2305 (setq sb (with-current-buffer emerge-B-buffer
2320 (buffer-substring top-b 2306 (buffer-substring top-b
2321 (+ size top-b)))) 2307 (+ size top-b))))
2322 (setq sm (buffer-substring top-m (+ size top-m))) 2308 (setq sm (buffer-substring top-m (+ size top-m)))
2323 (setq success (and (> size 0) (equal sa sb) (equal sb sm))) 2309 (setq success (and (> size 0) (equal sa sb) (equal sb sm)))
2324 (if success 2310 (if success
2333 (while (> size 0) 2319 (while (> size 0)
2334 (setq success t) 2320 (setq success t)
2335 (while success 2321 (while success
2336 (setq size (min size (- bottom-a top-a) (- bottom-b top-b) 2322 (setq size (min size (- bottom-a top-a) (- bottom-b top-b)
2337 (- bottom-m top-m))) 2323 (- bottom-m top-m)))
2338 (setq sa (emerge-eval-in-buffer emerge-A-buffer 2324 (setq sa (with-current-buffer emerge-A-buffer
2339 (buffer-substring (- bottom-a size) 2325 (buffer-substring (- bottom-a size)
2340 bottom-a))) 2326 bottom-a)))
2341 (setq sb (emerge-eval-in-buffer emerge-B-buffer 2327 (setq sb (with-current-buffer emerge-B-buffer
2342 (buffer-substring (- bottom-b size) 2328 (buffer-substring (- bottom-b size)
2343 bottom-b))) 2329 bottom-b)))
2344 (setq sm (buffer-substring (- bottom-m size) bottom-m)) 2330 (setq sm (buffer-substring (- bottom-m size) bottom-m))
2345 (setq success (and (> size 0) (equal sa sb) (equal sb sm))) 2331 (setq success (and (> size 0) (equal sa sb) (equal sb sm)))
2346 (if success 2332 (if success
2349 bottom-m (- bottom-m size)))) 2335 bottom-m (- bottom-m size))))
2350 (setq size (/ size 2))) 2336 (setq size (/ size 2)))
2351 ;; {top,bottom}-{a,b,m} are now set at the new beginnings and ends 2337 ;; {top,bottom}-{a,b,m} are now set at the new beginnings and ends
2352 ;; of the difference regions. Move them to the beginning of lines, as 2338 ;; of the difference regions. Move them to the beginning of lines, as
2353 ;; appropriate. 2339 ;; appropriate.
2354 (emerge-eval-in-buffer emerge-A-buffer 2340 (with-current-buffer emerge-A-buffer
2355 (goto-char top-a) 2341 (goto-char top-a)
2356 (beginning-of-line) 2342 (beginning-of-line)
2357 (aset diff 0 (point-marker)) 2343 (aset diff 0 (point-marker))
2358 (goto-char bottom-a) 2344 (goto-char bottom-a)
2359 (beginning-of-line 2) 2345 (beginning-of-line 2)
2360 (aset diff 1 (point-marker))) 2346 (aset diff 1 (point-marker)))
2361 (emerge-eval-in-buffer emerge-B-buffer 2347 (with-current-buffer emerge-B-buffer
2362 (goto-char top-b) 2348 (goto-char top-b)
2363 (beginning-of-line) 2349 (beginning-of-line)
2364 (aset diff 2 (point-marker)) 2350 (aset diff 2 (point-marker))
2365 (goto-char bottom-b) 2351 (goto-char bottom-b)
2366 (beginning-of-line 2) 2352 (beginning-of-line 2)
2411 the nearest previous difference." 2397 the nearest previous difference."
2412 (interactive "P") 2398 (interactive "P")
2413 ;; search for the point in the A buffer, using the markers 2399 ;; search for the point in the A buffer, using the markers
2414 ;; for the beginning and end of the differences in the A buffer 2400 ;; for the beginning and end of the differences in the A buffer
2415 (emerge-find-difference1 arg 2401 (emerge-find-difference1 arg
2416 (emerge-eval-in-buffer emerge-A-buffer (point)) 2402 (with-current-buffer emerge-A-buffer (point))
2417 0 1)) 2403 0 1))
2418 2404
2419 (defun emerge-find-difference-B (arg) 2405 (defun emerge-find-difference-B (arg)
2420 "Find the difference containing point, in the B buffer. 2406 "Find the difference containing point, in the B buffer.
2421 This command must be executed in the merge buffer. 2407 This command must be executed in the merge buffer.
2424 the nearest previous difference." 2410 the nearest previous difference."
2425 (interactive "P") 2411 (interactive "P")
2426 ;; search for the point in the B buffer, using the markers 2412 ;; search for the point in the B buffer, using the markers
2427 ;; for the beginning and end of the differences in the B buffer 2413 ;; for the beginning and end of the differences in the B buffer
2428 (emerge-find-difference1 arg 2414 (emerge-find-difference1 arg
2429 (emerge-eval-in-buffer emerge-B-buffer (point)) 2415 (with-current-buffer emerge-B-buffer (point))
2430 2 3)) 2416 2 3))
2431 2417
2432 (defun emerge-find-difference1 (arg location begin end) 2418 (defun emerge-find-difference1 (arg location begin end)
2433 (let* ((index 2419 (let* ((index
2434 ;; find first difference containing or after the current position 2420 ;; find first difference containing or after the current position
2472 merge buffers." 2458 merge buffers."
2473 (interactive) 2459 (interactive)
2474 (let* ((valid-diff 2460 (let* ((valid-diff
2475 (and (>= emerge-current-difference 0) 2461 (and (>= emerge-current-difference 0)
2476 (< emerge-current-difference emerge-number-of-differences))) 2462 (< emerge-current-difference emerge-number-of-differences)))
2477 (diff (and valid-diff 2463 (emerge-line-diff (and valid-diff
2478 (aref emerge-difference-list emerge-current-difference))) 2464 (aref emerge-difference-list
2479 (merge-line (emerge-line-number-in-buf 4 5)) 2465 emerge-current-difference)))
2480 (A-line (emerge-eval-in-buffer emerge-A-buffer 2466 (merge-line (emerge-line-number-in-buf 4 5))
2481 (emerge-line-number-in-buf 0 1))) 2467 (A-line (with-current-buffer emerge-A-buffer
2482 (B-line (emerge-eval-in-buffer emerge-B-buffer 2468 (emerge-line-number-in-buf 0 1)))
2483 (emerge-line-number-in-buf 2 3)))) 2469 (B-line (with-current-buffer emerge-B-buffer
2470 (emerge-line-number-in-buf 2 3))))
2484 (message "At lines: merge = %d, A = %d, B = %d" 2471 (message "At lines: merge = %d, A = %d, B = %d"
2485 merge-line A-line B-line))) 2472 merge-line A-line B-line)))
2473
2474 (defvar emerge-line-diff)
2486 2475
2487 (defun emerge-line-number-in-buf (begin-marker end-marker) 2476 (defun emerge-line-number-in-buf (begin-marker end-marker)
2488 (let (temp) 2477 (let (temp)
2489 (setq temp (save-excursion 2478 (setq temp (save-excursion
2490 (beginning-of-line) 2479 (beginning-of-line)
2491 (1+ (count-lines 1 (point))))) 2480 (1+ (count-lines 1 (point)))))
2492 (if valid-diff 2481 (if valid-diff
2493 (progn 2482 (progn
2494 (if (> (point) (aref diff begin-marker)) 2483 (if (> (point) (aref emerge-line-diff begin-marker))
2495 (setq temp (- temp emerge-before-flag-lines))) 2484 (setq temp (- temp emerge-before-flag-lines)))
2496 (if (> (point) (aref diff end-marker)) 2485 (if (> (point) (aref emerge-line-diff end-marker))
2497 (setq temp (- temp emerge-after-flag-lines))))) 2486 (setq temp (- temp emerge-after-flag-lines)))))
2498 temp)) 2487 temp))
2499 2488
2500 (defun emerge-set-combine-template (string &optional localize) 2489 (defun emerge-set-combine-template (string &optional localize)
2501 "Set `emerge-combine-versions-template' to STRING. 2490 "Set `emerge-combine-versions-template' to STRING.
2546 (let ((template (get-register char))) 2535 (let ((template (get-register char)))
2547 (if (not (stringp template)) 2536 (if (not (stringp template))
2548 (error "Register does not contain text")) 2537 (error "Register does not contain text"))
2549 (emerge-combine-versions-internal template force))) 2538 (emerge-combine-versions-internal template force)))
2550 2539
2551 (defun emerge-combine-versions-internal (template force) 2540 (defun emerge-combine-versions-internal (emerge-combine-template force)
2552 (let ((operate 2541 (let ((operate
2553 (function (lambda () 2542 (lambda ()
2554 (emerge-combine-versions-edit merge-begin merge-end 2543 (emerge-combine-versions-edit merge-begin merge-end
2555 A-begin A-end B-begin B-end) 2544 A-begin A-end B-begin B-end)
2556 (if emerge-auto-advance 2545 (if emerge-auto-advance
2557 (emerge-next-difference)))))) 2546 (emerge-next-difference)))))
2558 (emerge-select-version force operate operate operate))) 2547 (emerge-select-version force operate operate operate)))
2548
2549 (defvar emerge-combine-template)
2559 2550
2560 (defun emerge-combine-versions-edit (merge-begin merge-end 2551 (defun emerge-combine-versions-edit (merge-begin merge-end
2561 A-begin A-end B-begin B-end) 2552 A-begin A-end B-begin B-end)
2562 (emerge-eval-in-buffer 2553 (with-current-buffer
2563 emerge-merge-buffer 2554 emerge-merge-buffer
2564 (delete-region merge-begin merge-end) 2555 (delete-region merge-begin merge-end)
2565 (goto-char merge-begin) 2556 (goto-char merge-begin)
2566 (let ((i 0)) 2557 (let ((i 0))
2567 (while (< i (length template)) 2558 (while (< i (length emerge-combine-template))
2568 (let ((c (aref template i))) 2559 (let ((c (aref emerge-combine-template i)))
2569 (if (= c ?%) 2560 (if (= c ?%)
2570 (progn 2561 (progn
2571 (setq i (1+ i)) 2562 (setq i (1+ i))
2572 (setq c 2563 (setq c
2573 (condition-case nil 2564 (condition-case nil
2574 (aref template i) 2565 (aref emerge-combine-template i)
2575 (error ?%))) 2566 (error ?%)))
2576 (cond ((= c ?a) 2567 (cond ((= c ?a)
2577 (insert-buffer-substring emerge-A-buffer A-begin A-end)) 2568 (insert-buffer-substring emerge-A-buffer A-begin A-end))
2578 ((= c ?b) 2569 ((= c ?b)
2579 (insert-buffer-substring emerge-B-buffer B-begin B-end)) 2570 (insert-buffer-substring emerge-B-buffer B-begin B-end))
2618 (run-hooks 'emerge-select-hook)) 2609 (run-hooks 'emerge-select-hook))
2619 2610
2620 (defun emerge-place-flags-in-buffer (buffer difference before-index 2611 (defun emerge-place-flags-in-buffer (buffer difference before-index
2621 after-index) 2612 after-index)
2622 (if buffer 2613 (if buffer
2623 (emerge-eval-in-buffer 2614 (with-current-buffer
2624 buffer 2615 buffer
2625 (emerge-place-flags-in-buffer1 difference before-index after-index)) 2616 (emerge-place-flags-in-buffer1 difference before-index after-index))
2626 (emerge-place-flags-in-buffer1 difference before-index after-index))) 2617 (emerge-place-flags-in-buffer1 difference before-index after-index)))
2627 2618
2628 (defun emerge-place-flags-in-buffer1 (difference before-index after-index) 2619 (defun emerge-place-flags-in-buffer1 (difference before-index after-index)
2687 (emerge-remove-flags-in-buffer emerge-merge-buffer 2678 (emerge-remove-flags-in-buffer emerge-merge-buffer
2688 (aref diff-vector 4) (aref diff-vector 5))) 2679 (aref diff-vector 4) (aref diff-vector 5)))
2689 (run-hooks 'emerge-unselect-hook)) 2680 (run-hooks 'emerge-unselect-hook))
2690 2681
2691 (defun emerge-remove-flags-in-buffer (buffer before after) 2682 (defun emerge-remove-flags-in-buffer (buffer before after)
2692 (emerge-eval-in-buffer 2683 (with-current-buffer
2693 buffer 2684 buffer
2694 (let ((buffer-read-only nil)) 2685 (let ((buffer-read-only nil))
2695 ;; remove the flags, if they're there 2686 ;; remove the flags, if they're there
2696 (goto-char (- before (1- emerge-before-flag-length))) 2687 (goto-char (- before (1- emerge-before-flag-length)))
2697 (if (looking-at emerge-before-flag-match) 2688 (if (looking-at emerge-before-flag-match)
2836 nil 2827 nil
2837 (catch 'exit 2828 (catch 'exit
2838 (while (< x-begin x-end) 2829 (while (< x-begin x-end)
2839 ;; bite off and compare no more than 1000 characters at a time 2830 ;; bite off and compare no more than 1000 characters at a time
2840 (let* ((compare-length (min (- x-end x-begin) 1000)) 2831 (let* ((compare-length (min (- x-end x-begin) 1000))
2841 (x-string (emerge-eval-in-buffer 2832 (x-string (with-current-buffer
2842 buffer-x 2833 buffer-x
2843 (buffer-substring x-begin 2834 (buffer-substring x-begin
2844 (+ x-begin compare-length)))) 2835 (+ x-begin compare-length))))
2845 (y-string (emerge-eval-in-buffer 2836 (y-string (with-current-buffer
2846 buffer-y 2837 buffer-y
2847 (buffer-substring y-begin 2838 (buffer-substring y-begin
2848 (+ y-begin compare-length))))) 2839 (+ y-begin compare-length)))))
2849 (if (not (string-equal x-string y-string)) 2840 (if (not (string-equal x-string y-string))
2850 (throw 'exit nil) 2841 (throw 'exit nil)
2877 ;; the first of which (when called with no arguments) gets the value, and 2868 ;; the first of which (when called with no arguments) gets the value, and
2878 ;; the second (when called with a value as an argument) sets the value. 2869 ;; the second (when called with a value as an argument) sets the value.
2879 ;; A "function" is anything that funcall can handle as an argument. 2870 ;; A "function" is anything that funcall can handle as an argument.
2880 2871
2881 (defun emerge-save-variables (vars) 2872 (defun emerge-save-variables (vars)
2882 (mapcar (function (lambda (v) (if (symbolp v) 2873 (mapcar (lambda (v) (if (symbolp v)
2883 (symbol-value v) 2874 (symbol-value v)
2884 (funcall (car v))))) 2875 (funcall (car v))))
2885 vars)) 2876 vars))
2886 2877
2887 (defun emerge-restore-variables (vars values) 2878 (defun emerge-restore-variables (vars values)
2888 (while vars 2879 (while vars
2889 (let ((var (car vars)) 2880 (let ((var (car vars))
2970 2961
2971 ;; Set up the mode in the current buffer to duplicate the mode in another 2962 ;; Set up the mode in the current buffer to duplicate the mode in another
2972 ;; buffer. 2963 ;; buffer.
2973 (defun emerge-copy-modes (buffer) 2964 (defun emerge-copy-modes (buffer)
2974 ;; Set the major mode 2965 ;; Set the major mode
2975 (funcall (emerge-eval-in-buffer buffer major-mode))) 2966 (funcall (with-current-buffer buffer major-mode)))
2976 2967
2977 ;; Define a key, even if a prefix of it is defined 2968 ;; Define a key, even if a prefix of it is defined
2978 (defun emerge-force-define-key (keymap key definition) 2969 (defun emerge-force-define-key (keymap key definition)
2979 "Like `define-key', but forcibly creates prefix characters as needed. 2970 "Like `define-key', but forcibly creates prefix characters as needed.
2980 If some prefix of KEY has a non-prefix definition, it is redefined." 2971 If some prefix of KEY has a non-prefix definition, it is redefined."
3161 (while (< i (length s)) 3152 (while (< i (length s))
3162 (aset bins (% i 5) (% (+ (* (aref bins (% i 5)) 35) 3153 (aset bins (% i 5) (% (+ (* (aref bins (% i 5)) 35)
3163 (aref s i)) 3154 (aref s i))
3164 65536)) 3155 65536))
3165 (setq i (1+ i))) 3156 (setq i (1+ i)))
3166 (mapconcat (function (lambda (b) 3157 (mapconcat (lambda (b)
3167 (setq b (+ (% b 93) ?!)) 3158 (setq b (+ (% b 93) ?!))
3168 (if (>= b ?/) 3159 (if (>= b ?/)
3169 (setq b (1+ b))) 3160 (setq b (1+ b)))
3170 (char-to-string b))) 3161 (char-to-string b))
3171 bins ""))) 3162 bins "")))
3172 3163
3173 ;; Quote any /s in a string by replacing them with \!. 3164 ;; Quote any /s in a string by replacing them with \!.
3174 ;; Also, replace any \s by \\, to make it one-to-one. 3165 ;; Also, replace any \s by \\, to make it one-to-one.
3175 (defun emerge-unslashify-name (s) 3166 (defun emerge-unslashify-name (s)
3203 (setq limit (1+ (match-end 0))))) 3194 (setq limit (1+ (match-end 0)))))
3204 s) 3195 s)
3205 3196
3206 (provide 'emerge) 3197 (provide 'emerge)
3207 3198
3208 ;; arch-tag: a575f092-6e44-400e-b8a2-4124e9377585
3209 ;;; emerge.el ends here 3199 ;;; emerge.el ends here