diff options
| -rw-r--r-- | lisp/smerge-mode.el | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/lisp/smerge-mode.el b/lisp/smerge-mode.el index 83c2d6cb1ca..80b0d9945a9 100644 --- a/lisp/smerge-mode.el +++ b/lisp/smerge-mode.el | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | ;; Author: Stefan Monnier <monnier@cs.yale.edu> | 5 | ;; Author: Stefan Monnier <monnier@cs.yale.edu> |
| 6 | ;; Keywords: merge diff3 cvs conflict | 6 | ;; Keywords: merge diff3 cvs conflict |
| 7 | ;; Revision: $Id: smerge-mode.el,v 1.15 2001/11/15 01:25:35 monnier Exp $ | 7 | ;; Revision: $Id: smerge-mode.el,v 1.16 2002/08/15 00:24:56 monnier Exp $ |
| 8 | 8 | ||
| 9 | ;; This file is part of GNU Emacs. | 9 | ;; This file is part of GNU Emacs. |
| 10 | 10 | ||
| @@ -54,7 +54,7 @@ | |||
| 54 | :group 'tools | 54 | :group 'tools |
| 55 | :prefix "smerge-") | 55 | :prefix "smerge-") |
| 56 | 56 | ||
| 57 | (defcustom smerge-diff-buffer-name "*smerge-diff*" | 57 | (defcustom smerge-diff-buffer-name "*vc-diff*" |
| 58 | "Buffer name to use for displaying diffs." | 58 | "Buffer name to use for displaying diffs." |
| 59 | :group 'smerge | 59 | :group 'smerge |
| 60 | :type '(choice | 60 | :type '(choice |
| @@ -183,9 +183,6 @@ Can be nil if the style is undecided, or else: | |||
| 183 | ;; Compiler pacifiers | 183 | ;; Compiler pacifiers |
| 184 | (defvar font-lock-mode) | 184 | (defvar font-lock-mode) |
| 185 | (defvar font-lock-keywords) | 185 | (defvar font-lock-keywords) |
| 186 | (eval-when-compile | ||
| 187 | (unless (fboundp 'font-lock-fontify-region) | ||
| 188 | (autoload 'font-lock-fontify-region "font-lock"))) | ||
| 189 | 186 | ||
| 190 | ;;;; | 187 | ;;;; |
| 191 | ;;;; Actual code | 188 | ;;;; Actual code |
| @@ -218,6 +215,39 @@ Convenient for the kind of conflicts that can arise in ChangeLog files." | |||
| 218 | t t) | 215 | t t) |
| 219 | (smerge-auto-leave)) | 216 | (smerge-auto-leave)) |
| 220 | 217 | ||
| 218 | (defun smerge-combine-with-next () | ||
| 219 | "Combine the current conflict with the next one." | ||
| 220 | (interactive) | ||
| 221 | (smerge-match-conflict) | ||
| 222 | (let ((ends nil)) | ||
| 223 | (dolist (i '(3 2 1 0)) | ||
| 224 | (push (if (match-end i) (copy-marker (match-end i) t)) ends)) | ||
| 225 | (setq ends (apply 'vector ends)) | ||
| 226 | (goto-char (aref ends 0)) | ||
| 227 | (if (not (re-search-forward smerge-begin-re nil t)) | ||
| 228 | (error "No next conflict") | ||
| 229 | (smerge-match-conflict) | ||
| 230 | (let ((match-data (mapcar (lambda (m) (if m (copy-marker m))) | ||
| 231 | (match-data)))) | ||
| 232 | ;; First copy the in-between text in each alternative. | ||
| 233 | (dolist (i '(1 2 3)) | ||
| 234 | (when (aref ends i) | ||
| 235 | (goto-char (aref ends i)) | ||
| 236 | (insert-buffer-substring (current-buffer) | ||
| 237 | (aref ends 0) (car match-data)))) | ||
| 238 | (delete-region (aref ends 0) (car match-data)) | ||
| 239 | ;; Then move the second conflict's alternatives into the first. | ||
| 240 | (dolist (i '(1 2 3)) | ||
| 241 | (set-match-data match-data) | ||
| 242 | (when (and (aref ends i) (match-end i)) | ||
| 243 | (goto-char (aref ends i)) | ||
| 244 | (insert-buffer-substring (current-buffer) | ||
| 245 | (match-beginning i) (match-end i)))) | ||
| 246 | (delete-region (car match-data) (cadr match-data)) | ||
| 247 | ;; Free the markers. | ||
| 248 | (dolist (m match-data) (if m (move-marker m nil))) | ||
| 249 | (mapc (lambda (m) (if m (move-marker m nil))) ends))))) | ||
| 250 | |||
| 221 | (defun smerge-keep-base () | 251 | (defun smerge-keep-base () |
| 222 | "Revert to the base version." | 252 | "Revert to the base version." |
| 223 | (interactive) | 253 | (interactive) |
| @@ -360,33 +390,32 @@ The point is moved to the end of the conflict." | |||
| 360 | (dir default-directory) | 390 | (dir default-directory) |
| 361 | (file (file-relative-name buffer-file-name)) | 391 | (file (file-relative-name buffer-file-name)) |
| 362 | (coding-system-for-read buffer-file-coding-system)) | 392 | (coding-system-for-read buffer-file-coding-system)) |
| 363 | (write-region beg1 end1 file1) | 393 | (write-region beg1 end1 file1 nil 'nomessage) |
| 364 | (write-region beg2 end2 file2) | 394 | (write-region beg2 end2 file2 nil 'nomessage) |
| 365 | (unwind-protect | 395 | (unwind-protect |
| 366 | (with-current-buffer (get-buffer-create smerge-diff-buffer-name) | 396 | (with-current-buffer (get-buffer-create smerge-diff-buffer-name) |
| 367 | (setq default-directory dir) | 397 | (setq default-directory dir) |
| 368 | (let ((inhibit-read-only t)) | 398 | (let ((inhibit-read-only t)) |
| 369 | (erase-buffer) | 399 | (erase-buffer) |
| 370 | (apply 'call-process diff-command nil t nil | 400 | (let ((status |
| 371 | (append smerge-diff-switches | 401 | (apply 'call-process diff-command nil t nil |
| 372 | (list "-L" (concat name1 "/" file) | 402 | (append smerge-diff-switches |
| 373 | "-L" (concat name2 "/" file) | 403 | (list "-L" (concat name1 "/" file) |
| 374 | file1 file2)))) | 404 | "-L" (concat name2 "/" file) |
| 405 | file1 file2))))) | ||
| 406 | (if (eq status 0) (insert "No differences found.\n")))) | ||
| 375 | (goto-char (point-min)) | 407 | (goto-char (point-min)) |
| 376 | (diff-mode) | 408 | (diff-mode) |
| 377 | (display-buffer (current-buffer) t)) | 409 | (display-buffer (current-buffer) t)) |
| 378 | (delete-file file1) | 410 | (delete-file file1) |
| 379 | (delete-file file2)))) | 411 | (delete-file file2)))) |
| 380 | 412 | ||
| 381 | (eval-when-compile | 413 | ;; compiler pacifiers |
| 382 | ;; compiler pacifiers | 414 | (defvar smerge-ediff-windows) |
| 383 | (defvar smerge-ediff-windows) | 415 | (defvar smerge-ediff-buf) |
| 384 | (defvar smerge-ediff-buf) | 416 | (defvar ediff-buffer-A) |
| 385 | (defvar ediff-buffer-A) | 417 | (defvar ediff-buffer-B) |
| 386 | (defvar ediff-buffer-B) | 418 | (defvar ediff-buffer-C) |
| 387 | (defvar ediff-buffer-C) | ||
| 388 | (unless (fboundp 'ediff-cleanup-mess) | ||
| 389 | (autoload 'ediff-cleanup-mess "ediff-util"))) | ||
| 390 | 419 | ||
| 391 | (defun smerge-ediff () | 420 | (defun smerge-ediff () |
| 392 | "Invoke ediff to resolve the conflicts." | 421 | "Invoke ediff to resolve the conflicts." |