branch: externals/hyperbole
commit d0a819c6195bbb2ed123c49150881c2ded7eecb0
Merge: ef2947bab8 b14310df58
Author: bw <[email protected]>
Commit: bw <[email protected]>

    Merge branch 'master' into rsw
---
 ChangeLog               |  32 +++++++++++
 hact.el                 |   4 +-
 hasht.el                |  17 +++---
 hbut.el                 |   8 +--
 hmail.el                |   4 +-
 hmouse-tag.el           |  14 ++---
 hpath.el                |  22 ++++----
 hproperty.el            |  10 ++--
 hsettings.el            |  12 ++--
 hsys-consult.el         |  11 ++--
 hsys-org.el             |   4 +-
 hui-mini.el             |  10 ++--
 hui-mouse.el            |  14 ++---
 hui-select.el           |  22 ++++----
 hui-window.el           |  14 ++---
 hui.el                  |   6 +-
 hycontrol.el            |  20 +++----
 hynote.el               |   3 +-
 hyperbole.el            |   4 +-
 hyrolo.el               |   4 +-
 hywconfig.el            |   4 +-
 hywiki.el               | 146 +++++++++++++++++++++++++++++-------------------
 kotl/kcell.el           |   4 +-
 kotl/kexport.el         |   6 +-
 kotl/kfile.el           |   4 +-
 kotl/kfill.el           |   6 +-
 kotl/kimport.el         |  10 ++--
 kotl/kotl-mode.el       |  18 +++---
 kotl/kview.el           |  14 ++---
 test/hywiki-tests.el    |  20 ++++++-
 test/kotl-mode-tests.el |  38 +++++++++----
 31 files changed, 301 insertions(+), 204 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 53b87cd116..9f11892f9f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,13 @@
 * test/hsys-org-tests.el (hsys-org:org-link-at-p): Fix 4th test
     by ensuring hywiki-mode is off.
 
+2026-01-07  Mats Lidell  <[email protected]>
+
+* hywiki.el (hywiki-mode): Remove arg value :toggle, not an alternative to
+    'toggle.
+
+* test/hywiki-tests.el (hywiki-test--hywiki-mode): Add test for hywiki-mode.
+
 2026-01-06  Bob Weiner  <[email protected]>
 
 * hywiki.el (hywiki-get-buffers-in-windows): Add and call in
@@ -45,6 +52,10 @@
             (hywiki-maybe-dehighlight-page-name): Rename to
     'hywiki-maybe-dehighlight-reference'.
 
+2025-12-31  Mats Lidell  <[email protected]>
+
+* Remove starting asterix from defcustom variable docstrings.
+
 2025-12-30  Bob Weiner  <[email protected]>
 
 * hywiki.el (hywiki-get-buffers): Add to return active hywiki-mode buffers.
@@ -68,6 +79,27 @@
 * hibtypes.el (hywiki-existing-word):
   hywiki.el (hywiki-word): Skip if not 'hywiki-active-in-current-buffer-p'.
 
+2025-12-25  Mats Lidell  <[email protected]>
+
+* hywiki.el (hywiki--preparation-function, hywiki--completion-function)
+    (hywiki-org-make-publish-project-alist): Use prepare and complete
+    project attributes to control use of hywiki-org-export-function with
+    org-export-before-parsing-functions. (Used before as advice on
+    org-element--generate-copy-script now removed since it affected other
+    export project.)
+    (hywiki-org-export-function): Remove old stack guard since function is
+    now called in another context.
+
+2025-12-24  Mats Lidell  <[email protected]>
+
+* hywiki.el (hywiki-reference-to-org-link): Refactor to handle pathname
+    and referent in separate functions.
+    (hywiki--pathname-reference-to-org-link): Original function for
+    pathname links.
+    (hywiki--referent-reference-to-org-link): Creates an info message link
+    that export of the referent type is not supported.
+    (hypb-msg): org-link-type for message links.
+
 2025-12-13  Bob Weiner  <[email protected]>
 
 * MANIFEST: Add "HY-TALK/HYPERBOLEQA.kotl" from EmacsConf2025 talk.
