emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/hyperbole 158a407228 5/5: Merge pull request #407 from


From: ELPA Syncer
Subject: [elpa] externals/hyperbole 158a407228 5/5: Merge pull request #407 from rswgnu/rsw
Date: Fri, 1 Dec 2023 09:58:15 -0500 (EST)

branch: externals/hyperbole
commit 158a40722876d7063093d9c2cffe5db7fe52931c
Merge: 3692855fa8 7b1cd4a4de
Author: Robert Weiner <rsw@gnu.org>
Commit: GitHub <noreply@github.com>

    Merge pull request #407 from rswgnu/rsw
    
    Improve tag/symbol finding, <> and {} handling
---
 ChangeLog                | 70 +++++++++++++++++++++++++++++++++++++++-
 DEMO                     |  2 ++
 FAST-DEMO                | 11 ++++---
 HY-NEWS                  |  2 ++
 README                   |  4 +--
 hargs.el                 | 27 +++++++++-------
 hbut.el                  | 26 +++++++++------
 hib-kbd.el               | 84 ++++++++++++++++++++++--------------------------
 hmouse-tag.el            | 44 +++++++++++++++++++++++--
 hpath.el                 | 68 +++++++++++++++++++++++----------------
 hui-mouse.el             | 18 +++++++++--
 hui-select.el            | 28 ++++++++++------
 hypb.el                  |  8 +++--
 hyrolo-demo.el           | 11 +++++--
 hyrolo.el                | 49 +++++++++++-----------------
 kotl/kvspec.el           |  7 ++--
 test/hbut-tests.el       |  4 +--
 test/hui-select-tests.el | 40 ++++++++++++++++-------
 18 files changed, 334 insertions(+), 169 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 295bba14fd..ecd08c4d8b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,36 @@
