X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/96473b342d379f6a7c69b82d0c443d223cd7f817..cc6e521e0e3d0fd101e4defb4e468fed0f6377eb:/lisp/emerge.el diff --git a/lisp/emerge.el b/lisp/emerge.el index 2fb47ee8ab..447e45f14f 100644 --- a/lisp/emerge.el +++ b/lisp/emerge.el @@ -27,30 +27,34 @@ ;;;###autoload (defvar menu-bar-emerge-menu (make-sparse-keymap "Emerge")) -;;;###autoload -(fset 'menu-bar-emerge-menu (symbol-value 'menu-bar-emerge-menu)) - -;;;###autoload -(define-key menu-bar-emerge-menu [emerge-merge-directories] - '("Merge Directories..." . emerge-merge-directories)) -;;;###autoload -(define-key menu-bar-emerge-menu [emerge-revisions-with-ancestor] - '("Revisions with Ancestor..." . emerge-revisions-with-ancestor)) -;;;###autoload -(define-key menu-bar-emerge-menu [emerge-revisions] - '("Revisions..." . emerge-revisions)) -;;;###autoload -(define-key menu-bar-emerge-menu [emerge-files-with-ancestor] - '("Files with Ancestor..." . emerge-files-with-ancestor)) -;;;###autoload -(define-key menu-bar-emerge-menu [emerge-files] - '("Files..." . emerge-files)) -;;;###autoload -(define-key menu-bar-emerge-menu [emerge-buffers-with-ancestor] - '("Buffers with Ancestor..." . emerge-buffers-with-ancestor)) -;;;###autoload -(define-key menu-bar-emerge-menu [emerge-buffers] - '("Buffers..." . emerge-buffers)) +;;;###autoload (fset 'menu-bar-emerge-menu (symbol-value 'menu-bar-emerge-menu)) + +;;;###autoload (define-key menu-bar-emerge-menu [emerge-merge-directories] +;;;###autoload '("Merge Directories..." . emerge-merge-directories)) +;;;###autoload (define-key menu-bar-emerge-menu [emerge-revisions-with-ancestor] +;;;###autoload '("Revisions with Ancestor..." . emerge-revisions-with-ancestor)) +;;;###autoload (define-key menu-bar-emerge-menu [emerge-revisions] +;;;###autoload '("Revisions..." . emerge-revisions)) +;;;###autoload (define-key menu-bar-emerge-menu [emerge-files-with-ancestor] +;;;###autoload '("Files with Ancestor..." . emerge-files-with-ancestor)) +;;;###autoload (define-key menu-bar-emerge-menu [emerge-files] +;;;###autoload '("Files..." . emerge-files)) +;;;###autoload (define-key menu-bar-emerge-menu [emerge-buffers-with-ancestor] +;;;###autoload '("Buffers with Ancestor..." . emerge-buffers-with-ancestor)) +;;;###autoload (define-key menu-bar-emerge-menu [emerge-buffers] +;;;###autoload '("Buffers..." . emerge-buffers)) + +;; There aren't really global variables, just dynamic bindings +(defvar A-begin) +(defvar A-end) +(defvar B-begin) +(defvar B-end) +(defvar diff) +(defvar diff-vector) +(defvar merge-begin) +(defvar merge-end) +(defvar template) +(defvar valid-diff) ;;; Macros @@ -64,11 +68,11 @@ Differs from `save-excursion' in that it doesn't save the point and mark." ,@forms) (set-buffer StartBuffer)))) -(defmacro emerge-defvar-local (var value doc) - "Defines SYMBOL as an advertised variable. +(defmacro emerge-defvar-local (var value doc) + "Defines SYMBOL as an advertised variable. Performs a defvar, then executes `make-variable-buffer-local' on the variable. Also sets the `preserved' property, so that -`kill-all-local-variables' (called by major-mode setting commands) +`kill-all-local-variables' (called by major-mode setting commands) won't destroy Emerge control variables." `(progn (defvar ,var ,value ,doc) @@ -127,7 +131,7 @@ When called interactively, displays the version." ;; to be provided (emerge-diff-options). The order in which the file names ;; are given is fixed. ;; The file names are always expanded (see expand-file-name) before being -;; passed to diff, thus they need not be invoked under a shell that +;; passed to diff, thus they need not be invoked under a shell that ;; understands `~'. ;; The code which processes the diff/diff3 output depends on all the ;; finicky details of their output, including the somewhat strange @@ -578,7 +582,7 @@ This is *not* a user option, since Emerge uses it for its own processing.") (if output-file (setq emerge-last-dir-output (file-name-directory output-file))) ;; Make sure the entire files are seen, and they reflect what is on disk - (emerge-eval-in-buffer + (emerge-eval-in-buffer buffer-A (widen) (let ((temp (file-local-copy file-A))) @@ -665,20 +669,20 @@ This is *not* a user option, since Emerge uses it for its own processing.") diff-buffer (goto-char (point-min)) (while (re-search-forward emerge-match-diff-line nil t) - (let* ((a-begin (string-to-int (buffer-substring (match-beginning 1) - (match-end 1)))) + (let* ((a-begin (string-to-number (buffer-substring (match-beginning 1) + (match-end 1)))) (a-end (let ((b (match-beginning 3)) (e (match-end 3))) (if b - (string-to-int (buffer-substring b e)) + (string-to-number (buffer-substring b e)) a-begin))) (diff-type (buffer-substring (match-beginning 4) (match-end 4))) - (b-begin (string-to-int (buffer-substring (match-beginning 5) - (match-end 5)))) + (b-begin (string-to-number (buffer-substring (match-beginning 5) + (match-end 5)))) (b-end (let ((b (match-beginning 7)) (e (match-end 7))) (if b - (string-to-int (buffer-substring b e)) + (string-to-number (buffer-substring b e)) b-begin)))) ;; fix the beginning and end numbers, because diff is somewhat ;; strange about how it numbers lines @@ -842,7 +846,7 @@ This is *not* a user option, since Emerge uses it for its own processing.") ;; if the A and B files are the same, ignore the difference (if (not (string-equal agreement "2")) (setq list - (cons + (cons (let (group-1 group-3 pos) (setq pos (point)) (setq group-1 (emerge-get-diff3-group "1")) @@ -870,16 +874,16 @@ This is *not* a user option, since Emerge uses it for its own processing.") ;; it is a "c" group (if (match-beginning 2) ;; it has two numbers - (list (string-to-int + (list (string-to-number (buffer-substring (match-beginning 1) (match-end 1))) - (1+ (string-to-int + (1+ (string-to-number (buffer-substring (match-beginning 3) (match-end 3))))) ;; it has one number - (let ((x (string-to-int + (let ((x (string-to-number (buffer-substring (match-beginning 1) (match-end 1))))) (list x (1+ x)))) ;; it is an "a" group - (let ((x (1+ (string-to-int + (let ((x (1+ (string-to-number (buffer-substring (match-beginning 1) (match-end 1)))))) (list x x))))) @@ -1022,7 +1026,7 @@ This is *not* a user option, since Emerge uses it for its own processing.") (emerge-files-with-ancestor-internal file-a file-b file-anc nil (list `(lambda () (emerge-command-exit ,file-out)))))) - + (defun emerge-command-exit (file-out) (emerge-write-and-delete file-out) (kill-emacs (if emerge-prefix-argument 1 0))) @@ -1270,7 +1274,7 @@ Otherwise, the A or B file present is copied to the output file." (emerge-files (not (not file-out)) file-A file-B file-out nil ;; When done, return to this buffer. - (list + (list `(lambda () (switch-to-buffer ,(current-buffer)) (message "Merge done."))))) @@ -1294,7 +1298,7 @@ Otherwise, the A or B file present is copied to the output file." ;;;###autoload (defun emerge-merge-directories (a-dir b-dir ancestor-dir output-dir) - (interactive + (interactive (list (read-file-name "A directory: " nil nil 'confirm) (read-file-name "B directory: " nil nil 'confirm) @@ -1462,7 +1466,7 @@ These characteristics are restored by `emerge-restore-buffer-characteristics'." emerge-merging-values))))) (defun emerge-restore-buffer-characteristics () - "Restores characteristics saved by `emerge-remember-buffer-characteristics'." + "Restore characteristics saved by `emerge-remember-buffer-characteristics'." (let ((A-values emerge-A-buffer-values) (B-values emerge-B-buffer-values)) (emerge-eval-in-buffer emerge-A-buffer @@ -1539,7 +1543,7 @@ These characteristics are restored by `emerge-restore-buffer-characteristics'." ;; fast access (setq emerge-difference-list (apply 'vector (nreverse marker-list))))) -;; If we have an ancestor, select all B variants that we prefer +;; If we have an ancestor, select all B variants that we prefer (defun emerge-select-prefer-Bs () (let ((n 0)) (while (< n emerge-number-of-differences) @@ -1663,7 +1667,7 @@ the height of the merge window. `C-u -' alone as argument scrolls half the height of the merge window." (interactive "P") (emerge-operate-on-windows - 'scroll-up + 'scroll-up ;; calculate argument to scroll-up ;; if there is an explicit argument (if (and arg (not (equal arg '-))) @@ -1906,7 +1910,7 @@ buffer after this will cause serious problems." (run-hooks 'emerge-quit-hook))) (defun emerge-select-A (&optional force) - "Select the A variant of this difference. + "Select the A variant of this difference. Refuses to function if this difference has been edited, i.e., if it is neither the A nor the B variant. A prefix argument forces the variant to be selected @@ -2579,15 +2583,15 @@ been edited." (if (= c ?%) (progn (setq i (1+ i)) - (setq c + (setq c (condition-case nil (aref template i) (error ?%))) (cond ((= c ?a) (insert-buffer-substring emerge-A-buffer A-begin A-end)) - ((= c ?b) + ((= c ?b) (insert-buffer-substring emerge-B-buffer B-begin B-end)) - ((= c ?%) + ((= c ?%) (insert ?%)) (t (insert c)))) @@ -2848,7 +2852,7 @@ keymap. Leaves merge in fast mode." (while (< x-begin x-end) ;; bite off and compare no more than 1000 characters at a time (let* ((compare-length (min (- x-end x-begin) 1000)) - (x-string (emerge-eval-in-buffer + (x-string (emerge-eval-in-buffer buffer-x (buffer-substring x-begin (+ x-begin compare-length)))) @@ -2863,7 +2867,7 @@ keymap. Leaves merge in fast mode." t))) ;; Construct a unique buffer name. -;; The first one tried is prefixsuffix, then prefix<2>suffix, +;; The first one tried is prefixsuffix, then prefix<2>suffix, ;; prefix<3>suffix, etc. (defun emerge-unique-buffer-name (prefix suffix) (if (null (get-buffer (concat prefix suffix))) @@ -3106,16 +3110,19 @@ SPC, it is ignored; if it is anything else, it is processed as a command." (setq name "Buffer has no file name.")) (save-window-excursion (select-window (minibuffer-window)) - (erase-buffer) - (insert name) - (if (not (pos-visible-in-window-p)) - (let ((echo-keystrokes 0)) - (while (and (not (pos-visible-in-window-p)) - (> (1- (frame-height)) (window-height))) - (enlarge-window 1)) - (let ((c (read-event))) + (unwind-protect + (progn + (erase-buffer) + (insert name) + (if (not (pos-visible-in-window-p)) + (while (and (not (pos-visible-in-window-p)) + (> (1- (frame-height)) (window-height))) + (enlarge-window 1))) + (let* ((echo-keystrokes 0) + (c (read-event))) (if (not (eq c 32)) - (setq unread-command-events (list c))))))))) + (setq unread-command-events (list c))))) + (erase-buffer))))) ;; Improved auto-save file names. ;; This function fixes many problems with the standard auto-save file names: @@ -3214,4 +3221,5 @@ More precisely, a [...] regexp to match any one such character." (provide 'emerge) +;;; arch-tag: a575f092-6e44-400e-b8a2-4124e9377585 ;;; emerge.el ends here