emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master da50b7e: * lisp/outline.el (outline-minor-mode-cycle-filter): New


From: Juri Linkov
Subject: master da50b7e: * lisp/outline.el (outline-minor-mode-cycle-filter): New defcustom (bug#50679)
Date: Thu, 23 Sep 2021 12:15:24 -0400 (EDT)

branch: master
commit da50b7ec133eeb7cdcdb56ade5ad7d2f2c337f6a
Author: Juri Linkov <juri@linkov.net>
Commit: Juri Linkov <juri@linkov.net>

    * lisp/outline.el (outline-minor-mode-cycle-filter): New defcustom 
(bug#50679)
    
    (outline-minor-mode-cycle--bind): New helper function.
    (outline-minor-mode-cycle-map): Rename from outline-mode-cycle-map.
    (outline-mode-map): Revert part of 6458e16f33 to disassociate
    keymaps outline-mode-map and outline-minor-mode-cycle-map.
    (outline-font-lock-keywords, outline-minor-mode-highlight-buffer):
    Use outline-minor-mode-cycle-map instead of outline-mode-cycle-map.
    
    * lisp/help.el (describe-bindings): Rename outline-mode-cycle-map
    to outline-minor-mode-cycle-map.
---
 lisp/help.el    |  2 +-
 lisp/outline.el | 48 +++++++++++++++++++++++++++++++++++-------------
 2 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/lisp/help.el b/lisp/help.el
index 29ae340..8f77167 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -597,7 +597,7 @@ or a buffer name."
           (let ((inhibit-read-only t))
             (goto-char (point-min))
             (insert (substitute-command-keys
-                     (concat "\\<outline-mode-cycle-map>Type "
+                     (concat "\\<outline-minor-mode-cycle-map>Type "
                              "\\[outline-cycle] or \\[outline-cycle-buffer] "
                              "on headings to cycle their visibility.\n\n")))
             ;; Hide the longest body
diff --git a/lisp/outline.el b/lisp/outline.el
index 0bb74ff..52a94b4 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -175,23 +175,45 @@ in the file it applies to.")
                                   outline-mode-menu-bar-map))))))
     map))
 
-(defvar outline-mode-cycle-map
+(defcustom outline-minor-mode-cycle-filter nil
+  "Filter out positions on the heading available for cycling."
+  :type '(choice (const :tag "Everywhere" nil)
+                 (const :tag "At line beginning" bolp)
+                 (const :tag "Not at line beginning"
+                        (lambda () (not (bolp))))
+                 (const :tag "At line end" eolp)
+                 (function :tag "Custom filter"))
+  :version "28.1")
+
+(defun outline-minor-mode-cycle--bind (map key binding &optional filter)
+  (define-key map key
+    `(menu-item
+      "" ,binding
+      ;; Filter out specific positions on the heading.
+      :filter
+      ,(or filter
+           (lambda (cmd)
+             (when (or (not (functionp outline-minor-mode-cycle-filter))
+                       (funcall outline-minor-mode-cycle-filter))
+               cmd))))))
+
+(defvar outline-minor-mode-cycle-map
   (let ((map (make-sparse-keymap)))
-    (let ((tab-binding `(menu-item
-                         "" outline-cycle
-                         ;; Only takes effect if point is on a heading.
-                         :filter ,(lambda (cmd)
-                                    (when (outline-on-heading-p) cmd)))))
-      (define-key map (kbd "TAB") tab-binding)
-      (define-key map (kbd "<backtab>") #'outline-cycle-buffer))
+    (outline-minor-mode-cycle--bind map (kbd "TAB") #'outline-cycle)
+    (outline-minor-mode-cycle--bind map (kbd "<backtab>") 
#'outline-cycle-buffer)
     map)
-  "Keymap used by `outline-mode-map' and `outline-minor-mode-cycle'.")
+  "Keymap used by `outline-minor-mode-cycle'.")
 
 (defvar outline-mode-map
   (let ((map (make-sparse-keymap)))
-    (set-keymap-parent map outline-mode-cycle-map)
     (define-key map "\C-c" outline-mode-prefix-map)
     (define-key map [menu-bar] outline-mode-menu-bar-map)
+    ;; Only takes effect if point is on a heading.
+    (define-key map (kbd "TAB")
+      `(menu-item "" outline-cycle
+                  :filter ,(lambda (cmd)
+                             (when (outline-on-heading-p) cmd))))
+    (define-key map (kbd "<backtab>") #'outline-cycle-buffer)
     map))
 
 (defvar outline-font-lock-keywords
@@ -202,9 +224,9 @@ in the file it applies to.")
                          (if outline-minor-mode-cycle
                              (if outline-minor-mode-highlight
                                  (list 'face (outline-font-lock-face)
-                                       'keymap outline-mode-cycle-map)
+                                       'keymap outline-minor-mode-cycle-map)
                                (list 'face nil
-                                     'keymap outline-mode-cycle-map))
+                                     'keymap outline-minor-mode-cycle-map))
                            (if outline-minor-mode-highlight
                                (list 'face (outline-font-lock-face))))
                        (outline-font-lock-face))
@@ -367,7 +389,7 @@ faces to major mode's faces."
                          (not (get-text-property (point) 'face))))
             (overlay-put overlay 'face (outline-font-lock-face)))
           (when outline-minor-mode-cycle
-            (overlay-put overlay 'keymap outline-mode-cycle-map)))
+            (overlay-put overlay 'keymap outline-minor-mode-cycle-map)))
         (goto-char (match-end 0))))))
 
 ;;;###autoload



reply via email to

[Prev in Thread] Current Thread [Next in Thread]