branch: elpa/magit
commit a53c4024f4625b6f5dc83bc2166b7e3f422390b3
Author: Jonas Bernoulli <jo...@bernoul.li>
Commit: Jonas Bernoulli <jo...@bernoul.li>

    Replace magit-section-highlight-hook with two boolean options
    
    Replace the hook `magit-section-highlight-hook' with a
    generic function `magit-section-highlight'.
    
    To preserve the ability to disable highlighting of the current
    section and/or section selection highlighting, add new options,
    `magit-section-highlight-current' and
    `magit-section-highlight-selection'.
    
    Do not replace the related `magit-section-unhighlight-hook' just
    yet.  In two commits that will also be replace with a generic
    function (though in that case its not an exact replacement).
---
 lisp/magit-diff.el    | 32 ++++++++++++--------------
 lisp/magit-section.el | 64 ++++++++++++++++++++++-----------------------------
 2 files changed, 42 insertions(+), 54 deletions(-)

diff --git a/lisp/magit-diff.el b/lisp/magit-diff.el
index 22ea035810..26c23f5f0f 100644
--- a/lisp/magit-diff.el
+++ b/lisp/magit-diff.el
@@ -141,9 +141,7 @@ to have any effect."
   :type 'float)
 
 (defcustom magit-diff-highlight-hunk-body t
-  "Whether to highlight bodies of selected hunk sections.
-This only has an effect if `magit-diff-highlight' is a
-member of `magit-section-highlight-hook', which see."
+  "Whether to highlight bodies of selected hunk sections."
   :package-version '(magit . "2.1.0")
   :group 'magit-diff
   :type 'boolean)
@@ -3271,7 +3269,6 @@ actually a `diff' but a `diffstat' section."
 ;;; Diff Highlight
 
 (add-hook 'magit-section-unhighlight-hook #'magit-diff-unhighlight)
-(add-hook 'magit-section-highlight-hook #'magit-diff-highlight)
 
 (defun magit-diff-unhighlight (section selection)
   "Remove the highlighting of the diff-related SECTION."
@@ -3279,19 +3276,21 @@ actually a `diff' but a `diffstat' section."
     (magit-diff-paint-hunk section selection nil)
     t))
 
