[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)))
- [elpa] externals/hyperbole 8d77205 08/50: 7.1.3a - Add key bindings and finish Kotl Org table mode support, (continued)
- [elpa] externals/hyperbole 8d77205 08/50: 7.1.3a - Add key bindings and finish Kotl Org table mode support, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 4ddeaf6 10/50: Remove Makefile.maintenance, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 28a1e0c 18/50: Use xdg-open to dispatch to user preferences for display alist (#40), Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 7b92152 11/50: Merge pull request #39 from rswgnu/add-maintenance-makefile-with-web-site-support, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 7be77e0 12/50: Update git cache interactively, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole ad16470 13/50: Document Koutline Org table support; allow ibtype reprioritization, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 9f5a787 14/50: Add hypb-maintenance.el, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole e914edb 15/50: Add hypb-maintenance.el to MANIFEST, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole b4f7e49 16/50: Move HY-TALK.org button data to HY-TALK/.hypb, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 781bbb5 17/50: Merge pull request #41 from rswgnu/update-git-repo-cache-interactively, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 22439e6 20/50: Add klink ref cmds, ebut:program and defiblink for programmatic creation,
Stefan Monnier <=
- [elpa] externals/hyperbole e999fc7 21/50: Stop man-apropos from matching to log file entries, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole cfc61a3 22/50: Eliminate a number of order-based byte-compilation warnings, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole e3544c8 23/50: Revert improper application of "Use \\0 for matched Nth substitution", Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole f1b2cba 24/50: Add dependency on hvar to resolve use of var:remove-all (#43), Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 312c858 25/50: kexport.el - use lowercase HTML tags; mail-address ibtype allow trigger in any major mode, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole a3b9d6d 26/50: Merge branch 'master' of github.com:rswgnu/hyperbole, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 398f8e4 32/50: Add hypb:def-to-buffer to hypb.el for fast def copying, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole a831ef9 36/50: Fix bug #46606 by replacing hkey-define-key with hkey-global-set-key, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole 8969fe9 43/50: Merge branch 'master' of hyperbole, Stefan Monnier, 2021/03/17
- [elpa] externals/hyperbole c8947dd 47/50: Merge branch 'master' of hyperbole, Stefan Monnier, 2021/03/17