unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#45147: Org-like cycling in outline-minor-mode
@ 2020-12-09 19:15 Juri Linkov
  2020-12-09 20:03 ` Juri Linkov
  2021-03-03 19:12 ` Juri Linkov
  0 siblings, 2 replies; 13+ messages in thread
From: Juri Linkov @ 2020-12-09 19:15 UTC (permalink / raw)
  To: 45147

[-- Attachment #1: Type: text/plain, Size: 790 bytes --]

As suggested in bug#41198, here is a patch that adds
two new options (disabled by default):

- outline-minor-mode-font-lock that enables outline font-lock in
  outline-minor-mode

- outline-minor-mode-cycle that enables heading cycle in
  outline-minor-mode

And at the end of the patch are two examples that enable this feature
in the files etc/compilation.txt and etc/grep.txt.  So visiting these files
will highlight their outline headers, and will allow typing 'TAB' to cycle
between `hide all', `headings only' and `show all' when point is on the heading line.
Typing 'S-TAB' on the heading line cycles the whole buffer.  Typing these keys
anywhere outside heading lines uses their default bindings, so TAB will go
to the next link, and S-TAB will navigate back to the previous link.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: outline-minor-mode-cycle.patch --]
[-- Type: text/x-diff, Size: 4231 bytes --]

diff --git a/lisp/outline.el b/lisp/outline.el
index 85f9de4e1b..b6973e60dd 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -175,10 +175,8 @@ outline-minor-mode-menu-bar-map
 				   outline-mode-menu-bar-map))))))
     map))
 
-(defvar outline-mode-map
+(defvar outline-mode-cycle-map
   (let ((map (make-sparse-keymap)))
-    (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
@@ -187,11 +185,22 @@ outline-mode-map
     (define-key map (kbd "<backtab>") #'outline-cycle-buffer)
     map))
 
+(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)
+    map))
+
 (defvar outline-font-lock-keywords
   '(
     ;; Highlight headings according to the level.
     (eval . (list (concat "^\\(?:" outline-regexp "\\).+")
-		  0 '(outline-font-lock-face) nil t)))
+		  0 '(if outline-minor-mode-cycle
+			 (list 'face (outline-font-lock-face)
+			       'local-map outline-mode-cycle-map)
+		       (outline-font-lock-face))
+		  nil t)))
   "Additional expressions to highlight in Outline mode.")
 
 (defface outline-1
@@ -305,6 +314,19 @@ outline-minor-mode-prefix
          (define-key outline-minor-mode-map val outline-mode-prefix-map)
          (set-default sym val)))
 
