branch: externals/hyperbole
commit d59f27c469af9ad225bd7f1cf9386773794f9cf0
Author: bw <r...@gnu.org>
Commit: bw <r...@gnu.org>

    Fix most remaining outstanding issues in HyRolo, ibut-link-directly
---
 ChangeLog          |  65 ++++++++++++++++++++-
 DEMO               |   2 +-
 hactypes.el        |   9 ++-
 hbut.el            |  14 ++---
 hpath.el           |   4 +-
 hsys-org.el        |   4 +-
 hui-mouse.el       |   6 +-
 hui-select.el      |  17 +++---
 hui.el             |  34 +++++------
 hyrolo-logic.el    | 136 +++++++++++++++++++++++++++++---------------
 hyrolo.el          | 163 ++++++++++++++++++++++++++++++++++++++++-------------
 man/hyperbole.html |  77 +++++++++++++++++--------
 man/hyperbole.info | Bin 618127 -> 619272 bytes
 man/hyperbole.pdf  | Bin 1372135 -> 1373019 bytes
 man/hyperbole.texi |  83 ++++++++++++++++++---------
 15 files changed, 431 insertions(+), 183 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3d792debff..9c23b66c46 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,68 @@
 2023-12-26  Bob Weiner  <r...@gnu.org>
 
+* hpath.el (hpath:to-markup-anchor): If referent-regexp starts with '^', add
+    "[ \t]*" instead of "[ \t]+" to the expression in case it matches the 
whole line.
+
+* hui.el (hui:link-possible-types): Change outline heading line link to 
trigger only
+    for outline, org and kotl modes when point is anywhere on the heading line.
+    Include non-zero column in pathname so returns to the original point.  
Produce a
+    link-to-string-match type.
+  hbut.el (ibut:insert-text): Change 'actypes::link-to-string-match' to use a 
pathname
+    format ibut rather than a <link-to-string-match> action button when the 
occurrence
+    number is 1.
+
+* hui-select.el (hui-select-scan-sexps): Don't use 'hui-select-syntax-table' 
in Lisp
+    modes as its use of matching angle brackets prevents proper sexp selection 
when
+    on the opening parentheses of anything with angle brackets inside, e.g. (< 
2 3).
+
+* hyrolo-logic.el (hyrolo-fgrep-logical): Fix quoting for Lisp read and regexp
+    operator handling.
+  hyrolo.el (hyrolo-fgrep): Fix to handle 'r-<operator>' regexp logic 
operators.
+  man/hyperbole.texi (HyRolo Searching): Add doc for regular expression-based
+    logic operators.
+
+* hyrolo-logic.el (hyrolo-map-logic): Update to handle multi-file formats
+    in 'hyrolo-display-buffer'.
+                  (hyrolo-map-entries, hyrolo-map-kotl): Add doc string.
+                 (hyrolo-fgrep-logical): Rename arg 'whole-buffer-flag' to
+    'koutline-flag' to match its purpose.  Does not seem to be sent as true
+    anywhere in the existing code base.
+
+* hyrolo.el (hyrolo-hdr-in-p): Add to test if in a HyRolo file header.
+            (hyrolo-hdr-to-first-line-p): Add to move to file header start.
+           (hyrolo-outline-hide-subtree): If point is on a file header in the
+    'hyrolo-display-buffer', then collapse the entire file from the current
+    end-of-line forward.  This makes {h} work within file headers.
+            (hyrolo-hdr-move-after-p): Handle point on single text line between
+    header delimiters.
+            (hyrolo-outline-show-subtree): If point is on a file header in the
+    'hyrolo-display-buffer', then show/expand the entire file.  This makes {s}
+    work within file headers.
+  man/hyperbole.texi (HyRolo Keys): Update to document latest {h} and {s} 
behavior.
+  hbut.el (hbut:get-key-src): Call (hyrolo-hdr-move-after-p) so if in a file
+    hdr, backwards search finds its @loc line rather than going to prior one.
+
+* hyrolo.el (hyrolo-outline-level): Fix to return level 1 when on a file header
+    separator or @loc> line.
+            (hyrolo-outline-up-heading): Rewrite and fix to handle edge cases.
+           (hyrolo-name-at-p): Fix to store the current line and col in a text
+    property when possibly hierarchical name is found/used so can jump to the
+    specific line within an entry when editing.
+            (hyrolo-to): Fix to jump to stored current line and col after 
finding
+    a possibly hierarchical name in HyRolo.
+
+* man/hyperbole.texi (HyRolo Keys): Update doc for 'hyrolo-edit', {e} key, and
+    how it handles datestamps.  Mention 'hyrolo-date-format'.
+
+* hactypes.el (link-to-kcell): Fix to use any source location, e.g. in HyRolo
+    display matches buffer.
+
+* hsys-org.el (hsys-org-agenda-item-at-p):
+  hui-mouse.el (smart-org):
+  man/hyperbole.texi (Smart Key - Org Mode): Update doc to note the context is
+   an Org agenda item within an Org agenda view, not the item in its source
+   context.
+
 * test/hy-test-helpers.el (hy-test-helpers:ensure-link-possible-type): Add.
   test/hui-tests.el (hui--link-possible-types): Use above function to ensure
     'hui:link-possible-types' returns one given type only for each test herein.
@@ -522,7 +585,7 @@
     and 'keymap-sym' locally within the function rather than globally
     which would affect modes beyond those in 'hui-select-markup-modes'.
                 (hui-select-goto-matching-delimiter): If the key that
-    invokes this command in hyperbole-minor-mode is also bound in the
+    invokes this command in hyperbole's minor-mode is also bound in the
     current major mode map, then interactively invoke that command
     instead.  Typically prevents clashes over {C-c .}.  Previously
     did this only for 'org-mode' but 'kotl-mode' also has a conflict
diff --git a/DEMO b/DEMO
index b7c684fb97..21a8cc3f9c 100644
--- a/DEMO
+++ b/DEMO
@@ -542,7 +542,7 @@ the Action Key is pressed.
   1. If on an Org todo keyword, cycle through the keywords in
      that set or if final done keyword, remove it.
 
-  2. If on an Org agenda item, jump to the item for editing.
+  2. If on an Org agenda view item, jump to the item for editing.
 
   3. Within a radio or internal target or a link to it, jump between
      the target and the first link to it, allowing two-way navigation.
