[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several fac
From: |
Juri Linkov |
Subject: |
bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces |
Date: |
Thu, 17 May 2012 03:33:23 +0300 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.1.50 (x86_64-pc-linux-gnu) |
> 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)
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces,
Juri Linkov <=
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Stefan Monnier, 2012/05/16
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Juri Linkov, 2012/05/17
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Stefan Monnier, 2012/05/18
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Juri Linkov, 2012/05/18
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Stefan Monnier, 2012/05/19
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Juri Linkov, 2012/05/19
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Stefan Monnier, 2012/05/20
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Juri Linkov, 2012/05/20
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Stefan Monnier, 2012/05/20
- bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces, Juri Linkov, 2012/05/22