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

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

[elpa] externals/hyperbole a566b48 38/51: Large partial update in prepar


From: Stefan Monnier
Subject: [elpa] externals/hyperbole a566b48 38/51: Large partial update in preparation for 7.1.1 test release
Date: Sun, 12 Jul 2020 18:10:16 -0400 (EDT)

branch: externals/hyperbole
commit a566b487288c2376a2b9c445da95a09d6ac1bc1d
Author: Bob Weiner <rsw@gnu.org>
Commit: Bob Weiner <rsw@gnu.org>

    Large partial update in preparation for 7.1.1 test release
---
 Changes            |  39 ++++++++++++++++-
 DEMO               |  88 +++++++++++++++++++-------------------
 HY-NEWS            |  24 ++++++++++-
 hact.el            |   9 ++--
 hbut.el            |  48 ++++++++++++++++-----
 hib-kbd.el         | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 hibtypes.el        |   5 ++-
 hpath.el           |  56 +++++++++++++++++++++++-
 hsettings.el       |   6 ++-
 hui.el             |  36 ++++++++--------
 hypb.el            |  24 +++++------
 hyperbole.el       |   6 ++-
 man/hyperbole.html |  22 ++++++----
 man/hyperbole.info | Bin 523270 -> 523512 bytes
 man/hyperbole.pdf  | Bin 1283653 -> 1283921 bytes
 man/hyperbole.texi |  21 +++++----
 man/version.texi   |   8 ++--
 17 files changed, 388 insertions(+), 127 deletions(-)

diff --git a/Changes b/Changes
index 3ae27f2..ff60cc2 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,40 @@
+2020-03-01  Bob Weiner  <rsw@gnu.org>
+
+* hypb.el (hypb:display-file-with-logo): Modified to not move point or do 
anything other than use view-mode
+    to display the file buffer if it exists prior to this call.  This allows 
using {C-h h d d} to jump back
+    to the same point in the DEMO.  The FILE argument is now required.
+
+* hbut (hbut:syntax-table, hbut:modify-syntax): Added to modify <> and {} 
syntactic character pairs for use
+    with implicit button activations, notably Action and Key Series.
+       (ibut:label-p): Used hbut:syntax-table.
+       (require): Added elisp-mode for syntax table support.
+  hyperbole.el (hyperb:init): Added hbut:modify-syntax call.
+
+* DEMO (Sample Explicit Buttons and Types): Removed email example since it 
wasn't very good and that
+    code has not been  updated in a long time.
+
+* hsettings.el (hyperbole-web-search): Fixed to encode URL special characters 
including spaces.
+    This fixed the 'electric car' explicit button example in the DEMO.
+
+* hib-kbd.el (kbd-key:binding, kbd-key:kbd, kbd-key:parse): Added and used to 
prevent (kbd) calls from
+    improperly parsing "<[td]>" as an Emacs event and as a result removing the 
angle brackets.
+
+* DEMO (Global Buttons): Added a new example of a labeled global implicit 
button displaying a todo file.
+
+* hpath.el (hpath:substitute-match-value): Added and called in 
hpath:substitute-value.  This function
+    was hypb:replace-match-string in previous Hyperbole releases but now is 
only used by this one function.
+
+* man/hyperbole.texi (Glossary):
+  hibtypes.el (action):
+  hib-kbd.el (kbd-key):
+  hbut.el (hbut:max-len): Renamed variable from ebut:max-len since applies to 
all Hyperbole button types now.
+    Increased to 200; allowed for 0 value which means no limit.  Locally set 
to 0 in Action implicit
+    button type.
+          (hbut:max-len): Added this inline function to retrieve the proper 
value.
+
+* hibtypes.el (action):
+  hact.el (actype:act): Added support for special forms like: 'progn', 'and', 
etc.
+
 2020-02-29  Bob Weiner  <rsw@gnu.org>
 
 * hpath.el (hpath:find): Fixed bug where hpath:to-markup-buffer with point in 
the source link buffer
@@ -12,7 +49,7 @@
              (kbd-key:key-and-arguments): Updated to handle that key-series 
now have multi-character modifier
     keys by adding a seq-position call.
 
-* hypb.el (hypb:replace-match-string): Replace all logic other than error 
generation with Emacs function,
+* hypb.el (hypb:replace-match-string): Replaced all logic other than error 
generation with Emacs function,
     replace-regexp-in-string.
 
 2020-02-27  Bob Weiner  <rsw@gnu.org>
diff --git a/DEMO b/DEMO
index 9527b61..b6c179f 100644
--- a/DEMO
+++ b/DEMO
@@ -18,6 +18,7 @@
     * Epilog
     * References
 
+
 * Introduction
 
 Welcome to GNU Hyperbole.  Hyperbole will super-charge your GNU Emacs
@@ -281,18 +282,23 @@ buffers with a particular major mode first, e.g. 
emacs-lisp-mode.  You will
 be prompted for the major mode and then the size of the grid.
 
 First let's add a few Emacs Lisp files to the bottom of our buffer list.
-Press the Action Key anywhere within the following action button:
+Press the Action Key anywhere within the first line of this action button:
 
-   <mapc (lambda (f) (find-file-noselect (expand-file-name f hyperb:dir)))
-         ("hibtypes.el" "hactypes.el" "hsettings.el")>
+   <progn (mapc (lambda (f) (bury-buffer (find-file-noselect (expand-file-name 
f hyperb:dir))))
+                '("hibtypes.el" "hactypes.el" "hsettings.el"))
+          (message "Last 3 buffers are: %S"
+                   (mapcar #'buffer-name
+                           (nthcdr (- (length (buffer-list)) 3) 
(buffer-list))))>
 
 Now let's display a 2x2 grid of windows preferring Emacs Lisp buffers:
-To try it, activate: {C-hhsf .0 @ emacs-lisp-mode RET 22 RET}.
+To try it, activate this key series button:
+
+   {C-hhsf .0 @ emacs-lisp-mode RET 22 RET}
 
-If you ever need to experiment with different sized window grids, use M-x
-hycontrol-window-grid-repeatedly RET.  It will repeatedly prompt you for a
-grid size and then display it.  When you are done, simply press RET to
-exit.
+If you ever need to experiment with different sized window grids, use
+{M-x hycontrol-window-grid-repeatedly RET}.  It will repeatedly prompt you
+for a grid size and then display it.  When you are done, simply press RET
+to exit.
 
 Outside of HyControl, you can invoke the grid of windows command with C-c @
 in most buffers.
@@ -521,12 +527,12 @@ come in three types:
      list displayed by {C-h h d t a RET}) and are followed by any needed
      arguments to form the action, e.g.
 