diff --git a/hactypes.el b/hactypes.el
index 5665dcbba1..cad2b42fc5 100644
--- a/hactypes.el
+++ b/hactypes.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    23-Sep-91 at 20:34:36
-;; Last-Mod:     23-Dec-23 at 02:17:41 by Bob Weiner
+;; Last-Mod:     26-Dec-23 at 14:19:50 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -562,7 +562,7 @@ on the implicit button to which to link."
   "Display FILE with kcell given by CELL-REF at window top.
 See documentation for `kcell:ref-to-id' for valid cell-ref formats.
 
-If FILE is nil, use the current buffer.
+If FILE is nil, use any source location or the current buffer.
 If CELL-REF is nil, show the first cell in the view."
   (interactive (hargs:iform-read '(interactive "fKotl file to link to: 
\n+KKcell to link to: ")))
   (require 'kfile)
@@ -581,9 +581,12 @@ If CELL-REF is nil, show the first cell in the view."
                   (string-empty-p file)
                   (equal (file-name-nondirectory file)
                          (file-name-nondirectory buffer-file-name))))
+    (when (or (null file) (string-empty-p file))
+      (setq file (hbut:get-key-src t)))
     (if (stringp file)
        (hpath:find file)
-      (hpath:display-buffer (current-buffer))))
+      ;; file can be a buffer from get-key-src call
+      (hpath:display-buffer (or file (current-buffer)))))
   (kotl-mode:goto-cell-ref cell-ref))
 
 (defact link-to-mail (mail-msg-id &optional mail-file)
diff --git a/hbut.el b/hbut.el
index 73a6717736..cf9809d34e 100644
--- a/hbut.el
+++ b/hbut.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    18-Sep-91 at 02:57:09
-;; Last-Mod:     25-Dec-23 at 01:59:28 by Bob Weiner
+;; Last-Mod:     26-Dec-23 at 23:32:56 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1251,6 +1251,7 @@ is given."
                         ((save-excursion
                            (save-restriction
                              (widen)
+                             (hyrolo-hdr-move-after-p)
                              (end-of-visible-line)
                              (when (and (search-backward hbut:source-prefix 
nil t)
                                         (or (memq (preceding-char) '(?\n ?\r))
@@ -2484,11 +2485,6 @@ Summary of operations based on inputs (name arg comes 
from \\='hbut:current attr
     (ibut:at-p)
 
     (let ((lbl-key (hattr:get 'hbut:current 'lbl-key)))
-      ;; (unless lbl-key
-      ;;       (when (or (and (ibut:set-name-and-label-key-p)
-      ;;                      (hattr:get 'hbut:current 'lbl-key))
-      ;;                 (ibut:at-p)) ;; Sets lbl-key for non-delimited ibtypes
-      ;;         (setq lbl-key (hattr:get 'hbut:current 'lbl-key))))
       (unless (and (stringp lbl-key) (not (string-empty-p lbl-key)))
        (hypb:error "(ibut:operate): hbut:current lbl-key must be non-nil")))
 
@@ -2578,8 +2574,10 @@ Summary of operations based on inputs (name arg comes 
from \\='hbut:current attr
                         ;; includes buffer pos that we translate to line:col
                         (hpath:file-position-to-line-and-column arg1 arg2)))))
       ('actypes::link-to-string-match
-       (insert (format "<%s \"%s\" %d \"%s\">" (actype:def-symbol actype) arg1 
arg2
-                      (hpath:shorten arg3))))
+       (if (= arg2 1)
+          (insert (format "\"%s#%s\"" (hpath:shorten arg3) arg1))
+        (insert (format "<%s \"%s\" %d \"%s\">" (actype:def-symbol actype) 
arg1 arg2
+                        (hpath:shorten arg3)))))
       ('nil (error "(ibut:insert-text): actype must be a Hyperbole actype or 
Lisp function symbol, not '%s'" orig-actype))
       ;; Generic action button type                                            
      
       (_ (insert (format "<%s%s%s>" (actype:def-symbol actype) (if args " " "")
diff --git a/hpath.el b/hpath.el
index e22171d80c..0ed3599ea3 100644
--- a/hpath.el
+++ b/hpath.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     1-Nov-91 at 00:44:23
-;; Last-Mod:     17-Dec-23 at 23:01:29 by Mats Lidell
+;; Last-Mod:     26-Dec-23 at 22:42:39 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1624,7 +1624,7 @@ Move point to beginning of buffer if HASH is non-nil and 
ANCHOR is null."
                                    (referent-leading-spaces-regexp
                                     (when (and (not (string-empty-p 
referent-regexp))
                                                (= (aref referent-regexp 0) ?^))
-                                      (concat "^[ \t]+" (substring 
referent-regexp 1)))))
+                                      (concat "^[ \t]*" (substring 
referent-regexp 1)))))
                               (goto-char (point-min))
                               (if (or (re-search-forward referent-regexp nil t)
                                       (and referent-leading-spaces-regexp
diff --git a/hsys-org.el b/hsys-org.el
index 5ab09a56b2..2d7bf681bb 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:      4-Dec-23 at 00:04:31 by Bob Weiner
+;; Last-Mod:     26-Dec-23 at 12:05:46 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -267,7 +267,7 @@ Return the (start . end) buffer positions of the region."
       (cons start-point (next-single-property-change start-point property)))))
 
 (defun hsys-org-agenda-item-at-p ()
-  "Return non-nil if point is on an Org Agenda item line, else nil."
+  "Return non-nil if point is on an Org Agenda view item line, else nil."
   (and (derived-mode-p 'org-agenda-mode)
        (org-get-at-bol 'org-marker)))
 
diff --git a/hui-mouse.el b/hui-mouse.el
index 2b7596186c..9315410254 100644
--- a/hui-mouse.el
+++ b/hui-mouse.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    04-Feb-89
-;; Last-Mod:     23-Nov-23 at 03:45:24 by Bob Weiner
+;; Last-Mod:     26-Dec-23 at 12:06:25 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1737,7 +1737,7 @@ When the Action Key is pressed:
   1. If on an Org todo keyword, cycle through the keywords in
      that set or if final done keyword, remove it.
 
-  2. If on an Org agenda item, jump to the item for editing.
+  2. If on an Org agenda view item, jump to the item for editing.
 
   3. Within a radio or internal target or a link to it, jump between
      the target and the first link to it, allowing two-way navigation.
@@ -1767,7 +1767,7 @@ in these contexts:
   1. If on an Org todo keyword, move to the first todo keyword in
      the next set, if any.
 
-  2. If on an Org mode link or agenda item, display Hyperbole
+  2. If on an Org mode link or agenda view item, display Hyperbole
      context-sensitive help.
 
   3. On a Hyperbole button, perform the Assist Key function, generally
diff --git a/hui-select.el b/hui-select.el
index 612a7c00ba..a027c9a502 100644
--- a/hui-select.el
+++ b/hui-select.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    19-Oct-96 at 02:25:27
-;; Last-Mod:     30-Nov-23 at 11:33:09 by Bob Weiner
+;; Last-Mod:     26-Dec-23 at 21:57:18 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -465,8 +465,10 @@ Also, add language-specific syntax setups to aid in thing 
selection."
 
 (defun hui-select-scan-sexps (from count)
   "Scan FROM point across COUNT sexpressions."
-  (with-syntax-table hui-select-syntax-table
-    (scan-sexps from count)))
+  (if (memq major-mode hui-select-ignore-quoted-sexp-modes)
+      (scan-sexps from count)
+    (with-syntax-table hui-select-syntax-table
+      (scan-sexps from count))))
 
 ;;;###autoload
 (defun hui-select-thing ()
@@ -542,10 +544,9 @@ displayed in the minibuffer."
 (defun hui-select-goto-matching-tag ()
   "Move point to start of the tag paired with closest tag point is at or 
precedes.
 Tag in this context is an sgml-like tag surrounded by angle brackets, <>.
-Enabled in major modes in `hui-select-markup-modes'.  Returns t if
-point is moved, else nil.  Signals an error if no tag is found
-following point or if the closing tag does not have a `>'
-terminator character."
+Enabled in major modes contained in the list, `hui-select-markup-modes'.
+Return t if point is moved, else nil.  Signal an error if no tag is found
+following point or if the closing tag does not have a `>' terminator 
character."
   (interactive)
   (when (memq major-mode hui-select-markup-modes)
     (let ((result)
@@ -790,7 +791,7 @@ Ignores any match if on an Emacs button and instead returns 
nil."
 
 (defun hui-select-delimited-thing ()
   "Select a markup pair, list, array/vector, set, comment or string at point.
-Return t is selected, else nil."
+Return t if selected, else nil."
   (interactive)
   (prog1 (and (hui-select-delimited-thing-call #'hui-select-thing) t)
     ;; If selected region is followed by only whitespace and then a
diff --git a/hui.el b/hui.el
index 81055fa062..afb711f2c3 100644
--- a/hui.el
+++ b/hui.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    19-Sep-91 at 21:42:03
-;; Last-Mod:     25-Dec-23 at 22:28:16 by Mats Lidell
+;; Last-Mod:     26-Dec-23 at 23:43:32 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1898,29 +1898,29 @@ Buffer without File      link-to-buffer-tmp"
                                           (list 'link-to-file val))
                                          ((derived-mode-p #'kotl-mode)
                                           (list 'link-to-kcell 
buffer-file-name (kcell-view:idstamp)))
-                                         ;; If link is within an 
outline-regexp prefix, use
+                                         ;;
+                                         ;; If current line starts with an 
outline-regexp prefix, use
                                          ;; a link-to-string-match.
-                                         ((and (boundp 'outline-regexp)
+                                         ((and (derived-mode-p 'outline-mode 
'org-mode 'kotl-mode)
                                                (stringp outline-regexp)
                                                (save-excursion
-                                                 (<= (point)
-                                                     (progn
-                                                       (beginning-of-line)
-                                                       (if (looking-at 
outline-regexp)
+                                                 (beginning-of-line)
+                                                 (looking-at outline-regexp)))
+                                          (let ((heading (string-trim
+                                                          
(buffer-substring-no-properties
                                                            (match-end 0)
-                                                         0)))))
-                                          (save-excursion
-                                            (let ((heading (string-trim
-                                                            
(buffer-substring-no-properties
-                                                             (point)
-                                                             
(line-end-position))))
-                                                  (occur 0))
+                                                           
(line-end-position))))
+                                                (occur 0))
+                                            (save-excursion
                                               (end-of-line)
                                               (while (and (not (string-empty-p 
heading))
                                                           (search-backward 
heading nil t))
-                                                (setq occur (1+ occur)))
-                                              (list 'link-to-string-match
-                                                    heading occur 
buffer-file-name))))
+                                                (setq occur (1+ occur))))
+                                            (list 'link-to-string-match
+                                                  (if (zerop (current-column))
+                                                      heading
+                                                    (format "%s:L1:C%d" 
heading (current-column)))
+                                                  occur buffer-file-name)))
                                          (buffer-file-name
                                           (list 'link-to-file buffer-file-name 
(point)))
                                          ((derived-mode-p 'dired-mode)
diff --git a/hyrolo-logic.el b/hyrolo-logic.el
index 097efd474a..f96b779fb0 100644
--- a/hyrolo-logic.el
+++ b/hyrolo-logic.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    13-Jun-89 at 22:57:33
-;; Last-Mod:     14-Dec-23 at 00:22:05 by Bob Weiner
+;; Last-Mod:     26-Dec-23 at 20:46:10 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -51,7 +51,7 @@
 ;;
 ;;     (hyrolo-logic (hyrolo-and (hyrolo-not "Tool-And-Die") "secretary"))
 ;;
-;;   would find all non-Tool-And-Die Corp. secretaries in your rolo.
+;;   would find all non-Tool-And-Die Corporation secretaries in your rolo.
 ;;
 ;;   The logical matching routines are not at all optimal, but then most
 ;;   rolo files are not terribly lengthy either, so results are often
@@ -76,7 +76,7 @@
 
 ;;;###autoload
 (defun hyrolo-fgrep-logical (expr &optional count-only include-sub-entries 
no-sub-entries-out
-                                 whole-buffer-flag)
+                                 koutline-flag)
   "Display rolo entries matching EXPR.
 EXPR is a string that may contain sexpression logical prefix operators.
 If optional COUNT-ONLY is non-nil, don't display entries, return
@@ -85,30 +85,30 @@ flag is non-nil, SEXP will be applied across all 
sub-entries at
 once.  Default is to apply SEXP to each entry and sub-entry
 separately.  Entries are displayed with all of their sub-entries
 unless INCLUDE-SUB-ENTRIES is nil and optional NO-SUB-ENTRIES-OUT
-flag is non-nil.
+flag is non-nil.  With optional KOUTLINE-FLAG, map entries with
+`hyrolo-map-kotl' rather than `hyrolo-map-entries'.
 
 A complex example of EXPR might be:
