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

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

[elpa] externals/hyperbole 25349baa65 03/28: Bug fixes and link directly


From: ELPA Syncer
Subject: [elpa] externals/hyperbole 25349baa65 03/28: Bug fixes and link directly finalization for next major release
Date: Tue, 21 Nov 2023 12:58:14 -0500 (EST)

branch: externals/hyperbole
commit 25349baa6538f333926ff559007a616d0e0d190a
Author: bw <rsw@gnu.org>
Commit: bw <rsw@gnu.org>

    Bug fixes and link directly finalization for next major release
---
 ChangeLog              |  78 +++++++++++++++++++++--
 DEMO                   |   8 ++-
 HY-ABOUT               |  29 +++++----
 HY-NEWS                | 109 +++++++++++++++++++++++++++----
 MANIFEST               |  25 ++++----
 hargs.el               |   8 +--
 hbdata.el              |   5 ++
 hbut.el                |  66 ++++++++++---------
 hibtypes.el            |  20 +++---
 hmail.el               |   8 +--
 hmouse-drv.el          |  10 +--
 hmouse-key.el          |  21 +++---
 hpath.el               | 170 +++++++++++++++++++++++++++----------------------
 hsys-org.el            |  22 ++++++-
 hui-mini.el            |   9 ++-
 hui-mouse.el           |   2 +-
 hui-window.el          |   2 +-
 hui.el                 |  21 ++++--
 hversion.el            |  29 +--------
 hypb.el                |   3 +-
 hyperbole.el           |   7 +-
 man/hyperbole.texi     |  62 ++++++++++++------
 man/version.texi       |   4 +-
 test/hbut-tests.el     |   2 +
 test/hibtypes-tests.el |  19 +++---
 test/hui-tests.el      |  12 ++--
 26 files changed, 488 insertions(+), 263 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index faf42dda3b..a170720a44 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,72 @@
+2023-10-01  Bob Weiner  <rsw@gnu.org>
+
+* man/hyperbole.texi (Keyboard Drags):
+  DEMO (Creation via Ace Window): Doc prefix args to {M-o w} ace-window
+    link button creation.
+
+* hargs.el (hargs:at-p): Fix when on a two part menu item to use the
+    more specific part to link to the correct location, e.g. on Index
+    entries.
+
+* HY-ABOUT:
+  MANIFEST: Format for org-mode display.
+  hypb.el (hypb:display-file-with-logo): Add use of org-mode to supplement
+    view minor mode.
+
+* hui.el (hui:link-possible-types): When reading a dir or file and not
+    on such a string, use the 'default-directory' or 'buffer-file-name'.
+    Previously just returned nil in such circumstances.
+
+* hmail.el (hmail:hbdata-to-p): Add 'widen' call when hbdata is in
+    the button source buffer and no file is attached, so that it is
+    temporarily made visible/searchable.
+
+2023-09-19  Bob Weiner  <rsw@gnu.org>
+
+* test/hibtypes-tests.el (ibtypes::pathname-load-path-line-column-test):
+    Fix to handle when a prior hypb.el buffer exists.
+
+* hpath.el (hpath:normalize): Fix arg name to match name in doc.
+    Fix to trigger an error if arg is anything but a readable filename.
+           (hpath:shorten): Add and use in 'ibut:insert-text'.
+
+* hibtypes.el (pathname-line-and-column): Fix label selection to always
+    include whole delimited path.  Previously, only a part of the path
+    might flash as a button.
+
+2023-09-18  Bob Weiner  <rsw@gnu.org>
+
+* man/hyperbole.texi (Menus):
+  hui-mini.el (hui:menu-choose): When on the initial Hy9> prompt of the
+    top-level menu and press RET:
+      Remove extra call to 'hyperbole-minibuffer-menu'.
+      Change so quits the minibuffer menu and leaves Smart Key update
+      message in the minibuffer.
+
+* hversion.el (hyperb:path-being-loaded): Remove; no longer used.
+
+* hbut.el (ebut:operate): Add error checks similar to 'ibut:operate'.
+
+* hmouse-drv.el (hkey-window-link):
+  man/hyperbole.texi (Keyboard Drags): Add prefix arg doc for {M-o w}
+  where ibuts are created.
+
+* hui.el (hui:ibut-link-directly): This may be invoked via 'hkey-either'
+    which runs the Assist Key when given a single C-u prefix argument.
+    In such a case, don't use the prefix argument as a flag to prompt
+    for the ibutton name as we want to just insert the appropriate ibut
+    without any prompting.
+         (hui:ebut-link-directly): Change "Create button" to "Create ebutton".
+
+* hpath.el (hpath:to-markup-anchor, hpath:to-line): Update to find matches
+    outside narrowed area.
+
+2023-09-17  Bob Weiner  <rsw@gnu.org>
+
+* hbut.el (ebut:operate): Fix that ebut metadata was not hidden after an
+    'hui:ebut-create' call by adding a conditionalized call to
+    'hmail:msg-narrow'.
+
 2023-08-29  Bob Weiner  <rsw@gnu.org>
 
 * hbut.el (ibut:operate): Fix to ensure point is within button after
@@ -27,8 +96,8 @@
 
 * hui.el (hui:ibut-link-create): Fix to handle name attributes properly.
 
-* hargs.el (hargs:iform-read): Reset global 'hargs:defaults' to nil when not to
-    prevent errant values in any future calls.
+* hargs.el (hargs:iform-read): Reset global 'hargs:defaults' to nil when not 
used
+    to prevent errant values in any future calls.
 
 * test/hsys-org-tests.el (hsys-org:cycle-on-header-cycles-visibility): Fix to
     handle any moving over invisible lines properly.
@@ -83,7 +152,8 @@
 * hib-kbd.el (hui-mini): Add (require 'hui-mini) and move private vars before 
first
     usage to remove byte-compiler warnings.
 
-* hbut.el (ibut:org-at-read-only-p, ibut:operate): Trigger errors when point 
is on
+* hsys-org.el (hsys-org-at-read-only-p):
+  hbut.el (ibut:org-at-read-only-p, ibut:operate): Trigger errors when point 
is on
     read-only text, read-only Org contexts, explicit buttons, or emacs 
push-buttons.
 
 * hyperbole.el (hyperbole--enable-mode, hyperbole--disable-mode): Stop setting
@@ -269,7 +339,7 @@
 2023-07-22  Bob Weiner  <rsw@gnu.org>
 
 * hargs.el (hargs:at-p): Make Action Keyboard Key behave the same as the 
Action Mouse
-    Key when in the minibuffer, deleting any characters to the right of point 
to
+    Key when in the minibuffer, deleting any characters to the right of point.
 
 2023-07-17  Bob Weiner  <rsw@gnu.org>
 
diff --git a/DEMO b/DEMO
index 2d6617d944..8e6d33d41a 100644
--- a/DEMO
+++ b/DEMO
@@ -1,3 +1,6 @@
+
+ 
+
 * GNU Hyperbole Full Demo/Tutorial by Bob Weiner
 
   Send an email or a testimonial if you like Hyperbole to <rsw@gnu.org>.
@@ -1226,8 +1229,9 @@ For the fastest link button creation, use the Emacs 
package
 'ace-window' (see "(hyperbole)Keyboard Drags" for setup).  Once this
 is configured, then {M-o w <window id>} may be used to quickly create
 an explicit link button in the selected window that links to any other
-window chosen via the Ace Window.  Use a prefix argument to create an
-implicit link button instead.
+window chosen via the Ace Window.  Use a C-u prefix argument to create
+an unnamed implicit link button instead and a M-1 prefix argument to
+create a named implicit link button.
 
 *** Creation via Menu
 
diff --git a/HY-ABOUT b/HY-ABOUT
index 5811c10f31..ef9daae648 100644
--- a/HY-ABOUT
+++ b/HY-ABOUT
@@ -1,4 +1,7 @@
-                          ABOUT GNU HYPERBOLE
+
+ 
+
+*                          ABOUT GNU HYPERBOLE
 
                    Designed and Written by Bob Weiner
                 Maintained by Mats Lidell and Bob Weiner
@@ -28,7 +31,7 @@ World-Wide Web URLs, Info manuals, ftp archives, etc.
 The Hyperbole wiki page, "https://www.emacswiki.org/emacs/Hyperbole";,
 explains the many ways it differs from and is complementary to Org mode.
 
-Hyperbole consists of five parts:
+* Hyperbole consists of five parts:
 
    1.  Buttons and Smart Keys: Hyperbole hyperlink and other kinds of
        buttons may be added to documents (explicit buttons) with a
@@ -79,9 +82,11 @@ Hyperbole consists of five parts:
        Hyperbole has been engineered for real-world usage and is well
        structured).
 
