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

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

[elpa] externals/hyperbole 22439e6 20/50: Add klink ref cmds, ebut:progr


From: Stefan Monnier
Subject: [elpa] externals/hyperbole 22439e6 20/50: Add klink ref cmds, ebut:program and defiblink for programmatic creation
Date: Wed, 17 Mar 2021 18:44:16 -0400 (EDT)

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

    Add klink ref cmds, ebut:program and defiblink for programmatic creation
---
 Changes           |   37 +-
 HY-NEWS           |   25 ++
 hbdata.el         |   12 +-
 hbut.el           |   71 ++-
 hib-kbd.el        |   41 ++
 hibtypes.el       | 1262 +++++++++++++++++++++++++++--------------------------
 hui.el            |    7 +-
 kotl/kotl-mode.el |   20 +
 kotl/kview.el     |   17 +-
 9 files changed, 848 insertions(+), 644 deletions(-)

diff --git a/Changes b/Changes
index 1ce1c12..6e0da32 100644
--- a/Changes
+++ b/Changes
@@ -1,9 +1,42 @@
+<<<<<<< Updated upstream
 2020-11-02  Mats Lidell  <matsl@gnu.org>
 
 * hpath.el (hpath:external-display-alist-mswindows):
            (hpath:internal-display-alist): Add customization.
            (hpath:external-display-alist-x): Add customization. Use
     xdg-open to use users preferred app in window system.
+=======
+2020-11-07  Bob Weiner  <rsw@gnu.org>
+
+* kotl/kotl-mode.el (kotl-mode:copy-absolute-klink-to-kill-ring):
+                    (kotl-mode:copy-relative-klink-to-kill-ring): Added new
+   commands to copy kcell refs to the kill ring.
+                    (kotl-mode:copy-absolute-klink-to-register):
+                    (kotl-mode:copy-relative-klink-to-register): Added new
+   commands to copy kcell refs to registers.
+
+* kotl/kview.el (kcell-view:reference): Updated doc to explain handling of
+    relative-dir = nil.
+    (kcell-view:absolute-reference): Added for kcell references with
+absolute paths.
+
+2020-11-01  Bob Weiner  <rsw@gnu.org>
+
+* hbut.el (ebut:program): Added a programmatic way to create explicit buttons.
+  hui.el (hui:ebut-create): Updated doc to highlight that this is for 
interactive use.
+  hbdata.el (hbdata:actype): Updated to handle programmatically created
+    explicit buttions whose action types may be regular Elisp functions.
+
+2020-10-27  Bob Weiner  <rsw@gnu.org>
+
+* hbut.el (ibtype:create-link-type, ibtype:create-from-regexp): Added to allow
+    non-programmers who understand regular expressions to creation their own
+    implicit button types.  deflink is an alias for ibtype:create-link-type
+    which creates new link types with just the name for the type and a regular
+    expression that resolves into a key series, URL or path to display.
+
+* hib-kbd.el (kbd-key:is-p): Added to test if a string is a delimited key 
series.
+>>>>>>> Stashed changes
 
 2020-10-25  Bob Weiner  <rsw@gnu.org>
 
@@ -31,7 +64,7 @@
     hypb:replace-match-string calls.
            (hpath:substitute-value): Used fixedcase arg in
     hpath:substitute-match-value call.
-           (hpath:is-p): Handle empty string return value from
+           (hpath:is-p): Handled empty string return value from
     hpath:substitute-value call.
     These changes fixed improper path variable subst where the path
     contains mixed case characters.
@@ -545,7 +578,7 @@ V7.1.0 test release changes ^^^^:
     previously been done for actypes.
 
 * hpath.el (hpath:posix-to-mswindows-separators):
-           (hpath:mswindows-to-posix-separators)
+           (hpath:mswindows-to-posix-separators):
           (hpath:abbreviate-file-name): Added and called from the above 
functions.  Same as
     `abbreviate-file-name' but disables tramp-mode.  This prevents improper 
processing of hargs
      with colons in them, e.g. `actypes::link-to-file'."
diff --git a/HY-NEWS b/HY-NEWS
index 9eaa6c6..1f75306 100644
--- a/HY-NEWS
+++ b/HY-NEWS
@@ -28,6 +28,14 @@
      | C-c C-,                    | C-c C-.                     |
      | C-c C-<                    | C-c C->                     |
 
+   - Klink Copy: New commands that copy a relative or absolute reference
+     to a kcell (a klink) to the kill ring or to an Emacs singe-letter
+     named register:
+       kotl-mode:copy-absolute-klink-to-kill-ring
+       kotl-mode:copy-relative-klink-to-kill-ring
+       kotl-mode:copy-absolute-klink-to-register
+       kotl-mode:copy-relative-klink-to-register
+
   SMART (ACTION AND ASSIST) KEYS
 
     - Implicit Button Types Reprioritization: Modified hibtypes.el so if
@@ -41,6 +49,23 @@
       fixed case, so that the case of a value with both upper and lower
       case characters is never changed, for example a value of ${HOME}.
 
+  PROGRAMMING
+
+   - kbd-key:is-p: Added this new predicate to test whether point is within
+     a brace-delimited key series.
+
+
+  - ebut:programm, defiblink, ibtype:create-link-type,
+    ibtype:create-from-regexp: Added to allow non-programmers who
+    understand regular expressions to creation their own implicit
+    button types.
+
+      ebut:program - Programmatically create an explicit Hyperbole button at
+        point from LABEL, ACTYPE (action type), and optional actype ARGS.
+      defiblink is an alias for ibtype:create-link-type - Create new link
+        types with just the name for the type and a regular expression that
+        resolves into a key series, URL or path to display.
+
 ===========================================================================
 *                                   V7.1.3
 ===========================================================================
diff --git a/hbdata.el b/hbdata.el
index 511c1b1..33d542f 100644
--- a/hbdata.el
+++ b/hbdata.el
@@ -64,9 +64,17 @@
 
 (defun hbdata:actype (hbdata)
   "Return the action type in HBDATA as a string."
-  (let ((nm (symbol-name (nth 3 hbdata))))
+  (let ((nm (symbol-name (nth 3 hbdata)))
+       actype-sym)
     (and nm (if (or (= (length nm) 2) (string-match "::" nm))
-               nm (concat "actypes::" nm)))))
+               nm
+             ;; RSW 2020-11-01 - Updated to handle programmatically created
+             ;; explicit buttions whose action types may be non-actypes,
+             ;; regular Elisp functions.
+             (setq actype-sym (intern-soft (concat "actypes::" nm)))
+              (if (and actype-sym (fboundp actype-sym))
+                 (symbol-name actype-sym)
+               nm)))))
 
 (defun hbdata:args (hbdata)
   "Return the list of any arguments given in HBDATA."
diff --git a/hbut.el b/hbut.el
index 97bc229..85bef7a 100644
--- a/hbut.el
+++ b/hbut.el
@@ -69,11 +69,12 @@ Button should hold the following attributes (see 
`hattr:set'):
    args    (list of arguments for action, if action takes a single
             argument of the button lbl-key, args may be nil).
 
-If successful returns any instance number to append to button label
-except when instance number would be 1, then returns t.  On failure,
-returns nil.
 
-If successful, leaves point in button data buffer, so caller should use
+If successful, return any instance number to append to button label
+except when instance number would be 1, then return t.  On failure,
+return nil.
+
+If successful, leave point in button data buffer, so caller should use
 `save-excursion'.  Does not save button data buffer."
   (let ((lbl-instance (hbdata:write nil but-sym)))
     (run-hooks 'ebut-create-hook)
@@ -390,6 +391,35 @@ button is found in the current buffer."
        "(ebut:operate): Operation failed.  Check button attribute permissions: 
%s"
        hattr:filename))))
 
+(defmacro ebut:program (label actype &rest args)
+  "Programmatically create an explicit Hyperbole button at point from LABEL, 
ACTYPE (action type), and optional actype ARGS.
+Insert LABEL text at point surrounded by <( )> delimiters, adding any
+necessary instance number of the button after the LABEL.  ACTYPE may
+be a Hyperbole action type name (from defact) or an Emacs Lisp
+function, followed by a list of arguments for the actype, aside from
+the button LABEL which is automatically provided as the first argument.
+
+For interactive creation, use `hui:ebut-create' instead."
+  `(save-excursion
+     (let ((but-buf (current-buffer))
+          (actype-sym (intern-soft (concat "actypes::" (symbol-name 
,actype)))))
+      (hui:buf-writable-err but-buf "ebut-create")
+      (condition-case err
+         (progn
+           (hattr:clear 'hbut:current)
+           (hattr:set 'hbut:current 'loc (hui:key-src but-buf))
+           (hattr:set 'hbut:current 'dir (hui:key-dir but-buf))
+            (if (or (and actype-sym (fboundp actype-sym))
+                   (fboundp ,actype))
+               (hattr:set 'hbut:current 'actype ,actype)
+             (error "(,actype)"))
+           (hattr:set 'hbut:current 'args ',args)
+           (ebut:operate ,label nil))
+       (error (hattr:clear 'hbut:current)
+              (if (and (listp (cdr err)) (= (length (cdr err)) 1))
+                  (error (format "(ebut:program): actype arg must be a bound 
symbol (not a string): %s" ,actype))
+                (error "(ebut:program): %s" err)))))))
+
 (defun    ebut:search (string out-buf &optional match-part)
   "Write explicit button lines matching STRING to OUT-BUF.
 Search across all files into which the user has previously saved explicit 
buttons.
@@ -1693,6 +1723,39 @@ type for ibtype is presently undefined."
              (htype:create ,type ibtypes ,doc nil ,at-func
                            '(to-p ,to-func style ,style))))))
 
+(defalias 'defiblink 'ibtype:create-link-type)
+
+(defmacro ibtype:create-link-type (link-type-symbol link-regexp)
+  "Create a new Hyperbole link type whose buttons look like:  
<LINK-TYPE-SYMBOL text>
+where text is regexp grouping 1 (\\1) that may be substituted into
+LINK-REGEXP.  Activation of such buttons either executes a
+  brace-delimited key series, displays a URL or displays a path."
+  `(ibtype:create-from-regexp ,link-type-symbol "<" ">" (format "%s 
\"?\\([^\t\n\r\f'`\"]+\\)\"?" ',link-type-symbol)
+                             ,link-regexp))
+
+(defmacro ibtype:create-from-regexp (ibtype-symbol start-delim end-delim 
text-regexp link-regexp &optional start-regexp-flag end-regexp-flag)
+  "Create a new Hyperbole implicit button type from: IBTYPE-SYMBOL, 
START-DELIM and END-DELIM (strings), TEXT-REGEXP and LINK-REGEXP.
+With optional START-REGEXP-FLAG non-nil, START-DELIM is treated as a
+regular expression.  END-REGEXP-FLAG is similar. "
+  `(prog1
+     (defib ,ibtype-symbol ()
+       (interactive)
+       (let* ((button-text (hargs:delimited ,start-delim ,end-delim 
,start-regexp-flag ,end-regexp-flag))
+             (path-to-display (when (and button-text (string-match 
,text-regexp button-text))
+                                (replace-match ,link-regexp nil nil 
button-text)))
+             (encoded-path-to-display (url-encode-url path-to-display)))
+        (when path-to-display
+          (cond ((setq key-series (kbd-key:is-p path-to-display))
+                 (hact #'kbd-key:act key-series))
+                ((hpath:www-p encoded-path-to-display)
+                 (hact #'www-url encoded-path-to-display))
+                (t (hact #'hpath:find path-to-display))))))
+     (put (intern (format "ibtypes::%s" ',ibtype-symbol))
+         'function-documentation
+         (format "%s - %s\n\n%s %s%s%s\n%s %s" ',ibtype-symbol "Hyperbole 
implicit button type"
+                 "  Recognizes buttons of the form:\n    " ,start-delim 
,text-regexp ,end-delim
+                 "  which display links of the form:\n    " ,link-regexp))))
+
 (defun    ibtype:def-symbol (ibtype)
   "Return the abbreviated symbol for IBTYPE used in its `defib'.
 IBTYPE must be a symbol or string that begins with 'ibtype::' or nil
diff --git a/hib-kbd.el b/hib-kbd.el
index ee519ff..42eeda7 100644
--- a/hib-kbd.el
+++ b/hib-kbd.el
@@ -198,6 +198,41 @@ With optional prefix arg FULL, display full documentation 
for command."
     (when kbd-key
       (kbd-key:doc kbd-key t))))
 
+(defun kbd-key:is-p (str)
+  "If STR is a curly-brace {} delimited key series, return the non-delimited, 
normalized form, else nil.
+Key sequences should be in human readable form, e.g. {C-x C-b}, or what 
`key-description' returns.
+Forms such as {\C-b}, {\^b}, and {^M} will not be recognized.
+
+Any key sequence must be a string of one of the following:
+  a Hyperbole minibuffer menu item key sequence,
+  a HyControl key sequence,
+  a M-x extended command,
+  or a valid key sequence together with its interactive arguments."
+  ;; Temporarily make open and close braces have list syntax for
+  ;; matching purposes.
+  (let ((open-brace-syntax (hypb:get-raw-syntax-descriptor ?\{))
+       (close-brace-syntax (hypb:get-raw-syntax-descriptor ?\})))
+    ;; Handle long series, e.g. eval-elisp actions
+    (let* ((hbut:max-len (max 3000 (hbut:max-len)))
+          ;; STR must include delimiters but they are stripped from 
`key-series'.
+          (key-series (or (kbd-key:remove-delimiters str "{`" "'}")
+                          (kbd-key:remove-delimiters str "{" "}")
+                          ;; Regular dual single quotes (Texinfo smart quotes)
+                          (kbd-key:remove-delimiters str "``" "''")
+                          ;; Typical GNU manual key sequences; note
+                          ;; these are special quote marks, not the
+                          ;; standard ASCII characters.
+                          (kbd-key:remove-delimiters str "‘" "’")))
+          binding)
+      (when (and (stringp key-series)
+                (not (eq key-series "")))
+       (setq key-series (kbd-key:normalize key-series)
+             binding (kbd-key:binding key-series)))
+      (and (stringp key-series)
+          (or (and binding (not (integerp binding)))
+              (kbd-key:special-sequence-p key-series))
+          key-series))))
+
 (defun kbd-key:normalize (key-series)
   "Normalize a human-readable string of keyboard keys, KEY-SERIES (without any 
surrounding {}).
 Return the normalized but still human-readable format.
@@ -260,6 +295,12 @@ keyboad input queue, as if they had been typed by the 
user."
             norm-key-series)))
        (t (error "(kbd-key:normalize): requires a string argument, not `%s'" 
key-series))))
 
