diff options
Diffstat (limited to 'lisp/vc/smerge-mode.el')
-rw-r--r-- | lisp/vc/smerge-mode.el | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/lisp/vc/smerge-mode.el b/lisp/vc/smerge-mode.el index f61e97216a9..9f9224c226c 100644 --- a/lisp/vc/smerge-mode.el +++ b/lisp/vc/smerge-mode.el @@ -1,6 +1,6 @@ ;;; smerge-mode.el --- Minor mode to resolve diff3 conflicts -*- lexical-binding: t -*- -;; Copyright (C) 1999-2013 Free Software Foundation, Inc. +;; Copyright (C) 1999-2015 Free Software Foundation, Inc. ;; Author: Stefan Monnier <monnier@iro.umontreal.ca> ;; Keywords: vc, tools, revision control, merge, diff3, cvs, conflict @@ -57,7 +57,6 @@ (defcustom smerge-diff-buffer-name "*vc-diff*" "Buffer name to use for displaying diffs." - :group 'smerge :type '(choice (const "*vc-diff*") (const "*cvs-diff*") @@ -69,12 +68,10 @@ (if (listp diff-switches) diff-switches (list diff-switches))) "A list of strings specifying switches to be passed to diff. Used in `smerge-diff-base-mine' and related functions." - :group 'smerge :type '(repeat string)) (defcustom smerge-auto-leave t "Non-nil means to leave `smerge-mode' when the last conflict is resolved." - :group 'smerge :type 'boolean) (defface smerge-mine @@ -84,8 +81,7 @@ Used in `smerge-diff-base-mine' and related functions." :background "#553333") (((class color)) :foreground "red")) - "Face for your code." - :group 'smerge) + "Face for your code.") (define-obsolete-face-alias 'smerge-mine-face 'smerge-mine "22.1") (defvar smerge-mine-face 'smerge-mine) @@ -96,8 +92,7 @@ Used in `smerge-diff-base-mine' and related functions." :background "#335533") (((class color)) :foreground "green")) - "Face for the other code." - :group 'smerge) + "Face for the other code.") (define-obsolete-face-alias 'smerge-other-face 'smerge-other "22.1") (defvar smerge-other-face 'smerge-other) @@ -108,8 +103,7 @@ Used in `smerge-diff-base-mine' and related functions." :background "#888833") (((class color)) :foreground "yellow")) - "Face for the base code." - :group 'smerge) + "Face for the base code.") (define-obsolete-face-alias 'smerge-base-face 'smerge-base "22.1") (defvar smerge-base-face 'smerge-base) @@ -118,15 +112,14 @@ Used in `smerge-diff-base-mine' and related functions." (:background "grey85")) (((background dark)) (:background "grey30"))) - "Face for the conflict markers." - :group 'smerge) + "Face for the conflict markers.") (define-obsolete-face-alias 'smerge-markers-face 'smerge-markers "22.1") (defvar smerge-markers-face 'smerge-markers) -(defface smerge-refined-change +(defface smerge-refined-changed '((t nil)) - "Face used for char-based changes shown by `smerge-refine'." - :group 'smerge) + "Face used for char-based changes shown by `smerge-refine'.") +(define-obsolete-face-alias 'smerge-refined-change 'smerge-refined-changed "24.5") (defface smerge-refined-removed '((default @@ -137,7 +130,6 @@ Used in `smerge-diff-base-mine' and related functions." :background "#aa2222") (t :inverse-video t)) "Face used for removed characters shown by `smerge-refine'." - :group 'smerge :version "24.3") (defface smerge-refined-added @@ -149,7 +141,6 @@ Used in `smerge-diff-base-mine' and related functions." :background "#22aa22") (t :inverse-video t)) "Face used for added characters shown by `smerge-refine'." - :group 'smerge :version "24.3") (easy-mmode-defmap smerge-basic-map @@ -172,7 +163,6 @@ Used in `smerge-diff-base-mine' and related functions." (defcustom smerge-command-prefix "\C-c^" "Prefix for `smerge-mode' commands." - :group 'smerge :type '(choice (const :tag "ESC" "\e") (const :tag "C-c ^" "\C-c^" ) (const :tag "none" "") @@ -254,8 +244,8 @@ Used in `smerge-diff-base-mine' and related functions." "Font lock patterns for `smerge-mode'.") (defconst smerge-begin-re "^<<<<<<< \\(.*\\)\n") -(defconst smerge-end-re "^>>>>>>> .*\n") -(defconst smerge-base-re "^||||||| .*\n") +(defconst smerge-end-re "^>>>>>>> \\(.*\\)\n") +(defconst smerge-base-re "^||||||| \\(.*\\)\n") (defconst smerge-other-re "^=======\n") (defvar smerge-conflict-style nil @@ -1142,6 +1132,19 @@ repeating the command will highlight other two parts." (unless smerge-use-changed-face '((smerge . refine) (face . smerge-refined-added)))))) +(defun smerge-swap () + "Swap the \"Mine\" and the \"Other\" chunks. +Can be used before things like `smerge-keep-all' or `smerge-resolve' where the +ordering can have some subtle influence on the result, such as preferring the +spacing of the \"Other\" chunk." + (interactive) + (smerge-match-conflict) + (goto-char (match-beginning 3)) + (let ((txt3 (delete-and-extract-region (point) (match-end 3)))) + (insert (delete-and-extract-region (match-beginning 1) (match-end 1))) + (goto-char (match-beginning 1)) + (insert txt3))) + (defun smerge-diff (n1 n2) (smerge-match-conflict) (smerge-ensure-match n1) @@ -1193,6 +1196,14 @@ repeating the command will highlight other two parts." (defvar ediff-quit-hook) (declare-function ediff-cleanup-mess "ediff-util" nil) +(defun smerge--get-marker (regexp default) + (save-excursion + (goto-char (point-min)) + (if (and (search-forward-regexp regexp nil t) + (> (match-end 1) (match-beginning 1))) + (concat default "=" (match-string-no-properties 1)) + default))) + ;;;###autoload (defun smerge-ediff (&optional name-mine name-other name-base) "Invoke ediff to resolve the conflicts. @@ -1203,11 +1214,17 @@ buffer names." (mode major-mode) ;;(ediff-default-variant 'default-B) (config (current-window-configuration)) - (filename (file-name-nondirectory buffer-file-name)) + (filename (file-name-nondirectory (or buffer-file-name "-"))) (mine (generate-new-buffer - (or name-mine (concat "*" filename " MINE*")))) + (or name-mine + (concat "*" filename " " + (smerge--get-marker smerge-begin-re "MINE") + "*")))) (other (generate-new-buffer - (or name-other (concat "*" filename " OTHER*")))) + (or name-other + (concat "*" filename " " + (smerge--get-marker smerge-end-re "OTHER") + "*")))) base) (with-current-buffer mine (buffer-disable-undo) @@ -1232,7 +1249,10 @@ buffer names." (when base (setq base (generate-new-buffer - (or name-base (concat "*" filename " BASE*")))) + (or name-base + (concat "*" filename " " + (smerge--get-marker smerge-base-re "BASE") + "*")))) (with-current-buffer base (buffer-disable-undo) (insert-buffer-substring buf) |