branch: externals/hyperbole
commit 04e6b302c1fdc4245f9d999a11b8de09ef6a4f7a
Author: Bob Weiner <r...@gnu.org>
Commit: Bob Weiner <r...@gnu.org>

    HyRolo updates to improve file heading handling, markdown headers
    
    Also better handle org-fold compatibility
---
 ChangeLog            | 34 ++++++++++++++++++++++++++++++++--
 hmouse-tag.el        | 17 ++++++++---------
 hsys-org.el          | 22 ++++++++++++++++++----
 hui-mouse.el         | 14 ++++++++------
 hyrolo.el            | 51 ++++++++++++++++++++++++++++++++++-----------------
 test/hyrolo-tests.el |  2 --
 6 files changed, 100 insertions(+), 40 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 509e69c490..4ee0965fe7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,15 +1,46 @@
+2024-02-04  Bob Weiner  <r...@gnu.org>
+
+* hyrolo.el (hyrolo-add): Ensure when matching for initial # characters, do 
not match
+    to those later in the line.
+            (hyrolo-markdown-mode): Fix to match only to lines starting with # 
as an
+    entry prefix; don't use `markdown-regex-header' since that allows '- ' as 
an
+    entry prefix.
+
+* hsys-org.el (hsys-org--set-fold-style): Add and use in 
'hsys-org-fix-version'.
+
 2024-02-03  Mats Lidell  <ma...@gnu.org>
 
 * test/demo-tests.el (fast-demo-key-series-shell-apropos): Skip test if
     apropos command is not available. Useful for running test-all using
     silex docker-emacs images.
 
+2024-02-03  Bob Weiner  <r...@gnu.org>
+
+* hyrolo.el (hyrolo-move-to-entry-end): Add doc string; add 'condition-case' in
+    case of 'outline-before-first-heading' error (see advice from 
"org-compat.el").
+  hui-mouse.el (smart-outline-to-entry-end): Reverse parts of if clause; add
+    'condition-case' in case of 'outline-before-first-heading' error (see 
advice
+    from "org-compat.el").
+    (hyrolo-cache-get-major-mode-from-pos): Fix error msg to reflect >= not >.
+
 2024-02-01  Mats Lidell  <ma...@gnu.org>
 
 * test/hyrolo-tests.el (hyrolo-tests--hyrolo-section-header): Helper that
     returns a HyRolo section header.
     (hyrolo-tests--hyrolo-reveal-mode): Add reveal mode test.
 
+2024-02-01  Bob Weiner  <r...@gnu.org>
+
+* hyrolo.el (hyrolo-hdr-move-after-p): Updated to skip over trailing empty 
lines.
+* test/hyrolo-tests.el (hyrolo-demo-no-following-same-level-heading,
+                        hyrolo-demo-move-between-entries-on-same-level): No 
longer
+    need to go to next record after moving past a header followed by a blank 
line.
+
+2024-01-31  Bob Weiner  <r...@gnu.org>
+
+* hyrolo.el (hyrolo-move-to-entry-end): Handle potential error raised if called
+    with point before the first entry.
+
 2024-01-30  Mats Lidell  <ma...@gnu.org>
 
 * test/hyrolo-tests.el (hyrolo-tests--outline-as-string): Add helper that
@@ -29,8 +60,7 @@
 * hmouse-tag.el (find-ert-test-regexp): Change ert test definition lookups to 
use
     the path stored in each test symbol's 'ert--test' property by changing from
     using the 'xref-find-definitions' in 'find-function-regexp-alist' to using