+(defun kbd-key:remove-delimiters (str start-delim end-delim)
+  "Return STR sans START-DELIM and END-DELIM (strings) iff it starts and ends 
with these delimiters."
+  (when (and (string-match (format "\\`%s" (regexp-quote start-delim)) str)
+            (string-match (format "%s\\'"  (regexp-quote end-delim)) str))
+    (string-trim str start-delim end-delim)))
+
 ;;; ************************************************************************
 ;;; Private functions
 ;;; ************************************************************************
diff --git a/hibtypes.el b/hibtypes.el
index 46bde4c..45db439 100644
--- a/hibtypes.el
+++ b/hibtypes.el
@@ -42,30 +42,30 @@
 
 (defconst mail-address-tld-regexp
   (format "\\.%s\\'"
-             (regexp-opt
-              '("aero" "arpa" "asia" "biz" "cat" "com" "coop" "edu" "gov" 
"info"
-                "int" "jobs" "mil" "mobi" "museum" "name" "net" "org" "pro" 
"tel"
-                "travel" "uucp"
-                "ac" "ad" "ae" "af" "ag" "ai" "al" "am" "an" "ao" "aq"
-                "ar" "as" "at" "au" "aw" "ax" "az" "ba" "bb" "bd" "be" "bf" 
"bg" "bh"
-                "bi" "bj" "bl" "bm" "bn" "bo" "br" "bs" "bt" "bv" "bw" "by" 
"bz" "ca"
-                "cc" "cd" "cf" "cg" "ch" "ci" "ck" "cl" "cm" "cn" "co" "cr" 
"cu" "cv"
-                "cx" "cy" "cz" "de" "dj" "dk" "dm" "do" "dz" "ec" "ee" "eg" 
"eh" "er"
-                "es" "et" "eu" "fi" "fj" "fk" "fm" "fo" "fr" "ga" "gb" "gd" 
"ge" "gf"
-                "gg" "gh" "gi" "gl" "gm" "gn" "gp" "gq" "gr" "gs" "gt" "gu" 
"gw" "gy"
-                "hk" "hm" "hn" "hr" "ht" "hu" "id" "ie" "il" "im" "in" "io" 
"iq" "ir"
-                "is" "it" "je" "jm" "jo" "jp" "ke" "kg" "kh" "ki" "km" "kn" 
"kp" "kr"
-                "kw" "ky" "kz" "la" "lb" "lc" "li" "lk" "lr" "ls" "lt" "lu" 
"lv" "ly"
-                "ma" "mc" "md" "me" "mf" "mg" "mh" "mk" "ml" "mm" "mn" "mo" 
"mp" "mq"
-                "mr" "ms" "mt" "mu" "mv" "mw" "mx" "my" "mz" "na" "nc" "ne" 
"nf" "ng"
-                "ni" "nl" "no" "np" "nr" "nu" "nz" "om" "pa" "pe" "pf" "pg" 
"ph" "pk"
-                "pl" "pm" "pn" "pr" "ps" "pt" "pw" "py" "qa" "re" "ro" "rs" 
"ru" "rw"
-                "sa" "sb" "sc" "sd" "se" "sg" "sh" "si" "sj" "sk" "sl" "sm" 
"sn" "so"
-                "sr" "st" "su" "sv" "sy" "sz" "tc" "td" "tf" "tg" "th" "tj" 
"tk" "tl"
-                "tm" "tn" "to" "tp" "tr" "tt" "tv" "tw" "tz" "ua" "ug" "uk" 
"um" "us"
-                "uy" "uz" "va" "vc" "ve" "vg" "vi" "vn" "vu" "wf" "ws" "ye" 
"yt" "yu"
-                "za" "zm" "zw")
-              t))
+          (regexp-opt
+           '("aero" "arpa" "asia" "biz" "cat" "com" "coop" "edu" "gov" "info"
+             "int" "jobs" "mil" "mobi" "museum" "name" "net" "org" "pro" "tel"
+             "travel" "uucp"
+             "ac" "ad" "ae" "af" "ag" "ai" "al" "am" "an" "ao" "aq"
+             "ar" "as" "at" "au" "aw" "ax" "az" "ba" "bb" "bd" "be" "bf" "bg" 
"bh"
+             "bi" "bj" "bl" "bm" "bn" "bo" "br" "bs" "bt" "bv" "bw" "by" "bz" 
"ca"
+             "cc" "cd" "cf" "cg" "ch" "ci" "ck" "cl" "cm" "cn" "co" "cr" "cu" 
"cv"
+             "cx" "cy" "cz" "de" "dj" "dk" "dm" "do" "dz" "ec" "ee" "eg" "eh" 
"er"
+             "es" "et" "eu" "fi" "fj" "fk" "fm" "fo" "fr" "ga" "gb" "gd" "ge" 
"gf"
+             "gg" "gh" "gi" "gl" "gm" "gn" "gp" "gq" "gr" "gs" "gt" "gu" "gw" 
"gy"
+             "hk" "hm" "hn" "hr" "ht" "hu" "id" "ie" "il" "im" "in" "io" "iq" 
"ir"
+             "is" "it" "je" "jm" "jo" "jp" "ke" "kg" "kh" "ki" "km" "kn" "kp" 
"kr"
+             "kw" "ky" "kz" "la" "lb" "lc" "li" "lk" "lr" "ls" "lt" "lu" "lv" 
"ly"
+             "ma" "mc" "md" "me" "mf" "mg" "mh" "mk" "ml" "mm" "mn" "mo" "mp" 
"mq"
+             "mr" "ms" "mt" "mu" "mv" "mw" "mx" "my" "mz" "na" "nc" "ne" "nf" 
"ng"
+             "ni" "nl" "no" "np" "nr" "nu" "nz" "om" "pa" "pe" "pf" "pg" "ph" 
"pk"
+             "pl" "pm" "pn" "pr" "ps" "pt" "pw" "py" "qa" "re" "ro" "rs" "ru" 
"rw"
+             "sa" "sb" "sc" "sd" "se" "sg" "sh" "si" "sj" "sk" "sl" "sm" "sn" 
"so"
+             "sr" "st" "su" "sv" "sy" "sz" "tc" "td" "tf" "tg" "th" "tj" "tk" 
"tl"
+             "tm" "tn" "to" "tp" "tr" "tt" "tv" "tw" "tz" "ua" "ug" "uk" "um" 
"us"
+             "uy" "uz" "va" "vc" "ve" "vg" "vi" "vn" "vu" "wf" "ws" "ye" "yt" 
"yu"
+             "za" "zm" "zw")
+           t))
   "Regular expression of most common Internet top level domain names.")
 
 (defconst mail-address-regexp
@@ -109,8 +109,8 @@ handle any links they recognize first."
     (require 'hsys-org)
     (let ((start-end (hsys-org-link-at-p)))
       (when start-end
-       (hsys-org-set-ibut-label start-end)
-       (hact 'org-open-at-point-global)))))
+        (hsys-org-set-ibut-label start-end)
+        (hact 'org-open-at-point-global)))))
 
 ;; Org links in Org mode are handled at a lower priority in "hib-org.el"
 
@@ -131,10 +131,10 @@ handle any links they recognize first."
     (save-excursion
       (skip-chars-backward "^ \t\n\r\f\"\'(){}[];:<>|")
       (and (or (looking-at mail-address-regexp)
-                  (looking-at (concat "mailto:"; mail-address-regexp)))
-              (save-match-data
-                (string-match mail-address-tld-regexp 
(match-string-no-properties 1)))
-              (match-string-no-properties 1)))))
+               (looking-at (concat "mailto:"; mail-address-regexp)))
+           (save-match-data
+             (string-match mail-address-tld-regexp (match-string-no-properties 
1)))
+           (match-string-no-properties 1)))))
 
 (defib mail-address ()
   "If on an e-mail address in a specific buffer type, compose mail to that 
address in another window.
@@ -142,27 +142,27 @@ Applies to any major mode in `mail-address-mode-list', 
the HyRolo match buffer,
 any buffer attached to a file in `hyrolo-file-list', or any buffer with
 \"mail\" or \"rolo\" (case-insensitive) within its name."
   (when (let ((case-fold-search t))
-             (or
-              (and (memq major-mode mail-address-mode-list)
-                   (not (string-match "-Elements\\'" (buffer-name)))
-                   ;; Don't want this to trigger within an OOBR-FTR buffer.
-                   (not (string-match "\\`\\(OOBR.*-FTR\\|oobr.*-ftr\\)"
-                                                  (buffer-name)))
-                   (not (string-equal "*Implementors*" (buffer-name))))
-              (and
-               (string-match "mail\\|rolo" (buffer-name))
-               ;; Don't want this to trigger in a mail/news summary buffer.
-               (not (or (hmail:lister-p) (hnews:lister-p))))
-              (when (boundp 'hyrolo-display-buffer)
-                (equal (buffer-name) hyrolo-display-buffer))
-              (and buffer-file-name
-                   (boundp 'hyrolo-file-list)
-                   (set:member (current-buffer)
-                                       (mapcar 'get-file-buffer 
hyrolo-file-list)))))
+          (or
+           (and (memq major-mode mail-address-mode-list)
+                (not (string-match "-Elements\\'" (buffer-name)))
+                ;; Don't want this to trigger within an OOBR-FTR buffer.
+                (not (string-match "\\`\\(OOBR.*-FTR\\|oobr.*-ftr\\)"
+                                   (buffer-name)))
+                (not (string-equal "*Implementors*" (buffer-name))))
+           (and
+            (string-match "mail\\|rolo" (buffer-name))
+            ;; Don't want this to trigger in a mail/news summary buffer.
+            (not (or (hmail:lister-p) (hnews:lister-p))))
+           (when (boundp 'hyrolo-display-buffer)
+             (equal (buffer-name) hyrolo-display-buffer))
+           (and buffer-file-name
+                (boundp 'hyrolo-file-list)
+                (set:member (current-buffer)
+                            (mapcar 'get-file-buffer hyrolo-file-list)))))
     (let ((address (mail-address-at-p)))
-         (when address
-           (ibut:label-set address (match-beginning 1) (match-end 1))
-           (hact 'mail-other-window nil address)))))
+      (when address
+        (ibut:label-set address (match-beginning 1) (match-end 1))
+        (hact 'mail-other-window nil address)))))
 
 ;;; ========================================================================
 ;;; Displays files and directories when a valid pathname is activated.
@@ -189,43 +189,43 @@ display options."
   ;;
   ;; Ignore paths in Buffer menu, dired and helm modes.
   (unless (or (derived-mode-p 'helm-major-mode)
-                 (delq nil (mapcar (lambda (substring)
-                                                 (string-match substring 
(format-mode-line mode-name)))
-                                               '("Buffer Menu" "IBuffer" 
"Dired"))))
+              (delq nil (mapcar (lambda (substring)
+                                  (string-match substring (format-mode-line 
mode-name)))
+                                '("Buffer Menu" "IBuffer" "Dired"))))
     (let ((path (hpath:at-p))
-             full-path)
+          full-path)
       (if path
-             (progn (when (string-match "\\`file://" path)
-                                  (setq path (substring path (match-end 0))))
-                                (apply #'ibut:label-set path (hpath:start-end 
path))
-                        (hact 'link-to-file path))
-           ;;
-           ;; Match to Emacs Lisp and Info files without any directory 
component.
-           (when (setq path (hpath:delimited-possible-path))
-             (cond ((string-match "\\`[^\\\\/~]+\\.elc?\\(\\.gz\\)?\\'" path)
-                        (apply #'ibut:label-set path (hpath:start-end path))
-                        (if (string-match hpath:prefix-regexp path)
-                            (hact 'hpath:find path)
-                          (setq full-path (locate-library path))
-                          (if full-path
-                                  (hact 'link-to-file full-path)
-                            (hact 'error "(pathname): \"%s\" not found in 
`load-path'"
-                                      path))))
-                       ;; Match only if "(filename)" references a valid Info 
file
-                       ;; and point is within the filename, not on any 
delimiters
-                       ;; so that delimited thing matches trigger later.
-                       ((and (not (looking-at "[\"()]"))
-                                 (string-match "\\`(\\([^ \t\n\r\f]+\\))\\'" 
path)
-                                 (save-match-data (require 'info))
-                                 (Info-find-file (match-string 1 path) t))
-                        (apply #'ibut:label-set path (hpath:start-end path))
-                        (hact 'link-to-Info-node (format "%sTop" path)))
-                       ((string-match hpath:info-suffix path)
-                        (apply #'ibut:label-set path (hpath:start-end path))
-                        (hact 'link-to-Info-node (format "(%s)Top" path)))
-                       ;; Otherwise, fall through and allow other implicit
-                       ;; button types to handle this context.
-                       ))))))
+          (progn (when (string-match "\\`file://" path)
+                   (setq path (substring path (match-end 0))))
+                 (apply #'ibut:label-set path (hpath:start-end path))
+                 (hact 'link-to-file path))
+        ;;
+        ;; Match to Emacs Lisp and Info files without any directory component.
+        (when (setq path (hpath:delimited-possible-path))
+          (cond ((string-match "\\`[^\\\\/~]+\\.elc?\\(\\.gz\\)?\\'" path)
+                 (apply #'ibut:label-set path (hpath:start-end path))
+                 (if (string-match hpath:prefix-regexp path)
+                     (hact 'hpath:find path)
+                   (setq full-path (locate-library path))
+                   (if full-path
+                       (hact 'link-to-file full-path)
+                     (hact 'error "(pathname): \"%s\" not found in `load-path'"
+                           path))))
+                ;; Match only if "(filename)" references a valid Info file
+                ;; and point is within the filename, not on any delimiters
+                ;; so that delimited thing matches trigger later.
+                ((and (not (looking-at "[\"()]"))
+                      (string-match "\\`(\\([^ \t\n\r\f]+\\))\\'" path)
+                      (save-match-data (require 'info))
+                      (Info-find-file (match-string 1 path) t))
+                 (apply #'ibut:label-set path (hpath:start-end path))
+                 (hact 'link-to-Info-node (format "%sTop" path)))
+                ((string-match hpath:info-suffix path)
+                 (apply #'ibut:label-set path (hpath:start-end path))
+                 (hact 'link-to-Info-node (format "(%s)Top" path)))
+                ;; Otherwise, fall through and allow other implicit
+                ;; button types to handle this context.
+                ))))))
 
 ;;; ========================================================================
 ;;; Use the XEmacs func-menu library to jump to a function referred to
@@ -239,34 +239,34 @@ display options."
 Trigger only when the \"func-menu.el\" library has been loaded and the
 current major mode is one handled by func-menu."
   (when (and (boundp 'fume-function-name-regexp-alist)
-                (assq major-mode fume-function-name-regexp-alist)
-                (not (derived-mode-p 'dired-mode))
-                ;; Not sure if this is defined in early versions of Emacs.
-                (fboundp 'skip-syntax-backward)
-                ;; Prevent triggering when on method, class or function 
definition
-                ;; lines under InfoDock where outlining in programming modes 
is used.
-                (if (and (featurep 'infodock)
-                             (boundp 'id-outline-in-programming-modes)
-                             id-outline-in-programming-modes
-                             (boundp 'outline-regexp) (stringp outline-regexp))
-                    (save-excursion (beginning-of-line)
-                                            (not (looking-at outline-regexp)))
-                  t))
-      (save-excursion
-           (skip-syntax-backward "w_")
-           (when (looking-at "\\(\\sw\\|\\s_\\)+")
-             (let ((function-name (buffer-substring-no-properties (point) 
(match-end 0)))
-                       (start (point))
-                       (end (match-end 0))
-                       function-pos)
-               (unless fume-funclist
-                     (fume-set-defaults)
-                     (let ((fume-scanning-message nil))
-                       (fume-rescan-buffer)))
-               (setq function-pos (cdr-safe (assoc function-name 
fume-funclist)))
-               (when function-pos
-                     (ibut:label-set function-name start end)
-                     (hact 'function-in-buffer function-name 
function-pos)))))))
+             (assq major-mode fume-function-name-regexp-alist)
+             (not (derived-mode-p 'dired-mode))
+             ;; Not sure if this is defined in early versions of Emacs.
+             (fboundp 'skip-syntax-backward)
+             ;; Prevent triggering when on method, class or function definition
+             ;; lines under InfoDock where outlining in programming modes is 
used.
+             (if (and (featurep 'infodock)
+                      (boundp 'id-outline-in-programming-modes)
+                      id-outline-in-programming-modes
+                      (boundp 'outline-regexp) (stringp outline-regexp))
+                 (save-excursion (beginning-of-line)
+                                 (not (looking-at outline-regexp)))
+               t))
+    (save-excursion
+      (skip-syntax-backward "w_")
+      (when (looking-at "\\(\\sw\\|\\s_\\)+")
+        (let ((function-name (buffer-substring-no-properties (point) 
(match-end 0)))
+              (start (point))
+              (end (match-end 0))
+              function-pos)
+          (unless fume-funclist
+            (fume-set-defaults)
+            (let ((fume-scanning-message nil))
+              (fume-rescan-buffer)))
+          (setq function-pos (cdr-safe (assoc function-name fume-funclist)))
+          (when function-pos
+            (ibut:label-set function-name start end)
+            (hact 'function-in-buffer function-name function-pos)))))))
 
 ;;; ========================================================================
 ;;; Handles internal references within an annotated bibliography, delimiters=[]
@@ -281,15 +281,15 @@ must have an attached file."
   (and (not (bolp))
        buffer-file-name
        (let ((chr (aref (buffer-name) 0)))
-            (not (or (eq chr ?\ ) (eq chr ?*))))
+         (not (or (eq chr ?\ ) (eq chr ?*))))
        (not (or (derived-mode-p 'prog-mode)
-                       (apply #'derived-mode-p '(c-mode objc-mode c++-mode 
java-mode markdown-mode org-mode))))
+                (apply #'derived-mode-p '(c-mode objc-mode c++-mode java-mode 
markdown-mode org-mode))))
        (let* ((ref-and-pos (hbut:label-p t "[" "]" t))
-                 (ref (car ref-and-pos)))
-            (and ref (eq ?w (char-syntax (aref ref 0)))
-                 (not (string-match "[#@]" ref))
-                 (progn (ibut:label-set ref-and-pos)
-                            (hact 'annot-bib ref))))))
+              (ref (car ref-and-pos)))
+         (and ref (eq ?w (char-syntax (aref ref 0)))
+              (not (string-match "[#@]" ref))
+              (progn (ibut:label-set ref-and-pos)
+                     (hact 'annot-bib ref))))))
 
 ;;; ========================================================================
 ;;; Handles social media hashtag and username references, e.g. 
twitter#myhashtag
@@ -326,12 +326,12 @@ Return t if jump and nil otherwise."
   "Test to see if on an inline link, jump to its referent if it is absolute 
(not relative within the file) and return non-nil.
 Otherwise, if an internal link, move back to OPOINT and return nil."
   (let (handle-link-flag
-       result)
+        result)
     (skip-chars-forward "^\]\[()")
     (when (looking-at "\][\[()]")
       (if (looking-at "\(")
-         (skip-chars-backward "^\]\[()")
-       (skip-chars-forward "\]\[\("))
+          (skip-chars-backward "^\]\[()")
+        (skip-chars-forward "\]\[\("))
       ;; Leave point on the link even if not activated
       ;; here, so that other ibtypes activate it.  If point is after
       ;; the # character of an in-file link, then the following predicate
@@ -339,11 +339,11 @@ Otherwise, if an internal link, move back to OPOINT and 
return nil."
       ;; the # character, the link is handled here.
       (setq handle-link-flag (not (or (hpath:www-at-p) (hpath:at-p))))
       (when (setq result (and (markdown-link-p) handle-link-flag))
-       ;; In-file referents are handled by the `pathname' implicit
-       ;; button type, not here.
-       (ibut:label-set (match-string-no-properties 0) (match-beginning 0) 
(match-end 0))
-       (hpath:display-buffer (current-buffer))
-       (hact 'markdown-follow-link-at-point)))
+        ;; In-file referents are handled by the `pathname' implicit
+        ;; button type, not here.
+        (ibut:label-set (match-string-no-properties 0) (match-beginning 0) 
(match-end 0))
+        (hpath:display-buffer (current-buffer))
+        (hact 'markdown-follow-link-at-point)))
     (when handle-link-flag
       (goto-char opoint))
     result))
@@ -352,27 +352,27 @@ Otherwise, if an internal link, move back to OPOINT and 
return nil."
   "Display any in-file Markdown link referent at point.
 Pathnames and urls are handled elsewhere."
   (when (and (derived-mode-p 'markdown-mode)
-            (not (hpath:www-at-p)))
+             (not (hpath:www-at-p)))
     (let ((opoint (point))
-         npoint)
+          npoint)
       (cond ((markdown-link-p)
-            (condition-case ()
-                ;; Follows a reference link or footnote to its referent.
-                (if (markdown-follow-link-p)
-                    (when (/= opoint (point))
-                      (ibut:label-set (match-string-no-properties 0) 
(match-beginning 0) (match-end 0))
-                      (setq npoint (point))
-                      (goto-char opoint)
-                      (hact 'link-to-file buffer-file-name npoint))
-                  ;; Follows an absolute file link.
-                  (markdown-follow-inline-link-p opoint))
-              ;; May be on the name of an infile link, so move to the
-              ;; link itself and then let the `pathname' ibtype handle it.
-              (error (markdown-follow-inline-link-p opoint))))
-           ((markdown-wiki-link-p)
-            (ibut:label-set (match-string-no-properties 0) (match-beginning 0) 
(match-end 0))
-            (hpath:display-buffer (current-buffer))
-            (hact 'markdown-follow-wiki-link-at-point))))))
+             (condition-case ()
+                 ;; Follows a reference link or footnote to its referent.
+                 (if (markdown-follow-link-p)
+                     (when (/= opoint (point))
+                       (ibut:label-set (match-string-no-properties 0) 
(match-beginning 0) (match-end 0))
+                       (setq npoint (point))
+                       (goto-char opoint)
+                       (hact 'link-to-file buffer-file-name npoint))
+                   ;; Follows an absolute file link.
+                   (markdown-follow-inline-link-p opoint))
+               ;; May be on the name of an infile link, so move to the
+               ;; link itself and then let the `pathname' ibtype handle it.
+               (error (markdown-follow-inline-link-p opoint))))
+            ((markdown-wiki-link-p)
+             (ibut:label-set (match-string-no-properties 0) (match-beginning 
0) (match-end 0))
+             (hpath:display-buffer (current-buffer))
+             (hact 'markdown-follow-wiki-link-at-point))))))
 
 ;;; ========================================================================
 ;;; Summarizes an Internet rfc for random access browsing by section.
@@ -382,16 +382,16 @@ Pathnames and urls are handled elsewhere."
   "Summarize the contents of an Internet rfc from anywhere within an rfc 
buffer.
 Each line in the summary may be selected to jump to a section."
   (let ((case-fold-search t)
-           (toc)
-           (opoint (point)))
+        (toc)
+        (opoint (point)))
     (if (and (string-match "rfc" (buffer-name))
-                (goto-char (point-min))
-                (progn (setq toc (search-forward "Table of Contents" nil t))
-                           (re-search-forward "^[ \t]*1.0?[ \t]+[^ \t\n\r]" 
nil t
-                                                      (and toc 2))))
-           (progn (beginning-of-line)
-                  (ibut:label-set (buffer-name))
-                  (hact 'rfc-toc (buffer-name) opoint))
+             (goto-char (point-min))
+             (progn (setq toc (search-forward "Table of Contents" nil t))
+                    (re-search-forward "^[ \t]*1.0?[ \t]+[^ \t\n\r]" nil t
+                                       (and toc 2))))
+        (progn (beginning-of-line)
+               (ibut:label-set (buffer-name))
+               (hact 'rfc-toc (buffer-name) opoint))
       (goto-char opoint)
       nil)))
 
@@ -403,44 +403,44 @@ Each line in the summary may be selected to jump to a 
section."
   "Expand or collapse C call trees and jump to code definitions.
 Require cross-reference tables built by the external `cxref' program of Cflow."
   (when (and (derived-mode-p 'id-cflow-mode)
-                (not (eolp)))
+             (not (eolp)))
     (let ((pnt (point)))
-         (save-excursion
-           (cond
-            ;; If on a repeated function mark, display its previously
-            ;; expanded tree.
-            ((progn (skip-chars-backward " ")
-                        (looking-at id-cflow-repeated-indicator))
-             (let ((end (point))
-                       start entry)
-               (beginning-of-line)
-               (skip-chars-forward "| ")
-               (setq start (point)
-                         entry (buffer-substring-no-properties start end))
-               (ibut:label-set entry start end)
-               (condition-case ()
-                       (hact 'link-to-regexp-match
-                                 (concat "^[| ]*[&%%]*" (regexp-quote entry) 
"$")
-                                 1 (current-buffer) t)
-                     (error
-                      (goto-char end)
-                      (error "(id-cflow): No prior expansion found")))))
-            ;; If to the left of an entry, expand or contract its tree.
-            ((progn (beginning-of-line)
-                        (or (= pnt (point))
-                            (and (looking-at "[| ]+")
-                                     (<= pnt (match-end 0)))))
-             (hact 'id-cflow-expand-or-contract current-prefix-arg))
-            ;; Within an entry's filename, display the file.
-            ((search-forward "\(" pnt t)
-             (let* ((start (point))
-                        (end (1- (search-forward "\)" nil t)))
-                        (file (buffer-substring-no-properties start end)))
-               (ibut:label-set file start end)
-               (hact 'link-to-file file)))
-            ;; Within an entry's function name, jump to its definition.
-            (t
-             (hact 'smart-c)))))))
+      (save-excursion
+        (cond
+         ;; If on a repeated function mark, display its previously
+         ;; expanded tree.
+         ((progn (skip-chars-backward " ")
+                 (looking-at id-cflow-repeated-indicator))
+          (let ((end (point))
+                start entry)
+            (beginning-of-line)
+            (skip-chars-forward "| ")
+            (setq start (point)
+                  entry (buffer-substring-no-properties start end))
+            (ibut:label-set entry start end)
+            (condition-case ()
+                (hact 'link-to-regexp-match
+                      (concat "^[| ]*[&%%]*" (regexp-quote entry) "$")
+                      1 (current-buffer) t)
+              (error
+               (goto-char end)
+               (error "(id-cflow): No prior expansion found")))))
+         ;; If to the left of an entry, expand or contract its tree.
+         ((progn (beginning-of-line)
+                 (or (= pnt (point))
+                     (and (looking-at "[| ]+")
+                          (<= pnt (match-end 0)))))
+          (hact 'id-cflow-expand-or-contract current-prefix-arg))
+         ;; Within an entry's filename, display the file.
+         ((search-forward "\(" pnt t)
+          (let* ((start (point))
+                 (end (1- (search-forward "\)" nil t)))
+                 (file (buffer-substring-no-properties start end)))
+            (ibut:label-set file start end)
+            (hact 'link-to-file file)))
+         ;; Within an entry's function name, jump to its definition.
+         (t
+          (hact 'smart-c)))))))
 
 ;;; ========================================================================
 ;;; Jumps to the source line associated with a ctags file entry.
@@ -455,18 +455,18 @@ Require cross-reference tables built by the external 
`cxref' program of Cflow."
       ;;             identifier       pathname              line-number
       ;; ctags vgrind output format entry
       (let ((identifier (match-string-no-properties 1))
-               (file (expand-file-name (match-string-no-properties 2)))
-               (line-num (string-to-number (match-string-no-properties 3))))
-           (ibut:label-set identifier (match-beginning 1) (match-end 1))
-           (hact 'link-to-file-line file line-num)))
+            (file (expand-file-name (match-string-no-properties 2)))
+            (line-num (string-to-number (match-string-no-properties 3))))
+        (ibut:label-set identifier (match-beginning 1) (match-end 1))
+        (hact 'link-to-file-line file line-num)))
      ((looking-at "^\\(\\S-+\\) +\\([1-9][0-9]*\\) \\(\\S-+\\.[a-zA-Z]+\\) ")
       ;; ctags cxref output format entry
       ;;             identifier    line-number           pathname
       (let ((identifier (match-string-no-properties 1))
-               (line-num (string-to-number (match-string-no-properties 2)))
-               (file (expand-file-name (match-string-no-properties 3))))
-           (ibut:label-set identifier (match-beginning 1) (match-end 1))
-           (hact 'link-to-file-line file line-num))))))
+            (line-num (string-to-number (match-string-no-properties 2)))
+            (file (expand-file-name (match-string-no-properties 3))))
+        (ibut:label-set identifier (match-beginning 1) (match-end 1))
+        (hact 'link-to-file-line file line-num))))))
 
 ;;; ========================================================================
 ;;; Jumps to the source line associated with an etags file entry in a TAGS 
buffer.
@@ -478,32 +478,32 @@ If on a tag entry line, jump to the source line for the 
tag.  If on a
 pathname line or line preceding it, jump to the associated file."
   (when (let (case-fold-search) (string-match "^TAGS" (buffer-name)))
     (save-excursion
-         (beginning-of-line)
-         (cond
-          ((save-excursion
-             (and (or (and (eq (following-char) ?\^L)
-                                   (zerop (forward-line 1)))
-                          (and (zerop (forward-line -1))
-                                   (eq (following-char) ?\^L)
-                                   (zerop (forward-line 1))))
-                      (looking-at "\\([^,\n\r]+\\),[0-9]+$")))
-           (let ((file (match-string-no-properties 1)))
-             (ibut:label-set file (match-beginning 1) (match-end 1))
-             (hact 'link-to-file file)))
-          ((looking-at
-            "\\([^\^?\n\r]+\\)[ ]*\^?\\([^\^A\n\r]+\^A\\)?\\([1-9][0-9]+\\),")
-           (let* ((tag-grouping (if (match-beginning 2) 2 1))
-                      (tag (buffer-substring-no-properties (match-beginning 
tag-grouping)
-                                                                           (1- 
(match-end tag-grouping))))
-                      (line (string-to-number (match-string-no-properties 3)))
-                      file)
-             (ibut:label-set tag (match-beginning tag-grouping)
-                                     (1- (match-end tag-grouping)))
-             (save-excursion
-               (if (re-search-backward "\^L\r?\n\\([^,\n\r]+\\),[0-9]+$" nil t)
-                       (setq file (expand-file-name 
(match-string-no-properties 1)))
-                     (setq file "No associated file name")))
-             (hact 'link-to-file-line file line)))))))
+      (beginning-of-line)
+      (cond
+       ((save-excursion
+          (and (or (and (eq (following-char) ?\^L)
+                        (zerop (forward-line 1)))
+                   (and (zerop (forward-line -1))
+                        (eq (following-char) ?\^L)
+                        (zerop (forward-line 1))))
+               (looking-at "\\([^,\n\r]+\\),[0-9]+$")))
+        (let ((file (match-string-no-properties 1)))
+          (ibut:label-set file (match-beginning 1) (match-end 1))
+          (hact 'link-to-file file)))
+       ((looking-at
+         "\\([^\^?\n\r]+\\)[ ]*\^?\\([^\^A\n\r]+\^A\\)?\\([1-9][0-9]+\\),")
+        (let* ((tag-grouping (if (match-beginning 2) 2 1))
+               (tag (buffer-substring-no-properties (match-beginning 
tag-grouping)
+                                                    (1- (match-end 
tag-grouping))))
+               (line (string-to-number (match-string-no-properties 3)))
+               file)
+          (ibut:label-set tag (match-beginning tag-grouping)
+                          (1- (match-end tag-grouping)))
+          (save-excursion
+            (if (re-search-backward "\^L\r?\n\\([^,\n\r]+\\),[0-9]+$" nil t)
+                (setq file (expand-file-name (match-string-no-properties 1)))
+              (setq file "No associated file name")))
+          (hact 'link-to-file-line file line)))))))
 
 ;;; ========================================================================
 ;;; Jumps to C/C++ source line associated with Cscope C analyzer output line.
@@ -518,19 +518,19 @@ anything."
   (and (boundp 'cscope:bname-prefix)  ;; (featurep 'cscope)
        (stringp cscope:bname-prefix)
        (string-match (regexp-quote cscope:bname-prefix)
-                            (buffer-name))
+                     (buffer-name))
        (= (match-beginning 0) 0)
        (save-excursion
-            (beginning-of-line)
-            (looking-at cscope-output-line-regexp))
+         (beginning-of-line)
+         (looking-at cscope-output-line-regexp))
        (let (start end)
-            (skip-chars-backward "^\n\r")
-            (setq start (point))
-            (skip-chars-forward "^\n\r")
-            (setq end (point))
-            (ibut:label-set (buffer-substring start end)
-                                    start end)
-            (hact 'cscope-interpret-output-line))))
+         (skip-chars-backward "^\n\r")
+         (setq start (point))
+         (skip-chars-forward "^\n\r")
+         (setq end (point))
+         (ibut:label-set (buffer-substring start end)
+                         start end)
+         (hact 'cscope-interpret-output-line))))
 
 ;;; ========================================================================
 ;;; Makes README table of contents entries jump to associated sections.
@@ -546,17 +546,17 @@ Each section header linked to by the toc must start with 
one or more
 asterisk characters at the very beginning of the line."
   (let (section)
     (when (and (string-match "DEMO\\|README\\|TUTORIAL" (buffer-name))
-                  (save-excursion
-                    (beginning-of-line)
-                    ;; Entry line within a TOC
-                    (when (looking-at "[ \t]+\\*+[ \t]+\\(.*[^ \t]\\)[ \t]*$")
-                          (setq section (match-string-no-properties 1))))
-                  (progn (ibut:label-set section (match-beginning 1) 
(match-end 1))
-                             t)
-                  (save-excursion (re-search-backward
-                                           "^\\*?*[ \t]*\\(Table of 
\\)?Contents[ \t]*$"
-                                           nil t)))
-         (hact 'text-toc section))))
+               (save-excursion
+                 (beginning-of-line)
+                 ;; Entry line within a TOC
+                 (when (looking-at "[ \t]+\\*+[ \t]+\\(.*[^ \t]\\)[ \t]*$")
+                   (setq section (match-string-no-properties 1))))
+               (progn (ibut:label-set section (match-beginning 1) (match-end 
1))
+                      t)
+               (save-excursion (re-search-backward
+                                "^\\*?*[ \t]*\\(Table of \\)?Contents[ \t]*$"
+                                nil t)))
+      (hact 'text-toc section))))
 
 ;;; ========================================================================
 ;;; Makes directory summaries into file list menus.
@@ -569,18 +569,18 @@ or may be preceded by some semicolons and must be 
followed by one or more
 spaces and then another non-space, non-parenthesis, non-brace character."
   (when buffer-file-name
     (let ((file (file-name-nondirectory buffer-file-name))
-             entry start end)
-         (when (or (string-equal file "DIR")
-                       (string-match "\\`MANIFEST\\(\\..+\\)?\\'" file))
-           (save-excursion
-             (beginning-of-line)
-             (when (looking-at "\\(;+[ \t]*\\)?\\([^(){}* \t\n\r]+\\)")
-                   (setq entry (match-string-no-properties 2)
-                             start (match-beginning 2)
-                             end (match-end 2))
-                   (when (file-exists-p entry)
-                         (ibut:label-set entry start end)
-                         (hact 'link-to-file entry))))))))
+          entry start end)
+      (when (or (string-equal file "DIR")
+                (string-match "\\`MANIFEST\\(\\..+\\)?\\'" file))
+        (save-excursion
+          (beginning-of-line)
+          (when (looking-at "\\(;+[ \t]*\\)?\\([^(){}* \t\n\r]+\\)")
+            (setq entry (match-string-no-properties 2)
+                  start (match-beginning 2)
+                  end (match-end 2))
+            (when (file-exists-p entry)
+              (ibut:label-set entry start end)
+              (hact 'link-to-file entry))))))))
 
 ;;; ========================================================================
 ;;; Handles Gnu debbugs issue ids, e.g. bug#45678 or just 45678.
@@ -604,27 +604,27 @@ The following formats are recognized: RFC822, rfc-822, 
and RFC 822.  The
 `hpath:rfc' variable specifies the location from which to retrieve RFCs.
 Requires the Emacs builtin Tramp library for ftp file retrievals."
   (let ((case-fold-search t)
-           (rfc-num nil))
+        (rfc-num nil))
     (and (not (memq major-mode '(dired-mode monkey-mode)))
-            (boundp 'hpath:rfc)
-            (stringp hpath:rfc)
-            (or (looking-at " *\\(rfc[- ]?\\([0-9]+\\)\\)")
-                (save-excursion
-                  (skip-chars-backward "0-9")
-                  (skip-chars-backward "- ")
-                  (skip-chars-backward "rRfFcC")
-                  (looking-at " *\\(rfc[- ]?\\([0-9]+\\)\\)")))
-            (progn (setq rfc-num (match-string-no-properties 2))
-                       (ibut:label-set (match-string-no-properties 1))
-                       t)
-            ;; Ensure remote file access is available for retrieving a remote
-            ;; RFC, if need be.
-            (if (string-match "^/.+:" hpath:rfc)
-                ;; This is a remote path.
-                (hpath:remote-available-p)
-              ;; local path
-              t)
-            (hact 'link-to-rfc rfc-num))))
+         (boundp 'hpath:rfc)
+         (stringp hpath:rfc)
+         (or (looking-at " *\\(rfc[- ]?\\([0-9]+\\)\\)")
+             (save-excursion
+               (skip-chars-backward "0-9")
+               (skip-chars-backward "- ")
+               (skip-chars-backward "rRfFcC")
+               (looking-at " *\\(rfc[- ]?\\([0-9]+\\)\\)")))
+         (progn (setq rfc-num (match-string-no-properties 2))
+                (ibut:label-set (match-string-no-properties 1))
+                t)
+         ;; Ensure remote file access is available for retrieving a remote
+         ;; RFC, if need be.
+         (if (string-match "^/.+:" hpath:rfc)
+             ;; This is a remote path.
+             (hpath:remote-available-p)
+           ;; local path
+           t)
+         (hact 'link-to-rfc rfc-num))))
 
 ;;; ========================================================================
 ;;; Shows man page associated with a man apropos entry.
@@ -635,15 +635,15 @@ Requires the Emacs builtin Tramp library for ftp file 
retrievals."
   (save-excursion
     (beginning-of-line)
     (let ((nm "[^ \t\n\r!@,][^ \t\n\r,]*")
-             topic)
+          topic)
       (and (looking-at
-               (concat
-                "^\\(\\*[ \t]+[!@]\\)?\\(" nm "[ \t]*,[ \t]*\\)*\\(" nm "\\)[ 
\t]*"
-                "\\(([-0-9a-zA-z]+)\\)\\(::\\)?[ \t]+-[ \t]+[^ \t\n\r]"))
-              (setq topic (concat (match-string-no-properties 3)
-                                          (match-string-no-properties 4)))
-              (ibut:label-set topic (match-beginning 3) (match-end 4))
-              (hact 'man topic)))))
+            (concat
+             "^\\(\\*[ \t]+[!@]\\)?\\(" nm "[ \t]*,[ \t]*\\)*\\(" nm "\\)[ 
\t]*"
+             "\\(([-0-9a-zA-z]+)\\)\\(::\\)?[ \t]+-[ \t]+[^ \t\n\r]"))
+           (setq topic (concat (match-string-no-properties 3)
+                               (match-string-no-properties 4)))
+           (ibut:label-set topic (match-beginning 3) (match-end 4))
+           (hact 'man topic)))))
 
 ;;; ========================================================================
 ;;; Follows links to Hyperbole Koutliner cells.
@@ -659,16 +659,16 @@ Requires the Emacs builtin Tramp library for ftp file 
retrievals."
   "Call LINK-ACTYPE as the action type and prefix button with LABEL-PREFIX if 
point is within an implicit button delimited by START-DELIM and END-DELIM."
   ;; Used by e/g/ilink implicit buttons."
   (let* ((label-start-end (hbut:label-p t start-delim end-delim t t))
-            (label-and-file (nth 0 label-start-end))
-            (start-pos (nth 1 label-start-end))
-            (end-pos (nth 2 label-start-end))
-            lbl but-key lbl-key key-file)
+         (label-and-file (nth 0 label-start-end))
+         (start-pos (nth 1 label-start-end))
+         (end-pos (nth 2 label-start-end))
+         lbl but-key lbl-key key-file)
     (when label-and-file
       (setq label-and-file (parse-label-and-file label-and-file)
-               partial-lbl (nth 0 label-and-file)
-               but-key (hbut:label-to-key partial-lbl)
-               key-file (nth 1 label-and-file)
-               lbl-key (when but-key (concat label-prefix but-key)))
+            partial-lbl (nth 0 label-and-file)
+            but-key (hbut:label-to-key partial-lbl)
+            key-file (nth 1 label-and-file)
+            lbl-key (when but-key (concat label-prefix but-key)))
       (ibut:label-set (hbut:key-to-label lbl-key) start-pos end-pos)
       (hact link-actype but-key key-file))))
 
@@ -677,18 +677,18 @@ Requires the Emacs builtin Tramp library for ftp file 
retrievals."
   ;; Can't use split-string here because file path may contain colons;
   ;; we want to split only on the first colon.
   (let ((i 0)
-           (len (length label-and-file))
-           label
-           file)
+        (len (length label-and-file))
+        label
+        file)
     (while (< i len)
       (when (= ?: (aref label-and-file i))
-           (when (zerop i)
-             (error "(parse-label-and-file): Missing label: '%s'" 
label-and-file))
-           (setq label (hpath:trim (substring label-and-file 0 i))
-                 file (hpath:trim (substring label-and-file (1+ i))))
-           (when (string-empty-p label) (setq label nil))
-           (when (string-empty-p file) (setq file nil))
-           (setq i len))
+        (when (zerop i)
+          (error "(parse-label-and-file): Missing label: '%s'" label-and-file))
+        (setq label (hpath:trim (substring label-and-file 0 i))
+              file (hpath:trim (substring label-and-file (1+ i))))
+        (when (string-empty-p label) (setq label nil))
+        (when (string-empty-p file) (setq file nil))
+        (setq i len))
       (setq i (1+ i)))
     (unless (or label (string-empty-p label-and-file))
       (setq label label-and-file))
@@ -763,27 +763,27 @@ buffer)."
     (save-excursion
       (beginning-of-line)
       (let ((line-num-regexp "\\( *\\|-+> \\)?\\([1-9][0-9]*\\) ")
-               line-num
-               file)
-           (when (looking-at line-num-regexp)
-             ;; ipython stack trace matches and context lines (-A<num> option)
-             (setq line-num (match-string-no-properties 2)
-                       file nil)
-             (while (and (= (forward-line -1) 0)
-                             (looking-at line-num-regexp)))
-             (unless (or (looking-at line-num-regexp)
-                             (not (re-search-forward " in " nil 
(point-at-eol)))
-                             (and (setq file (buffer-substring-no-properties 
(point-at-bol) (match-beginning 0)))
-                                      (string-empty-p (string-trim file))))
-               (let* ((but-label (concat file ":" line-num))
-                          (source-loc (unless (file-name-absolute-p file)
-                                                (hbut:key-src t))))
-                 (when (stringp source-loc)
-                       (setq file (expand-file-name file (file-name-directory 
source-loc))))
-                 (when (file-readable-p file)
-                       (setq line-num (string-to-number line-num))
-                       (ibut:label-set but-label)
-                       (hact 'link-to-file-line file line-num)))))))))
+            line-num
+            file)
+        (when (looking-at line-num-regexp)
+          ;; ipython stack trace matches and context lines (-A<num> option)
+          (setq line-num (match-string-no-properties 2)
+                file nil)
+          (while (and (= (forward-line -1) 0)
+                      (looking-at line-num-regexp)))
+          (unless (or (looking-at line-num-regexp)
+                      (not (re-search-forward " in " nil (point-at-eol)))
+                      (and (setq file (buffer-substring-no-properties 
(point-at-bol) (match-beginning 0)))
+                           (string-empty-p (string-trim file))))
+            (let* ((but-label (concat file ":" line-num))
+                   (source-loc (unless (file-name-absolute-p file)
+                                 (hbut:key-src t))))
+              (when (stringp source-loc)
+                (setq file (expand-file-name file (file-name-directory 
source-loc))))
+              (when (file-readable-p file)
+                (setq line-num (string-to-number line-num))
+                (ibut:label-set but-label)
+                (hact 'link-to-file-line file line-num)))))))))
 
 (defib ripgrep-msg ()
   "Jump to the line associated with a ripgrep (rg) line numbered msg.
@@ -810,23 +810,23 @@ buffer)."
     (save-excursion
       (beginning-of-line)
       (when (looking-at "\\([1-9][0-9]*\\)[-:]")
-           ;; Ripgrep matches and context lines (-A<num> option)
-           (let ((line-num (match-string-no-properties 1))
-                 file)
-             (while (and (= (forward-line -1) 0)
-                             (looking-at "[1-9][0-9]*[-:]\\|--$")))
-             (unless (or (looking-at "[1-9][0-9]*[-:]\\|--$")
-                             (and (setq file (buffer-substring-no-properties 
(point-at-bol) (point-at-eol)))
-                                      (string-empty-p (string-trim file))))
-               (let* ((but-label (concat file ":" line-num))
-                          (source-loc (unless (file-name-absolute-p file)
-                                                (hbut:key-src t))))
-                 (when (stringp source-loc)
-                       (setq file (expand-file-name file (file-name-directory 
source-loc))))
-                 (when (file-readable-p file)
-                       (setq line-num (string-to-number line-num))
-                       (ibut:label-set but-label)
-                       (hact 'link-to-file-line file line-num)))))))))
+        ;; Ripgrep matches and context lines (-A<num> option)
+        (let ((line-num (match-string-no-properties 1))
+              file)
+          (while (and (= (forward-line -1) 0)
+                      (looking-at "[1-9][0-9]*[-:]\\|--$")))
+          (unless (or (looking-at "[1-9][0-9]*[-:]\\|--$")
+                      (and (setq file (buffer-substring-no-properties 
(point-at-bol) (point-at-eol)))
+                           (string-empty-p (string-trim file))))
+            (let* ((but-label (concat file ":" line-num))
+                   (source-loc (unless (file-name-absolute-p file)
+                                 (hbut:key-src t))))
+              (when (stringp source-loc)
+                (setq file (expand-file-name file (file-name-directory 
source-loc))))
+              (when (file-readable-p file)
+                (setq line-num (string-to-number line-num))
+                (ibut:label-set but-label)
+                (hact 'link-to-file-line file line-num)))))))))
 
 (defib grep-msg ()
   "Jump to the line associated with line numbered grep or compilation error 
msgs.
@@ -839,44 +839,44 @@ in grep and shell buffers."
     (save-excursion
       (beginning-of-line)
       (when (or
-                ;; Grep matches, UNIX C compiler and Introl 68HC11 C compiler 
errors
-                (looking-at "\\([^ \t\n\r:]+\\): ?\\([1-9][0-9]*\\)[ :]")
-                ;; Grep matches, UNIX C compiler and Introl 68HC11 C
-                ;; compiler errors, allowing for file names with
-                ;; spaces followed by a null character rather than a :
-                (looking-at "\\([^\t\n\r]+\\) ?\\([1-9][0-9]*\\)[ :]")
-                ;; HP C compiler errors
-                (looking-at "[a-zA-Z0-9]+: \"\\([^\t\n\r\",]+\\)\", line 
\\([0-9]+\\):")
-                ;; BSO/Tasking 68HC08 C compiler errors
-                (looking-at
-                 "[a-zA-Z 0-9]+: \\([^ \t\n\r\",]+\\) line \\([0-9]+\\)[ 
\t]*:")
-                ;; UNIX Lint errors
-                (looking-at "[^:]+: \\([^ \t\n\r:]+\\): line \\([0-9]+\\):")
-                ;; SparcWorks C compiler errors (ends with :)
-                ;; IBM AIX xlc C compiler errors (ends with .)
-                (looking-at "\"\\([^\"]+\\)\", line \\([0-9]+\\)[:.]")
-                ;; Introl as11 assembler errors
-                (looking-at " \\*+ \\([^ \t\n\r]+\\) - \\([0-9]+\\) ")
-                ;; perl5: ... at file.c line 10
-                (looking-at ".+ at \\([^ \t\n\r]+\\) line +\\([0-9]+\\)")
-                ;; Weblint
-                (looking-at "\\([^ \t\n\r:()]+\\)(\\([0-9]+\\)): ")
-                ;; Microsoft JVC
-                ;; file.java(6,1) : error J0020: Expected 'class' or 
'interface'
-                (looking-at "^\\(\\([a-zA-Z]:\\)?[^:\( \t\n\r-]+\\)[:\(][ 
\t]*\\([0-9]+\\),")
-                ;; Grep match context lines (-A<num> option)
-                (and (string-match "grep\\|shell" (buffer-name))
-                         (looking-at "\\([^ \t\n\r:]+\\)-\\([1-9][0-9]*\\)-")))
-           (let* ((file (match-string-no-properties 1))
-                      (line-num  (match-string-no-properties 2))
-                      (but-label (concat file ":" line-num))
-                      (source-loc (unless (file-name-absolute-p file)
-                                        (hbut:key-src t))))
-             (when (stringp source-loc)
-                   (setq file (expand-file-name file (file-name-directory 
source-loc))))
-             (setq line-num (string-to-number line-num))
-             (ibut:label-set but-label)
-             (hact 'link-to-file-line file line-num))))))
+             ;; Grep matches, UNIX C compiler and Introl 68HC11 C compiler 
errors
+             (looking-at "\\([^ \t\n\r:]+\\): ?\\([1-9][0-9]*\\)[ :]")
+             ;; Grep matches, UNIX C compiler and Introl 68HC11 C
+             ;; compiler errors, allowing for file names with
+             ;; spaces followed by a null character rather than a :
+             (looking-at "\\([^\t\n\r]+\\) ?\\([1-9][0-9]*\\)[ :]")
+             ;; HP C compiler errors
+             (looking-at "[a-zA-Z0-9]+: \"\\([^\t\n\r\",]+\\)\", line 
\\([0-9]+\\):")
+             ;; BSO/Tasking 68HC08 C compiler errors
+             (looking-at
+              "[a-zA-Z 0-9]+: \\([^ \t\n\r\",]+\\) line \\([0-9]+\\)[ \t]*:")
+             ;; UNIX Lint errors
+             (looking-at "[^:]+: \\([^ \t\n\r:]+\\): line \\([0-9]+\\):")
+             ;; SparcWorks C compiler errors (ends with :)
+             ;; IBM AIX xlc C compiler errors (ends with .)
+             (looking-at "\"\\([^\"]+\\)\", line \\([0-9]+\\)[:.]")
+             ;; Introl as11 assembler errors
+             (looking-at " \\*+ \\([^ \t\n\r]+\\) - \\([0-9]+\\) ")
+             ;; perl5: ... at file.c line 10
+             (looking-at ".+ at \\([^ \t\n\r]+\\) line +\\([0-9]+\\)")
+             ;; Weblint
+             (looking-at "\\([^ \t\n\r:()]+\\)(\\([0-9]+\\)): ")
+             ;; Microsoft JVC
+             ;; file.java(6,1) : error J0020: Expected 'class' or 'interface'
+             (looking-at "^\\(\\([a-zA-Z]:\\)?[^:\( \t\n\r-]+\\)[:\(][ 
\t]*\\([0-9]+\\),")
+             ;; Grep match context lines (-A<num> option)
+             (and (string-match "grep\\|shell" (buffer-name))
+                  (looking-at "\\([^ \t\n\r:]+\\)-\\([1-9][0-9]*\\)-")))
+        (let* ((file (match-string-no-properties 1))
+               (line-num  (match-string-no-properties 2))
+               (but-label (concat file ":" line-num))
+               (source-loc (unless (file-name-absolute-p file)
+                             (hbut:key-src t))))
+          (when (stringp source-loc)
+            (setq file (expand-file-name file (file-name-directory 
source-loc))))
+          (setq line-num (string-to-number line-num))
+          (ibut:label-set but-label)
+          (hact 'link-to-file-line file line-num))))))
 
 ;;; ========================================================================
 ;;; Jumps to source line associated with debugger stack frame or breakpoint
@@ -891,83 +891,83 @@ This works with JavaScript and Python tracebacks, gdb, 
dbx, and xdb.  Such lines
     (cond
      ;; Python pdb or traceback, pytype error
      ((or (looking-at "\\(^\\|.+ \\)File \"\\([^\"\n\r]+\\)\", line 
\\([0-9]+\\)")
-             (looking-at ">?\\(\\s-+\\)\\([^\"()\n\r]+\\)(\\([0-9]+\\))\\S-"))
+          (looking-at ">?\\(\\s-+\\)\\([^\"()\n\r]+\\)(\\([0-9]+\\))\\S-"))
       (let* ((file (match-string-no-properties 2))
-                (line-num (match-string-no-properties 3))
-                (but-label (concat file ":" line-num)))
-           (setq line-num (string-to-number line-num))
-           (ibut:label-set but-label (match-beginning 2) (match-end 2))
-           (hact 'link-to-file-line file line-num)))
+             (line-num (match-string-no-properties 3))
+             (but-label (concat file ":" line-num)))
+        (setq line-num (string-to-number line-num))
+        (ibut:label-set but-label (match-beginning 2) (match-end 2))
+        (hact 'link-to-file-line file line-num)))
 
      ;; JavaScript traceback
      ((or (looking-at "[a-zA-Z0-9-:.()? ]+? +at \\([^() \t]+\\) (\\([^:, 
\t()]+\\):\\([0-9]+\\):\\([0-9]+\\))$")
-             (looking-at "[a-zA-Z0-9-:.()? ]+? +at\\( \\)\\([^:, 
\t()]+\\):\\([0-9]+\\):\\([0-9]+\\)$")
-             (looking-at "[a-zA-Z0-9-:.()? ]+?\\( \\)\\([^:, 
\t()]+\\):\\([0-9]+\\)\\(\\)$"))
+          (looking-at "[a-zA-Z0-9-:.()? ]+? +at\\( \\)\\([^:, 
\t()]+\\):\\([0-9]+\\):\\([0-9]+\\)$")
+          (looking-at "[a-zA-Z0-9-:.()? ]+?\\( \\)\\([^:, 
\t()]+\\):\\([0-9]+\\)\\(\\)$"))
       (let* ((file (match-string-no-properties 2))
-                (line-num (match-string-no-properties 3))
-                (col-num (match-string-no-properties 4))
-                but-label)
+             (line-num (match-string-no-properties 3))
+             (col-num (match-string-no-properties 4))
+             but-label)
 
-           ;; For Meteor app errors, remove the "app/" prefix which
-           ;; is part of the build subdirectory and not part of the
-           ;; source tree.
-           (when (and (not (eq col-num "")) (string-match "^app/" file))
-             (setq file (substring file (match-end 0))))
+        ;; For Meteor app errors, remove the "app/" prefix which
+        ;; is part of the build subdirectory and not part of the
+        ;; source tree.
+        (when (and (not (eq col-num "")) (string-match "^app/" file))
+          (setq file (substring file (match-end 0))))
 
-           (setq but-label (concat file ":" line-num)
-                 line-num (string-to-number line-num))
-           (ibut:label-set but-label)
-           (hact 'link-to-file-line file line-num)))
+        (setq but-label (concat file ":" line-num)
+              line-num (string-to-number line-num))
+        (ibut:label-set but-label)
+        (hact 'link-to-file-line file line-num)))
 
      ;; GDB or WDB
      ((looking-at
        ".+ \\(at\\|file\\) \\([^ :,]+\\)\\(:\\|, line \\)\\([0-9]+\\)\\.?$")
       (let* ((file (match-string-no-properties 2))
-                (line-num (match-string-no-properties 4))
-                (but-label (concat file ":" line-num))
-                (gdb-last-file (or (and (boundp 'gud-last-frame)
-                                                    (stringp (car 
gud-last-frame))
-                                                    (car gud-last-frame))
-                                               (and (boundp 'gdb-last-frame)
-                                                    (stringp (car 
gdb-last-frame))
-                                                    (car gdb-last-frame)))))
-           (setq line-num (string-to-number line-num))
-           ;; The `file' typically has no directory component and so may
-           ;; not be resolvable.  `gdb-last-file' is the last file
-           ;; displayed by gdb.  Use its directory if available as a best
-           ;; guess.
-           (when gdb-last-file
-             (setq file (expand-file-name file (file-name-directory 
gdb-last-file))))
-           (ibut:label-set but-label)
-           (hact 'link-to-file-line file line-num)))
+             (line-num (match-string-no-properties 4))
+             (but-label (concat file ":" line-num))
+             (gdb-last-file (or (and (boundp 'gud-last-frame)
+                                     (stringp (car gud-last-frame))
+                                     (car gud-last-frame))
+                                (and (boundp 'gdb-last-frame)
+                                     (stringp (car gdb-last-frame))
+                                     (car gdb-last-frame)))))
+        (setq line-num (string-to-number line-num))
+        ;; The `file' typically has no directory component and so may
+        ;; not be resolvable.  `gdb-last-file' is the last file
+        ;; displayed by gdb.  Use its directory if available as a best
+        ;; guess.
+        (when gdb-last-file
+          (setq file (expand-file-name file (file-name-directory 
gdb-last-file))))
+        (ibut:label-set but-label)
+        (hact 'link-to-file-line file line-num)))
 
      ;; XEmacs assertion failure
      ((looking-at ".+ (file=[^\"\n\r]+\"\\([^\"\n\r]+\\)\", 
line=\\([0-9]+\\),")
       (let* ((file (match-string-no-properties 1))
-                (line-num (match-string-no-properties 2))
-                (but-label (concat file ":" line-num)))
-           (setq line-num (string-to-number line-num))
-           (ibut:label-set but-label)
-           (hact 'link-to-file-line file line-num)))
+             (line-num (match-string-no-properties 2))
+             (but-label (concat file ":" line-num)))
+        (setq line-num (string-to-number line-num))
+        (ibut:label-set but-label)
+        (hact 'link-to-file-line file line-num)))
 
      ;; New DBX
      ((looking-at ".+ line \\([0-9]+\\) in \"\\([^\"]+\\)\"$")
       (let* ((file (match-string-no-properties 2))
-                (line-num (match-string-no-properties 1))
-                (but-label (concat file ":" line-num)))
-           (setq line-num (string-to-number line-num))
-           (ibut:label-set but-label)
-           (hact 'link-to-file-line file line-num)))
+             (line-num (match-string-no-properties 1))
+             (but-label (concat file ":" line-num)))
+        (setq line-num (string-to-number line-num))
+        (ibut:label-set but-label)
+        (hact 'link-to-file-line file line-num)))
 
      ;; Old DBX and HP-UX xdb
      ((or (looking-at ".+ \\[\"\\([^\"]+\\)\":\\([0-9]+\\),") ;; Old DBX
-             (looking-at ".+ \\[\\([^: ]+\\): \\([0-9]+\\)\\]")) ;; HP-UX xdb
+          (looking-at ".+ \\[\\([^: ]+\\): \\([0-9]+\\)\\]")) ;; HP-UX xdb
       (let* ((file (match-string-no-properties 1))
-                (line-num (match-string-no-properties 2))
-                (but-label (concat file ":" line-num)))
-           (setq line-num (string-to-number line-num))
-           (ibut:label-set but-label)
-           (hact 'link-to-file-line file line-num))))))
+             (line-num (match-string-no-properties 2))
+             (but-label (concat file ":" line-num)))
+        (setq line-num (string-to-number line-num))
+        (ibut:label-set but-label)
+        (hact 'link-to-file-line file line-num))))))
 
 ;;; ========================================================================
 ;;; Displays files at specific lines and optional column number
@@ -991,16 +991,16 @@ 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)))
     (when (and (stringp path-line-and-col)
-                          (string-match hibtypes-path-line-and-col-regexp 
path-line-and-col))
+               (string-match hibtypes-path-line-and-col-regexp 
path-line-and-col))
       (let ((file (save-match-data (expand-file-name (hpath:substitute-value 
(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))
-                 (if col-num
-                         (hact 'link-to-file-line-and-column file line-num 
col-num)
-                       (hact 'link-to-file-line file line-num)))))))
+            (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))
+          (if col-num
+              (hact 'link-to-file-line-and-column file line-num col-num)
+            (hact 'link-to-file-line file line-num)))))))
 
 ;;; ========================================================================
 ;;; Jumps to source of Emacs Lisp byte-compiler error messages.
@@ -1010,51 +1010,51 @@ See `hpath:find' function documentation for special 
file display options."
   "Jump to source code for definition associated with an Emacs Lisp 
byte-compiler error message.
 Works when activated anywhere within an error line."
   (when (or (member (buffer-name) '("*Compile-Log-Show*" "*Compile-Log*"
-                                                   "*compilation*"))
-               (save-excursion
-                 (and (re-search-backward "^[^ \t\n\r]" nil t)
-                          (looking-at "While compiling"))))
+                                    "*compilation*"))
+            (save-excursion
+              (and (re-search-backward "^[^ \t\n\r]" nil t)
+                   (looking-at "While compiling"))))
     (let (src buffer-p label)
-         ;; InfoDock and XEmacs
-         (or (and (save-excursion
-                        (re-search-backward
-                         "^Compiling \\(file\\|buffer\\) \\([^ \n]+\\) at "
-                         nil t))
-                      (setq buffer-p (equal (match-string-no-properties 1) 
"buffer")
-                            src (match-string-no-properties 2))
-                      (save-excursion
-                        (end-of-line)
-                        (re-search-backward "^While compiling \\([^ 
\n]+\\)\\(:$\\| \\)"
-                                                    nil t))
-                      (progn
-                        (setq label (match-string-no-properties 1))
-                        (ibut:label-set label (match-beginning 1) (match-end 
1))
-                        ;; Remove prefix generated by actype and ibtype 
definitions.
-                        (setq label (hypb:replace-match-string "[^:]+::" label 
"" t))
-                        (hact 'link-to-regexp-match
-                                  (concat "^\(def[a-z \t]+" (regexp-quote 
label)
-                                              "[ \t\n\r\(]")
-                                  1 src buffer-p)))
-             ;; GNU Emacs
-             (and (save-excursion
-                        (re-search-backward
-                         "^While compiling [^\t\n]+ in \\(file\\|buffer\\) 
\\([^ \n]+\\):$"
-                         nil t))
-                      (setq buffer-p (equal (match-string-no-properties 1) 
"buffer")
-                            src (match-string-no-properties 2))
-                      (save-excursion
-                        (end-of-line)
-                        (re-search-backward "^While compiling \\([^ 
\n]+\\)\\(:$\\| \\)"
-                                                    nil t))
-                      (progn
-                        (setq label (match-string-no-properties 1))
-                        (ibut:label-set label (match-beginning 1) (match-end 
1))
-                        ;; Remove prefix generated by actype and ibtype 
definitions.
-                        (setq label (hypb:replace-match-string "[^:]+::" label 
"" t))
-                        (hact 'link-to-regexp-match
-                                  (concat "^\(def[a-z \t]+" (regexp-quote 
label)
-                                              "[ \t\n\r\(]")
-                                  1 src buffer-p)))))))
+      ;; InfoDock and XEmacs
+      (or (and (save-excursion
+                 (re-search-backward
+                  "^Compiling \\(file\\|buffer\\) \\([^ \n]+\\) at "
+                  nil t))
+               (setq buffer-p (equal (match-string-no-properties 1) "buffer")
+                     src (match-string-no-properties 2))
+               (save-excursion
+                 (end-of-line)
+                 (re-search-backward "^While compiling \\([^ \n]+\\)\\(:$\\| 
\\)"
+                                     nil t))
+               (progn
+                 (setq label (match-string-no-properties 1))
+                 (ibut:label-set label (match-beginning 1) (match-end 1))
+                 ;; Remove prefix generated by actype and ibtype definitions.
+                 (setq label (hypb:replace-match-string "[^:]+::" label "" t))
+                 (hact 'link-to-regexp-match
+                       (concat "^\(def[a-z \t]+" (regexp-quote label)
+                               "[ \t\n\r\(]")
+                       1 src buffer-p)))
+          ;; GNU Emacs
+          (and (save-excursion
+                 (re-search-backward
+                  "^While compiling [^\t\n]+ in \\(file\\|buffer\\) \\([^ 
\n]+\\):$"
+                  nil t))
+               (setq buffer-p (equal (match-string-no-properties 1) "buffer")
+                     src (match-string-no-properties 2))
+               (save-excursion
+                 (end-of-line)
+                 (re-search-backward "^While compiling \\([^ \n]+\\)\\(:$\\| 
\\)"
+                                     nil t))
+               (progn
+                 (setq label (match-string-no-properties 1))
+                 (ibut:label-set label (match-beginning 1) (match-end 1))
+                 ;; Remove prefix generated by actype and ibtype definitions.
+                 (setq label (hypb:replace-match-string "[^:]+::" label "" t))
+                 (hact 'link-to-regexp-match
+                       (concat "^\(def[a-z \t]+" (regexp-quote label)
+                               "[ \t\n\r\(]")
+                       1 src buffer-p)))))))
 
 ;;; ========================================================================
 ;;; Jumps to source associated with a line of output from `patch'.
@@ -1064,24 +1064,24 @@ Works when activated anywhere within an error line."
   "Jump to source code associated with output from the `patch' program.
 Patch applies diffs to source code."
   (when (save-excursion
-             (beginning-of-line)
-             (looking-at "Patching \\|Hunk "))
+          (beginning-of-line)
+          (looking-at "Patching \\|Hunk "))
     (let ((opoint (point))
-             (file) line)
-         (beginning-of-line)
-         (cond ((looking-at "Hunk .+ at \\([0-9]+\\)")
-                (setq line (match-string-no-properties 1))
-                (ibut:label-set line (match-beginning 1) (match-end 1))
-                (if (re-search-backward "^Patching file \\(\\S +\\)" nil t)
-                        (setq file (match-string-no-properties 1))))
-               ((looking-at "Patching file \\(\\S +\\)")
-                (setq file (match-string-no-properties 1)
-                          line "1")
-                (ibut:label-set file (match-beginning 1) (match-end 1))))
-         (goto-char opoint)
-         (when file
-           (setq line (string-to-number line))
-           (hact 'link-to-file-line file line)))))
+          (file) line)
+      (beginning-of-line)
+      (cond ((looking-at "Hunk .+ at \\([0-9]+\\)")
+             (setq line (match-string-no-properties 1))
+             (ibut:label-set line (match-beginning 1) (match-end 1))
+             (if (re-search-backward "^Patching file \\(\\S +\\)" nil t)
+                 (setq file (match-string-no-properties 1))))
+            ((looking-at "Patching file \\(\\S +\\)")
+             (setq file (match-string-no-properties 1)
+                   line "1")
+             (ibut:label-set file (match-beginning 1) (match-end 1))))
+      (goto-char opoint)
+      (when file
+        (setq line (string-to-number line))
+        (hact 'link-to-file-line file line)))))
 
 ;;; ========================================================================
 ;;; Displays Texinfo or Info node associated with Texinfo @xref, @pxref or 
@ref at point.
@@ -1097,72 +1097,72 @@ Texinfo file, then the Texinfo node is shown.
 For @code, @findex, @var and @vindex references, the associated documentation 
string is displayed."
   (when (memq major-mode '(texinfo-mode para-mode))
     (let ((opoint (point))
-             (bol (save-excursion (beginning-of-line) (point))))
-         (cond ((save-excursion
-                      (beginning-of-line)
-                      ;; If a menu item, display the node for the item.
-                      (looking-at "*\\s-+\\([^:\t\n\r]+\\)::"))
-                (hact 'link-to-texinfo-node
+          (bol (save-excursion (beginning-of-line) (point))))
+      (cond ((save-excursion
+               (beginning-of-line)
+               ;; If a menu item, display the node for the item.
+               (looking-at "*\\s-+\\([^:\t\n\r]+\\)::"))
+             (hact 'link-to-texinfo-node
                    nil
-                          (ibut:label-set (match-string 1) (match-beginning 1) 
(match-end 1))))
-               ;; Show doc for any Emacs Lisp identifier references,
-               ;; marked with @code{} or @var{}.
-               ((save-excursion
-                      (and (search-backward "@" bol t)
-                           (or (looking-at "@\\(code\\|var\\){\\([^\} 
\t\n\r]+\\)}")
-                                   (looking-at "@\\(findex\\|vindex\\)[ 
]+\\([^\} \t\n\r]+\\)"))
-                           (>= (match-end 2) opoint)))
-                (let ((type-str (match-string 1))
-                          (symbol (intern-soft (ibut:label-set (match-string 
2) (match-beginning 2) (match-end 2)))))
-                      (when (and symbol (pcase type-str
-                                                  ((or "code" "findex") 
(fboundp symbol))
-                                                  ((or "var" "vindex") (boundp 
symbol))))
-                        (hact 'link-to-elisp-doc symbol))))
-               ;; If at an @node and point is within a node name reference
-               ;; other than the current node, display it.
-               ((save-excursion
-                      (and (save-excursion (beginning-of-line) (looking-at 
"@node\\s-+[^,\n\r]+,"))
-                           (search-backward "," bol t)
-                           (looking-at ",\\s-*\\([^,\n\r]*[^, 
\t\n\r]\\)[,\n\r]")))
-                (hact 'link-to-texinfo-node
+                   (ibut:label-set (match-string 1) (match-beginning 1) 
(match-end 1))))
+            ;; Show doc for any Emacs Lisp identifier references,
+            ;; marked with @code{} or @var{}.
+            ((save-excursion
+               (and (search-backward "@" bol t)
+                    (or (looking-at "@\\(code\\|var\\){\\([^\} \t\n\r]+\\)}")
+                        (looking-at "@\\(findex\\|vindex\\)[ ]+\\([^\} 
\t\n\r]+\\)"))
+                    (>= (match-end 2) opoint)))
+             (let ((type-str (match-string 1))
+                   (symbol (intern-soft (ibut:label-set (match-string 2) 
(match-beginning 2) (match-end 2)))))
+               (when (and symbol (pcase type-str
+                                   ((or "code" "findex") (fboundp symbol))
+                                   ((or "var" "vindex") (boundp symbol))))
+                 (hact 'link-to-elisp-doc symbol))))
+            ;; If at an @node and point is within a node name reference
+            ;; other than the current node, display it.
+            ((save-excursion
+               (and (save-excursion (beginning-of-line) (looking-at 
"@node\\s-+[^,\n\r]+,"))
+                    (search-backward "," bol t)
+                    (looking-at ",\\s-*\\([^,\n\r]*[^, \t\n\r]\\)[,\n\r]")))
+             (hact 'link-to-texinfo-node
                    nil
-                          (ibut:label-set (match-string 1) (match-beginning 1) 
(match-end 1))))
-               ((save-excursion
-                      (and (search-backward "@" bol t)
-                           (looking-at
-                            (concat
-                                 "@p?x?ref\\({\\)\\s-*\\([^,}]*[^,} 
\t\n\r]\\)\\s-*"
-                                 "\\(,[^,}]*\\)?\\(,[^,}]*\\)?"
-                                 "\\(,\\s-*\\([^,}]*[^,} 
\t\n\r]\\)\\)?[^}]*}"))
-                           (> (match-end 0) opoint)))
-                (let* ((show-texinfo-node
-                            (and
-                                 ;; Reference to node within this file.
-                                 (not (match-beginning 6))
-                                 ;; To the left of the reference opening brace.
-                                 (<= opoint (match-beginning 1))))
-                           (node
-                            (save-match-data
-                                  (if (match-beginning 6)
-                                      ;; Explicit filename included in 
reference.
-                                      (format "(%s)%s"
-                                                  (match-string-no-properties 
6)
-                                                  (match-string-no-properties 
2))
-                                    ;; Derive file name from the source file 
name.
-                                    (let ((nodename 
(match-string-no-properties 2))
-                                              (file (file-name-nondirectory 
buffer-file-name)))
-                                      (if show-texinfo-node
-                                              nodename
-                                        (format "(%s)%s"
-                                                    (if (string-match 
"\\.[^.]+$" file)
-                                                            (substring file 0
-                                                                           
(match-beginning 0))
-                                                          "unspecified file")
-                                                    nodename)))))))
-                      (ibut:label-set (match-string 0) (match-beginning 0) 
(match-end 0))
-                      (if show-texinfo-node
-                          (hact 'link-to-texinfo-node nil node)
-                        (hact 'link-to-Info-node node))))))))
+                   (ibut:label-set (match-string 1) (match-beginning 1) 
(match-end 1))))
+            ((save-excursion
+               (and (search-backward "@" bol t)
+                    (looking-at
+                     (concat
+                      "@p?x?ref\\({\\)\\s-*\\([^,}]*[^,} \t\n\r]\\)\\s-*"
+                      "\\(,[^,}]*\\)?\\(,[^,}]*\\)?"
+                      "\\(,\\s-*\\([^,}]*[^,} \t\n\r]\\)\\)?[^}]*}"))
+                    (> (match-end 0) opoint)))
+             (let* ((show-texinfo-node
+                     (and
+                      ;; Reference to node within this file.
+                      (not (match-beginning 6))
+                      ;; To the left of the reference opening brace.
+                      (<= opoint (match-beginning 1))))
+                    (node
+                     (save-match-data
+                       (if (match-beginning 6)
+                           ;; Explicit filename included in reference.
+                           (format "(%s)%s"
+                                   (match-string-no-properties 6)
+                                   (match-string-no-properties 2))
+                         ;; Derive file name from the source file name.
+                         (let ((nodename (match-string-no-properties 2))
+                               (file (file-name-nondirectory 
buffer-file-name)))
+                           (if show-texinfo-node
+                               nodename
+                             (format "(%s)%s"
+                                     (if (string-match "\\.[^.]+$" file)
+                                         (substring file 0
+                                                    (match-beginning 0))
+                                       "unspecified file")
+                                     nodename)))))))
+               (ibut:label-set (match-string 0) (match-beginning 0) (match-end 
0))
+               (if show-texinfo-node
+                   (hact 'link-to-texinfo-node nil node)
+                 (hact 'link-to-Info-node node))))))))
 
 ;;; ========================================================================
 ;;; Activate any GNUS push-button at point.
@@ -1187,21 +1187,21 @@ Examples are \"(hyperbole)Implicit Buttons\" and 
``(hyperbole)C-c /''.
 
 Activates only if point is within the first line of the Info-node name."
   (let* ((node-ref-and-pos (or (hbut:label-p t "\"" "\"" t t)
-                                          ;; Typical GNU Info references; note
-                                          ;; these are special quote marks, 
not the
-                                          ;; standard ASCII characters.
-                                          (hbut:label-p t "‘" "’" t t)
-                                          ;; Regular dual single quotes 
(Texinfo smart quotes)
-                                          (hbut:label-p t "``" "''" t t)
-                                          ;; Regular open and close quotes
-                                          (hbut:label-p t "`" "'" t t)))
-            (ref (car node-ref-and-pos))
-            (node-ref (and (stringp ref)
-                                   (string-match "\\`([^\):]+)" ref)
-                                   (hpath:is-p (car node-ref-and-pos) nil t))))
+                               ;; Typical GNU Info references; note
+                               ;; these are special quote marks, not the
+                               ;; standard ASCII characters.
+                               (hbut:label-p t "‘" "’" t t)
+                               ;; Regular dual single quotes (Texinfo smart 
quotes)
+                               (hbut:label-p t "``" "''" t t)
+                               ;; Regular open and close quotes
+                               (hbut:label-p t "`" "'" t t)))
+         (ref (car node-ref-and-pos))
+         (node-ref (and (stringp ref)
+                        (string-match "\\`([^\):]+)" ref)
+                        (hpath:is-p (car node-ref-and-pos) nil t))))
     (and node-ref
-            (ibut:label-set node-ref-and-pos)
-            (hact 'link-to-Info-node node-ref))))
+         (ibut:label-set node-ref-and-pos)
+         (hact 'link-to-Info-node node-ref))))
 
 ;;; ========================================================================
 ;;; Makes Hyperbole mail addresses output Hyperbole environment info.
@@ -1216,10 +1216,10 @@ a mail composer window would activate this implicit 
button type."
   (when (memq major-mode (list 'mail-mode hmail:composer hnews:composer))
     (let ((addr (thing-at-point 'email)))
       (cond ((null addr) nil)
-               ((member addr '("hyperbole" "hyperbole-users@gnu.org" 
"bug-hyperbole@gnu.org"))
-                (hact 'hyp-config))
-               ((string-match 
"\\(hyperbole\\|hyperbole-users@gnu\\.org\\|bug-hyperbole@gnu\\.org\\)\\(-\\(join\\|leave\\|owner\\)\\)"
 addr)
-                (hact 'hyp-request))))))
+            ((member addr '("hyperbole" "hyperbole-users@gnu.org" 
"bug-hyperbole@gnu.org"))
+             (hact 'hyp-config))
+            ((string-match 
"\\(hyperbole\\|hyperbole-users@gnu\\.org\\|bug-hyperbole@gnu\\.org\\)\\(-\\(join\\|leave\\|owner\\)\\)"
 addr)
+             (hact 'hyp-request))))))
 
 ;;; ========================================================================
 ;;; Makes source entries in Hyperbole reports selectable.
@@ -1236,11 +1236,11 @@ original DEMO file."
     (beginning-of-line)
     (when (looking-at hbut:source-prefix)
       (let ((src (hbut:source)))
-           (when src
-             (unless (stringp src)
-               (setq src (prin1-to-string src)))
-             (ibut:label-set src (point) (progn (end-of-line) (point)))
-             (hact 'hyp-source src))))))
+        (when src
+          (unless (stringp src)
+            (setq src (prin1-to-string src)))
+          (ibut:label-set src (point) (progn (end-of-line) (point)))
+          (hact 'hyp-source src))))))
 
 ;;; ========================================================================
 ;;; Executes an angle bracket delimited Hyperbole action, Elisp
@@ -1266,11 +1266,11 @@ 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* ((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))
-            actype action args lbl var-flag)
+         (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))
+         actype actype-sym action args lbl var-flag)
     ;; Continue only if start-delim is either:
     ;;     at the beginning of the buffer
     ;;     or preceded by a space character or a grouping character
@@ -1280,48 +1280,50 @@ arg1 ... argN '>'.  For example, <mail nil 
\"user@somewhere.org\">."
     ;;     at the end of the buffer
     ;;     or is followed by a space, punctuation or grouping character.
     (when (and ibut-key (or (null (char-before start-pos))
-                                       (memq (char-syntax (char-before 
start-pos)) '(?\  ?\> ?\( ?\))))
-                  (not (memq (char-syntax (char-after (1+ start-pos))) '(?\  
?\>)))
-                  (or (null (char-after end-pos))
-                          (memq (char-syntax (char-after end-pos)) '(?\  ?\> 
?. ?\( ?\)))
-                          ;; Some of these characters may have 
symbol-constituent syntax
-                          ;; rather than punctuation, so check them 
individually.
-                          (memq (char-after end-pos) '(?. ?, ?\; ?: ?! ?\' 
?\"))))
+                            (memq (char-syntax (char-before start-pos)) '(?\  
?\> ?\( ?\))))
+               (not (memq (char-syntax (char-after (1+ start-pos))) '(?\  
?\>)))
+               (or (null (char-after end-pos))
+                   (memq (char-syntax (char-after end-pos)) '(?\  ?\> ?. ?\( 
?\)))
+                   ;; Some of these characters may have symbol-constituent 
syntax
+                   ;; rather than punctuation, so check them individually.
+                   (memq (char-after end-pos) '(?. ?, ?\; ?: ?! ?\' ?\"))))
       (setq lbl (ibut:key-to-label ibut-key))
       ;; Handle $ preceding var name in cases where same name is
       ;; bound as a function symbol
       (when (string-match "\\`\\$" lbl)
-           (setq var-flag t
-                 lbl (substring lbl 1)))
-      (setq actype (if (string-match-p " "  lbl) (car (split-string lbl)) lbl)
-               actype (or (intern-soft (concat "actypes::" actype))
-                              (intern-soft actype)))
+        (setq var-flag t
+              lbl (substring lbl 1)))
+      (setq actype (if (string-match-p " " lbl) (car (split-string lbl)) lbl)
+            actype-sym (intern-soft (concat "actypes::" actype))
+            actype (or (and (or (fboundp actype-sym) (boundp actype-sym)) 
actype-sym)
+                       (progn (setq actype-sym (intern-soft actype))
+                              (and (or (fboundp actype-sym) (boundp 
actype-sym)) actype-sym))))
       ;; Ignore unbound symbols
       (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)
-           (setq action (read (concat "(" lbl ")"))
-                 args (cdr action))
-           (cond ((and (symbolp actype) (fboundp actype)
-                           (string-match "-p\\'" (symbol-name actype)))
-                  ;; Is a function with a boolean result
-                  (setq action `(display-boolean ',action)
-                            actype #'display-boolean))
-                 ((and (null args) (symbolp actype) (boundp actype)
-                           (or var-flag (not (fboundp actype))))
-                  ;; Is a variable, display its value as the action
-                  (setq args `(',actype)
-                            action `(display-variable ',actype)
-                            actype #'display-variable)))
-           ;; Necessary so can return a null value, which actype:act cannot.
-           (let ((hrule:action
-                          (if (eq hrule:action #'actype:identity)
+        (ibut:label-set lbl start-pos end-pos)
+        (setq action (read (concat "(" lbl ")"))
+              args (cdr action))
+        (cond ((and (symbolp actype) (fboundp actype)
+                    (string-match "-p\\'" (symbol-name actype)))
+               ;; Is a function with a boolean result
+               (setq action `(display-boolean ',action)
+                     actype #'display-boolean))
+              ((and (null args) (symbolp actype) (boundp actype)
+                    (or var-flag (not (fboundp actype))))
+               ;; Is a variable, display its value as the action
+               (setq args `(',actype)
+                     action `(display-variable ',actype)
+                     actype #'display-variable)))
+        ;; Necessary so can return a null value, which actype:act cannot.
+        (let ((hrule:action
+               (if (eq hrule:action #'actype:identity)
                    #'actype:identity
                  #'actype:eval)))
           (if (eq hrule:action #'actype:identity)
-                 (apply hrule:action actype args)
-               (apply hrule:action actype (mapcar #'eval args))))))))
+              (apply hrule:action actype args)
+            (apply hrule:action actype (mapcar #'eval args))))))))
 
 ;;; ========================================================================
 ;;; Inserts completion into minibuffer or other window.
@@ -1331,8 +1333,8 @@ arg1 ... argN '>'.  For example, <mail nil 
\"user@somewhere.org\">."
   "Insert completion at point into minibuffer or other window."
   (let ((completion (hargs:completion t)))
     (and completion
-            (ibut:label-set completion)
-            (hact 'completion))))
+         (ibut:label-set completion)
+         (hact 'completion))))
 
 
 (run-hooks 'hibtypes-end-load-hook)
diff --git a/hui.el b/hui.el
index 0490916..4b265b6 100644
--- a/hui.el
+++ b/hui.el
@@ -83,9 +83,10 @@ Default is the current button."
   (hui:hbut-operate #'ebut:act "Activate explicit button: " but))
 
 (defun hui:ebut-create (&optional start end)
-  "Create an explicit Hyperbole button starting from label between optional 
START and END.
-Indicates by delimiting and adding any necessary instance number of the button
-label."
+  "Interactively create an explicit Hyperbole button starting from label 
between optional START and END region points.
+Indicate button creation by delimiting and adding any necessary instance 
number to the button label.
+
+For programmatic creation, use `ebut:program' instead."
   (interactive (list (and (marker-position (hypb:mark-marker t))
                          (region-beginning))
                     (and (marker-position (hypb:mark-marker t))
diff --git a/kotl/kotl-mode.el b/kotl/kotl-mode.el
index 93b05e2..e209ff2 100644
--- a/kotl/kotl-mode.el
+++ b/kotl/kotl-mode.el
@@ -282,6 +282,26 @@ See `center-line' for more info."
     ;; Move to editable point if need be.
     (kotl-mode:to-valid-position)))
 
+(defun kotl-mode:copy-absolute-klink-to-kill-ring (&optional pos)
+  "Add an absolute kcell reference (from optional POS or point) for use 
outside the outline as a new kill ring entry."
+  (interactive "d")
+  (kill-new (kcell-view:absolute-reference pos)))
+
+(defun kotl-mode:copy-relative-klink-to-kill-ring (&optional pos)
+  "Add a relative kcell reference (from optional POS or point) as a new kill 
ring entry."
+  (interactive "d")
+  (kill-new (kcell-view:reference pos)))
+
+(defun kotl-mode:copy-absolute-klink-to-register (register pos)
+  "Copy into REGISTER an absolute kcell reference (from optional POS or 
point)."
+  (interactive "cCopy to register: \nd")
+  (set-register register (kcell-view:absolute-reference pos)))
+
+(defun kotl-mode:copy-relative-klink-to-register (register pos)
+  "Copy into REGISTER a relative kcell reference (from optional POS or point)."
+  (interactive "cCopy to register: \nd")
+  (set-register register (kcell-view:reference pos)))
+
 (defun kotl-mode:copy-region-as-kill (start end)
   "Copy region between START and END within a single kcell to kill ring."
   (interactive "r")
diff --git a/kotl/kview.el b/kotl/kview.el
index 152d860..6c5e8f5 100644
--- a/kotl/kview.el
+++ b/kotl/kview.el
@@ -428,11 +428,22 @@ If between kcells, move to the previous one.  The current 
cell may be hidden."
               (point)
             (error "(kcell-view:to-label-end): Can't find end of current 
cell's label"))))))
 
+(defun kcell-view:absolute-reference (&optional pos)
+  "Return a reference to the kcell at optional POS or point for use in a link.
+The reference is a string of the form, \"<kcell-file, cell-ref>\"
+where cell-ref is as described in the documentation for
+`kcell:ref-to-id'.  Kcell-file is an absolute path to the current
+Koutline file."
+  (format "<%s, %s=%s>" buffer-file-name
+         (kcell-view:label pos) (kcell-view:idstamp pos)))
+
 (defun kcell-view:reference (&optional pos relative-dir)
   "Return a reference to the kcell at optional POS or point for use in a link.
-The reference is a string of the form, \"<kcell-file, cell-ref>\" where
-cell-ref is as described in the documentation for `kcell:ref-to-id'.
-Kcell-file is made relative to optional RELATIVE-DIR before it is returned."
+The reference is a string of the form, \"<kcell-file, cell-ref>\"
+where cell-ref is as described in the documentation for
+`kcell:ref-to-id'.  Kcell-file is made relative to optional
+RELATIVE-DIR (or `default-directory' if RELATIVE-DIR is not given
+or is nil), before it is returned."
   (format "<%s, %s=%s>" (hpath:relative-to buffer-file-name relative-dir)
          (kcell-view:label pos) (kcell-view:idstamp pos)))
 



reply via email to

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