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