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