-          <link-to-file-line "${hyperb:dir}/hact.el" 40>
+          <link-to-file-line "${hyperb:dir}/hact.el" 41>
 
   2. function calls - these are similar to action type invocations but begin
      with an Elisp function name rather than an action type name, e.g.
 
-          <find-file-other-window "/tmp">
+          <find-file-other-window "/">
 
   3. variable displays - these consist of just an Elisp variable name and
      display a message with the variable name and value, e.g.
@@ -537,11 +543,7 @@ come in three types:
      wish to display, to prevent interpretation as a function call action
      button, precede the name with a '$', e.g.
 
-          <$fill-column>
-
-Since implicit buttons can be labeled with a name and placed in the global
-button file for invocation by name, you can give short names to any such
-buttons you want to invoke frequently.
+          <$hbut:max-len>
 
 An Action Button is recognized only if the first name within the angle
 brackets is an existing action type or Emacs Lisp symbol.  Otherwise, other
@@ -1122,24 +1124,6 @@ You can make a button an alias for another by using the 
`link-to-ebut'
 action type.  This <(factorial alias)> button does whatever the earlier
 <(factorial)> button does.
 
-The `link-to-mail' action type allows you to reference mail messages that
-you have stored away.  We can't demonstrate it here since we don't have the
-mail messages that you do.
-
-Hyperbole buttons may also be embedded within mail messages.  Even buttons
-copied into mail replies can work:
-
-    Emile said:
-    >
-    > Hyperbole is better than home baked bread but not as filling.
-    > The following sample button displays a message, <(as long as 
-    > you press within its first line)>.
-
-Please note that support for explicit Hyperbole buttons within mail and
-USENET news messages has not yet been updated for use with Emacs 24 and 25,
-so these features are disabled by default.  If you want to try them knowing
-this, {C-h h c m} will toggle this feature on and off.
-
 
 * Button Files
 
@@ -1165,18 +1149,31 @@ resources.
 * Global Buttons
 
 Global buttons are labeled Hyperbole buttons in your personal button
-file, as explained above.  All global buttons are activated by name
-with completion provided, independent of which buffers are displayed.
-Global buttons may be explicit buttons or labeled/named implicit
-buttons.
+file.  All global buttons are activated by name with completion
+provided, independent of which buffers are on-screen.  Global buttons
+may be explicit buttons or labeled/named implicit buttons.
+
+The Hyperbole Gbut menu, C-h h g, creates, modifies and activates
+global buttons by name.  Each button created by this menu is stored as
+an explicit button near the end of your personal button file.  But any
+buttons you create in other ways within this file also become global
+buttons, for example labeled/named implicit buttons.
+
+Since implicit buttons can be labeled with a name and placed in the
+global button file for invocation by name, you can give short names to
+any such buttons you want to invoke frequently.  For example, to
+create a labeled implicit global button that displays a personal todo
+file maintained with the Koutliner, activate the following key series
+by pressing M-RET within the first few characters:
 
-The Hyperbole Gbut menu creates, modifies and activates global buttons
-by name.  Each button created by this menu is stored as an explicit
-button near the end of your personal button file.  But any buttons you
-create in other ways within this file also become global buttons.
+          {C-h h b p M-> <[td]>: <find-file "~/Todos.kotl"> RET}
 
-A good strategy for frequently used global buttons is to use short
-names that you can remember.  Then they can be activated quickly.
+From then on, you can jump to your todos with:
+
+          {C-h h g a td RET}
+
+Or bind the global button activation command, hui:gbut-act, to a key
+of your choice for even faster access to all of your global buttons.
 
 Let's create a global button that counts the lines in the current
 buffer and displays the count in the minibuffer.  Press the Action Key
@@ -1209,11 +1206,12 @@ below here:
 
      {C-h h g c smk RET link-to-file RET "DEMO#Smart Mouse Keys" RET}
 
-Then
+Then from anywhere:
 
      {C-h h g a smk RET}
 
-to activate it.
+will activate it.
+
 
 * Smart Mouse Keys
 
diff --git a/HY-NEWS b/HY-NEWS
index e49ef26..64bdce3 100644
--- a/HY-NEWS
+++ b/HY-NEWS
@@ -5,14 +5,36 @@
 *                                   V7.1.1
 ===========================================================================
 
+  DEMO
+
+    - Global Buttons: Added a new example of a labeled global implicit button
+      displaying a todo file maintained in Koutliner format.  See
+      "DEMO#Global Buttons".
+
+    - Within one Emacs session, invoking the DEMO with {C-h h d d} now leaves
+      point where it was so you can continue working your way through it.
+
+    - You can now move between matching < and > as well as { and } delimiter
+      pairs with {C-M-n} and {C-M-p}.
+
   BUTTON TYPES
 
     - {kbd-key} Key Series: Greatly expanded the keys handled by
-      brace- delimited implicit key series buttons.  Added support for
+      brace-delimited implicit key series buttons.  Added support for
       <TAB>, <BS>, C-M-, non-ASCII CONTROL and META key codes, keypad
       keys, function keys, and these modifier keys: CONTROL, ALT,
       HYPER, META, SUPER and SHIFT (when whitespace separated).
 
+    - Action Implicit Buttons: May now start with Lisp special forms like
+      'progn' and 'or'.
+
+    - Longer Button Labels: The default max length of a Hyperbole button
+      label has been increased from 100 to 200 characters.  The variable
+      hbut:max-len controls this.  If you locally set this to 0 in any
+      new button type definition, then for that type of button, there
+      will be no maximumm limit.  Since Action Implicit Buttons can be
+      a series of Lisp calls, they are now unlimited in length.
+
 ===========================================================================
 *                                   V7.1.0
 ===========================================================================