-    this newly defined regexp instead.  Add (require 'cl-lib) since this update
-    uses 'cl-delete-if'.
+    this newly defined regexp instead.
 
 * hyrolo.el (hyrolo-reveal-open-new-overlays, 
hyrolo-reveal-close-old-overlays):
     Wrap 'funcall' in 'hyrolo-funcall-match' so uses HyRolo outline settings.
diff --git a/hmouse-tag.el b/hmouse-tag.el
index 972099d70c..1d10add13b 100644
--- a/hmouse-tag.el
+++ b/hmouse-tag.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    24-Aug-91
-;; Last-Mod:     28-Jan-24 at 15:54:51 by Bob Weiner
+;; Last-Mod:     28-Jan-24 at 18:36:34 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -20,7 +20,7 @@
 ;;; ************************************************************************
 
 (eval-and-compile
-  (mapc #'require '(cl-lib find-func hpath hui-select))
+  (mapc #'require '(find-func hpath hui-select))
   (unless (or (featurep 'etags) (featurep 'tags))
     ;; Force use of .elc file here since otherwise the bin/etags
     ;; executable might be found in a user's load-path by the load
@@ -100,13 +100,12 @@ should insert the implicit link type definition name.")
 ;; Add Hyperbole def types to `find-function-regexp-alist'.
 (mapc (lambda (item)
        (setq find-function-regexp-alist
-             (cl-delete-if (lambda (elt) (eq (car elt) (car item)))
-                           find-function-regexp-alist))
-       (add-to-list 'find-function-regexp-alist item))
-      '((defact . find-defact-regexp)
-       (defal  . find-defal-regexp)
-       (defib  . find-defib-regexp)
-       (defil  . find-defil-regexp)
+             (assq-delete-all (car item) find-function-regexp-alist))
+       (push item find-function-regexp-alist))
+      '((defact    . find-defact-regexp)
+       (defal     . find-defal-regexp)
+       (defib     . find-defib-regexp)
+       (defil     . find-defil-regexp)
        (ert--test . find-ert-test-regexp)))
 
 (define-obsolete-variable-alias 'smart-asm-include-dirs
diff --git a/hsys-org.el b/hsys-org.el
index 399d1196ec..852fa0015a 100644
--- a/hsys-org.el
+++ b/hsys-org.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     2-Jul-16 at 14:54:14
-;; Last-Mod:     21-Jan-24 at 11:47:53 by Bob Weiner
+;; Last-Mod:      4-Feb-24 at 14:12:06 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -173,8 +173,11 @@ Return t if Org is reloaded, else nil."
                    (string-equal (match-string 1 org-dir) ;; org-dir version
                                  (remove ?- (org-release)))
                  t))
-          ;; Just require these libraries used for Hyperbole testing to ensure
-          ;; they are loaded from the single Org version used.
+          ;; Ensure Org folding is configured for `reveal-mode' compatibility
+          (hsys-org--set-fold-style)
+          ;; Just require these libraries used for Hyperbole testing
+          ;; (when they are available) to ensure they are loaded from
+          ;; the single Org version used.
           (mapc (lambda (lib-sym) (require lib-sym nil t))
                 '(org-version org-keys org-compat ol org-table org-macs org-id
                               org-element org-list org-element org-src 
org-fold org))
@@ -192,7 +195,10 @@ Return t if Org is reloaded, else nil."
                   org-libraries-to-reload)
 
             ;; Ensure user's external Org package version is configured for 
loading
-            (package-initialize)
+            (unless (and package--initialized (not after-init-time))
+              (package-initialize))
+            ;; Ensure Org folding is configured for `reveal-mode' compatibility
+            (hsys-org--set-fold-style)
             (let ((pkg-desc (car (cdr (assq 'org package-archive-contents)))))
               (package-activate pkg-desc t))
 
@@ -549,6 +555,14 @@ TARGET must be a string."
 ;;; Private functions
 ;;; ************************************************************************
 
+(defun hsys-org--set-fold-style ()
+  "Set `org-fold-core-style' to 'overlays for `reveal-mode' compatibility.
+This must be called before Org mode is loaded."
+  (when (and (ignore-errors (find-library-name "org-fold-core"))
+            (not (boundp 'org-fold-core-style)))
+    (load "org-fold-core"))
+  (custom-set-variables '(org-fold-core-style 'overlays)))
+
 (provide 'hsys-org)
 
 ;;; hsys-org.el ends here
diff --git a/hui-mouse.el b/hui-mouse.el
index 512825a8b8..016892db25 100644
--- a/hui-mouse.el
+++ b/hui-mouse.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    04-Feb-89
-;; Last-Mod:     27-Jan-24 at 11:29:19 by Bob Weiner
+;; Last-Mod:      4-Feb-24 at 10:07:05 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -2041,13 +2041,15 @@ If assist key is pressed:
        (t (outline-hide-entry))))
 
 (defun smart-outline-to-entry-end (&optional include-sub-entries)
-  "Move point past the end of the current entry.
+  "Move point past the end of the current entry, if any.
 With optional INCLUDE-SUB-ENTRIES non-nil, move to the end of the
 entire subtree.  Return final point."
-  (if include-sub-entries
-      (progn (outline-end-of-subtree)
-            (goto-char (1+ (point))))
-    (outline-next-heading))
+  (if (not include-sub-entries)
+      (outline-next-heading)
+    (condition-case ()
+       (progn (outline-end-of-subtree)
+              (goto-char (1+ (point))))
+      (error "")))
   (point))
 
 (defun smart-outline-subtree-hidden-p ()
diff --git a/hyrolo.el b/hyrolo.el
index 25e34e3953..b675209789 100644
--- a/hyrolo.el
+++ b/hyrolo.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     7-Jun-89 at 22:08:29
-;; Last-Mod:     28-Jan-24 at 15:34:45 by Bob Weiner
+;; Last-Mod:      4-Feb-24 at 14:00:36 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -491,7 +491,7 @@ entry which begins with the parent string."
                                                        (re-search-forward 
hyrolo-entry-name-regexp nil t)
                                                        (point))))
          (when (and (derived-mode-p 'markdown-mode)
-                    (string-match "\\`.*#+" entry-spc))
+                    (string-match "\\`[^#]*#+" entry-spc))
            (setq entry-spc (substring entry-spc (length (match-string 0 
entry-spc)))))
          (cond ((string-lessp entry name)
                 (hyrolo-to-entry-end t))
@@ -1038,7 +1038,7 @@ or NAME is invalid, return nil."
              ;; `hyrolo-add' handles removing # prefix from
              ;; trailing-space grouping below
              hyrolo-entry-trailing-space-group-number 2
-             outline-regexp (concat hyrolo-hdr-prefix-regexp 
markdown-regex-header)
+             outline-regexp (concat hyrolo-hdr-prefix-regexp "^\\(#+\\)\\([ 
\t\n\r]\\)")
              outline-level #'hyrolo-outline-level)
   ;; Use ellipses for invisible text
   (add-to-invisibility-spec '(outline . t))
@@ -1146,7 +1146,7 @@ non-nil."
   (setq-local hyrolo-entry-regexp "^\\([*\^L]+\\)\\([ \t\n\r]+\\)"
              hyrolo-hdr-and-entry-regexp (concat hyrolo-hdr-prefix-regexp 
hyrolo-entry-regexp)
              hyrolo-entry-group-number 1
-             ;; `hyrolo-add' handles removing # prefix from
+             ;; `hyrolo-add' handles removing * prefix from
              ;; trailing-space grouping below
              hyrolo-entry-trailing-space-group-number 2
              outline-regexp (concat hyrolo-hdr-prefix-regexp 
"^\\([*\^L]+\\)\\([ \t\n\r]\\)")
@@ -1867,8 +1867,8 @@ The header includes lines matching both 
`hyrolo-hdr-regexp' and
   (save-excursion (hyrolo-hdr-move-after-p)))
 
 (defun hyrolo-hdr-move-after-p ()
-  "If point is within a file header, move past the hdr and return non-nil.
-Otherwise, don't move and return nil."
+  "If point is within a file header, move past the hdr and blank lines.
+Return non-nil if point moves, else return nil."
   (let ((opoint (point))
        result)
     (if (save-excursion
@@ -1900,7 +1900,9 @@ Otherwise, don't move and return nil."
          ;; @loc> line after header
          (forward-line 1))))
     (if (> (point) opoint)
-       result
+       (progn (while (looking-at-p "^[ \t]*$")
+                (forward-line 1))
+              result)
       (goto-char opoint)
       nil)))
 
