Package: emacs;
Reported by: Dani Moncayo <dmoncayo <at> gmail.com>
Date: Thu, 1 Dec 2011 15:57:01 UTC
Severity: wishlist
Found in version 24.0.92
Done: Juri Linkov <juri <at> jurta.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Juri Linkov <juri <at> jurta.org> To: 10181 <at> debbugs.gnu.org Subject: bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces Date: Thu, 17 May 2012 03:33:23 +0300
> Please, split the `diff-refine-change' face in several faces: one for > each of the possible "surrounding" face: > * for `diff-changed', define `diff-changed-refined'. > * for `diff-removed', define `diff-removed-refined'. > * for `diff-added', define `diff-added-refined'. > > Why? --> Because users (like me) may want to define such "refined" > faces based on the "not-refined" ones. Currently this is not > possible, so I cannot obtain a satisfactory aspect of the refined hunks. This could be implemented exactly the same way as currently other diff faces are implemented where `diff-removed' and `diff-added' both inherit from `diff-changed' by default. Anyone wishing to use different faces to highlight removed and added lines can customize `diff-removed' and `diff-added' to not inherit from `diff-changed'. `diff-indicator-changed', `diff-indicator-removed' and `diff-indicator-added' are defined with inheritance as well. So the following patch does the same by defining new faces `diff-refine-removed' and `diff-refine-added' inheriting from `diff-refine-change'. And `smerge-refined-removed' with `smerge-refined-added' inheriting from `smerge-refined-change' by default: === modified file 'lisp/vc/diff-mode.el' --- lisp/vc/diff-mode.el 2012-05-01 02:48:41 +0000 +++ lisp/vc/diff-mode.el 2012-05-17 00:27:59 +0000 @@ -1866,6 +1873,18 @@ (defface diff-refine-change "Face used for char-based changes shown by `diff-refine-hunk'." :group 'diff-mode) +(defface diff-refine-removed + '((t :inherit diff-refine-change)) + "Face used for removed characters shown by `diff-refine-hunk'." + :group 'diff-mode + :version "24.2") + +(defface diff-refine-added + '((t :inherit diff-refine-change)) + "Face used for added characters shown by `diff-refine-hunk'." + :group 'diff-mode + :version "24.2") + (defun diff-refine-preproc () (while (re-search-forward "^[+>]" nil t) ;; Remove spurious changes due to the fact that one side of the hunk is @@ -1879,7 +1898,7 @@ (defun diff-refine-preproc () ) (declare-function smerge-refine-subst "smerge-mode" - (beg1 end1 beg2 end2 props &optional preproc)) + (beg1 end1 beg2 end2 props &optional preproc props2)) (defun diff-refine-hunk () "Highlight changes of hunk at point at a finer granularity." @@ -1890,7 +1909,8 @@ (defun diff-refine-hunk () (let* ((start (point)) (style (diff-hunk-style)) ;Skips the hunk header as well. (beg (point)) - (props '((diff-mode . fine) (face diff-refine-change))) + (props '((diff-mode . fine) (face diff-refine-removed))) + (props2 '((diff-mode . fine) (face diff-refine-added))) ;; Be careful to go back to `start' so diff-end-of-hunk gets ;; to read the hunk header's line info. (end (progn (goto-char start) (diff-end-of-hunk) (point)))) @@ -1904,7 +1924,7 @@ (defun diff-refine-hunk () end t) (smerge-refine-subst (match-beginning 0) (match-end 1) (match-end 1) (match-end 0) - props 'diff-refine-preproc))) + props 'diff-refine-preproc props2))) (context (let* ((middle (save-excursion (re-search-forward "^---"))) (other middle)) @@ -1916,14 +1936,14 @@ (defun diff-refine-hunk () (setq other (match-end 0)) (match-beginning 0)) other - props 'diff-refine-preproc)))) + props 'diff-refine-preproc props2)))) (t ;; Normal diffs. (let ((beg1 (1+ (point)))) (when (re-search-forward "^---.*\n" end t) ;; It's a combined add&remove, so there's something to do. (smerge-refine-subst beg1 (match-beginning 0) (match-end 0) end - props 'diff-refine-preproc)))))))) + props 'diff-refine-preproc props2)))))))) (defun diff-undo (&optional arg) "Perform `undo', ignoring the buffer's read-only status." === modified file 'lisp/vc/smerge-mode.el' --- lisp/vc/smerge-mode.el 2012-05-04 23:16:47 +0000 +++ lisp/vc/smerge-mode.el 2012-05-17 00:28:03 +0000 @@ -128,6 +128,18 @@ (defface smerge-refined-change "Face used for char-based changes shown by `smerge-refine'." :group 'smerge) +(defface smerge-refined-removed + '((t :inherit smerge-refined-change)) + "Face used for removed characters shown by `smerge-refine'." + :group 'smerge + :version "24.2") + +(defface smerge-refined-added + '((t :inherit smerge-refined-change)) + "Face used for added characters shown by `smerge-refine'." + :group 'smerge + :version "24.2") + (easy-mmode-defmap smerge-basic-map `(("n" . smerge-next) ("p" . smerge-prev) @@ -980,9 +992,11 @@ (defun smerge-refine-highlight-change (b (dolist (x props) (overlay-put ol (car x) (cdr x))) ol))))) -(defun smerge-refine-subst (beg1 end1 beg2 end2 props &optional preproc) +(defun smerge-refine-subst (beg1 end1 beg2 end2 props &optional preproc props2) "Show fine differences in the two regions BEG1..END1 and BEG2..END2. -PROPS is an alist of properties to put (via overlays) on the changes. +PROPS is an alist of properties to put (via overlays) on the changes, +or only on removed characters when PROPS2 is non-nil. +PROPS2 is an alist of properties to put on added characters. If non-nil, PREPROC is called with no argument in a buffer that contains a copy of a region, just before preparing it to for `diff'. It can be used to replace chars to try and eliminate some spurious differences." @@ -1029,7 +1043,7 @@ (defun smerge-refine-subst (beg1 end1 be (smerge-refine-highlight-change buf beg1 m1 m2 props))) (when (memq op '(?a ?c)) (setq last2 - (smerge-refine-highlight-change buf beg2 m4 m5 props)))) + (smerge-refine-highlight-change buf beg2 m4 m5 (or props2 props))))) (forward-line 1) ;Skip hunk header. (and (re-search-forward "^[0-9]" nil 'move) ;Skip hunk body. (goto-char (match-beginning 0)))) @@ -1091,7 +1105,10 @@ (defun smerge-refine (&optional part) (smerge-refine-subst (match-beginning n1) (match-end n1) (match-beginning n2) (match-end n2) '((smerge . refine) - (face . smerge-refined-change))))) + (face . smerge-refined-removed)) + nil + '((smerge . refine) + (face . smerge-refined-added))))) (defun smerge-diff (n1 n2) (smerge-match-conflict)
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.