aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/smerge-mode.el71
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."