+(defvar outline-minor-mode-font-lock nil
+  "Enable outline font-lock in `outline-minor-mode'.
+Non-nil value works well only when outline font-lock keywords
+don't conflict with the major mode's font-lock keywords.")
+;;;###autoload(put 'outline-minor-mode-font-lock 'safe-local-variable 'booleanp)
+(defvar outline-minor-mode-cycle nil
+  "Enable heading cycle in `outline-minor-mode'.
+When point is on a heading line, then typing 'TAB' cycles between `hide all',
+`headings only' and `show all' (`outline-cycle').  Typing 'S-TAB' on
+a heading line cycles the whole buffer (`outline-cycle-buffer').
+Typing these keys anywhere outside heading lines uses their default bindings.")
+;;;###autoload(put 'outline-minor-mode-cycle 'safe-local-variable 'booleanp)
+
 ;;;###autoload
 (define-minor-mode outline-minor-mode
   "Toggle Outline minor mode.
@@ -314,6 +336,9 @@ outline-minor-mode
 		    (cons outline-minor-mode-prefix outline-mode-prefix-map))
   (if outline-minor-mode
       (progn
+        (when outline-minor-mode-font-lock
+          (font-lock-add-keywords nil outline-font-lock-keywords)
+          (font-lock-flush))
 	;; Turn off this mode if we change major modes.
 	(add-hook 'change-major-mode-hook
 		  (lambda () (outline-minor-mode -1))
@@ -321,6 +346,9 @@ outline-minor-mode
         (setq-local line-move-ignore-invisible t)
 	;; Cause use of ellipses for invisible text.
 	(add-to-invisibility-spec '(outline . t)))
+    (when outline-minor-mode-font-lock
+      (font-lock-remove-keywords nil outline-font-lock-keywords)
+      (font-lock-flush))
     (setq line-move-ignore-invisible nil)
     ;; Cause use of ellipses for invisible text.
     (remove-from-invisibility-spec '(outline . t))
diff --git a/etc/compilation.txt b/etc/compilation.txt
index 7e406389d4..5f28ca1d13 100644
--- a/etc/compilation.txt
+++ b/etc/compilation.txt
@@ -692,3 +692,11 @@ COPYING PERMISSIONS:
 
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+
+;;; Local Variables:
+;;; outline-minor-mode-font-lock: t
+;;; outline-minor-mode-cycle: t
+;;; outline-regexp: "\\*\\_>"
+;;; eval: (outline-minor-mode 1)
+;;; End:
diff --git a/etc/grep.txt b/etc/grep.txt
index 19a3b4b47b..0f03609762 100644
--- a/etc/grep.txt
+++ b/etc/grep.txt
@@ -118,4 +123,7 @@ COPYING PERMISSIONS:
 ;;; Local Variables:
 ;;; eval: (let ((inhibit-read-only t) (compilation-filter-start (point-min))) (save-excursion (goto-char (point-max)) (grep-filter) (set-buffer-modified-p nil)))
 ;;; buffer-read-only: t
+;;; outline-minor-mode-font-lock: t
+;;; outline-minor-mode-cycle: t
+;;; eval: (outline-minor-mode 1)
 ;;; End:

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2020-12-09 19:15 bug#45147: Org-like cycling in outline-minor-mode Juri Linkov
@ 2020-12-09 20:03 ` Juri Linkov
  2020-12-14 20:35   ` Juri Linkov
  2021-03-03 19:12 ` Juri Linkov
  1 sibling, 1 reply; 13+ messages in thread
From: Juri Linkov @ 2020-12-09 20:03 UTC (permalink / raw)
  To: 45147

[-- Attachment #1: Type: text/plain, Size: 357 bytes --]

> As suggested in bug#41198, here is a patch that adds
> two new options (disabled by default):

Here is a better patch.  It makes possible to enable
outline-minor-mode in any buffer, e.g. in prog mode,
when outline-minor-mode-cycle is set to non-nil.
Then typing S-TAB will collapse all headings, and
TAB will expand the current function body, like this:


[-- Attachment #2: outline-minor-mode-cycle.png --]
[-- Type: image/png, Size: 96638 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: outline-minor-mode-cycle-2.patch --]
[-- Type: text/x-diff, Size: 3588 bytes --]

diff --git a/lisp/outline.el b/lisp/outline.el
index 85f9de4e1b..67e1a5dcdc 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -175,10 +175,8 @@ outline-minor-mode-menu-bar-map
 				   outline-mode-menu-bar-map))))))
     map))
 
-(defvar outline-mode-map
+(defvar outline-mode-cycle-map
   (let ((map (make-sparse-keymap)))
-    (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
@@ -187,11 +185,27 @@ outline-mode-map
     (define-key map (kbd "<backtab>") #'outline-cycle-buffer)
     map))
 
+(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)
+    map))
+
 (defvar outline-font-lock-keywords
   '(
     ;; Highlight headings according to the level.
     (eval . (list (concat "^\\(?:" outline-regexp "\\).+")
-		  0 '(outline-font-lock-face) nil t)))
+		  0 '(if outline-minor-mode-cycle
+			 (if outline-minor-mode-font-lock
+                             (list 'face (outline-font-lock-face)
+			           'local-map outline-mode-cycle-map)
+                           (list 'face nil 'local-map outline-mode-cycle-map))
+		       (outline-font-lock-face))
+		  nil
+                  (if (or outline-minor-mode-font-lock outline-minor-mode-cycle)
+                      'append
+                    t))))
   "Additional expressions to highlight in Outline mode.")
 
 (defface outline-1
@@ -305,6 +319,19 @@ outline-minor-mode-prefix
          (define-key outline-minor-mode-map val outline-mode-prefix-map)
          (set-default sym val)))
 
+(defvar outline-minor-mode-font-lock nil
+  "Enable outline font-lock in `outline-minor-mode'.
+Non-nil value works well only when outline font-lock keywords
+don't conflict with the major mode's font-lock keywords.")
+;;;###autoload(put 'outline-minor-mode-font-lock 'safe-local-variable 'booleanp)
+(defvar outline-minor-mode-cycle nil
+  "Enable heading cycle in `outline-minor-mode'.
+When point is on a heading line, then typing 'TAB' cycles between `hide all',
+`headings only' and `show all' (`outline-cycle').  Typing 'S-TAB' on
+a heading line cycles the whole buffer (`outline-cycle-buffer').
+Typing these keys anywhere outside heading lines uses their default bindings.")
+;;;###autoload(put 'outline-minor-mode-cycle 'safe-local-variable 'booleanp)
+
 ;;;###autoload
 (define-minor-mode outline-minor-mode
   "Toggle Outline minor mode.
@@ -314,6 +341,9 @@ outline-minor-mode
 		    (cons outline-minor-mode-prefix outline-mode-prefix-map))
   (if outline-minor-mode
       (progn
+        (when (or outline-minor-mode-font-lock outline-minor-mode-cycle)
+          (font-lock-add-keywords nil outline-font-lock-keywords)
+          (font-lock-flush))
 	;; Turn off this mode if we change major modes.
 	(add-hook 'change-major-mode-hook
 		  (lambda () (outline-minor-mode -1))
@@ -321,6 +351,9 @@ outline-minor-mode
         (setq-local line-move-ignore-invisible t)
 	;; Cause use of ellipses for invisible text.
 	(add-to-invisibility-spec '(outline . t)))
+    (when (or outline-minor-mode-font-lock outline-minor-mode-cycle)
+      (font-lock-remove-keywords nil outline-font-lock-keywords)
+      (font-lock-flush))
     (setq line-move-ignore-invisible nil)
     ;; Cause use of ellipses for invisible text.
     (remove-from-invisibility-spec '(outline . t))

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2020-12-09 20:03 ` Juri Linkov
@ 2020-12-14 20:35   ` Juri Linkov
  2020-12-16 20:28     ` Juri Linkov
  0 siblings, 1 reply; 13+ messages in thread
From: Juri Linkov @ 2020-12-14 20:35 UTC (permalink / raw)
  To: 45147

[-- Attachment #1: Type: text/plain, Size: 579 bytes --]

severity 45147 wishlist
tags 45147 + patch
quit

>> As suggested in bug#41198, here is a patch that adds
>> two new options (disabled by default):
>
> Here is a better patch.  It makes possible to enable
> outline-minor-mode in any buffer, e.g. in prog mode,
> when outline-minor-mode-cycle is set to non-nil.
> Then typing S-TAB will collapse all headings, and
> TAB will expand the current function body, like this:

This patch also allows using only outline-minor-mode-cycle
without highlighting heading with outline-minor-mode-font-lock
that is useful in prog-mode buffers:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: outline-minor-mode-cycle-3.patch --]
[-- Type: text/x-diff, Size: 4219 bytes --]

diff --git a/lisp/outline.el b/lisp/outline.el
index 85f9de4e1b..db10e2667f 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -175,23 +175,43 @@ outline-minor-mode-menu-bar-map
 				   outline-mode-menu-bar-map))))))
     map))
 
+(defvar outline-mode-cycle-map
+  (let ((map (make-sparse-keymap)))
+    (let ((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") binding)
+      (define-key map [tab] binding)
+      (define-key map (kbd "<backtab>") #'outline-cycle-buffer))
+    map))
+
 (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
   '(
     ;; Highlight headings according to the level.
     (eval . (list (concat "^\\(?:" outline-regexp "\\).+")
-		  0 '(outline-font-lock-face) nil t)))
+		  0 '(if outline-minor-mode-cycle
+			 (if outline-minor-mode-font-lock
+                             (list 'face (outline-font-lock-face)
+			           'local-map (make-composed-keymap
+                                               outline-mode-cycle-map
+                                               (current-local-map)))
+                           (list 'face nil 'local-map (make-composed-keymap
+                                                       outline-mode-cycle-map
+                                                       (current-local-map))))
+		       (outline-font-lock-face))
+		  nil
+                  (if (or outline-minor-mode-font-lock outline-minor-mode-cycle)
+                      'append
+                    t))))
   "Additional expressions to highlight in Outline mode.")
 
 (defface outline-1
@@ -305,6 +325,19 @@ outline-minor-mode-prefix
          (define-key outline-minor-mode-map val outline-mode-prefix-map)
          (set-default sym val)))
 
+(defvar outline-minor-mode-font-lock nil
+  "Enable outline font-lock in `outline-minor-mode'.
+Non-nil value works well only when outline font-lock keywords
+don't conflict with the major mode's font-lock keywords.")
+;;;###autoload(put 'outline-minor-mode-font-lock 'safe-local-variable 'booleanp)
+(defvar outline-minor-mode-cycle nil
+  "Enable heading cycle in `outline-minor-mode'.
+When point is on a heading line, then typing 'TAB' cycles between `hide all',
+`headings only' and `show all' (`outline-cycle').  Typing 'S-TAB' on
+a heading line cycles the whole buffer (`outline-cycle-buffer').
+Typing these keys anywhere outside heading lines uses their default bindings.")
+;;;###autoload(put 'outline-minor-mode-cycle 'safe-local-variable 'booleanp)
+
 ;;;###autoload
 (define-minor-mode outline-minor-mode
   "Toggle Outline minor mode.
@@ -314,6 +347,9 @@ outline-minor-mode
 		    (cons outline-minor-mode-prefix outline-mode-prefix-map))
   (if outline-minor-mode
       (progn
+        (when (or outline-minor-mode-font-lock outline-minor-mode-cycle)
+          (font-lock-add-keywords nil outline-font-lock-keywords)
+          (font-lock-flush))
 	;; Turn off this mode if we change major modes.
 	(add-hook 'change-major-mode-hook
 		  (lambda () (outline-minor-mode -1))
@@ -321,6 +357,9 @@ outline-minor-mode
         (setq-local line-move-ignore-invisible t)
 	;; Cause use of ellipses for invisible text.
 	(add-to-invisibility-spec '(outline . t)))
+    (when (or outline-minor-mode-font-lock outline-minor-mode-cycle)
+      (font-lock-remove-keywords nil outline-font-lock-keywords)
+      (font-lock-flush))
     (setq line-move-ignore-invisible nil)
     ;; Cause use of ellipses for invisible text.
     (remove-from-invisibility-spec '(outline . t))

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2020-12-14 20:35   ` Juri Linkov
@ 2020-12-16 20:28     ` Juri Linkov
  0 siblings, 0 replies; 13+ messages in thread
From: Juri Linkov @ 2020-12-16 20:28 UTC (permalink / raw)
  To: 45147

[-- Attachment #1: Type: text/plain, Size: 98 bytes --]

As proposed in bug#41198, here is the support for outline-minor-mode
in the 'C-h b' Help buffer:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: outline-describe-bindings.patch --]
[-- Type: text/x-diff, Size: 5333 bytes --]

diff --git a/lisp/help.el b/lisp/help.el
index ac5c2f1311..be366439b8 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -509,7 +509,22 @@ describe-bindings
     ;; Be aware that `describe-buffer-bindings' puts its output into
     ;; the current buffer.
     (with-current-buffer (help-buffer)
-      (describe-buffer-bindings buffer prefix))))
+      (describe-buffer-bindings buffer prefix)
+
+      (setq-local outline-regexp ".*:$")
+      (setq-local outline-level (lambda () 1))
+      (setq-local outline-minor-mode-cycle t)
+      (setq-local outline-minor-mode-highlight t)
+      (outline-minor-mode +1)
+      (save-excursion
+        (let ((inhibit-read-only t))
+          (goto-char (point-min))
+          (insert "Type TAB or S-TAB on headings to cycle their visibility.\n\n")
+          ;; Hide the longest body
+          (when (and (re-search-forward "Key translations" nil t)
+                     (fboundp 'outline-cycle))
+            (outline-cycle))))
+      (font-lock-ensure))))
 
 ;; This function used to be in keymap.c.
 (defun describe-bindings-internal (&optional menus prefix)



And here is an updated outline.el:

diff --git a/lisp/outline.el b/lisp/outline.el
index 85f9de4e1b..97aba091c5 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -175,23 +175,40 @@ outline-minor-mode-menu-bar-map
 				   outline-mode-menu-bar-map))))))
     map))
 
+(defvar outline-mode-cycle-map
+  (let ((map (make-sparse-keymap)))
+    (let ((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") binding)
+      (define-key map [tab] binding)
+      (define-key map (kbd "<backtab>") #'outline-cycle-buffer))
+    map))
+
 (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
   '(
     ;; Highlight headings according to the level.
-    (eval . (list (concat "^\\(?:" outline-regexp "\\).+")
-		  0 '(outline-font-lock-face) nil t)))
+    (eval . (list (concat "^\\(?:" outline-regexp "\\)"
+                          (if (string-match-p "\\$$" outline-regexp)
+                              "" ".+"))
+		  0 '(if outline-minor-mode-cycle
+			 (if outline-minor-mode-highlight
+                             (list 'face (outline-font-lock-face) 'keymap outline-mode-cycle-map)
+                           (list 'face nil 'keymap outline-mode-cycle-map))
+		       (outline-font-lock-face))
+		  nil
+                  (if (or outline-minor-mode-highlight outline-minor-mode-cycle)
+                      'append
+                    t))))
   "Additional expressions to highlight in Outline mode.")
 
 (defface outline-1
@@ -305,6 +322,19 @@ outline-minor-mode-prefix
          (define-key outline-minor-mode-map val outline-mode-prefix-map)
          (set-default sym val)))
 
+(defvar outline-minor-mode-highlight nil
+  "Highlight headings in `outline-minor-mode' using font-lock keywords.
+Non-nil value works well only when outline font-lock keywords
+don't conflict with the major mode's font-lock keywords.")
+;;;###autoload(put 'outline-minor-mode-highlight 'safe-local-variable 'booleanp)
+(defvar outline-minor-mode-cycle nil
+  "Enable heading cycle in `outline-minor-mode'.
+When point is on a heading line, then typing 'TAB' cycles between `hide all',
+`headings only' and `show all' (`outline-cycle').  Typing 'S-TAB' on
+a heading line cycles the whole buffer (`outline-cycle-buffer').
+Typing these keys anywhere outside heading lines uses their default bindings.")
+;;;###autoload(put 'outline-minor-mode-cycle 'safe-local-variable 'booleanp)
+
 ;;;###autoload
 (define-minor-mode outline-minor-mode
   "Toggle Outline minor mode.
@@ -314,6 +344,11 @@ outline-minor-mode
 		    (cons outline-minor-mode-prefix outline-mode-prefix-map))
   (if outline-minor-mode
       (progn
+        (when (or outline-minor-mode-highlight outline-minor-mode-cycle)
+          (unless font-lock-defaults
+            (setq-local font-lock-defaults '(nil t)))
+          (font-lock-add-keywords nil outline-font-lock-keywords t)
+          (font-lock-flush))
 	;; Turn off this mode if we change major modes.
 	(add-hook 'change-major-mode-hook
 		  (lambda () (outline-minor-mode -1))
@@ -321,6 +356,9 @@ outline-minor-mode
         (setq-local line-move-ignore-invisible t)
 	;; Cause use of ellipses for invisible text.
 	(add-to-invisibility-spec '(outline . t)))
+    (when (or outline-minor-mode-highlight outline-minor-mode-cycle)
+      (font-lock-remove-keywords nil outline-font-lock-keywords)
+      (font-lock-flush))
     (setq line-move-ignore-invisible nil)
     ;; Cause use of ellipses for invisible text.
     (remove-from-invisibility-spec '(outline . t))

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2020-12-09 19:15 bug#45147: Org-like cycling in outline-minor-mode Juri Linkov
  2020-12-09 20:03 ` Juri Linkov
@ 2021-03-03 19:12 ` Juri Linkov
  2021-05-16 15:51   ` Lars Ingebrigtsen
  1 sibling, 1 reply; 13+ messages in thread
From: Juri Linkov @ 2021-03-03 19:12 UTC (permalink / raw)
  To: 45147

> As suggested in bug#41198, here is a patch that adds
> two new options (disabled by default):

With no objections, new options (disabled by default)
pushed to master.





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-03-03 19:12 ` Juri Linkov
@ 2021-05-16 15:51   ` Lars Ingebrigtsen
  2021-05-16 17:53     ` Juri Linkov
  0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-16 15:51 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 45147

Juri Linkov <juri@linkov.net> writes:

>> As suggested in bug#41198, here is a patch that adds
>> two new options (disabled by default):
>
> With no objections, new options (disabled by default)
> pushed to master.

Skimming this thread, I'm not quite sure whether there's anything more
to be done here?  The first message mentioned

> - outline-minor-mode-font-lock that enables outline font-lock in
>   outline-minor-mode

which does not seem to exist, but I'm not sure whether the second
version made that unnecessary... 

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-05-16 15:51   ` Lars Ingebrigtsen
@ 2021-05-16 17:53     ` Juri Linkov
  2021-05-17 13:57       ` Lars Ingebrigtsen
  0 siblings, 1 reply; 13+ messages in thread
From: Juri Linkov @ 2021-05-16 17:53 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 45147

>>> As suggested in bug#41198, here is a patch that adds
>>> two new options (disabled by default):
>>
>> With no objections, new options (disabled by default)
>> pushed to master.
>
> Skimming this thread, I'm not quite sure whether there's anything more
> to be done here?  The first message mentioned

There is still an unpushed patch outline-describe-bindings.patch in
https://debbugs.gnu.org/45147#18 that will enable outline-minor-mode
on the output of describe-bindings.  I waited when the speed of
describe-bindings will be improved in bug#45379, but maybe
this patch could be pushed nevertheless.

>> - outline-minor-mode-font-lock that enables outline font-lock in
>>   outline-minor-mode
>
> which does not seem to exist, but I'm not sure whether the second
> version made that unnecessary...

outline-minor-mode-font-lock was renamed to
outline-minor-mode-highlight.





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-05-16 17:53     ` Juri Linkov
@ 2021-05-17 13:57       ` Lars Ingebrigtsen
  2021-05-18 20:12         ` Juri Linkov
  0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-17 13:57 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 45147

Juri Linkov <juri@linkov.net> writes:

> There is still an unpushed patch outline-describe-bindings.patch in
> https://debbugs.gnu.org/45147#18 that will enable outline-minor-mode
> on the output of describe-bindings.  I waited when the speed of
> describe-bindings will be improved in bug#45379, but maybe
> this patch could be pushed nevertheless.

I think you could push it anyway...  but I think enabling outline mode
(by default) in describe-bindings would be controversial, so I think
there should be a user option for that behaviour.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-05-17 13:57       ` Lars Ingebrigtsen
@ 2021-05-18 20:12         ` Juri Linkov
  2021-05-19 12:10           ` Eli Zaretskii
  0 siblings, 1 reply; 13+ messages in thread
From: Juri Linkov @ 2021-05-18 20:12 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 45147

[-- Attachment #1: Type: text/plain, Size: 340 bytes --]

> I think you could push it anyway...  but I think enabling outline mode
> (by default) in describe-bindings would be controversial, so I think
> there should be a user option for that behaviour.

This patch adds a new user option ‘describe-bindings-after-hook’
(and also removes ‘describe-bindings-internal’ obsolete since 24.4):


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: describe-bindings-after-hook.patch --]
[-- Type: text/x-diff, Size: 2648 bytes --]

diff --git a/lisp/help.el b/lisp/help.el
index babaf4adc7..7caf080dca 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -561,6 +561,13 @@ help--key-description-fontified
               'font-lock-face 'help-key-binding
               'face 'help-key-binding))
 
+(defcustom describe-bindings-after-hook '(describe-bindings-outline)
+  "Hook run at the end of `describe-bindings'."
+  :type 'hook
+  :options '(describe-bindings-outline)
+  :group 'help
+  :version "28.1")
+
 (defun describe-bindings (&optional prefix buffer)
   "Display a buffer showing a list of all defined keys, and their definitions.
 The keys are displayed in order of precedence.
@@ -578,23 +585,26 @@ describe-bindings
     ;; Be aware that `describe-buffer-bindings' puts its output into
     ;; the current buffer.
     (with-current-buffer (help-buffer)
-      (describe-buffer-bindings buffer prefix))))
+      (describe-buffer-bindings buffer prefix)
+      (run-hooks 'describe-bindings-after-hook))))
 
-(defun describe-bindings-internal (&optional menus prefix)
-  "Show a list of all defined keys, and their definitions.
-We put that list in a buffer, and display the buffer.
-
-The optional argument MENUS, if non-nil, says to mention menu bindings.
-\(Ordinarily these are omitted from the output.)
-The optional argument PREFIX, if non-nil, should be a key sequence;
-then we display only bindings that start with that prefix."
-  (declare (obsolete describe-buffer-bindings "24.4"))
-  (let ((buf (current-buffer)))
-    (with-help-window (help-buffer)
-      ;; Be aware that `describe-buffer-bindings' puts its output into
-      ;; the current buffer.
-      (with-current-buffer (help-buffer)
-	(describe-buffer-bindings buf prefix menus)))))
+(defun describe-bindings-outline ()
+  "Hook to enable outlines in the output buffer of `describe-bindings'."
+  (setq-local outline-regexp ".*:$")
+  (setq-local outline-heading-end-regexp ":\n")
+  (setq-local outline-level (lambda () 1))
+  (setq-local outline-minor-mode-cycle t
+              outline-minor-mode-highlight t)
+  (outline-minor-mode 1)
+  (save-excursion
+    (let ((inhibit-read-only t))
+      (goto-char (point-min))
+      (insert (substitute-command-keys
+               "\\<outline-mode-cycle-map>Type \\[outline-cycle] or \\[outline-cycle-buffer] on headings to cycle their visibility.\n\n"))
+      ;; Hide the longest body
+      (when (and (re-search-forward "Key translations" nil t)
+                 (fboundp 'outline-cycle))
+        (outline-cycle)))))
 
 (defun where-is (definition &optional insert)
   "Print message listing key sequences that invoke the command DEFINITION.

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-05-18 20:12         ` Juri Linkov
@ 2021-05-19 12:10           ` Eli Zaretskii
  2021-05-19 16:14             ` Juri Linkov
  0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2021-05-19 12:10 UTC (permalink / raw)
  To: Juri Linkov; +Cc: larsi, 45147

> From: Juri Linkov <juri@linkov.net>
> Date: Tue, 18 May 2021 23:12:46 +0300
> Cc: 45147@debbugs.gnu.org
> 
> +(defcustom describe-bindings-after-hook '(describe-bindings-outline)
> +  "Hook run at the end of `describe-bindings'."
> +  :type 'hook
> +  :options '(describe-bindings-outline)
> +  :group 'help
> +  :version "28.1")

What's the rationale for populating the hook by default?  That's not
what we normally do: hooks are for Lisp programs to use, not for the
core functionality to invoke itself.

> +(defun describe-bindings-outline ()
> +  "Hook to enable outlines in the output buffer of `describe-bindings'."

First, this is not a hook.

And second, if we want a feature whereby the buffer describing
bindings could be put in Outline mode, why not offer a simple option
for users to customize, not a hook for users to tweak?  Once again,
having user options that accept only function values is
user-unfriendly.

Thanks.





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-05-19 12:10           ` Eli Zaretskii
@ 2021-05-19 16:14             ` Juri Linkov
  2021-05-19 17:28               ` Eli Zaretskii
  0 siblings, 1 reply; 13+ messages in thread
From: Juri Linkov @ 2021-05-19 16:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, 45147

[-- Attachment #1: Type: text/plain, Size: 1045 bytes --]

>> +(defcustom describe-bindings-after-hook '(describe-bindings-outline)
>> +  "Hook run at the end of `describe-bindings'."
>> +  :type 'hook
>> +  :options '(describe-bindings-outline)
>> +  :group 'help
>> +  :version "28.1")
>
> What's the rationale for populating the hook by default?  That's not
> what we normally do: hooks are for Lisp programs to use, not for the
> core functionality to invoke itself.

This was an attempt of generalization.

>> +(defun describe-bindings-outline ()
>> +  "Hook to enable outlines in the output buffer of `describe-bindings'."
>
> First, this is not a hook.
>
> And second, if we want a feature whereby the buffer describing
> bindings could be put in Outline mode, why not offer a simple option
> for users to customize, not a hook for users to tweak?  Once again,
> having user options that accept only function values is
> user-unfriendly.

Function values are user-friendly when their defcustom provides
human-readable tags.

But in this case it's fine to have a simple option like in this patch:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: describe-bindings-outline.patch --]
[-- Type: text/x-diff, Size: 1896 bytes --]

diff --git a/lisp/help.el b/lisp/help.el
index babaf4adc7..2409636b48 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -561,6 +561,12 @@ help--key-description-fontified
               'font-lock-face 'help-key-binding
               'face 'help-key-binding))
 
+(defcustom describe-bindings-outline t
+  "Non-nil enables outlines in the output buffer of `describe-bindings'."
+  :type 'boolean
+  :group 'help
+  :version "28.1")
+
 (defun describe-bindings (&optional prefix buffer)
   "Display a buffer showing a list of all defined keys, and their definitions.
 The keys are displayed in order of precedence.
@@ -578,7 +584,26 @@ describe-bindings
     ;; Be aware that `describe-buffer-bindings' puts its output into
     ;; the current buffer.
     (with-current-buffer (help-buffer)
-      (describe-buffer-bindings buffer prefix))))
+      (describe-buffer-bindings buffer prefix)
+
+      (when describe-bindings-outline
+        (setq-local outline-regexp ".*:$")
+        (setq-local outline-heading-end-regexp ":\n")
+        (setq-local outline-level (lambda () 1))
+        (setq-local outline-minor-mode-cycle t
+                    outline-minor-mode-highlight t)
+        (outline-minor-mode 1)
+        (save-excursion
+          (let ((inhibit-read-only t))
+            (goto-char (point-min))
+            (insert (substitute-command-keys
+                     (concat "\\<outline-mode-cycle-map>Type "
+                             "\\[outline-cycle] or \\[outline-cycle-buffer] "
+                             "on headings to cycle their visibility.\n\n")))
+            ;; Hide the longest body
+            (when (and (re-search-forward "Key translations" nil t)
+                       (fboundp 'outline-cycle))
+              (outline-cycle))))))))
 
 (defun describe-bindings-internal (&optional menus prefix)
   "Show a list of all defined keys, and their definitions.

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-05-19 16:14             ` Juri Linkov
@ 2021-05-19 17:28               ` Eli Zaretskii
  2021-05-20 18:37                 ` Juri Linkov
  0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2021-05-19 17:28 UTC (permalink / raw)
  To: Juri Linkov; +Cc: larsi, 45147

> From: Juri Linkov <juri@linkov.net>
> Cc: larsi@gnus.org,  45147@debbugs.gnu.org
> Date: Wed, 19 May 2021 19:14:47 +0300
> 
> > And second, if we want a feature whereby the buffer describing
> > bindings could be put in Outline mode, why not offer a simple option
> > for users to customize, not a hook for users to tweak?  Once again,
> > having user options that accept only function values is
> > user-unfriendly.
> 
> Function values are user-friendly when their defcustom provides
> human-readable tags.

Only if the user uses Customize, not if he/she uses Lisp, or the
interactive set-variable command.

> But in this case it's fine to have a simple option like in this patch:

Thanks, this is much better.





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#45147: Org-like cycling in outline-minor-mode
  2021-05-19 17:28               ` Eli Zaretskii
@ 2021-05-20 18:37                 ` Juri Linkov
  0 siblings, 0 replies; 13+ messages in thread
From: Juri Linkov @ 2021-05-20 18:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, 45147

tags 45147 fixed
close 45147 28.0.50
quit

>> But in this case it's fine to have a simple option like in this patch:
>
> Thanks, this is much better.

So now pushed to master and closed.





^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2021-05-20 18:37 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-09 19:15 bug#45147: Org-like cycling in outline-minor-mode Juri Linkov
2020-12-09 20:03 ` Juri Linkov
2020-12-14 20:35   ` Juri Linkov
2020-12-16 20:28     ` Juri Linkov
2021-03-03 19:12 ` Juri Linkov
2021-05-16 15:51   ` Lars Ingebrigtsen
2021-05-16 17:53     ` Juri Linkov
2021-05-17 13:57       ` Lars Ingebrigtsen
2021-05-18 20:12         ` Juri Linkov
2021-05-19 12:10           ` Eli Zaretskii
2021-05-19 16:14             ` Juri Linkov
2021-05-19 17:28               ` Eli Zaretskii
2021-05-20 18:37                 ` Juri Linkov

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).