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: Mon, 21 May 2012 03:28:17 +0300 Organization: JURTA Message-ID: <87k406uz7n.fsf@mail.jurta.org> References: <87txzftzn0.fsf@mail.jurta.org> <87396yxr9u.fsf@mail.jurta.org> <87d361w2ea.fsf@mail.jurta.org> <87aa13k9o1.fsf@mail.jurta.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1337562338 25278 80.91.229.3 (21 May 2012 01:05:38 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 21 May 2012 01:05:38 +0000 (UTC) Cc: 10181@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon May 21 03:05:37 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 1SWH42-0000Ka-Ue for geb-bug-gnu-emacs@m.gmane.org; Mon, 21 May 2012 03:05:35 +0200 Original-Received: from localhost ([::1]:48269 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SWH42-00075d-BZ for geb-bug-gnu-emacs@m.gmane.org; Sun, 20 May 2012 21:05:34 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:47582) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SWH3x-00075N-Ur for bug-gnu-emacs@gnu.org; Sun, 20 May 2012 21:05:31 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SWH3v-0004I5-Ab for bug-gnu-emacs@gnu.org; Sun, 20 May 2012 21:05:29 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:54544) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SWH3v-0004I0-6s for bug-gnu-emacs@gnu.org; Sun, 20 May 2012 21:05:27 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1SWH4T-0004c5-TH for bug-gnu-emacs@gnu.org; Sun, 20 May 2012 21:06: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: Mon, 21 May 2012 01:06: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.133756231017670 (code B ref 10181); Mon, 21 May 2012 01:06:01 +0000 Original-Received: (at 10181) by debbugs.gnu.org; 21 May 2012 01:05:10 +0000 Original-Received: from localhost ([127.0.0.1]:35857 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SWH3d-0004ax-HG for submit@debbugs.gnu.org; Sun, 20 May 2012 21:05:10 -0400 Original-Received: from ps18281.dreamhost.com ([69.163.218.105]:57287 helo=ps18281.dreamhostps.com) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SWH3H-0004aA-JZ for 10181@debbugs.gnu.org; Sun, 20 May 2012 21:05:08 -0400 Original-Received: from localhost (ps18281.dreamhostps.com [69.163.218.105]) by ps18281.dreamhostps.com (Postfix) with ESMTP id 71E73451C8E2; Sun, 20 May 2012 18:04:10 -0700 (PDT) In-Reply-To: (Stefan Monnier's message of "Sun, 20 May 2012 11:06:38 -0400") 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:60240 Archived-At: >> (defface diff-removed >> - '((t :inherit diff-changed)) >> + '((((class color) (min-colors 88)) >> + :background "#ffdddd") >> + (((class color)) >> + :foreground "red")) > > Please keep the inheritance, even if the default overrides all fields. Point taken, in the new version of the patch it keeps the inheritance. > Tho, I don't see what's the point of this `changed' color-scheme: you > get the same visual result if you use the `removed-added' color scheme > and pretty much the same resource usage. The only point of the > distinction between removed-added and changed-removed-added is to avoid > the additional resource usage when it would have no visual effect. Agreed, and the patch adjusted accordingly. >> +(defface diff-refine-added >> + '((((class color) (min-colors 88)) >> + :background "#aaffaa") >> + (t :inherit diff-added :inverse-video t)) >> + "Face used for added characters shown by `diff-refine-hunk'." >> + :group 'diff-mode >> + :version "24.2") > > This is just an accidental left-over, right? This is a left-over from the second part of the patch that deals with the diff-refine-hook case. The whole patch is: === 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-21 00:27:43 +0000 @@ -277,14 +275,32 @@ (define-obsolete-face-alias 'diff-hunk-h (defvar diff-hunk-header-face 'diff-hunk-header) (defface diff-removed - '((t :inherit diff-changed)) + '((((class color) (min-colors 88)) + :inherit diff-changed + :background "#ffdddd") + (((class color)) + :inherit diff-changed + :foreground "red" + :weight normal + :slant normal) + (t + :inherit diff-changed)) "`diff-mode' face used to highlight removed lines." :group 'diff-mode) (define-obsolete-face-alias 'diff-removed-face 'diff-removed "22.1") (defvar diff-removed-face 'diff-removed) (defface diff-added - '((t :inherit diff-changed)) + '((((class color) (min-colors 88)) + :inherit diff-changed + :background "#ddffdd") + (((class color)) + :inherit diff-changed + :foreground "green" + :weight normal + :slant normal) + (t + :inherit diff-changed)) "`diff-mode' face used to highlight added lines." :group 'diff-mode) (define-obsolete-face-alias 'diff-added-face 'diff-added "22.1") @@ -393,7 +409,18 @@ (defvar diff-font-lock-keywords ("^\\([+>]\\)\\(.*\n\\)" (1 diff-indicator-added-face) (2 diff-added-face)) ("^\\(!\\)\\(.*\n\\)" - (1 diff-indicator-changed-face) (2 diff-changed-face)) + (1 diff-indicator-changed-face) + (2 + (if (not (or (face-equal diff-changed-face diff-added-face) + (face-equal diff-changed-face diff-removed-face))) + diff-changed-face + ;; Otherwise, search for `diff-context-mid-hunk-header-re' and + ;; if the line of context diff is above, use `diff-removed-face'; + ;; if below, use `diff-added-face'. + (let ((limit (save-excursion (diff-beginning-of-hunk)))) + (if (save-excursion (re-search-backward diff-context-mid-hunk-header-re limit t)) + diff-added-face + diff-removed-face))))) ("^\\(?:Index\\|revno\\): \\(.+\\).*\n" (0 diff-header-face) (1 diff-index-face prepend)) ("^Only in .*\n" . diff-nonexistent-face) @@ -1866,6 +1893,32 @@ (defface diff-refine-change "Face used for char-based changes shown by `diff-refine-hunk'." :group 'diff-mode) +(defface diff-refine-removed + '((((class color) (min-colors 88)) + :inherit diff-refine-change + :background "#ffaaaa") + (((class color)) + :inherit diff-refine-change + :background "red") + (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 + '((((class color) (min-colors 88)) + :inherit diff-refine-change + :background "#aaffaa") + (((class color)) + :inherit diff-refine-change + :background "green") + (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 +1932,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 +1943,11 @@ (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-c '((diff-mode . fine) (face diff-refine-change))) + (props-r '((diff-mode . fine) (face diff-refine-removed))) + (props-a '((diff-mode . fine) (face diff-refine-added))) + (diff-use-changed (not (or (face-equal diff-changed-face diff-added-face) + (face-equal diff-changed-face diff-removed-face)))) ;; 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 +1961,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-r 'diff-refine-preproc props-a))) (context (let* ((middle (save-excursion (re-search-forward "^---"))) (other middle)) @@ -1916,14 +1973,16 @@ (defun diff-refine-hunk () (setq other (match-end 0)) (match-beginning 0)) other - props 'diff-refine-preproc)))) + (if diff-use-changed props-c props-r) + 'diff-refine-preproc + (if diff-use-changed props-c props-a))))) (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-r 'diff-refine-preproc props-a)))))))) (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-21 00:27:50 +0000 @@ -128,6 +128,32 @@ (defface smerge-refined-change "Face used for char-based changes shown by `smerge-refine'." :group 'smerge) +(defface smerge-refined-removed + '((((class color) (min-colors 88)) + :inherit smerge-refined-change + :background "#ffaaaa") + (((class color)) + :inherit smerge-refined-change + :background "red") + (t + :inherit smerge-refined-change)) + "Face used for removed characters shown by `smerge-refine'." + :group 'smerge + :version "24.2") + +(defface smerge-refined-added + '((((class color) (min-colors 88)) + :inherit smerge-refined-change + :background "#aaffaa") + (((class color)) + :inherit smerge-refined-change + :background "green") + (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 +1006,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 +1057,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)))) @@ -1081,7 +1109,10 @@ (defun smerge-refine (&optional part) ((eq (match-end 3) (match-beginning 3)) 3) (t 2))) (let ((n1 (if (eq part 1) 2 1)) - (n2 (if (eq part 3) 2 3))) + (n2 (if (eq part 3) 2 3)) + (smerge-use-changed + (not (or (face-equal 'smerge-refined-change 'smerge-refined-added) + (face-equal 'smerge-refined-change 'smerge-refined-removed))))) (smerge-ensure-match n1) (smerge-ensure-match n2) (with-silent-modifications @@ -1090,8 +1121,13 @@ (defun smerge-refine (&optional part) (cons (buffer-chars-modified-tick) part))) (smerge-refine-subst (match-beginning n1) (match-end n1) (match-beginning n2) (match-end n2) - '((smerge . refine) - (face . smerge-refined-change))))) + (if smerge-use-changed + '((smerge . refine) (face . smerge-refined-change)) + '((smerge . refine) (face . smerge-refined-removed))) + nil + (if smerge-use-changed + '((smerge . refine) (face . smerge-refined-change)) + '((smerge . refine) (face . smerge-refined-added)))))) (defun smerge-diff (n1 n2) (smerge-match-conflict)