comparison lisp/smerge-mode.el @ 47209:f06f993cfd92

(smerge-diff-buffer-name): Default to *vc-diff*. (smerge-combine-with-next): New function. (smerge-diff): Don't output `wrote /tmp/foo' messages. Insert message if no diffs were found.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 03 Sep 2002 01:20:20 +0000
parents f00337f04e78
children b2c9ea334a34
comparison
equal deleted inserted replaced
47208:5a35f521b33d 47209:f06f993cfd92
2 2
3 ;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. 3 ;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
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
11 ;; GNU Emacs is free software; you can redistribute it and/or modify 11 ;; GNU Emacs is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by 12 ;; it under the terms of the GNU General Public License as published by
52 (defgroup smerge () 52 (defgroup smerge ()
53 "Minor mode to resolve diff3 conflicts." 53 "Minor mode to resolve diff3 conflicts."
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
61 (const "*vc-diff*") 61 (const "*vc-diff*")
62 (const "*cvs-diff*") 62 (const "*cvs-diff*")
181 - `diff3-A'") 181 - `diff3-A'")
182 182
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
192 ;;;; 189 ;;;;
193 190
215 (replace-match (concat (or (match-string 1) "") 212 (replace-match (concat (or (match-string 1) "")
216 (or (match-string 2) "") 213 (or (match-string 2) "")
217 (or (match-string 3) "")) 214 (or (match-string 3) ""))
218 t t) 215 t t)
219 (smerge-auto-leave)) 216 (smerge-auto-leave))
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)))))
220 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)
224 (smerge-match-conflict) 254 (smerge-match-conflict)
358 (file1 (make-temp-file "smerge1")) 388 (file1 (make-temp-file "smerge1"))
359 (file2 (make-temp-file "smerge2")) 389 (file2 (make-temp-file "smerge2"))
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."
393 (interactive) 422 (interactive)
394 (let* ((buf (current-buffer)) 423 (let* ((buf (current-buffer))