-A Hyperbole hypertext user works with buttons; he may create, modify, move
-or delete buttons.  Each button performs a specific action, such as linking
-to a file or executing a shell command.
+* A Hyperbole hypertext user works with buttons.
+
+He may create, modify, move or delete buttons.  Each button performs a
+specific action, such as linking to a file or executing a shell
+command.
 
 There are three categories of Hyperbole buttons:
 
@@ -111,7 +116,7 @@ large or small chunks as you see fit, organizing each bit 
as time allows.
 The Hyperbole Koutliner and HyRolo tools organize textual hierarchies and
 may also contain links to external information sources.
 
-Some of Hyperbole's most important features include:
+* Some of Hyperbole's most important features include:
 
     Buttons may link to information or may execute commands, such as
     computing a complex value or communicating with external programs;
@@ -134,9 +139,9 @@ Some of Hyperbole's most important features include:
     Other hypertext and information retrieval systems may be
     encapsulated under a Hyperbole user interface very easily.
 
-Typical Hyperbole applications include:
+* Typical Hyperbole applications include:
 
-    Personal Information Management
+**  Personal Information Management
        Overlapping link paths provide a variety of views into an
        information space.  A single key press activates buttons
        regardless of their types, making navigation easy.
@@ -144,7 +149,7 @@ Typical Hyperbole applications include:
        A search facility locates buttons in context and permits quick
        selection.
 
-    Documentation Browsing
+**  Documentation Browsing
        Embedding cross-references in a favorite documentation format.
 
        Addition of a point-and-click interface to existing documentation.
@@ -153,18 +158,18 @@ Typical Hyperbole applications include:
        of an identifier from its use within code or its reference within
        documentation.
 
-    Brainstorming
+**  Brainstorming
        Capture of ideas and then quick reorganization with the Hyperbole
        Koutliner.  Link to related ideas, eliminating the need to copy
        and paste information into a single place.
 
-    Help/Training Systems
+**  Help/Training Systems
        Creation of tutorials with embedded buttons that show students how
        things work while explaining the concepts, e.g. an introduction
        to UNIX commands.  This technique can be much more effective than
        descriptions alone.
 
-    Archive Managers
+**  Archive Managers
        Supplementation of programs that manage archives from incoming
        information stream, having them add topic-based buttons that
        link to the archive holdings.  Users can then search and create
diff --git a/HY-NEWS b/HY-NEWS
index ac242dd8dc..b35fd4fa20 100644
--- a/HY-NEWS
+++ b/HY-NEWS
@@ -1,10 +1,30 @@
-                         What's New in GNU Hyperbole
+
+
+
+*                        What's New in GNU Hyperbole
                                 by Bob Weiner
 
 ===========================================================================
 *                                   V8.0.1pre
 ===========================================================================
 
+** ACE WINDOW PACKAGE INTEGRATION - fast window and buffer switching
+
+  *** After installing the ace-window package and loading Hyperbole, execute
+      (hkey-ace-window-setup "\M-o") to enable the following capabilities:
+
+  *** Fast Window Links: The hkey-window-link command quickly creates links
+      to other windows:
+
+         {M-o w <window>} - creates an explicit button linked to point in 
<window>
+         {C-u M-o w <window>} - creates an unnamed implicit button linked to 
point
+           in <window>
+         {M-1 M-o w <window>} - creates a named implicit button linked to point
+           in <window>
+
+      See "(hyperbole)Create Link Button".
+
+
 ** ACTION TYPES  (See "(hyperbole)Action Types").
 
   *** display-boolean, display-value, display-variable: Made all of these
@@ -14,6 +34,9 @@
 
 ** DOCUMENTATION
 
+  *** Action Types: Added newer types and updated existing doc summaries
+      in the Hyperbole manual.  See "(hyperbole)Action Types".
+
   *** Emacs 2022 Talk Videos:
 
         - Hyperbole and Org Mode: Org slide file is included in
@@ -30,8 +53,10 @@
       want a quick read about how Hyperbole concepts all interrelate.
       View it with {C-h h d c}.
 
-  *** Action Types: Added newer types and updated existing doc summaries
-      in the Hyperbole manual.  See "(hyperbole)Action Types".
+  *** Doc Viewing: Updated to display many files from the Doc> menu in Org
+      mode and view minor mode, so can expand and collapse entries to view
+      just the sections of interest.  This includes DEMO, FAST-DEMO, HY-ABOUT,
+      HY-NEWS and MANIFEST.
 
   *** New Menu Key Doc: Documented these Hyperbole minibuffer menu keys:
 
@@ -45,7 +70,7 @@
       for easy cross-referencing, Info viewer version and PDF for printing.
       Some of the updates include:
 
-  **** Ebut/Link Menu Item:  With two windows on screen, link from source
+  **** Link Menu Items:  With two windows on screen, link from source
        window point to referent window point.  Do a similar thing when
        more windows are on screen via an Action Mouse Key drag between
        windows.  See "(hyperbole)Smart Mouse Drags between Windows".
@@ -61,6 +86,18 @@
        See "(hyperbole)Smart Key - Org Mode".
 
 
+** EXPLICIT BUTTONS  (See "(hyperbole)Explicit Buttons").
+
+  *** Ebut/Link Menu Item - Inserts a named ebutton that links to point in
+      another window.  See "(hyperbole)menu item, Ebut/Link".
+
+
+** GLOBAL BUTTONS  (See "(hyperbole)Global Buttons").
+
+  *** Gbut/Link Menu Item - A single name creates a new global link button
+      to point.  See "(hyperbole)menu item, Gbut/Link".
+
+
 ** HYCONTROL  (See "(hyperbole)HyControl").
 
   *** I/J/K/M Key Bindings: In Window Control mode, move directionally
@@ -106,11 +143,13 @@
   *** Natively Compiled Functions as Action Types: Now may be used as
       Hyperbole button action types.  See "(hyperbole)Action Types".
 
-  *** Reduced Warnings: Large number of byte-compiler warnings eliminated when
-      building the Hyperbole package.  None of these warnings should affect
-      use of Hyperbole.  Most open Hyperbole issues have also been resolved.
+  *** Reduced Warnings: Almost all byte-compiler and native compiler warnings
+      have been eliminated when building the Hyperbole package.  None of the
+      remaining warnings should affect use of Hyperbole.  Most open Hyperbole
+      issues have also been resolved.
 
-  *** XEmacs: Removed old XEmacs-compatibility code.
+  *** XEmacs: Removed old XEmacs-compatibility code; everyone should use GNU
+      Emacs nowadays.
 
 
 ** HYROLO  (See "(hyperbole)HyRolo").
@@ -202,16 +241,26 @@
       buffers (assume files are tab-delimited).
 
   *** Ibut/Create Menu Item: Creates a named/labeled implicit button of any
-      type.  Separates the name and the implicit button with " - ".
+      type.  Separates the name and the implicit button with " - ".  See
+      "(hyperbole)menu item, Ibut/Create".
 
-  *** Relative Info Paths: Info files with relative pathnames outside of the
-      `Info-directory-list' now resolve properly, e.g. "man/hyperbole.info".
+  *** Ibut/Link Menu Item - Inserts an ibutton that links to point in another
+      window.  With a C-u prefix argument, prompts for a name as well.  See
+      "(hyperbole)menu item, Ibut/Link".
 
   *** Path Implicit Buttons: Much improved relative path handling, including
       expanding into executable paths when pathname is prefixed by ! or &,
       and handling info paths outside `Info-directory-list', like
       "man/hyperbole.info".
 
