From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.bugs Subject: bug#10181: 24.0.92; [wishlist] split `diff-refine-change' in several faces Date: Thu, 17 May 2012 03:33:23 +0300 Organization: JURTA Message-ID: <87txzftzn0.fsf@mail.jurta.org> References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1337214908 594 80.91.229.3 (17 May 2012 00:35:08 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 17 May 2012 00:35:08 +0000 (UTC) To: 10181@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu May 17 02:35:07 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1SUogH-000874-0o for geb-bug-gnu-emacs@m.gmane.org; Thu, 17 May 2012 02:35:01 +0200 Original-Received: from localhost ([::1]:60840 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SUogG-0007MH-DX for geb-bug-gnu-emacs@m.gmane.org; Wed, 16 May 2012 20:35:00 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:59081) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SUogC-0007MB-Lm for bug-gnu-emacs@gnu.org; Wed, 16 May 2012 20:34:58 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SUog7-0003WK-KN for bug-gnu-emacs@gnu.org; Wed, 16 May 2012 20:34:56 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:48744) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SUog7-0003W3-GU for bug-gnu-emacs@gnu.org; Wed, 16 May 2012 20:34:51 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1SUogH-00026m-OD for bug-gnu-emacs@gnu.org; Wed, 16 May 2012 20:35:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Juri Linkov Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 17 May 2012 00:35:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 10181 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 10181-submit@debbugs.gnu.org id=B10181.13372148918086 (code B ref 10181); Thu, 17 May 2012 00:35:01 +0000 Original-Received: (at 10181) by debbugs.gnu.org; 17 May 2012 00:34:51 +0000 Original-Received: from localhost ([127.0.0.1]:58290 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SUog7-00026K-69 for submit@debbugs.gnu.org; Wed, 16 May 2012 20:34:51 -0400 Original-Received: from ps18281.dreamhost.com ([69.163.218.105]:39830 helo=ps18281.dreamhostps.com) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SUog0-000268-6C for 10181@debbugs.gnu.org; Wed, 16 May 2012 20:34:49 -0400 Original-Received: from localhost (ps18281.dreamhostps.com [69.163.218.105]) by ps18281.dreamhostps.com (Postfix) with ESMTP id 3E5C6451C8E3 for <10181@debbugs.gnu.org>; Wed, 16 May 2012 17:34:29 -0700 (PDT) In-Reply-To: (Dani Moncayo's message of "Thu, 1 Dec 2011 16:56:00 +0100") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1.50 (x86_64-pc-linux-gnu) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:60094 Archived-At: > 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)