-(defun magit-diff-highlight (section selection)
-  "Highlight the diff-related SECTION.
-If SECTION is not a diff-related section, then do nothing and
-return nil.  If SELECTION is non-nil, then it is a list of sections
-selected by the region, including SECTION.  All of these sections
-are highlighted."
+(cl-deftype magit--diff-related-section ()
+  (declare (parents eieio-default-superclass))
+  '(satisfies (lambda (section)
+                (and (cl-typep section 'magit-section)
+                     (magit-diff-scope section t)
+                     t))))
+
+(cl-defmethod magit-section-highlight
+  ((section magit--diff-related-section) selection)
   (if (and (magit-section-match 'commit section)
            (oref section children))
-      (progn (if selection
-                 (dolist (section selection)
-                   (magit-diff-highlight-list section selection))
-               (magit-diff-highlight-list section))
-             t)
+      (if selection
+          (dolist (section selection)
+            (magit-diff-highlight-list section selection))
+        (magit-diff-highlight-list section))
     (when-let ((scope (magit-diff-scope section t)))
       (cond ((eq scope 'region)
              (magit-diff-paint-hunk section selection t))
@@ -3299,8 +3298,7 @@ are highlighted."
              (dolist (section selection)
                (magit-diff-highlight-recursive section selection)))
             (t
-             (magit-diff-highlight-recursive section)))
-      t)))
+             (magit-diff-highlight-recursive section))))))
 
 (defun magit-diff-highlight-recursive (section &optional selection)
   (pcase (magit-diff-scope section)
diff --git a/lisp/magit-section.el b/lisp/magit-section.el
index 3d0b2d683a..eea6b6dbff 100644
--- a/lisp/magit-section.el
+++ b/lisp/magit-section.el
@@ -108,13 +108,6 @@ similar defect.")
   "Hook run by `magit-section-goto'.
 That function in turn is used by all section movement commands.")
 
-(defvar magit-section-highlight-hook
-  (list #'magit-section-highlight
-        #'magit-section-highlight-selection)
-  "Functions used to highlight the current section.
-Each function is run with the current section as only argument
-until one of them returns non-nil.")
-
 (defvar magit-section-unhighlight-hook nil
   "Functions used to unhighlight the previously current section.
 Each function is run with the current section as only argument
@@ -137,6 +130,21 @@ hardcoded section specific default (see 
`magit-insert-section').")
   :link '(info-link "(magit)Sections")
   :group 'extensions)
 
+(defcustom magit-section-highlight-current t
+  "Whether to highlight the current section."
+  :package-version '(magit-section . "4.3.6")
+  :group 'magit-section
+  :type 'boolean)
+
+(defcustom magit-section-highlight-selection t
+  "Whether to highlight the selected sections.
+If you disable this, you probably also want to disable
+`magit-section-highlight-current' to get the region to
+always look as it would be in non-magit buffers."
+  :package-version '(magit-section . "4.3.6")
+  :group 'magit-section
+  :type 'boolean)
+
 (defcustom magit-section-show-child-count t
   "Whether to append the number of children to section headings.
 This only applies to sections for which doing so makes sense."
@@ -1732,9 +1740,8 @@ evaluated its BODY.  Admittedly that's a bit of a hack."
         (setq magit-section-highlighted-sections nil)
         (cond ((magit-section--maybe-enable-long-lines-shortcuts))
               ((eq section magit-root-section))
-              (t
-               (run-hook-with-args-until-success
-                'magit-section-highlight-hook section selection)))
+              (magit-section-highlight-current
+               (magit-section-highlight section selection)))
         (dolist (s magit-section-unhighlight-sections)
           (run-hook-with-args-until-success
            'magit-section-unhighlight-hook s selection))
@@ -1748,11 +1755,7 @@ evaluated its BODY.  Admittedly that's a bit of a hack."
     (setq magit-section-highlight-force-update nil)
     (magit-section-maybe-paint-visibility-ellipses)))
 
-(defun magit-section-highlight (section selection)
-  "Highlight SECTION and if non-nil all sections in SELECTION.
-This function works for any section but produces undesirable
-effects for diff related sections, which by default are
-highlighted using `magit-diff-highlight'.  Return t."
+(cl-defmethod magit-section-highlight (section selection)
   (when-let ((face (oref section heading-highlight-face)))
     (dolist (section (or selection (list section)))
       (magit-section-highlight-range
@@ -1762,27 +1765,14 @@ highlighted using `magit-diff-highlight'.  Return t."
        face)))
   (cond (selection
          (magit-section-highlight-range (oref (car selection) start)
-                                     (oref (car (last selection)) end))
-         (magit-section-highlight-selection nil selection))
+                                        (oref (car (last selection)) end))
+         (magit-section-highlight-selection selection))
         (t
          (magit-section-highlight-range (oref section start)
-                                     (oref section end))))
-  t)
-
-(defun magit-section-highlight-selection (_ selection)
-  "Highlight the section-selection region.
-If SELECTION is non-nil, then it is a list of sections selected by
-the region.  The headings of these sections are then highlighted.
-
-This is a fallback for people who don't want to highlight the
-current section and therefore removed `magit-section-highlight'
-from `magit-section-highlight-hook'.
-
-This function is necessary to ensure that a representation of
-such a region is visible.  If neither of these functions were
-part of the hook variable, then such a region would be
-invisible."
-  (when selection
+                                     (oref section end)))))
+
+(defun magit-section-highlight-selection (selection)
+  (when (and magit-section-highlight-selection selection)
     (dolist (sibling selection)
       (with-slots (start content end heading-selection-face) sibling
         (let ((ov (make-overlay start (or content end) nil t)))
@@ -1791,8 +1781,7 @@ invisible."
                            'magit-section-heading-selection))
           (overlay-put ov 'evaporate t)
           (push ov magit-section-selection-overlays)
-          ov)))
-    t))
+          ov)))))
 
 (defun magit-section-highlight-range (start end &optional face)
   (let ((ov (make-overlay start end nil t)))
@@ -1891,7 +1880,8 @@ to nil." (bound-and-true-p long-line-threshold)) 
:warning)))))
 
 (defun magit-section--highlight-region (start end window rol)
   (magit-section--delete-region-overlays)
-  (if (and (not magit-section-keep-region-overlay)
+  (if (and magit-section-highlight-selection
+           (not magit-section-keep-region-overlay)
            (or (magit-region-sections)
                (run-hook-with-args-until-success 'magit-region-highlight-hook
                                                  (magit-current-section)))

Reply via email to