+  *** Read-only Context Errors: Trigger errors when trying to create an 
implicit
+      button with point on read-only text, read-only Org contexts, explicit 
buttons,
+      or emacs push-buttons.
+
+  *** Relative Info Paths: Info files with relative pathnames outside of the
+      `Info-directory-list' now resolve properly, e.g. "man/hyperbole.info".
+
+
   *** Table of Contents Sections: Hyperbole now recognizes TOCs in any text
       derived major mode with the text-toc implicit button type.  An Action
       Key press on a line with a section name displays the section according
@@ -234,11 +283,25 @@
       star-based headings whose stars do not start at the beginning of a line,
       i.e. are indented.  See "(hyperbole)Inserting and Importing".
 
+  *** Transpose Lines Down: Add 'kotl-mode:transpose-lines-down' command.
+
 
 ** MENUS  (See "(hyperbole)Menus").
 
   *** Minibuffer Menu Changes:
 
+        - Instant Link Creation:
+
+            Ebut/Link - Inserts a named ebutton that links to point in another 
window.
+              See "(hyperbole)menu item, Ebut/Link".
+
+            Gbut/Link - A single name creates a new global link button to 
point.
+              See "(hyperbole)menu item, Gbut/Link".
+
+            Ibut/Link - Inserts an ibutton that links to point in another 
window.  With
+            a C-u prefix argument, prompts for a name as well.
+              See "(hyperbole)menu item, Ibut/Link".
+
         - Reload Menus and Smart Keys: Action Key press on top-level menu 
prefix
           reloads Hyperbole minibuffer menus and Smart Key handlers to reflect
           any recent edits.
@@ -254,6 +317,15 @@
 
 ** PROGRAMMING INTERFACE CHANGES  (See "(hyperbole)Embedding Hyperbole").
 
+  *** hui:ebut-link-directly:
+      hui:gbut-link-directly:
+      hui:ibut-link-directly: Instant direct Hyperbole links.
+
+  *** hypb:mail-address-tld-regexp: Renamed from 
'hypb-mail-address-tld-regexp'.
+      hypb:mail-address-regexp: Renamed from 'hypb-mail-address-regexp'.
+      hypb:mail-address-mode-list: Renamed from 'mail-address-mode-list'.
+        Make all of these variables have a common prefix.
+
   *** (hypb:devdocs-lookup): Install and load devdocs package and then
       call its `devdocs-lookup' function.
 