+2023-12-01  Bob Weiner  <rsw@gnu.org>
+
+* hargs.el (hargs:delimited): Remove use of 'bounds-of-thing-at-point'
+    and (require 'thingatpt) since it doesn't use the delimiters given
+    and returns wrong results.  This fixes defal tests that were failing.
+
+* hyrolo.el (hyrolo-grep): Fix to ensure 'outline-regexp' setting for all
+    matching file types is set locally in the match buffer only.
+            (hyrolo-mode): Use 'setq-local' instead of 'make-local-variable'.
+           (require 'outline): Add and remove its function declarations.
+
+* hpath.el (hpath:expand): Fix to allow return of paths with file wildcards
+    that are not yet expanded.  Use 'hpath:expand-list' to expand them.
+           (hpath:expand-list): Fix to call 'hpath:expand' before resolving
+    wildcards, so that variables are resolved first.  Also make 'match-regexp'
+    argument optional, in which case all files are matched.  Improve doc 
string.
+
+2023-11-30  Bob Weiner  <rsw@gnu.org>
+
+* hyrolo.el (hyrolo-grep-file): Add 'backward-search-limit' to minimize
+    backward searches to the end of the last match and to prevent
+    forward search stalls in some contexts.
+
+* hypb.el (hypb:insert-hyperbole-banner): Keep any initial line of
+    variable settings (starts with -*-, e.g. for Org mode as the first
+    line.
+
 2023-11-30  Mats Lidell  <matsl@gnu.org>
 
 * test/hui-tests.el (hui--ebut-link-directly-to-file)
     (hui--ebut-link-directly-to-dired, hui--buf-writable-err)
     (hui--gbut-link-directly-ibut, hui--gbut-link-directly-ebut): Add
-    tests for ebut-link-directly. 
+    tests for ebut-link-directly.
 
 2023-11-29  Mats Lidell  <matsl@gnu.org>
 
@@ -26,11 +53,52 @@
 
 * Remove warnings for unknown functions by using declare-function.
 
+2023-11-23  Bob Weiner  <rsw@gnu.org>
+
+* hui-select.el (hui-select-syntax-table): Change to copy syntax
+    table so changes do not affect the parent.
+
+* hbut.el (hbut:modify-syntax): Add <> and {} pair support in text
+    and fundamental modes.
+          (require 'mode-local): Use in 'hbut:modify-syntax'.
+  hib-kbd.el (defib kbd-key): Remove explicit syntax setting of braces
+    and just temporarily use Hyperbole-modified text-mode syntax table.
+  hyrolo.el (hyrolo-mode-syntax-table): Remove explicit syntax setting
+    of < > delimiters; inherit from 'text-mode-syntax-table' instead.
+
+* test/hui-select-tests.el (hui-select--thing): Fix to skip 'indent-def
+    by removing final newline.  Label each test section with the type
+    of match expected.
+    (hui-select--thing-interactive-prints-type-of-match): Make similar
+    fixes as in above function.
+
 2023-11-22  Mats Lidell  <matsl@gnu.org>
 
 * test/demo-tests.el (fast-demo-key-series-dired-other-window): Add test
     from demo key series.
 
+2023-11-22  Bob Weiner  <rsw@gnu.org>
+
+* hui-mouse.el (hkey-alist): Add clause to handle Smart Key when in
+    a vertico minibuffer window; make it behave like standard vertico
+    which exits and selects the first minibuffer line, not the candidate
+    presently selected.
+
+* hargs.el (hargs:delimited):
+           (require 'thingatpt): For 'bounds-of-thing-at-point'
+    used in 'hargs:delimited' on single char matching delims.
+
+* hui-select.el (hui-select-scan-sexps): Add to fix brace handling
+    as a matching pair when selecting things by using previously
+    unused 'hui-select-syntax-table'.
+
+* hmouse-tag.el (smart-lisp-bound-symbol-def): Rewrite to support
+    Hyperbole type defs like defib, etc.  This improves finding
+    the proper definition of a Hyperbole type.
+                (find-defact-regexp, find-defal-regexp,
+                 find-defib-regexp, find-defil-regexp): Add these
+    entries to 'find-function-regexp-alist'.
+
 2023-11-21  Bob Weiner  <rsw@gnu.org>
 
 * hui-select.el (hui-select-initialize): Fix to set 'syntax-table-sym'
diff --git a/DEMO b/DEMO
index 5d8213fd22..b7c684fb97 100644
--- a/DEMO
+++ b/DEMO
@@ -1,3 +1,5 @@
+-*- Mode: org; org-cycle-global-at-bob: t; hsys-org-enable-smart-keys: t -*-
+
 * GNU Hyperbole Full Demo/Tutorial by Bob Weiner
 
   Send an email or a testimonial if you like Hyperbole to <rsw@gnu.org>.
diff --git a/FAST-DEMO b/FAST-DEMO
index ed1b6d9050..04000b0bf5 100644
--- a/FAST-DEMO
+++ b/FAST-DEMO
@@ -1,4 +1,4 @@
-;;; -*- Mode: org; org-cycle-global-at-bob: t; hsys-org-enable-smart-keys: t 
-*-
+-*- Mode: org; org-cycle-global-at-bob: t; hsys-org-enable-smart-keys: t -*-
 
 * GNU Hyperbole Fast Demo by Bob Weiner
 
@@ -191,11 +191,11 @@
        Press {C-h A} when over any Hyperbole button for an explanation of
        what it does.
 
-    {M-x dired-other-window RET ${hyperb:dir}/*.el RET}
+    {M-x dired-other-window RET ${hyperb:dir}/*.el M-RET}
 
        Hyperbole home directory Dired listing of Emacs Lisp files only
 
-    {C-c @ 22 RET}
+    {C-22 C-c @}
 
        Display a 2x2 windows grid in the current frame of the 4 most recently
        used buffers.  Before you try this, remember the binding {C-h h h} for
@@ -207,7 +207,7 @@
        Find the Hyperbole Koutliner source files that begin with 'kotl' and
        display them in an auto-sized grid of windows.
 
-    {C-u 0 C-c @ emacs-lisp-mode RET 33 RET}
+    {C-0 C-c @ emacs-lisp-mode RET 33 RET}
 
        Display the 9 mostly recently used Emacs Lisp buffers in a 3x3 grid.
        A BLANK buffer fills in the grid if there are not enough Emacs Lisp
@@ -215,7 +215,8 @@
 
     {C-x 4 d ${hyperb:dir} RET}
 
-       Dired the Hyperbole home directory based on its variable.
+       Dired the Hyperbole home directory based on its variable.  {M-RET} on
+       the directory itself will display the directory's value in the 
minibuffer.
 
        Within this dired buffer, mark a few files with {m} and then press {@}
        to display a window grid of those files only.  That works in Buffer
diff --git a/HY-NEWS b/HY-NEWS
index 971e6a0539..be894f4cab 100644
--- a/HY-NEWS
+++ b/HY-NEWS
@@ -1,3 +1,5 @@
+-*- Mode: org; org-cycle-global-at-bob: t; hsys-org-enable-smart-keys: t -*-
+
 *                        What's New in GNU Hyperbole
                                 by Bob Weiner
 
diff --git a/README b/README
index 10f2eda1f8..601104785e 100644
--- a/README
+++ b/README
@@ -3,9 +3,9 @@
 # Author:       Bob Weiner
 #
 # Orig-Date:    19-Oct-91 at 03:27:47
-# Last-Mod:     24-Jan-22 at 00:19:12 by Bob Weiner
+# Last-Mod:     24-Jan-23 at 00:19:12 by Bob Weiner
 #
-# Copyright (C) 1989-2021  Free Software Foundation, Inc.
+# Copyright (C) 1989-2023  Free Software Foundation, Inc.
 # See the "HY-COPY" file for license information.
 #
 # This file is part of GNU Hyperbole.
diff --git a/hargs.el b/hargs.el
index e3665a49cf..fb58c616a3 100644
--- a/hargs.el
+++ b/hargs.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    31-Oct-91 at 23:17:35
-;; Last-Mod:     25-Nov-23 at 16:38:50 by Mats Lidell
+;; Last-Mod:      1-Dec-23 at 11:23:52 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -128,7 +128,9 @@ START-DELIM is treated as a regular expression.  
END-REGEXP-FLAG
 is similar.  With optional LIST-POSITIONS-FLAG, return list
 of (string-matched start-pos end-pos).  Optional
 EXCLUDE-REGEXP is compared against the match string with its delimiters
-included; any string that matches this regexp is ignored."
+included; any string that matches this regexp is ignored.  Optional
+AS-KEY non-nil means return the string normalized as a Hyperbole
+button key (no spaces)."
   (let* ((opoint (point))
         ;; This initial limit is the forward search limit for start delimiters
         (limit (if start-regexp-flag
@@ -140,12 +142,13 @@ included; any string that matches this regexp is ignored."
         (end-search-func   (if end-regexp-flag   're-search-forward 
'search-forward))
         (count 0)
         first
-        start
-        end
+        start ;; excludes delimiter
+        end   ;; excludes delimiter
         start-pos
         end-pos
         start-with-delim
         end-with-delim)
+
     (if (string-equal start-delim end-delim)
        (save-excursion
          (beginning-of-line)
@@ -205,14 +208,16 @@ included; any string that matches this regexp is ignored."
        (goto-char opoint)
        (and (funcall end-search-func end-delim limit t)
             (setq end (match-beginning 0)
-                  end-with-delim (match-end 0))
+                  end-with-delim (match-end 0)))))
 
-            ;; Ignore any preceding backslash, e.g. when a double-quoted
-            ;; string is embedded within a doc string, except when
-            ;; the string starts with 2 backslashes or an MSWindows
-            ;; disk drive prefix, in which case the backslash is
-            ;; considered part of a pathname.
-            (if (and (> end (point-min))
+    (when (and start end)
+      (save-excursion
+       ;; Ignore any preceding backslash, e.g. when a double-quoted
+       ;; string is embedded within a doc string, except when
+       ;; the string starts with 2 backslashes or an MSWindows
+       ;; disk drive prefix, in which case the backslash is
+       ;; considered part of a pathname.
+       (and (if (and (> end (point-min))
                      (= (char-before end) ?\\)
                      (not (string-match (concat "\\(\\`[\\][\\]\\)\\|"
                                                 hpath:mswindows-mount-prefix)
diff --git a/hbut.el b/hbut.el
index 545a36dc02..0833e3481e 100644
--- a/hbut.el
+++ b/hbut.el
@@ -3,11 +3,11 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    18-Sep-91 at 02:57:09
-;; Last-Mod:     25-Nov-23 at 17:10:28 by Mats Lidell
+;; Last-Mod:     30-Nov-23 at 23:23:53 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
-;; Copyright (C) 1991-2022  Free Software Foundation, Inc.
+;; Copyright (C) 1991-2023  Free Software Foundation, Inc.
 ;; See the "HY-COPY" file for license information.
 ;;
 ;; This file is part of GNU Hyperbole.
@@ -1503,17 +1503,18 @@ non-nil)."
     (nreverse result)))
 
 (defvar   hbut:syntax-table (copy-syntax-table emacs-lisp-mode-syntax-table)
-  "Modified Elisp syntax table for use with Action and Key Series buttons.
-Makes < > and { } into syntactically matching pairs after `hyperb:init'
+  "Syntax table copied from Elisp for use with Action and Key Series buttons.
+Make < > and { } into syntactically matching pairs after `hyperb:init'
 calls `hbut:modify-syntax'.")
 
 ;;;###autoload
 (defun    hbut:modify-syntax ()
-  "Modify syntactic character pairs in syntax tables.
-Modify `hbut:syntax-table' and `help-mode-syntax-table'.  For use
-with implicit button activations."
-  ;; Treat angle brackets as opening and closing delimiters for ease
-  ;; of matching.
+  "Make <> and {} behave as syntactic character pairs in major syntax tables.
+Modify `hbut:syntax-table' and `help-mode-syntax-table' to include <> and {}.
+Modify `text-mode-syntax-table' and `fundamental-mode's syntax table
+to include {} only.  For use with implicit button activations."
+  ;; Treat angle brackets and braces as opening and closing delimiters
+  ;; for ease  of matching.
   (mapc (lambda (syntax-table)
          (modify-syntax-entry ?\< "(>" syntax-table)
          (modify-syntax-entry ?\> ")<" syntax-table)
@@ -1521,6 +1522,13 @@ with implicit button activations."
          (modify-syntax-entry ?\{ "(}" syntax-table)
          (modify-syntax-entry ?\} "){" syntax-table))
        (list hbut:syntax-table help-mode-syntax-table))
+  (mapc (lambda (syntax-table)
+         ;; Treat braces as opening and closing delimiters for ease of 
matching.
+         (modify-syntax-entry ?\{ "(}" syntax-table)
+         (modify-syntax-entry ?\} "){" syntax-table))
+       (list text-mode-syntax-table
+             ;; fundamental-mode syntax table
+             (standard-syntax-table)))
   nil)
 
 (defun    hbut:outside-comment-p ()
diff --git a/hib-kbd.el b/hib-kbd.el
index 64d902e4b7..f9fd5e676a 100644
--- a/hib-kbd.el
+++ b/hib-kbd.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    22-Nov-91 at 01:37:57
-;; Last-Mod:     19-Nov-23 at 17:55:29 by Bob Weiner
+;; Last-Mod:     23-Nov-23 at 01:51:41 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -117,50 +117,44 @@ Any key sequence within the series must be a string of 
one of the following:
              (and (looking-at "[{}]") (/= ?\\ (preceding-char))))
     ;; Temporarily make open and close braces have list syntax for
     ;; matching purposes.
-    (let ((open-brace-syntax (hypb:get-raw-syntax-descriptor ?\{))
-         (close-brace-syntax (hypb:get-raw-syntax-descriptor ?\})))
-      (unwind-protect
-         (progn (modify-syntax-entry ?\{ "(}" (syntax-table))
-                (modify-syntax-entry ?\} "){" (syntax-table))
-                ;; Handle long series, e.g. eval-elisp actions
-                (let* ((hbut:max-len (max 3000 (hbut:max-len)))
-                       (seq-and-pos (or
-                                     ;; (kbd) calls but only if point is 
between double quotes
-                                     (and (hbut:label-p t "(kbd \"" "\"\)" t)
-                                          (hbut:label-p t "\"" "\"\)" t))
-                                     ;; braces delimiters
-                                     (hbut:label-p t "{`" "'}" t)
-                                     (hbut:label-p t "{" "}" t)
-                                     ;; Regular dual single quotes (Texinfo 
smart quotes)
-                                     (hbut:label-p t "``" "''" t)
-                                     ;; Typical GNU manual key sequences; note
-                                     ;; these are special quote marks, not the
-                                     ;; standard ASCII characters.
-                                     (hbut:label-p t "‘" "’" t)))
-                       ;; This excludes delimiters
-                       (key-series (car seq-and-pos))
-                       (start (cadr seq-and-pos))
-                       binding)
-                  ;; Match only when start delimiter is preceded by whitespace,
-                  ;; double quotes or is the 1st buffer character, so do not
-                  ;; match to things like ${variable}.
-                  (when (memq (char-before start) '(nil ?\ ?\t ?\n ?\r ?\f 
?\"))
-                    (when (and (stringp key-series)
-                               (not (string-equal key-series "")))
-                      ;; Replace any ${} internal or env vars; leave
-                      ;; $VAR untouched for the shell to evaluate.
-                      (let ((hpath:variable-regexp "\\${\\([^}]+\\)}"))
-                        (setq key-series (hpath:substitute-value key-series)))
-
-                      (setq key-series (kbd-key:normalize key-series)
-                            binding (kbd-key:binding key-series)))
-                    (and (stringp key-series)
-                         (or (and binding (not (integerp binding)))
-                             (kbd-key:special-sequence-p key-series))
-                         (ibut:label-set seq-and-pos)
-                         (hact 'kbd-key key-series)))))
-       (hypb:set-raw-syntax-descriptor ?\{ open-brace-syntax)
-       (hypb:set-raw-syntax-descriptor ?\} close-brace-syntax)))))
+    (with-syntax-table text-mode-syntax-table
+      ;; Handle long series, e.g. eval-elisp actions
+      (let* ((hbut:max-len (max 3000 (hbut:max-len)))
+            (seq-and-pos (or
+                          ;; (kbd) calls but only if point is between double 
quotes
+                          (and (hbut:label-p t "(kbd \"" "\"\)" t)
+                               (hbut:label-p t "\"" "\"\)" t))
+                          ;; braces delimiters
+                          (hbut:label-p t "{`" "'}" t)
+                          (hbut:label-p t "{" "}" t)
+                          ;; Regular dual single quotes (Texinfo smart quotes)
+                          (hbut:label-p t "``" "''" t)
+                          ;; Typical GNU manual key sequences; note
+                          ;; these are special quote marks, not the
+                          ;; standard ASCII characters.
+                          (hbut:label-p t "‘" "’" t)))
+            ;; This excludes delimiters
+            (key-series (car seq-and-pos))
+            (start (cadr seq-and-pos))
+            binding)
+       ;; Match only when start delimiter is preceded by whitespace,
+       ;; double quotes or is the 1st buffer character, so do not
+       ;; match to things like ${variable}.
+       (when (memq (char-before start) '(nil ?\ ?\t ?\n ?\r ?\f ?\"))
+         (when (and (stringp key-series)
+                    (not (string-equal key-series "")))
+           ;; Replace any ${} internal or env vars; leave
+           ;; $VAR untouched for the shell to evaluate.
+           (let ((hpath:variable-regexp "\\${\\([^}]+\\)}"))
+             (setq key-series (hpath:substitute-value key-series)))
+
+           (setq key-series (kbd-key:normalize key-series)
+                 binding (kbd-key:binding key-series)))
+         (and (stringp key-series)
+              (or (and binding (not (integerp binding)))
+                  (kbd-key:special-sequence-p key-series))
+              (ibut:label-set seq-and-pos)
+              (hact 'kbd-key key-series)))))))
 
 ;;; ************************************************************************
 ;;; Public functions
diff --git a/hmouse-tag.el b/hmouse-tag.el
index d13ac503cd..1c68a65ae6 100644
--- a/hmouse-tag.el
+++ b/hmouse-tag.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    24-Aug-91
-;; Last-Mod:     20-Nov-23 at 02:06:48 by Bob Weiner
+;; Last-Mod:     22-Nov-23 at 00:15:24 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -91,6 +91,34 @@
 ;;; Public variables
 ;;; ************************************************************************
 
+(defconst find-defact-regexp "^\\s-*(defact\\s-+%s\\s-"
+  "The regexp used to search for a Hyperbole action type definition.
+Note it must contain a ‘%s’ at the place where ‘format’
+should insert the action type definition name.")
+
+(defconst find-defal-regexp "^\\s-*(defal\\s-+%s\\s-"
+  "The regexp used to search for a Hyperbole action link type definition.
+Note it must contain a ‘%s’ at the place where ‘format’
+should insert the action link type definition name.")
+
+(defconst find-defib-regexp "^\\s-*(defib\\s-+%s\\s-"
+  "The regexp used to search for a Hyperbole implicit button type definition.
+Note it must contain a ‘%s’ at the place where ‘format’
+should insert the implicit button type definition name.")
+
+(defconst find-defil-regexp "^\\s-*(defil\\s-+%s\\s-"
+  "The regexp used to search for a Hyperbole implicit link type definition.
+Note it must contain a ‘%s’ at the place where ‘format’
+should insert the implicit link type definition name.")
+
+;; Add Hyperbole def types to `find-function-regexp-alist'.
+(mapc (lambda (item)
+       (add-to-list 'find-function-regexp-alist item))
+      '((defact . find-defact-regexp)
+       (defal  . find-defal-regexp)
+       (defib  . find-defib-regexp)
+       (defil  . find-defil-regexp)))
+
 (define-obsolete-variable-alias 'smart-asm-include-dirs
   'smart-asm-include-path "06.00")
 (defcustom smart-asm-include-path nil
@@ -1189,7 +1217,19 @@ The buffer may be attached to a .elc file.  TAG-SYM may 
be a function,
 variable or face."
   (save-excursion
     ;; Bound Emacs Lisp function, variable and face definition display.
-    (ignore-errors (or (find-function-noselect tag-sym)
+    (ignore-errors (or (let ((func-lib (find-function-library tag-sym nil t))
+                            tag-type ;; nil means regular Lisp function
+                            tag-name)
+                        (when func-lib
+                          (setq tag-sym (car func-lib)
+                                tag-name (symbol-name tag-sym))
+                          (cond ((string-prefix-p "ibtypes::" tag-name)
+                                 (setq tag-type 'defib
+                                       tag-sym (ibtype:def-symbol tag-sym)))
+                                ((string-prefix-p "actypes::" tag-name)
+                                 (setq tag-type 'defact
+                                       tag-sym (actype:def-symbol tag-sym))))
+                          (find-function-search-for-symbol tag-sym tag-type 
(cdr func-lib))))
                       (find-variable-noselect tag-sym)
                       (find-definition-noselect tag-sym 'defface)))))
 
diff --git a/hpath.el b/hpath.el
index 35cd892417..b65538f481 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:     25-Nov-23 at 16:42:29 by Mats Lidell
+;; Last-Mod:      1-Dec-23 at 01:11:32 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1209,47 +1209,60 @@ Any single ${variable} within PATH is resolved.  Then 
PATH is
 expanded from the first file matching regexp in
 `hpath:auto-variable-alist'.
 
+Return expanded path if it exists or it contains file wildcards of
+'[]', '*', or '?'.
+
 Return any absolute or invalid PATH unchanged unless optional
 EXISTS-FLAG is non-nil in which case, return the expanded path
 only if it exists, otherwise, return nil."
 
   (when (stringp path)
     (unless (string-match-p hpath:variable-regexp path)
+      ;; Replace any $VAR environment variable references
       (setq path (substitute-in-file-name path)))
     (let (variable-path
          substituted-path
          expanded-path)
-      (setq variable-path (hpath:expand-with-variable path)
-           substituted-path (hpath:substitute-value variable-path)
-           expanded-path
-           (cond ((or (null substituted-path) (string-empty-p 
substituted-path))
-                  path)
-                 ((and (string-match-p hpath:variable-regexp variable-path)
-                       (string-match-p hpath:variable-regexp substituted-path))
-                  ;; If a path is invalid, then a variable may have been 
prepended but
-                  ;; it will remain unresolved in `substituted-path', in which 
case we
-                  ;; want to return `path' without any further changes.
-                  path)
-                 ;; For compressed Elisp libraries, add any found compressed 
suffix to the path.
-                 ((string-match-p "\\.el\\(\\.\\|\\'\\)" substituted-path)
-                  (or (locate-library substituted-path t) path))
-                 ((or (string-match-p 
"\\`\\(#[^#+.]\\|([^\)\\/]+)\\|[^.\\/].*\\.[^.\\/]\\)" substituted-path)
-                      (string-match-p "[\\/~]" substituted-path))
-                  ;; Don't expand if an Info path, URL, #anchor or has a 
directory prefix
-                  substituted-path)
-                 (t (expand-file-name substituted-path))))
-      (if (file-exists-p expanded-path)
+      (setq
+       ;; Expand relative path from appropriate multi-path prefix variables
+       variable-path (hpath:expand-with-variable path)
+       ;; Substitute values for Emacs Lisp variables and environment variables 
in PATH.
+       substituted-path (hpath:substitute-value variable-path)
+       expanded-path
+       (cond ((or (null substituted-path) (string-empty-p substituted-path))
+             path)
+            ((and (string-match-p hpath:variable-regexp variable-path)
+                  (string-match-p hpath:variable-regexp substituted-path))
+             ;; If a path is invalid, then a variable may have been prepended 
but
+             ;; it will remain unresolved in `substituted-path', in which case 
we
+             ;; want to return `path' without any further changes.
+             path)
+            ;; For compressed Elisp libraries, add any found compressed suffix 
to the path.
+            ((string-match-p "\\.el\\(\\.\\|\\'\\)" substituted-path)
+             (or (locate-library substituted-path t) path))
+            ((or (string-match-p 
"\\`\\(#[^#+.]\\|([^\)\\/]+)\\|[^.\\/].*\\.[^.\\/]\\)" substituted-path)
+                 (string-match-p "[\\/~]" substituted-path))
+             ;; Don't expand if an Info path, URL, #anchor or has a directory 
prefix
+             substituted-path)
+            (t (expand-file-name substituted-path))))
+      (if (and (stringp expanded-path)
+              (or (file-exists-p expanded-path)
+                  (string-match "[[*?]" (file-local-name expanded-path))))
          expanded-path
        (unless exists-flag
          path)))))
 
-(defun hpath:expand-list (paths match-regexp &optional exists-flag)
+(defun hpath:expand-list (paths &optional match-regexp exists-flag)
   "Return expansions of PATHS, a list of dirs or wildcarded file patterns.
-PATHS expansion filters out non-strings, expand file wildcards
-when `find-file-wildcards' is non-nil (the default), substitute
-up to one ${variable} per path, and recursively walk directory
-trees for files with MATCH-REGEXP."
+PATHS expansion recursively walks directory trees to include
+files with names matching optional MATCH-REGEXP (otherwise, all
+files), filters out non-strings and non-existent filenames when
+optional EXISTS-FLAG is non-nil, expands file wildcards when
+`find-file-wildcards' is non-nil (the default), substitutes for
+multipled $VAR environment variables, substitutes up to one
+${variable} per path."
   (mapcan (lambda (path)
+           (setq path (hpath:expand path exists-flag))
            (when (setq path (or (when find-file-wildcards
                                   (file-expand-wildcards path))
                                 (list path)))
@@ -1257,9 +1270,8 @@ trees for files with MATCH-REGEXP."
                  (setq path (car path))
                (setq paths (nconc (cdr path) paths)
                      path (car path)))
-             (setq path (hpath:expand path exists-flag))
              (if (file-directory-p path)
-                 (directory-files-recursively path match-regexp)
+                 (directory-files-recursively path (or match-regexp ""))
                (list path))))
          (seq-filter #'stringp paths)))
 
diff --git a/hui-mouse.el b/hui-mouse.el
index 095de546e6..2b7596186c 100644
--- a/hui-mouse.el
+++ b/hui-mouse.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    04-Feb-89
-;; Last-Mod:     15-Nov-23 at 01:52:38 by Bob Weiner
+;; Last-Mod:     23-Nov-23 at 03:45:24 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -227,14 +227,26 @@ Its default value is `smart-scroll-down'.  To disable it, 
set it to
      . ((smart-push-button nil (mouse-event-p last-command-event))
        . (smart-push-button-help nil (mouse-event-p last-command-event))))
     ;;
-    ;; If click in the minibuffer and reading an argument (aside from
+    ;; If in the minibuffer and reading an argument with vertico
+    ;; run the vertico command on {M-RET} which accepts the first
+    ;; line of minibuffer input, rather than any candidate.
+    ((and hargs:reading-type
+         (> (minibuffer-depth) 0)
+         (eq (selected-window) (minibuffer-window))
+         (not (bound-and-true-p ivy-mode))
+         (and (bound-and-true-p vertico-mode)
+              ;; Is vertico prompting for an argument?
+              (vertico--command-p nil (current-buffer))))
+     . ((vertico-exit-input) . (vertico-exit-input)))
+    ;;
+    ;; If in the minibuffer and reading an argument (aside from
     ;; with vertico or ivy), accept argument or give completion help.
     ((and hargs:reading-type
          (> (minibuffer-depth) 0)
          (eq (selected-window) (minibuffer-window))
          (not (bound-and-true-p ivy-mode))
          (not (and (bound-and-true-p vertico-mode)
-                   ;; Is vertico is prompting for an argument?
+                   ;; Is vertico prompting for an argument?
                    (vertico--command-p nil (current-buffer))))
          (not (eq hargs:reading-type 'hmenu))
          (not (smart-helm-alive-p)))
diff --git a/hui-select.el b/hui-select.el
index 89d1191667..612a7c00ba 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:     21-Nov-23 at 02:41:17 by Bob Weiner
+;; Last-Mod:     30-Nov-23 at 11:33:09 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -256,10 +256,12 @@ Used to include a final line when marking indented code.")
 ;;; ************************************************************************
 
 (defconst hui-select-syntax-table
-  (let ((st (make-syntax-table emacs-lisp-mode-syntax-table)))
+  (let ((st (copy-syntax-table emacs-lisp-mode-syntax-table)))
     ;; Make braces be thing delimiters, not punctuation.
     (modify-syntax-entry ?\{ "(}" st)
     (modify-syntax-entry ?\} "){" st)
+    (modify-syntax-entry ?< "(>" st)
+    (modify-syntax-entry ?> ")<" st)
     st)
   "Syntax table to use when selecting delimited things.")
 
@@ -430,8 +432,8 @@ Also, add language-specific syntax setups to aid in thing 
selection."
                                  `(lambda ()
                                      (let ((syntax-table (symbol-value 
',syntax-table-sym))
                                            (keymap (symbol-value 
',keymap-sym)))
-                                      (modify-syntax-entry ?\< "(>" 
syntax-table)
-                                      (modify-syntax-entry ?\> ")<" 
syntax-table)
+                                      ;; (modify-syntax-entry ?\< "(>" 
syntax-table)
+                                      ;; (modify-syntax-entry ?\> ")<" 
syntax-table)
                                       (modify-syntax-entry ?\{ "(}" 
syntax-table)
                                       (modify-syntax-entry ?\} "){" 
syntax-table)
                                       (modify-syntax-entry ?\" "\"" 
syntax-table)
@@ -461,6 +463,11 @@ Also, add language-specific syntax setups to aid in thing 
selection."
     (when region-bounds
       (buffer-substring-no-properties (car region-bounds) (cdr 
region-bounds)))))
 
+(defun hui-select-scan-sexps (from count)
+  "Scan FROM point across COUNT sexpressions."
+  (with-syntax-table hui-select-syntax-table
+    (scan-sexps from count)))
+
 ;;;###autoload
 (defun hui-select-thing ()
   "Select a region based on the syntax of the thing at point.
@@ -534,6 +541,7 @@ displayed in the minibuffer."
 ;;;###autoload
 (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 `>'
@@ -1006,7 +1014,7 @@ language must be included in the list, 
hui-select-brace-modes."
                      (ignore-errors
                        ;; Leave point at opening brace.
                        (goto-char
-                        (scan-sexps (1+ (point)) -1))
+                        (hui-select-scan-sexps (1+ (point)) -1))
                        ;; Test if these are defun braces.
                        (save-excursion
                          (beginning-of-line)
@@ -1072,7 +1080,7 @@ language must be included in the list, 
hui-select-brace-modes."
                          (error (point-max)))))
            (when (= (following-char) ?\})
              ;; Leave point at opening brace.
-             (goto-char (scan-sexps (1+ (point)) -1)))
+             (goto-char (hui-select-scan-sexps (1+ (point)) -1)))
            (when (= (following-char) ?\{)
              (while (and (zerop (forward-line -1))
                          (not (hui-select-at-blank-line-or-comment))))
@@ -1148,9 +1156,9 @@ list, hui-select-indent-modes."
                  '(?w ?_))
          (setq hui-select-previous 'symbol)
          (condition-case ()
-             (let ((end (scan-sexps pos 1)))
+             (let ((end (hui-select-scan-sexps pos 1)))
                (hui-select-set-region
-                (min pos (scan-sexps end -1)) end))
+                (min pos (hui-select-scan-sexps end -1)) end))
            (error nil))))))
 
 (defun hui-select-sexp-start (pos)
@@ -1159,14 +1167,14 @@ list, hui-select-indent-modes."
       (hui-select-brace-def-or-declaration pos)
       (save-excursion
        (setq hui-select-previous 'sexp-start)
-       (ignore-errors (hui-select-set-region pos (scan-sexps pos 1))))))
+       (ignore-errors (hui-select-set-region pos (hui-select-scan-sexps pos 
1))))))
 
 (defun hui-select-sexp-end (pos)
   "Return (start . end) of sexp ending at POS."
   (or (hui-select-brace-def-or-declaration pos)
       (save-excursion
        (setq hui-select-previous 'sexp-end)
-       (ignore-errors (hui-select-set-region (scan-sexps (1+ pos) -1) (1+ 
pos))))))
+       (ignore-errors (hui-select-set-region (hui-select-scan-sexps (1+ pos) 
-1) (1+ pos))))))
 
 (defun hui-select-sexp (pos)
   "Return (start . end) of the sexp that POS is within."
diff --git a/hypb.el b/hypb.el
index b9c66eb126..fc649dcc0e 100644
--- a/hypb.el
+++ b/hypb.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     6-Oct-91 at 03:42:38
-;; Last-Mod:     20-Nov-23 at 00:49:09 by Bob Weiner
+;; Last-Mod:     30-Nov-23 at 11:18:54 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1069,9 +1069,13 @@ Without file, the banner is prepended to the current 
buffer."
             (buffer-read-only)
             button)
        (goto-char (point-min))
+       ;; Keep any initial line of variable settings, e.g. for Org
+       ;; mode as the first line.
+       (when (looking-at (regexp-quote "-*- "))
+         (forward-line 1))
        (insert "\n")
        (insert-image hyperbole-banner)
-       (insert "\n\n")
+       (insert "\n")
        (setq button (make-button (- (point) 3) (- (point) 2) :type 
'hyperbole-banner))
        (button-put button 'help-echo (concat "Click to visit " hypb:home-page))
        (button-put button 'action #'hypb:browse-home-page)
diff --git a/hyrolo-demo.el b/hyrolo-demo.el
index 3cf72ff26e..41f19fbc7a 100644
--- a/hyrolo-demo.el
+++ b/hyrolo-demo.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     4-Nov-17 at 13:56:47
-;; Last-Mod:      7-Oct-22 at 00:16:24 by Mats Lidell
+;; Last-Mod:     30-Nov-23 at 11:55:28 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -46,8 +46,13 @@ Returns number of entries matched.  See also documentation 
for
 the function `hyrolo-demo-fgrep-logical' for documentation on the
 logical sexpression matching."
   (interactive "sFind rolo string (or logical sexpression): \nP")
-  (let ((hyrolo-file-list (list (expand-file-name "DEMO-ROLO.otl" 
hyperb:dir))))
-    (hyrolo-fgrep string max-matches)))
+  (let* ((hyrolo-file-list (list (expand-file-name "DEMO-ROLO.otl" 
hyperb:dir)))
+        (match-count (hyrolo-fgrep string max-matches)))
+    (when (and (called-interactively-p 'interactive)
+              (zerop match-count))
+      ;; Let user know that they invoked the demo version of hyrolo-fgrep
+      (message "(hyrolo-demo-fgrep): No demo matches found for '%s'" string))
+    match-count))
 
 ;;;###autoload
 (defun hyrolo-demo-fgrep-logical (expr &optional count-only 
include-sub-entries no-sub-entries-out)
diff --git a/hyrolo.el b/hyrolo.el
index 217daad895..4f795f4487 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:     25-Nov-23 at 17:09:20 by Mats Lidell
+;; Last-Mod:      1-Dec-23 at 02:24:49 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -31,6 +31,7 @@
 (require 'hversion)
 (require 'hmail)
 (require 'hypb)  ;; For 'hypb:mail-address-regexp'.
+(require 'outline)
 (require 'package)
 (require 'set)
 (require 'sort)
@@ -83,19 +84,6 @@
 (declare-function hui:hbut-act "hui")
 (declare-function ibut:at-p "hbut")
 (declare-function kcell-view:indent "kotl/kview")
-(declare-function outline-back-to-heading "outline")
-(declare-function outline-backward-same-level "outline")
-(declare-function outline-end-of-subtree "outline")
-(declare-function outline-forward-same-level "outline")
-(declare-function outline-hide-sublevels "outline")
-(declare-function outline-hide-subtree "outline")
-(declare-function outline-level "outline")
-(declare-function outline-next-heading "outline")
-(declare-function outline-next-visible-heading "outline")
-(declare-function outline-previous-heading "outline")
-(declare-function outline-previous-visible-heading "outline")
-(declare-function outline-show-all "outline")
-(declare-function outline-up-heading "outline")
 
 (declare-function hmouse-pulse-line "hui-window")
 (declare-function hpath:find "hpath")
@@ -335,10 +323,7 @@ String search expressions are converted to regular 
expressions.")
 
 (if hyrolo-mode-syntax-table
     ()
-  (setq hyrolo-mode-syntax-table (make-syntax-table text-mode-syntax-table))
-  ;; Support syntactic selection of delimited e-mail addresses.
-  (modify-syntax-entry ?\<  "(>" hyrolo-mode-syntax-table)
-  (modify-syntax-entry ?\>  ")<" hyrolo-mode-syntax-table))
+  (setq hyrolo-mode-syntax-table (make-syntax-table text-mode-syntax-table)))
 
 (defvar hyrolo-mode-map nil
   "Keymap for the hyrolo match buffer.")
@@ -681,7 +666,7 @@ select it."
            (with-current-buffer buf
              (when (equal outline-regexp (default-value 'outline-regexp))
                ;; Prevent matching to *word* at the beginning of
-               ;; lines and hanging hyrolo search functions but this
+               ;; lines and hanging hyrolo search functions.  Note this
                ;; change adds one to the default `outline-level' function,
                ;; so 'hyrolo-mode' overrides that as well to get the correct
                ;; calculation.  -- rsw, 2023-11-17
@@ -786,9 +771,9 @@ Return number of entries matched.  See also documentation 
for the variable
        (unless (string-prefix-p hyrolo-hdr-regexp hyrolo-entry-regexp)
          (setq hyrolo-entry-regexp (concat hyrolo-hdr-regexp "\\|" 
hyrolo-entry-regexp))))
       (when outline-regexps
-       (setq outline-regexp (string-join outline-regexps "\\|"))
+       (setq-local outline-regexp (string-join outline-regexps "\\|"))
        (unless (string-prefix-p hyrolo-hdr-regexp outline-regexp)
-         (setq outline-regexp (concat hyrolo-hdr-regexp "\\|" 
outline-regexp))))
+         (setq-local outline-regexp (concat hyrolo-hdr-regexp "\\|" 
outline-regexp))))
       (hyrolo-display-matches display-buf))
     (when (called-interactively-p 'interactive)
       (message "%s matching entr%s found in rolo."
@@ -1683,14 +1668,18 @@ Return number of matching entries found."
                      (when (re-search-forward hyrolo-hdr-regexp nil t 2)
                        (forward-line)
                        (setq hdr-pos (cons (point-min) (point))))
-                     (let ((case-fold-search t)
-                           match-end)
+                     (let* ((case-fold-search t)
+                            (backward-search-limit (save-excursion
+                                                     (if (re-search-forward 
hyrolo-entry-regexp nil t)
+                                                         (match-beginning 0)
+                                                       (point))))
+                            match-end)
                        (re-search-forward hyrolo-entry-regexp nil t)
                        (while (and (or (null max-matches) (< num-found 
max-matches))
                                    (funcall hyrolo-next-match-function pattern 
headline-only))
                          (setq match-end (point))
                          ;; If no entry delimiters found, just return the line 
of the match alone.
-                         (unless (re-search-backward hyrolo-entry-regexp nil t)
+                         (unless (re-search-backward hyrolo-entry-regexp 
backward-search-limit t)
                            (goto-char (line-beginning-position)))
                          (setq entry-start (point))
                          (unless (re-search-forward hyrolo-entry-regexp nil t)
@@ -1729,7 +1718,8 @@ Return number of matching entries found."
                                  (set-buffer actual-buf))))
                          (setq num-found (1+ num-found))
                          (or count-only
-                             (hyrolo-add-match hyrolo-display-buffer pattern 
entry-start (point)))))))
+                             (hyrolo-add-match hyrolo-display-buffer pattern 
entry-start (point)))
+                         (setq backward-search-limit (point))))))
                  num-found))
          (when (< stuck-negative-point 0)
            (pop-to-buffer (current-buffer))
@@ -1806,13 +1796,10 @@ Calls the functions given by `hyrolo-mode-hook'.
 \\{hyrolo-mode-map}"
   (interactive)
   (unless (eq major-mode 'hyrolo-mode)
-    (make-local-variable 'outline-regexp)
     ;; This next local value is dynamically overridden in `hyrolo-grep'.
-    (setq outline-regexp (default-value 'outline-regexp))
-    (make-local-variable 'hyrolo-entry-regexp)
-    (setq hyrolo-entry-regexp (default-value 'hyrolo-entry-regexp))
-    (make-local-variable 'outline-level)
-    (setq outline-level #'hyrolo-mode-outline-level)
+    (setq-local outline-regexp (default-value 'outline-regexp)
+               hyrolo-entry-regexp (default-value 'hyrolo-entry-regexp)
+               outline-level #'hyrolo-mode-outline-level)
     (reveal-mode 1)) ;; Expose hidden text as move into it.
   (setq major-mode 'hyrolo-mode
        mode-name "HyRolo")
diff --git a/kotl/kvspec.el b/kotl/kvspec.el
index 731a6b06e4..f855ad7490 100644
--- a/kotl/kvspec.el
+++ b/kotl/kvspec.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    21-Oct-95 at 15:17:07
-;; Last-Mod:      4-Oct-23 at 19:10:12 by Mats Lidell
+;; Last-Mod:     21-Nov-23 at 13:20:57 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -104,7 +104,7 @@ characters at run-time.")
 (defun kvspec:activate (&optional view-spec)
   "Activate optional VIEW-SPEC or existing view spec in the current koutline.
 VIEW-SPEC is a string or t, which means recompute the current view spec.  See
-<${hyperb:dir}/kotl/EXAMPLE.kotl, 2b17=048> for details on valid view specs."
+${hyperb:dir}/kotl/EXAMPLE.kotl#3b19c=042 for details on valid view specs."
   (interactive (list (read-string "Set view spec: " kvspec:current)))
   (kotl-mode:is-p)
   (kfile:narrow-to-kcells)
@@ -169,8 +169,7 @@ display all levels of cells."
 VIEW-SPEC is a string or t, which means recompute the current view
 spec.  A nil value of VIEW-SPEC updates the modeline viewspec display
 to be current but does not recompute the viewspec itself.  See
-<${hyperb:dir}/kotl/EXAMPLE.kotl, 3b18=048> for details on valid
-view specs."
+${hyperb:dir}/kotl/EXAMPLE.kotl#3b19c=042 for details on valid view specs."
   (cond ((stringp view-spec)
         ;; Use given view-spec after removing extraneous characters.
         (setq view-spec
diff --git a/test/hbut-tests.el b/test/hbut-tests.el
index 680f276652..7fcb397362 100644
--- a/test/hbut-tests.el
+++ b/test/hbut-tests.el
@@ -3,7 +3,7 @@
 ;; Author:       Mats Lidell <matsl@gnu.org>
 ;;
 ;; Orig-Date:    30-may-21 at 09:33:00
-;; Last-Mod:     19-Aug-23 at 01:12:57 by Bob Weiner
+;; Last-Mod:     23-Nov-23 at 01:44:46 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -323,7 +323,7 @@ Needed since hyperbole expands all links to absolute paths 
and
                     (save-excursion
                       (apply #'actype:act actype args)
                       (setq actype (hattr:get 'hbut:current 'actype))))
-                  ;; These shoulds show the value of these variables when you
+                  ;; These should show the value of these variables when you
                   ;; use the {l} command on failure, allowing quick debugging.
                   (should expected-ibtype)
                   (should expected-actype)
diff --git a/test/hui-select-tests.el b/test/hui-select-tests.el
index 7fdde5f21d..fb3ad9f4eb 100644
--- a/test/hui-select-tests.el
+++ b/test/hui-select-tests.el
@@ -3,7 +3,7 @@
 ;; Author:       Mats Lidell <matsl@gnu.org>
 ;;
 ;; Orig-Date:    14-Apr-22 at 23:45:52
-;; Last-Mod:     11-Jul-22 at 23:29:45 by Mats Lidell
+;; Last-Mod:     23-Nov-23 at 02:12:38 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -85,27 +85,40 @@
   (skip-unless (not noninteractive))
   (hui-select-reset)
   (with-temp-buffer
-    (insert "Buffer\n\nParagraph\nline.  One word.\n")
+    (insert "Buffer\n\nParagraph\nline.  One word.")
     (forward-char -3)
 
+    ;; word
     (should (hui-select-thing))
-    (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end)) "word"))
+    (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
+                    "word"))
+
+    ;; symbol
+    (should (hui-select-thing))
+    (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
+                    "word."))
 
+    ;; sentence
     (should (hui-select-thing))
-    (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end)) "One word."))
+    (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
+                    "One word."))
 
+    ;; line
     (should (hui-select-thing))
     (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
-                     "line.  One word.\n"))
+                     "line.  One word."))
 
+    ;; paragraph
     (should (hui-select-thing))
     (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
-                     "\nParagraph\nline.  One word.\n"))
+                     "\nParagraph\nline.  One word."))
 
+    ;; buffer
     (should (hui-select-thing))
     (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
-                     "Buffer\n\nParagraph\nline.  One word.\n"))
+                     "Buffer\n\nParagraph\nline.  One word."))
 
+    ;; error
     (should-not (hui-select-thing))
     (hy-test-helpers:should-last-message
      "(hui-select-boundaries): ‘buffer’ is the largest selectable region")))
@@ -117,12 +130,17 @@ Verifies right type of match is printed when 
`hui-select-display-type' is set to
   (let ((hui-select-display-type t))
     (hui-select-reset)
     (with-temp-buffer
-      (insert "Buffer\n\nParagraph\nline.  One word.\n")
+      (insert "Buffer\n\nParagraph\nline.  One word.")
       (forward-char -3)
+
       (should (call-interactively 'hui-select-thing))
       (hy-test-helpers:should-last-message "word")
       (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end)) "word"))
 
+      (should (call-interactively 'hui-select-thing))
+      (hy-test-helpers:should-last-message "symbol")
+      (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end)) "word."))
+
       (should (call-interactively 'hui-select-thing))
       (hy-test-helpers:should-last-message "sentence")
       (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end)) "One word."))
@@ -130,17 +148,17 @@ Verifies right type of match is printed when 
`hui-select-display-type' is set to
       (should (call-interactively 'hui-select-thing))
       (hy-test-helpers:should-last-message "line")
       (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
-                       "line.  One word.\n"))
+                       "line.  One word."))
 
       (should (call-interactively 'hui-select-thing))
       (hy-test-helpers:should-last-message "paragraph")
       (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
-                       "\nParagraph\nline.  One word.\n"))
+                       "\nParagraph\nline.  One word."))
 
       (should (call-interactively 'hui-select-thing))
       (hy-test-helpers:should-last-message "Buffer")
       (should (string= (buffer-substring-no-properties (region-beginning) 
(region-end))
-                       "Buffer\n\nParagraph\nline.  One word.\n"))
+                       "Buffer\n\nParagraph\nline.  One word."))
 
       (should-not (call-interactively 'hui-select-thing))
       (hy-test-helpers:should-last-message



reply via email to

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