diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2008-03-31 01:49:57 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2008-03-31 01:49:57 +0000 |
commit | 2fa42bb70b23267d01347d1c471dc8a71e2c7026 (patch) | |
tree | 37b971dc4704bb5c5c189f68ab27f920503979b4 /lisp/smerge-mode.el | |
parent | 34ee3257bd6220b1635a66c7010293ff25e3cd4a (diff) | |
download | emacs-2fa42bb70b23267d01347d1c471dc8a71e2c7026.tar.gz emacs-2fa42bb70b23267d01347d1c471dc8a71e2c7026.tar.bz2 emacs-2fa42bb70b23267d01347d1c471dc8a71e2c7026.zip |
(smerge-refine): Allow highlighting other subparts in 3-way conflicts.
Diffstat (limited to 'lisp/smerge-mode.el')
-rw-r--r-- | lisp/smerge-mode.el | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/lisp/smerge-mode.el b/lisp/smerge-mode.el index 8a3f15bac44..ab8196c80c5 100644 --- a/lisp/smerge-mode.el +++ b/lisp/smerge-mode.el @@ -864,18 +864,39 @@ replace chars to try and eliminate some spurious differences." (delete-file file1) (delete-file file2)))) -(defun smerge-refine () - "Highlight the parts of the conflict that are different." - (interactive) - ;; FIXME: make it work with 3-way conflicts. +(defun smerge-refine (&optional part) + "Highlight the words of the conflict that are different. +For 3-way conflicts, highlights only 2 of the 3 parts. +A numeric argument PART can be used to specify which 2 parts; +repeating the command will highlight other 2 parts." + (interactive + (if (integerp current-prefix-arg) (list current-prefix-arg) + (smerge-match-conflict) + (let* ((prop (get-text-property (match-beginning 0) 'smerge-refine-part)) + (part (if (and (consp prop) + (eq (buffer-chars-modified-tick) (car prop))) + (cdr prop)))) + ;; If already highlighted, cycle. + (list (if (integerp part) (1+ (mod part 3))))))) + + (if (and (integerp part) (or (< part 1) (> part 3))) + (error "No conflict part nb %s" part)) (smerge-match-conflict) (remove-overlays (match-beginning 0) (match-end 0) 'smerge 'refine) - (smerge-ensure-match 1) - (smerge-ensure-match 3) - ;; Match 1 and 3 may be one and the same in case of trivial diff3 -A conflict. - (let ((n1 (if (eq (match-end 1) (match-end 3)) 2 1))) + ;; Ignore `part' if not applicable, and default it if not provided. + (setq part (cond ((null (match-end 2)) 2) + ((eq (match-end 1) (match-end 3)) 1) + ((integerp part) part) + (t 2))) + (let ((n1 (if (eq part 1) 2 1)) + (n2 (if (eq part 3) 2 3))) + (smerge-ensure-match n1) + (smerge-ensure-match n2) + (put-text-property (match-beginning 0) (1+ (match-beginning 0)) + 'smerge-refine-part + (cons (buffer-chars-modified-tick) part)) (smerge-refine-subst (match-beginning n1) (match-end n1) - (match-beginning 3) (match-end 3) + (match-beginning n2) (match-end n2) '((smerge . refine) (face . smerge-refined-change))))) |