@@ -381,6 +453,17 @@
   *** (smart-push-button): Added and referenced in `hkey-help' to trigger
       push-button-specific help output.
 
+  *** (hpath:to-markup-anchor, hpath:to-line): Updated to find matches
+      outside narrowed area.
+
+  *** (hyperb:path-being-loaded): Removed; no longer used.
+
+  *** (hpath:shorten): Added and used in 'ibut:insert-text'.
+
+  *** (hui:link-possible-types): When reading a dir or file and not
+      on such a string, use the 'default-directory' or 'buffer-file-name'.
+      Previously just returned nil in such circumstances.
+
 
 ** ORG MODE INTEGRATION (See "(hyperbole)Smart Key - Org Mode").
 
@@ -459,7 +542,7 @@
 
 ** TEST CASES  (See "${hyperb:dir}/test").
 
-  *** Hyperbole Automated Testing: Over 300 automated test cases.  Simply run
+  *** Hyperbole Automated Testing: Over 340 automated test cases.  Simply run
       'make test-all' or 'make test' from the command-line when in the
       Hyperbole source directory and you should see all tests pass.  If any
       fail, you can press the Action Key to see the source of the failure.
@@ -932,7 +1015,7 @@
   *** Fast Window Links: The hkey-window-link command bound to {M-o w}
       rapidly creates a link button at point in the selected window,
       linking to point in the window chosen when prompted.
-      See "DEMO#Displaying Items via Drags and Moving Buffers".
+      See "DEMO2#Displaying File and Buffer Items and Moving Buffers".
 
   *** Throw A Region Elsewhere Within the Same Buffer: {M-o t <window-id>}
       when used with a selected region can now throw to the source buffer
diff --git a/MANIFEST b/MANIFEST
index 5d0c5adc91..c6784d4cda 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,7 @@
---- INTRODUCTION ---
+
+
+
+* --- INTRODUCTION ---
 COPYING              - GNU General Public License
 DEMO                 - Interactive Demonstration of many GNU Hyperbole 
capabilities
 DEMO-ROLO.otl        - Sample Hyperbole Rolo file for use with DEMO
@@ -19,7 +22,7 @@ hversion.el          - GNU Hyperbole version and system 
information setup
 hyperbole.el         - Loads and initializes GNU Hyperbole
 ChangeLog            - Summary of changes in recent GNU Hyperbole releases
 
---- DOCUMENTATION ---
+* --- DOCUMENTATION ---
 man/dir              - GNU Hyperbole Info directory tree entry
 man/hyperbole.html   - The GNU Hyperbole Manual  (web version)
 man/hyperbole.info   - The GNU Hyperbole Manual  (GNU Info version)
@@ -27,7 +30,7 @@ man/hyperbole.pdf    - The GNU Hyperbole Manual  (printable 
version)
 man/hyperbole.texi   - The GNU Hyperbole Manual  (GNU Texinfo source form)
 man/hkey-help.txt    - Summarizes Smart Key behaviors in different contexts
 
---- USER INTERFACE ---
+* --- USER INTERFACE ---
 hmouse-info.el       - Walks through Info networks using one key
 hmouse-drv.el        - Smart Key/Mouse driver functions
 hmouse-key.el        - Setup Smart Key mouse bindings
@@ -47,7 +50,7 @@ hui-treemacs.el      - GNU Hyperbole Smart Key support for 
the Treemacs file man
 hui-window.el        - Smart Mouse Key window and modeline depress/release 
actions
 hui.el               - GNU Hyperbole button and hyperlink user interface
 
---- APPLICATION PROGRAMMING INTERFACE ---
+* --- APPLICATION PROGRAMMING INTERFACE ---
 hact.el              - GNU Hyperbole button action handling
 hargs.el             - GNU Hyperbole user input functions
 hbmap.el             - GNU Hyperbole button map maintenance for queries and 
lookups
@@ -64,20 +67,20 @@ hyrolo-logic.el      - Logic functions for GNU Hyperbole 
Rolo files
 hywconfig.el         - Save ring of window configurations
 set.el               - General mathematical operators for unordered sets
 
---- MAIL SYSTEM SUPPORT ---
+* --- MAIL SYSTEM SUPPORT ---
 hmh.el               - GNU Hyperbole buttons in mail reader:   Mh
 hrmail.el            - GNU Hyperbole buttons in mail reader:   Rmail
 hsmail.el            - GNU Hyperbole buttons in mail composer: mail
 hvm.el               - GNU Hyperbole buttons in mail reader:   Vm
 
---- HYPERBOLE KOUTLINER ---
+* --- HYPERBOLE KOUTLINER ---
 kotl/MANIFEST        - Summary of Koutliner files
 kotl/EXAMPLE.kotl    - Sample Koutline document explaining Koutliner features
 
---- USENET NEWS SUPPORT ---
+* --- USENET NEWS SUPPORT ---
 hgnus.el             - GNU Hyperbole buttons in news reader/poster: GNUS
 
---- HYPERBOLE INTERNALS ---
+* --- HYPERBOLE INTERNALS ---
 hactypes.el          - Default action types for GNU Hyperbole
 hbdata.el            - GNU Hyperbole button attribute accessor functions
 hibtypes.el          - GNU Hyperbole default implicit button types
@@ -95,14 +98,14 @@ smart-clib-sym       - Test whether symbol appears within a 
set of C libraries
 topwin.py            - Python script to find the topmost macOS app window at a 
screen position
 .hypb & _hypb        - Button data files used by the GNU Hyperbole DEMO file
 
---- EXTERNAL SYSTEM ENCAPSULATIONS ---
+* --- EXTERNAL SYSTEM ENCAPSULATIONS ---
 hsys-org.el          - GNU Hyperbole support functions for Org mode
 hsys-org-roam.el     - GNU Hyperbole support functions for Org Roam
 hsys-www.el          - GNU Hyperbole support for Emacs W3 World-Wide Web (WWW) 
browsing
 hsys-youtube.el      - Action buttons to play timestamped segments of Youtube 
videos
 
---- HYPERBOLE TEST CASES ---
+* --- HYPERBOLE TEST CASES ---
 test/MANIFEST        - Summary of Hyperbole test case files
 
---- HYPERBOLE INSTALLATION TEST CONFIGURATIONS ---
+* --- HYPERBOLE INSTALLATION TEST CONFIGURATIONS ---
 install-test/MANIFEST - Summary of Hyperbole installation test files
diff --git a/hargs.el b/hargs.el
index 2a5cfc4c08..5f50c27936 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:     28-Aug-23 at 17:59:39 by Bob Weiner
+;; Last-Mod:      1-Oct-23 at 18:59:01 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -507,11 +507,7 @@ Handles all of the interactive argument types that 
`hargs:iform-read' does."
         (when (eq major-mode 'Info-mode)
           (let ((file (Info-current-filename-sans-extension))
                 (node (cond ((Info-note-at-p))
-                            ((Info-menu-item-at-p)
-                             (save-excursion
-                               (beginning-of-line)
-                               (forward-char 2)
-                               (Info-extract-menu-node-name nil 
(Info-index-node))))
+                            ((Info-menu-item-at-p))
                             (t Info-current-node))))
             (cond ((and (stringp node) (string-match "\\`\(" node))
                    node)
diff --git a/hbdata.el b/hbdata.el
index a661587f11..e36c5ae1fc 100644
--- a/hbdata.el
+++ b/hbdata.el
@@ -408,6 +408,11 @@ Return value of evaluation when a matching entry is found 
or nil."
                                                            
(hmail:hbdata-start))))))))
              (setq found (hbdata:to-entry-buf key-src directory create-flag)))
          (when found
+           (unless buffer-file-name
+             ;; Point must be left after hbdata separator or the logic
+             ;; below could fail.  Buffer should be widened already.
+             (goto-char (point-min))
+             (search-forward hmail:hbdata-sep nil t))
            (let ((case-fold-search t)
                  (qkey (regexp-quote lbl-key))
                  (end (save-excursion (if (search-forward "\n\^L" nil t)
diff --git a/hbut.el b/hbut.el
index 7267fe2714..935ba08f1c 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:     29-Aug-23 at 01:38:44 by Bob Weiner
+;; Last-Mod:     19-Sep-23 at 07:09:54 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -352,6 +352,29 @@ button is found in the current buffer."
         (new-lbl-key (ebut:label-to-key new-label))
         (modify new-label)
         (new-instance-flag))
+
+    (when (and new-label (or (not (stringp new-label)) (string-empty-p 
new-label)))
+      (hypb:error "(ebut:operate): 'new-label' value must be a non-empty 
string, not: '%s'"
+                 new-label))
+    (when (and (null curr-label) (not (use-region-p)))
+      (hypb:error "(ebut:operate): region must be active when 'curr-label' is 
nil"))
+
+    ;; Error when on a read-only part of a buffer's text
+    (when (plist-member (text-properties-at (point)) 'read-only)
+      (hypb:error "(ebut:operate): Point must not be on a read-only Org 
element"))
+    ;; Error when on an implicit button
+    (when (or (eq (hattr:get 'hbut:current 'categ) 'implicit)
+             (string-prefix-p "ibtypes::" (symbol-name (hattr:get 
'hbut:current 'categ))))
+      (hypb:error "(ebut:operate): Point must not be on an implicit button: %s"
+                 (ibut:label-to-key (hattr:get 'hbut:current 'lbl-key))))
+    ;; Error when on an Emacs push-button
+    (when (plist-member (text-properties-at (point)) 'button)
+      (hypb:error "(ebut:operate): Point must not be on an Emacs push-button: 
%s"
+                 (button-label (button-at (point)))))
+    ;; Error when in read-only contexts of an Org file
+    (when (hsys-org-at-read-only-p)
+      (hypb:error "(ebut:operate): Point must not be in a read-only Org 
context"))
+
     (unless new-label
       (setq new-label curr-label))
     (hattr:set 'hbut:current 'lbl-key (ebut:label-to-key new-label))
@@ -391,7 +414,7 @@ button is found in the current buffer."
                         (if (hyperb:stack-frame
                              '(hui:ebut-create hui:ebut-edit 
hui:ebut-edit-region
                                                hui:ebut-link-create 
hui:gbut-create
-                                                       hui:gbut-edit 
hui:link-create ebut:program
+                                                       hui:gbut-edit 
ebut:program
                                                hui:ibut-create hui:ibut-edit
                                                hui:ibut-link-create 
ibut:program))
                             ;; Ignore action-key-depress-prev-point
@@ -444,6 +467,10 @@ button is found in the current buffer."
                   (re-search-backward regexp nil t)))
             (goto-char (+ (match-beginning 0) (length ebut:label-start))))))
 
+    (when (or (not buffer-file-name) (hmail:editor-p) (hmail:reader-p))
+      (widen)
+      (hmail:msg-narrow))
+
     ;; new-instance-flag might be 't which we don't want to return.
     (when (stringp new-instance-flag) new-instance-flag)))
 
@@ -2282,7 +2309,7 @@ Summary of operations based on inputs (name arg comes 
from \\='hbut:current attr
       (hypb:error "(ibut:operate): Point must not be on an Emacs push-button: 
%s"
                  (button-label (button-at (point)))))
     ;; Error when in read-only contexts of an Org file
-    (when (ibut:org-at-read-only-p)
+    (when (hsys-org-at-read-only-p)
       (hypb:error "(ibut:operate): Point must not be in a read-only Org 
context"))
 
     (unless new-name
@@ -2421,25 +2448,6 @@ Summary of operations based on inputs (name arg comes 
from \\='hbut:current attr
     ;; instance-flag might be 't which we don't want to return.
     (when (stringp instance-flag) instance-flag)))
 
-(defun ibut:org-at-read-only-p ()
-  "Return non-nil if point is in an Org read-only context."
-  (and (derived-mode-p 'org-mode)
-       (featurep 'hsys-org)
-       (or (hsys-org-src-block-start-at-p)
-          (hsys-org-block-start-at-p)
-          (let ((contexts (org-context)))
-            (and contexts
-                 (delq nil (mapcar (lambda (ctxt) (assq ctxt contexts))
-                                   '(:checkbox
-                                     :headline-stars
-                                     :item-bullet
-                                     :keyword
-                                     :link
-                                     :priority
-                                     :table-special
-                                     :tags
-                                     :todo-keyword))))))))
-
 (defun    ibut:insert-text (ibut)
   "Space, delimit and insert the text part of IBUT."
   (when (hattr:get ibut 'name)
@@ -2493,30 +2501,30 @@ Summary of operations based on inputs (name arg comes 
from \\='hbut:current attr
       ('man (insert arg1))
       ('actypes::man-show (insert arg1))
       ('actypes::link-to-file-line (insert (format "\"%s:%d\""
-                                                  (hpath:substitute-var arg1) 
arg2)))
+                                                  (hpath:shorten arg1) arg2)))
       ('actypes::link-to-file-line-and-column
        (if (eq arg3 0)
-          (insert (format "\"%s:%d\"" (hpath:substitute-var arg1) arg2))
-        (insert (format "\"%s:%d:%d\"" (hpath:substitute-var arg1) arg2 
arg3))))
+          (insert (format "\"%s:%d\"" (hpath:shorten arg1) arg2))
+        (insert (format "\"%s:%d:%d\"" (hpath:shorten arg1) arg2 arg3))))
       ('actypes::link-to-file (insert
                               (if (/= (length args) 2)
                                   ;; filename only
-                                  (format "\"%s\"" (hpath:substitute-var arg1))
+                                  (format "\"%s\"" (hpath:shorten arg1))
                                 ;; includes buffer pos that we translate to 
line:col
                                 (with-current-buffer (find-file-noselect arg1)
                                   (save-excursion
                                     (goto-char arg2)
                                     (if (zerop (current-column))
                                         (format "\"%s:%d\""
-                                                (hpath:substitute-var arg1)
+                                                (hpath:shorten arg1)
                                                 (line-number-at-pos (point) t))
                                       (format "\"%s:%d:%d\""
-                                              (hpath:substitute-var arg1)
+                                              (hpath:shorten arg1)
                                               (line-number-at-pos (point) t)
                                               (current-column))))))))
       ('actypes::link-to-string-match
        (insert (format "<%s \"%s\" %d \"%s\">" (actype:def-symbol actype) arg1 
arg2
-                      (hpath:substitute-var arg3))))
+                      (hpath:shorten arg3))))
       ('nil (error "(ibut:insert-text): actype must be a Hyperbole actype or 
Lisp function symbol, not '%s'" orig-actype))
       ;; Generic action button type                                            
      
       (_ (insert (format "<%s%s%s>" (actype:def-symbol actype) (if args " " "")
diff --git a/hibtypes.el b/hibtypes.el
index fabf1aeb49..5f04607ff5 100644
--- a/hibtypes.el
+++ b/hibtypes.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    19-Sep-91 at 20:45:31
-;; Last-Mod:     28-Aug-23 at 16:02:32 by Bob Weiner
+;; Last-Mod:     19-Sep-23 at 17:54:43 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -849,15 +849,19 @@ See `hpath:at-p' function documentation for possible 
delimiters.
 See `hpath:suffixes' variable documentation for suffixes that are added to or
 removed from pathname when searching for a valid match.
 See `hpath:find' function documentation for special file display options."
-  (let ((path-line-and-col (hpath:delimited-possible-path)))
+  (let* ((path-start-and-end (hpath:delimited-possible-path nil t))
+        (path-line-and-col (nth 0 path-start-and-end))
+        (start (nth 1 path-start-and-end)))
     (when (and (stringp path-line-and-col)
                (string-match hpath:section-line-and-column-regexp 
path-line-and-col))
-      (let ((file (save-match-data (hpath:expand (match-string-no-properties 1 
path-line-and-col))))
-            (line-num (string-to-number (match-string-no-properties 3 
path-line-and-col)))
-            (col-num (when (match-end 4)
-                       (string-to-number (match-string-no-properties 5 
path-line-and-col)))))
-        (when (save-match-data (setq file (hpath:is-p file)))
-          (ibut:label-set file (match-beginning 1) (match-end 1))
+      (let* ((line-num (string-to-number (match-string-no-properties 3 
path-line-and-col)))
+             (col-num (when (match-end 4)
+                       (string-to-number (match-string-no-properties 5 
path-line-and-col))))
+            (label (match-string-no-properties 1 path-line-and-col))
+            ;; Next variable must come last as it can overwrite the match-data
+            (file (hpath:expand label)))
+        (when (setq file (hpath:is-p file))
+          (ibut:label-set label start (+ start (length label)))
           (if col-num
               (hact 'link-to-file-line-and-column file line-num col-num)
             (hact 'link-to-file-line file line-num)))))))
diff --git a/hmail.el b/hmail.el
index 38f4fe87b1..b1779d22e0 100644
--- a/hmail.el
+++ b/hmail.el
@@ -94,11 +94,11 @@ Return t if button data is found, else nil."
               (hmail:msg-narrow)
               t)
              ((or (hmail:lister-p) (hnews:lister-p)) t)
-             ((memq major-mode (list hmail:composer hnews:reader
-                                     hnews:composer))
+             ((or (not buffer-file-name)
+                  (memq major-mode (list hmail:composer hnews:reader
+                                         hnews:composer)))
               (widen)
-              t)
-             ((not buffer-file-name)))
+              t))
     (goto-char (point-max))
     (when (search-backward hmail:hbdata-sep nil t)
       (forward-line 1)
diff --git a/hmouse-drv.el b/hmouse-drv.el
index 11ead6bc01..7136486264 100644
--- a/hmouse-drv.el
+++ b/hmouse-drv.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    04-Feb-90
-;; Last-Mod:     12-Aug-23 at 13:19:18 by Bob Weiner
+;; Last-Mod:      1-Oct-23 at 20:17:42 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -628,11 +628,13 @@ The selected window does not change."
 
 ;;;###autoload
 (defun hkey-window-link (release-window)
-  "Create an ebut in the selected window, linked to point in RELEASE-WINDOW.
+  "Create a but in the selected window, linked to point in RELEASE-WINDOW.
 RELEASE-WINDOW is interactively selected via the `ace-window' command.
 The selected window does not change.
 
-With a prefix argument, create an unnamed implicit button instead."
+With no prefix argument, create an explicit button.
+With a C-u '(4) prefix argument, create an unnamed implicit button.
+With a M-1 prefix argument, create an named implicit button."
   (interactive
    (list (let ((mode-line-text (concat " Ace - Hyperbole: " (nth 2 (assq ?w 
aw-dispatch-alist)))))
           (aw-select mode-line-text))))
@@ -795,7 +797,7 @@ buffer to the end window.  The selected window does not 
change."
                   (if (fboundp #'aw-select) ;; ace-window selection
                       (let ((aw-scope 'global))
                         (aw-select "Select link referent window"))
-                    (message "Now click on the end window...")
+                    (message "Select link referent window with the mouse...")
                     (let (end-event)
                       (prog1 (cl-loop do (setq end-event (read-event))
                                       until (and (mouse-event-p end-event)
diff --git a/hmouse-key.el b/hmouse-key.el
index d090b6d9e0..50723226a7 100644
--- a/hmouse-key.el
+++ b/hmouse-key.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    30-May-94 at 00:11:57
-;; Last-Mod:      6-Aug-23 at 12:31:42 by Bob Weiner
+;; Last-Mod:     18-Sep-23 at 08:03:36 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -127,14 +127,17 @@ mouse key the Paste Key instead of the Action Key."
   "Reload the contexts and actions associated with the Smart Keys.
 Use after any programmatic change is made."
   (interactive)
-  (load "hui-mini")
-  (hkey-initialize)
-  (makunbound 'hkey-alist)
-  (makunbound 'hmouse-alist)
-  (let ((load-prefer-newer t))
-    (mapc #'load '("hui-mouse" "hui-window" "hibtypes" "hactypes")))
-  (message "Hyperbole Smart Key and Smart Mouse Key actions have been 
updated."))
-
+  (let ((load-prefer-newer t)
+       (ftrs '(hui-mouse hui-window hibtypes hactypes)))
+    (load "hui-mini")
+    (hkey-initialize)
+    (makunbound 'hkey-alist)
+    (makunbound 'hmouse-alist)
+    (mapc (lambda (feature)
+           (setq features (delq feature features)))
+         ftrs)
+    (mapc #'require ftrs)
+    (message "Hyperbole Smart Keys and menus have been updated")))
 
 ;;; ************************************************************************
 ;;; Private variables
diff --git a/hpath.el b/hpath.el
index a0e2255f52..f958ef6a74 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:     28-Aug-23 at 16:48:31 by Bob Weiner
+;; Last-Mod:      1-Oct-23 at 12:47:34 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1511,67 +1511,73 @@ but locational suffixes within the file are utilized."
 (defun hpath:to-markup-anchor (hash anchor)
   "Ignore HASH when ANCHOR is non-null and move point to ANCHOR string if 
found.
 Move point to beginning of buffer if HASH is non-nil and ANCHOR is null."
-  (cond ((and (stringp anchor) (not (equal anchor "")))
-        (cond ((memq major-mode hui-select-markup-modes)
-               ;; In HTML-like mode where link ids are case-sensitive.
-               (let ((opoint (point))
-                     (case-fold-search))
-                 (goto-char (point-min))
-                 (if (re-search-forward (format hpath:html-anchor-id-pattern 
(regexp-quote anchor)) nil t)
-                     (progn (forward-line 0)
-                            (when (eq (current-buffer) (window-buffer))
-                              (recenter 0)))
-                   (goto-char opoint)
-                   (error "(hpath:to-markup-anchor): %s - Anchor `%s' not 
found in the visible buffer portion"
-                          (buffer-name)
-                          anchor))))
-              (t
-               (let* ((opoint (point))
-                      (prog-mode (derived-mode-p 'prog-mode))
-                      ;; Markdown or outline link ids are case
-                      ;; insensitive and - characters are converted to
-                      ;; spaces at the point of definition unless
-                      ;; anchor contains both - and space characters,
-                      ;; then no conversion occurs.
-                      (case-fold-search (not prog-mode))
-                      (anchor-name (if (or prog-mode
-                                           (string-match-p "-.* \\| .*-" 
anchor))
-                                       anchor
-                                     (subst-char-in-string ?- ?\  anchor)))
-                      (referent-regexp (format
-                                        (cond ((or (derived-mode-p 
'outline-mode) ;; Includes Org mode
-                                                   ;; Treat all caps filenames 
without suffix like outlines, e.g. README, INSTALL.
-                                                   (and buffer-file-name
-                                                        (string-match-p 
"\\`[A-Z][A-Z0-9]+\\'" buffer-file-name)))
-                                               hpath:outline-section-pattern)
-                                              (prog-mode
-                                               "%s")
-                                              ((or (and buffer-file-name
-                                                        (string-match-p 
hpath:markdown-suffix-regexp buffer-file-name))
-                                                   (memq major-mode 
hpath:shell-modes))
-                                               hpath:markdown-section-pattern)
-                                              ((derived-mode-p 'texinfo-mode)
-                                               hpath:texinfo-section-pattern)
-                                              ((derived-mode-p 'text-mode)
-                                               "%s")
-                                              (t 
hpath:outline-section-pattern))
-                                        (regexp-quote anchor-name)))
-                      (referent-leading-spaces-regexp
-                       (when (and (not (string-empty-p referent-regexp))
-                                  (= (aref referent-regexp 0) ?^))
-                         (concat "^[ \t]+" (substring referent-regexp 1)))))
-                 (goto-char (point-min))
-                 (if (or (re-search-forward referent-regexp nil t)
-                         (and referent-leading-spaces-regexp
-                              (re-search-forward 
referent-leading-spaces-regexp nil t)))
-                     (progn (forward-line 0)
-                            (when (eq (current-buffer) (window-buffer))
-                              (recenter 0)))
-                   (goto-char opoint)
-                   (error "(hpath:to-markup-anchor): %s - Section `%s' not 
found in the visible buffer portion"
-                          (buffer-name)
-                          anchor-name))))))
-       (hash (goto-char (point-min)))))
+  (let ((omin (point-min))
+       (omax (point-max)))
+    (unwind-protect
+       (progn (widen)
+              (cond ((and (stringp anchor) (not (equal anchor "")))
+                     (cond ((memq major-mode hui-select-markup-modes)
+                            ;; In HTML-like mode where link ids are 
case-sensitive.
+                            (let ((opoint (point))
+                                  (case-fold-search))
+                              (goto-char (point-min))
+                              (if (re-search-forward (format 
hpath:html-anchor-id-pattern (regexp-quote anchor)) nil t)
+                                  (progn (forward-line 0)
+                                         (when (eq (current-buffer) 
(window-buffer))
+                                           (recenter 0)))
+                                (goto-char opoint)
+                                (error "(hpath:to-markup-anchor): %s - Anchor 
`%s' not found in the visible buffer portion"
+                                       (buffer-name)
+                                       anchor))))
+                           (t
+                            (let* ((opoint (point))
+                                   (prog-mode (derived-mode-p 'prog-mode))
+                                   ;; Markdown or outline link ids are case
+                                   ;; insensitive and - characters are 
converted to
+                                   ;; spaces at the point of definition unless
+                                   ;; anchor contains both - and space 
characters,
+                                   ;; then no conversion occurs.
+                                   (case-fold-search (not prog-mode))
+                                   (anchor-name (if (or prog-mode
+                                                        (string-match-p "-.* 
\\| .*-" anchor))
+                                                    anchor
+                                                  (subst-char-in-string ?- ?\  
anchor)))
+                                   (referent-regexp (format
+                                                     (cond ((or 
(derived-mode-p 'outline-mode) ;; Includes Org mode
+                                                                ;; Treat all 
caps filenames without suffix like outlines, e.g. README, INSTALL.
+                                                                (and 
buffer-file-name
+                                                                     
(string-match-p "\\`[A-Z][A-Z0-9]+\\'" buffer-file-name)))
+                                                            
hpath:outline-section-pattern)
+                                                           (prog-mode
+                                                            "%s")
+                                                           ((or (and 
buffer-file-name
+                                                                     
(string-match-p hpath:markdown-suffix-regexp buffer-file-name))
+                                                                (memq 
major-mode hpath:shell-modes))
+                                                            
hpath:markdown-section-pattern)
+                                                           ((derived-mode-p 
'texinfo-mode)
+                                                            
hpath:texinfo-section-pattern)
+                                                           ((derived-mode-p 
'text-mode)
+                                                            "%s")
+                                                           (t 
hpath:outline-section-pattern))
+                                                     (regexp-quote 
anchor-name)))
+                                   (referent-leading-spaces-regexp
+                                    (when (and (not (string-empty-p 
referent-regexp))
+                                               (= (aref referent-regexp 0) ?^))
+                                      (concat "^[ \t]+" (substring 
referent-regexp 1)))))
+                              (goto-char (point-min))
+                              (if (or (re-search-forward referent-regexp nil t)
+                                      (and referent-leading-spaces-regexp
+                                           (re-search-forward 
referent-leading-spaces-regexp nil t)))
+                                  (progn (forward-line 0)
+                                         (when (eq (current-buffer) 
(window-buffer))
+                                           (recenter 0)))
+                                (goto-char opoint)
+                                (error "(hpath:to-markup-anchor): %s - Section 
`%s' not found in the visible buffer portion"
+                                       (buffer-name)
+                                       anchor-name))))))
+                    (hash (goto-char omin))))
+      (when (and (<= omin (point)) (>= omax (point)))
+       (narrow-to-region omin omax)))))
 
 (defun hpath:find-executable (executable-list)
   "Return first executable string from EXECUTABLE-LIST found in `exec-path'.
@@ -1599,8 +1605,8 @@ frame.  Always return t."
   (interactive "FFind file: ")
   ;; Just delete any special Hyperbole command characters preceding
   ;; the filename, ignoring them.
-  (if (string-match hpath:prefix-regexp filename)
-      (setq filename (substring filename (match-end 0))))
+  (when (string-match hpath:prefix-regexp filename)
+    (setq filename (substring filename (match-end 0))))
   (hpath:find
    (if (integerp line-num)
        (concat filename ":" (int-to-string line-num))
@@ -1882,6 +1888,14 @@ prior to calling this function."
          (error ""))
       var-group)))
 
+(defun hpath:shorten (path)
+  "Shorten and return a PATH.
+Replace Emacs Lisp variables and environment variables (format of
+${var}) with their values in PATH.  The first matching value for
+variables like `${PATH}' is used.  Then abbreviate any remaining
+path."
+  (hpath:abbreviate-file-name (hpath:substitute-var path)))
+
 (defun hpath:substitute-value (path)
   "Substitute values for Emacs Lisp variables and environment variables in 
PATH.
 Return the resulting PATH.
@@ -2016,12 +2030,16 @@ Return LINKNAME unchanged if it is not a symbolic link 
but is a pathname."
 
 (defun hpath:to-line (line-num)
   "Move point to the start of an absolute LINE-NUM or the last line."
-  (save-restriction
-    (widen)
-    (goto-char (point-min))
-    (if (eq selective-display t)
-       (re-search-forward "[\n\r]" nil 'end (1- line-num))
-      (forward-line (1- line-num)))))
+  (let ((omin (point-min))
+       (omax (point-max)))
+    (unwind-protect
+       (progn (widen)
+              (goto-char (point-min))
+              (if (eq selective-display t)
+                  (re-search-forward "[\n\r]" nil 'end (1- line-num))
+                (forward-line (1- line-num))))
+      (when (and (<= omin (point)) (>= omax (point)))
+       (narrow-to-region omin omax)))))
 
 (defun hpath:trim (path)
   "Return PATH with any [\" \t\n\r] characters trimmed from its start and end."
@@ -2033,12 +2051,14 @@ Return LINKNAME unchanged if it is not a symbolic link 
but is a pathname."
   path)
 
 (defun hpath:normalize (filename)
-  "Normalize and return PATH if PATH is a valid, readable path, else signal 
error.
+  "Normalize and return an existing, readable FILENAME, else signal an error.
 Replace Emacs Lisp variables and environment variables (format of
-${var}) with their values in PATH.  The first matching value for
-  variables like `${PATH}' is used."
-  (hpath:validate (hpath:substitute-value
-                  (buffer-file-name (hpath:find-noselect filename)))))
+${var}) with their values in FILENAME's path.  The first matching
+value for variables like `${PATH}' is used."
+  (let ((buf (hpath:find-noselect filename)))
+    (if buf
+       (hpath:validate (hpath:substitute-value (buffer-file-name buf)))
+      (error "(hpath:normalize): '\"%s\" is not a readable filename" 
filename))))
 
 (defun hpath:validate (path)
   "Validate PATH is readable and return it in Posix format.
diff --git a/hsys-org.el b/hsys-org.el
index c930adb1b2..af9dcde107 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:     27-Aug-23 at 14:29:35 by Bob Weiner
+;; Last-Mod:     18-Sep-23 at 06:17:33 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -150,6 +150,26 @@ an error."
       (and (boundp 'outshine-mode) outshine-mode)
       (and (boundp 'poporg-mode) poporg-mode)))
 
+;;;###autoload
+(defun hsys-org-at-read-only-p ()
+  "Return non-nil if point is in an Org read-only context."
+  (and (derived-mode-p 'org-mode)
+       (featurep 'hsys-org)
+       (or (hsys-org-src-block-start-at-p)
+          (hsys-org-block-start-at-p)
+          (let ((contexts (org-context)))
+            (and contexts
+                 (delq nil (mapcar (lambda (ctxt) (assq ctxt contexts))
+                                   '(:checkbox
+                                     :headline-stars
+                                     :item-bullet
+                                     :keyword
+                                     :link
+                                     :priority
+                                     :table-special
+                                     :tags
+                                     :todo-keyword))))))))
+
 (defun hsys-org-cycle ()
   "Call `org-cycle' and set as `this-command' to cycle through all states."
   (setq this-command 'org-cycle)
diff --git a/hui-mini.el b/hui-mini.el
index 7a351ba6b2..d1f6f5d8d8 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:      9-Aug-23 at 00:21:49 by Bob Weiner
+;; Last-Mod:     18-Sep-23 at 08:03:51 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -436,10 +436,9 @@ documentation, not the full text."
           ;; RET pressed on Hyperbole top-level menu prefix, reload
           ;; Smart Key handlers and minibuffer menus to reflect any updates.
           (hmouse-update-smart-keys)
-          (hyperbole-minibuffer-menu)
-          (sit-for 2)
-          (message "Minibuffer menus and Smart Key actions reloaded.")
-          '(menu . hyperbole))
+          (set--this-command-keys (concat hui:menu-keys hui:menu-quit))
+          (setq this-command #'hmouse-update-smart-keys)
+          nil)
          ((memq key (list 1 top-char))
           (setq hui:menu-keys (concat hui:menu-keys (char-to-string top-char)))
           '(menu . hyperbole))
diff --git a/hui-mouse.el b/hui-mouse.el
index 3d6b22f270..a68c140a5f 100644
--- a/hui-mouse.el
+++ b/hui-mouse.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    04-Feb-89
-;; Last-Mod:     28-Aug-23 at 01:58:05 by Bob Weiner
+;; Last-Mod:     19-Sep-23 at 05:47:43 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
diff --git a/hui-window.el b/hui-window.el
index 5ecdc0fd14..63ebae28e2 100644
--- a/hui-window.el
+++ b/hui-window.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    21-Sep-92
-;; Last-Mod:     20-Jun-23 at 23:08:18 by Bob Weiner
+;; Last-Mod:     18-Sep-23 at 20:43:57 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
diff --git a/hui.el b/hui.el
index 6092f9434e..3916a5071e 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:     29-Aug-23 at 01:11:29 by Bob Weiner
+;; Last-Mod:      1-Oct-23 at 17:03:53 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1168,7 +1168,7 @@ from those instead.  See also documentation for
                                (hui:hbut-label-default
                                 (region-beginning) (region-end))))
                         "ebut-link-directly"
-                        "Create button named: ")
+                        "Create ebutton named: ")
                lbl-key (hbut:label-to-key but-lbl))))
 
       ;; num-types is the number of possible link types to choose among
@@ -1216,8 +1216,9 @@ With optional DEPRESS-WINDOW and RELEASE-WINDOW, use the 
points
 from those instead.  See also documentation for
 `hui:link-possible-types'.
 
-With optional NAME-ARG-FLAG (interactively, the prefix argument),
-prompt for a name to precede the implicit button.
+With optional NAME-ARG-FLAG (interactively, the prefix argument set to
+anything other than a single C-u (list 4)), prompt for a name to precede
+the implicit button.
 
 An Assist Mouse Key drag between windows runs this command.
 Alternatively, to swap buffers between two windows, Assist Mouse Key
@@ -1265,7 +1266,13 @@ drag from a window to another window's modeline."
                name-key (ibut:label-to-key (hattr:get 'hbut:current 'name)))
        (setq but-loc (hui:key-src (current-buffer))
              but-dir (hui:key-dir (current-buffer))))
-      (when (and name-arg-flag (not name-key))
+
+      ;; Ignore single C-u prefix arg here since this may be invoked
+      ;; via 'hkey-either' which runs the Assist Key when given a
+      ;; single C-u prefix argument.  In such a case, don't use the
+      ;; prefix argument as a flag to prompt for the ibutton name as
+      ;; we want to just insert the appropriate ibut without any prompting.
+      (when (and name-arg-flag (not (eq name-arg-flag '(4))) (not name-key))
        (setq but-name (hui:hbut-label
                        (cond ((hmouse-prior-active-region)
                               hkey-region)
@@ -1861,10 +1868,10 @@ Buffer without File      link-to-buffer-tmp"
                                                      (list (rmail:msg-id-get) 
buffer-file-name))))))
                                      (t (cond
                                          ((let ((hargs:reading-type 
'directory))
-                                            (setq val (hargs:at-p t)))
+                                            (setq val (hargs:at-p)))
                                           (list 'link-to-directory val))
                                          ((let ((hargs:reading-type 'file))
-                                            (setq val (hargs:at-p t)))
+                                            (setq val (hargs:at-p)))
                                           (list 'link-to-file val (point)))
                                          ((derived-mode-p #'kotl-mode)
                                           (list 'link-to-kcell 
buffer-file-name (kcell-view:idstamp)))
diff --git a/hversion.el b/hversion.el
index d59e50eda2..0a180cf051 100644
--- a/hversion.el
+++ b/hversion.el
@@ -4,7 +4,7 @@
 ;; Maintainer:   Bob Weiner, Mats Lidell
 ;;
 ;; Orig-Date:     1-Jan-94
-;; Last-Mod:     27-Aug-23 at 15:26:39 by Bob Weiner
+;; Last-Mod:     18-Sep-23 at 06:39:39 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -52,33 +52,6 @@ your specific mouse.")
 ;;; Support functions
 ;;; ************************************************************************
 
-(defun hyperb:path-being-loaded ()
-  "Return the full pathname used by the innermost `load' or `require' call.
-Removes any matches for `hyperb:automount-prefixes' before returning
-the pathname."
-  (let* ((frame (hyperb:stack-frame '(load require)))
-        (function (nth 1 frame))
-        file nosuffix)
-    (cond ((eq function 'load)
-          (setq file (nth 2 frame)
-                nosuffix (nth 5 frame)))
-         ((eq function 'require)
-          (setq file (or (nth 3 frame) (symbol-name (nth 2 frame))))))
-    (when (stringp file)
-      (setq nosuffix (or nosuffix
-                        (string-match
-                         "\\.\\(elc?\\|elc?\\.gz\\|elc?\\.Z\\)$"
-                         file))
-           file (substitute-in-file-name file)
-           file (locate-file file load-path
-                             (when (null nosuffix) '(".elc" ".el" ".el.gz" 
".el.Z"))
-                             ;; accept any existing file
-                             nil)
-           file (if (and (stringp file)
-                         (string-match hyperb:automount-prefixes file))
-                    (substring file (1- (match-end 0)))
-                  file)))))
-
 ;; Called in hyperbole.el.
 (defun hyperb:stack-frame (function-list &optional debug-flag)
   "Return the nearest Elisp stack frame that called a function from 
FUNCTION-LIST.
diff --git a/hypb.el b/hypb.el
index 28d067f673..3eca4fe9d4 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:     27-Aug-23 at 17:15:52 by Bob Weiner
+;; Last-Mod:      1-Oct-23 at 20:17:22 by Bob Weiner
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -1029,6 +1029,7 @@ If FILE is not an absolute path, expand it relative to 
`hyperb:dir'."
       (skip-syntax-forward "-")
       (set-window-start (selected-window) 1)
       (set-buffer-modified-p nil)
+      (org-mode)
       (view-mode)
       ;; On some versions of Emacs like Emacs28, need a slight delay
       ;; for file loading before searches will work properly.
diff --git a/hyperbole.el b/hyperbole.el
index 7b49387211..e86a44dd8c 100644
--- a/hyperbole.el
+++ b/hyperbole.el
@@ -7,7 +7,7 @@
 ;; Author:       Bob Weiner
 ;; Maintainer:   Bob Weiner <rsw@gnu.org>, Mats Lidell <matsl@gnu.org>
 ;; Created:      06-Oct-92 at 11:52:51
-;; Last-Mod:     27-Aug-23 at 13:04:09 by Bob Weiner
+;; Last-Mod:     18-Sep-23 at 06:39:11 by Bob Weiner
 ;; Released:     03-Dec-22
 ;; Version:      8.0.1pre
 ;; Keywords:     comm, convenience, files, frames, hypermedia, languages, 
mail, matching, mouse, multimedia, outlines, tools, wp
@@ -111,9 +111,8 @@
     (setq features (delq 'hload-path features)
          features (delq 'hversion features)))
 
-  ;; Defines hyperb:path-being-loaded, hyperb:stack-frame,
-  ;; (hyperb:window-system) and hyperb:dir, which are used later in
-  ;; this file.  Also adds Hyperbole to the load-path if need be.
+  ;; Defines hyperb:stack-frame, hyperb:window-system and hyperb:dir, which 
are used
+  ;; later in this file.  Also adds Hyperbole to the load-path if need be.
   ;;
   ;; This handles the case when the Hyperbole package directory is not yet in 
load-path.
   (unless (or (require 'hversion nil t)
diff --git a/man/hyperbole.texi b/man/hyperbole.texi
index 96ee0be2a8..3265bc0f06 100644
--- a/man/hyperbole.texi
+++ b/man/hyperbole.texi
@@ -7,7 +7,7 @@
 @c Author:       Bob Weiner
 @c
 @c Orig-Date:     6-Nov-91 at 11:18:03
-@c Last-Mod:     28-Aug-23 at 12:33:01 by Bob Weiner
+@c Last-Mod:      1-Oct-23 at 20:19:05 by Bob Weiner
 
 @c %**start of header (This is for running Texinfo on a region.)
 @setfilename hyperbole.info
@@ -156,7 +156,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</P>
 
 <PRE>
 Edition 8.0.1pre
-Printed August 28, 2023.
+Printed October 1, 2023.
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -198,7 +198,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 @example
 Edition 8.0.1pre
-August 28, 2023
+October 1, 2023
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -1649,7 +1649,7 @@ the Assist Mouse Key (not the Action Key) from the open 
area of one
 window's modeline to the text area of another.  This works across frames
 as well.
 
-If you have just two windows in an Emacs frame, you can swap their buffers
+If you have precisely two windows in an Emacs frame, you can swap their buffers
 from the keyboard.  Use this Hyperbole minibuffer menu key sequence
 involving the tilde key to swap the buffers and quit from the Hyperbole
 minibuffer menu: @bkbd{C-h h s w ~ Q}.  Similarly, if you have two single
@@ -1762,21 +1762,15 @@ for @code{ace-window}, then just ensure it is 
initialized by calling
 @kindex M-o i <window-id>
 @kindex M-o m <window-id>
 @kindex M-o r <window-id>
-@kindex M-o t <window-id>
-@kindex M-o w <window-id>
 @cindex insert item
 @cindex drag item
 @cindex replace window buffer
 @cindex swap window buffers
-@cindex throw item
 @cindex buffer replace
 @cindex buffers swap
-@cindex create link button
 @cindex window link button
-@cindex link button
 @cindex item drag
 @cindex item insert
-@cindex item throw
 After setup, the leftmost character or two of each window's modeline
 will show the ID to type to use that window as the drag destination.
 Then whenever point is on an item you want displayed in another
@@ -1788,10 +1782,31 @@ item to the window.  To @emph{replace} the selected 
window's buffer
 with that of another window, use @bkbd{M-o r
 <id-of-window-displaying-desired-buffer>}.  To instead @emph{swap} the
 selected window's buffer with that of another window, use @bkbd{M-o m
-<id-of-window-to-swap-with>}.  And finally, to quickly create a link
-between the selected window and another window, use @bkbd{M-o w
-<id-of-referent-window>}.
+<id-of-window-to-swap-with>}.
 
+@kindex M-o w <window-id>
+@cindex create link button
+@cindex link button
+@findex hui:ebut-link-directly
+And finally, to create an explicit link between the selected window
+and another window, use @bkbd{M-o w <id-of-referent-window>}.
+@code{hui:ebut-link-directly} determines the link type by using
+the referent context.  
+
+
+@kindex C-u M-o w <window-id>
+@kindex M-1 M-o w <window-id>
+@findex hui:ibut-link-directly
+@bkbd{C-u M-o w <window>} creates a new, @emph{unnamed} implicit
+button in the selected (current) window that links to point in the
+referent <window>.  @code{hui:ibut-link-directly} determines the link
+type by using the referent context.  @bkbd{M-1 M-o w <window>} creates
+a new, @emph{named} implicit button in the selected (current) window
+that links to point in the referent <window>.
+
+@kindex M-o t <window-id>
+@cindex item throw
+@cindex throw item
 @cindex throw region
 @cindex region throw
 You can also throw the active (highlighted) region of text to another
@@ -1819,12 +1834,17 @@ replace the selected (current) window's buffer with 
that of <window>
 @item M-o t <window>
 throw region, listing item at point, or current buffer to <window>
 
-@findex hui:ebut-link-directly
 @item M-o w <window>
-window link, create a new explicit button in the selected (current)
-window, linking to point in the referent <window>.
-@code{hui:ebut-link-directly} determines the link type by using the
-referent context.
+window link, create a new @emph{explicit button} in the selected
+(current) window, linking to point in the referent <window>.
+
+@item C-u M-o w <window>
+window link, create a new, @emph{unnamed implicit button} in the
+selected (current) window, linking to point in the referent <window>.
+
+@item M-1 M-o w <window>
+window link, create a new, @emph{named implicit button} in the
+selected (current) window, linking to point in the referent <window>.
 @end table
 
 @c -------
@@ -2142,7 +2162,7 @@ the button type based on the referent context or will 
prompt you to
 select from one of a few possible link types.
 
 @cindex implicit link creation
-@cindex menu, Ibut/Link
+@cindex menu item, Ibut/Link
 @kindex C-h h i l
 If you have exactly two Emacs windows in your current frame or exactly
 two windows visible across two Emacs frames, this is even easier.
@@ -3956,8 +3976,8 @@ submenus and then return to the top menu.
 
 You can reload the Hyperbole minibuffer menus and Smart Key handlers
 to reflect any recent edits when on the top-level Hyperbole menu by
-pressing the Action Key on the menu name (first item that ends with
-'>').
+pressing @bkbd{@key{RET}} or the Action Key on the menu name (first
+item that ends with '>').  This will also quit from the menu.
 
 You can quit from the minibuffer menus without selecting an item by
 using @bkbd{Q}, or by pressing @bkbd{@key{RET}} or @bkbd{M-@key{RET}}
diff --git a/man/version.texi b/man/version.texi
index 8eb5c82c15..bdcbada14c 100644
--- a/man/version.texi
+++ b/man/version.texi
@@ -1,4 +1,4 @@
-@set UPDATED August, 2023
-@set UPDATED-MONTH August 2023
+@set UPDATED October, 2023
+@set UPDATED-MONTH October 2023
 @set EDITION 8.0.1pre
 @set VERSION 8.0.1pre
diff --git a/test/hbut-tests.el b/test/hbut-tests.el
index f969ec9000..680f276652 100644
--- a/test/hbut-tests.el
+++ b/test/hbut-tests.el
@@ -170,7 +170,9 @@ Needed since hyperbole expands all links to absolute paths 
and
   (with-temp-buffer
     (ebut:program "label" 'link-to-directory "/tmp")
     (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label"))
+    (goto-char (point-max))
     (ebut:program "label" 'link-to-directory "/tmp")
+    (goto-char (- (point-max) 2))
     (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label:2"))))
 
 (ert-deftest hypb:program-create-link-to-file-line-and-column-but-in-file ()
diff --git a/test/hibtypes-tests.el b/test/hibtypes-tests.el
index ea453da2f4..503aa4c9d2 100644
--- a/test/hibtypes-tests.el
+++ b/test/hibtypes-tests.el
@@ -129,15 +129,16 @@
 
 (ert-deftest ibtypes::pathname-load-path-line-column-test ()
   "Pathname with line and position specification."
-  (unwind-protect
-      (with-temp-buffer
-        (insert "\"${load-path}/hypb.el:11:5\"")
-        (goto-char 2)
-        (ibtypes::pathname-line-and-column)
-        (should (string= "hypb.el" (buffer-name)))
-        (should (= (line-number-at-pos) 11))
-        (should (= (current-column) 5)))
-    (kill-buffer "hypb.el")))
+  (with-temp-buffer
+    (unwind-protect
+        (progn
+         (insert "\"${load-path}/hypb.el:11:5\"")
+          (goto-char 2)
+          (ibtypes::pathname-line-and-column)
+          (should (string-prefix-p "hypb.el" (buffer-name)))
+          (should (= (line-number-at-pos) 11))
+          (should (= (current-column) 5)))
+      (kill-buffer (buffer-name)))))
 
 (ert-deftest ibtypes::pathname-with-dash-loads-file-test ()
   "Pathname with dash loads file."
diff --git a/test/hui-tests.el b/test/hui-tests.el
index ed1fc037b1..93ecdd5024 100644
--- a/test/hui-tests.el
+++ b/test/hui-tests.el
@@ -663,26 +663,26 @@ With point on label suggest that ibut for rename."
   "Rename an ebut shall change the name of only button with that label."
   (with-temp-buffer
     (ebut:program "label" 'link-to-directory "/tmp")
+    (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label"))
     (goto-char (point-max))
     (ebut:program "label2" 'link-to-directory "/tmp")
-    (goto-char (point-min))
-    (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label"))
+    (goto-char 3)
     (hui:ebut-rename "label" "new")
     (should (equal (hattr:get (hbut:at-p) 'lbl-key) "new"))
-    (goto-char (- (point-max) 1))
+    (goto-char (- (point-max) 2))
     (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label2"))))
 
 (ert-deftest hui--ebut-rename-nonumbered-label ()
   "Rename an ebut shall rename the label with no number."
   (with-temp-buffer
     (ebut:program "label" 'link-to-directory "/tmp")
+    (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label"))
     (goto-char (point-max))
     (ebut:program "label" 'link-to-directory "/tmp")
-    (goto-char (point-min))
-    (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label"))
+    (goto-char 3)
     (hui:ebut-rename "label" "new")
     (should (equal (hattr:get (hbut:at-p) 'lbl-key) "new"))
-    (goto-char (- (point-max) 1))
+    (goto-char (- (point-max) 2))
     (should (equal (hattr:get (hbut:at-p) 'lbl-key) "label:2"))))
 
 (ert-deftest hui--ebut-rename-numbered-label ()



reply via email to

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