-  (and (or (not time card) (xor (and french balloons) spanish)) teacher pet)
+  (and (or (not time card) (xor (and french \"red balloons\") spanish)) 
teacher pet)
 which means:
-  Match neither `time' nor `card'
-    or
-  Match exactly one of (`french' and `balloons') or (`spanish').
+  (Match neither `time' nor `card'
+     or
+   Match exactly one of (`french' and `red balloons') or (`spanish'))
     and
-  Match `teacher' and `pet'.
+  must include the terms `teacher' as well as `pet' to match.
 
-Either double quotes or parentheses may be used to group multiple words as a
-single argument."
+Double quotes may be used to group multiple words as a single argument."
   (interactive "sLogical rolo search: \nP\nP")
   (when (called-interactively-p 'any)
     (setq no-sub-entries-out (not no-sub-entries-out)))
   (let* ((case-fold-search t)
         (total-matches))
-    (cond (whole-buffer-flag
+    (cond (koutline-flag
           (setq expr (format "(hyrolo-logic (quote %S) nil %s %s %s %s)"
-                             expr count-only include-sub-entries
+                             (read expr) count-only include-sub-entries
                              no-sub-entries-out t))
           (setq total-matches (eval (read expr))))
-         ((string-match "\(\\(and\\|or\\|xor\\|not\\)\\>" expr)
+         ((string-match-p "\(\\(r-\\)?\\(and\\|or\\|xor\\|not\\)\\>" expr)
           (setq expr (replace-regexp-in-string "\(or " "\(| " expr nil t))
           (setq expr (replace-regexp-in-string "\(xor " "\(@ " expr nil t))
           (setq expr (replace-regexp-in-string "\(not " "\(! " expr nil t))
@@ -121,14 +121,12 @@ single argument."
 
           (setq expr (replace-regexp-in-string
                       "\"\\([^\"]*\\)\"" "{\\1}" expr nil nil))
-          (setq expr (replace-regexp-in-string
-                      "\(\\([^@|!&()][^()\"]*\\)\)" "{\\1}" expr nil nil))
           (let ((saved-expr expr))
             (while
                 (not (equal
                       saved-expr
                       (setq expr (replace-regexp-in-string
-                                  "\\(\\s-\\)\\([^{}()\" 
\t\n\r]+\\)\\([^{}()]*[()]\\)"
+                                  "\\(\\s-\\)\\([^{}()\" 
\t\n\r]+\\)\\([^{}()]*\\([()]\\|\\s-\\)\\)"
                                   "\\1\"\\2\"\\3" expr nil nil))))
               (setq saved-expr expr)))
           (setq expr (replace-regexp-in-string
@@ -144,8 +142,8 @@ single argument."
           (setq expr (replace-regexp-in-string "\(r-& " "\(hyrolo-r-and start 
end " expr nil t))
 
           (setq expr (format "(hyrolo-logic (quote %S) nil %s %s %s %s)"
-                             expr count-only include-sub-entries
-                             no-sub-entries-out whole-buffer-flag))
+                             (read expr) count-only include-sub-entries
+                             no-sub-entries-out koutline-flag))
           (setq total-matches (eval (read expr))))
          (t
           ;; Search string does not contain embedded logic
@@ -159,16 +157,21 @@ single argument."
     total-matches))
 
 (defun hyrolo-logic (sexp &optional in-bufs count-only include-sub-entries 
no-sub-entries-out
-                         whole-buffer-flag)
-  "Apply SEXP to all entries in optional IN-BUFS.
+                         koutline-flag)
+  "Apply SEXP to all entries in optional buffer list, IN-BUFS.
 Display entries where SEXP is non-nil.
 If IN-BUFS is nil, `hyrolo-file-list' is used.  If optional COUNT-ONLY is
 non-nil, don't display entries, return count of matching entries only.  If
 optional INCLUDE-SUB-ENTRIES flag is non-nil, apply SEXP across all sub-entries
 at once.  Default is to apply SEXP to each entry and sub-entry separately.
 Entries are displayed with all of their sub-entries unless INCLUDE-SUB-ENTRIES
-is nil and optional NO-SUB-ENTRIES-OUT flag is non-nil.  SEXP should utilize 
the
-free variables `start' and `end' as the region on which to operate.
+is nil and optional NO-SUB-ENTRIES-OUT flag is non-nil.  With optional
+KOUTLINE-FLAG, map entries with `hyrolo-map-kotl' rather than
+`hyrolo-map-entries'.
+
+SEXP should utilize the free variables `start' and `end' as the region on which
+to operate.
+
 Return the number of evaluations of SEXP that match entries."
   (let* ((display-buf (unless count-only
                        (prog1 (hyrolo-set-display-buffer)
@@ -184,7 +187,7 @@ Return the number of evaluations of SEXP that match 
entries."
             (setq buf-or-file (or (get-buffer buf-or-file)
                                   (funcall hyrolo-find-file-noselect-function 
buf-or-file)))
             (hyrolo-map-logic sexp buf-or-file count-only include-sub-entries
-                              no-sub-entries-out whole-buffer-flag))
+                              no-sub-entries-out koutline-flag))
           (cond ((null in-bufs) (hyrolo-get-file-list))
                 ((listp in-bufs) in-bufs)
                 ((list in-bufs)))))
@@ -196,7 +199,7 @@ Return the number of evaluations of SEXP that match 
entries."
 
 (defun hyrolo-map-logic (sexp hyrolo-buf &optional count-only
                         include-sub-entries _no-sub-entries-out
-                        whole-buffer-flag)
+                        koutline-flag)
   "Apply logical SEXP to each entry in HYROLO-BUF.
 Write out matching entries to `hyrolo-display-buffer'.  If
 optional COUNT-ONLY is non-nil, don't display entries, return
@@ -204,13 +207,14 @@ count of matching entries only.  If optional 
INCLUDE-SUB-ENTRIES
 flag is non-nil, apply SEXP across all sub-entries at once.
 Default is to apply SEXP to each entry and sub-entry separately.
 Entries are displayed with all of their sub-entries unless
-INCLUDE-SUB-ENTRIES is nil and optional NO-SUB-ENTRIES-OUT flag
-is non-nil.  With optional WHOLE-BUFFER-FLAG, map entries with
+INCLUDE-SUB-ENTRIES is nil and optional _NO-SUB-ENTRIES-OUT flag
+is non-nil.  With optional KOUTLINE-FLAG, map entries with
 `hyrolo-map-kotl' rather than `hyrolo-map-entries'.
 
 SEXP should utilize the free variables `start' and `end' as the
-region on which to operate.  Return the number of evaluations of
-SEXP that match entries."
+region on which to operate.
+
+Return the number of evaluations of SEXP that match entries."
   (setq hyrolo-buf (or (get-buffer hyrolo-buf) hyrolo-buf))
   (if (or (bufferp hyrolo-buf)
          (when (file-exists-p hyrolo-buf)
@@ -228,7 +232,7 @@ SEXP that match entries."
              (when (re-search-forward hyrolo-hdr-regexp nil t 2)
                (forward-line)
                (setq hdr-pos (cons (point-min) (point))))
-             (setq num-found (if whole-buffer-flag
+             (setq num-found (if koutline-flag
                                  (hyrolo-map-kotl
                                   sexp hyrolo-buf display-buf hdr-pos 
count-only include-sub-entries)
                                (hyrolo-map-entries
@@ -242,6 +246,22 @@ SEXP that match entries."
 ;;
 
 (defun hyrolo-map-entries (sexp hyrolo-buf display-buf hdr-pos &optional 
count-only include-sub-entries)
+  "Apply logical SEXP to each entry in HYROLO-BUF.
+Write out matching entries to DISPLAY-BUF.  HDR-POS is a cons of
+\(start . end) positions of HYROLO-BUF's file header, if any;
+otherwise, nil.
+
+If optional COUNT-ONLY is non-nil, don't display entries, return
+count of matching entries only.  If optional INCLUDE-SUB-ENTRIES
+flag is non-nil, apply SEXP across all sub-entries at once.
+Default is to apply SEXP to each entry and sub-entry separately.
+Entries are displayed with all of their sub-entries unless
+INCLUDE-SUB-ENTRIES is nil.
+
+SEXP should utilize the free variables `start' and `end' as the
+region on which to operate.
+
+Return the number of evaluations of SEXP that match entries."
   (let* ((start)
         (end)
         (end-entry-hdr)
@@ -281,6 +301,22 @@ SEXP that match entries."
     num-found))
 
 (defun hyrolo-map-kotl (sexp hyrolo-buf display-buf hdr-pos &optional 
count-only include-sub-entries)
+  "Apply logical SEXP to each entry in HYROLO-BUF.
+Write out matching entries to DISPLAY-BUF.  HDR-POS is a cons of
+\(start . end) positions of HYROLO-BUF's file header, if any;
+otherwise, nil.
+
+If optional COUNT-ONLY is non-nil, don't display entries, return
+count of matching entries only.  If optional INCLUDE-SUB-ENTRIES
+flag is non-nil, apply SEXP across all sub-entries at once.
+Default is to apply SEXP to each entry and sub-entry separately.
+Entries are displayed with all of their sub-entries unless
+INCLUDE-SUB-ENTRIES is nil.
+
+SEXP should utilize the free variables `start' and `end' as the
+region on which to operate.
+
+Return the number of evaluations of SEXP that match entries."
   (let* ((start)
         (end)
         (end-entry-hdr)
@@ -325,8 +361,9 @@ SEXP that match entries."
 ;; Send them as parts of an expression to `hyrolo-logic'.
 
 (defun hyrolo-not (start end &rest pat-list)
-  "Logical <not> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a string."
+  "Logical <not> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+string."
   (save-restriction
     (narrow-to-region start end)
     (let ((pat))
@@ -339,8 +376,9 @@ Each element may be t, nil, or a string."
       (not pat-list))))
 
 (defun hyrolo-or (start end &rest pat-list)
-  "Logical <or> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a string."
+  "Logical <or> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+string."
   (if (memq t pat-list)
       t
     (save-restriction
@@ -355,8 +393,9 @@ Each element may be t, nil, or a string."
        (if pat-list t nil)))))
 
 (defun hyrolo-xor (start end &rest pat-list)
-  "Logical <xor> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a string."
+  "Logical <xor> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+string."
   (save-restriction
     (narrow-to-region start end)
     (let ((pat)
@@ -373,8 +412,9 @@ Each element may be t, nil, or a string."
       (= matches 1))))
 
 (defun hyrolo-and (start end &rest pat-list)
-  "Logical <and> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a string."
+  "Logical <and> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+string."
   (unless (memq nil pat-list)
     (save-restriction
       (narrow-to-region start end)
@@ -390,8 +430,9 @@ Each element may be t, nil, or a string."
 ;; Work with regular expression patterns rather than strings
 
 (defun hyrolo-r-not (start end &rest pat-list)
-  "Logical <not> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a regular expression."
+  "Logical <not> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+regular expression."
   (save-restriction
     (narrow-to-region start end)
     (let ((pat))
@@ -404,8 +445,9 @@ Each element may be t, nil, or a regular expression."
       (not pat-list))))
 
 (defun hyrolo-r-or (start end &rest pat-list)
-  "Logical <or> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a regular expression."
+  "Logical <or> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+regular expression."
   (if (memq t pat-list)
       t
     (save-restriction
@@ -420,8 +462,9 @@ Each element may be t, nil, or a regular expression."
        (if pat-list t nil)))))
 
 (defun hyrolo-r-xor (start end &rest pat-list)
-  "Logical <xor> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a regular expression."
+  "Logical <xor> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+regular expression."
   (save-restriction
     (narrow-to-region start end)
     (let ((pat)
@@ -438,8 +481,9 @@ Each element may be t, nil, or a regular expression."
       (= matches 1))))
 
 (defun hyrolo-r-and (start end &rest pat-list)
-  "Logical <and> rolo entry filter.  PAT-LIST is a list of pattern elements.
-Each element may be t, nil, or a regular expression."
+  "Logical <and> rolo entry filter applied between START and END positions.
+PAT-LIST is a list of pattern elements.  Each element may be t, nil, or a
+regular expression."
   (unless (memq nil pat-list)
     (save-restriction
       (narrow-to-region start end)
diff --git a/hyrolo.el b/hyrolo.el
index 8b9866f41f..e2ae608772 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:     26-Dec-23 at 01:45:22 by Bob Weiner
+;; Last-Mod:     26-Dec-23 at 22:03:08 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -646,7 +646,7 @@ the logical sexpression matching."
   (interactive "sFind rolo string (or logical sexpression): \nP")
   (setq string (string-trim string "\"" "\""))
   (let ((total-matches 0))
-    (if (string-match "\(\\(and\\|or\\|xor\\|not\\)\\>" string)
+    (if (string-match-p "\(\\(r-\\)?\\(and\\|or\\|xor\\|not\\)\\>" string)
        (progn
          ;; Search string contains embedded logic operators.
          ;; First try to match logical sexpression within a single
@@ -804,9 +804,8 @@ With optional prefix ARG, do an fgrep string match instead 
of a regexp match."
 
 (defun hyrolo-isearch (&optional arg)
   "Interactively search forward for the next occurrence of current match 
string.
-Then add characters to further narrow the search.  With optional
-prefix ARG non-nil, search for the current match regular
-expression rather than string."
+Then add characters to further narrow the search.  With optional prefix ARG
+non-nil, search for the current match regular expression rather than string."
   (interactive "P")
   (if arg
       (hyrolo-isearch-for-regexp hyrolo-match-regexp t)
@@ -820,9 +819,8 @@ expression rather than string."
 
 (defun hyrolo-isearch-regexp (&optional arg)
   "Interactively search forward for the next occurrence of current match 
string.
-Then add characters to further narrow the search.  With optional
-prefix ARG non-nil, search for the current match regular
-expression rather than string."
+Then add characters to further narrow the search.  With optional prefix ARG
+non-nil, search for the current match regular expression rather than string."
   (interactive "P")
   (if arg
       (hyrolo-isearch-for-regexp hyrolo-match-regexp t)
@@ -1604,8 +1602,18 @@ Stop at the first and last subheadings of a superior 
heading."
   (interactive "p")
   (hyrolo-move-forward #'outline-forward-same-level arg))
 
+(defun hyrolo-hdr-to-first-line-p ()
+  "If point is on a file hdr single text/sep/loc line, go to its first line.
+Return t in such cases.  Otherwise, don't move and return nil.
+
+The header includes lines matching both `hyrolo-hdr-regexp' and
+`hbut:source-prefix'."
+  (when (and (hyrolo-hdr-move-after-p)
+            (re-search-backward hyrolo-hdr-regexp nil t 2))
+    t))
+
 (defun hyrolo-hdr-to-last-line-p ()
-  "If point is on a file hdr separator/loc line, move to start of its last 
line.
+  "If point is on a file hdr single text/sep/loc line, go to its last line.
 Return t in such cases.  Otherwise, don't move and return nil.
 
 The header includes lines matching both `hyrolo-hdr-regexp' and
@@ -1614,6 +1622,10 @@ The header includes lines matching both 
`hyrolo-hdr-regexp' and
     (forward-line -1)
     t))
 
+(defun hyrolo-hdr-in-p ()
+  "If point is on a file hdr single text/separator/loc line, return t, else 
nil."
+  (save-excursion (hyrolo-hdr-move-after-p)))
+
 (defun hyrolo-hdr-move-after-p ()
   "If point is on a file hdr separator/loc line, move past the hdr and return 
t.
 Otherwise, don't move and return nil."
@@ -1625,6 +1637,13 @@ Otherwise, don't move and return nil."
             (or (when (looking-at hyrolo-hdr-regexp)
                   (cl-incf hdr-delim-count))
                 (when (looking-at hbut:source-prefix)
+                  (cl-incf loc-count))
+                ;; Handle textual single line between header delimiter lines
+                (when (and (forward-line -1)
+                           (looking-at hyrolo-hdr-regexp)
+                           (forward-line 2)
+                           (looking-at hyrolo-hdr-regexp))
+                  (forward-line -1)
                   (cl-incf loc-count))))
       (forward-line 1))
     (when (and (/= (point) opoint) (< hdr-delim-count 2) (zerop loc-count))
@@ -1985,20 +2004,29 @@ of the current heading, or to 1 if the current line is 
not a heading."
 
 (defun hyrolo-outline-hide-subtree ()
   "Move back to the start of current subtree and hide everything after the 
heading.
+If within a file header, hide the whole file after the end of the current line.
 
 Necessary, since with reveal-mode active, outline-hide-subtree works
 only if on the heading line of the subtree."
   (interactive)
-  (hyrolo-funcall-match
-   (lambda ()
-     (let ((opoint (point)))
-       (forward-line 0)
-       (unless (looking-at outline-regexp)
-        (outline-previous-visible-heading 1))
-       (if (looking-at outline-regexp)
-          (outline-hide-subtree)
-        (goto-char opoint))))
-   t))
+  (if (and (hyrolo-hdr-in-p)
+          (eq (current-buffer) (get-buffer hyrolo-display-buffer)))
+      (cl-destructuring-bind (start end)
+         (hyrolo-cache-location-start-and-end)
+       (setq start (line-end-position)
+             end (1- (or end (point-max))))
+       ;; Hide region
+       (outline-flag-region start end t))
+    (hyrolo-funcall-match
+     (lambda ()
+       (let ((opoint (point)))
+        (forward-line 0)
+        (unless (looking-at outline-regexp)
+          (outline-previous-visible-heading 1))
+        (if (looking-at outline-regexp)
+            (outline-hide-subtree)
+          (goto-char opoint))))
+     t)))
 
 (defun hyrolo-outline-insert-heading ()
   "Insert a new heading at same depth at point."
@@ -2075,24 +2103,60 @@ Show the heading too, if it is currently invisible."
   (hyrolo-funcall-match #'outline-show-entry t))
 
 (defun hyrolo-outline-show-subtree ()
-  "Show everything after this heading at deeper levels."
+  "Show everything after this heading at deeper levels.
+If within a file header, show the whole file starting with the header."
   (interactive)
-  (hyrolo-funcall-match #'outline-show-subtree t))
+  (if (and (hyrolo-hdr-in-p)
+          (eq (current-buffer) (get-buffer hyrolo-display-buffer)))
+      (cl-destructuring-bind (start end)
+         (hyrolo-cache-location-start-and-end)
+       (setq start (or start (line-beginning-position))
+             end (1- (or end (point-max))))
+       ;; Hide region
+       (outline-flag-region start end nil))
+    (hyrolo-funcall-match #'outline-show-subtree t)))
 
 (defun hyrolo-outline-up-heading (arg &optional invisible-ok)
   "Move to the visible heading line of which the present line is a subheading.
 With argument, move up ARG levels.
 If INVISIBLE-OK is non-nil, also consider invisible lines."
   (interactive "p")
-  (hyrolo-move-backward #'outline-up-heading arg invisible-ok))
+  (hyrolo-funcall-match
+   (lambda ()
+     (and (eq this-command 'hyrolo-outline-up-heading)
+         (or (eq last-command 'hyrolo-outline-up-heading) (push-mark)))
+     (outline-back-to-heading invisible-ok)
+     (let ((start-level (funcall outline-level))
+          (start-point (point)))
+       (when (<= start-level 1)
+        (error "Already at top level of this outline tree"))
+       (while (and (> start-level 1) (> arg 0) (not (bobp)))
+        (let ((level start-level)
+              (opoint (point)))
+          (while (not (or (< level start-level) (bobp)))
+            (if invisible-ok
+                (outline-previous-heading)
+              (outline-previous-visible-heading 1))
+            (setq level (funcall outline-level))
+            (when (not (looking-at hyrolo-entry-regexp))
+              ;; Have moved into a file header; move back to opoint and stop
+              (goto-char opoint)
+              ;; Exit
+              (when (= opoint start-point)
+                (error "Already at top level of this outline tree"))
+              (setq level -1)))
+          (setq start-level level))
+        (setq arg (- arg 1))))
+     (looking-at outline-regexp))
+   t))
 
 (defun hyrolo-to (name &optional file-or-buf-list)
   "Move point to entry for NAME within optional FILE-OR-BUF-LIST.
 \(hyrolo-get-file-or-buf-list) provides the default when
-FILE-OR-BUF-LIST is nil.  Leave point immediately after match for
-NAME within an entry.  Switches internal current buffer but does
-not alter the frame.  Return point where matching entry begins or
-nil if not found."
+FILE-OR-BUF-LIST is nil.  Leave point immediately after the first
+match of NAME within an entry.  Switches internal current buffer
+but does not alter the frame.  Return point where matching entry
+begins or nil if not found."
   (when (or (not (stringp name)) (string-blank-p name))
     (error "(hyrolo-to): Invalid name: `%s'" name))
   (unless file-or-buf-list
@@ -2115,13 +2179,14 @@ nil if not found."
                      (or (get-file-buffer file-or-buf) 
(hyrolo-find-file-noselect file-or-buf))
                    ;; must be a buffer
                    file-or-buf))
-      (let ((case-fold-search t) (real-name name) (parent "") (level) end)
+      (let ((case-fold-search t) (real-name name) (parent "") (level)
+           col-num end line line-and-col)
        (hyrolo-widen)
        (goto-char (point-min))
-       (if (get-text-property 0 'hyrolo-line-entry name)
+       (if (setq col-num (get-text-property 0 'hyrolo-line-entry name))
            ;; this is a whole line to find without any entry delimiters
            (when (search-forward name nil t)
-             (forward-line 0)
+             (move-to-column col-num)
              (setq found (point)))
          (while (string-match "\\`[^\]\[<>{}\"]*/" name)
            (setq end (1- (match-end 0))
@@ -2158,6 +2223,12 @@ nil if not found."
                                         ;; Jump to non-first line within an 
entry
                                         (progn (back-to-indentation)
                                                (looking-at (regexp-quote 
name))))
+                                (when (setq line-and-col (get-text-property 0 
'hyrolo-name-entry name))
+                                  ;; this is a whole line to find except for 
leading whitespace
+                                  (setq line (car line-and-col)
+                                        col-num (cdr line-and-col))
+                                  (when (search-forward line nil t)
+                                    (move-to-column col-num)))
                                 (when (derived-mode-p 'kotl-mode)
                                   (kotl-mode:to-valid-position))
                                 (point)))))))))
@@ -2429,11 +2500,15 @@ Name is returned as `last, first-and-middle'."
   "Iff point is at or within an entry in `hyrolo-display-buffer', return 
non-nil.
 Any non-nil value returned is a cons of (<entry-name> . <entry-source>)."
   (let ((entry-source (hbut:get-key-src t))
-       (opoint (point)))
+       (col-num (current-column))
+       (line-start (line-beginning-position))
+       (line-end (line-end-position)))
     (when entry-source
       (save-excursion
        (forward-line 0)
-       (let (case-fold-search)
+       (let (case-fold-search
+             entry-line
+             entry-name)
          (if (and (or (looking-at hyrolo-hdr-and-entry-regexp)
                       (re-search-backward hyrolo-hdr-and-entry-regexp nil t))
                   (save-match-data (not (looking-at hyrolo-hdr-regexp))))
@@ -2441,17 +2516,21 @@ Any non-nil value returned is a cons of (<entry-name> . 
<entry-source>)."
                     (skip-chars-forward " \t")
                     (when (or (looking-at "[^ \t\n\r]+ ?, ?[^ \t\n\r]+")
                               (looking-at "\\( ?[^ \t\n\r]+\\)+"))
-                      (cons (match-string-no-properties 0) entry-source)))
+                      (setq entry-name (match-string-no-properties 0)
+                            entry-line (buffer-substring-no-properties 
line-start line-end))
+                      ;; Add a text-property of 'hyrolo-name-entry with
+                      ;; value of (entry-line . current-column) to entry-name.
+                      (put-text-property 0 1 'hyrolo-name-entry
+                                         (cons entry-line col-num)
+                                         entry-name)
+                      (cons entry-name entry-source)))
            ;; If not blank, return the current line as the name with
-           ;; a text-property of 'hyrolo-line-entry with value t.
-           (goto-char opoint)
-           (forward-line 0)
+           ;; a text-property of 'hyrolo-line-entry with value of 
(current-column).
+           (goto-char line-start)
            (when (not (looking-at "[ \t\f]*$"))
-             (let* ((line-start (point))
-                    (line-end   (line-end-position))
-                    (entry-name (buffer-substring line-start line-end)))
-               (put-text-property 0 1 'hyrolo-line-entry t entry-name)
-               (cons entry-name entry-source)))))))))
+             (setq entry-line (buffer-substring-no-properties line-start 
line-end))
+             (put-text-property 0 1 'hyrolo-line-entry col-num entry-line)
+             (cons entry-line entry-source))))))))
 
 (define-derived-mode hyrolo-org-mode outline-mode "HyRoloOrg"
   "Basic Org mode for use in HyRolo display match searches."
@@ -2631,6 +2710,8 @@ trailing periods and whitespace.
 Point must be at the beginning of a heading line and a regexp match to
 `outline-regexp' must have been done prior to calling this."
   (or (cdr (assoc (match-string-no-properties 0) outline-heading-alist))
+      (when (looking-at-p hyrolo-hdr-regexp) 1)
+      (when (looking-at-p hbut:source-prefix) 1)
       (1- (- (match-end 0) (match-beginning 0)))))
 
 ;;; ************************************************************************
@@ -2901,6 +2982,8 @@ Add `hyrolo-hdr-regexp' to `hyrolo-hdr-and-entry-regexp' 
and `outline-regexp'."
      outline-mode-prefix-map)))
 
 ;;; Integrate reveal-mode with HyRolo.
+;;; NOTE: !! TODO: This does not yet work so is not enabled in `hyrolo-mode' 
yet,
+;;; thus the `reveal-post-command' below is not yet used.
 
 ;; Note that `outline-reveal-toggle-invisible' is the function
 ;; stored in the `outline' `reveal-toggle-invisible' property.  It
diff --git a/man/hyperbole.html b/man/hyperbole.html
index 027b53f4d2..1b83abf2bf 100644
--- a/man/hyperbole.html
+++ b/man/hyperbole.html
@@ -382,7 +382,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</P>
 
 <PRE>
 Edition 9.0.0
-Printed December 25, 2023.
+Printed December 26, 2023.
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -2983,7 +2983,7 @@ Key is pressed:
 <li> If on an Org todo keyword, cycle through the keywords in
 that set or if final done keyword, remove it.
 
-</li><li> If on an Org agenda item, jump to the item for editing.
+</li><li> If on an Org agenda view item, jump to the item for editing.
 
 </li><li> Within a radio or internal target or a link to it, jump between
 the target and the first link to it, allowing two-way navigation.
@@ -3015,7 +3015,7 @@ except in these contexts:
 <li> If on an Org todo keyword, move to the first todo keyword in
 the next set, if any.
 
-</li><li> If on an Org mode link or agenda item, display Hyperbole
+</li><li> If on an Org mode link or agenda view item, display Hyperbole
 context-sensitive help.
 
 </li><li> On a Hyperbole button, performs the Assist Key function, generally
@@ -7374,12 +7374,17 @@ simple parenthesis delimited prefix format is used with 
the following
 logical operators.
 </p>
 <div class="example">
-<pre class="example">Operator Name   Number of Arguments    Description
+<pre class="example">Operator Name   Num of Args   Description
 =====================================================================
-and             two or more            Match entries with all args
-or              two or more            Match entries with any args
-xor             two or more            Match entries with 1 arg only
-not             one                    Match entries without the arg
+and             two or more   Match entries with all str args
+or              two or more   Match entries with any str args
+xor             two or more   Match entries with exactly 1 str arg
+not             one           Match entries without the str arg
+
+r-and           two or more   Match entries with all regexp args
+r-or            two or more   Match entries with any regexp args
+r-xor           two or more   Match entries with exactly 1 regexp arg
+r-not           one           Match entries without the regexp arg
 =====================================================================
 </pre></div>
 
@@ -7400,10 +7405,22 @@ the 408 area code have been contacted and you want to 
see who else
 you should contact.
 </p>
 <div class="example">
-<pre class="example">(xor 408- client)
+<pre class="example">(xor client 408- )
 </pre></div>
 
+<p>When using the regular expression operators, your operands are sent as
+regular expressions without the need to quote single words or
+special regular expression characters like &rsquo;*&rsquo; and 
&rsquo;?&rsquo;.  Use double
+quote marks to include a phrase or multi-word regular expression pattern
+to match.  For example:
+</p>
+<div class="example">
+<pre class="example">(r-and HyRolo &quot;Red Buttons?&quot;)
+</pre></div>
 
+<p>would match entries that contain both &quot;HyRolo&quot; and either 
&quot;Red Button&quot; or
+&quot;Red Buttons&quot;.
+</p>
 <hr>
 <a name="HyRolo-Keys"></a>
 <div class="header">
@@ -7483,12 +7500,18 @@ will work.
 <a name="index-rolo_002c-auto_002dexpanding-entries"></a>
 <a name="index-rolo_002c-hiding-entries"></a>
 <a name="index-rolo_002c-showing-entries"></a>
-<p>Press <kbd>{s}</kbd> to show (expand) the entry at point.  Use 
<kbd>{h}</kbd> to hide
-(collapse) the entry.  Press <kbd>{a}</kbd> to expand all entries in the
-buffer.  If an entry is collapsed/hidden, moving to any hidden part
-auto-expands it and then re-collapses it when point is moved to another
-entry (just like isearch).  A side-effect of this is that the <kbd>{h}</kbd>
-hide entry subtree command now moves to the beginning of the entry.
+<p>Press <kbd>{s}</kbd> to show (expand) the entry at point if it is hidden
+(collapsed).  If point is on a file header, this will expand the header
+and show the entire set of matched entries for the file.  The <kbd>{h}</kbd>
+does the reverse and hides entries.  Within file headers it hides the
+file from the end of the current line forward, so you can leave parts of
+the header displayed, if desired.  Press <kbd>{a}</kbd> to expand all entries
+in the buffer across all matched files.
+</p>
+
+<p>Please note that to facilitate further use of movement by entry commands,
+the <kbd>{h}</kbd> hide entry subtree command leaves point at the beginning of
+the entry (does not apply in file headers).
 </p>
 <p>Other keys are defined to help you work with matching entries.
 </p>
@@ -7567,6 +7590,7 @@ move to the end of the entire subtree.
 <a name="index-rolo_002c-e"></a>
 <a name="index-rolo_002c-editing"></a>
 <a name="index-datestamps"></a>
+<a name="index-date-format"></a>
 <a name="index-rolo_002c-datestamps"></a>
 <a name="index-customize_002c-rolo-datestamps"></a>
 <a name="index-menu-item_002c-Rolo_002fToggle_002dRolo_002dDates"></a>
@@ -7574,14 +7598,15 @@ move to the end of the entire subtree.
 <a name="index-customize_002c-rolo-additions"></a>
 <a name="index-hyrolo_002dedit_002dhook"></a>
 <a name="index-hyrolo_002dadd_002dhook"></a>
-<p>Use the <kbd>{e}</kbd> key to edit the current entry within your personal
-rolo file.  A datestamp will automatically be added or updated at the end
-of the entry, unless this feature has been turned off via the
+<a name="index-hyrolo_002ddate_002dformat"></a>
+<p>Use the <kbd>{e}</kbd> key to jump to and edit the current line in its 
original
+source file.  If on a rolo entry and it contains a datestamp at its end,
+update the datestamp, unless this feature has been turned off via the
 Cust/Toggle-Rolo-Dates menu item.  The variable, <code>hyrolo-edit-hook</code>,
-is evaluated after the update of the entry datestamp.  This allows
-programmed modification of the way rolo edits work.  The variable,
-<code>hyrolo-add-hook</code>, works the same way but is evaluated when a new
-entry is first added.
+performs this update.  This allows programmed modification of the way
+rolo edits work.  The variable, <code>hyrolo-add-hook</code>, works the same
+way but is evaluated when a new entry is first added.  The format of the
+datestamp is specified by <code>hyrolo-date-format</code>.
 </p>
 <a name="index-rolo_002c-q"></a>
 <a name="index-rolo_002c-quitting"></a>
@@ -11662,7 +11687,7 @@ Next: <a href="#Smart-Key-_002d-Ivy" accesskey="n" 
rel="next">Smart Key - Ivy</a
      (1) If on an Org todo keyword, cycle through the keywords in
          that set or if final done keyword, remove it.
 
-     (2) If on an Org agenda item, jump to the item for editing.
+     (2) If on an Org agenda view item, jump to the item for editing.
 
      (3) Within a radio or internal target or a link to it, jump between
          the target and the first link to it, allowing two-way navigation.
@@ -11694,8 +11719,8 @@ Next: <a href="#Smart-Key-_002d-Ivy" accesskey="n" 
rel="next">Smart Key - Ivy</a
      (1) If on an Org todo keyword, move to the first todo keyword in
          the next set, if any.
 
-     (2) If on an Org mode link, ID reference or agenda item, display Hyperbole
-         context-sensitive help.
+     (2) If on an Org mode link, ID reference or agenda view item, display
+         Hyperbole context-sensitive help.
 
      (3) On a Hyperbole button, perform the Assist Key function, generally
          showing help for the button.
@@ -14563,6 +14588,7 @@ Next: <a href="#Concept-Index" accesskey="n" 
rel="next">Concept Index</a>, Previ
 <tr><td></td><td valign="top"><a 
href="#index-hyrolo_002dadd_002dhook">hyrolo-add-hook</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#HyRolo-Keys">HyRolo Keys</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hyrolo_002dadd_002dhook-1">hyrolo-add-hook</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hyrolo_002dconsult_002dgrep"><code>hyrolo-consult-grep</code></a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#HyRolo-Menu">HyRolo Menu</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-hyrolo_002ddate_002dformat">hyrolo-date-format</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#HyRolo-Keys">HyRolo Keys</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hyrolo_002ddisplay_002dformat_002dfunction">hyrolo-display-format-function</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#HyRolo-Settings">HyRolo Settings</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hyrolo_002ddisplay_002dhook">hyrolo-display-hook</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hyrolo_002ddisplay_002dmatches"><code>hyrolo-display-matches</code></a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#HyRolo-Menu">HyRolo Menu</a></td></tr>
@@ -15206,6 +15232,7 @@ Previous: <a href="#Function" accesskey="p" 
rel="prev">Function</a>, Up: <a href
 <tr><td colspan="4"> <hr></td></tr>
 <tr><th><a name="Concept-Index_cp_letter-D">D</a></th><td></td><td></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-database">database</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Key-_002d-RDB-Mode">Smart Key - RDB Mode</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-date-format">date 
format</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Keys">HyRolo 
Keys</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-datestamps">datestamps</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyRolo-Keys">HyRolo Keys</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-dbx">dbx</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-debugging-Smart-Keys">debugging 
Smart Keys</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Key-Debugging">Smart Key Debugging</a></td></tr>
diff --git a/man/hyperbole.info b/man/hyperbole.info
index 8d541e8b06..bee0e06c60 100644
Binary files a/man/hyperbole.info and b/man/hyperbole.info differ
diff --git a/man/hyperbole.pdf b/man/hyperbole.pdf
index 607290901b..8ce9cace0f 100644
Binary files a/man/hyperbole.pdf and b/man/hyperbole.pdf differ
diff --git a/man/hyperbole.texi b/man/hyperbole.texi
index e94569e7f2..1c763c438c 100644
--- a/man/hyperbole.texi
+++ b/man/hyperbole.texi
@@ -7,7 +7,7 @@
 @c Author:       Bob Weiner
 @c
 @c Orig-Date:     6-Nov-91 at 11:18:03
-@c Last-Mod:     25-Dec-23 at 22:39:22 by Bob Weiner
+@c Last-Mod:     26-Dec-23 at 20:39:20 by Bob Weiner
 
 @c %**start of header (This is for running Texinfo on a region.)
 @setfilename hyperbole.info
@@ -156,7 +156,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</P>
 
 <PRE>
 Edition 9.0.0
-Printed December 25, 2023.
+Printed December 26, 2023.
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -198,7 +198,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 @example
 Edition 9.0.0
-December 25, 2023
+December 26, 2023
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -2302,7 +2302,7 @@ If on an Org todo keyword, cycle through the keywords in
 that set or if final done keyword, remove it.
 
 @item
-If on an Org agenda item, jump to the item for editing.
+If on an Org agenda view item, jump to the item for editing.
 
 @item
 Within a radio or internal target or a link to it, jump between
@@ -2345,7 +2345,7 @@ If on an Org todo keyword, move to the first todo keyword 
in
 the next set, if any.
 
 @item
-If on an Org mode link or agenda item, display Hyperbole
+If on an Org mode link or agenda view item, display Hyperbole
 context-sensitive help.
 
 @item
@@ -6183,12 +6183,17 @@ logical operators.
 
 @example
 @group
-Operator Name   Number of Arguments    Description
+Operator Name   Num of Args   Description
 =====================================================================
-and             two or more            Match entries with all args
-or              two or more            Match entries with any args
-xor             two or more            Match entries with 1 arg only
-not             one                    Match entries without the arg
+and             two or more   Match entries with all str args
+or              two or more   Match entries with any str args
+xor             two or more   Match entries with exactly 1 str arg
+not             one           Match entries without the str arg
+
+r-and           two or more   Match entries with all regexp args
+r-or            two or more   Match entries with any regexp args
+r-xor           two or more   Match entries with exactly 1 regexp arg
+r-not           one           Match entries without the regexp arg
 =====================================================================
 @end group
 @end example
@@ -6212,9 +6217,22 @@ the 408 area code have been contacted and you want to 
see who else
 you should contact.
 
 @example
-(xor 408- client)
+(xor client 408- )
 @end example
 
+When using the regular expression operators, your operands are sent as
+regular expressions without the need to quote single words or
+special regular expression characters like '*' and '?'.  Use double
+quote marks to include a phrase or multi-word regular expression pattern
+to match.  For example:
+
+@example
+(r-and HyRolo "Red Buttons?")
+@end example
+
+@noindent
+would match entries that contain both "HyRolo" and either "Red Button" or
+"Red Buttons".
 
 @node HyRolo Keys, HyRolo Settings, HyRolo Searching, HyRolo
 @section   HyRolo Keys
@@ -6289,12 +6307,21 @@ will work.
 @cindex rolo, auto-expanding entries
 @cindex rolo, hiding entries
 @cindex rolo, showing entries
-Press @bkbd{s} to show (expand) the entry at point.  Use @bkbd{h} to hide
-(collapse) the entry.  Press @bkbd{a} to expand all entries in the
-buffer.  If an entry is collapsed/hidden, moving to any hidden part
-auto-expands it and then re-collapses it when point is moved to another
-entry (just like isearch).  A side-effect of this is that the @bkbd{h}
-hide entry subtree command now moves to the beginning of the entry.
+Press @bkbd{s} to show (expand) the entry at point if it is hidden
+(collapsed).  If point is on a file header, this will expand the header
+and show the entire set of matched entries for the file.  The @bkbd{h}
+does the reverse and hides entries.  Within file headers it hides the
+file from the end of the current line forward, so you can leave parts of
+the header displayed, if desired.  Press @bkbd{a} to expand all entries
+in the buffer across all matched files.
+
+@c If an entry is collapsed/hidden, moving to any hidden part auto-expands
+@c it and then re-collapses it when point is moved to another entry (just
+@c like isearch).
+
+Please note that to facilitate further use of movement by entry commands,
+the @bkbd{h} hide entry subtree command leaves point at the beginning of
+the entry (does not apply in file headers).
 
 @noindent
 Other keys are defined to help you work with matching entries.
@@ -6347,6 +6374,7 @@ Scroll forward a windowful.
 @kindex rolo, e
 @cindex rolo, editing
 @cindex datestamps
+@cindex date format
 @cindex rolo, datestamps
 @cindex customize, rolo datestamps
 @cindex menu item, Rolo/Toggle-Rolo-Dates
@@ -6354,14 +6382,15 @@ Scroll forward a windowful.
 @cindex customize, rolo additions
 @vindex hyrolo-edit-hook
 @vindex hyrolo-add-hook
-Use the @bkbd{e} key to edit the current entry within your personal
-rolo file.  A datestamp will automatically be added or updated at the end
-of the entry, unless this feature has been turned off via the
+@vindex hyrolo-date-format
+Use the @bkbd{e} key to jump to and edit the current line in its original
+source file.  If on a rolo entry and it contains a datestamp at its end,
+update the datestamp, unless this feature has been turned off via the
 Cust/Toggle-Rolo-Dates menu item.  The variable, @code{hyrolo-edit-hook},
-is evaluated after the update of the entry datestamp.  This allows
-programmed modification of the way rolo edits work.  The variable,
-@code{hyrolo-add-hook}, works the same way but is evaluated when a new
-entry is first added.
+performs this update.  This allows programmed modification of the way
+rolo edits work.  The variable, @code{hyrolo-add-hook}, works the same
+way but is evaluated when a new entry is first added.  The format of the
+datestamp is specified by @code{hyrolo-date-format}.
 
 @kindex rolo, q
 @cindex rolo, quitting
@@ -9834,7 +9863,7 @@ When in an Org mode context and 
@code{hsys-org-enable-smart-keys} is non-nil:
      (1) If on an Org todo keyword, cycle through the keywords in
          that set or if final done keyword, remove it.
 
-     (2) If on an Org agenda item, jump to the item for editing.
+     (2) If on an Org agenda view item, jump to the item for editing.
 
      (3) Within a radio or internal target or a link to it, jump between
          the target and the first link to it, allowing two-way navigation.
@@ -9868,8 +9897,8 @@ When in an Org mode context and 
@code{hsys-org-enable-smart-keys} is non-nil:
      (1) If on an Org todo keyword, move to the first todo keyword in
          the next set, if any.
 
-     (2) If on an Org mode link, ID reference or agenda item, display Hyperbole
-         context-sensitive help.
+     (2) If on an Org mode link, ID reference or agenda view item, display
+         Hyperbole context-sensitive help.
 
      (3) On a Hyperbole button, perform the Assist Key function, generally
          showing help for the button.

Reply via email to