diff --git a/hact.el b/hact.el
index afa5869..10ea59c 100644
--- a/hact.el
+++ b/hact.el
@@ -407,8 +407,7 @@ types register the performance of the action.  ACTYPE may 
be a symbol or symbol
 name for either an action type or a function.  Runs `action-act-hook' before
 performing ACTION."
   (let ((prefix-arg current-prefix-arg)
-       (action (actype:action actype))
-       (act '(apply action args)))
+       (action (actype:action actype)))
     (if (null action)
        (error "(actype:act): Null action for: `%s'" actype)
       ;; Next 2 lines are needed so that relative paths are expanded
@@ -424,12 +423,14 @@ performing ACTION."
                           (hypb:emacs-byte-code-p action)
                           (and (stringp action) (not (integerp action))
                                (setq action (key-binding action))))
-                      (eval act)
+                      (if (special-form-p action)
+                          (eval (cons action args))
+                        (apply action args))
                     (eval action))
                   t)
          (hhist:add hist-elt))))))
 
-;; Return the full Elisp symbol for ACTYPE, which may be a string or symbol."
+;; Return the full Elisp symbol for ACTYPE, which may be a string or symbol.
 (defalias   'actype:elisp-symbol 'symtable:actype-p)
 
 (defun    actype:def-symbol (actype)
diff --git a/hbut.el b/hbut.el
index 456da93..dbafbcd 100644
--- a/hbut.el
+++ b/hbut.el
@@ -16,7 +16,8 @@
 ;;; Other required Elisp libraries
 ;;; ************************************************************************
 
-(eval-and-compile (mapc #'require '(hversion hmoccur hbmap htz hbdata hact)))
+(eval-and-compile (mapc #'require '(elisp-mode help hversion hmoccur hbmap
+                                   htz hbdata hact view)))
 
 ;;; ************************************************************************
 ;;; Public definitions
@@ -30,9 +31,6 @@
   "*Non-nil value saves button data when button source is saved.
 Nil disables saving.")
 
-(defconst ebut:max-len 100
-  "Maximum length of a hyper-button label.")
-
 (defun    ebut:act (label)
   "Activate Hyperbole explicit button with LABEL from the current buffer."
   (interactive (list (hargs:read-match "Activate explicit button labeled: "
@@ -184,7 +182,7 @@ include delimiters.  With TWO-LINES-FLAG non-nil, constrains
 label search to two lines."
   (let ((opoint (point))
        (quoted "\\(^\\|[^\\{]\\)")
-       (ebut:max-len ebut:max-len)
+       (hbut:max-len hbut:max-len)
        npoint start lbl-key end but-start but-end start-regexp end-regexp)
     (unless start-delim (setq start-delim ebut:start))
     (unless end-delim (setq end-delim ebut:end))
@@ -216,9 +214,9 @@ label search to two lines."
        (when two-lines-flag
          (save-excursion
            (forward-line 2)
-           (setq ebut:max-len (- (point) start))))
-       (and (< (point) (+ start ebut:max-len))
-            (re-search-forward (concat quoted end-regexp) (+ start 
ebut:max-len) t)
+           (setq hbut:max-len (- (point) start))))
+       (and (< (point) (+ start (hbut:max-len)))
+            (re-search-forward (concat quoted end-regexp) (+ start 
(hbut:max-len)) t)
             (setq but-end (point)
                   end (- (point) (length end-delim))
                   lbl-key (ebut:label-to-key (buffer-substring-no-properties 
start end)))
@@ -756,6 +754,17 @@ others who use a different value!")
 ;;; hbut class - abstract
 ;;; ========================================================================
 
+(defconst hbut:max-len 200
+  "Maximum length of a Hyperbole button label.
+If 0, there is no limit and searches for button end delimiters can go
+as far as the end of the buffer.
+
+Use the function, (hbut:max-len), to read the proper value.")
+
+(defsubst hbut:max-len ()
+  "Return the value of `hbut:max-len' if non-zero else (point-max)."
+  (if (zerop hbut:max-len) (point-max) hbut:max-len))
+
 (defun    hbut:act (&optional hbut)
   "Perform action for optional explicit or implicit Hyperbole button symbol 
HBUT.
 Default is 'hbut:current."
@@ -1088,6 +1097,24 @@ include delimiters when INCLUDE-DELIMS is non-nil)."
               (setq rtn (cons (funcall but-func lbl start end) rtn))))))
     (nreverse rtn)))
 
+(defvar   hbut:syntax-table (copy-syntax-table emacs-lisp-mode-syntax-table)
+  "Modified Elisp syntax table for use with Action and Key Series buttons.
+Makes < > and { } into syntactically matching pairs.")
+
+;;;###autoload
+(defun    hbut:modify-syntax ()
+  "Modify syntactic character pairs in hbut:syntax-table and 
help-mode-syntax-table for use with implicit button activations."
+  ;; Treat angle brackets as opening and closing delimiters for ease
+  ;; of matching.
+  (mapc (lambda (syntax-table)
+         (modify-syntax-entry ?\< "(>" syntax-table)
+         (modify-syntax-entry ?\> ")<" syntax-table)
+         ;; Treat braces as opening and closing delimiters for ease of 
matching.
+         (modify-syntax-entry ?\{ "(}" syntax-table)
+         (modify-syntax-entry ?\} "){" syntax-table))
+       (list hbut:syntax-table help-mode-syntax-table))
+  nil)
+
 (defun    hbut:outside-comment-p ()
   "Return t if within a programming language buffer and prior regexp match is 
outside a comment, else nil."
   (when (and (derived-mode-p 'prog-mode)
@@ -1417,8 +1444,9 @@ button delimiters.  With POS-FLAG non-nil, returns list of
 label-or-key, but-label-start-position, but-label-end-position.
 Positions include delimiters.  With TWO-LINES-FLAG non-nil,
 constrains label search to two lines."
-  (ebut:label-p as-label (or start-delim ibut:label-start)
-               (or end-delim ibut:label-end) pos-flag two-lines-flag))
+  (with-syntax-table hbut:syntax-table
+    (ebut:label-p as-label (or start-delim ibut:label-start)
+                 (or end-delim ibut:label-end) pos-flag two-lines-flag)))
 
 (defun    ibut:label-regexp (lbl-key &optional no-delim)
   "Unnormalize ibutton LBL-KEY.  Return regular expr matching delimited button 
label.
diff --git a/hib-kbd.el b/hib-kbd.el
index eb0b7a5..9cb04fe 100644
--- a/hib-kbd.el
+++ b/hib-kbd.el
@@ -79,7 +79,7 @@ Any key sequence must be a string of one of the following:
   (unless (or (br-in-browser)
              (and (looking-at "[{}]") (/= ?\\ (preceding-char))))
     ;; handle long series, e.g. eval-elisp actions
-    (let* ((ebut:max-len (max 3000 ebut:max-len))
+    (let* ((hbut:max-len (max 3000 (hbut:max-len)))
           (seq-and-pos (or (hbut:label-p t "{`" "'}" t)
                            (hbut:label-p t "{" "}" t)
                            ;; Regular dual single quotes (Texinfo smart quotes)
@@ -99,7 +99,7 @@ Any key sequence must be a string of one of the following:
        (when (and (stringp key-series)
                   (not (eq key-series "")))
          (setq key-series (kbd-key:normalize key-series)
-               binding (key-binding (kbd key-series))))
+               binding (kbd-key:binding key-series)))
        (and (stringp key-series)
             (or (and binding (not (integerp binding)))
                 (kbd-key:special-sequence-p key-series))
@@ -115,7 +115,7 @@ Any key sequence must be a string of one of the following:
 Returns t if KEY-SERIES has a binding, else nil."
   (interactive "kKeyboard key to execute (no {}): ")
   (setq current-prefix-arg nil) ;; Execution of the key-series may set it.
-  (let ((binding (key-binding (kbd key-series))))
+  (let ((binding (kbd-key:binding key-series)))
     (cond ((null binding)
           ;; If this is a special key seqence, execute it by adding
           ;; its keys to the stream of unread command events.
@@ -130,14 +130,14 @@ Returns t if KEY-SERIES has a binding, else nil."
 
 (defun kbd-key:key-series-to-events (key-series)
   "Insert the key-series as a series of keyboard events into Emacs' unread 
input stream."
-  (setq unread-command-events (nconc unread-command-events 
(listify-key-sequence (kbd key-series)))))
+  (setq unread-command-events (nconc unread-command-events 
(listify-key-sequence (kbd-key:kbd key-series)))))
 
 (defun kbd-key:doc (key-series &optional full)
   "Show first line of doc for binding of keyboard KEY-SERIES in minibuffer.
 With optional prefix arg FULL, display full documentation for command."
   (interactive "kKey sequence: \nP")
   (let* ((keys (kbd-key:normalize key-series))
-        (cmd  (let ((cmd (key-binding (kbd keys))))
+        (cmd  (let ((cmd (kbd-key:binding keys)))
                 (unless (integerp cmd) cmd)))
         (doc (and cmd (documentation cmd)))
         (end-line))
@@ -230,6 +230,115 @@ keyboad input queue, as if they had been typed by the 
user."
 ;;; Private functions
 ;;; ************************************************************************
 
+(defun kbd-key:binding (key-series)
+  "Return any existing key binding for KEY-SERIES or nil."
+  ;; This custom function is used to prevent the (kbd) call from
+  ;; mistakenly removing angle brackets from Hyperbole implicit button
+  ;; names, like: <[td]>.
+  (key-binding (kbd-key:kbd key-series)))
+
+(defun kbd-key:kbd (key-series)
+  "Convert normalized KEY-SERIES to a sequence of internal Emacs keys.
+For an approximate inverse of this, see `key-description'."
+  (kbd-key:parse key-series))
+
+;; Based on 'edmacro-parse-keys' from Emacs "edmacro.el" but does not
+;; try to parse <event> strings nor does it have optional second
+;; parameter, need-vector.
+(defun kbd-key:parse (string)
+  (let ((case-fold-search nil)
+       (len (length string)) ; We won't alter string in the loop below.
+       (pos 0)
+       (res []))
+    (while (and (< pos len)
+               (string-match "[^ \t\n\f]+" string pos))
+      (let* ((word-beg (match-beginning 0))
+            (word-end (match-end 0))
+            (word (substring string word-beg len))
+            (times 1)
+            key)
+       (setq word (substring string word-beg word-end)
+             pos word-end)
+       (when (string-match "\\([0-9]+\\)\\*." word)
+         (setq times (string-to-number (substring word 0 (match-end 1))))
+         (setq word (substring word (1+ (match-end 1)))))
+       (cond ((string-match "^<<.+>>$" word)
+              (setq key (vconcat (if (eq (key-binding [?\M-x])
+                                         'execute-extended-command)
+                                     [?\M-x]
+                                   (or (car (where-is-internal
+                                             'execute-extended-command))
+                                       [?\M-x]))
+                                 (substring word 2 -2) "\r")))
+             ((and (string-match "^\\(\\([ACHMsS]-\\)*\\)<\\(.+\\)>$" word)
+                   (progn
+                     (setq word (concat (substring word (match-beginning 1)
+                                                   (match-end 1))
+                                        (substring word (match-beginning 3)
+                                                   (match-end 3))))
+                     (not (string-match
+                           "\\<\\(NUL\\|RET\\|LFD\\|ESC\\|SPC\\|DEL\\)$"
+                           word))))
+              (setq key (list (intern word))))
+             ((or (equal word "REM") (string-match "^;;" word))
+              (setq pos (string-match "$" string pos)))
+             (t
+              (let ((orig-word word) (prefix 0) (bits 0))
+                (while (string-match "^[ACHMsS]-." word)
+                  (cl-incf bits (cdr (assq (aref word 0)
+                                        '((?A . ?\A-\^@) (?C . ?\C-\^@)
+                                          (?H . ?\H-\^@) (?M . ?\M-\^@)
+                                          (?s . ?\s-\^@) (?S . ?\S-\^@)))))
+                  (cl-incf prefix 2)
+                  (cl-callf substring word 2))
+                (when (string-match "^\\^.$" word)
+                  (cl-incf bits ?\C-\^@)
+                  (cl-incf prefix)
+                  (cl-callf substring word 1))
+                (let ((found (assoc word '(("NUL" . "\0") ("RET" . "\r")
+                                           ("LFD" . "\n") ("TAB" . "\t")
+                                           ("ESC" . "\e") ("SPC" . " ")
+                                           ("DEL" . "\177")))))
+                  (when found (setq word (cdr found))))
+                (when (string-match "^\\\\[0-7]+$" word)
+                  (cl-loop for ch across word
+                            for n = 0 then (+ (* n 8) ch -48)
+                            finally do (setq word (vector n))))
+                (cond ((= bits 0)
+                       (setq key word))
+                      ((and (= bits ?\M-\^@) (stringp word)
+                            (string-match "^-?[0-9]+$" word))
+                       (setq key (cl-loop for x across word
+                                           collect (+ x bits))))
+                      ((/= (length word) 1)
+                       (error "%s must prefix a single character, not %s"
+                              (substring orig-word 0 prefix) word))
+                      ((and (/= (logand bits ?\C-\^@) 0) (stringp word)
+                            ;; We used to accept . and ? here,
+                            ;; but . is simply wrong,
+                            ;; and C-? is not used (we use DEL instead).
+                            (string-match "[@-_a-z]" word))
+                       (setq key (list (+ bits (- ?\C-\^@)
+                                          (logand (aref word 0) 31)))))
+                      (t
+                       (setq key (list (+ bits (aref word 0)))))))))
+       (when key
+         (cl-loop repeat times do (cl-callf vconcat res key)))))
+    (when (and (>= (length res) 4)
+              (eq (aref res 0) ?\C-x)
+              (eq (aref res 1) ?\()
+              (eq (aref res (- (length res) 2)) ?\C-x)
+              (eq (aref res (- (length res) 1)) ?\)))
+      (setq res (cl-subseq res 2 -2)))
+    (if (cl-loop for ch across res
+                 always (and (characterp ch)
+                             (let ((ch2 (logand ch (lognot ?\M-\^@))))
+                               (and (>= ch2 0) (<= ch2 127)))))
+       (concat (cl-loop for ch across res
+                         collect (if (= (logand ch ?\M-\^@) 0)
+                                     ch (+ ch 128))))
+      res)))
+
 (defun kbd-key:extended-command-p (key-series)
   "Return non-nil if the string KEY-SERIES is a normalized extended command 
invocation, i.e. M-x command."
   (when (stringp key-series)
@@ -243,7 +352,7 @@ Allows for multiple key sequences strung together."
        (or hycontrol-windows-mode hycontrol-frames-mode)
        ;; If wanted to limit to single key bindings and provide tighter 
checking:
        ;;   (string-match "[-.0-9]*\\(.*\\)" key-series)
-       ;;   (key-binding (kbd (match-string 1 key-series)))
+       ;;   (kbd-key:binding (match-string 1 key-series))
        t))
 
 (defun kbd-key:hyperbole-mini-menu-key-p (key-series)
@@ -257,7 +366,7 @@ Also, initialize `kbd-key:mini-menu-key' to the key 
sequence that invokes the Hy
 
 (defun kbd-key:key-and-arguments (key-series)
   "Return t if normalized KEY-SERIES appears to be a bound key sequence 
possibly with following interactive arguments, else nil."
-  (let ((prefix-binding (and (stringp key-series) (key-binding (kbd (substring 
key-series 0 (seq-position key-series ?\ )))))))
+  (let ((prefix-binding (and (stringp key-series) (kbd-key:binding (substring 
key-series 0 (seq-position key-series ?\ ))))))
     ;; Just ensure that 1st character is bound to something that is
     ;; not a self-insert-command or a number.
     (and prefix-binding
diff --git a/hibtypes.el b/hibtypes.el
index 4da3418..a0158e0 100644
--- a/hibtypes.el
+++ b/hibtypes.el
@@ -1217,7 +1217,8 @@ There may not be any <> characters within the expression. 
 The
 first identifier in the expression must be an Elisp variable,
 action type or a function symbol to call, i.e. '<'actype-or-elisp-symbol
 arg1 ... argN '>'.  For example, <mail nil \"user@somewhere.org\">."
-  (let* ((label-key-start-end (ibut:label-p nil action:start action:end t t))
+  (let* ((hbut:max-len 0)
+                (label-key-start-end (ibut:label-p nil action:start action:end 
t))
             (ibut-key (nth 0 label-key-start-end))
             (start-pos (nth 1 label-key-start-end))
             (end-pos (nth 2 label-key-start-end))
@@ -1248,7 +1249,7 @@ arg1 ... argN '>'.  For example, <mail nil 
\"user@somewhere.org\">."
                actype (or (intern-soft (concat "actypes::" actype))
                               (intern-soft actype)))
       ;; Ignore unbound symbols
-      (unless (and actype (or (fboundp actype) (boundp actype)))
+      (unless (and actype (or (fboundp actype) (boundp actype) (special-form-p 
actype)))
         (setq actype nil))
       (when actype
            (ibut:label-set lbl start-pos end-pos)
diff --git a/hpath.el b/hpath.el
index 1f63811..46ae8a6 100644
--- a/hpath.el
+++ b/hpath.el
@@ -1304,10 +1304,10 @@ in-buffer path will not match."
   "Substitute matching value for Emacs Lisp variables and environment 
variables in PATH and return PATH."
   ;; Uses free variables `match' and `start' from `hypb:replace-match-string'.
   (substitute-in-file-name
-    (hypb:replace-match-string
+    (hpath:substitute-match-value
       "\\$@?\{\\([^\}]+\\)@?\}"
       path
-      (lambda (str)
+      (lambda (matched-str)
        (let* ((var-group (substring path match start))
               (rest-of-path (substring path start))
               (var-ext (substring path (match-beginning 1) (match-end 1)))
@@ -1776,6 +1776,58 @@ local pathname."
                      (concat "$\{" var-name "\}/" rest-of-path)))))
          (t (error "(hpath:substitute-dir): Value of VAR-NAME, \"%s\", must be 
a string or list" var-name)))))
 
+(defun hpath:substitute-match-value (regexp str newtext &optional literal)
+  "Replace all matches for REGEXP in STR with NEWTEXT string and return the 
result.
+Optional LITERAL non-nil means do a literal replacement.
+Otherwise treat \\ in NEWTEXT string as special:
+  \\& means substitute original matched text,
+  \\N means substitute match for \(...\) number N,
+  \\\\ means insert one \\.
+NEWTEXT may instead be a function of one argument (the string to replace in)
+that returns a replacement string."
+  (unless (stringp str)
+    (error "(hypb:replace-match-string): 2nd arg must be a string: %s" str))
+  (unless (or (stringp newtext) (functionp newtext))
+    (error "(hypb:replace-match-string): 3rd arg must be a string or function: 
%s"
+          newtext))
+  (let ((rtn-str "")
+       (start 0)
+       (special)
+       match prev-start)
+    (while (setq match (string-match regexp str start))
+      (setq prev-start start
+           start (match-end 0)
+           rtn-str
+           (concat
+             rtn-str
+             (substring str prev-start match)
+             (cond ((functionp newtext)
+                    (hypb:replace-match-string
+                     regexp (substring str match start)
+                     (funcall newtext str) literal))
+                   (literal newtext)
+                   (t (mapconcat
+                        (lambda (c)
+                          (cond (special
+                                 (setq special nil)
+                                 (cond ((eq c ?\\) "\\")
+                                       ((eq c ?&)
+                                        (match-string 0 str))
+                                       ((and (>= c ?0) (<= c ?9))
+                                        (if (> c (+ ?0 (length
+                                                        (match-data))))
+                                            ;; Invalid match num
+                                            (error 
"(hypb:replace-match-string) Invalid match num: %c" c)
+                                          (setq c (- c ?0))
+                                          (match-string c str)))
+                                       (t (char-to-string c))))
+                            ((eq c ?\\)
+                             (setq special t)
+                             nil)
+                            (t (char-to-string c))))
+                        newtext ""))))))
+    (concat rtn-str (substring str start))))
+
 (defun hpath:substitute-var-name (var-symbol var-dir-val path)
   "Replace with VAR-SYMBOL any occurrences of VAR-DIR-VAL in PATH.
 Replacement is done iff VAR-DIR-VAL is an absolute path.
diff --git a/hsettings.el b/hsettings.el
index 8ffaa7b..7a3e0eb 100644
--- a/hsettings.el
+++ b/hsettings.el
@@ -159,8 +159,10 @@ package to display search results."
     (if (assoc service-name hyperbole-web-search-alist)
        (let ((browse-url-browser-function
               hyperbole-web-search-browser-function))
-         (browse-url (format (cdr (assoc service-name 
hyperbole-web-search-alist))
-                             search-term)))
+         (browse-url (browse-url-url-encode-chars
+                      (format (cdr (assoc service-name 
hyperbole-web-search-alist))
+                              search-term)
+                      "[*\"()',=;?% ]")))
       (user-error "(Hyperbole): Invalid web search service `%s'" 
service-name))))
 
 (defcustom inhibit-hyperbole-messaging t
diff --git a/hui.el b/hui.el
index e199f1d..516eaad 100644
--- a/hui.el
+++ b/hui.el
@@ -138,15 +138,15 @@ Signal an error if point is not within a button."
   "Create or modifies an explicit Hyperbole button when conditions are met.
 A region must have been delimited with the action-key and point must now be
 within it before this function is called or it will do nothing.  The region
-must be no larger than the size given by 'ebut:max-len'.  It must be entirely
-within or entirely outside of an existing explicit button.  When region is
-within the button, the button is interactively modified.  Otherwise, a new
-button is created interactively with the region as the default label."
+must be no larger than the size given by a call to (hbut:max-len).  It must
+be entirely within or entirely outside of an existing explicit button.  When
+region is within the button, the button is interactively modified.  Otherwise,
+a new button is created interactively with the region as the default label."
   (interactive)
   (let ((m (marker-position (hypb:mark-marker t)))
        (op action-key-depress-prev-point) (p (point)) (lbl-key))
     (if (and m (eq (marker-buffer m) (marker-buffer op))
-            (< op m) (<= (- m op) ebut:max-len)
+            (< op m) (<= (- m op) (hbut:max-len))
             (<= p m) (<= op p))
        (progn
          (if (setq lbl-key (ebut:label-p))
@@ -179,10 +179,10 @@ Signal an error when no such button is found in the 
current buffer."
            (hargs:read
             "Change button label to: "
             (lambda (lbl)
-              (and (not (string= lbl "")) (<= (length lbl) ebut:max-len)))
+              (and (not (string= lbl "")) (<= (length lbl) (hbut:max-len))))
             lbl
             (format "(ebut-modify): Enter a string of at most %s chars."
-                    ebut:max-len)
+                    (hbut:max-len))
             'string))
 
       (hattr:set 'hbut:current 'loc (hui:key-src but-buf))
@@ -226,11 +226,11 @@ Signal an error if any problem occurs."
                                "Rename button label to: "
                                (lambda (lbl)
                                  (and (not (string= lbl ""))
-                                      (<= (length lbl) ebut:max-len)))
+                                      (<= (length lbl) (hbut:max-len))))
                                curr-label
                                (format
                                 "(ebut-rename): Use a quoted string of at most 
%s chars."
-                                ebut:max-len)
+                                (hbut:max-len))
                                'string))))))))
        (list curr-label new-label))))
 
@@ -349,10 +349,10 @@ Signal an error when no such button is found."
            (hargs:read
             "Change global button label to: "
             (lambda (lbl)
-              (and (not (string= lbl "")) (<= (length lbl) ebut:max-len)))
+              (and (not (string= lbl "")) (<= (length lbl) (hbut:max-len))))
             lbl
             (format "(gbut-modify): Enter a string of at most %s chars."
-                    ebut:max-len)
+                    (hbut:max-len))
             'string))
 
       (if (eq (hattr:get but 'categ) 'explicit)
@@ -450,15 +450,15 @@ BUT defaults to the button whose label point is within."
   "Read button label from user using DEFAULT-LABEL and caller's FUNC-NAME."
   (hargs:read "Button label: "
              (lambda (lbl)
-               (and (not (string= lbl "")) (<= (length lbl) ebut:max-len)))
+               (and (not (string= lbl "")) (<= (length lbl) (hbut:max-len))))
              default-label
              (format "(%s): Enter a string of at most %s chars."
-                     func-name ebut:max-len)
+                     func-name (hbut:max-len))
              'string))
 
 (defun hui:hbut-label-default (start end &optional skip-len-test)
   "Return default label based on START and END region markers or points.
-Optional SKIP-LEN-TEST means don't limit label to `ebut:max-len' length.
+Optional SKIP-LEN-TEST means don't limit label to (hbut:max-len) length.
 Return nil if START or END are invalid or if region fails length test.
 
 Also has side effect of moving point to start of default label, if any."
@@ -467,7 +467,7 @@ Also has side effect of moving point to start of default 
label, if any."
   ;; Test whether to use region as default button label.
   (when (and (integerp start) (integerp end)
           (or skip-len-test
-              (<= (max (- end start) (- start end)) ebut:max-len)))
+              (<= (max (- end start) (- start end)) (hbut:max-len))))
     (goto-char start)
     (buffer-substring-no-properties start end)))
 
@@ -564,10 +564,10 @@ Signal an error when no such button is found in the 
current buffer."
          (hargs:read
           "Change implicit button label to: "
           (lambda (lbl)
-            (and (not (string= lbl "")) (<= (length lbl) ebut:max-len)))
+            (and (not (string= lbl "")) (<= (length lbl) (hbut:max-len))))
           lbl
           (format "(ibut-rename): Enter a string of at most %s chars."
-                  ebut:max-len)
+                  (hbut:max-len))
           'string))
 
     (save-excursion
@@ -809,7 +809,7 @@ All args are optional, the current button and buffer file 
are the defaults."
                  (skip-chars-backward "0-9")
                  (if (eq (preceding-char) (string-to-char ebut:instance-sep))
                      (setq start (1- (point))))
-                 (if (search-backward ebut:start (- (point) ebut:max-len) t)
+                 (if (search-backward ebut:start (- (point) (hbut:max-len)) t)
                      (if current-prefix-arg
                          ;; Remove button label, delimiters and preceding
                          ;; space, if any.
diff --git a/hypb.el b/hypb.el
index 26a1893..a79cc75 100644
--- a/hypb.el
+++ b/hypb.el
@@ -674,18 +674,18 @@ nor nil it means to not count the minibuffer window even 
if it is active."
   "Keymap used when on the Hyperbole banner glyph.")
 
 ;;;###autoload
-(defun hypb:display-file-with-logo (&optional file)
-  "Display an optional text FILE in help mode with the Hyperbole banner 
prepended.
-Without file, the banner is prepended to the current buffer."
-  (if file
-      ;; A stub for this function is defined in hversion.el when not running 
in InfoDock.
-      (id-browse-file file))
-  (hypb:display-file-with-logo-emacs file)
-  (goto-char (point-min))
-  (skip-syntax-forward "-")
-  (set-window-start (selected-window) 1)
-  (set-buffer-modified-p nil)
-  (help-mode))
+(defun hypb:display-file-with-logo (file)
+  "Display a text FILE in help mode with the Hyperbole banner prepended."
+  (let ((existing-buf (when (stringp file) (get-file-buffer file))))
+    ;; A stub for this function is defined in hversion.el when not running in 
InfoDock.
+    (id-browse-file file)
+    (unless existing-buf
+      (hypb:display-file-with-logo-emacs file)
+      (goto-char (point-min))
+      (skip-syntax-forward "-")
+      (set-window-start (selected-window) 1)
+      (set-buffer-modified-p nil)
+      (help-mode))))
 
 (defun hypb:browse-home-page ()
   "Visit the web home page for Hyperbole."
diff --git a/hyperbole.el b/hyperbole.el
index 83345b7..fe6a423 100644
--- a/hyperbole.el
+++ b/hyperbole.el
@@ -657,6 +657,7 @@ If FLAG is nil then text is shown, while if FLAG is t the 
text is hidden."
   "Standard configuration routine for Hyperbole."
   (interactive)
   (message "Initializing Hyperbole...")
+  ;;
   (run-hooks 'hyperbole-init-hook)
   (hyperb:check-dir-user)
   (or (stringp hyperb:user-email)
@@ -672,7 +673,10 @@ If FLAG is nil then text is shown, while if FLAG is t the 
text is hidden."
   (unless noninteractive
     (hyperb:maybe-generate-autoloads))
   ;;
-  ;; Conditionally initialize Hyperbole key bindings (when hkey-init is t)
+  ;; Modify syntactic character pairs for use with implicit button activations.
+  (hbut:modify-syntax)
+  ;;
+  ;; Conditionally initialize Hyperbole key bindings (when hkey-init is t).
   (hkey-initialize)
   ;;
   ;; Abbreviate MSWindows mount point paths.
diff --git a/man/hyperbole.html b/man/hyperbole.html
index c01bc60..f6f0af0 100644
--- a/man/hyperbole.html
+++ b/man/hyperbole.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
 <html>
 <!-- This manual is for GNU Hyperbole
-(Edition 7.1.0, Published February 23, 2020).
+(Edition 7.1.1, Published March 1, 2020).
 
 Copyright (C) 1989-2019  Free Software Foundation, Inc.
 
@@ -339,8 +339,8 @@ WITHOUT ANY WARRANTY, without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</P>
 
 <PRE>
-Edition 7.1.0
-Printed February 23, 2020.
+Edition 7.1.1
+Printed March 1, 2020.
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -799,7 +799,7 @@ Next: <a href="#Smart-Keys" accesskey="n" rel="next">Smart 
Keys</a>, Previous: <
 <span id="Introduction-1"></span><h2 class="chapter">1 Introduction</h2>
 
 <p>This edition of the GNU Hyperbole Manual is for use with any version
-7.1.0 or greater of GNU Hyperbole.  Hyperbole runs atop GNU Emacs 24.3
+7.1.1 or greater of GNU Hyperbole.  Hyperbole runs atop GNU Emacs 24.3
 or higher.  It will trigger an error if your Emacs is older.
 </p>
 <p>This chapter summarizes the structure of the rest of the manual,
@@ -7367,10 +7367,6 @@ so behave exactly alike.  Since button labels are simply 
text strings,
 they may be embedded within any text to provide non-linear information
 or operational access points.
 </p>
-<span id="index-ebut_003amax_002dlen"></span>
-<p>The maximum length of a button label is limited by the variable
-<code>ebut:max-len</code>.
-</p>
 </dd>
 <dt><b>Button Selection</b></dt>
 <dd><p>The act of designating a Hyperbole button upon which to operate.
@@ -7470,6 +7466,13 @@ followed by a global button label and then a closing 
&gt;.
 <dt><b>Grid</b></dt>
 <dd><p>See <b>Windows Grid</b>.
 </p>
+<span id="index-hbut_003amax_002dlen-1"></span>
+<span id="index-hbut_003amax_002dlen"></span>
+<p>The maximum length of a button label is limited by the variable
+<code>hbut:max-len</code>.  If 0, there is no limit and searches for button
+end delimiters can go as far as the end of the buffer.  Use the
+function, <code>(hbut:max-len)</code>, to read the proper value.
+</p>
 <span id="index-run_002dhooks"></span>
 </dd>
 <dt><b>Hook Variable</b></dt>
@@ -12007,7 +12010,6 @@ Next: <a href="#Concept-Index" accesskey="n" 
rel="next">Concept Index</a>, Previ
 <tr><td></td><td valign="top"><a 
href="#index-ebut_002dmodify_002dhook">ebut-modify-hook</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-ebut_003acreate"><code>ebut:create</code></a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Programmatic-Button-Creation">Programmatic Button 
Creation</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-ebut_003amap"><code>ebut:map</code></a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#Programmatic-Button-Creation">Programmatic Button 
Creation</a></td></tr>
-<tr><td></td><td valign="top"><a 
href="#index-ebut_003amax_002dlen">ebut:max-len</a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#Glossary">Glossary</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-emacs_002dversion">emacs-version</a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#Suggestion-or-Bug-Reporting">Suggestion or Bug 
Reporting</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-eval_002ddefun"><code>eval-defun</code></a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Creating-Types">Creating Types</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-eval_002dlast_002dsexp"><code>eval-last-sexp</code></a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Creating-Types">Creating Types</a></td></tr>
@@ -12065,6 +12067,8 @@ Next: <a href="#Concept-Index" accesskey="n" 
rel="next">Concept Index</a>, Previ
 <tr><td></td><td valign="top"><a 
href="#index-hbut_003acurrent-1">hbut:current</a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#Operational-and-Storage-Formats">Operational and Storage 
Formats</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hbut_003afill_002dprefix_002dregexps">hbut:fill-prefix-regexps</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Button-Label-Normalization">Button Label 
Normalization</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hbut_003alabel_002dto_002dkey">hbut:label-to-key</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Button-Label-Normalization">Button Label 
Normalization</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-hbut_003amax_002dlen-1">hbut:max-len</a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#Glossary">Glossary</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-hbut_003amax_002dlen"><code>hbut:max-len</code></a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Glossary">Glossary</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hibtypes_002dbegin_002dload_002dhook">hibtypes-begin-load-hook</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hibtypes_002dend_002dload_002dhook">hibtypes-end-load-hook</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-hibtypes_002dgit_002ddefault_002dproject">hibtypes-git-default-project</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Implicit-Button-Types">Implicit Button 
Types</a></td></tr>
diff --git a/man/hyperbole.info b/man/hyperbole.info
index 68ba615..cfad424 100644
Binary files a/man/hyperbole.info and b/man/hyperbole.info differ
diff --git a/man/hyperbole.pdf b/man/hyperbole.pdf
index 0444f49..c6fff70 100644
Binary files a/man/hyperbole.pdf and b/man/hyperbole.pdf differ
diff --git a/man/hyperbole.texi b/man/hyperbole.texi
index ddecca0..7b4e57d 100644
--- a/man/hyperbole.texi
+++ b/man/hyperbole.texi
@@ -154,8 +154,8 @@ WITHOUT ANY WARRANTY, without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</P>
 
 <PRE>
-Edition 7.1.0
-Printed February 23, 2020.
+Edition 7.1.1
+Printed March 1, 2020.
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -196,8 +196,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 @sp 2
 
 @example
-Edition 7.1.0
-February 23, 2020
+Edition 7.1.1
+March 1, 2020
 
   Published by the Free Software Foundation, Inc.
   Author:    Bob Weiner
@@ -476,7 +476,7 @@ Smart Keyboard Keys
 @chapter Introduction
 
 This edition of the GNU Hyperbole Manual is for use with any version
-7.1.0 or greater of GNU Hyperbole.  Hyperbole runs atop GNU Emacs 24.3
+7.1.1 or greater of GNU Hyperbole.  Hyperbole runs atop GNU Emacs 24.3
 or higher.  It will trigger an error if your Emacs is older.
 
 This chapter summarizes the structure of the rest of the manual,
@@ -6250,10 +6250,6 @@ so behave exactly alike.  Since button labels are simply 
text strings,
 they may be embedded within any text to provide non-linear information
 or operational access points.
 
-@vindex ebut:max-len
-The maximum length of a button label is limited by the variable
-@code{ebut:max-len}.
-
 @item Button Selection
 The act of designating a Hyperbole button upon which to operate.
 Use the Action Key to select a button.
@@ -6343,6 +6339,13 @@ See @b{Button File, personal} and @b{Global Button}.
 @item Grid
 See @b{Windows Grid}.
 
+@vindex hbut:max-len
+@findex hbut:max-len
+The maximum length of a button label is limited by the variable
+@code{hbut:max-len}.  If 0, there is no limit and searches for button
+end delimiters can go as far as the end of the buffer.  Use the
+function, @code{(hbut:max-len)}, to read the proper value.
+
 @findex run-hooks
 @item Hook Variable
 A variable that permits customization of an existing function's
diff --git a/man/version.texi b/man/version.texi
index 0a18c07..9f77f68 100644
--- a/man/version.texi
+++ b/man/version.texi
@@ -1,4 +1,4 @@
-@set UPDATED February 23, 2020
-@set UPDATED-MONTH February 2020
-@set EDITION 7.1.0
-@set VERSION 7.1.0
+@set UPDATED March 1, 2020
+@set UPDATED-MONTH March 2020
+@set EDITION 7.1.1
+@set VERSION 7.1.1



reply via email to

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