diff --git a/hact.el b/hact.el
index e50190210f..a4e1622053 100644
--- a/hact.el
+++ b/hact.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    18-Sep-91 at 02:57:09
-;; Last-Mod:     29-Aug-25 at 14:20:04 by Bob Weiner
+;; Last-Mod:     30-Dec-25 at 14:42:06 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -336,7 +336,7 @@ TYPE and TYPE-CATEGORY are both symbols.  TYPE-CATEGORY 
must be one of
 (defun action:param-count (action)
   "Return the number of args in ACTION's arg list.
 Keywords and special symbols like &optional and &key are excluded."
-  (length (seq-filter (lambda (sym) 
+  (length (seq-filter (lambda (sym)
                        (not (or (keywordp sym)
                                 (string-match "^&" (symbol-name sym)))))
                      (action:params action))))
diff --git a/hasht.el b/hasht.el
index af5b2576b5..b20b0a05a2 100644
--- a/hasht.el
+++ b/hasht.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    16-Mar-90 at 03:38:48
-;; Last-Mod:     29-Aug-25 at 02:16:00 by Bob Weiner
+;; Last-Mod:     30-Dec-25 at 14:42:14 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -136,12 +136,12 @@ in the hash table.  Use `hash-key-p' instead for that 
function."
 
 (defun hash-make (initializer &optional reverse)
   "Create and return a hash table from INITIALIZER.
-INITIALIZER may be an alist with elements of the form (<value>. <key>)
+INITIALIZER may be an alist with elements of the form (<value> . <key>)
 from which the hash table is built (<key> must be a string).
 Alternatively, it may be a non-negative integer which is used as the
 minimum size of a new, empty hash table.  Optional non-nil second
 argument REVERSE means INITIALIZER has elements of form
-(<key> . <value>).
+\(<key> . <value>).
 
 The resultant value associated with a <key> is the <value> from the last
 entry in INITIALIZER with that <key>.  See `hash-make-prepend' to
@@ -151,7 +151,7 @@ merge all the values for a given <key> instead."
             (make-hash-table :size initializer)
           (error "(hash-make): Initializer must be >= 0, not `%s'"
                  initializer)))
-       ((numberp initializer) 
+       ((numberp initializer)
         (error "(hash-make): Initializer must be a positive integer, not `%f'"
                initializer))
        (t (let* ((size (length initializer))
@@ -199,8 +199,8 @@ in reverse order of occurrence (they are prepended to the 
list).  See
 (defun hash-map (func hash-table)
   "Return the list from calling FUNC on (<value> . <string-key>) in HASH-TABLE.
 
-If FUNC is in \\='(cdr key second symbol-name), then return all <key>s
-as strings.  If FUNC is in \\='(car value first symbol-value), then
+If FUNC is in \\='(cdr key second `symbol-name'), then return all <key>s
+as strings.  If FUNC is in \\='(car value first `symbol-value'), then
 return all <value>s."
   (unless (hash-table-p hash-table)
     (error "(hash-map): Invalid hash-table: `%s'" hash-table))
@@ -305,7 +305,7 @@ This is suitable for use as a value of 
`hash-merge-values-function'."
 If KEY is not found in HASH-TABLE, it is added with a value of (list VALUE).
 
 Trigger an error if an existing VALUE is not a list.  Do nothing and return nil
-if KEY or HASH-TABLE are of the wrong type." 
+if KEY or HASH-TABLE are of the wrong type."
   (when (and (hash-table-p hash-table)
             (stringp key))
       (let* ((key-sym (intern key))
@@ -349,7 +349,7 @@ An error will occur if KEY is not found in HASH-TABLE."
     (let ((key-sym (intern-soft key)))
        (if (gethash key-sym hash-table)
            (puthash key-sym value hash-table)
-         (error "(hash-replace): `%s' key not found in hash table." key)))))
+         (error "(hash-replace): `%s' key not found in hash table" key)))))
 
 (defun hash-size (hash-table)
   "Return size of HASH-TABLE which is >= number of elements in the table.
@@ -381,3 +381,4 @@ Optional COUNT conses number of duplicates on to front of 
list before return."
   (if count (cons count sorted-strings) sorted-strings))
 
 (provide 'hasht)
+;;; hasht.el ends here
diff --git a/hbut.el b/hbut.el
index bb37b4754a..96c53c23fc 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:      7-Dec-25 at 19:24:08 by Bob Weiner
+;; Last-Mod:     30-Dec-25 at 23:55:08 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -963,7 +963,7 @@ The ibut used defaults to \='hbut:current or the optional 
IBUT-SYMBOL."
 
 (defun hattr:is-p (attr value &optional hbut-symbol)
   "Return t if ATTR has VALUE for \='hbut:current or optional HBUT-SYMBOL."
-  (and (symbolp attr) attr 
+  (and (symbolp attr) attr
        (eq (hattr:get (or (and (symbolp hbut-symbol) hbut-symbol) 
'hbut:current)
                      attr)
           value)))
@@ -1553,7 +1553,7 @@ positions at which the button delimiter begins and ends."
 (defun    hbut:map (but-func &optional regexp-match include-delims)
   "Apply BUT-FUNC to a set of hbuttons in the visible part of the current 
buffer.
 Finds both ebuts and named ibuts that match any optional REGEXP-MATCH
-(may be a partial match but must include delimiters).
+\(may be a partial match but must include delimiters).
 
 Any regexp given must have grouping 1 match the label.
 
@@ -1909,7 +1909,7 @@ excluding delimiters, not just one."
 
          (setq lbl-start-end (if (and start-delim end-delim)
                                  (ibut:label-p nil start-delim end-delim t t)
-                               (or 
+                               (or
                                 ;; <action> buttons can be longer
                                 ;; than two lines, so don't limit
                                 ;; the length.
diff --git a/hmail.el b/hmail.el
index ad3bc7ab7d..a99a79fce2 100644
--- a/hmail.el
+++ b/hmail.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     9-Oct-91 at 18:38:05
-;; Last-Mod:      5-Jan-25 at 12:01:15 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:02:19 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -56,7 +56,7 @@
  "Major mode for reading USENET news with Hyperbole buttons.")
 
 (defcustom hmail:init-function nil
-  "*Function (a symbol) to initialize Hyperbole support for a mail 
reader/composer.
+  "Function (a symbol) to initialize Hyperbole support for a mail 
reader/composer.
 Valid values are: nil, Mh-init or Rmail-init."
   :type '(choice (const nil)
                 (const Mh-init)
diff --git a/hmouse-tag.el b/hmouse-tag.el
index 927a4bfbe4..11a1b89d48 100644
--- a/hmouse-tag.el
+++ b/hmouse-tag.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    24-Aug-91
-;; Last-Mod:      7-Dec-25 at 20:25:10 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:02:19 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -111,7 +111,7 @@ should insert the implicit link type definition name.")
 (define-obsolete-variable-alias 'smart-asm-include-dirs
   'smart-asm-include-path "06.00")
 (defcustom smart-asm-include-path nil
-  "*Ordered list of directories to search for assembly language include files.
+  "Ordered list of directories to search for assembly language include files.
 Each directory must end with a directory separator."
   :type '(repeat directory)
   :group 'hyperbole-commands)
@@ -130,7 +130,7 @@ Examples include:
 (define-obsolete-variable-alias 'smart-c-cpp-include-dirs
   'smart-c-cpp-include-path "06.00")
 (defcustom smart-c-cpp-include-path '("/usr/include/")
-  "*Ordered list of include directories by default searched by C/C++ 
preprocessor.
+  "Ordered list of include directories by default searched by C/C++ 
preprocessor.
 Each directory must end with a directory separator.  See also
 `smart-c-include-path'."
   :type '(repeat directory)
@@ -139,7 +139,7 @@ Each directory must end with a directory separator.  See 
also
 (define-obsolete-variable-alias 'smart-c-include-dirs
   'smart-c-include-path "06.00")
 (defcustom smart-c-include-path nil
-  "*Ordered list of directories to search for C/C++ include files.
+  "Ordered list of directories to search for C/C++ include files.
 Each directory must end with a directory separator.  Directories normally
 searched by the C/C++ pre-processor should be set instead in
 `smart-c-cpp-include-path'."
@@ -173,7 +173,7 @@ File name is grouping 3.")
 (defcustom smart-java-package-path
   (and (fboundp 'getenv) (getenv "JAVA_HOME")
        (list (expand-file-name "src/" (file-name-as-directory (getenv 
"JAVA_HOME")))))
-  "*Ordered list of directories to search for imported Java packages.
+  "Ordered list of directories to search for imported Java packages.
 Each directory must end with a directory separator."
   :type '(repeat directory)
   :group 'hyperbole-commands)
@@ -186,12 +186,12 @@ Each directory must end with a directory separator."
 Keyword matched is grouping 1.  Referent is grouping 2.")
 
 (defcustom smart-emacs-tags-file nil
-  "*Full path name of etags file for GNU Emacs source."
+  "Full path name of etags file for GNU Emacs source."
   :type '(file :must-match t)
   :group 'hyperbole-commands)
 
 (defcustom smart-tags-mode-list '(fundamental-mode prog-mode text-mode)
-  "*Major modes where programming symbols are recognized by the Smart Keys."
+  "Major modes where programming symbols are recognized by the Smart Keys."
   :type '(repeat symbol)
   :group 'hyperbole-commands)
 
diff --git a/hpath.el b/hpath.el
index 08d2dc275c..5a830de20e 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:      7-Dec-25 at 21:12:14 by Bob Weiner
+;; Last-Mod:      1-Jan-26 at 18:17:35 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -43,7 +43,7 @@
                                              icomplete-mode ivy-mode
                                              org-roam-mode vertico-mode
                                               selectrum-mode)
-  "*List of boolean mode variables whose modes automatically list completions.
+  "List of boolean mode variables whose modes automatically list completions.
 These are modes where completions are listed without the need for
 pressing the ? key."
   :type '(repeat variable)
@@ -355,7 +355,7 @@ Call this function manually if mount points change after 
Hyperbole is loaded."
 ;;; ************************************************************************
 
 (defcustom hpath:external-open-office-suffixes 
"doc[mx]?\\|od[st]\\|ppsx?\\|ppt[mx]?\\|v[dst][s]?[tx]\\|vsd[x]?\\|xls[mx]?"
-  "*Regexp of Open Office document suffix alternatives.
+  "Regexp of Open Office document suffix alternatives.
 These are to be display externally with the Action Key
 Do not include an initial period or enclosing grouping parentheses;
 these will be added automatically.
@@ -366,7 +366,7 @@ possible suffixes."
   :group 'hyperbole-commands)
 
 (defcustom hpath:external-file-suffixes 
"e?ps\\|dvi\\|pdf\\|ps\\.g?[zZ]\\|gif\\|tiff?\\|xpm\\|xbm\\|xwd\\|pm\\|pbm\\|jpe?g\\|xcf"
-  "*Non-operating system dependent regexp of file suffixes to open outside 
Emacs.
+  "Non-operating system dependent regexp of file suffixes to open outside 
Emacs.
 These are opened with the Action Key when not handled by
 `hpath:native-image-suffixes'.  Do not include an initial period
 or enclosing grouping parentheses; these will be added
@@ -378,7 +378,7 @@ automatically."
                                                                  
hpath:external-open-office-suffixes
                                                                  
hpath:external-file-suffixes)
                                                          "open"))
-  "*An alist of (FILENAME-REGEXP . DISPLAY-PROGRAM-STRING-OR-LIST) for the 
macOS.
+  "An alist of (FILENAME-REGEXP . DISPLAY-PROGRAM-STRING-OR-LIST) for the 
macOS.
 See the function `hpath:get-external-display-alist' for detailed
 format documentation."
   :type '(alist :key-type regexp :value-type string)
@@ -388,7 +388,7 @@ format documentation."
                                                              "openoffice.exe")
                                                        (cons (format 
"\\.\\(%s\\|vba\\)$" hpath:external-file-suffixes)
                                                              
"/c/Windows/System32/cmd.exe //c start \"${@//&/^&}\""))
-  "*An alist of (FILENAME-REGEXP . DISPLAY-PROGRAM-STRING-OR-LIST) for MS 
Windows.
+  "An alist of (FILENAME-REGEXP . DISPLAY-PROGRAM-STRING-OR-LIST) for MS 
Windows.
 See the function `hpath:get-external-display-alist' for detailed
 format documentation."
   :type '(alist :key-type regexp :value-type string)
@@ -408,7 +408,7 @@ format documentation."
                                                              
hpath:external-open-office-suffixes
                                                              
hpath:external-file-suffixes)
                                                      "setsid -w xdg-open"))
-  "*An alist of (FILENAME-REGEXP . DISPLAY-PROGRAM-STRING-OR-LIST) for X.
+  "An alist of (FILENAME-REGEXP . DISPLAY-PROGRAM-STRING-OR-LIST) for X.
 See the function `hpath:get-external-display-alist' for detailed
 format documentation."
   :type '(alist :key-type regexp :value-type string)
@@ -456,7 +456,7 @@ format documentation."
                  (error "Invalid file"))))))
 
     '("\\.rdb\\'" . rdb:initialize)))
-  "*Alist for calling special functions to display file types in Emacs.
+  "Alist for calling special functions to display file types in Emacs.
 The alist consists of (FILENAME-REGEXP . EDIT-FUNCTION) elements.
 See also the function (hpath:get-external-display-alist) for
 external display program settings."
@@ -558,7 +558,7 @@ Used only if the function `image-mode' is defined."
 ;;
 (defcustom hpath:variables
   '(hyperb:dir hywiki-directory load-path exec-path Info-directory-list 
sm-directory)
-  "*List of Emacs Lisp variable symbols to substitute within matching link 
paths.
+  "List of Emacs Lisp variable symbols to substitute within matching link 
paths.
 Each variable value, if bound, must be either a pathname or a list of 
pathnames.
 When embedded within a path, the format is ${variable}."
   :type '(repeat variable)
@@ -572,7 +572,7 @@ When embedded within a path, the format is ${variable}."
   "*Url pattern for (hpath:rfc rfc-num) to get the RFC document for 
`rfc-num'.")
 
 (defcustom hpath:suffixes '(".gz" ".Z")
-  "*List of filename suffixes to add or remove within hpath calls.
+  "List of filename suffixes to add or remove within hpath calls.
 Used by `hpath:exists-p' and `hpath:substitute-dir'."
   :type '(repeat string)
   :group 'hyperbole-commands)
@@ -1835,7 +1835,7 @@ the end following a # or , character are temporarily 
stripped, and path
 variables are expanded with `hpath:substitute-value'.  This normalized path
 form is what is returned for PATH."
   (when (and (stringp path)
-            (or 
+            (or
              ;; Due to the colons, "hui.el#save-excursion:I2:L2:C30",
              ;; will improperly match to a PATH variable. Ensure it doesn't.
              (string-match hpath:instance-line-column-regexp path)
diff --git a/hproperty.el b/hproperty.el
index f4cf5bb6bd..5c63146a28 100644
--- a/hproperty.el
+++ b/hproperty.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    21-Aug-92
-;; Last-Mod:      5-Oct-25 at 16:41:34 by Mats Lidell
+;; Last-Mod:     31-Dec-25 at 16:02:19 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -41,24 +41,24 @@
 ;;; ************************************************************************
 
 (defcustom hproperty:but-highlight-flag t
-  "*Non-nil means highlight named Hyperbole buttons with `hproperty:but-face'."
+  "Non-nil means highlight named Hyperbole buttons with `hproperty:but-face'."
   :type 'boolean
   :group 'hyperbole-buttons)
 
 (defcustom hproperty:but-emphasize-flag nil
-  "*Non-nil means emphasize selectability of Hyperbole button labels.
+  "Non-nil means emphasize selectability of Hyperbole button labels.
 This is shown when hovering over the button with the mouse."
   :type 'boolean
   :group 'hyperbole-buttons)
 
 (defcustom hproperty:but-flash-time 1000
-  "*Emacs button flash delay."
+  "Emacs button flash delay."
   :type '(integer :match (lambda (_widget value) (and (integerp value) (> 
value 0))))
   :group 'hyperbole-buttons)
 (make-obsolete-variable 'hproperty:but-flash-time "Use 
`hproperty:but-flash-time-seconds' instead" "8.0")
 
 (defcustom hproperty:but-flash-time-seconds 0.05
-  "*Emacs button flash delay."
+  "Emacs button flash delay."
   :type 'float
   :group 'hyperbole-buttons)
 
diff --git a/hsettings.el b/hsettings.el
index cac10afe16..4fe7c78f94 100644
--- a/hsettings.el
+++ b/hsettings.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    15-Apr-91 at 00:48:49
-;; Last-Mod:     29-Jun-24 at 18:57:18 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:06:23 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -101,12 +101,12 @@ The Smart Menu system must have already been loaded.  If 
a Smart
 Menu is already displayed, perform another Action or Assist Key function.")
 
 (defcustom hmouse-middle-flag (and (boundp 'infodock-version) infodock-version 
t)
-  "*Non-nil means additionally bind the middle mouse button as an Action Key."
+  "Non-nil means additionally bind the middle mouse button as an Action Key."
   :type 'boolean
   :group 'hyperbole-keys)
 
 (defcustom smart-scroll-proportional t
-  "*Non-nil means Smart Key scroll behavior is relative to current line.
+  "Non-nil means Smart Key scroll behavior is relative to current line.
 Smart Keys will scroll relative to current line when pressed at
 the end of a line.  Action Key moves current line to top of the
 window.  Assist Key moves current line to bottom of the window.
@@ -233,7 +233,7 @@ disable/inhibit support."
               (if inhibit-hyperbole-messaging "disabled" "enabled"))))
 
 (defcustom inhibit-hyperbole-messaging t
-  "*Determine whether Hyperbole supports explicit buttons in mail and news 
buffers.
+  "Determine whether Hyperbole supports explicit buttons in mail and news 
buffers.
 The default of t means disable such support (work remains to
 modernize these features).  When t, Hyperbole will not alter
 messaging mode hooks nor overload functions from these packages,
@@ -251,7 +251,7 @@ Hyperbole, and then restart Emacs."
   :group 'hyperbole-buttons)
 
 (defcustom hyperbole-web-search-browser-function browse-url-browser-function
-  "*Function of one url argument called by any Hyperbole Find/Web search."
+  "Function of one url argument called by any Hyperbole Find/Web search."
   :type 'function
   :group 'hyperbole-commands)
 
@@ -275,7 +275,7 @@ Hyperbole, and then restart Emacs."
     ("Wikipedia" . "https://en.wikipedia.org/wiki/%s";)
     ("X" . "https://x.com/search?q=%s";)
     ("Youtube" . "https://www.youtube.com/results?search_query=%s";))
-  "*Alist of (web-service-name . emacs-cmd-or-url-with-%s-parameter) elements.
+  "Alist of (web-service-name . emacs-cmd-or-url-with-%s-parameter) elements.
 The first capitalized character of each web-service-name must be unique.
 This custom option is used in the Hyperbole Find/Web menu where
 the %s in the url-with-%s-parameter is replaced with an interactively
diff --git a/hsys-consult.el b/hsys-consult.el
index 6790750e80..45340ccc9c 100644
--- a/hsys-consult.el
+++ b/hsys-consult.el
@@ -2,7 +2,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     4-Jul-24 at 09:57:18
-;; Last-Mod:     10-Aug-25 at 12:43:19 by Bob Weiner
+;; Last-Mod:     30-Dec-25 at 14:42:23 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -177,10 +177,11 @@ prompt."
 
 (defun hsys-consult-grep-headlines-read-regexp (grep-function prompt
                                                &optional regexp)
-  "With `consult', use GREP-FUNCTION and PROMPT to completing read an
-optional REGEXP, the initial pattern for the grep.  Suppress preview
-and return the selected \"file:line:line-contents\".  GREP-FUNCTION
- must take these arguments: regexp max-matches path-list prompt.
+  "With `consult', use GREP-FUNCTION and PROMPT to completing read.
+The optional REGEXP is an initial pattern for the grep.  Suppress
+preview and return the selected \"file:line:line-contents\".
+GREP-FUNCTION must take these arguments: regexp max-matches path-list
+prompt.
 
 Without `consult', just read a REGEXP with PROMPT."
   (if (hsys-consult-active-p)
diff --git a/hsys-org.el b/hsys-org.el
index a7c5a15ed0..add084ecf7 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:     22-Nov-25 at 12:07:13 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 00:03:26 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -512,7 +512,7 @@ either [[referent][description]] or [[referent]].
 
 If point is on a HyWikiWord within an Org link and HyWikiWords are
 recognized in the current buffer, ignore the Org link and return nil
-(handle these elsewhere as implicit buttons).
+\(handle these elsewhere as implicit buttons).
 
 Assume caller has already checked that the current buffer is in
 `org-mode' or is looking for an Org link in a non-Org buffer type."
diff --git a/hui-mini.el b/hui-mini.el
index ac09f62648..182aaf4fb7 100644
--- a/hui-mini.el
+++ b/hui-mini.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    15-Oct-91 at 20:13:17
-;; Last-Mod:     30-Nov-25 at 17:51:11 by Bob Weiner
+;; Last-Mod:      1-Jan-26 at 18:18:17 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -817,7 +817,7 @@ command instead.  Typically prevents clashes over {\\`C-c' 
/}."
          ("Proportionally" (setq smart-scroll-proportional t))
          ("Windowful"      (setq smart-scroll-proportional nil))))
        '(cust-hywiki-mode .
-        (("HyWiki Mode>")        
+        (("HyWiki Mode>")
          ("All-Editable-Buffers" (hywiki-mode :all)
           "HyWikiWords are highlighted and active in buffers outside of the 
HyWiki page directory.")
          ("HyWiki-Pages-Only"    (hywiki-mode :pages)
@@ -1039,7 +1039,7 @@ command instead.  Typically prevents clashes over 
{\\`C-c' /}."
 ;;; ************************************************************************
 
 (defcustom hui:menu-highlight-flag t
-  "*If non-nil, highlight the first capitalized character of each menu item.
+  "Non-nil means highlight the first capitalized character of each menu item.
 Highlight with `read-multiple-choice-face'.  The display must
 support underlined faces as well."
   :type 'boolean
@@ -1081,7 +1081,7 @@ support underlined faces as well."
         (when (fboundp 'consult-grep) ;; allow for autoloading
           '("WikiWordConsult" hywiki-word-consult-grep
             "Use `hywiki-consult-grep' to show occurrences of a prompted for 
HyWikiWord."))))
-  "*Hyperbole minibuffer HyWiki menu items of the form:
+  "Hyperbole minibuffer HyWiki menu items of the form:
 \(LABEL-STRING ACTION-SEXP DOC-STR)."
   :set  (lambda (var value)
          (if (fboundp #'hyperbole-minibuffer-menu)
@@ -1112,7 +1112,7 @@ support underlined faces as well."
         '("TagFind"          hyrolo-tags-view              "Find HyRolo Org 
tags.")
         '("WordFind"         hyrolo-word                   "Find entries 
containing words.")
         '("Yank"             hyrolo-yank                   "Find an entry 
containing a string and insert it at point.")))
-  "*Hyperbole minibuffer Rolo menu items of the form:
+  "Hyperbole minibuffer Rolo menu items of the form:
 \(LABEL-STRING ACTION-SEXP DOC-STR)."
   :set  (lambda (var value)
          (if (fboundp #'hyperbole-minibuffer-menu)
diff --git a/hui-mouse.el b/hui-mouse.el
index 3e4372c9b1..b71468709e 100644
--- a/hui-mouse.el
+++ b/hui-mouse.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    04-Feb-89
-;; Last-Mod:      7-Dec-25 at 20:15:46 by Bob Weiner
+;; Last-Mod:      1-Jan-26 at 18:18:24 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -130,34 +130,34 @@ In any other context, signal an error."
     (hypb:error "(Hyperbole Assist Key): No action defined for this context; 
try another location")))
 
 (defcustom action-key-default-function #'action-key-error
-  "*Function run by the Action Key in an unspecified context.
+  "Function run by the Action Key in an unspecified context.
 Set it to `hyperbole' if you want it to display the Hyperbole minibuffer menu."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom assist-key-default-function #'assist-key-error
-  "*Function run by the Assist Key in an unspecified context.
+  "Function run by the Assist Key in an unspecified context.
 Set it to `hkey-summarize' if you want it to display a summary of
 Smart Key behavior."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom action-key-modeline-buffer-id-function #'dired-jump
-  "*Function to call for Action Key clicks on the buf id portion of a modeline.
+  "Function to call for Action Key clicks on the buf id portion of a modeline.
 Its default value is `dired-jump'; set it to `smart-treemacs-modeline'
 to use the Treemacs file manager package instead."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom action-key-eol-function #'smart-scroll-up
-  "*Function run by the Action Key at the end of a line.
+  "Function run by the Action Key at the end of a line.
 Its default value is `smart-scroll-up'.  To disable it, set it to
 #\\='ignore."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom assist-key-eol-function #'smart-scroll-down
-  "*Function run by the Assist Key at the end of a line.
+  "Function run by the Assist Key at the end of a line.
 Its default value is `smart-scroll-down'.  To disable it, set it to
 #\\='ignore."
   :type 'function
@@ -1866,7 +1866,7 @@ When the Action Key is pressed and 
`hsys-org-enable-smart-keys' is t:
   3. On an Org agenda view item, jump to the item for editing.
 
 When the Action Key is pressed and `hsys-org-enable-smart-keys' is
-either `t' or `:buttons':
+either t or `:buttons':
 
   4. 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/hui-select.el b/hui-select.el
index 265e47a3ef..6f7db542ef 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:     29-Aug-25 at 21:52:32 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:07:18 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -125,7 +125,7 @@
   (format "%sgrep -insIHr" (if (and (executable-find "zgrep")
                                     (string-match-p "bsd" 
(shell-command-to-string "zgrep --version | head -1")))
                                "z" ""))
-  "*Grep command string and initial arguments sent to `hui-select-rgrep' 
command.
+  "Grep command string and initial arguments sent to `hui-select-rgrep' 
command.
 It must end with a space."
   :type 'string
   :group 'hyperbole-commands)
@@ -133,19 +133,19 @@ It must end with a space."
 (defcustom hui-select-brace-modes
   '(c++-mode c++-ts-mode c-mode c-ts-mode java-mode java-ts-mode objc-mode
              perl-mode tcl-mode)
-  "*List of language major modes which define things with brace delimiters."
+  "List of language major modes which define things with brace delimiters."
   :type '(repeat (function :tag "Mode"))
   :group 'hyperbole-commands)
 
 (defcustom hui-select-markup-modes
   '(html-mode mhtml-mode nxml-mode sgml-mode web-mode)
-  "*List of markup language modes that use SGML-style <tag> </tag> pairs."
+  "List of markup language modes that use SGML-style <tag> </tag> pairs."
   :type '(repeat (function :tag "Mode"))
   :group 'hyperbole-commands)
 
 (defcustom hui-select-text-modes
   '(fundamental-mode kotl-mode indented-text-mode Info-mode outline-mode 
text-mode)
-  "*List of textual modes where paragraphs may be outdented or indented."
+  "List of textual modes where paragraphs may be outdented or indented."
   :type '(repeat (function :tag "Mode"))
   :group 'hyperbole-commands)
 
@@ -153,14 +153,14 @@ It must end with a space."
   (append '(altmath-mode asm-mode csh-mode eiffel-mode ksh-mode math-mode 
miranda-mode
                          pascal-mode python-mode python-ts-mode sather-mode)
          hui-select-text-modes)
-  "*List of modes that use indentation mostly to define syntactic structure.
+  "List of modes that use indentation mostly to define syntactic structure.
 Use for language major modes."
   :type '(repeat (function :tag "Mode"))
   :group 'hyperbole-commands)
 
 (defcustom hui-select-ignore-quoted-sexp-modes
   '(debugger-mode emacs-lisp-mode lisp-mode lisp-interaction-mode slime-mode 
cider-mode)
-  "*List of modes in which to ignore quoted sexpressions for syntactic matches.
+  "List of modes in which to ignore quoted sexpressions for syntactic matches.
 Use for language major modes."
   :type '(repeat (function :tag "Mode"))
   :group 'hyperbole-commands)
@@ -202,17 +202,17 @@ Used to avoid early dropoff when marking indented code.")
 Used to include a final line when marking indented code.")
 
 (defcustom hui-select-char-p nil
-  "*If t, return single character boundaries when all else fails."
+  "If t, return single character boundaries when all else fails."
   :type 'boolean
   :group 'hyperbole-commands)
 
 (defcustom hui-select-display-type t
-  "*If t, display the thing selected with each mouse click."
+  "If t, display the thing selected with each mouse click."
   :type 'boolean
   :group 'hyperbole-commands)
 
 (defcustom hui-select-whitespace t
-  "*If t, groups of whitespace are considered as things."
+  "If t, groups of whitespace are considered as things."
   :type 'boolean
   :group 'hyperbole-commands)
 
@@ -419,7 +419,7 @@ The function `hui-select-set-region' updates and returns 
it.")
     (?   . hui-select-whitespace)
     (?\< . hui-select-comment)
     (?\. . hui-select-punctuation))
-  "*Unordered list of pairs of the form (<syntax-char> <function>).
+  "Unordered list of pairs of the form (<syntax-char> <function>).
 Used by the function `hui-select-syntactical-region'.
 Each <function> takes a single position argument and returns a
 region (start . end) defining the boundaries of the thing at that position."
diff --git a/hui-window.el b/hui-window.el
index 49f1b4a526..3e861d2d75 100644
--- a/hui-window.el
+++ b/hui-window.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    21-Sep-92
-;; Last-Mod:     19-Jun-25 at 11:44:26 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:02:19 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -71,13 +71,13 @@
 ;;; ************************************************************************
 
 (defcustom action-key-minibuffer-function #'hyperbole
-  "*Function run by the Action Key after a click in an inactive minibuffer.
+  "Function run by the Action Key after a click in an inactive minibuffer.
 Its default value is `hyperbole', which displays the Hyperbole minibuffer 
menu."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom assist-key-minibuffer-function #'hui-menu-screen-commands
-  "*Function run by the Assist Key after a click in an inactive minibuffer.
+  "Function run by the Assist Key after a click in an inactive minibuffer.
 Its default value is `hui-menu-screen-commands', which displays a popup menu
 of screen control commands."
   :type 'function
@@ -95,25 +95,25 @@ of screen control commands."
   :group 'hyperbole-keys)
 
 (defcustom action-key-modeline-left-edge-function 
#'action-key-modeline-click-left-edge
-  "*Function run on an Action Mouse Key click at a modeline left edge.
+  "Function run on an Action Mouse Key click at a modeline left edge.
 To disable it, set it to #\\='ignore."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom assist-key-modeline-left-edge-function 
#'assist-key-modeline-click-left-edge
-  "*Function run on an Assist Mouse Key click at a modeline left edge.
+  "Function run on an Assist Mouse Key click at a modeline left edge.
 To disable it, set it to #\\='ignore."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom action-key-modeline-right-edge-function 
#'action-key-modeline-click-right-edge
-  "*Function run on an Action Mouse Key click at a modeline right edge.
+  "Function run on an Action Mouse Key click at a modeline right edge.
 To disable it, set it to #\\='ignore."
   :type 'function
   :group 'hyperbole-keys)
 
 (defcustom assist-key-modeline-right-edge-function 
#'assist-key-modeline-click-right-edge
-  "*Function run on an Assist Mouse Key click at a modeline right edge.
+  "Function run on an Assist Mouse Key click at a modeline right edge.
 To disable it, set it to #\\='ignore."
   :type 'function
   :group 'hyperbole-keys)
diff --git a/hui.el b/hui.el
index 986076c6bf..9d90f070c4 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:     23-Nov-25 at 12:44:22 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:02:19 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -51,12 +51,12 @@
 ;;; ************************************************************************
 
 (defcustom hui:ebut-prompt-for-action nil
-  "*Non-nil prompts for a button-specific action on explicit button creation."
+  "Non-nil prompts for a button-specific action on explicit button creation."
   :type 'boolean
   :group 'hyperbole-buttons)
 
 (defcustom hui:hbut-delete-confirm-flag t
-  "*Non-nil means prompt before interactively deleting explicit buttons."
+  "Non-nil means prompt before interactively deleting explicit buttons."
   :type 'boolean
   :group 'hyperbole-buttons)
 
diff --git a/hycontrol.el b/hycontrol.el
index 6c47c4f963..964411a3e7 100644
--- a/hycontrol.el
+++ b/hycontrol.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     1-Jun-16 at 15:35:36
-;; Last-Mod:     26-Oct-25 at 16:04:51 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:02:19 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -164,22 +164,22 @@ evaluated with the buffer argument as the current buffer, 
e.g. (eq
 major-mode \\='c-mode).")
 
 (defcustom hycontrol-help-flag t
-  "*Non-nil means show key binding help in the minibuffer when in a HyControl 
mode."
+  "Non-nil means show key binding help in the minibuffer when in a HyControl 
mode."
   :type 'boolean
   :group 'hyperbole-screen)
 
 (defcustom hycontrol-invert-mode-line-flag t
-  "*Non-nil means invert mode-line to emphasize the special key bindings in 
effect."
+  "Non-nil means invert mode-line to emphasize the special key bindings in 
effect."
   :type 'boolean
   :group 'hyperbole-screen)
 
 (defcustom hycontrol-keep-window-flag nil
-  "*Non-nil means leave original window when tear off window to another frame."
+  "Non-nil means leave original window when tear off window to another frame."
   :type 'boolean
   :group 'hyperbole-screen)
 
 (defcustom hycontrol-maximum-units 1000
-  "*Maximum units setting allowed for hycontrol commands.
+  "Maximum units setting allowed for hycontrol commands.
 The unit counter resets to the last digit entered whenever this
 value is exceeded."
   :type '(integer :match (lambda (_widget value)
@@ -188,7 +188,7 @@ value is exceeded."
   :group 'hyperbole-screen)
 
 (defcustom hycontrol-frame-offset '(13 . 23)
-  "*Increase in offset for new hycontrol frames relative to the selected frame.
+  "Increase in offset for new hycontrol frames relative to the selected frame.
 Its value is an (x-offset . y-offset) pair in pixels."
   :type '(cons integer integer)
   :group 'hyperbole-screen)
@@ -211,25 +211,25 @@ Lisp boolean form to evaluate.
 The final predicate should always be t, for default values, typically of 
zero.")
 
 (defcustom hycontrol-screen-top-offset    0
-  "*Pixel offset from top used when placing a frame at a top corner."
+  "Pixel offset from top used when placing a frame at a top corner."
   :type '(integer :match (lambda (_widget value)
                           (and (integerp value) (>= value 0)
                                (< value (display-pixel-height)))))
   :group 'hyperbole-screen)
 (defcustom hycontrol-screen-right-offset  0
-  "*Pixel offset from right used when placing a frame at a right corner."
+  "Pixel offset from right used when placing a frame at a right corner."
   :type '(integer :match (lambda (_widget value)
                           (and (integerp value) (>= value 0)
                                (< value (display-pixel-width)))))
   :group 'hyperbole-screen)
 (defcustom hycontrol-screen-bottom-offset 0
-  "*Pixel offset from bottom used when placing a frame at a bottom corner."
+  "Pixel offset from bottom used when placing a frame at a bottom corner."
   :type '(integer :match (lambda (_widget value)
                           (and (integerp value) (>= value 0)
                                (< value (display-pixel-height)))))
   :group 'hyperbole-screen)
 (defcustom hycontrol-screen-left-offset   0
-  "*Pixel offset from left used when placing a frame at a left corner."
+  "Pixel offset from left used when placing a frame at a left corner."
   :type '(integer :match (lambda (_widget value)
                           (and (integerp value) (>= value 0)
                                (< value (display-pixel-width)))))
diff --git a/hynote.el b/hynote.el
index e7099e375e..9f142db8b9 100644
--- a/hynote.el
+++ b/hynote.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    23-Jun-24 at 12:50:37
-;; Last-Mod:      2-Jan-26 at 20:13:25 by Bob Weiner
+;; Last-Mod:     18-Jan-26 at 08:29:26 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -165,3 +165,4 @@ relative to `hynote-directory-list'."
 ;;; ************************************************************************
 
 (provide 'hynote)
+;;; hynote.el ends here
diff --git a/hyperbole.el b/hyperbole.el
index b85a01d908..3740e58a3b 100644
--- a/hyperbole.el
+++ b/hyperbole.el
@@ -9,7 +9,7 @@
 ;; Maintainer:   Robert Weiner <[email protected]>
 ;; Maintainers:  Robert Weiner <[email protected]>, Mats Lidell <[email protected]>
 ;; Created:      06-Oct-92 at 11:52:51
-;; Last-Mod:      6-Jan-26 at 00:54:01 by Bob Weiner
+;; Last-Mod:     18-Jan-26 at 08:29:42 by Bob Weiner
 ;; Released:     10-Mar-24
 ;; Version:      9.0.2pre
 ;; Keywords:     comm, convenience, files, frames, hypermedia, languages, 
mail, matching, mouse, multimedia, outlines, tools, wp
@@ -187,7 +187,7 @@ Info documentation at \"(hyperbole)Top\".
 ;;; ************************************************************************
 
 (defcustom hkey-init t
-  "*A non-nil value (default) at system load time binds Hyperbole keys.
+  "A non-nil value (default) at system load time binds Hyperbole keys.
 Keys bound are the Action and Assist Keyboard Keys, as well as
 other keys.  {\\[hkey-either]} invokes the Action Key and
 {\\`C-u' \\[hkey-either]} invokes the Assist Key.  Additionally,
diff --git a/hyrolo.el b/hyrolo.el
index c068fd1511..48ada801e8 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:     22-Nov-25 at 07:54:28 by Bob Weiner
+;; Last-Mod:     30-Dec-25 at 14:42:32 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1590,7 +1590,7 @@ the entry to be inserted.
 
 With optional prefix arg, REGEXP-FLAG, treat NAME as a regular expression
 instead of a string."
-  (interactive (list 
+  (interactive (list
                (hsys-consult-grep-headlines-read-regexp
                 #'hyrolo-consult-grep "Yank rolo headline matching")
                current-prefix-arg))
diff --git a/hywconfig.el b/hywconfig.el
index bd821594aa..9965d67f8a 100644
--- a/hywconfig.el
+++ b/hywconfig.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    15-Mar-89
-;; Last-Mod:     20-Jan-24 at 20:20:58 by Mats Lidell
+;; Last-Mod:     31-Dec-25 at 16:02:19 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -59,7 +59,7 @@
 
 (define-obsolete-variable-alias 'wconfig-ring-max 'hywconfig-ring-max "06.00")
 (defcustom hywconfig-ring-max 10
-  "*Max length of Hyperbole window config ring before oldest elements are 
deleted."
+  "Max length of Hyperbole window config ring before oldest elements are 
deleted."
   :type `(integer
           :match ,(lambda (_widget value) (and (integerp value) (> value 0))))
   :group 'hyperbole-screen)
diff --git a/hywiki.el b/hywiki.el
index c19103298c..578e84d693 100644
--- a/hywiki.el
+++ b/hywiki.el
@@ -3,11 +3,11 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    21-Apr-24 at 22:41:13
-;; Last-Mod:     13-Jan-26 at 01:04:15 by Bob Weiner
+;; Last-Mod:     18-Jan-26 at 08:31:39 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
-;; Copyright (C) 2024-2025  Free Software Foundation, Inc.
+;; Copyright (C) 2024-2026  Free Software Foundation, Inc.
 ;; See the "HY-COPY" file for license information.
 ;;
 ;; This file is part of GNU Hyperbole.
@@ -123,7 +123,7 @@
 ;;
 ;; hywiki-referent-prompt-flag      When nil                   When t
 ;;  
-------------------------------------------------------------------------------------
-;;  Action Key              hywiki-word-create-and-display 
+;;  Action Key              hywiki-word-create-and-display
 ;;    or HyWiki/Create      Create Page and Display          Create Referent 
and Display
 ;;  Assist Key              hywiki-word-create-and-display
 ;;    or C-u HyWiki/Create  Create Referent and Display      Create Page and 
Display
@@ -337,8 +337,9 @@ nil means no full buffer highlighting has occurred.")
     open-line                         ;; C-o
     quoted-insert                     ;; C-q
     )
-  "Commands that insert characters but whose input events do not
-  arrive as characters or that quote another character for input.")
+  "List of non character commands.
+Commands that insert characters but whose input events do not
+arrive as characters or that quote another character for input.")
 
 ;; Define the keymap for hywiki-mode.
 (defvar hywiki-mode-map nil
@@ -404,6 +405,16 @@ where PATH is the un-resolvable reference."
   :type 'string
   :group 'hyperbole-hywiki)
 
+(defun hywiki--preparation-function (_project-plist)
+  "Setup export hook functions."
+  (message "Hywiki export is in preparation.")
+  (add-hook 'org-export-before-parsing-functions #'hywiki-org-export-function))
+
+(defun hywiki--completion-function (_project-plist)
+  "Remove export hook function."
+  (remove-hook 'org-export-before-parsing-functions 
#'hywiki-org-export-function)
+  (message "Hywiki export is completed."))
+
 (defvar hywiki-org-publish-project-alist nil
   "HyWiki-specific export properties added to `org-publish-project-alist'.")
 
@@ -412,6 +423,8 @@ where PATH is the un-resolvable reference."
        hywiki-org-publish-project-alist
        (list
         "hywiki"
+         :preparation-function 'hywiki--preparation-function
+         :completion-function 'hywiki--completion-function
         :auto-sitemap t
         :base-directory (expand-file-name hywiki-directory)
         :html-head (format
@@ -447,7 +460,7 @@ For reference, this is set when 
`window-buffer-change-functions' calls
 `hywiki-maybe-highlight-references' which calls `hywiki-in-page-p'.")
 
 (defcustom hywiki-referent-prompt-flag nil
-  "When t, the Action Key and HyWiki/Create always prompt for referent type.
+  "Non-nil means the Action Key and HyWiki/Create always prompt for referent 
type.
 Nil by default."
   :type 'boolean
   :initialize #'custom-initialize-default
@@ -788,9 +801,9 @@ See the Info documentation at \"(hyperbole)HyWiki\".
       (setq hywiki-mode :pages)))
 
     ;; Normalize `arg' and set mode
-    (when (memq arg '(toggle :toggle))
+    (when (eq arg 'toggle)
       ;; Toggle across all editable buffers
-      (setq arg (if hywiki-mode 1 0)))
+      (setq arg hywiki-mode))
     (cond
      ((or (and (integerp arg) (= arg 1))
          (memq arg '(:all t)))
@@ -943,7 +956,7 @@ After successfully finding a referent, run 
`hywiki-display-referent-hook'."
           "Add a HyWikiWord that displays an Org Roam node given its title.")
         '("Sexp"         (hywiki-add-sexpression hkey-value)
           "Add a HyWikiWord that evaluates an Elisp sexpression.")))
-  "*Menu of HyWikiWord custom referent types of the form:
+  "Menu of HyWikiWord custom referent types of the form:
 \(LABEL-STRING ACTION-SEXP DOC-STR)."
   :set  (lambda (var value) (set-default var value))
   :type '(cons (list string) (repeat (list string sexp string)))
@@ -1558,43 +1571,54 @@ simplifies to:
           (setq wikiword (substring wikiword-and-section (match-end 0))))
         (insert "\n#+INDEX: " wikiword "\n"))))))
 
+(defun hywiki--pathname-reference-to-org-link (pathname referent description)
+  "Convert a HyWiki PATHNAME REFERENT and DESCRIPTION to an Org link."
+  (let* ((path-word-suffix referent)
+         (path (file-relative-name (nth 0 path-word-suffix)))
+         ;; (path-stem (when path
+        ;;               (file-name-sans-extension path)))
+         (suffix (nth 2 path-word-suffix))
+         (desc description)
+        ;; suffix-no-hashmark
+        )
+    (unless (and suffix (not (string-empty-p suffix)))
+      (setq suffix nil))
+    ;; (setq suffix-no-hashmark (when suffix (substring suffix 1)))
+    ;; (when (or (not buffer-file-name)
+    ;;           (string-equal path (file-name-nondirectory buffer-file-name)))
+    ;;   (setq path nil))
+    (cond (desc
+          (if path
+              ;; "[[hy:pathname]]"
+              (format "[[%s:%s]]" hywiki-org-link-type pathname)
+            ;; (if suffix
+            ;;     ;; "[[file:path-stem.org::suffix][desc]"
+            ;;     (format "[[file:%s.org::%s][%s]]"
+            ;;                path-stem suffix-no-hashmark desc)
+            ;;   ;; "[[file:path-stem.org][desc]]")
+            ;;   (format "[[file:%s.org][%s]]" path-stem desc))
+            (if suffix
+                ;; "[[suffix][desc]]"
+                (format "[[%s][%s]]" suffix desc)
+              ;; "[[desc]]"
+              (format "[[%s]]" desc))))
+         (path
+          ;; "[[hy:pathname]]"
+          (format "[[%s:%s]]" hywiki-org-link-type pathname)))))
+
+(defun hywiki--referent-reference-to-org-link (reference referent _description)
+  "Convert a HyWiki REFERENT REFERENCE and DESCRIPTION to an Org link."
+  (format "[[hypb-msg:%s][%s]]" (format "Export of link type %s is not 
supported" (car referent)) reference))
+
 (defun hywiki-reference-to-org-link (reference &optional description)
   "Convert a HyWiki REFERENCE and an optional DESCRIPTION to an Org link."
   ;; \"[[file:<hywiki-directory>/WikiWord.org::Multi-Word 
Section][WikiWord#Multi-Word Section]]\".
   (let ((referent (hywiki-reference-to-referent reference :full-data)))
-    (when (stringp (car referent))
-      (let* ((path-word-suffix referent)
-             (path (file-relative-name (nth 0 path-word-suffix)))
-             ;; (path-stem (when path
-            ;;                   (file-name-sans-extension path)))
-             (suffix (nth 2 path-word-suffix))
-             (desc description)
-            ;; suffix-no-hashmark
-            )
-       (unless (and suffix (not (string-empty-p suffix)))
-         (setq suffix nil))
-       ;; (setq suffix-no-hashmark (when suffix (substring suffix 1)))
-       ;; (when (or (not buffer-file-name)
-       ;;        (string-equal path (file-name-nondirectory buffer-file-name)))
-       ;;   (setq path nil))
-       (cond (desc
-              (if path
-                  ;; "[[hy:reference]]"
-                  (format "[[%s:%s]]" hywiki-org-link-type reference)
-                  ;; (if suffix
-                  ;;     ;; "[[file:path-stem.org::suffix][desc]"
-                  ;;     (format "[[file:%s.org::%s][%s]]"
-                  ;;          path-stem suffix-no-hashmark desc)
-                  ;;   ;; "[[file:path-stem.org][desc]]")
-                  ;;   (format "[[file:%s.org][%s]]" path-stem desc))
-                (if suffix
-                    ;; "[[suffix][desc]]"
-                    (format "[[%s][%s]]" suffix desc)
-                  ;; "[[desc]]"
-                  (format "[[%s]]" desc))))
-             (path
-              ;; "[[hy:reference]]"
-              (format "[[%s:%s]]" hywiki-org-link-type reference)))))))
+    (when referent
+      (cond ((stringp (car referent))
+             (hywiki--pathname-reference-to-org-link reference referent 
description))
+            (t
+             (hywiki--referent-reference-to-org-link reference referent 
description))))))
 
 (defun hywiki-maybe-at-wikiword-beginning ()
   "Return non-nil if previous character is one preceding a HyWikiWord.
@@ -2709,7 +2733,7 @@ If deleted, update HyWikiWord highlighting across all 
frames."
           ('prefix (company-grab-word))
           ('candidates
            (let ((prefix (company-grab-word)))
-             (when prefix 
+             (when prefix
                (cl-loop for key being the hash-keys in 
(hywiki-get-wikiword-list)
                         when (string-prefix-p prefix key)
                         collect key))))
@@ -2838,12 +2862,11 @@ save and potentially set `hywiki--directory-mod-time' 
and
    (org-publish-property :base-directory (hywiki-org-get-publish-project))))
 
 (defun hywiki-org-export-function (&rest _)
-  "Add to `write-contents-functions' to convert HyWikiWord links to Org links.
-This is done automatically by loading HyWiki."
+  "Convert HyWikiWord links to Org links and add title if missing.
+Do not convert the index file."
   (require 'org-element)
   (when (and (derived-mode-p 'org-mode)
-             (not (string= (hywiki--sitemap-file) (buffer-file-name)))
-            (hyperb:stack-frame '(org-export-copy-buffer)))
+             (not (string= (hywiki--sitemap-file) (buffer-file-name))))
     (hywiki-references-to-org-links)
     (hywiki-org-maybe-add-title)))
 
@@ -2988,13 +3011,21 @@ variables."
     (setf (alist-get "hywiki" org-publish-project-alist nil 'remove #'equal) 
nil)
     (add-to-list 'org-publish-project-alist hywiki-org-publish-project-alist 
t)))
 
-(eval-after-load "org"
-  '(org-link-set-parameters hywiki-org-link-type
-                            :complete #'hywiki-org-link-complete
-                           :export #'hywiki-org-link-export
-                           :follow #'hywiki-find-referent
-                           :htmlize-link #'hywiki-section-to-headline-reference
-                           :store #'hywiki-org-link-store))
+(with-eval-after-load 'org
+  (org-link-set-parameters hywiki-org-link-type
+                           :complete #'hywiki-org-link-complete
+                          :export #'hywiki-org-link-export
+                          :follow #'hywiki-find-referent
+                          :htmlize-link #'hywiki-section-to-headline-reference
+                          :store #'hywiki-org-link-store)
+  (org-link-set-parameters "hypb-msg"
+                           :follow (lambda (path) (message "Message: %s" path))
+                           :export (lambda (path desc backend)
+                                     (when (eq backend 'html)
+                                       (format "<a href=\"#\" title=\"%s\" 
onclick=\"alert('%s'); return false;\">%s</a>"
+                                               path
+                                               (replace-regexp-in-string "'" 
"\\\\'" path)
+                                               (or desc path))))))
 
 (defun hywiki-word-strip-suffix (page-name)
   "Return PAGE-NAME with any optional #section:Lnum:Cnum stripped off.
@@ -3015,7 +3046,7 @@ since a prior publish.
 Files are saved in:
     (hywiki-org-get-publish-property :publishing-directory)
 Customize this directory with:
-    {M-x customize-variable RET hywiki-org-publishing-directory RET}."
+    {\\`M-x' `customize-variable' RET hywiki-org-publishing-directory RET}."
   (interactive "P")
   ;; Export Org to html with useful link ids.
   ;; Instead of random ids like "orga1b2c3", use heading titles with
@@ -3487,7 +3518,7 @@ Search across `hywiki-directory'."
 (defun hywiki-word-is-p (word)
   "Return non-nil if WORD is a HyWikiWord and optional #section:Lnum:Cnum.
 WORD may not yet have a referent (non-existent).  Use `hywiki-get-referent'
-to determine whether a HyWikiWord referent exists. 
+to determine whether a HyWikiWord referent exists.
 
 Return nil if WORD is a prefixed, typed hy:HyWikiWord, since
 these are handled by the Org mode link handler."
@@ -3889,9 +3920,6 @@ This must be called within a `save-excursion' or it may 
move point."
 
 (add-hook 'kill-buffer-hook 'hywiki-kill-buffer-hook)
 
-(eval-after-load "org-element"
-  '(advice-add 'org-element--generate-copy-script :before 
#'hywiki-org-export-function))
-
 ;; Use for its side effects, setting variables
 (eval-after-load "ox-publish" '(hywiki-org-get-publish-project))
 
diff --git a/kotl/kcell.el b/kotl/kcell.el
index a1da88c8c3..0e9c67b8cd 100644
--- a/kotl/kcell.el
+++ b/kotl/kcell.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:     1-May-93
-;; Last-Mod:     25-Nov-23 at 16:33:20 by Mats Lidell
+;; Last-Mod:     31-Jul-25 at 20:35:20 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -122,7 +122,7 @@ returned.  If CELL-REF is invalid or does not exist, nil is 
returned.
 
 If optional KVIEWSPEC-FLAG is non-nil and CELL-REF includes a
 viewspec, return the the idstamp concatenated with the viewspec
-(begins with a | character) as a string.
+\(begins with a | character) as a string.
 
 CELL-REF may be a whole number:
 
diff --git a/kotl/kexport.el b/kotl/kexport.el
index 803b26d2fc..5439b42b50 100644
--- a/kotl/kexport.el
+++ b/kotl/kexport.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    26-Feb-98
-;; Last-Mod:      5-Nov-23 at 11:45:00 by Bob Weiner
+;; Last-Mod:     31-Dec-25 at 16:10:47 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -45,13 +45,13 @@
 
 (defcustom kexport:html-description
   "Created by Hyperbole's outliner.\nSee &quot;(hyperbole)Koutliner&quot; for 
more information."
-  "*String to insert as the HTML-exported document's description, or nil for 
none."
+  "String to insert as the HTML-exported document's description, or nil for 
none."
   :type '(choice (const nil)
                 (string))
   :group 'hyperbole-koutliner)
 
 (defcustom kexport:html-keywords nil
-  "*String of comma separated keywords to include with an HTML-exported 
document.
+  "String of comma separated keywords to include with an HTML-exported 
document.
 If nil, use no keywords."
   :type '(choice (const nil)
                 (string))
diff --git a/kotl/kfile.el b/kotl/kfile.el
index a1879aaf88..a1edb5f003 100644
--- a/kotl/kfile.el
+++ b/kotl/kfile.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    10/31/93
-;; Last-Mod:     19-Oct-24 at 10:30:56 by Bob Weiner
+;; Last-Mod:     31-Jul-25 at 20:35:42 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -69,7 +69,7 @@ Return the new kview."
 ;;;###autoload
 (defun kfile:is-p ()
   "Iff current buffer contains a koutline, return file format version string.
-If not a koutline, return nil. This works both for unformatted
+If not a koutline, return nil.  This works both for unformatted
 and formatted koutlines."
   (let (ver-string)
     (save-excursion
diff --git a/kotl/kfill.el b/kotl/kfill.el
index c5e794dae8..6df5dc791e 100644
--- a/kotl/kfill.el
+++ b/kotl/kfill.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    23-Jan-94
-;; Last-Mod:     20-Jan-24 at 15:42:54 by Mats Lidell
+;; Last-Mod:     31-Jul-25 at 20:36:46 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -54,9 +54,7 @@
     ;; This keeps normal paragraphs from interacting unpleasantly with
     ;; the types given above.
     ("[^ \t/#%?!~*+-]" . kfill:normal))
-"Value is an alist of the form
-
-   ((REGXP . FUNCTION) ...)
+  "Value is an alist of the form ((REGEXP . FUNCTION) ...).
 
 When `fill-paragraph' is called, the REGEXP of each alist element is compared
 with the beginning of the current line.  If a match is found the corresponding
diff --git a/kotl/kimport.el b/kotl/kimport.el
index 6b16a26019..abbbfa237e 100644
--- a/kotl/kimport.el
+++ b/kotl/kimport.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    15-Nov-93 at 11:57:05
-;; Last-Mod:     25-Feb-24 at 18:03:16 by Mats Lidell
+;; Last-Mod:     31-Jul-25 at 20:37:32 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -200,7 +200,7 @@ on."
                                 (kcell-view:sibling-p)))))
 
     (when (eq import-from output-to)
-      (error "(kimport:aug-post-outline): Import and output buffers may not be 
the same."))
+      (error "(kimport:aug-post-outline): Import and output buffers may not be 
the same"))
 
     (set-buffer import-from)
     (outline-show-all)
@@ -274,7 +274,7 @@ placed.
                                 (kcell-view:sibling-p)))))
 
     (when (eq import-from output-to)
-      (error "(kimport:star-outline): Import and output buffers may not be the 
same."))
+      (error "(kimport:star-outline): Import and output buffers may not be the 
same"))
 
     (set-buffer import-from)
     (outline-show-all)
@@ -354,7 +354,7 @@ paragraphs as a sequence of same level cells.  The variable,
                                 (kcell-view:sibling-p)))))
 
     (when (eq import-from output-to)
-      (error "(kimport:text): Import and output buffers may not be the same."))
+      (error "(kimport:text): Import and output buffers may not be the same"))
 
     (set-buffer import-from)
     (let ((kotl-import (derived-mode-p 'kotl-mode))
@@ -604,7 +604,7 @@ will be added as children of the cell where this function 
leaves point
                (goto-char (point-max)))
              (kotl-mode:to-valid-position))
          (error
-          "(kimport:initialize): Second arg, %s, must be a koutline file."
+          "(kimport:initialize): Second arg, %s, must be a koutline file"
           (buffer-name output-to)))
       (when erase-flag
        (widen)
diff --git a/kotl/kotl-mode.el b/kotl/kotl-mode.el
index d8501f4bd8..31eef3c8d0 100644
--- a/kotl/kotl-mode.el
+++ b/kotl/kotl-mode.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    6/30/93
-;; Last-Mod:      6-Oct-25 at 00:16:41 by Mats Lidell
+;; Last-Mod:      1-Jan-26 at 18:18:27 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -39,7 +39,7 @@
 ;;; ************************************************************************
 
 (defcustom kotl-mode:indent-tabs-mode t
-  "*Non-nil means {\\[kotl-mode:tab-command]} may insert literal tab 
characters.
+  "Non-nil means {\\[kotl-mode:tab-command]} may insert literal tab characters.
 Tab characters are inserted rather than space characters when
 `kotl-mode:tab-flag' is non-nil.  Default value is t.  The value
 of this variable is local to each Koutline buffer."
@@ -47,7 +47,7 @@ of this variable is local to each Koutline buffer."
   :group 'hyperbole-koutliner)
 
 (defcustom kotl-mode:refill-flag nil
-  "*Non-nil means automatically refill cells during operations.
+  "Non-nil means automatically refill cells during operations.
 Operations are move, copy, promotion and demotion.  Default value
 is nil.  Cells with a `no-fill' attribute are never refilled
 during such operations, regardless of the value of this flag."
@@ -55,7 +55,7 @@ during such operations, regardless of the value of this flag."
   :group 'hyperbole-koutliner)
 
 (defcustom kotl-mode:shrink-region-flag nil
-  "*Non-nil means Koutliner commands automatically shrink the region.
+  "Non-nil means Koutliner commands automatically shrink the region.
 The region is shrinked within the visible bounds of a single cell
 before editing it.  The region then falls within the first
 visible cell that was part of the region or that followed it.
@@ -64,7 +64,7 @@ Default value is nil."
   :group 'hyperbole-koutliner)
 
 (defcustom kotl-mode:tab-flag nil
-  "*Non-nil means {\\[kotl-mode:tab-command]} inserts a literal tab character 
and {\\[kotl-mode:untab-command]} deletes backward.
+  "Non-nil means {\\[kotl-mode:tab-command]} inserts a literal tab character 
and {\\[kotl-mode:untab-command]} deletes backward.
 Nil means {\\[kotl-mode:tab-command]} demotes the current tree and
 {\\[kotl-mode:untab-command]} promotes the tree.  The default is nil."
   :type 'boolean
@@ -2974,7 +2974,7 @@ Prefix ARG selects the cells whose attributes are removed 
or set:
   "Split the current cell into two cells and move to the new cell.
 The cell contents after point become part of the newly created cell.
 The default is to create the new cell as a sibling of the current cell.
-With optional universal ARG, {C-u}, the new cell is added as the child of
+With optional universal ARG, {\\`C-u'}, the new cell is added as the child of
 the current cell.  Non-read-only attributes from the current cell are
 replicated in the new cell."
   (interactive "*P")
@@ -3117,7 +3117,7 @@ to a specified buffer, otherwise, copy the active region.
 Use 0 to copy the whole outline buffer.  Prompt for whether or not
 to expand and include any hidden/invisible text within the copied text."
   (interactive)
-  (call-interactively 
+  (call-interactively
    (if (use-region-p)
        #'kotl-mode:copy-region-to-buffer
      #'kotl-mode:copy-tree-to-buffer)))
@@ -3409,7 +3409,7 @@ because, in this case the deletion might narrow the 
column."
    (lambda () (org-force-self-insert n))))
 
 (defun kotl-mode:org-self-insert-command (n)
-  "Like `self-insert-command’, use overwrite-mode for whitespace in tables.
+  "Like `self-insert-command’, use `overwrite-mode' for whitespace in tables.
 If the cursor is in a table looking at whitespace, the whitespace is
 overwritten, and the table is not marked as requiring realignment."
   (interactive "p")
@@ -3433,7 +3433,7 @@ conflicting binding to this key outside orgtbl-mode."
    (lambda () (orgtbl-create-or-convert-from-region arg))))
 
 (defun kotl-mode:orgtbl-self-insert-command (n)
-  "Like `self-insert-command', use overwrite-mode for whitespace in tables.
+  "Like `self-insert-command', use `overwrite-mode' for whitespace in tables.
 If the cursor is in a table looking at whitespace, the whitespace is
 overwritten, and the table is not marked as requiring realignment."
   (interactive "p")
diff --git a/kotl/kview.el b/kotl/kview.el
index c4a960fe7f..1d72939ee7 100644
--- a/kotl/kview.el
+++ b/kotl/kview.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    6/30/93
-;; Last-Mod:     20-Jun-25 at 00:40:40 by Bob Weiner
+;; Last-Mod:      1-Jan-26 at 18:18:36 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -66,7 +66,7 @@
 (defvar-local kotl-kview nil "Buffer local kview object.")
 
 (defcustom kview:default-blank-lines t
-  "*Default setting of whether to show blank lines between koutline cells.
+  "Default setting of whether to show blank lines between koutline cells.
 A value of t means show them, nil means don't show them.  Default
 value is t."
   :type 'boolean
@@ -79,14 +79,14 @@ value is t."
   "Default number of lines per cell to show.  0, the default, means all 
lines.")
 
 (defcustom kview:default-label-min-width 4
-  "*Minimum width to which to pad labels in a kotl view.
+  "Minimum width to which to pad labels in a kotl view.
 Labels are padded with spaces on the left.  Default value is 4."
   :type '(integer :match (lambda (_widget value)
                           (and (integerp value) (> value 1) (<= value 99))))
   :group 'hyperbole-koutliner)
 
 (defcustom kview:default-label-separator ". "
-  "*Default string to insert between label and contents of a kcell.
+  "Default string to insert between label and contents of a kcell.
 Default value is \". \"."
   :type 'string
   :group 'hyperbole-koutliner)
@@ -97,7 +97,7 @@ Default value is \". \"."
   "Koutline view `outline-regexp' value that handles all label formats.")
 
 (defcustom kview:default-label-type 'alpha
-  "*Default label-type to use for new koutlines.  Default value is \\='alpha.
+  "Default label-type to use for new koutlines.  Default value is \\='alpha.
 It must be one of the following symbols:
   alpha           for `1b3' full alphanumeric labels
   id              for `027' permanent idstamp labels
@@ -111,7 +111,7 @@ It must be one of the following symbols:
 ;;  star            for multi-star labeling, e.g. `***'.
 
 (defcustom kview:default-level-indent 3
-  "*Default number of spaces to indent each succeeding level in koutlines.
+  "Default number of spaces to indent each succeeding level in koutlines.
 Default value is 3."
   :type '(integer :match (lambda (_widget value)
                           (and (integerp value) (> value 0) (<= value 60))))
@@ -385,7 +385,7 @@ Return t unless no such cell."
     found))
 
 (defun kcell-view:get-attr (attribute &optional pos)
-  "Return ATTRIBUTE's value for current cell or cell at optional POS
+  "Return ATTRIBUTE's value for current cell or cell at optional POS.
 Use 0 for POS to retrieve top cell's attributes."
   (if (eq pos 0)
       (if (eq attribute 'idstamp)
diff --git a/test/hywiki-tests.el b/test/hywiki-tests.el
index 8eb85c95e3..ebe5864aa6 100644
--- a/test/hywiki-tests.el
+++ b/test/hywiki-tests.el
@@ -7,7 +7,7 @@
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
-;; Copyright (C) 2024-2025  Free Software Foundation, Inc.
+;; Copyright (C) 2024-2026  Free Software Foundation, Inc.
 ;; See the "HY-COPY" file for license information.
 ;;
 ;; This file is part of GNU Hyperbole.
@@ -2141,6 +2141,24 @@ expected result."
         (hy-delete-files-and-buffers (list wikiHi wikiHo))
         (hywiki-tests--delete-hywiki-dir-and-buffer hywiki-directory)))))
 
+(ert-deftest hywiki-test--hywiki-mode ()
+  "Verify activating local and global `hywiki-mode'."
+  (hywiki-tests--preserve-hywiki-mode
+    (with-temp-buffer
+      (should (eq nil (hywiki-mode 0)))
+      (should (eq nil (hywiki-mode -1)))
+      (should (eq nil (hywiki-mode nil)))
+      (should (eq :pages (hywiki-mode 2)))
+      (should (eq :all (hywiki-mode 1)))
+      (should (eq :all (hywiki-mode t)))
+      (should (eq :all (hywiki-mode :all)))
+
+      ;; Toggle
+      (should (eq nil (call-interactively #'hywiki-mode)))
+      (should (eq :all (call-interactively #'hywiki-mode)))
+      (should (eq nil (hywiki-mode 'toggle)))
+      (should (eq :all (hywiki-mode 'toggle))))))
+
 (ert-deftest hywiki-tests--interactive-hywiki-mode-toggles ()
   "Verify `hywiki-mode' called interactively toggles mode."
   (hywiki-tests--preserve-hywiki-mode
diff --git a/test/kotl-mode-tests.el b/test/kotl-mode-tests.el
index 037e392ffa..93d3636a64 100644
--- a/test/kotl-mode-tests.el
+++ b/test/kotl-mode-tests.el
@@ -3,7 +3,7 @@
 ;; Author:       Mats Lidell <[email protected]>
 ;;
 ;; Orig-Date:    18-May-21 at 22:14:10
-;; Last-Mod:      4-Oct-25 at 00:46:47 by Mats Lidell
+;; Last-Mod:     21-Dec-25 at 23:56:18 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -434,17 +434,35 @@
 
 (ert-deftest kotl-mode-split-cell ()
   "Kotl-mode split cell."
+  :expected-result :failed
   (let ((kotl-file (make-temp-file "hypb" nil ".kotl")))
     (unwind-protect
-        (progn
-          (find-file kotl-file)
-          (insert "firstsecond\n")
-          (backward-char 7)
-          (kotl-mode:split-cell)
-          (should (string= (kcell-view:label (point)) "2"))
-          (kotl-mode:demote-tree 0)
-          (should (string= (kcell-view:label (point)) "1a"))
-          (should (string= (kcell-view:idstamp) "02")))
+        (with-current-buffer (find-file kotl-file)
+          (ert-info ("Split on first line")
+            (insert "firstsecond\n")
+            (backward-char 7)
+            (kotl-mode:split-cell)
+            (should (string= (kcell-view:label (point)) "2"))
+            (kotl-mode:demote-tree 0)
+            (should (string= (kcell-view:label (point)) "1a"))
+            (should (string= (kcell-view:idstamp) "02")))
+          (ert-info ("Split after first line")
+            (kotl-mode:kill-tree)
+            (insert "first")
+            (kotl-mode:newline 1)
+            (insert "second")
+            (kotl-mode:previous-line 1)
+            (kotl-mode:end-of-line)
+            (kotl-mode:split-cell)
+            (should (= (line-number-at-pos) 3)))
+          (ert-info ("Split before second line")
+            (kotl-mode:kill-tree)
+            (insert "first")
+            (kotl-mode:newline 1)
+            (insert "second")
+            (kotl-mode:beginning-of-line)
+            (kotl-mode:split-cell)
+            (should (= (line-number-at-pos) 3))))
       (hy-delete-file-and-buffer kotl-file))))
 
 (ert-deftest kotl-mode-append-cell ()

Reply via email to