@@ -2134,9 +2136,7 @@ Calls the functions given by `hyrolo-mode-hook'.
                  "@loc> ")
                1)
          outline-heading-alist)
-    ;; This next local value is dynamically overridden in `hyrolo-grep'.
-    (setq-local outline-regexp "\\([*\^L]+\\)\\([ \t\n\r]\\)"
-               hyrolo-entry-regexp (concat "^" "\\([*\^L]+\\)\\([ \t\n\r]+\\)")
+    (setq-local hyrolo-entry-regexp (concat "^" "\\([*\^L]+\\)\\([ 
\t\n\r]+\\)")
                hyrolo-hdr-and-entry-regexp (default-value 
'hyrolo-hdr-and-entry-regexp)
                ;; In `outline-regexp', prevent matching to *word*
                ;; at the beginning of lines and hanging hyrolo
@@ -2144,6 +2144,8 @@ Calls the functions given by `hyrolo-mode-hook'.
                ;; the end of the match.  Note this change adds one
                ;; level to the level count, so `hyrolo-outline-level'
                ;; decrements it by one.  -- rsw, 2023-11-17
+               ;; This next local value is dynamically overridden in 
`hyrolo-grep'.
+               outline-regexp "\\([*\^L]+\\)\\([ \t\n\r]\\)"
                outline-level #'hyrolo-outline-level)
 
     ;; Can't cycle because {TAB} moves to next match
@@ -2669,10 +2671,24 @@ Return current point."
   (point)))
 
 (defun hyrolo-move-to-entry-end (include-sub-entries)
+  "Move point past the end of the current entry, if any.
+With optional INCLUDE-SUB-ENTRIES non-nil, move to the end of the
+entire subtree.  Return INCLUDE-SUB-ENTRIES flag value."
   (if (not include-sub-entries)
+      ;; Move to (point-max) if no next heading found and return nil
       (outline-next-heading)
-    (outline-end-of-subtree)
-    (goto-char (1+ (point))))
+    ;; When point is before the first entry in an Org file,
+    ;; `outline-end-of-subtree' can signal an
+    ;; `outline-before-first-heading' error within its subcall to
+    ;; `outline-back-to-heading' because of advice wrapped around that
+    ;; function from "org-compat.el".
+    (condition-case ()
+       (progn
+         (outline-end-of-subtree)
+         (goto-char (1+ (point))))
+      ;; Error means point is before the first buffer heading; move
+      ;; past file header to any next entry.
+      (error (hyrolo-hdr-move-after-p))))
   include-sub-entries)
 
 (defun hyrolo-to-next-loc ()
@@ -2968,13 +2984,13 @@ Any non-nil value returned is a cons of (<entry-name> . 
<entry-source>)."
        (org-fold-core-set-folding-spec-property (car 
org-link--link-folding-spec) :visible nil)
       (org-fold-core-set-folding-spec-property (car 
org-link--link-folding-spec) :visible t)))
 
-  (setq-local hyrolo-entry-regexp "^\\(\\*+\\)\\([     ]+\\)"
+  (setq-local hyrolo-entry-regexp "^\\(\\*+\\)\\([ \t\n\r]+\\)"
              hyrolo-hdr-and-entry-regexp (concat hyrolo-hdr-prefix-regexp 
hyrolo-entry-regexp)
              hyrolo-entry-group-number 1
-             ;; `hyrolo-add' handles removing # prefix from
+             ;; `hyrolo-add' handles removing * prefix from
              ;; trailing-space grouping below
              hyrolo-entry-trailing-space-group-number 2
-             outline-regexp (concat hyrolo-hdr-prefix-regexp "^\\(\\*+\\)\\( 
\\)")
+             outline-regexp (concat hyrolo-hdr-prefix-regexp "^\\(\\*+\\)\\([ 
\t\n\r]\\)")
              outline-level #'hyrolo-outline-level)
   (use-local-map org-mode-map)
   ;; Modify a few syntax entries
@@ -3106,7 +3122,8 @@ Return final point."
         (apply func args))
        ;; Narrow to current match buffer when given a lambda func.
        (not (symbolp func)))
-    ;; Prevent error and move past file header.
+    ;; Error means point is before the first buffer heading; move
+    ;; past file header to any next entry.
     (error (hyrolo-hdr-move-after-p)))
   (point))
 
@@ -3163,7 +3180,7 @@ HyRolo display matches buffer.")
   "Get the `major-mode' associated with POS in the current HyRolo display 
buffer."
   (hyrolo--cache-get-major-mode-from-index
    (nth (or (seq-position hyrolo--cache-loc-match-bounds pos (lambda (e pos) 
(< pos e)))
-           (error "(hyrolo-cache-get-major-mode): pos=%d > max display buffer 
pos=%d"
+           (error "(hyrolo-cache-get-major-mode): pos=%d >= max display buffer 
pos=%d"
                   pos (car hyrolo--cache-loc-match-bounds)))
        hyrolo--cache-major-mode-indexes)))
 
diff --git a/test/hyrolo-tests.el b/test/hyrolo-tests.el
index 1aa4e669d1..8a007156db 100644
--- a/test/hyrolo-tests.el
+++ b/test/hyrolo-tests.el
@@ -176,7 +176,6 @@ and {b} the previous same level cell."
         (should (equal (point) (point-min)))
 
        (hyrolo-hdr-move-after-p)
-        (should (hact 'kbd-key "n"))
         (should (looking-at "\\*\\*\\s-+Strong"))
 
         (should (hact 'kbd-key "f"))
@@ -200,7 +199,6 @@ and {b} the previous same level cell."
         (should (equal (point) (point-min)))
 
        (hyrolo-hdr-move-after-p)
-        (should (hact 'kbd-key "n"))
         (should (looking-at "\\*\\*\\s-+Strong"))
 
         (should (hact 'kbd-key "n"))

Reply via email to