summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2019-08-14 04:29:57 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2019-08-14 04:29:57 -0400
commit6e555e763567c66ad8e50724a7dd5e286dbb1e65 (patch)
tree86fb29daa274d8007063babec826719154bf087e
parent98a5ecb3bf80f2b53523c769459d1a1a49491125 (diff)
parent332ef336a7ad87e25c0563bfeaf0e6758d52c59c (diff)
Merge remote-tracking branch 'hyperbole/master' into externals/hyperbolescratch/hyperbole-lexbind
-rw-r--r--.gitignore2
-rw-r--r--Changes552
-rw-r--r--DEMO236
-rw-r--r--HY-ABOUT5
-rw-r--r--HY-ANNOUNCE207
-rw-r--r--HY-NEWS284
-rw-r--r--HY-WHY.kotl55
-rw-r--r--MANIFEST2
-rw-r--r--Makefile23
-rw-r--r--README.md16
-rw-r--r--README.md.html28
-rw-r--r--_config.yml1
-rw-r--r--_hypbbin2234 -> 4188 bytes
-rw-r--r--hact.el5
-rw-r--r--hactypes.el62
-rw-r--r--hargs.el87
-rw-r--r--hbdata.el13
-rw-r--r--hbmap.el2
-rw-r--r--hbut.el1049
-rw-r--r--hib-kbd.el131
-rw-r--r--hib-social.el281
-rw-r--r--hibtypes.el242
-rw-r--r--hinit.el21
-rw-r--r--hload-path.el6
-rw-r--r--hmh.el2
-rw-r--r--hmouse-drv.el243
-rw-r--r--hmouse-info.el10
-rw-r--r--hmouse-key.el4
-rw-r--r--hmouse-mod.el2
-rw-r--r--hmouse-sh.el351
-rw-r--r--hmouse-tag.el45
-rw-r--r--hpath.el495
-rw-r--r--hsettings.el65
-rw-r--r--hsys-org.el261
-rw-r--r--hsys-www.el2
-rw-r--r--htz.el47
-rw-r--r--hui-em-but.el6
-rw-r--r--hui-jmenu.el7
-rw-r--r--hui-menu.el19
-rw-r--r--hui-mini.el47
-rw-r--r--hui-mouse.el36
-rw-r--r--hui-select.el33
-rw-r--r--hui-treemacs.el63
-rw-r--r--hui-window.el77
-rw-r--r--hui-xe-but.el466
-rw-r--r--hui.el254
-rw-r--r--hversion.el20
-rw-r--r--hvm.el2
-rw-r--r--hypb.el104
-rw-r--r--hyperbole-pkg.el8
-rw-r--r--hyperbole.el53
-rw-r--r--hyrolo-logic.el2
-rw-r--r--hyrolo-menu.el21
-rw-r--r--hyrolo.el89
-rw-r--r--hywconfig.el8
-rw-r--r--kotl/kexport.el14
-rw-r--r--kotl/kfill.el9
-rw-r--r--kotl/kmenu.el12
-rw-r--r--kotl/kotl-autoloads.el45
-rw-r--r--kotl/kotl-mode.el44
-rw-r--r--kotl/kproperty.el2
-rw-r--r--kotl/kview.el58
-rw-r--r--kotl/kvspec.el79
-rw-r--r--man/hkey-help.txt7
-rw-r--r--man/hyperbole.html1277
-rw-r--r--man/hyperbole.infobin489710 -> 514598 bytes
-rw-r--r--man/hyperbole.pdfbin1263857 -> 1272682 bytes
-rw-r--r--man/hyperbole.texi676
-rw-r--r--man/im/C-hh.pngbin898836 -> 737355 bytes
-rw-r--r--man/im/wgrid4x3.pngbin0 -> 3854568 bytes
-rw-r--r--man/version.texi8
-rw-r--r--set.el2
-rw-r--r--[-rwxr-xr-x]smart-clib-sym15
-rw-r--r--[-rwxr-xr-x]topwin.py2
74 files changed, 5416 insertions, 2986 deletions
diff --git a/.gitignore b/.gitignore
index 751c293..bc71d61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,7 @@
*-autoloads.el
*-pkg.el
-# Copyright (C) 2016 Free Software Foundation, Inc.
+# Copyright (C) 2016-2019 Free Software Foundation, Inc.
# See the "HY-COPY" file for license information.
# This file is part of GNU Hyperbole.
diff --git a/Changes b/Changes
index c3e5d81..1a3004f 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,532 @@
+2019-08-06 Bob Weiner <rsw@gnu.org>
+
+* hyrolo-menu.el (infodock-hyrolo-menu): Fixed Edit-Rolo to call a function rather than an sexp.
+
+2019-08-05 Bob Weiner <rsw@gnu.org>
+
+* hypb.el (hypb:rgrep-command): Changed to use zgrep only when it is the BSD version,
+ since only that one supports the options needed by Hyperbole.
+
+2019-07-28 Bob Weiner <rsw@gnu.org>
+
+* DEMO, man/hyperbole.texi (Implicit Button Type Summaries): Updated to expanded
+ Org mode support.
+
+* hib-kbd.el:
+ man/hyperbole.texi (Implicit Button Type Summaries, Glossary): Changed hib-kbd
+ key-sequence to key-series to indicate can be multiple key sequences. Added
+ def. to Glossary.
+ (kbd-key:doc): Changed to call hkey-help rather than trigger
+ an error when key-series is not a single bound key sequence.
+
+2019-07-23 Bob Weiner <rsw@gnu.org>
+
+* man/hyperbole.texi (Referent Display): Rewrote and added details on how the 4 types
+ of referents are processed.
+
+2019-07-22 Bob Weiner <rsw@gnu.org>
+
+* hargs.el (hargs:at-p): Added hbut support (ebut or ibut).
+
+* hui.el (hui:hbut-act): Generalized to handle both explicit and labeled implicit buttons.
+ (hui:ebut-act): Added and replaced use of hui:hbut-act in menus.
+
+* hbut.el (ebut:to, gbut:to, hbut:get): Added.
+
+2019-07-21 Bob Weiner <rsw@gnu.org>
+
+* man/hyperbole.texi (Implicit Button Types): Split off type descriptions to this new
+ subsection and added these types: ripgrep-msg, ipython-stack-frame, link-to-ibut,
+ link-to-gbut, link-to-ebut.
+ (Implicit Buttons): Added description and example of implicit button labels.
+ (Glossary): Updated Implicit Button and Global Button entries with changes.
+ DEMO (Implicit Buttons): Added description and example of implicit button labels.
+ (Action Types): link-to-gbut, link-to-ibut - Added.
+
+* hbut.el (gbut:act): Improved error message for implicit global buttons.
+
+* hui-menu.el (infodock-hyperbole-menu): Implicit-Button/Label - Added to add a label.
+ Implicit-Button/Rename - Added to rename the label of an implicit button.
+ hui-mini.el (hui:menus): Added Ibut/Label and Ibut/Rename.
+
+* hbut.el (hbut:key-to-label): Moved ebut:key-to-label body here and aliased that
+ function to this hbut one since is now used by ibut:key-to-label as well.
+ (hbut:label-to-key, hbut:key-src-set-buffer, hbut:key-src,
+ hbut:key-src-fmt, hbut:key-src): Same change.
+ (ibut:rename): Added and used in hui:ibut-rename.
+
+2019-07-18 Bob Weiner <rsw@gnu.org>
+
+* hbut.el (ibut:label-separator): Added.
+
+2019-07-17 Bob Weiner <rsw@gnu.org>
+
+* hbut.el (ibut:alist, ibut:list, ibut:map): Added.
+ (ebut:map): Moved body to hbut:map and called from ebut:map and ibut:map.
+ Removed start-delim and end-delim arguments in ebut:map.
+
+* hargs.el (hargs:at-p): Added support for reading ibutton labels.
+
+2019-07-16 Bob Weiner <rsw@gnu.org>
+
+* hui.el (hui:ibut-label-create, hui:ibut-rename, hui:ibut-message): Added.
+
+2019-07-15 Bob Weiner <rsw@gnu.org>
+
+* hibtypes.el (debugger-source): Handled Python tracebacks properly.
+
+2019-07-14 Bob Weiner <rsw@gnu.org>
+
+* hibtypes.el (link-to-ebut, link-to-gbut, link-to-ibut):
+ hactypes.el (link-to-ibut):
+ hbut.el (ibut:to): Fixed small logic errors with lbl-keys and save-excursion in these functions.
+
+2019-07-13 Bob Weiner <rsw@gnu.org>
+
+* hsys-org.el (hsys-org-set-ibut-label): Added and used in org-mode ibtype.
+ (org-mode, hsys-org-at-block-start-p): Added Action Key activation of Org blocks when
+ on 1st line of def.
+
+* hibtypes.el (link-to-gbut, glink:start, glink:end): Added for in-buffer links to global buttons.
+ (link-to-ebut, elink:start, elink:end): Added for in-buffer links to explicit buttons.
+ (link-to-ibut, ilink:start, ilink:end): Added for in-buffer links to implicit buttons.
+
+* hbut.el (ebut:label-p): Updated to better handle whether point is
+ between specified delimiters.
+
+2019-07-12 Bob Weiner <rsw@gnu.org>
+
+* hbut.el (ebut:key-src-set-buffer, hbut:key-src-set-buffer, hbut:key-list,
+ hbut:ebut-key-list, hbut:ibut-key-list, hbut:label-list): Added
+ to allow selection of labeled Hyperbole buttons in currrent buffer by name.
+ (ibut:to): Added to move to an implicit button in the current buffer
+ matching a label key.
+
+2019-07-11 Bob Weiner <rsw@gnu.org>
+
+* hargs.el (hargs:at-p): Added support for reading global button arguments.
+
+* hactypes.el (link-to-gbut): Updated to handle global labeled implicit buttons.
+
+* hbut.el (gbut:get): Added.
+
+2019-07-10 Bob Weiner <rsw@gnu.org>
+
+* man/hyperbole.texi (Invisible Text Searches): Added missing {M-s i} key sequence.
+
+* hibtypes.el (Info-node): Modified to skip costly hpath:is-p if ref
+ string is not of the right format.
+ (hibtypes-path-line-and-col-regexp, pathname-line-and-column): Updated
+ to handle Elisp variables with colons.
+
+2019-07-09 Bob Weiner <rsw@gnu.org>
+
+* hbut.el (ibut:at-p): Conditionalized on (not (hbut:outside-comment-p)).
+ (hbut:map, ibut:label-map): Added.
+ (ibut:key-src, ibut:key-to-label, ibut:label-to-key, ibut:summarize): Added.
+ Global, labeled implicit buttons now exist!
+
+2019-07-08 Bob Weiner <rsw@gnu.org>
+
+* hbut.el (ibut:label-separator-regexp, hbut:outside-comment-p): Added doc
+for expanded Org mode reference handling.
+
+2019-07-01 Bob Weiner <rsw@gnu.org>
+
+* hbut.el (gbut:ibut-key-list): Added.
+
+* hui.el (hui:hbut-term-highlight, hui:hbut-term-unhighlight): Fixed so save-excursion is outermost.
+
+2019-06-29 Bob Weiner <rsw@gnu.org>
+
+* hbut.el (ebut:get, ebut:at-p, ebut:label-to-key, ibut:at-type-p): Simplified conditionals using 'when'.
+ (ibut:label-start, ibut:label-end, ibut:label-p, ibut:get,
+ ibut:next-occurrence, ibut:label-regexp): Added.
+ (hbut:label-regexp): Added to support labeled implicit buttons too.
+ (ebut:label-regexp): Aliased to hbut:label-regexp.
+ (hbut:label-p): Updated to handle implicit button labels.
+
+2019-06-23 Bob Weiner <rsw@gnu.org>
+
+* hsys-org.el: Added many new predicates and code to handle navigation between Org
+ mode internal links and their targets, as well as radio target definitions and their links.
+ (hsys-org-mode-function, hsys-org-mode-p): Added to determine when hsys-org actions
+ are activated.
+
+* hypb.el (hypb:region-with-text-property-value): Added and used in hysy-org.el.
+
+* kotl/kfill.el (set-fill-prefix): Updated to better match standard Emacs functiion.
+
+2019-06-22 Bob Weiner <rsw@gnu.org>
+
+* hyrolo.el (hyrolo-add): Fixed bug in call to match-string-no-properties.
+
+2019-06-21 Bob Weiner <rsw@gnu.org>
+
+* kotl/kotl-mode.el (kotl-mode): Set fill-paragraph-function rather than overloading
+ fill-paragraph.
+ kotl/kfill.el (kfill:fill-paragraph): Renamed and used only in kotl-mode. Also
+ temporarily set fill-paragraph-handle-comment to t and made prefix arg optional.
+ (kfill:funcall): Removed.
+ (kfill:function-table): Removed.
+ (kfill:do-auto-fill): Temporarily set fill-paragraph-handle-comment to t.
+
+2019-06-20 Bob Weiner <rsw@gnu.org>
+
+* hsys-org.el (org-link): Changed to call org-open-at-point which handles internal
+ org links, fixing following links such as radio targets.
+ (hsys-org-thing-at-p, hsys-org-target-at-p): Added.
+
+* hpath.el (hpath:texinfo-section-pattern): Added and used in hpath:to-markup-anchor to
+ jump to specific Texinfo sections.
+
+2019-06-19 Bob Weiner <rsw@gnu.org>
+
+* man/hyperbole.texi (Referent Display): Added doc of hpath:native-image-suffixes.
+
+* hpath.el (hpath:find-program): Changed to prioritize hpath:native-image-suffixes over
+ hpath:internal-display-alist over hpath:external-display-alist-macos instead of the
+ reverse. This prevents external viewers from being used when internal viewers are
+ also in effect.
+
+2019-06-18 Bob Weiner <rsw@gnu.org>
+
+* hibtypes.el (grep-msg): Allowed for null char in place of first colon in colored grep output lines.
+
+2019-06-17 Bob Weiner <rsw@gnu.org>
+
+* hactypes.el (link-to-gbut): Added.
+ hui.el (hui:link-possible-types): Added link-to-gbut.
+
+2019-06-16 Bob Weiner <rsw@gnu.org>
+
+* hyrolo.el: Replaced buffer-substring-no-properties with match-string-no-properties where possible.
+ (hyrolo-entry-regexp): Changed to require whitespace following the entry prefix.
+ (hyrolo-entry-group-number): Added.
+
+2019-06-12 Bob Weiner <rsw@gnu.org>
+
+* hib-kbd.el (kbd-key): Fixed preceding character test to not depend on the buffer's syntax table,
+ potentially missing kbd-key ibuts, notably ones using the universal argument.
+
+* hbut.el (ibut:at-type-p): Added to test if point is on a specific type of implicit button.
+
+* hib-kbd.el (kbd-key:normalize): Removed aggregation of C-u arguments into something like: C-u(16)
+ as this no longer works in current Emacs and causes an error. Now this just stays as "C-u C-u".
+
+2019-06-11 Bob Weiner <rsw@gnu.org>
+
+* hypb.el (hypb:format-quote): Modified to return non-string args as is rather than ignoring them so
+ this can be used across any argument set. Used in hypb:error.
+
+2019-06-10 Bob Weiner <rsw@gnu.org>
+
+* htz.el (htz:date-parse): Fixed bug, missing seconds in format 4 leading to invalid time strings saved
+ on MSWindows machines (and maybe more). Allow for this in style 5 which is how Hyperbole stores dates.
+ (htz:time-make-string): Chop off any spurious digits at the right.
+
+* hactypes.el (link-to-ibut): Added.
+ hui.el (hui:link-possible-types): Added ibut:at-p call for link-to-ibut.
+
+2019-06-07 Bob Weiner <rsw@gnu.org>
+
+* hibtypes.el (debugger-source): Added support for pytype package errors (close to Python pdb ones)
+
+2019-06-06 Bob Weiner <rsw@gnu.org>
+
+* hpath.el (hpath:find): Removed file-relative-name from error calls
+ because does not work when current-directory and filename are on different
+ drives under Windows at least through Emacs 26.
+ (hpath:find): Fixed that default-directory was not set to current
+ button's location, so path was expanded relative to another
+ directory, notably in hpath:validate call.
+
+2019-06-05 Bob Weiner <rsw@gnu.org>
+
+* hpath.el (hpath:is-p): Tightened remote-path check to prevent matches that end with :line-num or :col-num.
+
+2019-06-04 Bob Weiner <rsw@gnu.org>
+
+* hactypes.el (annot-bib): Changed to find referent from the end of the buffer rather than beginning,
+ to avoid multiple earlier annot-bib buttons.
+* DEMO (Hyperbole Source Buttons): Changed example button from annot-bib to kbd-key.
+
+* kotl/kvspec.el (kvspec:hide-levels): Changed behavior so view updates to default level clipping when
+ 'l' is excluded from the viewspec.
+
+2019-06-02 Bob Weiner <rsw@gnu.org>
+
+* kotl/kvspec.el (kvspec:lines-to-show): Changed behavior so view updates to default cell clipping when
+ 'c' is excluded from the viewspec.
+
+* kotl/kotl-mode.el (kotl-mode:show-all): Limited (kvspec:update t) call to interactive usage only.
+ When kotl-mode:show-all is called in kvspec:update-view, it doesn't overwrite the to be set viewspec.
+
+* kotl/kvspec.el (kvspec:show-lines-per-cell)
+ (kvspec:show-lines-this-cell): Fixed viewspec 'c0' to expand visible cells properly.
+
+2019-06-01 Bob Weiner <rsw@gnu.org>
+
+* hibtypes.el (ipython-stack-frame): Added to handle ipython stack traces and exceptions.
+
+2019-05-30 Bob Weiner <rsw@gnu.org>
+
+* hyperbole.el (hkey-maybe-global-set-key): Fix missing no-add argument
+ to hkey-global-set-key call.
+
+2019-05-26 Bob Weiner <rsw@gnu.org>
+
+* hui-mouse.el (hkey-alist): For Python files, use derived-mode-p and add
+ support for helm-pydoc buffers.
+
+==============================================================================
+V7.0.3a changes ^^^^:
+==============================================================================
+
+2019-05-11 Bob Weiner <rsw@gnu.org>
+
+* man/hyperbole.texi (External Viewers): Commented out reference to mailcap use
+ since it is presently not used (commented out in the code).
+
+* hpath.el (hpath:find): Fixed filename and path ordering error when
+ path contains a variable and a hash anchor.
+
+* DEMO (POSIX and MSWindows Paths): Added this section.
+* HY-WHY.kotl: Added a reference to that section.
+
+2019-05-09 Bob Weiner <rsw@gnu.org>
+
+* hmouse-drv.el (hkey-drag-item):
+ (hmouse-click-to-drag-item): Added and thereby changed
+ {M-o i} to trigger an error if not on an item to drag. This also prevent
+ Hyperbole explicit button creation from being invoked which can be
+ confusing to users.
+* DEMO (Displaying File and Buffer Items and Moving Buffers): Updated with
+ {M-o i} change.
+
+2019-05-07 Bob Weiner <rsw@gnu.org>
+
+* hpath.el (hpath:directory-expand-alist: Added to store the reverse of
+ each WSL mount-point for when converting from mswindows-to-posix. Set
+ in hpath:cache-mswindows-mount-points.
+ (hpath:cache-mswindows-mount-points): Downcase all mounted Windows paths.
+ (hpath:mswindows-path-posix-mount-alist): Added.
+
+2019-05-05 Bob Weiner <rsw@gnu.org>
+
+* hmouse-tag.el (smart-jedi-find-file): Added.
+ (smart-python-jedi-to-definition-p): Improved to use
+ hpath:display-where to display target when possible, i.e. when the
+ emacs-jedi project accepts our pull-request that adds this feature.
+
+2019-04-22 Bob Weiner <rsw@gnu.org>
+
+* hversion.el: Pushed BW changes for 7.0.2c test update.
+
+* hargs.el (hargs:delimited): Added exclude-regexp argument.
+* hpath.el (hpath:delimited-possible-path): Used above new argument
+ to prevent matching to strings that include string quotes.
+
+2019-04-21 Bob Weiner <rsw@gnu.org>
+
+* man/hkey-help.txt: Added Company-mode and Treemacs entries.
+
+* hui-window.el (hmouse-alist-add-window-handlers): Renamed from hui-window--register.
+
+* man/hyperbole.texi (Smart Key - Company Mode): Added.
+
+2019-03-11 Bob Weiner <rsw@gnu.org>
+
+* man/hyperbole.texi (Implicit Buttons, gitlab-reference):
+ DEMO (Gitlab (Remote) References): Added these sections.
+
+2019-02-16 Bob Weiner <rsw@gnu.org>
+
+* hui-window.el (smart-window-of-coords): Handled null coords parameter.
+
+2019-02-10 Bob Weiner <rsw@gnu.org>
+
+* hmouse-drv.el (hkey-drag-to): Fixed to match documentation that says will
+ create an explicit file link button if called anywhere other than on
+ a listing item.
+
+* hui-treemacs.el (smart-treemacs-modeline): Replaced old call of
+ treemacs-buffer-exists? with new calls to treemacs-current-visibility
+ and treemacs-get-local-buffer for Treemacs V2.
+
+2019-02-06 Bob Weiner <rsw@gnu.org>
+
+* hibtypes.el (ripgrep-msg): Tightened match to ignore empty potential filenames
+ that matched when they were expanded to the current directory.
+
+2019-02-05 Bob Weiner <rsw@gnu.org>
+
+* hmouse-tag.el (smart-lisp-mode-p): Removed change-log-mode.
+ (smart-lisp-at-change-log-tag-p): Added so can match
+ only to bound Elisp entities in change-log-mode with '-' in
+ the middle of their names to prevent false positives.
+ hui-mouse.el (hkey-alist): Added tightened change-log-mode handling.
+ man/hyperbole.texi (Smart Key - Lisp Source Code): Documented change.
+
+* hargs.el (hargs:delimited): Fixed that strings on lines with an odd number
+ of delimiters might fail to match. Since strings can span lines but this
+ function matches only strings that start on the current line, when
+ start-delim and end-delim are the same and there are an odd number of
+ delimiters in the search range, assume point is within a
+ string and not between two other strings.
+ For example, with the following text and point within "DEMO", its path
+ previously was not found:
+ For each site, the links are properly maintained. See "DEMO#Path
+ suffixes and Variables" and "DEMO#Path Prefixes". "DEMO"
+
+* hui-treemacs.el: Deleted treemacs-mode from aw-ignored-buffers so can select
+ a Treemacs window via ace-window.
+
+2019-02-04 Bob Weiner <rsw@gnu.org>
+
+* hui-mouse.el (smart-dired-assist): Prevented any region selection from
+ causing multiple files to be marked for deletion; we want to mark
+ only one.
+
+* hibtypes.el (annot-bib): Stopped this from activating when in org-mode to avert false positives.
+ (markdown-follow-inline-link-p, markdown-internal-link): Added ibut:label-set
+ to show a decent approximation of the button label when displaying help.
+
+2019-02-03 Bob Weiner <rsw@gnu.org>
+
+* hversion.el: Pushed BW changes for 7.0.2b test update.
+
+* hui-treemacs.el (treemacs-quit): Defined if treemacs doesn't and used.
+
+2019-02-03 Mats Lidell <matsl@gnu.org>
+
+* hui-treemacs.el (treemacs-version): Require v2 or higher.
+
+* hsettings.el (hyperbole-default-web-search-term-max-lines):
+ (hyperbole-default-web-search-term): Added.
+
+* hpath.el (hpath:tramp-file-name-regexp): Added and used in hpath:remote-at-p.
+
+2019-02-02 Bob Weiner <rsw@gnu.org>
+
+* hsys-org.el (org-mode): Support derived modes too.
+
+2019-01-31 Bob Weiner <rsw@gnu.org>
+
+* man/hyperbole.texi (Keyboard Drags): Added doc of {M-o r <window-id>},
+ replace selected window's buffer with that of another window.
+
+* man/hyperbole.texi (Keyboard Drags):
+ DEMO (Displaying File and Buffer Items and Moving Buffers):
+ Added doc of {M-o m <window-id>}, swap selected window's buffer with
+ that of <window-id>'s.
+
+2019-01-30 Bob Weiner <rsw@gnu.org>
+
+* hmouse-drv.el (hkey-drag-to): Fixed to handle the case where it is
+ called but no drag has taken place, i.e. when invoked from the keyboard
+ via Ace Window.
+
+2019-01-29 Bob Weiner <rsw@gnu.org>
+
+* hargs.el (hargs:buffer-substring): Added and used in hargs:delimited to
+ replace null char in colored grep output lines with a colon, so they are
+ handled properly by the implicit buttons.
+
+2019-01-27 Bob Weiner <rsw@gnu.org>
+
+* hversion.el (hyperb:microsoft-os-p): Renamed to this.
+
+* hpath.el (hpath:cache-mswindows-mount-points):
+ Added and called when Hyperbole is initialized, mainly to allow access to
+ MSWindows network shares which would otherwise not be accessible as links
+ under POSIX systems.
+ (hypb:map-plist): Added to map over property lists.
+ Called in hpath:cache-mswindows-mount-points.
+
+2019-01-26 Bob Weiner <rsw@gnu.org>
+
+* hversion.el (hyperb:wsl-os-p): Added to test for use of Microsoft WSL.
+
+* hpath.el (hpath:delimited-possible-path): Added optional include-positions parameter.
+
+2019-01-21 Bob Weiner <rsw@gnu.org>
+
+* hpath.el (hpath:mswindows-mount-prefix, hpath:mswindows-drive-regexp, hpath:mswindows-path-regexp,
+ hpath:mswindows-to-posix, hpath:mswindows-to-posix-separators, hpath:posix-to-mswindows)
+ hpath:posix-to-mswindows-separators, hpath:posix-path-p,
+ hpath:substitute-posix-or-mswindows-at-point, hpath:substitute-posix-or-mswindows):
+ Added to handle MSWindows paths under POSIX OSes, e.g. Windows Subsystem for Linux.
+ (hpath:find-program): Commented out call to hpath:find-file-mailcap to prevent use of
+ MIME external viewers on text files.
+ hargs.el (hargs:delimited): Added call to hpath:mswindows-to-posix-path.
+ hyperbole.el (hyperb:init): Abbreviated MSWindows mount point paths.
+
+2017-12-29 Bob Weiner <rsw@gnu.org>
+
+* hsettings.el (inhibit-hyperbole-messaging): Moved this from hyperbole.el to here to prevent
+ it being reset when hyperbole-toggle-messaging reloads the hyperbole library.
+
+2017-12-20 Bob Weiner <rsw@gnu.org>
+
+* kotl/kexport.el (kexport:html-file-klink)
+ (kexport:html):
+ (kexport:html-replacement-alist): Added 'k' to precede klink HTML HREF
+ references since these must start with a letter.
+
+* hui-select.el (hui-select-get-region): Added this to be used in other libraries.
+ (hui-select-get-region-boundaries): Added and used in hui-select-thing.
+
+2017-12-19 Bob Weiner <rsw@gnu.org>
+
+* hib-social.el (github-reference, gitlab-reference): Added "people" reference support
+ to list people who are part of a formal organization as well as a "staff" alias.
+ Added "contributors" reference support to list project contributors as well.
+
+2017-12-19 Bob Weiner <rsw@gnu.org>
+
+* hib-social.el (github-reference): Added =item-id syntax.
+ (gitlab-reference): Added to support Gitlab references.
+
+2017-12-18 Bob Weiner <rsw@gnu.org>
+
+* hib-social.el (github-reference): Fixed resolution of these formats of issue reference:
+ gh#gh-34 and gh#issue/34 (needed to be plural).
+
+2017-12-17 Bob Weiner <rsw@gnu.org>
+
+* kotl/kfill.el: Eliminated use of filladapt.el since it causes kotl-mode filling errors.
+
+* kotl/kfill.el (kfill:forward-line): Removed improperly used [] in skip-chars-forward.
+
+2017-12-16 Bob Weiner <rsw@gnu.org>
+
+* hui.el (hui:key-dir):
+ hui-window.el (hmouse-at-item-p):
+ hui-jmenu.el (hui-menu-buffer-mode-name): Simplified using buffer-local-value.
+
+2017-12-15 Bob Weiner <rsw@gnu.org>
+
+* hmouse-drv.el (hkey-throw): Fully resolved temporary display of newly created frames
+ with a (redisplay t) to force display of any window updates during the temporary
+ display.
+
+2017-12-13 Bob Weiner <rsw@gnu.org>
+
+* hmouse-drv.el (hkey-throw): Partially solved temporary display of newly created frames
+ (when not given focus initially with a '(no-focus-on-map . t) property), so hkey-throw
+ to a new target frame now temporarily displays the target frame and then makes the start
+ frame the uppermost frame. When on an item though, the item is not visible during the
+ temporary display yet.
+
+* Makefile (texinfo): Added texinfo dependency target and added additional image dependencies
+ in man/im.
+
+* hyperbole.el (require 'hmouse-drv): Changed from hmouse-key to prevent a require cycle
+ during macro expansion.
+ hmouse-key.el: Changed requires to just be during compile since hyperbole.el now includes
+ these requires and will load hmouse-key.
+
2017-12-12 Bob Weiner <rsw@gnu.org>
* hversion.el: Pushed 7.0.2a test update.
@@ -45,16 +574,13 @@
* hypb.el (hypb:rgrep): Added support for ripgrep.
hibtypes.el (ripgrep-msg): Added implicit button support for ripgrep (rg) messages where
- the associated pathname is output once before all mataching lines.
+ the associated pathname is output once before all matching lines.
See "https://github.com/BurntSushi/ripgrep".
2017-12-04 Bob Weiner <rsw@gnu.org>
* hmouse-drv.el (hmouse-alist): Reload the def of this variable if its value is null.
- (hkey-mouse-click-to-replace): Added to allow moving buffers with the mouse by clicking
- on the from and to windows.
- (hmouse-click-to-drag, hmouse-click-to-drag-to, hmouse-click-to-replace, hmouse-click-to-throw,
- hmouse-choose-windows): Added to perform cross-window drags, replacements and throws with 3 mouse
+ (hmouse-choose-windows): Added to perform cross-window drags, replacements and throws with 3 mouse
clicks.
2017-12-03 Bob Weiner <rsw@gnu.org>
@@ -67,7 +593,7 @@
* hmouse-drv.el (hkey-drag-stay, hkey-replace): Added for use as ace-window commands.
(hkey-throw): Rewrote so if not on an item, then throws the current buffer.
hkey-replace is the inverse, it grabs the specified buffer and places it into the selected
- window ({p} command key for ace-window). hkey-drag-stay does a drag but leaves point
+ window ({r} command key for ace-window). hkey-drag-stay does a drag but leaves point
in the originally selected window.
(hmouse-click-to-drag, hmouse-click-to-drag-stay, hmouse-click-to-drag-to)
hmouse-click-to-replace, hmouse-click-to-swap, hmouse-click-to-throw): Added to click
@@ -115,7 +641,7 @@
2017-11-27 Bob Weiner <rsw@gnu.org>
* hmouse-drv.el (hkey-ace-window-setup): Made new ace-window frames (window id = z) inherit the size
- of the prior selected frame; same as HyWindow.
+ of the prior selected frame; same as HyControl.
* hui-window.el (hmouse-kill-and-yank-region, hmouse-yank-region): Added select-frame-set-input-focus
in case released in a different frame.
@@ -248,6 +774,9 @@ V7.0.1 changes ^^^^:
* hversion.el: Updated to 7.0.0 for major release.
+* smart-clib-sym: Removed file-newer Perl script dependency.
+ file-newer: Removed.
+
* Makefile (help): Removed misplaced double quote characters.
* hui-window.el (hmouse-drag-window-side): Fixed coordinate error when drag release is outside of Emacs.
@@ -300,7 +829,7 @@ V7.0.1 changes ^^^^:
location. Also fixed edge cases where want to copy or move thing to the beginning or end of the thing region.
(hmouse-goto-region-point): Renamed to hmouse-goto-region-prev-point, for clarity.
(hmouse-kill-and-yank-region, hmouse-kill-region): Used value of point saved in hkey-value to determine
- the region if non-nil.
+ the region if non-nil.
* hui-select.el (hui-select-delimited-thing, hui-select-thing): Changed to use use-region-p.
hmouse-drv.el (hmouse-use-region-p): Added and used to improve hmouse-drag-thing.
@@ -1828,11 +2357,6 @@ V6.0.2 changes ^^^^:
hibtypes.el (mail-address-at-p): Let case-fold-search be t since mail-addresses
are case-insensitive.
-* Various Files: Small copyright fixes and formatting adjustments.
- Replaced hyperb:xemacs-p with (featurep 'xemacs) for byte-compiler
- optimization purposes and made small fixes throughout suggested by Stefan
- Monnier.
-
* hibtypes.el (mail-address-regexp): Simplified and modernized address matching
to better distinguish from @username social media references.
(mail-address-mode-list): Added lisp-interaction-mode and fundamental-mode.
@@ -2011,7 +2535,7 @@ V6.0.0 changes ^^^^:
* hmouse-drv.el (hkey-help-hide): Changed to utilize quit-window function if *hkey-wconfig* is
not set and made it interactive and an autoload so can replace quit-window in help buffers.
- (quit-window): Overloaded this function form "window.el" to utilize *hkey-wconfig*
+ (quit-window): Overloaded this function from "window.el" to utilize *hkey-wconfig*
when set.
hui-mini.el (hui:menu-help): This fixed an issue where Hyperbole minibuffer menu item help window
quit did not properly restore prior window configuration.
diff --git a/DEMO b/DEMO
index a8e650c..d72a6db 100644
--- a/DEMO
+++ b/DEMO
@@ -1,5 +1,7 @@
* GNU Hyperbole Demonstration by Bob Weiner
+ Say thanks if you like Hyperbole: https://saythanks.io/to/rswgnu
+
Table of Contents
-----------------
* Introduction
@@ -43,7 +45,7 @@ terms used here are unfamiliar to you.
* Smart Keys
Hyperbole provides two context-sensitive keys, the Action Key and the Assist
-Key, jointly referred to as Smart Keys that each do dozens of things,
+Key, jointly referred to as Smart Keys. Each do dozens of things,
essentially whatever is most helpful in any given textual context where they
are pressed. The Action Key is {M-RET} (ESC RETURN if you are unsure) on the
keyboard and the shift-middle mouse button on a 3-button mouse or the
@@ -53,7 +55,7 @@ To distinguish the mouse buttons from the keyboard keys, we will often refer
to the Action Mouse Key or Assist Mouse Key. (It is possible to rebind these
keys to the unshifted middle and right mouse buttons, if desired. See the
Smart Key Bindings section of the Hyperbole Manual, "(hyperbole)Smart Key
-Bindings").
+Bindings") simply by pressing the Action Key on that reference.
The Action Key selects entities, creates links and activates buttons. The
Assist Key provides help, such as reporting on a button's attributes, or
@@ -65,7 +67,7 @@ and returns here.
See also the later section, <(Smart Mouse Keys)>.
-Now let's look at many of the things you can do with the Smart Keys.
+Now let's look at some of the things you can do with the Smart Keys.
** Table of Contents Browsing
@@ -94,9 +96,10 @@ following button and then practice scrolling: <(toggle-scroll-proportional)>.
If you prefer the default proportional scrolling, click on the previous
button again to restore it.
-If you always want windowful (non-proportional) scrolling, you'll have to
-add a setting of smart-scroll-proportional to your "~/.emacs" file after the
-point at which you load Hyperbole or else set it as part of
+If you always want windowful (non-proportional) scrolling, use the Emacs
+customize system to set it permanently. Otherwise, you can set it manually
+by adding a setting of smart-scroll-proportional to your "~/.emacs" file
+after the point at which you load Hyperbole or else set it as part of
hyperbole-init-hook, which executes whenever Hyperbole is loaded, e.g.:
(add-to-list 'hyperbole-init-hook
@@ -139,7 +142,6 @@ You can change which browser is used with {C-h h c w}, the Cust/Web-Search
menu. Advanced users can change the search engines listed by editing the
option, <(hyperbole-web-search-alist)>.
-
** Help Buffers
Since the Smart Keys do so many things, it is helpful to see what they will
@@ -175,17 +177,17 @@ A unique feature of Hyperbole is the Koutliner; it is for outlining thoughts,
developing requirements or listing tasks and hyperlinking them to other
documents.
-The Hyperbole Koutliner produces structured, autonumbered documents composed
-of hierarchies of cells. Each cell has two identifiers, a relative
-autonumber indicating its present position within the outline and a permanent
-identifier suitable for use within hyperlink references to the cell.
+The Hyperbole Koutliner produces multi-level, autonumbered hierarchies of
+cells. Each cell has two identifiers, a relative autonumber indicating its
+present position within the outline and a permanent identifier suitable for
+use within hyperlink references to the cell.
A demonstration of the Koutliner is found on the Hyperbole Kotl/Example menu
entry. {C-h h k e}, gives you an editable copy of Hyperbole's example
Koutliner file. This explains the Koutliner commands and lets you try them
out as you learn. Additional documentation can be found in
-"(hyperbole)Koutliner". "(hyperbole)Koutliner Keys" summarizes in
-alphabetical order the Koutliner commands which are bound to keys.
+"(hyperbole)Koutliner". "(hyperbole)Koutliner Keys" summarizes, in
+alphabetical order, the Koutliner commands which are bound to keys.
* HyControl
@@ -253,15 +255,16 @@ the argument is used to adjust one dimension of the frame.
The {@} command splits a frame into a grid of up to 9 rows by 9 columns of
windows, showing a different buffer in each window, if available. First
let's expand our frame to full screen with the {.1 %} command and then show
-a 2 x 3 grid. We can do multiple commands in one key sequence. Press the
+a 2 x 3 grid. We can do multiple commands in one 'key series'. Press the
action key here: {.1 % .23 @}.
You can even write something like this to do the whole thing in one sequence.
First, let's quit out of HyControl Frames mode with {q}. Then go back to one
-window with {C-x 1}. Now we can execute a single sequence from any buffer that
-creates our 2x3 window grid: {C-h h s f .1 % .23 @ q}. Pretty amazing,
-right? You can separate each command by any number of spaces or even jam them
-all together: {C-hhsf.1%.23@q}.
+window with {C-x 1}. Now we can execute a single sequence from any buffer
+that creates our 2x3 window grid: {C-h h s f .1 % .23 @ q}. Pretty amazing,
+right? You can separate each command by any number of spaces or even jam
+them all together: {C-hhsf.1%.23@q}. Use SPC (separated by spaces) to
+include a space as part of the key series.
A zero argument to the {@} command is special. It means you want to display
buffers with a particular major mode first, e.g. c-mode. You will be
@@ -348,7 +351,7 @@ Action Key click on {C-x4r work RET} to search for all entries from Work
Industries; then type {q} to quit from the HyRolo search results buffer.
{C-x4r manager RET} finds all managers plus their staff across companies.
{C-x4r Dunn,\ J RET} finds just that staffer. Notice that you must quote the
-space with a backslash when including it in a key sequence search string or
+space with a backslash when including it in a key series search string or
else the space will be removed; when just typing the same string
interactively, don't add the backslash.
@@ -372,9 +375,9 @@ not one Match entries without the arg
=====================================================================
So for example, {C-x4r (or smith dunn) RET} finds both the Smith and Dunn
-entries. (Note that you do not need to backslash quote spaces within
+entries. (Note that you do not need to quote spaces with backslashes within
parentheses, square brackets, angle brackets or double quotes when used in
-key sequences). To find any Managers and their staffers at HiHo Industries,
+key series). To find any Managers and their staffers at HiHo Industries,
use: {C-x4r (and manager hiho) RET}. To find managers anywhere but at HiHo:
{C-x4r (and manager (not hiho)) RET}. Finally, this will find all people who
are not managers at HiHo: {C-x4r (not (and manager hiho)) RET}.
@@ -399,32 +402,53 @@ command to return to this DEMO later.
* Implicit Buttons
-An incredibly powerful feature of Hyperbole is known as implicit buttons,
-i.e. a specific format of text within a buffer that Hyperbole recognizes as a
-button and lets you activate. Hyperbole recognizes these by context and does
-not require any specialized markup.
+Hyperbole can automatically turn your existing, unchanged text files into
+hypertexts via its incredibly powerful feature: implicit buttons. An
+implicit button is a span of text within a buffer that Hyperbole recognizes
+as a button and lets you activate. Hyperbole recognizes these buttons using
+its predefined implicit button types that specify how to recognize a
+particular type of button and what action such buttons perform. For example,
+double-quoted pathnames have a type of 'pathname' and an action of: display
+the path in Emacs. (Hyperbole lets you configure where to display it).
+
+Hyperbole has many built-in implicit button types, a number of which you will
+see here. You may also create your own types. Once a type is known, you can
+embed an infinite number of buttons of that type within your text documents
+simply by typing them. Let's look at some of these button types and how you
+can use them.
Note that you must press a Smart Key on the first line of an implicit button
to utilize it if it spans multiple lines and always press on a regular
character, not a delimiter like ( or ) since these are treated specially and
used to select groups of text.
-Hyperbole has many built-in implicit button types, a number of which you will
-see here, and allows you to create your own. Once a type is known, you can
-embed an infinite number of buttons of that type within your text simply by
-typing them. Let's look at some of these button types and how you can use
-them.
+Individual implicit buttons may be labeled so that they may be activated
+by name or linked to by other buttons. Here is a pathname button with a label
+of 'My Emacs Files':
+
+<[My Emacs Files]>: "~/.emacs.d"
-** Key Sequence Buttons
+You see that the label is delimited by <[ and ]> and can be followed
+by any number of :, - or = characters, including none, and then a
+whitespace character. You can activate the button either from its
+label or its pattern text. With point on an implicit button, you can
+label it by using {C-h h i l}.
-Any Emacs key sequence delimited with curly braces is an implicit button.
-Press the Action Key with {C-u C-p} for example and the point should move
-four lines upward. An Assist Key press on the key sequence displays the
-documentation for its command binding, i.e. what it does. Key sequences
-together with the arguments their commands prompt for also may be given,
-e.g. {M-x apropos RET hyperbole RET}. Click in the braces to try it out.
+Now let's explore some implicit button types.
-Hyperbole minibuffer menu items may also be activated as key sequences. For
+** Key Series Buttons
+
+Any series of Emacs key sequences (or 'key series') delimited by curly
+braces is an implicit button. Press the Action Key within {C-u C-p C-n C-e}
+for example and the point should move three lines upward and to the end of
+line. An Assist Key press on the key series either displays the documentation
+for its command binding (if a single key sequence) or displays help for the
+implicit button, i.e. what it does. Key series together with the
+arguments their commands prompt for, may also be given, e.g. {M-x apropos
+RET hyperbole RET}. Click with the Action Mouse Key within the first line
+of this button to try it out.
+
+Hyperbole minibuffer menu items may also be activated as key series. For
example, {C-h h d i} displays the online browsable Info version of the
Hyperbole Manual. Press your Action Key between the braces to see it. Once
in the Info browser, use {s} to search for any topic throughout the manual.
@@ -436,14 +460,27 @@ demonstrations and tours with this and other implicit button types.
** Org Mode
-For users of Emacs Org mode, Hyperbole does a few things. First, the
-Action Key will follow and execute links in Org mode files. Second, when
-point is on an outline heading in Org mode, the Action Key cycles the view
-of the subtree at point and the Assist Key cycles the view of all headings
-in the buffer. The Assist Key will also display help when pressed on an Org
-mode link.
+For users of Emacs Org mode, Hyperbole does quite a few things.
+
+First, the Action Key follows internal links in Org mode files. When
+pressed on a link referent/target, the link definition is displayed,
+allowing two-way navigation between definitions and targets.
+
+Second, the Action Key follows Org mode external links. The Assist Key
+displays help when pressed on an Org mode link.
+
+Third, within a radio target definition, the Action Key jumps to the first
+occurrence of an associated radio target.
+
+Fourth, when point is on an outline heading in Org mode, the Action Key
+cycles the view of the subtree at point and the Assist Key cycles the view
+of all headings in the buffer.
-In any other context besides the end of a line, the Action Key will invoke
+Fifth, with point on the first line of a code block definition, the Action
+Key executes the code block via the Org mode standard binding of {C-c C-c},
+(org-ctrl-c-ctrl-c).
+
+In any other context besides the end of a line, the Action Key invokes
the Org mode standard binding of {M-RET}, (org-meta-return).
** Implicit Path Links
@@ -486,7 +523,7 @@ headings preceded by asterisks rather than hash marks. So to jump back to
the Org Mode section in this file, press the Action Key on "#Org-Mode".
HTML hash-links are case-sensitive; other hash-links are not. Hash links
-typically use dashes in place of the spaces that referents may contain but if
+typically use dashes in place of the spaces that referents may contain, but if
the link is enclosed in quotes, Hyperbole allows spaces to be used as well.
In fact, it is best practice to always enclose hash-style links in quotes so
Hyperbole can distinguish them from other similar looking constructs, such as
@@ -515,7 +552,7 @@ Thus an Action Key press on "simple.el", "hyperbole.info" or even
Some file types require external programs to view them, such as pdf files.
The function (hpath:get-external-display-alist) determines the file
-suffixes which should be viewed externally together with their associated
+suffixes which should be viewed externally, together with their associated
viewer programs, on a per-frame, per window-system basis. See its
documentation for more details. The association lists used by this
function are stored in variables for each available window system:
@@ -585,6 +622,37 @@ you can also use paths of the form:
ftp://ftp.gnu.org/pub/
+*** POSIX and MSWindows Paths
+
+Hyperbole recognizes standard POSIX paths as well as typical MSWindows
+paths (both local and network shares) and can convert an in-buffer
+path between POSIX and MSWindows formats multiple times, even paths
+involving mount points. Hyperbole even recognizes the different ways
+paths are accessed when using Windows for GNU/Linux (WSL) atop
+MSWindows, where all of these reference the same directory:
+"c:/Users", "c:\Users", "/C/Users", "/c/Users", and "/mnt/c/Users".
+
+MSWindows paths may be used within links and implicit path buttons
+just like POSIX paths, whether running Emacs under a POSIX system or
+MSWindows. If under POSIX, a remote MSWindows path must be accessed
+through a mount point to the network share. Hyperbole caches such
+mount points when it is first loaded. Use {M-x
+hpath:cache-mswindows-mount-points RET} to update them if more mounts
+are made later.
+
+{M-x hpath:substitute-posix-or-mswindows-at-point RET} toggles any
+path at point between POSIX and MSWindows styles. Bind it to a key
+for rapid path transformations.
+
+The function, `hpath:substitute-posix-or-mswindows', does the same thing
+for properly quoted path strings, for example:
+ (hpath:substitute-posix-or-mswindows "C:\\Users") yields "/mnt/c/Users"
+and
+ (hpath:substitute-posix-or-mswindows "/c/Users") yields "c:\\Users".
+
+To convert pathnames in one direction only, use the
+`hpath:mswindows-to-posix' or `hpath:posix-to-mswindows' functions.
+
** Internet Request For Comments (RFC) Document Browsing
With Tramp, you can also retrieve and browse RFC documents used in Internet
@@ -684,6 +752,46 @@ user, project and commit hash code are all included. The second and
third versions require the setup of default values, as explained in
the commentary near the top of "hib-social.el".
+Similarly, the same file above explains how to link to pull requests,
+issues, branches and tags.
+
+** Gitlab (Remote) References
+
+For software developers who use Gitlab for publishing and version control,
+Gitlab links are similar to social media links but reference specific Gitlab
+web pages. See "#Github (Remote) References" for the basic syntax of such
+links but substitute 'gl' instead of 'gh'.
+
+Gitlab offers many more types of reference links than Github, here they are:
+
+ gl#gitlab-org/gitlab-ce/activity Summarize user's project activity
+ gl#gitlab-org/gitlab-ce/analytics Display user project's cycle_analytics
+ gl#gitlab-org/gitlab-ce/boards Display user project's kanban-type issue boards
+
+ Once you set the default user and project variables, you can leave
+ them off any reference links:
+
+ (setq hibtypes-gitlab-default-user "gitlab-org")
+ (setq hibtypes-gitlab-default-project "gitlab-ce")
+
+ gl#jobs Display default project's computing jobs
+ gl#labels Display default project's issue categories
+ gl#members Display default project's staff list
+ gl#contributors Show contributor push frequency charts
+ gl#merge_requests or gl#pulls Display default project's pull requests
+ gl#milestones Display default project's milestones status
+ gl#pages Display default project's web pages
+ gl#pipelines List build and test sequences
+ gl#pipeline_charts Graphical view of pipeline run results across time
+ gl#schedules Display schedules for project pipelines
+ gl#snippets Project snippets, diffs and text with discussion
+
+ gl#groups List all available groups of projects
+ gl#projects List all available projects
+
+ gl#milestone=38 Show a specific project milestone
+ gl#snippet/1689487 Show a specific project snippet
+
** Git (Local) References
Similarly, again for software developers, git references work on local
@@ -727,7 +835,7 @@ e.g. filter a file to just lines that don't match a pattern (RemoveLines).
** Annotated Bibliography Buttons
-Annotated Bibliography references such as [FSF 16] may be embedded in any file
+Annotated Bibliography references such as [FSF 19] may be embedded in any file
and activated with the Action Key to find the reference at the end of the file.
Try that one by pressing between the square brackets.
@@ -742,8 +850,9 @@ displayed. Test this technique with a {C-x C-f} (find-file) and then a {?}.
** Hyperbole Source Buttons
-If you ask for help with the Assist Key or {C-u C-h A} from within the
-[FSF 16] button, the first line of the help buffer will look like this:
+If you ask for help with the Assist Key or {C-h A} from within this button,
+{M-x dired-other-window RET ~ RET}, the first line of the help buffer will
+look like this:
@loc> "DEMO"
@@ -1136,7 +1245,7 @@ If you want a new window where you release (so the original destination window's
buffer stays onscreen), just drag to a window's modeline; that window will be
split before the buffer is displayed.
-*** Displaying File and Buffer Items
+*** Displaying File and Buffer Items and Moving Buffers
You can do the same thing with items in dired, buffer menu and ibuffer menu
listing buffers rather than buffers themselves. Drag with the Action Mouse Key
@@ -1153,15 +1262,18 @@ made. An Assist Key Drag will move the the item list buffer to the destination
(swapping buffers), just as it does with other buffers. Practice these drags as
they will prove very beneficial across time.
-For even faster keyboard-based drag emulation, use the Emacs package 'ace-window'
-(see "(hyperbole)Keyboard Drags" for setup). Once this is configured, the
-leftmost character or two of each window's modeline will show the ID to type to
-use that window as the drag destination. Then whenever point is on an item you
-want displayed in another window, use M-o i <window-id> and watch the magic
-happen. You can also use this to create explicit button links to other window
-buffers when in an editable buffer. If you want to display multiple items in
-different windows, instead use the M-o t <window-id> key sequence to @emph{throw}
-the item to the window.
+For even faster keyboard-based drag emulation, use the Emacs package
+'ace-window' (see "(hyperbole)Keyboard Drags" for setup). Once this is
+configured and the suggested M-o key binding is made, the leftmost character or
+two of each window's modeline will show the <window-id> to type to use that
+window as the drag destination. Then whenever point is on an item you want
+displayed in another window, use M-o i <window-id> and watch the magic happen.
+If you want to display multiple items in different windows, instead use the
+M-o t <window-id> key sequence to @emph{throw} each item to a different window,
+while leaving the same selected window. To replace the selected window's
+buffer with that of another window, use M-o r <window-id>. To instead swap the
+selected window's buffer with that of another window, use M-o m <window-id>.
+Try these commands out and they will speed your work.
*** Cloning Windows
@@ -1273,7 +1385,7 @@ to dive deeper. Read it online with the GNU Info reader at "(hyperbole)Top".
* References
-[FSF 16] Free Software Foundation, Inc. GNU Emacs Manual. Free Software
-Foundation, Cambridge: MA, 2016. "(emacs)Top"
+[FSF 19] Free Software Foundation, Inc. GNU Emacs Manual. Free Software
+Foundation, Cambridge: MA, 2019. "(emacs)Top"
* THE END
diff --git a/HY-ABOUT b/HY-ABOUT
index 0bf1893..e6331bd 100644
--- a/HY-ABOUT
+++ b/HY-ABOUT
@@ -3,7 +3,10 @@
Designed and Written by Bob Weiner
Maintained by Mats Lidell and Bob Weiner
https://www.gnu.org/software/hyperbole/
- Version 7.0.2a
+ Version 7.0.3b
+
+ Say thanks if you like Hyperbole:
+ https://saythanks.io/to/rswgnu
GNU Hyperbole (pronounced Ga-new Hi-per-bo-lee), or just Hyperbole, is
an efficient and programmable hypertextual information management
diff --git a/HY-ANNOUNCE b/HY-ANNOUNCE
index 7afa2a3..66feeb0 100644
--- a/HY-ANNOUNCE
+++ b/HY-ANNOUNCE
@@ -1,4 +1,211 @@
----------------------------------------------------------------------
+7.0.3 Announcement
+----------------------------------------------------------------------
+From: Bob Weiner <rsw@gnu.org>
+To: emacs-devel@gnu.org, gnu-emacs-sources@gnu.org, emacs-tangents@gnu.org, hyperbole-users@gnu.org, hyperbole-announce@gnu.org
+Subject: GNU Hyperbole 7.0.3: link your world quickly and easily
+--text follows this line--
+========================================================================
+* Introduction
+========================================================================
+
+GNU Hyperbole 7.0.3 is released and ready for action.
+
+Hyperbole is an amazing hypertextual information management system
+that installs quickly and easily as an Emacs package. It is part of
+GNU Elpa, the Emacs Lisp Package Archive.
+
+Hyperbole interlinks all your working information within Emacs for
+fast access and editing, not just within special modes. An hour
+invested exploring Hyperbole's built-in interactive DEMO file will
+save you hundreds of hours in your future work.
+
+7.0.3 is a significant release with a number of interesting
+improvements. What's new in this release is described here:
+
+ www.gnu.org/s/hyperbole/HY-NEWS.html
+
+Hyperbole is described here:
+
+ www.gnu.org/s/hyperbole
+
+For use cases, see:
+
+ www.gnu.org/s/hyperbole/HY-WHY.html
+
+For what users think about Hyperbole, see:
+
+ https://www.gnu.org/s/hyperbole/hyperbole.html#user-quotes
+
+Hyperbole can supplement and extend Org-mode's capabilities. It adds
+many features not found elsewhere in Emacs, including Org mode, see:
+
+ www.emacswiki.org/emacs/Hyperbole
+
+Hyperbole includes its own easy-to-use hypertextual buttons and links
+that can be created without the need for any markup language.
+
+Hyperbole has an interactive demo to introduce you to its features as
+well as a detailed reference manual, as explained here:
+
+ https://www.gnu.org/s/hyperbole/hyperbole.html#invocation-and-doc
+
+========================================================================
+* Quick Reasons to Try Hyperbole
+========================================================================
+
+It contains:
+
+- the most flexible and easy-to-use hyperbuttons available, including
+ implicit buttons automatically recognized by context, e.g. stack
+ trace source line references.
+
+- the only Emacs outliner with full legal item numbering,
+ e.g. 1.4.2.6, and automatic permanent hyperlink anchors for every
+ item
+
+- the only free-form contact manager with full-text search for Emacs
+
+- rapid and precise window, frame and buffer placement on screen
+
+- an extensive menu of typed web searches, e.g. dictionary, wikipedia
+ and stackoverflow, plus convenient, fast file and line finding
+ functions
+
+- immediate execution of a series of key presses just by typing them
+ out. For example, a M-RETURN press on: {C-x C-b C-s scratch RET
+ C-a} will find the first buffer menu item that contains 'scratch';
+ then leave point at the beginning of its line. Build interactive
+ tutorials with this.
+
+
+========================================================================
+* The Magic of Implicit Buttons and the Action Key
+========================================================================
+
+For near instant gratification, try Hyperbole's 'implicit button'
+capabilities (hyper-buttons that Hyperbole gives you for free by
+recognizing all types of references embedded within text such as
+pathnames or error message lines). Below are more complex examples to
+show the power; simpler ones can be found within the Hyperbole DEMO
+file.
+
+Implicit buttons are activated by pressing the Action Key, M-RETURN.
+Once Hyperbole is loaded in your Emacs, pressing M-RETURN on any of
+these examples *in virtually any buffer* will display the associated
+referent in a chosen window or frame, handling all variable
+substitution and full path resolution:
+
+ "find-func.el" Find this file whether gzipped or not
+ in the Emacs Lisp load-path
+
+ "${hyperb:dir}/HY-NEWS" Resolve variable, show Hyperbole news
+
+ "${PATH}/umask" Display a script somewhere in multi-dir PATH
+
+ "${hyperb:dir}/DEMO#Hyperbole Menus" Org mode outline, Markdown, and HTML # refs
+
+ "(hyperbole)Menus" Texinfo and Info node links
+
+ "c:/Users", "c:\Users", "/C/Users", "/c/Users", and "/mnt/c/Users"
+ On Windows and Windows Subsystem for Linux,
+ Hyperbole recognizes all of these as the
+ same path and can translate between Windows
+ and POSIX path formats in both directions
+
+Git Links:
+ git#branches List branches in current repo/project
+ git#commits List and browse commits for current project
+ git#tags List tags in current project
+
+ git#/hyperbole From any buffer, dired on the top
+ directory of the local hyperbole
+ project
+
+ git#/hyperbole/55a1f0 or From any buffer, display hyperbole
+ git#hyperbole/55a1f0 local git commit diff
+
+
+Github Links:
+ gh@rswgnu Display user's home page & projects
+
+ github#rswgnu/hyperbole Display user's project
+ gh#rswgnu/helm/global_mouse Display user project's branch
+ gh#rswgnu/hyperbole/55a1f0 Display user project's commit diff
+
+Gitlab Links:
+ gitlab@seriyalexandrov Display user's home page
+ gl#gitlab-org/gitlab-ce/activity Summarize user's project activity
+ gl#gitlab-org/gitlab-ce/analytics Display user project's cycle_analytics
+ gl#gitlab-org/gitlab-ce/boards Display user project's kanban-type issue boards
+
+Once you set the default user and project variables, you can leave them off any reference links:
+
+ (setq hibtypes-gitlab-default-user "gitlab-org")
+ (setq hibtypes-gitlab-default-project "gitlab-ce")
+
+ gl#issues or gl#list Display default project's issue list
+ gl#labels Display default project's issue categories
+ gl#members Display default project's staff list
+ gl#contributors Show contributor push frequency charts
+ gl#merge_requests or gl#pulls Display default project's pull requests
+ gl#milestones Display default project's milestones status
+ gl#pages Display default project's web pages
+ gl#snippets Project snippets, diffs and text with discussion
+ gl#groups List all available groups of projects
+ gl#projects List all available projects
+
+ gl#milestone=38 Show a specific project milestone
+ gl#snippet/1689487 Show a specific project snippet
+
+Even useful social media links:
+ tw#travel or twitter#travel Display twitter hashtag matches
+ fb#technology Display facebook hashtag matches
+
+Hyperbole uses simple prefix characters with paths to make them executable:
+ "!/bin/date" Execute as a non-windowed program within a shell
+ "&/opt/X11/bin/xeyes" Execute as a windowed program;
+ "-find-func.el" Load/execute this Emacs Lisp library
+
+ File "/usr/lib/python3.7/ast.py", line 37, in parse
+ Jump to error/stack trace source
+
+ "/ftp:anonymous@ftp.gnu.org:" Tramp remote paths
+
+
+========================================================================
+* Try It - Installs or Uninstalls in a Minute
+========================================================================
+
+Hyperbole lets you concentrate more on your work. Then as you grow
+with it across time, it helps speed your work across weeks and months.
+It installs in about a minute and can be uninstalled even faster if
+ever need be. Give it a try.
+
+Hyperbole can boost your day-to-day productivity with Emacs and
+your ability to manage information stored across many different
+machines on the internet.
+
+Hyperbole can be installed like any other package with the Emacs
+package manager:
+
+ {M-x list-packages RET C-s hyperbole RET i x y}
+
+Then to invoke its menu:
+
+ {C-h h} or {M-x hyperbole RET}
+
+The best way to get a feel for many of its capabilities is to
+invoke the interactive DEMO and explore sections of interest:
+
+ {C-h h d d}
+
+Enjoy,
+
+The Hyperbole Team
+
+
+----------------------------------------------------------------------
7.0.2 Announcement
----------------------------------------------------------------------
From: Bob Weiner <rsw@gnu.org>
diff --git a/HY-NEWS b/HY-NEWS
index 2c9ef33..3971309 100644
--- a/HY-NEWS
+++ b/HY-NEWS
@@ -2,14 +2,267 @@
by Bob Weiner
===========================================================================
+* V7.0.3b
+===========================================================================
+
+ BUTTONS
+
+ - Labeled Implicit Buttons: Optional <[labels]> that precede
+ implicit buttons. This enables implicit buttons to be activated
+ by name when in the current buffer or anywhere when added to the
+ global buttons file (personal button file).
+
+ - Link to Buttons: New implicit button types that link to button categories:
+ In Buffer Syntax Implicit Button Type
+ ===========================================================================
+ <elink: explicit button label to link to> link-to-ebut
+ <glink: global button label to link to> link-to-gbut
+ <ilink: implicit button label to link to> link-to-iut
+
+ - Other new implicit button types:
+ debugger-source: Jump to the source of errors from the Python pytype package
+ ipython-stack-frame: Jump to the source of ipython stack traces and exceptions
+
+
+ DOCUMENTATION
+
+ - Action Types: link-to-gbut, link-to-ibut - Added.
+
+ - hpath:native-image-suffixes: documented this setting for
+ controlling image types that Hyperbole displays within Emacs.
+
+ - Implicit Button Types: Split off type descriptions to this new
+ subsection and added these types: ripgrep-msg, ipython-stack-frame, link-to-ibut,
+ link-to-gbut, link-to-ebut.
+
+ - Implicit Buttons: Added description and example of implicit button labels.
+ DEMO (Implicit Buttons): Added description and example of implicit button labels.
+
+ - Glossary: Updated Implicit Button and Global Button entries with changes.
+
+
+ KOUTLINER
+
+ - When 'c' (clip to lines per cell) is omitted from a viewspec, clipping now changes to
+ whatever the default number of lines per cell is (typically, unlimited). The same goes
+ for the 'l' spec (limit display to a certain level of cells).
+
+ MENUS
+
+ - Pulldown Menus: Implicit-Button/Label: Added to add a label.
+ Implicit-Button/Rename - Added to rename the label of an implicit button.
+
+ - Minibuffer Menus: hui-mini.el (hui:menus): Added Ibut/Label and Ibut/Rename.
+
+
+ ORG MOde
+
+ - Radio Targets and Links: Smart Keys now handle these.
+
+ - Links: Smart Keys handle both internal and external Org mode links.
+
+ PROGRAMMING
+
+ - ibut:at-type-p: Added to test if point is on a specific type of implicit button.
+
+ - hypb:region-with-text-property-value: Added and used in hysy-org.el.
+
+ - hsys-org-mode-function, hsys-org-mode-p: Added to determine when hsys-org actions
+ are activated.
+
+ - ebut:key-src-set-buffer, hbut:key-src-set-buffer, hbut:key-list,
+ hbut:ebut-key-list, hbut:ibut-key-list, hbut:label-list): Added
+ to allow selection of labeled Hyperbole buttons in currrent buffer by name.
+
+ - gbut:get, hbut:map, ibut:label-map, ibut:key-src, ibut:key-to-label, ibut:label-to-key,
+ hui:ebut-act, ibut:summarize, ibut:label-start, ibut:label-end, ibut:label-p, ibut:get,
+ hui:ibut-label-create, hui:ibut-rename, hui:ibut-message, ibut:alist, ibut:list, ibut:map,
+ ibut:next-occurrence, ibut:label-regexp, gbut:ibut-key-list, ebut:to, gbut:to, ibut:to,
+ ibut:label-separator, hbut:label-regexp, ibut:rename, hbut:get: Added to support labeled
+ implicit buttons and links to buttons.
+ hbut:label-p: Updated to handle implicit button labels.
+ ibut:label-separator-regexp, hbut:outside-comment-p: Added.
+
+ - link-to-gbut, glink:start, glink:end: Added for in-buffer links to global buttons.
+ link-to-ebut, elink:start, elink:end: Added for in-buffer links to explicit buttons.
+ link-to-ibut, ilink:start, ilink:end: Added for in-buffer links to implicit buttons.
+
+ - hsys-org-set-ibut-label: Added and used in org-mode ibtype.
+ org-mode, hsys-org-at-block-start-p: Added Action Key activation of Org blocks when
+ on 1st line of def.
+
+
+ SMART (ACTION AND ASSIST) KEYS
+
+ - hpath:find-program: Changed to prioritize hpath:native-image-suffixes over
+ hpath:internal-display-alist over hpath:external-display-alist-macos instead of the
+ reverse. This prevents external viewers from being used when internal viewers are
+ also in effect.
+
+
+===========================================================================
+* V7.0.3
+===========================================================================
+
+ ACE WINDOW PACKAGE INTEGRATION - fast window and buffer switching
+
+ - Selected Window Buffer Replace: Added the ability to 'replace' the
+ selected window's buffer with the buffer of another window. Use
+ {M-o r <window-id>}. To swap the buffers between the same two windows,
+ use {M-o m <window-id>. See "(hyperbole)Keyboard Drags" for setup and
+ use instructions.
+
+ - New Frame Commands: Any of these M-o commands that involve two windows
+ can use a new frame as the target window by using a <window-id> of 'z'.
+ So, {M-o t z} throws the current buffer to a new frame with a single
+ window displaying that buffer. The new frame will be the same size as
+ the prior frame to match the behavior of HyControl.
+
+ - Integrated Ace Window commands with Smart Key Drags and added commands
+ for use with the mouse that select Ace Window source and target windows
+ by clicking with the mouse: hmouse-click-to-drag,
+ hmouse-click-to-drag-stay, hmouse-click-to-drag-to,
+ hmouse-click-to-replace, hmouse-click-to-swap, hmouse-click-to-throw.
+
+ - {M-o i <window-id>} is now for use only when on a listing item such as
+ in Dired or Buffer Menu. It no longer creates Hyperbole buttons in
+ non-item areas to avoid confusion. Now it will just trigger an error
+ if not on a listing item.
+
+ SMART (ACTION AND ASSIST) KEYS
+
+ - MSWindows Paths: Hyperbole now recognizes typical MSWindows paths (both
+ local and remote shares) and can convert an in-buffer path between POSIX
+ and MSWindows formats multiple times, even paths involving mount points.
+ See "DEMO#POSIX and MSWindows Paths".
+
+ MSWindows paths may be used within links and implicit path
+ buttons just like POSIX paths, whether running Emacs under a POSIX
+ system or MSWindows. If under POSIX, a remote MSWindows path must be
+ accessed through a mount point to the network share. Hyperbole caches
+ such mount points when it is loaded. Use {M-x
+ hpath:cache-mswindows-mount-points RET} to update them if more mounts
+ are made later. See also the NEW COMMANDS section herein for how to
+ convert a path between POSIX and MSWindows formats.
+
+ - GitLab and Github Links: Added Gitlab implicit links with equivalent
+ functionality to those of Github. Added "people" reference support to
+ list people who are part of a formal organization as well as a "staff"
+ alias. Added "contributors" reference support to list project
+ contributors as well. Improved Github implicit issue links: gh#gh-34
+ and gh#issue/34 now properly reference an issue in the current project.
+
+ - Ripgrep: Added new ripgrep-msg implicit button type which jumps
+ to the source referenced by ripgrep (rg) output. By default,
+ ripgrep outputs pathnames only once before all matching lines
+ within that path. Ripgrep may also be used with the Hyperbole
+ `hypb:rgrep' command by setting 'hypb:rgrep-command'. See
+ "https://github.com/BurntSushi/ripgrep".
+
+ - Markdown Mode: Smart Keys now support Markdown internal file link
+ references and navigation.
+
+ - Org Mode: When in an *Org Help* buffer, the Smart Keys now defer to
+ org-mode to handle jumps to its own locations for compatibility.
+ Similarly, in org-mode buffers when not on an org link or heading,
+ and the {M-RET} Action Key is pressed, Hyperbole defers to Org's
+ org-meta-return command.
+
+ - Drag-based Kill, Copy and Yank: Added support for dragging across
+ frames.
+
+ - Python Identifiers: If a Jedi server is running and the Action Key is
+ pressed on a Python identifier, Hyperbole will use Jedi to find the
+ definition even within nested module references, e.g. a.b.c. Also
+ improved basic identifier definition finding.
+
+ - Company Mode Completion: Support for the Emacs company-mode completion
+ package. An Action Key press on a company-mode completion item will
+ display the definition of that item and an Assist Key press will
+ display its documentation, if any.
+
+ - Treemacs Mode: Now supports standard Hyperbole end-of-line proportional
+ scrolling.
+
+ - ChangeLog Mode: Smart Keys now work on Emacs Lisp references in
+ changelogs.
+
+ - Improved String Matching: For lines that begin with part of a string
+ that started on another line, Hyperbole now presumes that point is
+ within a string rather than between two strings, even though the
+ delimiters on the line make this ambiguous. This provides more
+ accurate string recognition.
+
+ - Improved Path Matching: For quote delimited paths, other quote marks
+ are excluded from matches, so if checking for a doubly quoted path,
+ single quotes are not allowed in the string.
+
+ HYCONTROL
+
+ - Help Buffer Quitting: If HyControl is active, normally {q} quits
+ it, but now if point is in an Emacs help buffer, {q} will quit
+ from the help buffer instead. Use {Q} to quit from HyControl
+ unconditionally.
+
+ NEW COMMANDS
+
+ - Buffer Sliding: Four new commands are available that can be
+ bound to things like control arrow keys: hkey-buffer-move-left,
+ hkey-buffer-move-right, hkey-buffer-move-down and
+ hkey-buffer-move-up. Each one slides the current buffer one
+ window in the direction specified and all other buffers slide
+ around to match.
+
+ - MSWindows and POSIX Path Toggling: In "hpath.el", added
+ (hpath:substitute-posix-or-mswindows-at-point) and
+ (hpath:substitute-posix-or-mswindows) commands to toggle the
+ format of a path at point or in a string between POSIX and
+ MSWindows styles.
+
+ PROGRAMMING
+
+ - Added hypb:map-plist, equivalent to mapcar but maps over
+ key-value pairs in property lists (where the key and value are
+ individual elements in the list).
+
+ - In "hui-select.el", added functions to return info. on the
+ context-sensitive region that this library selects.
+ (hui-select-get-region) returns the region that would be
+ selected at point and (hui-select-get-region-boundaries)
+ returns a cons of the start and end position of the same region.
+
+ - In "hpath.el (hpath:delimited-possible-path), added optional
+ include-positions parameter which if non-nil, adds start and end
+ positions to returned value.
+
+ - In "hversion.el", added (hyperb:wsl-os-p) flag to test whether
+ Emacs is running under Microsoft Windows Subsystem for Linux (WSL)
+ since the system-type variable does not reflect this.
+
+ DOCUMENTATION
+
+ - Popup Menus: Documented how to invoke the Koutliner and
+ HyRolo popup menus in Emacs. See "(hyperbole)Menu Commands".
+
+ - DEMO: Added sections:
+ "DEMO#Gitlab (Remote) References"
+ "DEMO#POSIX and MSWindows Paths"
+
+ - Updated Hyperbole Manual with new features.
+
+
+===========================================================================
* V7.0.2
===========================================================================
- - Ace Window: Added the ability to 'throw' an item to a window while
- leaving the selected window the same. Use {M-o t <window-id>}. This
- works in Dired, Buffer Menu, iBuffer Menu and Treemacs modes and lets
- you throw multiple items to multiple windows quickly. See
- "(hyperbole)Keyboard Drags" for setup and use instructions.
+ ACE WINDOW PACKAGE INTEGRATION
+
+ - Item Throws: Added the ability to 'throw' an item or a buffer to
+ a window while leaving the selected window the same. Use {M-o t
+ <window-id>}. This works in Dired, Buffer Menu, iBuffer Menu and
+ Treemacs modes and lets you throw multiple items to multiple windows
+ quickly. See "(hyperbole)Keyboard Drags" for setup and use
+ instructions.
===========================================================================
* V7.0.1
@@ -149,7 +402,7 @@
explicit buttons are highlighted with a special colored face or not. By
default, they are.
- - Python PDB Backtraces: Action Key presses jump to the associated source
+ - Python Backtraces: Action Key presses jump to the associated source
line.
- Python Symbols: Action Key presses now look these up in any buffer whose
@@ -164,7 +417,7 @@
source of any such lines.
- Dired Quit: An Action Key press at the end of the first line in a Dired
- buffer nows quit and execute requested actions, just as presses at the
+ buffer now quits and executes requested actions, just as presses at the
end of the buffer do.
- Image Thumbnail Browsing: See the Info manual section,
@@ -356,9 +609,6 @@
new settings with {M-x hmouse-update-smart-keys RET}. No need to reload
or restart Hyperbole.
- - Find Web: Added Find Web key binding entry to Hyperbole menus. This key
- displays the Hyperbole Web search menu.
-
- Jump Thing: Added Jump Thing key binding entry to Hyperbole menus. This
key jumps between the start and end of a matching delimiter or tag pair.
@@ -736,7 +986,7 @@ are new in 2016 and you should look through them all.
Implicit-Button menu.
- On the Hyperbole Customize/Change-Key-Bindings menubar menu, renamed
- these entries and added Mark-Think-Key. Similar updates done to the
+ these entries and added Mark-Thing-Key. Similar updates done to the
minibuffer menu.
MOUSE AND SMART KEY SUPPORT
@@ -755,7 +1005,7 @@ are new in 2016 and you should look through them all.
help mode so you can page through it with SPC and DEL keys and then quit
from it with {q}.
- - A click of the Action Mouse Key within an inactive minibuffer menu
+ - A click of the Action Mouse Key within an inactive minibuffer window
displays the Hyperbole minibuffer menu, allowing you to invoke menu
entries with the mouse. A click of the Assist Key in the same place
displays the buffer, window and frame jump menu just as does a click
@@ -857,13 +1107,13 @@ are new in 2016 and you should look through them all.
- Added missing {C-c C-i}/{C-c TAB} binding mentioned in the EXAMPLE.kotl
file; sets cell attributes.
- - {C=t} Transpose characters - Added error checks at the beginning of cells
+ - {C-t} Transpose characters - Added error checks at the beginning of cells
and end of lines for times when there are not 2 chars to transpose.
ROLO
- Improved {M-s} interactive string searching for rolo match buffer strings.
- Made {C-u M-s} to a regexp search for rolo match buffer strings.
+ Made {C-u M-s} do a regexp search for rolo match buffer strings.
- Documented the {l} hyrolo-locate command in the Hyperbole manual.
@@ -1060,8 +1310,8 @@ are new in 2016 and you should look through them all.
INSTALLATION
- - Installation is greatly simplified. A single emacs initialization line
- of the form:
+ - Hyperbole initialization is greatly simplified. A single "~/.emacs"
+ line of the form:
(require 'hyperbole (expand-file-name "hyperbole" "<HYPERBOLE-DIR>/")
@@ -1115,7 +1365,7 @@ are new in 2016 and you should look through them all.
now begin with 'K'. Some used to start with 'O'. To edit the example
Koutline, use {C-h h k e}.
- - {C-c C-a} - Show-all, expand all cells nihe current view.
+ - {C-c C-a} - Show-all, expand all cells in the current view.
{C-c C-o} - Overview, show only first line of outline cells.
{C-c C-t} - Top-level, hide all cells below level 1 and show
only the first line of each level 1 cell.
diff --git a/HY-WHY.kotl b/HY-WHY.kotl
index d363ad5..c7e0769 100644
--- a/HY-WHY.kotl
+++ b/HY-WHY.kotl
@@ -20,25 +20,30 @@
pressing on their names. Hyperbole will automatically embed
certain key variables in link pathnames so that as these links
are moved from site to site and the variable values change at
- each site, the links maintained properly. See "DEMO#Path
+ each site, the links are properly maintained. See "DEMO#Path
Suffixes and Variables" and "DEMO#Path Prefixes".
- 5. Quickly search the web for targeted types of information such as
+ 5. Automatically translate POSIX and MSWindows paths within buffers
+ or links to the right format for the current operating system,
+ eliminating the drudgery of converting backslashes to forward
+ slashes. See "DEMO#POSIX and MSWindows Paths".
+
+ 6. Quickly search the web for targeted types of information such as
programming questions, code libraries, images, videos,
locations, word definitions, wikipedia entries or even tweets.
See "DEMO#Hyperbole Menus".
- 6. Embed social media hashtags and user names in any text files.
+ 7. Embed social media hashtags and user names in any text files.
Then jump to the associated web page in your favorite web
browser with an Action Key press. See "DEMO#Social Media
Hashtags and Usernames".
- 7. Similarly, you can embed github and git object links in any
+ 8. Similarly, you can embed github and git object links in any
files with a simple syntax and Hyperbole will display the
associated objects with an Action Key press. See "DEMO#Github
(Remote) References" and "DEMO#Git (Local) References".
- 8. Full-text search for any contact-related information across
+ 9. Full-text search for any contact-related information across
thousands of contacts in under a second. The fastest contact
manager you have ever used, with hierarchical entries so you can
easily find everyone on a particular team or within an
@@ -46,33 +51,33 @@
while still seeing name, phone number and email information.
Edit entries with a single key press. See "DEMO#HyRolo".
- 9. Select regions of structured text or source code and to copy or
+ 10. Select regions of structured text or source code to copy or
move them between buffers with a single mouse drag or two key
presses. These selectable things include: delimited pairs of
(), @{@}, <>, [] and quote marks, source code functions, source
code comments and matching tag pairs in HTML and SGML modes.
- See "DEMO#Thing Selection".
+ See "DEMO#Thing Selection".
- 10. Use the fantastic, auto-numbered Koutliner with per-item links
+ 11. Use the fantastic, auto-numbered Koutliner with per-item links
and rapidly changeable views. See "DEMO#Koutliner".
- 11. Rapid control over what is displayed where in multiple windows
- and frames with mouse drags and the Hyperbole HyControl system.
- See "DEMO#HyControl".
+ 12. Rapid control over what is displayed in each window and frame
+ with mouse drags and the Hyperbole HyControl system. See
+ "DEMO#HyControl".
- 11a. Drag Buffer Menu, Dired or Treemacs items to other windows to
+ 12a. Drag Buffer Menu, Dired or Treemacs items to other windows to
display them wherever you want. Integrate with the Ace
Window package to `throw' items to specific windows with
quick key sequences. See "DEMO#Displaying File and Buffer
- Items".
+ Items and Moving Buffers".
- 11b. Drag-and-drop text regions across Emacs frames. See
- "DEMO#Things".
+ 12b. Drag-and-drop text regions across Emacs frames. See
+ "DEMO#Thing Selection".
- 11c. Swap buffers in windows across frames with a mouse drag.
+ 12c. Swap buffers in windows across frames with a mouse drag.
See "DEMO#Swapping Buffers".
- 11d. With one command, rapidly create a grid of tiled windows
+ 12d. With one command, rapidly create a grid of tiled windows
displaying either selected buffers, buffers with a specific
major mode or the most recently used buffer list, e.g.
{63 C-c @} creates 6 rows, each with 3 columns of windows (18
@@ -82,22 +87,22 @@
same above command to display them in a grid of windows. See
"DEMO#Windows Grid".
- 11e. Use a quick mouse key press to scroll any window line to the
+ 12e. Use a quick mouse key press to scroll any window line to the
top or bottom of a window, to see exactly what you want on
screen. See "DEMO#Smart Scrolling".
- 11f. Clone or tear off a window into its own frame with a quick
+ 12f. Clone or tear off a window into its own frame with a quick
mouse drag. See "DEMO#Cloning Windows".
- 11g. Each frame can store a series of window configurations
+ 12g. Each frame can store a series of window configurations
(layouts) which support working with sets of buffers and
rapidly moving among them. See "DEMO#Window Configuration
Drags".
- 11h. Easily adjust the height and width of windows and frames as
+ 12h. Easily adjust the height and width of windows and frames as
needed. See "DEMO#Frame Commands".
- 11i. Quick clicks on different areas of a buffer's modeline will
+ 12i. Quick clicks on different areas of a buffer's modeline will
rotate through your working list of buffers, changing what
each window displays. A popup menu gives you quick access to
Hyperbole commands plus frame, window and buffer selection
@@ -107,7 +112,7 @@

"ben" ;; kvspec:current
-37 ;; id-counter
+38 ;; id-counter
alpha ;; label-type
4 ;; label-min-width
". " ;; label-separator
@@ -115,7 +120,7 @@ alpha ;; label-type

;; depth-first kcell attributes
[[0
- (creator "rsw@gnu.org" create-time "20171212:19:44:57" id-counter 37 file "/Users/bk/Dropbox/emacs/hyperbole/HY-WHY.kotl")]
+ (creator "rsw@gnu.org" create-time "20190512:130:33:52" id-counter 38 file "/home/bob.weiner/Dropbox/emacs/hyperbole/HY-WHY.kotl")]
[1
(creator "rsw@gnu.org" create-time "20160524:15:04:17" no-fill t)]
[17
@@ -124,6 +129,8 @@ alpha ;; label-type
(creator "rsw@gnu.org" create-time "20171114:23:37:20" no-fill t)]
[2
(creator "rsw@gnu.org" create-time "20160524:15:04:24" no-fill t)]
+ [38
+ (creator "rsw@gnu.org" create-time "20190512:131:21:14" no-fill t)]
[31
(creator "rsw@gnu.org" create-time "20171114:23:18:01" no-fill t)]
[33
diff --git a/MANIFEST b/MANIFEST
index 18ed3aa..9a4f19c 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -42,7 +42,6 @@ hui-mouse.el - Use key or mouse key for many functions, e.g. GNU Hyperbol
hui-select.el - Select delimited or larger and larger syntax-driven regions in a buffer
hui-treemacs.el - Hyperbole Smart Key support for the Treemacs file manager package
hui-window.el - Smart Mouse Key window and modeline depress/release actions
-hui-xe-but.el - XEmacs button highlighting and flashing support
hui.el - GNU Hyperbole button and hyperlink user interface
--- APPLICATION PROGRAMMING INTERFACE ---
@@ -75,7 +74,6 @@ kotl/EXAMPLE.kotl - Sample Koutline document explaining Koutliner features
hgnus.el - GNU Hyperbole buttons in news reader/poster: GNUS
--- HYPERBOLE INTERNALS ---
-file-newer - Perl script which returns 1 if file 1 is newer than file 2
hactypes.el - Default action types for GNU Hyperbole
hbdata.el - GNU Hyperbole button attribute accessor functions
hibtypes.el - GNU Hyperbole default implicit button types
diff --git a/Makefile b/Makefile
index f42df35..968dd18 100644
--- a/Makefile
+++ b/Makefile
@@ -54,10 +54,10 @@
# This ver setup won't work under any make except GNU make, so set it manually.
#HYPB_VERSION = "`head -3 hversion.el | tail -1 | sed -e 's/.*|\(.*\)|.*/\1/'`"
-HYPB_VERSION = 7.0.2a
+HYPB_VERSION = 7.0.3b
# Emacs executable used to byte-compile .el files into .elc's.
-# Possibilities include: emacs, infodock, xemacs, etc.
+# Possibilities include: emacs, infodock, etc.
EMACS = \emacs
# Site-specific Emacs Lisp libraries to load before byte-compiling any files
@@ -132,8 +132,7 @@ ELISP_TO_COMPILE = $(pkg_dir)/elc-${USER}
# Libraries that must be pre-loaded before trying to byte-compile anything.
PRELOADS = $(SITE_PRELOADS) -l ./hload-path.el -l ./hversion.el -l ./hyperbole.el
-# Compile in batch mode. Under Emacs and XEmacs, load
-# site-lisp/site-start.el, which may set load-path.
+# Compile in batch mode. Load site-lisp/site-start.el, which may set load-path.
BATCHFLAGS = -batch -Q
# Directories other than the current directory in which to find files.
@@ -141,7 +140,7 @@ BATCHFLAGS = -batch -Q
# explicitly to those files which need it.
VPATH = kotl man
-EL_SRC = hui-em-but.el hui-xe-but.el
+EL_SRC = hui-em-but.el
EL_COMPILE = hact.el hactypes.el hargs.el hbdata.el hbmap.el hbut.el \
hgnus.el hhist.el hib-debbugs.el hib-doc-id.el hib-kbd.el \
@@ -156,7 +155,7 @@ EL_COMPILE = hact.el hactypes.el hargs.el hbdata.el hbmap.el hbut.el \
EL_KOTL = kotl/kexport.el kotl/kfile.el kotl/kfill.el kotl/kimport.el kotl/klabel.el \
kotl/klink.el kotl/kmenu.el kotl/knode.el kotl/kotl-mode.el \
kotl/kcell.el kotl/kproperty.el kotl/kprop-em.el \
- kotl/kprop-xe.el kotl/kview.el kotl/kvspec.el
+ kotl/kview.el kotl/kvspec.el
ELC_COMPILE = hactypes.elc hibtypes.elc hib-debbugs.elc hib-doc-id.elc hib-kbd.elc \
hib-social.elc hact.elc \
@@ -171,11 +170,11 @@ ELC_COMPILE = hactypes.elc hibtypes.elc hib-debbugs.elc hib-doc-id.elc hib-kbd.
ELC_KOTL = kotl/kexport.elc kotl/kfile.elc kotl/kfill.elc kotl/kimport.elc kotl/klabel.elc \
kotl/klink.elc kotl/kmenu.elc kotl/knode.elc kotl/kotl-mode.elc \
kotl/kcell.elc kotl/kproperty.elc \
- kotl/kprop-xe.elc kotl/kview.el kotl/kvspec.elc
+ kotl/kview.el kotl/kvspec.elc
HYPERBOLE_FILES = dir hyperbole-pkg.el info html $(EL_SRC) $(EL_COMPILE) $(EL_KOTL) \
$(ELC_COMPILE) Changes COPYING Makefile HY-ABOUT HY-ANNOUNCE HY-NEWS \
- HY-WHY.kotl INSTALL DEMO DEMO-ROLO.otl MANIFEST README _hypb .hypb file-newer smart-clib-sym \
+ HY-WHY.kotl INSTALL DEMO DEMO-ROLO.otl MANIFEST README _hypb .hypb smart-clib-sym \
topwin.py hyperbole-banner.png $(man_dir)/hkey-help.txt \
$(man_dir)/hyperbole.texi $(man_dir)/hyperbole.css $(man_dir)/version.texi
@@ -256,16 +255,18 @@ version: doc
# Build the Info, HTML and Postscript versions of the user manual and README.md.html.
doc: info html pdf README.md.html
+TEXINFO_SRC = $(man_dir)/hyperbole.texi $(man_dir)/version.texi $(man_dir)/hkey-help.txt $(man_dir)/im/*.png
+
info: $(man_dir)/hyperbole.info
-$(man_dir)/hyperbole.info: $(man_dir)/hyperbole.texi $(man_dir)/version.texi $(man_dir)/hkey-help.txt
+$(man_dir)/hyperbole.info: $(TEXINFO_SRC)
cd $(man_dir) && $(TEXI2INFO) hyperbole.texi
html: $(man_dir)/hyperbole.html
-$(man_dir)/hyperbole.html: $(man_dir)/hyperbole.texi $(man_dir)/version.texi $(man_dir)/hkey-help.txt $(man_dir)/hyperbole.css
+$(man_dir)/hyperbole.html: $(TEXINFO_SRC) $(man_dir)/hyperbole.css
cd ${man_dir} && $(TEXI2HTML) hyperbole.texi
pdf: $(man_dir)/hyperbole.pdf
-$(man_dir)/hyperbole.pdf: $(man_dir)/hyperbole.texi $(man_dir)/version.texi $(man_dir)/hkey-help.txt
+$(man_dir)/hyperbole.pdf: $(TEXINFO_SRC)
cd $(man_dir) && $(TEXI2PDF) hyperbole.texi
# github-markdown is an npm, installed with: npm install markdown-to-html -g
diff --git a/README.md b/README.md
index 21373a9..172b753 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-# GNU Hyperbole 7.0.2a - The Everyday Hypertextual Information Manager
+# GNU Hyperbole 7.0.3b - The Everyday Hypertextual Information Manager
+
+[Say thanks if you like Hyperbole.(https://saythanks.io/to/rswgnu)]
<!-- START doctoc generated TOC -->
**Table of Contents**
@@ -400,7 +402,7 @@ Typical Hyperbole applications include:
See the [HY-ABOUT](HY-ABOUT) file for a description and overview of Hyperbole.
-See the [HY-NEWS](HY-ABOUT) file for a summary of new features in this release.
+See the [HY-NEWS](HY-NEWS) file for a summary of new features in this release.
See the [INSTALL](INSTALL) file for installation and invocation instructions.
@@ -497,8 +499,16 @@ Keys).
products I have ever come across. It is certainly the one which has made
the biggest improvement in my personal productivity.
+ My Hyperbole button file is my start page in Emacs. It's a quickly
+ searchable index with links to countless resources. We also have a
+ library of implicit buttons that enable rapid navigation from references
+ in our code to our issue tracking system, so clicking a reference like
+ Client6502 opens the relevant conversation. Hyperbole provides a really
+ useful set of power tools. If Emacs is your preferred productivity
+ environment, it's definitely worth getting familiar with it.
+
-- Chris Nuzum
- Co-founder, Traction Software, Inc.
+ Co-founder, Traction Softwarea, Inc.
-------
diff --git a/README.md.html b/README.md.html
index 69f0f2b..e62461c 100644
--- a/README.md.html
+++ b/README.md.html
@@ -1,11 +1,12 @@
<h1>
-<a id="user-content-gnu-hyperbole-702a---the-everyday-hypertextual-information-manager" class="anchor" href="#gnu-hyperbole-702a---the-everyday-hypertextual-information-manager" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>GNU Hyperbole 7.0.2 - The Everyday Hypertextual Information Manager</h1>
+<a id="user-content-gnu-hyperbole-703b---the-everyday-hypertextual-information-manager" class="anchor" href="#gnu-hyperbole-703b---the-everyday-hypertextual-information-manager" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>GNU Hyperbole 7.0.3b - The Everyday Hypertextual Information Manager</h1>
+<p>[Say thanks if you like Hyperbole.(<a href="https://saythanks.io/to/rswgnu" rel="nofollow">https://saythanks.io/to/rswgnu</a>)]</p>
<p><strong>Table of Contents</strong></p>
<ul>
<li><a href="#summary">Summary</a></li>
<li><a href="#mailing-lists">Mailing Lists</a></li>
-<li><a href="#ftp-and-git">Ftp and Git Repository Downloads</a></li>
+<li><a href="#ftp-and-git-repository-downloads">Ftp and Git Repository Downloads</a></li>
<li><a href="#installation">Installation</a></li>
<li><a href="#invocation">Invocation</a></li>
<li><a href="#hyperbole-components">Hyperbole Components</a></li>
@@ -18,7 +19,7 @@
<li><a href="#why-was-hyperbole-developed">Why was Hyperbole developed?</a></li>
</ul>
-<p><a href="man/im/hyperbole-cv.png" target="_blank"><img src="man/im/hyperbole-cv.png" alt="Hyperbole screenshot of the Koutliner, DEMO file and HyRolo" style="max-width:100%;"></a></p>
+<p><a href="man/im/hyperbole-cv.png" target="_blank" rel="noopener noreferrer"><img src="man/im/hyperbole-cv.png" alt="Hyperbole screenshot of the Koutliner, DEMO file and HyRolo" style="max-width:100%;"></a></p>
<h2>
<a id="user-content-summary" class="anchor" href="#summary" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Summary</h2>
<p><code>GNU Hyperbole</code> (pronounced Ga-new Hi-per-bo-lee), or just <code>Hyperbole</code>,
@@ -163,7 +164,7 @@ menubar and {C-h h} will display a Hyperbole menu in the minibuffer for
quick keyboard-based selection.</p>
<p>You can invoke Hyperbole commands in one of three ways:</p>
<p>use the Hyperbole menu on your menubar;</p>
-<p><a href="man/im/menu-hyperbole.png" target="_blank"><img src="man/im/menu-hyperbole.png" alt="Hyperbole Menubar Menu" style="max-width:100%;"></a></p>
+<p><a href="man/im/menu-hyperbole.png" target="_blank" rel="noopener noreferrer"><img src="man/im/menu-hyperbole.png" alt="Hyperbole Menubar Menu" style="max-width:100%;"></a></p>
<p>type {C-h h} or {M-x hyperbole RET} to bring up the Hyperbole main menu
in the minibuffer window, for fast keyboard or mouse-based selection;
select an item from this menu by typing the item's first letter; use {q}
@@ -172,10 +173,10 @@ to quit from the menu.</p>
a pathname to display the associated file or directory.</p>
<p>Use {C-h h d d} for an interactive demonstration of standard Hyperbole
button capabilities.</p>
-<p><a href="man/im/demo.png" target="_blank"><img src="man/im/demo.png" alt="Hyperbole screenshot of the DEMO" style="max-width:100%;"></a></p>
+<p><a href="man/im/demo.png" target="_blank" rel="noopener noreferrer"><img src="man/im/demo.png" alt="Hyperbole screenshot of the DEMO" style="max-width:100%;"></a></p>
<p>{C-h h k e} offers an interactive demonstration of the Koutliner,
Hyperbole's multi-level autonumbered hypertextual outliner.</p>
-<p><a href="man/im/koutliner.png" target="_blank"><img src="man/im/koutliner.png" alt="Hyperbole screenshot of the Koutliner" style="max-width:100%;"></a></p>
+<p><a href="man/im/koutliner.png" target="_blank" rel="noopener noreferrer"><img src="man/im/koutliner.png" alt="Hyperbole screenshot of the Koutliner" style="max-width:100%;"></a></p>
<p>To try out HyControl, Hyperbole's interactive frame and window control
system, use {C-h h s w} for window control or {C-h h s f} for frame
control. {t} switches between window and frame control once in one of
@@ -237,7 +238,7 @@ HyRolo, which anyone can use is also included. It is easy to
learn to use since it introduces only a few new mechanisms and
has a menu interface, which may be operated from the keyboard or
the mouse.</p>
-<p><a href="man/im/menu-rolo.png" target="_blank"><img src="man/im/menu-rolo.png" alt="HyRolo Menubar Menu" style="max-width:100%;"></a></p>
+<p><a href="man/im/menu-rolo.png" target="_blank" rel="noopener noreferrer"><img src="man/im/menu-rolo.png" alt="HyRolo Menubar Menu" style="max-width:100%;"></a></p>
</li>
<li>
<p><strong>Screen Control</strong>: Hyperbole includes HyControl, the fastest,
@@ -384,7 +385,7 @@ their own links to archive entries.</p>
<h2>
<a id="user-content-files" class="anchor" href="#files" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Files</h2>
<p>See the <a href="HY-ABOUT">HY-ABOUT</a> file for a description and overview of Hyperbole.</p>
-<p>See the <a href="HY-ABOUT">HY-NEWS</a> file for a summary of new features in this release.</p>
+<p>See the <a href="HY-NEWS">HY-NEWS</a> file for a summary of new features in this release.</p>
<p>See the <a href="INSTALL">INSTALL</a> file for installation and invocation instructions.</p>
<p>See the <a href="HY-COPY">HY-COPY</a> and <a href="COPYING">COPYING</a> files for license information.</p>
<p>See the <a href="MANIFEST">MANIFEST</a> file for summaries of Hyperbole distribution files.</p>
@@ -439,7 +440,7 @@ Keys).</p>
<hr>
<p>One of the nicest things about Hyperbole is that it's available
everywhere. Org-mode is a mode and its features are only available in
-Org files. For instance if you dropped into <code>eshell' or</code>ansi-term' and
+Org files. For instance if you dropped into <code>eshell' or </code>ansi-term' and
did `ls', you can move point to any of the directory's contents, do M-RET
(or Shift-Button2) and jump to that file. And that's just one example.
Note that this means that all Hyperbole functionality is available in
@@ -466,8 +467,15 @@ Emacs packages and incredibly useful set of core features. I think that
Hyperbole is one of the best designed and most easily extensible software
products I have ever come across. It is certainly the one which has made
the biggest improvement in my personal productivity.</p>
+<p>My Hyperbole button file is my start page in Emacs. It's a quickly
+searchable index with links to countless resources. We also have a
+library of implicit buttons that enable rapid navigation from references
+in our code to our issue tracking system, so clicking a reference like
+Client6502 opens the relevant conversation. Hyperbole provides a really
+useful set of power tools. If Emacs is your preferred productivity
+environment, it's definitely worth getting familiar with it.</p>
<pre><code> -- Chris Nuzum
- Co-founder, Traction Software, Inc.
+ Co-founder, Traction Softwarea, Inc.
</code></pre>
<hr>
<p>I've found Hyperbole (in conjunction with XEmacs) to be very useful
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..c419263
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-cayman \ No newline at end of file
diff --git a/_hypb b/_hypb
index a3c7217..65fd41d 100644
--- a/_hypb
+++ b/_hypb
Binary files differ
diff --git a/hact.el b/hact.el
index 67e79da..e765732 100644
--- a/hact.el
+++ b/hact.el
@@ -259,9 +259,10 @@ Other paths are simply expanded. Non-path arguments are returned unchanged."
;;; ========================================================================
(defmacro hact (&rest args)
- "Performs action formed from rest of ARGS.
+ "Performs action formed from rest of ARGS and returns the result or acts as a no-op when testing implicit button type contexts.
First arg may be a symbol or symbol name for either an action type or a
-function. Runs `action-act-hook' before performing action."
+function. Runs `action-act-hook' before performing action.
+The value of `hrule:action' determines what effect this has."
(eval `(cons 'funcall (cons 'hrule:action ',args))))
(defun actype:act (actype &rest args)
diff --git a/hactypes.el b/hactypes.el
index bfe03fc..e082860 100644
--- a/hactypes.el
+++ b/hactypes.el
@@ -29,8 +29,8 @@
(key-regexp (concat "^[*]*[ \t]*\\\[" (ebut:key-to-label key) "\\\]"))
citation)
(if (save-excursion
- (goto-char (point-min))
- (setq citation (re-search-forward key-regexp nil t)))
+ (goto-char (point-max))
+ (setq citation (re-search-backward key-regexp nil t)))
(progn (hpath:display-buffer (current-buffer))
(goto-char citation)
(beginning-of-line))
@@ -250,7 +250,7 @@ Use `link-to-file' instead for a permanent link."
(hpath:find directory))
(defact link-to-ebut (key-file key)
- "Performs action given by another explicit button, specified by KEY-FILE and KEY."
+ "Performs action given by an explicit button, specified by KEY-FILE and KEY."
(interactive
(let (but-file but-lbl)
(while (cond ((setq but-file
@@ -272,11 +272,12 @@ Use `link-to-file' instead for a permanent link."
nil nil nil 'ebut)))
(beep))
(ebut:label-to-key but-lbl)))))
- (or (called-interactively-p 'interactive)
- (setq key-file (hpath:validate (hpath:substitute-value key-file))))
+ (unless (called-interactively-p 'interactive)
+ (setq key-file (hpath:validate (hpath:substitute-value key-file))))
(let ((but (ebut:get key (find-file-noselect key-file))))
(if but (hbut:act but)
- (hypb:error "(link-to-ebut): No button `%s' in `%s'." (ebut:key-to-label key)
+ (hypb:error "(link-to-ebut): No button `%s' in `%s'."
+ (ebut:key-to-label key)
key-file))))
(defact link-to-elisp-doc (symbol)
@@ -351,6 +352,24 @@ the window."
(hpath:find-line path line-num))
(move-to-column column-num)))
+(defact link-to-gbut (key)
+ "Performs an action given by an existing global button, specified by KEY."
+ (interactive
+ (let ((gbut-file (hpath:validate (hpath:substitute-value gbut:file)))
+ but-lbl)
+ (if (not (file-readable-p gbut-file))
+ (hypb:error "(link-to-gbut): You cannot read `%s'." gbut-file)
+ (list (progn
+ (find-file-noselect gbut-file)
+ (while (string-equal "" (setq but-lbl
+ (hargs:read-match
+ "Global button to link to: "
+ (mapcar 'list (gbut:label-list))
+ nil t nil 'gbut)))
+ (beep))
+ (hbut:label-to-key but-lbl))))))
+ (gbut:act (hbut:key-to-label key)))
+
(defact link-to-Info-index-item (index-item)
"Displays an Info index INDEX-ITEM cross-reference.
INDEX-ITEM must be a string of the form \"(filename)item-name\". During
@@ -373,6 +392,37 @@ available. Filename may be given without the .info suffix."
(id-info string)
(hypb:error "(link-to-Info-node): Invalid Info node: `%s'" string)))
+(defact link-to-ibut (key &optional key-file point)
+ "Performs an action given by an implicit button, specified by KEY-FILE, KEY and optional POINT.
+When creating the button, point must be on the implicit button to which to link
+and its buffer must have a file attached."
+ (interactive
+ (let ((ibut-key (ibut:at-p t)))
+ (if (and ibut-key buffer-file-name)
+ (list ibut-key buffer-file-name (point))
+ ;; When not on an ibut and moddifying the link, use existing arguments
+ (if (and (boundp 'defaults) (listp defaults))
+ defaults
+ (list nil nil nil)))))
+ (if key-file
+ (or (called-interactively-p 'interactive)
+ (null key-file)
+ (setq key-file (hpath:validate (hpath:substitute-value key-file))))
+ (setq key-file buffer-file-name))
+ (let (but)
+ (save-excursion
+ (save-restriction
+ (when key-file
+ (set-buffer (find-file-noselect key-file)))
+ (widen)
+ (if (integerp point) (goto-char (min point (point-max))))
+ (setq but (ibut:to key))))
+ (if but
+ (hbut:act but)
+ (hypb:error "(link-to-ibut): No button `%s' in `%s'."
+ (ibut:key-to-label key)
+ (or key-file (buffer-name))))))
+
(defact link-to-kcell (file cell-ref)
"Displays FILE with kcell given by CELL-REF at window top.
See documentation for `kcell:ref-to-id' for valid cell-ref formats.
diff --git a/hargs.el b/hargs.el
index 98ba9ad..dce7497 100644
--- a/hargs.el
+++ b/hargs.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 31-Oct-91 at 23:17:35
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -90,13 +90,23 @@ interactive form or takes no arguments."
(action:path-args-rel
(hargs:iform-read interactive-form modifying))))))
+(defun hargs:buffer-substring (start end)
+ (let ((string (buffer-substring-no-properties start end)))
+ ;; This may trigger on a colored grep-like output line which has
+ ;; an embedded null character with a display text property that
+ ;; displays it as a colon. Since the display property is stripped
+ ;; here, convert the null character to a colon.
+ (subst-char-in-string ?\^@ ?: string t)))
+
(defun hargs:delimited (start-delim end-delim
- &optional start-regexp-flag end-regexp-flag list-positions-flag)
- "Returns a normalized, single line, delimited string that point is within, or nil.
+ &optional start-regexp-flag end-regexp-flag
+ list-positions-flag exclude-regexp)
+ "Returns a normalized, single line, delimited string that point is within the first line of, or nil.
START-DELIM and END-DELIM are strings that specify the argument
delimiters. With optional START-REGEXP-FLAG non-nil, START-DELIM is
treated as a regular expression. END-REGEXP-FLAG is similar.
-With optional LIST-POSITIONS-FLAG, return list of (string-matched start-pos end pos)."
+With optional LIST-POSITIONS-FLAG, return list of (string-matched start-pos end-pos).
+With optional EXCLUDE-REGEXP, any matched string is ignored if it this regexp."
(let* ((opoint (point))
(limit (if start-regexp-flag opoint
(+ opoint (1- (length start-delim)))))
@@ -104,36 +114,57 @@ With optional LIST-POSITIONS-FLAG, return list of (string-matched start-pos end
'search-forward))
(end-search-func (if end-regexp-flag 're-search-forward
'search-forward))
+ (count 0)
start end)
(save-excursion
(beginning-of-line)
(while (and (setq start (funcall start-search-func start-delim limit t))
+ (setq count (1+ count))
(< (point) opoint)
;; This is not to find the real end delimiter but to find
;; end delimiters that precede the current argument and are
;; therefore false matches, hence the search is limited to
;; prior to the original point.
- (funcall end-search-func end-delim opoint t))
+ (funcall end-search-func end-delim opoint t)
+ (setq count (1+ count)))
(setq start nil))
+ (when (and (not start) (> count 0) (evenp count) (string-equal start-delim end-delim))
+ ;; Since strings can span lines but this function matches only
+ ;; strings that start on the current line, when start-delim and
+ ;; end-delim are the same and there are an even number of
+ ;; delimiters in the search range, causing the end-delim
+ ;; search to match to what should probably be the start-delim,
+ ;; assume point is within a string and not between two other strings.
+ ;; RSW - 02/05/2019
+ (setq start (point)))
(when start
(forward-line 2)
(setq limit (point))
(goto-char opoint)
(and (funcall end-search-func end-delim limit t)
(setq end (match-beginning 0))
- ;; Ignore any preceding backquote, e.g. when a double-quoted
- ;; string is embedded within a doc string.
+ ;; Ignore any preceding backslash, e.g. when a double-quoted
+ ;; string is embedded within a doc string, except when
+ ;; the string starts with 2 backslashes or an MSWindows
+ ;; disk drive prefix, in which case the backslash is
+ ;; considered part of a pathname.
(if (and (> end (point-min))
- (= (char-before end) ?\\))
+ (= (char-before end) ?\\)
+ (not (string-match (concat "\\(\\`[\\][\\]\\)\\|"
+ hpath:mswindows-mount-prefix)
+ (hargs:buffer-substring start end))))
(setq end (1- end))
t)
(< start end)
- (let ((string (substring-no-properties
- (hypb:replace-match-string
- "[\n\r]\\s-*" (buffer-substring start end) " " t))))
- (if list-positions-flag
- (list string start end)
- string)))))))
+ (>= end opoint)
+ (let ((string (hargs:buffer-substring start end)))
+ (unless (and (stringp exclude-regexp) (string-match exclude-regexp string) )
+ (setq string (hypb:replace-match-string "[\n\r\f]\\s-*" string " " t))
+ (unless hyperb:microsoft-os-p
+ (setq string (hpath:mswindows-to-posix string)))
+ (if list-positions-flag
+ (list string start end)
+ string))))))))
(defun hargs:get (interactive-entry &optional default prior-arg)
"Prompts for an argument, if need be, from INTERACTIVE-ENTRY, a string.
@@ -197,17 +228,13 @@ Optional DEFAULT-PROMPT is used to describe default value."
(defun hargs:select-event-window ()
"Select window, if any, that mouse was over during last event."
- (if (featurep 'xemacs)
- (if current-mouse-event
- (select-window
- (or (event-window current-mouse-event) (selected-window))))
- (let ((window (posn-window (event-start last-command-event))))
- (if (framep window)
- (setq window (frame-selected-window window)))
- (if (and (window-minibuffer-p window)
- (not (minibuffer-window-active-p window)))
- (error "Attempt to select inactive minibuffer window")
- (select-window (or window (selected-window)))))))
+ (let ((window (posn-window (event-start last-command-event))))
+ (if (framep window)
+ (setq window (frame-selected-window window)))
+ (if (and (window-minibuffer-p window)
+ (not (minibuffer-window-active-p window)))
+ (error "Attempt to select inactive minibuffer window")
+ (select-window (or window (selected-window))))))
(defun hargs:set-string-to-complete ()
"Store the current minibuffer contents into `hargs:string-to-complete'."
@@ -293,7 +320,13 @@ Handles all of the interactive argument types that `hargs:iform-read' does."
(t 0)))))
((hargs:completion t))
((eq hargs:reading-p 'ebut) (ebut:label-p 'as-label))
- ((ebut:label-p) nil)
+ ((eq hargs:reading-p 'ibut) (ibut:label-p 'as-label))
+ ((eq hargs:reading-p 'gbut)
+ (when (eq (current-buffer) (get-file-buffer gbut:file))
+ (hbut:label-p 'as-label)))
+ ((eq hargs:reading-p 'hbut) (or (ebut:label-p 'as-label)
+ (ibut:label-p 'as-label)))
+ ((hbut:label-p) nil)
((eq hargs:reading-p 'file)
(cond ((derived-mode-p 'dired-mode)
(let ((file (dired-get-filename nil t)))
@@ -490,7 +523,7 @@ See also documentation for `interactive'."
;; `@' means select window of last mouse event.
;;
;; `^' means activate/deactivate mark depending on invocation thru shift translation
- ;; See `this-command-keys-shift-translated' for somewhat of an explanation.
+ ;; See `this-command-keys-shift-translated' for an explanation.
;;
;; `_' means keep region in same state (active or inactive)
;; after this command. (XEmacs only.)
diff --git a/hbdata.el b/hbdata.el
index f1c2390..022c37c 100644
--- a/hbdata.el
+++ b/hbdata.el
@@ -115,8 +115,7 @@ Nil is returned when button has not beened modified."
(let ((case-fold-search t) (src-matches) (src) (matches) (end))
(goto-char (point-min))
(while (re-search-forward "^\^L\n\"\\([^\"]+\\)\"" nil t)
- (setq src (buffer-substring (match-beginning 1)
- (match-end 1))
+ (setq src (match-string 1)
matches nil)
(save-excursion
(setq end (if (re-search-forward "^\^L" nil t)
@@ -125,10 +124,7 @@ Nil is returned when button has not beened modified."
(concat "^(\"\\(" (if partial "[^\"]*")
(regexp-quote (ebut:label-to-key label))
(if partial "[^\"]*") "\\)\"") nil t)
- (setq matches (cons
- (buffer-substring (match-beginning 1)
- (match-end 1))
- matches)))
+ (setq matches (cons (match-string 1) matches)))
(if matches
(setq src-matches (cons (cons src matches) src-matches)))
(goto-char end))
@@ -220,7 +216,7 @@ class 'hbdata' to operate on the entry."
(defun hbdata:instance-next (lbl-key)
"Returns string for button instance number following LBL-KEY's.
-nil if LBL-KEY is nil."
+Nil if LBL-KEY is nil."
(and lbl-key
(if (string-match
(concat (regexp-quote ebut:instance-sep) "[0-9]+$") lbl-key)
@@ -237,8 +233,7 @@ Takes arguments LBL-KEY, KEY-SRC and optional DIRECTORY."
(hbdata:apply-entry
(lambda ()
(if (looking-at "[0-9]+")
- (string-to-number (buffer-substring (match-beginning 0)
- (match-end 0)))
+ (string-to-number (match-string 0))
1))
lbl-key key-src directory nil 'instance))
diff --git a/hbmap.el b/hbmap.el
index 085e888..baf0273 100644
--- a/hbmap.el
+++ b/hbmap.el
@@ -106,7 +106,7 @@ the error. Optional NO-SAVE disables saving of the map after operation."
;;; ************************************************************************
(defvar hbmap:dir-user
- (if (and hyperb:microcruft-os-p
+ (if (and hyperb:microsoft-os-p
(or (not (fboundp 'getenv))
(not (getenv "HOME"))))
"c:/_hyperb/" "~/.hyperb/")
diff --git a/hbut.el b/hbut.el
index 8198af7..cb4816b 100644
--- a/hbut.el
+++ b/hbut.el
@@ -33,8 +33,7 @@ Nil disables saving.")
(defconst ebut:max-len 100
"Maximum length of a hyper-button label.")
-
-(defun ebut:act (label)
+(defun ebut:act (label)
"Activates Hyperbole explicit button with LABEL from the current buffer."
(interactive (list (hargs:read-match "Activate explicit button labeled: "
(ebut:alist)
@@ -46,9 +45,9 @@ Nil disables saving.")
(error "(ebut:act): No explicit button labeled: %s" label))))
(defun ebut:alist (&optional file)
- "Returns alist with each element a list containing a button label.
-For use as a completion table. Gets labels from optional FILE or current
-buffer."
+ "Returns alist of ebuts in FILE or the current buffer.
+Each element is a list of just an explicit button label. For use
+as a completion table."
(mapcar 'list (ebut:list file)))
(defun ebut:at-p (&optional start-delim end-delim)
@@ -57,7 +56,8 @@ Assumes point is within first line of button label, if at all.
Optional START-DELIM and END-DELIM are strings that override default
button delimiters."
(let ((key (ebut:label-p nil start-delim end-delim)))
- (and key (ebut:get key))))
+ (when key
+ (ebut:get key))))
(defun ebut:create (&optional but-sym)
"Creates Hyperbole explicit button based on optional BUT-SYM.
@@ -95,60 +95,58 @@ Returns entry deleted (a list of attribute values) or nil."
(defun ebut:get (&optional lbl-key buffer key-src)
"Returns explicit Hyperbole button symbol given by LBL-KEY and BUFFER.
-KEY-SRC is given when retrieving global buttons and is full source pathname.
+KEY-SRC is given when retrieving global buttons and is the full source pathname.
+
Retrieves button data, converts into a button object and returns a symbol
which references the button.
-All arguments are optional. When none are given, returns symbol for
-button that point is within or nil. BUFFER defaults to the current
+All arguments are optional. When none are given, returns a symbol for
+the button that point is within or nil. BUFFER defaults to the current
buffer."
(hattr:clear 'hbut:current)
(save-excursion
(let ((key-file) (key-dir) (but-data) (actype))
- (or lbl-key (setq lbl-key (ebut:label-p)))
- (if buffer
- (if (bufferp buffer) (set-buffer buffer)
+ (unless lbl-key
+ (setq lbl-key (ebut:label-p)))
+ (when buffer
+ (if (bufferp buffer)
+ (set-buffer buffer)
(error "(ebut:get): Invalid buffer argument: %s" buffer)))
- (if key-src
- nil
- (if (equal lbl-key (ebut:label-p))
- nil
+ (when (not key-src)
+ (when (not (equal lbl-key (ebut:label-p)))
(goto-char (point-min))
(ebut:next-occurrence lbl-key))
- (if (setq key-src (ebut:key-src 'full))
- ;; `ebut:key-src' sets current buffer to key-src buffer.
- (setq buffer (current-buffer)))
- )
- (if (and (stringp lbl-key) key-src)
- (progn
- (if (stringp key-src)
- (setq key-dir (file-name-directory key-src)
- key-file (file-name-nondirectory key-src)))
- (setq but-data (and key-src
- (hbdata:get-entry lbl-key (or key-file key-src)
- key-dir)))
- (if (null but-data)
- nil
- (hattr:set 'hbut:current 'lbl-key lbl-key)
- (hattr:set 'hbut:current 'loc key-src)
- (hattr:set 'hbut:current 'categ 'explicit)
- (hattr:set 'hbut:current 'action nil)
- (hattr:set 'hbut:current 'actype
- (intern (setq actype (hbdata:actype but-data))))
- ;; Hyperbole V1 referent compatibility
- (if (= (length actype) 2)
- (hattr:set 'hbut:current 'referent
- (hbdata:referent but-data)))
- (hattr:set 'hbut:current 'args (hbdata:args but-data))
- (hattr:set 'hbut:current 'creator (hbdata:creator but-data))
- (hattr:set 'hbut:current
- 'create-time (hbdata:create-time but-data))
- (hattr:set 'hbut:current
- 'modifier (hbdata:modifier but-data))
- (hattr:set 'hbut:current
- 'mod-time (hbdata:mod-time but-data))
- 'hbut:current)
- )))))
+ (when (setq key-src (ebut:key-src 'full))
+ ;; `ebut:key-src' sets current buffer to key-src buffer.
+ (setq buffer (current-buffer))))
+ (when (and (stringp lbl-key) key-src)
+ (when (stringp key-src)
+ (setq key-dir (file-name-directory key-src)
+ key-file (file-name-nondirectory key-src)))
+ (setq but-data (and key-src
+ (hbdata:get-entry lbl-key (or key-file key-src)
+ key-dir)))
+ (when but-data
+ (hattr:set 'hbut:current 'lbl-key lbl-key)
+ (hattr:set 'hbut:current 'loc key-src)
+ (hattr:set 'hbut:current 'categ 'explicit)
+ (hattr:set 'hbut:current 'action nil)
+ (hattr:set 'hbut:current 'actype
+ (intern (setq actype (hbdata:actype but-data))))
+ ;; Hyperbole V1 referent compatibility
+ (if (= (length actype) 2)
+
+ (hattr:set 'hbut:current 'referent
+ (hbdata:referent but-data)))
+ (hattr:set 'hbut:current 'args (hbdata:args but-data))
+ (hattr:set 'hbut:current 'creator (hbdata:creator but-data))
+ (hattr:set 'hbut:current
+ 'create-time (hbdata:create-time but-data))
+ (hattr:set 'hbut:current
+ 'modifier (hbdata:modifier but-data))
+ (hattr:set 'hbut:current
+ 'mod-time (hbdata:mod-time but-data))
+ 'hbut:current)))))
(defun ebut:is-p (object)
"Returns non-nil if OBJECT denotes an explicit Hyperbole button."
@@ -160,131 +158,40 @@ buffer."
(and (stringp key) (stringp label)
(equal key (downcase (ebut:label-to-key label)))))
-(defun ebut:key-src (&optional full)
- "Returns key source (usually unqualified) for current Hyperbole button.
-Also sets current buffer to key source.
-With optional FULL when source is a pathname, the full pathname is returned."
- (let ((src (cond ((hmail:mode-is-p) (current-buffer))
- ;; If buffer represents the output of a document
- ;; formatter, e.g. an Info document produced from a
- ;; Texinfo source, then return the Texinfo source
- ;; file, for example.
- ((ebut:key-src-fmt))
- ;; Handle directory movement within `make' output.
- ((save-excursion
- (and (re-search-backward
- "^[a-z]*make[^a-z]+\\(Entering\\|Leaving\\) directory `\\([^']+\\)'" nil t)
- (string-equal "Entering"
- (buffer-substring (match-beginning 1)
- (match-end 1)))))
- (let ((limit (match-end 2))
- ;; Latest working directory that `make' reported
- (wd (buffer-substring (match-beginning 2)
- (match-end 2)))
- cd)
- ;; But another cd or pushd command may have been issued.
- ;; Return the closest directory from the make output.
- (if (re-search-backward
- "\\<\\(cd\\|pushd\\)\\s +[\"\']?\\([^;\"\'\n\r\^L\\]+\\)"
- limit t)
- (progn (setq cd (buffer-substring (match-beginning 2)
- (match-end 2)))
- ;; Eliminate any trailing whitespace.
- (setq cd (substring
- cd 0 (string-match "\\s +\\'" cd)))
- (expand-file-name cd wd))
- wd)))
- (buffer-file-name
- (if full
- buffer-file-name
- (file-name-nondirectory buffer-file-name)))
- ;; Handle any preceding @loc hyp-source implicit button location references.
- ;; This is used in report buffers of explicit buttons, i.e. hui:hbut-report.
- ((save-excursion
- (save-restriction
- (widen)
- (end-of-visible-line)
- (if (and (search-backward hbut:source-prefix nil t)
- (or (memq (preceding-char) '(?\n ?\r))
- (= (point) (point-min))))
- (hbut:source full)))))
- (t (current-buffer)))))
- (cond ((null src) nil)
- ((bufferp src)
- (set-buffer src)
- src)
- ((file-directory-p src)
- (file-name-as-directory src))
- ((file-readable-p src)
- (set-buffer (find-file-noselect src))
- src)
- ((file-readable-p (setq src (hpath:symlink-referent src)))
- (set-buffer (find-file-noselect src))
- src))))
-
-(defun ebut:key-src-fmt ()
- "Returns unformatted filename associated with formatted current buffer.
-This is used to obtain the source of explicit buttons for buffers that
-represent the output of particular document formatters."
- (and (or (eq major-mode 'Info-mode)
- (string-match "\\.info\\(-[0-9]+\\)?$" (buffer-name)))
- (let ((src (and buffer-file-name
- (substring
- buffer-file-name
- 0 (string-match "\\.[^.]+$" buffer-file-name)))))
- (cond ((file-exists-p (concat src ".texi"))
- (concat src ".texi"))
- ((file-exists-p (concat src ".texinfo"))
- (concat src ".texinfo"))
- ((current-buffer))))))
-
-(defun ebut:key-to-label (lbl-key)
- "Unnormalizes LBL-KEY and returns a label string approximating actual label."
- (if lbl-key
- (let* ((pos 0) (len (length lbl-key)) (lbl) c)
- (while (< pos len)
- (setq c (aref lbl-key pos)
- lbl (concat lbl
- (if (eq c ?_)
- (if (or (= (1+ pos) len)
- (not (eq (aref lbl-key (1+ pos)) ?_)))
- " "
- (setq pos (1+ pos))
- "_")
- (char-to-string c)))
- pos (1+ pos)))
- lbl)))
+(defalias 'ebut:key-src 'hbut:key-src)
+(defalias 'ebut:key-src-set-buffer 'hbut:key-src-set-buffer)
+(defalias 'ebut:key-src-fmt 'hbut:key-src-fmt)
+(defalias 'ebut:key-to-label 'hbut:key-to-label)
(defun ebut:label-p (&optional as-label start-delim end-delim pos-flag two-lines-flag)
- "Returns key for Hyperbole button label that point is within.
-Returns nil if not within a label. Assumes point is within first line
- of button label, if at all.
-All following arguments are optional. If AS-LABEL is non-nil, label
-is returned rather than the key derived from the label. START-DELIM
-and END-DELIM are strings that override default button delimiters.
-With POS-FLAG non-nil, returns list of label-or-key,
-but-start-position, but-end-position. Positions include delimiters.
-With TWO-LINES-FLAG non-nil, constrains label search to two lines."
+ "Returns key for the Hyperbole explicit button label that point is within, else nil.
+Assumes point is within the first line of any button label. All
+following arguments are optional. If AS-LABEL is non-nil, label
+is returned rather than the key derived from the label.
+START-DELIM and END-DELIM are strings that override default
+button delimiters. With POS-FLAG non-nil, returns list of
+label-or-key, but-start-position, but-end-position. Positions
+include delimiters. With TWO-LINES-FLAG non-nil, constrains
+label search to two lines."
(let ((opoint (point))
- (npoint)
(quoted "\\(^\\|[^\\{]\\)")
- (start)
(ebut:max-len ebut:max-len)
- lbl-key end but-start but-end)
- (or start-delim (setq start-delim ebut:start))
- (or end-delim (setq end-delim ebut:end))
- (setq npoint (+ opoint (length start-delim)))
- ;; Ensure label is not blank
+ npoint start lbl-key end but-start but-end start-regexp end-regexp)
+ (unless start-delim (setq start-delim ebut:start))
+ (unless end-delim (setq end-delim ebut:end))
+ (setq start-regexp (regexp-quote start-delim)
+ end-regexp (regexp-quote end-delim)
+ npoint (+ opoint (length start-delim)))
+ ;; Ensure label is not blank and point is within matching delimiters
(save-excursion
- (beginning-of-line)
+ (forward-line 0)
(while (and (progn
- (while (re-search-forward
- (concat quoted (regexp-quote start-delim))
- npoint t)
+ (while (and (< (point) npoint)
+ (re-search-forward (concat quoted start-regexp) npoint t))
(setq start t))
start)
- (re-search-forward (concat "[^\\{]" (regexp-quote end-delim))
- npoint t))
+ (< (point) opoint)
+ (re-search-forward (concat "[^\\{]" end-regexp) opoint t))
(setq start nil))
(when start
(setq start (point)
@@ -302,124 +209,51 @@ With TWO-LINES-FLAG non-nil, constrains label search to two lines."
(forward-line 2)
(setq ebut:max-len (- (point) start))))
(and (< (point) (+ start ebut:max-len))
- (re-search-forward (concat quoted (regexp-quote end-delim))
- (+ start ebut:max-len) t)
+ (re-search-forward (concat quoted end-regexp) (+ start ebut:max-len) t)
(setq but-end (point)
end (- (point) (length end-delim))
- lbl-key (ebut:label-to-key (buffer-substring start end)))
+ lbl-key (ebut:label-to-key (buffer-substring-no-properties start end)))
(cond (pos-flag
(if as-label
(list (ebut:key-to-label lbl-key) but-start but-end)
(list lbl-key but-start but-end)))
(t (if as-label (ebut:key-to-label lbl-key) lbl-key))))))))
-(defun ebut:label-regexp (lbl-key &optional no-delim)
- "Unnormalizes LBL-KEY. Returns regular expr matching delimited but label.
-Optional NO-DELIM leaves off delimiters and leading and trailing space."
- (if lbl-key
- (let* ((pos 0)
- (len (length lbl-key))
- (c)
- (sep0 "[ \t\n\r]*")
- (sep "[ \t\n\r]+")
- (regexp (if no-delim "" (concat (regexp-quote ebut:start) sep0)))
- (case-fold-search))
- (while (< pos len)
- (setq c (aref lbl-key pos)
- regexp (concat regexp
- (if (eq c ?_)
- (if (or (= (1+ pos) len)
- (not (eq (aref lbl-key (1+ pos)) ?_)))
- sep
- (setq pos (1+ pos))
- "_")
- (regexp-quote (char-to-string c))))
- pos (1+ pos)))
- (if no-delim regexp
- (setq regexp (concat regexp sep0 (regexp-quote ebut:end)))))))
+(defalias 'ebut:label-regexp 'hbut:label-regexp)
-(defun ebut:label-to-key (label)
- "Normalizes LABEL for use as a Hyperbole button key and returns key.
-Eliminates any fill prefix in the middle of the label, replaces `_' with
-`__', removes leading and trailing whitespace and replaces each other
-whitespace sequence with `_'."
- (if (null label)
- nil
- (setq label (hbut:fill-prefix-remove label)
- ;; Remove leading and trailing space.
- label (hypb:replace-match-string "\\`[ \t\n\r]+\\|[ \t\n\r]+\\'"
- label "" t)
- label (hypb:replace-match-string "_" label "__" t))
- (hypb:replace-match-string "[ \t\n\r]+" label "_" t)))
+(defalias 'ebut:label-to-key 'hbut:label-to-key)
(defun ebut:list (&optional file loc-p)
- "Returns list of button labels from given FILE or current buffer.
+ "Returns list of button labels from in FILE or the current buffer.
Removes duplicate labels if optional LOC-P is omitted. With LOC-P, returns
list of elements (label start end) where start and end are the buffer
-positions at which the starting button delimiter begins and ends."
+positions at which the button delimiter begins and ends."
(interactive)
(setq file (if file (and (file-exists-p file) (find-file-noselect file))
(current-buffer)))
- (if file
- (progn
- (set-buffer file)
- (let ((buts (ebut:map (if loc-p
- (lambda (lbl start end)
- ;; Normalize label spacing
- (list (ebut:key-to-label
- (ebut:label-to-key lbl))
- start end))
- (lambda (lbl start end)
- ;; Normalize label spacing
- (ebut:key-to-label
- (ebut:label-to-key lbl)))))))
- (if loc-p buts (if buts (apply #'set:create buts)))))))
-
-(defalias 'map-ebut 'ebut:map)
-(defun ebut:map (but-func &optional start-delim end-delim
- regexp-match include-delims)
- "Applies BUT-FUNC to buttons delimited by optional START-DELIM and END-DELIM.
+ (when file
+ (set-buffer file)
+ (let ((buts (ebut:map (if loc-p
+ (lambda (lbl start end)
+ ;; Normalize label spacing
+ (list (ebut:key-to-label (ebut:label-to-key lbl))
+ start end))
+ (lambda (lbl start end)
+ ;; Normalize label spacing
+ (ebut:key-to-label (ebut:label-to-key lbl)))))))
+ (if loc-p buts (when buts (apply #'set:create buts))))))
+
+(defalias 'map-ebut 'ebut:map)
+
+(defun ebut:map (but-func &optional regexp-match include-delims)
+ "Applies BUT-FUNC to the explicit buttons in the visible part of the current buffer.
If REGEXP-MATCH is non-nil, only buttons which match this argument are
considered.
-Maps over portion of buffer visible under any current restriction.
+
BUT-FUNC must take precisely three arguments: the button label, the
start position of the delimited button label and its end position (positions
-include delimiters when INCLUDE-DELIMS is non-nil).
-If END-DELIM is a symbol, e.g. t, then START-DELIM is taken as a regular
-expression which matches an entire button string."
- (or start-delim (setq start-delim ebut:start))
- (or end-delim (setq end-delim ebut:end))
- (let* ((regexp (symbolp end-delim))
- (end-sym (or regexp (substring end-delim -1)))
- (rtn)
- (ignore)
- start end but lbl)
- (save-excursion
- (goto-char (point-min))
- (setq include-delims (if include-delims 0 1))
- (while (re-search-forward
- (if regexp start-delim
- (concat (regexp-quote start-delim)
- "\\([^" end-sym "\"][^" end-sym "]*\\)"
- (regexp-quote end-delim)))
- nil t)
- (setq start (match-beginning include-delims)
- end (match-end include-delims)
- but (buffer-substring (match-beginning 0) (match-end 0))
- lbl (buffer-substring (match-beginning 1) (match-end 1))
- ;; If within a programming language buffer, ignore matches outside comments.
- ignore (and (derived-mode-p 'prog-mode)
- ;; Match is outside of a programming language comment
- (not (nth 4 (syntax-ppss)))))
- (save-excursion
- (goto-char start)
- ;; Ignore matches with quoted delimiters.
- (or ignore (setq ignore (memq (preceding-char) '(?\\ ?\{)))))
- (cond (ignore (setq ignore nil))
- ((or (not regexp-match)
- (string-match regexp-match but))
- (setq rtn (cons (funcall but-func lbl start end) rtn))))))
- (nreverse rtn)))
+include delimiters when INCLUDE-DELIMS is non-nil)."
+ (hbut:map but-func ebut:start ebut:end regexp-match include-delims))
(defun ebut:modify (&optional lbl-key but-sym)
"Modifies existing Hyperbole button from optional LBL-KEY and BUT-SYM.
@@ -451,12 +285,12 @@ move to the first occurrence of the button."
(goto-char (+ (match-beginning 0) (length ebut:start)))))
(defun ebut:operate (curr-label new-label)
- "Operates on and modifies properties of a new or existing Hyperbole button given by CURR-LABEL.
+ "Operates on and modifies properties of a new or existing explicit button given by CURR-LABEL.
When NEW-LABEL is non-nil, this is substituted for CURR-LABEL and the
associated button is modified. Otherwise, a new button is created.
-Returns instance string appended to label to form unique label, nil if
-label is already unique. Signals an error when no such button is found
-in the current buffer."
+Returns instance string appended to label to form a per-buffer unique
+label; nil if label is already unique. Signals an error when no such
+button is found in the current buffer."
(let* ((lbl-key (ebut:label-to-key curr-label))
(lbl-regexp (ebut:label-regexp lbl-key))
(modify new-label)
@@ -474,10 +308,10 @@ in the current buffer."
(let* ((but-key-and-pos (ebut:label-p nil nil nil 'pos))
(at-but (equal (car but-key-and-pos)
(ebut:label-to-key new-label))))
- (if at-but
- (ebut:delimit (nth 1 but-key-and-pos)
- (nth 2 but-key-and-pos)
- instance-flag))
+ (when at-but
+ (ebut:delimit (nth 1 but-key-and-pos)
+ (nth 2 but-key-and-pos)
+ instance-flag))
(cond ((ebut:map
(lambda (lbl start end)
(delete-region start end)
@@ -485,7 +319,7 @@ in the current buffer."
(point)
(progn (insert new-label) (point))
instance-flag))
- nil nil lbl-regexp 'include-delims))
+ lbl-regexp 'include-delims))
(at-but)
((hypb:error "(ebut:operate): No button matching: %s" curr-label))))
;; Add a new button.
@@ -496,7 +330,7 @@ in the current buffer."
buf-lbl (buffer-substring start end))
(equal buf-lbl curr-label))
nil)
- ((progn (if start (goto-char start))
+ ((progn (when start (goto-char start))
(looking-at (regexp-quote curr-label)))
(setq start (point)
end (match-end 0)))
@@ -516,15 +350,15 @@ in the current buffer."
(re-search-backward regexp nil t)))
(goto-char (+ (match-beginning 0) (length ebut:start))))))
;; instance-flag might be 't which we don't want to return.
- (if (stringp instance-flag) instance-flag))
+ (when (stringp instance-flag) instance-flag))
(hypb:error
"(ebut:operate): Operation failed. Check button attribute permissions: %s"
hattr:filename))))
(defun ebut:search (string out-buf &optional match-part)
"Writes explicit button lines matching STRING to OUT-BUF.
-Uses Hyperbole space into which user has written buttons for the search.
-By default, only matches for whole button labels are found, optional MATCH-PART
+Searches across all files into which the user has previously saved explicit buttons.
+By default, only matches for whole button labels are found; optional MATCH-PART
enables partial matches."
(let* ((buffers (mapcar (lambda (dir)
(expand-file-name hattr:filename dir))
@@ -600,6 +434,32 @@ enables partial matches."
(if kill-buf (kill-buffer currbuf)))))))))))
total))
+(defun ebut:to (lbl-key)
+ "Finds the nearest explicit button with LBL-KEY (a label or label key) within the visible portion of the current buffer.
+Leaves point inside the button label. Returns the symbol for the button, else nil."
+ ;; Handle a label given rather than a label key
+ (if (string-match-p "\\s-" lbl-key)
+ (setq lbl-key (ebut:label-to-key lbl-key)))
+ (let ((regexp (hbut:label-regexp lbl-key t))
+ pos
+ found)
+ (save-excursion
+ ;; Since point might be in the middle of the matching button,
+ ;; move to the start of line to ensure don't miss it when
+ ;; searching forward.
+ (forward-line 0)
+ ;; re-search forward
+ (while (and (not found) (re-search-forward regexp nil t))
+ (setq pos (match-beginning 0)
+ found (equal (ebut:label-p nil nil nil nil t) lbl-key)))
+ ;; re-search backward
+ (while (and (not found) (re-search-backward regexp nil t))
+ (setq pos (match-beginning 0)
+ found (equal (ebut:label-p nil nil nil nil t) lbl-key))))
+ (when found
+ (goto-char pos)
+ (ebut:at-p))))
+
;;; ------------------------------------------------------------------------
(defun ebut:delimit (start end instance-str)
"Delimits button label spanning region START to END in current buffer.
@@ -616,7 +476,7 @@ Inserts INSTANCE-STR after END, before ending delimiter."
(insert ebut:start)
(goto-char end)
(insert instance-str ebut:end)
- ;; Insert any comment before the start marker.
+ ;; Insert any comment delimiter before the start marker.
(set-marker-insertion-type start t)
(hbut:comment start end)
(if (fboundp 'hproperty:but-add)
@@ -638,9 +498,9 @@ Inserts INSTANCE-STR after END, before ending delimiter."
"\\)" match-part (regexp-quote ebut:end)))
(defconst ebut:start "<("
- "String matching the start of a hyper-button.")
+ "String matching the start of a Hyperbole explicit hyper-button.")
(defconst ebut:end ")>"
- "String matching the end of a hyper-button.")
+ "String matching the end of a Hyperbole explicit hyper-button.")
(defconst ebut:instance-sep ":"
"String of one character, separates an ebut label from its instance num.")
@@ -648,25 +508,36 @@ Inserts INSTANCE-STR after END, before ending delimiter."
;;; gbut class - Global Hyperbole buttons - activated by typing label name
;;; ========================================================================
-(defvar gbut:file (expand-file-name hbmap:filename hbmap:dir-user)
+(defvar gbut:file (expand-file-name hbmap:filename hbmap:dir-user)
"File that stores globally accessible Hyperbole buttons, accessed by name.")
-(defun gbut:act (label)
+(defun gbut:act (label)
"Activates Hyperbole global button with LABEL."
(interactive (list (hargs:read-match "Activate global button labeled: "
(mapcar 'list (gbut:label-list))
- nil t nil 'ebut)))
+ nil t nil 'gbut)))
(cond ((null label)
(error "(gbut:act): You have not created any global buttons"))
((equal label "")
(error "(gbut:act): Please try again and type ? for a list of existing global button names"))
(t (let* ((lbl-key (hbut:label-to-key label))
- (but (ebut:get lbl-key nil gbut:file)))
+ (but (gbut:get lbl-key)))
(if but
(hbut:act but)
- (error "(gbut:act): No global button labeled: %s" label))))))
+ (error "(gbut:act): No global button found for label: %s" label))))))
+
+(defun gbut:get (&optional lbl-key)
+ "Returns global Hyperbole button symbol given by optional LBL-KEY if found in gbut:file.
-(defun gbut:help (label)
+Retrieves any button data, converts into a button object and returns a symbol
+which references the button.
+
+All arguments are optional. When none are given, returns a symbol for
+the button that point is within or nil."
+ (or (ebut:get lbl-key nil gbut:file)
+ (ibut:get lbl-key nil gbut:file)))
+
+(defun gbut:help (label)
"Displays help for Hyperbole global button with LABEL."
(interactive (list (hargs:read-match "Report on global button labeled: "
(mapcar 'list (gbut:label-list))
@@ -677,18 +548,39 @@ Inserts INSTANCE-STR after END, before ending delimiter."
(hbut:report but)
(error "(gbut:help): No global button labeled: %s" label))))
-(defun gbut:label-list ()
+(defun gbut:label-list ()
"Returns list of global button labels."
(mapcar 'hbut:key-to-label (gbut:key-list)))
+
+(defun gbut:to (lbl-key)
+ "Finds the global button with LBL-KEY (a label or label key) within the visible portion of the global button file.
+Leaves point inside the button label, if it has one.
+Returns the symbol for the button, else nil."
+ (when (file-readable-p gbut:file)
+ (let ((obuf (current-buffer))
+ (opoint (point))
+ found)
+ (set-buffer (find-file-noselect gbut:file))
+ (setq found (or (ebut:to lbl-key) (ibut:to lbl-key)))
+ (if found
+ (hpath:display-buffer (current-buffer) 'this-window)
+ (set-buffer obuf)
+ (goto-char opoint))
+ found)))
+
;;; ------------------------------------------------------------------------
-(defun gbut:key-list ()
+(defun gbut:key-list ()
"Returns list of global button label keys."
+ (nconc (gbut:ebut-key-list) (gbut:ibut-key-list)))
+
+(defun gbut:ebut-key-list ()
+ "Returns a list of explicit button label keys from the global button file."
(save-excursion
(if (hbdata:to-entry-buf gbut:file)
- (let ((gbuts))
+ (let (gbuts)
(save-restriction
- (narrow-to-region (point) (if (search-forward "\^L" nil t)
+ (narrow-to-region (point) (if (search-forward "\f" nil t)
(point) (point-max)))
(goto-char (point-min))
(condition-case ()
@@ -696,6 +588,15 @@ Inserts INSTANCE-STR after END, before ending delimiter."
(error nil))
gbuts)))))
+(defun gbut:ibut-key-list ()
+ "Returns a list of implicit button label keys from the global button file."
+ (when (file-readable-p gbut:file)
+ (save-excursion
+ (set-buffer (find-file-noselect gbut:file))
+ (save-restriction
+ (widen)
+ (ibut:label-map #'(lambda (label start end) (ibut:label-to-key label)))))))
+
;;; ========================================================================
;;; hattr class
;;; ========================================================================
@@ -807,10 +708,10 @@ Suitable for use as part of `write-file-functions'."
"Sets OBJ-SYMBOL's attribute ATTR-SYMBOL to ATTR-VALUE and returns ATR-VALUE."
(put obj-symbol attr-symbol attr-value))
-(defalias 'hattr:summarize 'hattr:report)
+(defalias 'hattr:summarize 'hattr:report)
(defvar hattr:filename
- (if hyperb:microcruft-os-p "_hypb" ".hypb")
+ (if hyperb:microsoft-os-p "_hypb" ".hypb")
"Per directory file name in which explicit button attributes are stored.
If you change its value, you will be unable to use buttons created by
others who use a different value!")
@@ -914,12 +815,115 @@ Ignores email-related buffers."
hbut:fill-prefix-regexps))
label)
+(defun hbut:get (&optional lbl-key buffer key-src)
+ "Returns explicit or labeled implicit Hyperbole button symbol given by LBL-KEY and BUFFER.
+KEY-SRC is given when retrieving global buttons and is the full source pathname.
+
+Returns a symbol which references the button.
+
+All arguments are optional. When none are given, returns a
+symbol for the button or button label that point is within or
+nil. BUFFER defaults to the current buffer."
+ (or (ebut:get lbl-key buffer key-src) (ibut:get lbl-key buffer key-src)))
+
(defun hbut:is-p (object)
"Returns non-nil if object denotes a Hyperbole button."
- (and (symbolp object) (hattr:get object 'categ)))
+ (and (symbolp object) (hattr:get object 'categ)))
+
+(defun hbut:key-src (&optional full)
+ "Returns key source (usually unqualified) for current Hyperbole button.
+Also sets current buffer to key source.
+With optional FULL when source is a pathname, the full pathname is returned."
+ (let ((src (cond ((hmail:mode-is-p) (current-buffer))
+ ;; If buffer represents the output of a document
+ ;; formatter, e.g. an Info document produced from a
+ ;; Texinfo source, then return the Texinfo source
+ ;; file, for example.
+ ((hbut:key-src-fmt))
+ ;; Handle directory movement within `make' output.
+ ((save-excursion
+ (and (re-search-backward
+ "^[a-z]*make[^a-z]+\\(Entering\\|Leaving\\) directory `\\([^']+\\)'" nil t)
+ (string-equal "Entering" (match-string 1))))
+ (let ((limit (match-end 2))
+ ;; Latest working directory that `make' reported
+ (wd (match-string 2))
+ cd)
+ ;; But another cd or pushd command may have been issued.
+ ;; Return the closest directory from the make output.
+ (if (re-search-backward
+ "\\<\\(cd\\|pushd\\)\\s +[\"\']?\\([^;\"\'\n\r\^L\\]+\\)"
+ limit t)
+ (progn (setq cd (match-string 2))
+ ;; Eliminate any trailing whitespace.
+ (setq cd (substring
+ cd 0 (string-match "\\s +\\'" cd)))
+ (expand-file-name cd wd))
+ wd)))
+ (buffer-file-name
+ (if full
+ buffer-file-name
+ (file-name-nondirectory buffer-file-name)))
+ ;; Handle any preceding @loc hyp-source implicit button location references.
+ ;; This is used in report buffers of explicit buttons, i.e. hui:hbut-report.
+ ((save-excursion
+ (save-restriction
+ (widen)
+ (end-of-visible-line)
+ (if (and (search-backward hbut:source-prefix nil t)
+ (or (memq (preceding-char) '(?\n ?\r))
+ (= (point) (point-min))))
+ (hbut:source full)))))
+ (t (current-buffer)))))
+ (hbut:key-src-set-buffer src)))
-(defalias 'hbut:key-src 'ebut:key-src)
-(defalias 'hbut:key-to-label 'ebut:key-to-label)
+(defun hbut:key-src-fmt ()
+ "Returns unformatted filename associated with formatted current buffer.
+This is used to obtain the source of Hyperbole buttons for buffers that
+represent the output of particular document formatters."
+ (and (or (eq major-mode 'Info-mode)
+ (string-match "\\.info\\(-[0-9]+\\)?$" (buffer-name)))
+ (let ((src (and buffer-file-name
+ (substring
+ buffer-file-name
+ 0 (string-match "\\.[^.]+$" buffer-file-name)))))
+ (cond ((file-exists-p (concat src ".texi"))
+ (concat src ".texi"))
+ ((file-exists-p (concat src ".texinfo"))
+ (concat src ".texinfo"))
+ ((current-buffer))))))
+
+(defun hbut:key-src-set-buffer (src)
+ "Set buffer to SRC, a buffer, file, directory or symlink and return SRC or nil if invalid."
+ (cond ((null src) nil)
+ ((bufferp src)
+ (set-buffer src)
+ src)
+ ((file-directory-p src)
+ (file-name-as-directory src))
+ ((file-readable-p src)
+ (set-buffer (find-file-noselect src))
+ src)
+ ((file-readable-p (setq src (hpath:symlink-referent src)))
+ (set-buffer (find-file-noselect src))
+ src)))
+
+(defun hbut:key-to-label (lbl-key)
+ "Unnormalizes LBL-KEY and returns a label string for display."
+ (if lbl-key
+ (let* ((pos 0) (len (length lbl-key)) (lbl) c)
+ (while (< pos len)
+ (setq c (aref lbl-key pos)
+ lbl (concat lbl
+ (if (eq c ?_)
+ (if (or (= (1+ pos) len)
+ (not (eq (aref lbl-key (1+ pos)) ?_)))
+ " "
+ (setq pos (1+ pos))
+ "_")
+ (char-to-string c)))
+ pos (1+ pos)))
+ lbl)))
(defun hbut:label (hbut)
"Returns the label for Hyperbole button symbol HBUT."
@@ -928,8 +932,111 @@ Ignores email-related buffers."
(error "(hbut:label): Argument is not a Hyperbole button symbol, `%s'"
hbut)))
-(defalias 'hbut:label-p 'ebut:label-p)
-(defalias 'hbut:label-to-key 'ebut:label-to-key)
+(defun hbut:label-p (&optional as-label start-delim end-delim pos-flag two-lines-flag)
+ "Returns key for the Hyperbole button label that point is within, else nil.
+Assumes point is within the first line of any button label. All
+following arguments are optional. If AS-LABEL is non-nil, label
+is returned rather than the key derived from the label.
+START-DELIM and END-DELIM are strings that override default
+button delimiters. With POS-FLAG non-nil, returns list of
+label-or-key, but-start-position, but-end-position. Positions
+include delimiters. With TWO-LINES-FLAG non-nil, constrains
+label search to two lines."
+ (or (ebut:label-p as-label start-delim end-delim pos-flag two-lines-flag)
+ (ibut:label-p as-label start-delim end-delim pos-flag two-lines-flag)))
+
+(defun hbut:label-regexp (lbl-key &optional no-delim start-delim end-delim)
+ "Unnormalizes LBL-KEY. Returns regular expr matching delimited button label.
+Optional NO-DELIM leaves off delimiters and leading and trailing space.
+Optional START-DELIM and END-DELIM are added around the returned
+label; these default to `ebut:start' and `ebut:end'."
+ (when lbl-key
+ (let* ((pos 0)
+ (len (length lbl-key))
+ (c)
+ (sep0 "[ \t\n\r]*")
+ (sep "[ \t\n\r]+")
+ (regexp (if no-delim "" (concat (regexp-quote (or start-delim ebut:start)) sep0)))
+ (case-fold-search))
+ (while (< pos len)
+ (setq c (aref lbl-key pos)
+ regexp (concat regexp
+ (if (eq c ?_)
+ (if (or (= (1+ pos) len)
+ (not (eq (aref lbl-key (1+ pos)) ?_)))
+ sep
+ (setq pos (1+ pos))
+ "_")
+ (regexp-quote (char-to-string c))))
+ pos (1+ pos)))
+ (if no-delim
+ regexp
+ (setq regexp (concat regexp sep0 (regexp-quote (or end-delim ebut:end))))))))
+
+(defun hbut:label-to-key (label)
+ "Normalizes LABEL for use as a Hyperbole button key and returns key.
+Eliminates any fill prefix in the middle of the label, replaces `_' with
+`__', removes leading and trailing whitespace and replaces each other
+whitespace sequence with `_'."
+ (when label
+ (setq label (hbut:fill-prefix-remove label)
+ ;; Remove leading and trailing space.
+ label (hypb:replace-match-string "\\`[ \t\n\r]+\\|[ \t\n\r]+\\'"
+ label "" t)
+ label (hypb:replace-match-string "_" label "__" t))
+ (hypb:replace-match-string "[ \t\n\r]+" label "_" t)))
+
+(defun hbut:map (but-func &optional start-delim end-delim
+ regexp-match include-delims)
+ "Applies BUT-FUNC to a set of Hyperbole buttons in the visible part of the current buffer.
+The set of buttons are those whose labels are delimited by optional START-DELIM and
+END-DELIM and that match any optional REGEXP-MATCH.
+
+START-DELIM defaults to ebut:start; END-DELIM defaults to ebut:end.
+If END-DELIM is a symbol, e.g. t, then START-DELIM is taken as a regular
+expression which matches an entire button string.
+
+BUT-FUNC must take precisely three arguments: the button label, the
+start position of the delimited button label and its end position (positions
+include delimiters when INCLUDE-DELIMS is non-nil)."
+ (or start-delim (setq start-delim ebut:start))
+ (or end-delim (setq end-delim ebut:end))
+ (let* ((regexp (symbolp end-delim))
+ (end-sym (or regexp (substring end-delim -1)))
+ (rtn)
+ (ignore)
+ start end but lbl)
+ (save-excursion
+ (goto-char (point-min))
+ (setq include-delims (if include-delims 0 1))
+ (while (re-search-forward
+ (if regexp start-delim
+ (concat (regexp-quote start-delim)
+ "\\([^" end-sym "\"][^" end-sym "]*\\)"
+ (regexp-quote end-delim)))
+ nil t)
+ (setq start (match-beginning include-delims)
+ end (match-end include-delims)
+ but (match-string 0)
+ lbl (match-string 1)
+ ;; If within a programming language buffer, ignore matches outside comments.
+ ignore (hbut:outside-comment-p))
+ (save-excursion
+ (goto-char start)
+ ;; Ignore matches with quoted delimiters.
+ (or ignore (setq ignore (memq (preceding-char) '(?\\ ?\{)))))
+ (cond (ignore (setq ignore nil))
+ ((or (not regexp-match)
+ (string-match regexp-match but))
+ (setq rtn (cons (funcall but-func lbl start end) rtn))))))
+ (nreverse rtn)))
+
+(defun hbut:outside-comment-p ()
+ "Returns t if within a programming language buffer and prior regexp match is outside a comment, else nil."
+ (when (and (derived-mode-p 'prog-mode)
+ (not (eq major-mode 'lisp-interaction-mode)))
+ ;; Match is outside of a programming language comment
+ (not (nth 4 (syntax-ppss)))))
(defun hbut:report (&optional arg)
"Pretty prints the attributes of a button or buttons.
@@ -1003,17 +1110,17 @@ Returns number of buttons reported on or nil if none."
If a file, always returns a full path if optional FULL is non-nil."
(goto-char (match-end 0))
(cond ((looking-at "#<buffer \"?\\([^\n\"]+\\)\"?>")
- (get-buffer (buffer-substring (match-beginning 1)
- (match-end 1))))
+ (get-buffer (match-string 1)))
((looking-at "\".+\"")
- (let* ((file (buffer-substring (1+ (match-beginning 0))
- (1- (match-end 0))))
+ (let* ((file (buffer-substring-no-properties
+ (1+ (match-beginning 0))
+ (1- (match-end 0))))
(absolute (file-name-absolute-p file)))
(if (and full (not absolute))
(expand-file-name file default-directory)
file)))))
-(defalias 'hbut:summarize 'hbut:report)
+(defalias 'hbut:summarize 'hbut:report)
(defvar hbut:current nil
"The currently selected Hyperbole button. Available to action routines.")
@@ -1023,44 +1130,157 @@ If a file, always returns a full path if optional FULL is non-nil."
This expression should be followed immediately by a file-name indicating the
source file for the buttons in the menu, if any.")
+(defun hbut:label-list ()
+ "Returns list of current buffer's Hyperbole button labels."
+ (mapcar 'hbut:key-to-label (hbut:key-list)))
+
+;;; ------------------------------------------------------------------------
+
+(defun hbut:key-list ()
+ "Returns list of global button label keys."
+ (nconc (hbut:ebut-key-list) (hbut:ibut-key-list)))
+
+(defun hbut:ebut-key-list (&optional key-src)
+ "Returns a list of explicit button label keys from optional KEY-SRC or the current buffer."
+ (save-excursion
+ (if (hbdata:to-entry-buf (or key-src (buffer-file-name)))
+ (let (hbuts)
+ (save-restriction
+ (narrow-to-region (point) (if (search-forward "\f" nil t)
+ (point) (point-max)))
+ (goto-char (point-min))
+ (condition-case ()
+ (while (setq hbuts (cons (car (read (current-buffer))) hbuts)))
+ (error nil))
+ hbuts)))))
+
+(defun hbut:ibut-key-list (&optional key-src)
+ "Returns a list of implicit button label keys from optional KEY-SRC or the current buffer."
+ (save-excursion
+ (when (hbut:key-src-set-buffer (or key-src (current-buffer)))
+ (save-restriction
+ (widen)
+ (ibut:label-map #'(lambda (label start end) (ibut:label-to-key label)))))))
+
;;; ========================================================================
;;; ibut class - Implicit Hyperbole Buttons
;;; ========================================================================
+(defun ibut:alist (&optional file)
+ "Returns alist of labeled ibuts in FILE or the current buffer.
+Each element is a list of just an implicit button label. For use
+as a completion table."
+ (mapcar 'list (ibut:list file)))
+
(defun ibut:at-p (&optional key-only)
"Returns symbol for implicit button at point, else nil.
-With optional KEY-ONLY, returns only the label key for button."
- (let ((types (htype:category 'ibtypes))
- ;; Global var used in (hact) function, don't delete.
- (hrule:action 'actype:identity)
- (itype)
- (args)
- (is-type))
- (or key-only (hattr:clear 'hbut:current))
- (while (and (not is-type) types)
- (setq itype (car types))
- (if (setq args (funcall itype))
- (setq is-type itype)
- (setq types (cdr types))))
- (if is-type
- (if key-only
- (hattr:get 'hbut:current 'lbl-key)
- (hattr:set 'hbut:current 'loc (save-excursion
- (hbut:key-src 'full)))
- (hattr:set 'hbut:current 'categ is-type)
- (or (hattr:get 'hbut:current 'args)
- (not (listp args))
- (progn
- (hattr:set 'hbut:current 'actype
- (or
- ;; Hyperbole action type
- (intern-soft (concat "actypes::"
- (symbol-name (car args))))
- ;; Regular Emacs Lisp function symbol
- (car args)
- ))
- (hattr:set 'hbut:current 'args (cdr args))))
- 'hbut:current))))
+Point may be on the implicit button or its optional preceding label.
+With optional KEY-ONLY, returns only the label key for button.
+
+Any labeled implicit button must contain at least two characters,
+excluding delimiters, not just one."
+ (let* ((opoint (point))
+ (label-key-start-end (ibut:label-p nil nil nil t t))
+ (lbl-key (car label-key-start-end)))
+ (unwind-protect
+ (when (not (hbut:outside-comment-p))
+ ;; Skip past any optional label and separators
+ (when label-key-start-end
+ (goto-char (nth 2 label-key-start-end))
+ (when (looking-at ibut:label-separator-regexp)
+ ;; Move past up to 2 possible characters of ibut
+ ;; delimiters; this prevents recognizing labeled,
+ ;; delimited ibuts of a single character but no one
+ ;; should need that.
+ (goto-char (min (+ 2 (match-end 0)) (point-max)))))
+
+ ;; Check for an implicit button at current point, record its
+ ;; attributes and return a button symbol for it.
+ (let ((types (htype:category 'ibtypes))
+ ;; Global var used in (hact) function, don't delete.
+ (hrule:action 'actype:identity)
+ (itype)
+ (args)
+ (is-type))
+ (unless key-only
+ (hattr:clear 'hbut:current))
+ (while (and (not is-type) types)
+ (setq itype (car types))
+ (if (setq args (funcall itype))
+ (setq is-type itype)
+ (setq types (cdr types))))
+ (when is-type
+ (when lbl-key
+ (hattr:set 'hbut:current 'lbl-key lbl-key))
+ (if key-only
+ (hattr:get 'hbut:current 'lbl-key)
+ (hattr:set 'hbut:current 'loc (save-excursion
+ (hbut:key-src 'full)))
+ (hattr:set 'hbut:current 'categ is-type)
+ (or (hattr:get 'hbut:current 'args)
+ (not (listp args))
+ (progn
+ (hattr:set 'hbut:current 'actype
+ (or
+ ;; Hyperbole action type
+ (intern-soft (concat "actypes::"
+ (symbol-name (car args))))
+ ;; Regular Emacs Lisp function symbol
+ (car args)))
+ (hattr:set 'hbut:current 'args (cdr args))))
+ 'hbut:current))))
+ (goto-char opoint))))
+
+(defun ibut:at-type-p (ibut-type-symbol)
+ "Returns non-nil if point is on a button of type `ibut-type-symbol`.
+Point must be on the button itself and not its label, if any.
+
+The return value is a list of the type's action type symbol and
+associated arguments from the button."
+ (when (and ibut-type-symbol (symbolp ibut-type-symbol))
+ (let ((type-name (symbol-name ibut-type-symbol)))
+ (unless (string-match "::" type-name)
+ (setq ibut-type-symbol (intern-soft (concat "ibtypes::" type-name))))
+ (when ibut-type-symbol
+ (let ((types (htype:category 'ibtypes))
+ ;; Global var used in (hact) function, don't delete.
+ (hrule:action 'actype:identity))
+ (funcall ibut-type-symbol))))))
+
+(defun ibut:get (&optional lbl-key buffer key-src)
+ "Returns implicit Hyperbole button symbol given by LBL-KEY and BUFFER.
+KEY-SRC is given when retrieving global buttons and is the full source pathname.
+
+Returns a symbol which references the button.
+
+All arguments are optional. When none are given, returns a
+symbol for the button or button label that point is within or
+nil. BUFFER defaults to the current buffer."
+ (hattr:clear 'hbut:current)
+ (save-excursion
+ (let ((key-file) (key-dir) (but-data) (actype))
+ (unless lbl-key
+ (setq lbl-key (ibut:label-p nil nil nil nil t)))
+ (when buffer
+ (if (bufferp buffer)
+ (set-buffer buffer)
+ (error "(ibut:get): Invalid buffer argument: %s" buffer)))
+ (when (not key-src)
+ (when (not (equal lbl-key (ibut:label-p nil nil nil nil t)))
+ (goto-char (point-min))
+ (ibut:next-occurrence lbl-key))
+ (when (setq key-src (hbut:key-src 'full))
+ ;; `hbut:key-src' sets current buffer to key-src buffer.
+ (setq buffer (current-buffer))))
+ (when (and (stringp lbl-key) key-src)
+ (when (stringp key-src)
+ (setq key-dir (file-name-directory key-src)
+ key-file (file-name-nondirectory key-src)))
+ (set-buffer (find-file-noselect key-src))
+ (goto-char (point-min))
+ (ibut:next-occurrence lbl-key)
+ ;; Build and return button symbol with button properties
+ (ibut:at-p)))))
(defun ibut:is-p (object)
"Returns non-nil if object denotes an implicit Hyperbole button."
@@ -1068,16 +1288,66 @@ With optional KEY-ONLY, returns only the label key for button."
(let ((categ (hattr:get object 'categ)))
(and categ (string-match "^ibtypes::" (symbol-name categ))))))
-(defun ibut:label-p ()
- "Returns key for Hyperbole implicit button label that point is on or nil."
- (ibut:at-p 'key-only))
+(defun ibut:label-map (but-func &optional start-delim end-delim
+ regexp-match include-delims)
+ "Applies BUT-FUNC to buttons delimited by optional START-DELIM and END-DELIM.
+START-DELIM defaults to ibut:label-start; END-DELIM defaults to ibut:label-end.
+If REGEXP-MATCH is non-nil, only buttons which match this argument are
+considered.
+
+Maps over portion of buffer visible under any current restriction.
+BUT-FUNC must take precisely three arguments: the button label, the
+start position of the delimited button label and its end position (positions
+include delimiters when INCLUDE-DELIMS is non-nil).
+If END-DELIM is a symbol, e.g. t, then START-DELIM is taken as a regular
+expression which matches an entire button string."
+ (hbut:map but-func ibut:label-start ibut:label-end))
+
+(defun ibut:rename (old-lbl new-lbl)
+ "Modifies a label preceding a Hyperbole implicit button in the current buffer given by LBL-KEY.
+Signals an error when no such button is found in the current buffer.
+
+Leaves point at the start of the button label which may be elsewhere
+than the current point; callers should use `save-excursion` to retain
+current."
+ ;; !! Need to handle adding instances to labels, similar to ebut:operate.
+ (cond ((or (not (stringp new-lbl)) (< (length new-lbl) 1))
+ (error "(ibut:rename): Invalid 'new-lbl' argument: \"%s\"" new-lbl))
+ ((or (not (stringp old-lbl)) (< (length old-lbl) 1))
+ (error "(ibut:rename): Invalid 'old-lbl' argument: \"%s\"" old-lbl))
+ ((ibut:to old-lbl)
+ (delete-region (point) (search-forward ibut:label-end nil t))
+ (save-excursion (insert new-lbl ibut:label-end)))
+ (t (error "(ibut:rename): Button '%s' not found in visible portion of buffer." old-lbl))))
+
+(defun ibut:label-p (&optional as-label start-delim end-delim pos-flag two-lines-flag)
+ "Returns key for the Hyperbole implicit button label that point is within, else nil.
+This is an optional label that may precede an implicit button.
+Use `ibut:at-p' instead to test if point is on either the
+implicit button itself or the label. Assumes point is within the
+first line of any button label.
+
+All following arguments are optional. If AS-LABEL is non-nil,
+label is returned rather than the key derived from the label.
+START-DELIM and END-DELIM are strings that override default
+button delimiters. With POS-FLAG non-nil, returns list of
+label-or-key, but-label-start-position, but-label-end-position.
+Positions include delimiters. With TWO-LINES-FLAG non-nil,
+constrains label search to two lines."
+ (ebut:label-p as-label (or start-delim ibut:label-start)
+ (or end-delim ibut:label-end) pos-flag two-lines-flag))
+
+(defun ibut:label-regexp (lbl-key &optional no-delim)
+ "Unnormalizes ibutton LBL-KEY. Returns regular expr matching delimited button label.
+Optional NO-DELIM leaves off delimiters and leading and trailing space."
+ (hbut:label-regexp lbl-key no-delim ibut:label-start ibut:label-end))
(defun ibut:label-set (label &optional start end)
- "Sets current implicit button attributes from LABEL and START, END position.
-Returns label. START and END are optional. When given, they specify the
-region in the buffer to flash when this implicit button is activated or
-queried for its attributes. If LABEL is a list, it is assumed to contain all
-arguments."
+ "Sets current implicit button attributes from LABEL and optional START, END positions.
+Returns label. When START and END are given, they specify the
+region in the buffer to flash when this implicit button is
+activated or queried for its attributes. If LABEL is a list, it
+is assumed to contain all arguments."
(cond ((stringp label)
(hattr:set 'hbut:current 'lbl-key (hbut:label-to-key label))
(and start (hattr:set 'hbut:current 'lbl-start start))
@@ -1089,12 +1359,103 @@ arguments."
(t (error "(ibut:label-set): Invalid label arg: `%s'" label)))
label)
+(defun ibut:list (&optional file loc-p)
+ "Returns list of labels of labeled ibuts in FILE or the current buffer.
+Removes duplicate labels if optional LOC-P is omitted. With LOC-P, returns
+list of elements (label start end) where start and end are the buffer
+positions at which the button label delimiter begins and ends."
+ (interactive)
+ (setq file (if file (and (file-exists-p file) (find-file-noselect file))
+ (current-buffer)))
+ (when file
+ (set-buffer file)
+ (let ((buts (ibut:map (if loc-p
+ (lambda (lbl start end)
+ ;; Normalize label spacing
+ (list (ibut:key-to-label (ibut:label-to-key lbl))
+ start end))
+ (lambda (lbl start end)
+ ;; Normalize label spacing
+ (ibut:key-to-label (ibut:label-to-key lbl)))))))
+ (if loc-p buts (when buts (apply #'set:create buts))))))
+
+(defalias 'ibut:key-src 'hbut:key-src)
+(defalias 'ibut:key-to-label 'hbut:key-to-label)
+(defalias 'ibut:label-to-key 'hbut:label-to-key)
+(defalias 'map-ibut 'ibut:map)
+
+(defun ibut:map (but-func &optional start-delim end-delim
+ regexp-match include-delims)
+ "Applies BUT-FUNC to the labeled implicit buttons in the visible part of the current buffer.
+If REGEXP-MATCH is non-nil, only buttons which match this argument are
+considered.
+
+BUT-FUNC must take precisely three arguments: the button label, the
+start position of the delimited button label and its end position (positions
+include delimiters when INCLUDE-DELIMS is non-nil)."
+ (hbut:map but-func ibut:label-start ibut:label-end regexp-match include-delims))
+
+(defun ibut:next-occurrence (lbl-key &optional buffer)
+ "Moves point to next occurrence of a labeled implicit button with LBL-KEY in optional BUFFER.
+BUFFER defaults to current buffer. It may be a buffer name.
+Returns non-nil iff occurrence is found.
+
+Remember to use (goto-char (point-min)) before calling this in order to
+move to the first occurrence of the button."
+ (if buffer
+ (if (not (or (bufferp buffer)
+ (and (stringp buffer) (get-buffer buffer))))
+ (error "(ibut:next-occurrence): Invalid buffer arg: %s" buffer)
+ (switch-to-buffer buffer)))
+ (when (re-search-forward (ibut:label-regexp lbl-key) nil t)
+ (goto-char (+ (match-beginning 0) (length ibut:label-start)))))
+
+(defalias 'ibut:summarize 'hbut:report)
+
+(defun ibut:to (lbl-key)
+ "Finds the nearest implicit button with LBL-KEY (a label or label key) within the visible portion of the current buffer.
+Leaves point inside the button text or its optional label, if it has one.
+Returns the symbol for the button, else nil."
+ ;; Handle a label given rather than a label key
+ (if (string-match-p "\\s-" lbl-key)
+ (setq lbl-key (ibut:label-to-key lbl-key)))
+ (let ((regexp (hbut:label-regexp lbl-key t))
+ pos
+ found)
+ (save-excursion
+ ;; Since point might be in the middle of the matching button,
+ ;; move to the start of line to ensure don't miss it when
+ ;; searching forward.
+ (forward-line 0)
+ ;; re-search forward
+ (while (and (not found) (re-search-forward regexp nil t))
+ (setq pos (match-beginning 0)
+ found (equal (ibut:label-p nil nil nil nil t) lbl-key)))
+ ;; re-search backward
+ (while (and (not found) (re-search-backward regexp nil t))
+ (setq pos (match-beginning 0)
+ found (equal (ibut:label-p nil nil nil nil t) lbl-key))))
+ (when found
+ (goto-char pos)
+ (ibut:at-p))))
+
+;;; ------------------------------------------------------------------------
+(defconst ibut:label-start "<["
+ "String matching the start of a Hyperbole implicit button label.")
+(defconst ibut:label-end "]>"
+ "String matching the end of a Hyperbole implicit button label.")
+(defvar ibut:label-separator " "
+ "Regular expression that separates an implicit button label from its implicit button text.")
+
+(defvar ibut:label-separator-regexp "\\s-*[-:=]*\\s-+"
+ "Regular expression that separates an implicit button label from its implicit button text.")
+
;;; ========================================================================
;;; ibtype class - Implicit button types
;;; ========================================================================
-(defalias 'defib 'ibtype:create)
-(put 'ibtype:create 'lisp-indent-function 'defun)
+(defalias 'defib 'ibtype:create)
+(put 'ibtype:create 'lisp-indent-function 'defun)
(defmacro ibtype:create (type params doc at-p &optional to-p style)
"Creates Hyperbole implicit button TYPE (unquoted sym) with PARAMS, described by DOC.
PARAMS are presently ignored.
diff --git a/hib-kbd.el b/hib-kbd.el
index 339930a..bc4ab9f 100644
--- a/hib-kbd.el
+++ b/hib-kbd.el
@@ -11,15 +11,16 @@
;;
;;; Commentary:
;;
-;; A press of the Action Key on a key sequence executes its
-;; command binding or Hyperbole minibuffer menu binding.
+;; A press of the Action Key on any sequence of keys delimited by braces
+;; executes its command binding or Hyperbole minibuffer menu binding.
;;
-;; A press of the Assist Key on a key sequence displays the
-;; documentation for it.
+;; A press of the Assist Key on any sequence of keys delimited by braces
+;; displays the documentation for it.
;;
-;; Key sequences should be in human readable string form with spaces
-;; between each key and the whole sequence delimited by braces,
-;; e.g. {C-x o}. Forms such as {\C-b}, {\^b}, and {^b} will not be
+;; Sequences of keys should be in human readable string form with spaces
+;; between each key, may contain any number of individual key sequences
+;; and the whole thing should be delimited by braces, e.g. {M-x apropos
+;; RET hyperbole RET}. Forms such as {\C-b}, {\^b}, and {^b} will not be
;; recognized.
;;; Code:
@@ -32,10 +33,10 @@
;;; ************************************************************************
;;; Public implicit button types
;;; ************************************************************************
-
-(defact kbd-key (key-sequence)
+
+(defact kbd-key (key-series)
"Executes a normalized key sequence without curly braces, {}.
-KEY-SEQUENCE must be a string of one of the following:
+KEY-SERIES 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,
@@ -43,7 +44,7 @@ KEY-SEQUENCE must be a string of one of the following:
Returns t if the sequence appears to be valid, else nil."
(interactive "kKey sequence to execute (no {}): ")
- (kbd-key:act key-sequence))
+ (kbd-key:act key-series))
(defib kbd-key ()
"Executes a key sequence found around point, delimited by curly braces, {}, if any.
@@ -65,37 +66,38 @@ Any key sequence must be a string of one of the following:
;; these are special quote marks, not the
;; standard ASCII characters.
(hbut:label-p t "‘" "’" t)))
- (key-sequence (car seq-and-pos))
+ ;; This excludes delimiters
+ (key-series (car seq-and-pos))
(start (cadr seq-and-pos))
binding)
;; Match only when start delimiter is preceded by whitespace or
;; is the 1st buffer character, so do not match to things like ${variable}.
- (when (= (char-syntax (or (char-before start) ?\t)) ?\ )
- (when (and (stringp key-sequence)
- (not (eq key-sequence "")))
- (setq key-sequence (kbd-key:normalize key-sequence)
- binding (key-binding key-sequence)))
- (and (stringp key-sequence)
+ (when (memq (char-before start) '(nil ?\ ?\t ?\n ?\j ?\f))
+ (when (and (stringp key-series)
+ (not (eq key-series "")))
+ (setq key-series (kbd-key:normalize key-series)
+ binding (key-binding key-series)))
+ (and (stringp key-series)
(or (and binding (not (integerp binding)))
- (kbd-key:special-sequence-p key-sequence))
+ (kbd-key:special-sequence-p key-series))
(ibut:label-set seq-and-pos)
- (hact 'kbd-key key-sequence))))))
+ (hact 'kbd-key key-series))))))
;;; ************************************************************************
;;; Public functions
;;; ************************************************************************
-(defun kbd-key:act (key-sequence)
- "Executes the command binding for normalized KEY-SEQUENCE.
-Returns t if KEY-SEQUENCE has a binding, else nil."
+(defun kbd-key:act (key-series)
+ "Executes the command binding for normalized KEY-SERIES.
+Returns t if KEY-SERIES has a binding, else nil."
(interactive "kKeyboard key to execute (no {}): ")
- (setq current-prefix-arg nil) ;; Execution of the key-sequence may set it.
- (let ((binding (key-binding key-sequence)))
+ (setq current-prefix-arg nil) ;; Execution of the key-series may set it.
+ (let ((binding (key-binding key-series)))
(cond ((null binding)
;; If this is a special key seqence, execute it by adding
;; its keys to the stream of unread command events.
- (when (kbd-key:special-sequence-p key-sequence)
- (setq unread-command-events (nconc unread-command-events (mapcar 'identity key-sequence)))
+ (when (kbd-key:special-sequence-p key-series)
+ (setq unread-command-events (nconc unread-command-events (mapcar 'identity key-series)))
t))
((memq binding '(action-key action-mouse-key hkey-either))
(beep)
@@ -103,11 +105,11 @@ Returns t if KEY-SEQUENCE has a binding, else nil."
t)
(t (call-interactively binding) t))))
-(defun kbd-key:doc (key-sequence &optional full)
- "Shows first line of doc for binding of keyboard KEY-SEQUENCE in minibuffer.
+(defun kbd-key:doc (key-series &optional full)
+ "Shows first line of doc for binding of keyboard KEY-SERIES in minibuffer.
With optional prefix arg FULL, displays full documentation for command."
(interactive "kKey sequence: \nP")
- (let* ((keys (kbd-key:normalize key-sequence))
+ (let* ((keys (kbd-key:normalize key-series))
(cmd (let ((cmd (key-binding keys)))
(if (not (integerp cmd)) cmd)))
(doc (and cmd (documentation cmd)))
@@ -117,7 +119,7 @@ With optional prefix arg FULL, displays full documentation for command."
(or full
(setq end-line (string-match "[\n]" doc)
doc (substitute-command-keys (substring doc 0 end-line))))
- (setq doc (format "No documentation for {%s} %s" key-sequence (or cmd ""))))
+ (setq doc (format "No documentation for {%s} %s" key-series (or cmd ""))))
(if (and cmd doc)
(if full
(describe-function cmd)
@@ -126,18 +128,19 @@ With optional prefix arg FULL, displays full documentation for command."
(if full
(hui:menu-help doc)
(message doc)))
- (t (error "(kbd-key:doc): No binding found for keys {%s}" key-sequence)))))
+ (t (hkey-help)))))
+
(defun kbd-key:help (but)
"Display documentation for binding of keyboard key given by BUT's label."
(let ((kbd-key (hbut:key-to-label (hattr:get but 'lbl-key))))
(if kbd-key (kbd-key:doc kbd-key t))))
-(defun kbd-key:normalize (key-sequence)
- "Returns KEY-SEQUENCE string (without surrounding {}) normalized into a form that can be parsed by commands."
+(defun kbd-key:normalize (key-series)
+ "Returns KEY-SERIES string (without surrounding {}) normalized into a form that can be parsed by commands."
(interactive "kKeyboard key sequence to normalize (no {}): ")
- (if (stringp key-sequence)
- (let ((norm-key-seq (copy-sequence key-sequence))
+ (if (stringp key-series)
+ (let ((norm-key-seq (copy-sequence key-series))
(case-fold-search nil)
(case-replace t)
(substring)
@@ -171,17 +174,7 @@ With optional prefix arg FULL, displays full documentation for command."
(string-to-number (substring norm-key-seq (match-beginning 2)
(match-end 2)))
norm-key-seq (substring norm-key-seq (match-end 0))))
- (let (arg-val)
- (while (string-match "\\`C-u" norm-key-seq)
- (if (or (not (listp arg))
- (not (integerp (setq arg-val (car arg)))))
- (setq arg '(1)
- arg-val 1))
- (setq arg-val (* arg-val 4)
- arg (cons arg-val nil)
- norm-key-seq (substring norm-key-seq (match-end 0)))))
- (if arg (setq norm-key-seq (concat (format "\025%s" arg) norm-key-seq)))
- ;;
+
;; Quote Control and Meta key names
(setq norm-key-seq (hypb:replace-match-string
"C-\\(.\\)" norm-key-seq
@@ -197,36 +190,36 @@ With optional prefix arg FULL, displays full documentation for command."
(lambda (str)
(concat "" (substring str (match-beginning 1)
(1+ (match-beginning 1))))))))
- (error "(kbd-key:normalize): requires a string argument, not `%s'" key-sequence)))
+ (error "(kbd-key:normalize): requires a string argument, not `%s'" key-series)))
;;; ************************************************************************
;;; Private functions
;;; ************************************************************************
-(defun kbd-key:extended-command-p (key-sequence)
- "Returns non-nil if the string KEY-SEQUENCE is a normalized extended command invocation, i.e. M-x command."
- (and (stringp key-sequence) (string-match kbd-key:extended-command-prefix key-sequence)))
+(defun kbd-key:extended-command-p (key-series)
+ "Returns non-nil if the string KEY-SERIES is a normalized extended command invocation, i.e. M-x command."
+ (and (stringp key-series) (string-match kbd-key:extended-command-prefix key-series)))
-(defun kbd-key:hyperbole-hycontrol-key-p (key-sequence)
- "Returns t if normalized KEY-SEQUENCE is given when in a HyControl mode, else nil.
+(defun kbd-key:hyperbole-hycontrol-key-p (key-series)
+ "Returns t if normalized, non-nil KEY-SERIES is given when in a HyControl mode, else nil.
Allows for multiple key sequences strung together."
- (and key-sequence
+ (and key-series
(featurep 'hycontrol)
(or hycontrol-windows-mode hycontrol-frames-mode)
;; If wanted to limit to single key bindings and provide tighter checking:
- ;; (string-match "[-.0-9]*\\(.*\\)" key-sequence)
- ;; (key-binding (match-string 1 key-sequence))
+ ;; (string-match "[-.0-9]*\\(.*\\)" key-series)
+ ;; (key-binding (match-string 1 key-series))
t))
-(defun kbd-key:hyperbole-mini-menu-key-p (key-sequence)
- "Returns t if normalized KEY-SEQUENCE appears to invoke a Hyperbole menu item or sequence of keys, else nil."
- (when key-sequence
+(defun kbd-key:hyperbole-mini-menu-key-p (key-series)
+ "Returns t if normalized KEY-SERIES appears to invoke a Hyperbole menu item or sequence of keys, else nil."
+ (when key-series
(let ((mini-menu-key (kbd-key:normalize (key-description (car (where-is-internal 'hyperbole))))))
- (if (string-match (regexp-quote mini-menu-key) key-sequence) t))))
+ (if (string-match (regexp-quote mini-menu-key) key-series) t))))
-(defun kbd-key:key-and-arguments (key-sequence)
- "Returns t if normalized KEY-SEQUENCE appears to be a bound key sequence possibly with following interactive arguments, else nil."
- (let ((prefix-binding (and (stringp key-sequence) (key-binding (substring key-sequence 0 1)))))
+(defun kbd-key:key-and-arguments (key-series)
+ "Returns t if normalized KEY-SERIES appears to be a bound key sequence possibly with following interactive arguments, else nil."
+ (let ((prefix-binding (and (stringp key-series) (key-binding (substring key-series 0 1)))))
;; Just ensure that 1st character is bound to something that is
;; not a self-insert-command or a number.
(and prefix-binding
@@ -253,16 +246,16 @@ Allows for multiple key sequences strung together."
start end))
string))
-(defun kbd-key:special-sequence-p (key-sequence)
- "Returns non-nil if normalized KEY-SEQUENCE string is one of the following:
+(defun kbd-key:special-sequence-p (key-series)
+ "Returns non-nil if normalized KEY-SERIES string is 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."
- (or (kbd-key:hyperbole-mini-menu-key-p key-sequence)
- (kbd-key:hyperbole-hycontrol-key-p key-sequence)
- (kbd-key:extended-command-p key-sequence)
- (kbd-key:key-and-arguments key-sequence)))
+ (or (kbd-key:hyperbole-mini-menu-key-p key-series)
+ (kbd-key:hyperbole-hycontrol-key-p key-series)
+ (kbd-key:extended-command-p key-series)
+ (kbd-key:key-and-arguments key-series)))
;;; ************************************************************************
;;; Private variables
diff --git a/hib-social.el b/hib-social.el
index 2f0e550..29df535 100644
--- a/hib-social.el
+++ b/hib-social.el
@@ -16,11 +16,11 @@
;; When the referent is a web page, this calls the function given by
;; `hibtypes-social-display-function' to display it, initially set to `browse-url'.
;;
-;; A hashtag reference is either: [facebook|github|git|instagram|twitter]#<hashtag>
-;; or using 2-letter service abbreviations: [fb|gh|gt|in|tw]#<hashtag>.
+;; A hashtag reference is either: [facebook|github|gitlab|git|instagram|twitter]#<hashtag>
+;; or using 2-letter service abbreviations: [fb|gh|gl|gt|in|tw]#<hashtag>.
;;
-;; A username reference is either: [facebook|github|instagram|twitter]@<username>
-;; or [fb|gh|in|tw]@<username>.
+;; A username reference is either: [facebook|github|gitlab|instagram|twitter]@<username>
+;; or [fb|gh|gl|in|tw]@<username>.
;;
;; If the social media service is not given, it defaults to the value of
;; `hibtypes-social-default-service', initially set to \"twitter\".
@@ -32,6 +32,7 @@
;; facebook@zuck Display user's home page
;; github@rswgnu
+;; gitlab@seriyalexandrov
;; instagram@lostart
;; twitter@nytimestravel
@@ -98,7 +99,8 @@
;; gh#rswgnu/helm/global_mouse Display user project's branch
;; gh#rswgnu/hyperbole/55a1f0 Display user project's commit diff
;;
-;; gh#orgs/github/people List the org, github's staff
+;; gh#orgs/github/people (or staff) List the org, github's staff
+;; gh#/github/fetch/contributors List contributors to github's fetch project
;;
;; (setq hibtypes-github-default-user "rswgnu")
;; github#/hyperbole Display default user's project
@@ -112,12 +114,12 @@
;;
;; like so:
;;
-;; gh#issues List emacs-helm/helm's open issues
-;; gh#1878 Display a specific project issue
-;;
-;; gh#pulls List project's open pull requests
+;; gh#pulls List project's open pull requests (PRs)
;; gh#pull/1871 Display a specific project pull request
;;
+;; gh#issues List emacs-helm/helm's open issues
+;; gh#1878 Display a specific project issue (or PR)
+;;
;; gh#branches List project's branches
;; gh#branch/global_mouse List files in a specific branch
;; gh#global_mouse You can even leave off the `branch' keyword
@@ -129,6 +131,40 @@
;; gh#898e55c Display default user and default
;; project commit diff
+;; Gitlab (remote) reference links support the same reference types as Github (but
+;; substitute the gl# prefix) plus these additional reference types:
+;;
+;; gl#/libertybsd/libertybsd-status Group and project
+;;
+;; gl#gitlab-org/gitlab-ce/activity Summarize user's project activity
+;; gl#gitlab-org/gitlab-ce/analytics Display user project's cycle_analytics
+;; gl#gitlab-org/gitlab-ce/boards Display user project's kanban-type issue boards
+;;
+;; Once you set the default user and project variables, you can leave
+;; them off any reference links:
+;;
+;; (setq hibtypes-gitlab-default-user "gitlab-org")
+;; (setq hibtypes-gitlab-default-project "gitlab-ce")
+;;
+;; gl#issues or gl#list Display default project's issue list
+;; gl#jobs Display default project's computing jobs
+;; gl#labels Display default project's issue categories
+;; gl#members Display default project's staff list
+;; gl#contributors Show contributor push frequency charts
+;; gl#merge_requests or gl#pulls Display default project's pull requests
+;; gl#milestones Display default project's milestones status
+;; gl#pages Display default project's web pages
+;; gl#pipelines List build and test sequences
+;; gl#pipeline_charts Graphical view of pipeline run results across time
+;; gl#schedules Display schedules for project pipelines
+;; gl#snippets Project snippets, diffs and text with discussion
+;;
+;; gl#groups List all available groups of projects
+;; gl#projects List all available projects
+;;
+;; gl#milestone=38 Show a specific project milestone
+;; gl#snippet/1689487 Show a specific project snippet
+
;;; Code:
;;; ************************************************************************
;;; Other required Elisp libraries
@@ -147,6 +183,7 @@
:type '(radio (const "facebook")
(const "git")
(const "github")
+ (const "gitlab")
(const "instagram")
(const "twitter"))
:group 'hyperbole-button)
@@ -171,6 +208,16 @@
:type 'string
:group 'hyperbole-button)
+(defcustom hibtypes-gitlab-default-project nil
+ "Default project name to associate with any Github commit link."
+ :type 'string
+ :group 'hyperbole-button)
+
+(defcustom hibtypes-gitlab-default-user nil
+ "Default user name to associate with any Github commit link."
+ :type 'string
+ :group 'hyperbole-button)
+
;;; ************************************************************************
;;; Private variables
;;; ************************************************************************
@@ -178,6 +225,7 @@
(defconst hibtypes-social-hashtag-alist
'(("\\`\\(fb\\|facebook\\)\\'" . "https://www.facebook.com/hashtag/%s")
("\\`\\(gh\\|github\\)\\'" . "https://github.com/%s/%s/%s%s")
+ ("\\`\\(gl\\|gitlab\\)\\'" . "https://www.gitlab.com/%s/%s/%s%s")
("\\`\\(gt\\|git\\)\\'" . "(cd %s; git %s %s)")
("\\`\\(in\\|instagram\\)\\'" . "https://www.instagram.com/explore/tags/%s/")
("\\`\\(tw\\|twitter\\)\\'" . "https://twitter.com/search?q=%%23%s&src=hashtag")
@@ -187,6 +235,7 @@
(defconst hibtypes-social-username-alist
'(("\\`\\(fb\\|facebook\\)\\'" . "https://www.facebook.com/%s")
("\\`\\(gh\\|github\\)\\'" . "https://github.com/%s/")
+ ("\\`\\(gl\\|gitlab\\)\\'" . "https://www.gitlab.com/%s/")
("\\`\\(in\\|instagram\\)\\'" . "https://www.instagram.com/%s/")
("\\`\\(tw\\|twitter\\)\\'" . "https://twitter.com/search?q=@%s")
)
@@ -212,8 +261,8 @@ See `ibtypes::social-reference' for format details.")
(defib social-reference ()
"Display the web page associated with a social hashtag or username reference at point.
Reference format is:
- [facebook|git|github|instagram|twitter]?[#@]<reference> or
- [fb|gt|gh|in|tw]?[#@]<reference>.
+ [facebook|git|github|gitlab|instagram|twitter]?[#@]<reference> or
+ [fb|gt|gh|gl|in|tw]?[#@]<reference>.
The first part of the label for a button of this type is the social
service name. The service name defaults to the value of
@@ -257,6 +306,8 @@ listed in `hibtypes-social-inhibit-modes'."
(hact 'git-reference after-hash-str))
((string-match "\\`\\(gh\\|github\\)#" ref)
(hact 'github-reference after-hash-str))
+ ((string-match "\\`\\(gl\\|gitlab\\)#" ref)
+ (hact 'gitlab-reference after-hash-str))
(t (hact 'social-reference service ref-kind-str after-hash-str))))))
;; Don't make this a defact or its arguments may be improperly expanded as pathnames.
@@ -289,10 +340,11 @@ REFERENCE is a string of one of the following forms:
or /<project>.
<ref-item> is one of these:
- one of the words: branches, commits, issues, pulls, or tags; the associated items are listed;
+ one of the words: branches, commits, contributors, issues, people or staff,
+ pulls, status or tags; the associated items are listed;
- one of the words: branch, commit, issue, pull or tag followed by a '/' and
- item id; the item is shown;
+ one of the words: branch, commit, issue, pull or tag followed by a '/' or '=' and
+ an item-id; the item is shown;
an issue reference given by a positive integer, e.g. 92 or prefaced with GH-, e.g. GH-92;
the issue is displayed;
@@ -314,7 +366,7 @@ PROJECT value is provided, it defaults to the value of
(url-to-format (assoc-default "github" hibtypes-social-hashtag-alist #'string-match))
(ref-type))
(when url-to-format
- (cond ((string-match "\\`\\(branch\\|commit\\|issue\\|pull\\|tag\\)/" reference)
+ (cond ((string-match "\\`\\(branch\\|commit\\|issue\\|pull\\|tag\\)[/=]" reference)
;; [branch | commit | issue | pull | tag]/ref-item
nil)
((string-match "\\`/?\\(\\([^/#@]+\\)/\\)\\([^/#@]+\\)\\'" reference)
@@ -331,25 +383,34 @@ PROJECT value is provided, it defaults to the value of
;; /project
(setq project (or project (match-string-no-properties 1 reference))
reference nil)))
+ (when (or (and project (string-match "\\`\\(members\\|people\\|staff\\)\\'" project))
+ ;; Change <org-name>/[members|people|staff] to /orgs/<org-name>/people.
+ (and reference (string-match "\\`\\(members\\|people\\|staff\\)\\'" reference)))
+ ;; Change <org-name>/project/[people|staff] to /orgs/<org-name>/people.
+ (setq project user
+ user "orgs"
+ reference "people"))
+ (when (equal reference "contributors")
+ ;; Change /user/project/contributors to /user/project/graphs/contributors.
+ (setq ref-type "graphs/"
+ reference "contributors"))
(unless (stringp user) (setq user hibtypes-github-default-user))
(unless (stringp project) (setq project hibtypes-github-default-project))
(when reference
- (cond ((equal user "orgs")
- ;; A specific organization reference
- (setq ref-type reference
- reference ""))
- ((member reference '("branches" "commits" "issues" "pulls" "tags"))
- ;; All branches, commits, open issues, pull requests or commit tags reference
+ (cond ((member reference '("branches" "commits" "contributors" "issues" "people" "pulls" "tags"))
+ ;; All branches, commits, contributors, open issues, people, pull requests or commit tags reference
(setq ref-type reference
reference ""))
- ((and (< (length reference) 7) (string-match "\\`\\([gG][hH]-\\)?[0-9]+\\'" reference))
- ;; Specific issue reference
- (setq ref-type "issues/"))
- ((string-match "\\`\\(commit\\|issue\\|pull\\)/" reference)
+ ((and (< (length reference) 8) (string-match "\\`\\([gG][hH]-\\)?[0-9]+\\'" reference))
+ ;; Issue ref-id reference
+ (setq ref-type "issues/"
+ reference (substring reference (match-end 1) (match-end 0))))
+ ((string-match "\\`\\(commit\\|issue\\|pull\\)[/=]" reference)
;; Specific reference preceded by keyword branch, commit,
;; issue, or pull
- (setq ref-type (substring reference 0 (match-end 0))
- reference (substring reference (match-end 0))))
+ (setq ref-type (substring reference 0 (match-end 1))
+ reference (substring reference (match-end 0))
+ ref-type (concat ref-type (if (string-equal ref-type "issue") "s/" "/"))))
((string-match "\\`[0-9a-f]+\\'" reference)
;; Commit reference
(setq ref-type "commit/"))
@@ -363,7 +424,8 @@ PROJECT value is provided, it defaults to the value of
(funcall hibtypes-social-display-function
(if reference
(format url-to-format user project ref-type reference)
- (format url-to-format user project "" "")))
+ ;; Remove trailing /
+ (substring (format url-to-format user project "" "") 0 -1)))
(cond ((and (null user) (null project))
(error "(github-reference): Set `hibtypes-github-default-user' and `hibtypes-github-default-project'"))
((null user)
@@ -373,6 +435,169 @@ PROJECT value is provided, it defaults to the value of
(unless url-to-format
(error "(github-reference): Add an entry for github to `hibtypes-social-hashtag-alist'"))))))
+;;; Remote Gitlab commit references
+
+;; Don't make this a defact or its arguments may be improperly expanded as pathnames.
+(defun gitlab-reference (reference &optional user project)
+ "Display the Gitlab entity associated with REFERENCE and optional USER and PROJECT.
+REFERENCE is a string of one of the following forms:
+ <ref-item>
+ <user>/<project>/<ref-item>
+ <project>/<ref-item>
+ /<group>/<project>
+or /<project-or-group> (where a group is a collection of projects).
+
+<ref-item> is one of these:
+ one of the words: activity, analytics, boards or kanban, branches, commits, contributors,
+ groups, issues or list, jobs, labels, merge_requests, milestones, pages, pipelines,
+ pipeline_charts, members or people or staff, projects, pulls, schedules, snippets,
+ status or tags; the associated items are listed;
+
+ one of the words: branch, commit(s), issue(s), milestone(s), pull(s), snippet(s) or
+ tag(s) followed by a '/' or '=' and an item-id; the item is shown;
+
+ an issue reference given by a positive integer, e.g. 92 or prefaced with GL-, e.g. GL-92;
+ the issue is displayed;
+
+ a commit reference given by a hex number, 55a1f0; the commit diff is displayed;
+
+ a branch or tag reference given by an alphanumeric name, e.g. hyper20; the
+ files in the branch are listed.
+
+USER defaults to the value of `hibtypes-gitlab-default-user'.
+If given, PROJECT overrides any project value in REFERENCE. If no
+PROJECT value is provided, it defaults to the value of
+`hibtypes-gitlab-default-project'."
+ (cond ((or (null reference) (equal reference ""))
+ (error "(gitlab-reference): Gitlab reference must not be empty"))
+ ((equal reference "status")
+ (funcall hibtypes-social-display-function "https://status.gitlab.com"))
+ (t (let ((case-fold-search t)
+ (url-to-format (assoc-default "gitlab" hibtypes-social-hashtag-alist #'string-match))
+ (ref-type))
+ (when url-to-format
+ (cond ((string-match "\\`\\(branch\\|commits?\\|issues?\\milestones?\\|pulls?\\|snippets?\\|tags?\\)[/=]" reference)
+ ;; Reference to a specific ref-item
+ nil)
+ ((string-match "\\`/?\\(\\([^/#@]+\\)/\\)\\([^/#@]+\\)\\'" reference)
+ ;; /?user/project
+ (setq user (or user (match-string-no-properties 2 reference))
+ project (or project (match-string-no-properties 3 reference))
+ reference nil))
+ ((string-match "\\`/?\\(\\([^/#@]+\\)/\\)?\\([^/#@]+\\)/\\([^#@]+\\)\\'" reference)
+ ;; /?[user/]project/ref-item
+ (setq user (or user (match-string-no-properties 2 reference))
+ project (or project (match-string-no-properties 3 reference))
+ reference (match-string-no-properties 4 reference)))
+ ((string-match "\\`/\\([^/#@]+\\)\\'" reference)
+ ;; /project
+ (setq project (or project (match-string-no-properties 1 reference))
+ reference nil)))
+ (when (and (null (and user project)) (string-match "\\`\\(groups\\|projects\\)\\'" reference))
+ ;; List all available groups of projects or projects.
+ (setq user "explore"
+ project (match-string-no-properties 1 reference)
+ ref-type nil
+ reference nil))
+ (unless (stringp user) (setq user hibtypes-gitlab-default-user))
+ (unless (stringp project) (setq project hibtypes-gitlab-default-project))
+ (when (equal project "pages")
+ ;; Project web pages use a reverse pages/<project> URL format
+ (setq project user
+ user "pages"
+ ref-type nil
+ reference nil))
+ (when reference
+ (cond ((string-match "\\`\\(analytics\\|cycle_analytics\\)\\'" reference)
+ ;; Project analytics
+ (setq ref-type "cycle_analytics"
+ reference ""))
+ ((string-match "\\`\\(boards\\|kanban\\)\\'" reference)
+ ;; Kanban-type Issue Stage Boards
+ (setq ref-type "boards"
+ reference ""))
+ ((equal reference "jobs")
+ ;; Manual/automated project-related jobs that run
+ (setq ref-type "-/jobs"
+ reference ""))
+ ((equal reference "list")
+ ;; List all issues
+ (setq ref-type "issues"
+ reference ""))
+ ((equal reference "contributors")
+ (setq ref-type "graphs/master"
+ reference ""))
+ ((string-match "\\`\\(members\\|people\\|staff\\)\\'" reference)
+ (setq ref-type "project_members"
+ reference ""))
+ ((equal reference "pipeline_charts")
+ ;; Continuous Integration Pipeline Charts
+ (setq ref-type "pipelines/charts"
+ reference ""))
+ ((equal reference "pulls")
+ ;; Merge requests for the project
+ (setq ref-type "merge_requests"
+ reference ""))
+ ((equal reference "schedules")
+ ;; Schedules for CI Pipelines
+ (setq ref-type "pipeline_schedules"
+ reference ""))
+ ((string-match "\\`\\(service\\|service_desk\\)\\'" reference)
+ ;; Project help desk
+ (setq ref-type "issues/service_desk"
+ reference ""))
+ ((member reference '("activity" "branches" "commits" "issues" "labels"
+ "merge_requests" "milestones" "pages" "pipelines"
+ "snippets" "tags"))
+ ;; All activity, branches, commits, cycle analytics, open issues, issue labels,
+ ;; members, merge requests, milestones, web pages, pull requests, code snippets
+ ;; or commit tags reference
+ (setq ref-type reference
+ reference ""))
+ ((and (< (length reference) 8) (string-match "\\`\\([gG][lL]-\\)?[0-9]+\\'" reference))
+ ;; Issue ref-id reference
+ (setq ref-type "issues/"
+ reference (substring reference (match-end 1) (match-end 0))))
+ ((string-match "\\`label[/=]" reference)
+ ;; Labeled category of issues
+ (setq ref-type "issues?label_name%5B%5D="
+ reference (substring reference (match-end 0))))
+ ((string-match "\\`\\(commit\\|issues\\|milestones\\|pull\\|snippets\\|tags\\)[/=]" reference)
+ ;; Ref-id preceded by a keyword
+ (setq ref-type (concat (substring reference 0 (match-end 1)) "/")
+ reference (substring reference (match-end 0))))
+ ((string-match "\\`\\(issue\\|milestone\\|snippet\\|tag\\)[/=]" reference)
+ ;; Ref-id preceded by a singular keyword that must be converted to plural
+ (setq ref-type (concat (substring reference 0 (match-end 1)) "s/")
+ reference (substring reference (match-end 0))))
+ ((string-match "\\`\\(commit\\|pull\\)s[/=]" reference)
+ ;; Ref-id preceded by a plural keyword that must be converted to singular
+ (setq ref-type (concat (substring reference 0 (match-end 1)) "/")
+ reference (substring reference (1+ (match-end 0)))))
+ ((string-match "\\`[0-9a-f]+\\'" reference)
+ ;; Commit reference
+ (setq ref-type "commit/"))
+ (t
+ ;; Specific branch or commit tag reference
+ (setq ref-type "tree/")
+ (when (string-match "\\`\\(branch\\|tag\\)[/=]" reference)
+ ;; If preceded by optional keyword, remove that from the reference.
+ (setq reference (substring reference (match-end 0)))))))
+ (if (and (stringp user) (stringp project))
+ (funcall hibtypes-social-display-function
+ (setq a (if reference
+ (format url-to-format user project ref-type reference)
+ ;; Remove trailing /
+ (substring (format url-to-format user project "" "") 0 -1))))
+ (cond ((and (null user) (null project))
+ (error "(gitlab-reference): Set `hibtypes-gitlab-default-user' and `hibtypes-gitlab-default-project'"))
+ ((null user)
+ (error "(gitlab-reference): Set `hibtypes-gitlab-default-user'"))
+ (t
+ (error "(gitlab-reference): Set `hibtypes-gitlab-default-project'")))))
+ (unless url-to-format
+ (error "(gitlab-reference): Add an entry for gitlab to `hibtypes-social-hashtag-alist'"))))))
+
;;; Local git repository commit references
(defib git-commit-reference ()
diff --git a/hibtypes.el b/hibtypes.el
index 4e5b07f..8daddb0 100644
--- a/hibtypes.el
+++ b/hibtypes.el
@@ -1,18 +1,18 @@
;;; hibtypes.el --- GNU Hyperbole default implicit button types
;;
-;; Author: Bob Weiner
+;; Author: Bob Weiner
;;
-;; Orig-Date: 19-Sep-91 at 20:45:31
+;; Orig-Date: 19-Sep-91 at 20:45:31
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
-;;
;;; Commentary:
;;
-;; Implicit button types in this file are defined in increasing order
-;; of priority within this file (last one is highest priority).
+;; Implicit button types in this file are defined in increasing
+;; order of priority within this file (last one is highest
+;; priority).
;;; Code:
;;; ************************************************************************
@@ -60,11 +60,11 @@
;;; ************************************************************************
;;; Public implicit button types
;;; ************************************************************************
-
+
(run-hooks 'hibtypes-begin-load-hook)
;;; ========================================================================
-;;; Follows Org mode links by invoking a web browser.
+;;; Follows Org mode links and radio targets and cycles Org heading views
;;; ========================================================================
(require 'hsys-org)
@@ -74,9 +74,10 @@
;;; ========================================================================
(defvar mail-address-mode-list
- '(emacs-lisp-mode lisp-interaction-mode lisp-mode scheme-mode c-mode
- c++-mode html-mode java-mode js2-mode objc-mode python-mode
- smalltalk-mode fundamental-mode text-mode indented-text-mode web-mode)
+ '(emacs-lisp-mode lisp-interaction-mode lisp-mode scheme-mode
+ c-mode c++-mode html-mode java-mode js2-mode objc-mode
+ python-mode smalltalk-mode fundamental-mode text-mode
+ indented-text-mode web-mode)
"List of major modes in which mail address implicit buttons are active.")
(defun mail-address-at-p ()
@@ -125,20 +126,24 @@ any buffer attached to a file in `hyrolo-file-list', or any buffer with
(defib pathname ()
"Makes a valid pathname display the path entry.
-Also works for delimited and non-delimited remote pathnames, Texinfo @file{}
-entries, and hash-style link references to HTML, Markdown or Emacs outline
-headings. Emacs Lisp library files (filenames without any directory component
-that end in .el and .elc) are looked up using the `load-path' directory list.
+Also works for delimited and non-delimited remote pathnames,
+Texinfo @file{} entries, and hash-style link references to HTML,
+Markdown or Emacs outline headings, and MSWindows paths (see
+\"${hyperb:dir}/DEMO#POSIX and MSWindows Paths\" for details).
+Emacs Lisp library files (filenames without any directory
+component that end in .el and .elc) are looked up using the
+`load-path' directory list.
See `hpath:at-p' function documentation for possible delimiters.
-See `hpath:suffixes' variable documentation for suffixes that are added to or
-removed from pathname when searching for a valid match.
-See `hpath:find' function documentation for special file display options."
+See `hpath:suffixes' variable documentation for suffixes that are
+added to or removed from pathname when searching for a valid
+match. See `hpath:find' function documentation for special file
+display options."
;;
;; Ignore paths in Buffer menu, dired and helm modes.
(unless (or (eq major-mode 'helm-major-mode)
- (delq nil (mapcar (lambda (substring) (string-match
- substring (format-mode-line mode-name)))
+ (delq nil (mapcar (lambda (substring)
+ (string-match substring (format-mode-line mode-name)))
'("Buffer Menu" "IBuffer" "Dired"))))
(let ((path (hpath:at-p))
full-path)
@@ -174,9 +179,15 @@ See `hpath:find' function documentation for special file display options."
))))))
;;; ========================================================================
-;;; Displays files at specific lines and optional column number locations.
+;;; Displays files at specific lines and optional column number
+;;; locations.
;;; ========================================================================
+(defconst hibtypes-path-line-and-col-regexp
+ ;; Allow for 'c:' single letter drive prefixes on MSWindows and
+ ;; Elisp vars with colons in them.
+ "\\([^ \t\n\r\f:][^\t\n\r\f:]+\\(:[^0-9\t\n\r\f]*\\)*\\):\\([0-9]+\\)\\(:\\([0-9]+\\)\\)?$")
+
(defib pathname-line-and-column ()
"Makes a valid pathname:line-num[:column-num] pattern display the path at line-num and optional column-num.
Also works for remote pathnames.
@@ -187,12 +198,11 @@ 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)))
(if (and (stringp path-line-and-col)
- (string-match "\\([^ \t\n\r:]+\\):\\([0-9]+\\)\\(:\\([0-9]+\\)\\)?"
- path-line-and-col))
- (let ((file (expand-file-name (match-string-no-properties 1 path-line-and-col)))
- (line-num (string-to-number (match-string-no-properties 2 path-line-and-col)))
- (col-num (if (match-end 3) (string-to-number (match-string-no-properties
- 4 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 (if (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
@@ -241,29 +251,6 @@ current major mode is one handled by func-menu."
(hact 'function-in-buffer function-name function-pos)))))))
;;; ========================================================================
-;;; Use the Emacs imenu library to jump to definition of an identifier
-;;; defined in the same file in which it is referenced. Identifier
-;;; references across files are handled separately by clauses within
-;;; the `hkey-alist' variable.
-;;; ========================================================================
-
-;;; This implicit button type is not needed because hkey-alist handles imenu items.
-;; (defib imenu-item ()
-;; "Displays the in-buffer definition of an identifier that point is within or after, else nil.
-;; This triggers only when imenu has already been used to generate an in-buffer item index."
-;; (when (and (featurep 'imenu) imenu--index-alist)
-;; (save-excursion
-;; (skip-syntax-backward "w_")
-;; (if (looking-at "\\(\\sw\\|\\s_\\)+")
-;; (let* ((item-name (buffer-substring-no-properties (point) (match-end 0)))
-;; (start (point))
-;; (end (match-end 0))
-;; (item-pos (imenu-item-p item-name)))
-;; (when item-pos
-;; (ibut:label-set item-name start end)
-;; (hact 'imenu-display-item-where item-name item-pos)))))))
-
-;;; ========================================================================
;;; Handles internal references within an annotated bibliography, delimiters=[]
;;; ========================================================================
@@ -278,7 +265,7 @@ must have an attached file."
(let ((chr (aref (buffer-name) 0)))
(not (or (eq chr ?\ ) (eq chr ?*))))
(not (or (derived-mode-p 'prog-mode)
- (memq major-mode '(c-mode objc-mode c++-mode java-mode markdown-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)))
@@ -333,10 +320,11 @@ Returns t if jumps and nil otherwise."
;; Leave point on the link even if not activated
;; here, so that code elsewhere activates it.
(if (and (markdown-link-p)
- (not (or (hpath:www-at-p) (hpath:at-p))))
- ;; In-file referents will be handled later by the
- ;; pathname implicit type, not here.
- (progn (hpath:display-buffer (current-buffer))
+ (save-match-data (not (or (hpath:www-at-p) (hpath:at-p)))))
+ ;; In-file referents are handled by the 'markdown-internal-link'
+ ;; implicit button type, not here.
+ (progn (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))))
(goto-char opoint)
nil))
@@ -352,6 +340,7 @@ Returns t if jumps and nil otherwise."
;; 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))
@@ -361,6 +350,7 @@ Returns t if jumps and nil otherwise."
;; link itself and follow that.
(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))))))
@@ -631,15 +621,115 @@ Requires the Emacs builtin Tramp library for ftp file retrievals."
(hact 'man topic)))))
;;; ========================================================================
-;;; Follows links to Hyperbole Koutliner cells.
-;;; ========================================================================
-
-;;; ========================================================================
-;;; Jumps to source line associated with grep or compilation error messages.
-;;; Also supports ripgrep (rg command).
+;;; Links to Hyperbole button types
+;;; ========================================================================
+
+
+(defconst elink:start "<elink:"
+ "String matching the start of a link to a Hyperbole explicit button.")
+(defconst elink:end ">"
+ "String matching the end of a link to a Hyperbole explicit button.")
+
+(defib link-to-ebut ()
+ "At point, activates a link to an explicit button.
+The explicit button's action is executed in the context of the current buffer.
+
+Recognizes the format '<elink:' <button label> '>', e.g. <elink: project-list>."
+ (let* ((label-key-start-end (hbut:label-p nil elink:start elink:end t t))
+ (ebut-key (nth 0 label-key-start-end))
+ (lbl-key (and ebut-key (concat "elink_" (nth 0 label-key-start-end))))
+ (start-pos (nth 1 label-key-start-end))
+ (end-pos (nth 2 label-key-start-end)))
+ (when lbl-key
+ (ibut:label-set (ebut:key-to-label lbl-key) start-pos end-pos)
+ (hact 'link-to-ebut ebut-key))))
+
+(defconst glink:start "<glink:"
+ "String matching the start of a link to a Hyperbole global button.")
+(defconst glink:end ">"
+ "String matching the end of a link to a Hyperbole global button.")
+
+(defib link-to-gbut ()
+ "At point, activates a link to a global button.
+The global button's action is executed in the context of the current buffer.
+
+Recognizes the format '<glink:' <button label> '>', e.g. <glink: open todos>."
+ (let* ((label-key-start-end (hbut:label-p nil glink:start glink:end t t))
+ (gbut-key (nth 0 label-key-start-end))
+ (lbl-key (and gbut-key (concat "glink_" (nth 0 label-key-start-end))))
+ (start-pos (nth 1 label-key-start-end))
+ (end-pos (nth 2 label-key-start-end)))
+ (when lbl-key
+ (ibut:label-set (ebut:key-to-label lbl-key) start-pos end-pos)
+ (hact 'link-to-gbut gbut-key))))
+
+(defconst ilink:start "<ilink:"
+ "String matching the start of a link to a Hyperbole implicit button.")
+(defconst ilink:end ">"
+ "String matching the end of a link to a Hyperbole implicit button.")
+
+(defib link-to-ibut ()
+ "At point, activates a link to an implicit button.
+The implicit button's action is executed in the context of the current buffer.
+
+Recognizes the format '<ilink:' <button label> '>', e.g. <ilink: my sequence of keys>."
+ (let* ((label-key-start-end (ibut:label-p nil ilink:start ilink:end t t))
+ (ibut-key (nth 0 label-key-start-end))
+ (lbl-key (and ibut-key (concat "ilink_" (nth 0 label-key-start-end))))
+ (start-pos (nth 1 label-key-start-end))
+ (end-pos (nth 2 label-key-start-end)))
+ (when lbl-key
+ (ibut:label-set (ibut:key-to-label lbl-key) start-pos end-pos)
+ (hact 'link-to-ibut ibut-key))))
+
+;;; ========================================================================
+;;; Jumps to source line associated with ipython, ripgreb, grep or
;;; With credit to Michael Lipp and Mike Williams for the idea.
;;; ========================================================================
+(defib ipython-stack-frame ()
+ "Jumps to line associated with an ipython stack frame line numbered msg.
+ipython outputs each pathname once followed by all matching lines in that pathname.
+Messages are recognized in any buffer (other than a helm completion
+buffer)."
+ ;; Locate and parse ipython stack trace messages found in any buffer other than a
+ ;; helm completion buffer.
+ ;;
+ ;; Sample ipython stack trace command output:
+ ;;
+ ;; ~/Dropbox/py/inview/inview_pr.py in ap(name_filter, value_filter, print_func)
+ ;; 1389 apc(name_filter, value_filter, print_func, defined_only=True)
+ ;; 1390 print('\n**** Modules/Packages ****')
+ ;; -> 1391 apm(name_filter, value_filter, print_func, defined_only=True)
+ ;; 1392
+ ;; 1393 def apa(name_filter=None, value_filter=None, print_func=pd1, defined_only=False):
+ (unless (eq major-mode 'helm-major-mode)
+ (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 (if (file-name-absolute-p file)
+ nil
+ (hbut:key-src t))))
+ (if (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 ()
"Jumps to line associated with a ripgrep (rg) line numbered msg.
Ripgrep outputs each pathname once followed by all matching lines in that pathname.
@@ -666,12 +756,14 @@ buffer)."
(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)))
+ (let ((line-num (match-string-no-properties 1))
+ file)
(while (and (= (forward-line -1) 0)
(looking-at "[1-9][0-9]*[-:]\\|--$")))
- (unless (looking-at "[1-9][0-9]*[-:]\\|--$")
- (let* ((file (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
- (but-label (concat file ":" line-num))
+ (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 (if (file-name-absolute-p file) nil
(hbut:key-src t))))
(if (stringp source-loc)
@@ -693,7 +785,7 @@ in grep and shell buffers."
(beginning-of-line)
(if (or
;; Grep matches, UNIX C compiler and Introl 68HC11 C compiler errors
- (looking-at "\\([^ \t\n\r:]+\\): ?\\([1-9][0-9]*\\)[ :]")
+ (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
@@ -738,13 +830,14 @@ This works with JavaScript and Python tracebacks, gdb, dbx, and xdb. Such lines
(save-excursion
(beginning-of-line)
(cond
- ;; Python pdb
- ((looking-at ".+ File \"\\([^\"\n\r]+\\)\", line \\([0-9]+\\)")
- (let* ((file (match-string-no-properties 1))
- (line-num (match-string-no-properties 2))
+ ;; Python pdb or traceback, pytype error
+ ((or (looking-at "\\(^\\|.+ \\)File \"\\([^\"\n\r]+\\)\", line \\([0-9]+\\)")
+ (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 1) (match-end 1))
+ (ibut:label-set but-label (match-beginning 2) (match-end 2))
(hact 'link-to-file-line file line-num)))
;; JavaScript traceback
@@ -1015,8 +1108,11 @@ Activates only if point is within the first line of the Info-node name."
(hbut:label-p t "``" "''" t t)
;; Regular open and close quotes
(hbut:label-p t "`" "'" t t)))
- (node-ref (hpath:is-p (car node-ref-and-pos) nil t)))
- (and node-ref (string-match "\\`([^\):]+)" node-ref)
+ (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))))
diff --git a/hinit.el b/hinit.el
index 6f54d65..c9df41b 100644
--- a/hinit.el
+++ b/hinit.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 1-Oct-91 at 02:32:51
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -43,10 +43,7 @@
(interactive)
(unless (featurep 'infodock)
;; Initialize now since Emacs startup has finished.
- (if (and (or (not (featurep 'xemacs))
- (and (boundp 'current-menubar) current-menubar))
- after-init-time)
- (hyperbole-menubar-menu)
+ (if after-init-time (hyperbole-menubar-menu)
;; Defer initialization until after Emacs startup. This really is needed.
(add-hook 'after-init-hook #'hyperbole-menubar-menu))
;; Avoid returning the large Hyperbole menu.
@@ -59,18 +56,8 @@
;;;###autoload
(defmacro hui-menu-remove (menu-sym &optional keymap)
"Remove MENU-SYM menu from any menubars generated by optional KEYMAP or the global-map."
- `(prog1 (cond ((not (featurep 'xemacs))
- (if (null ,keymap) (setq keymap global-map))
- (define-key (or ,keymap global-map) [menu-bar ,menu-sym] nil))
- ;; XEmacs
- ((boundp 'menubar-configuration)
- (if (memq ',menu-sym menubar-configuration)
- (if (fboundp 'customize-set-variable)
- (customize-set-variable
- 'menubar-configuration
- (delq ',menu-sym menubar-configuration))
- (setq menubar-configuration
- (delq ',menu-sym menubar-configuration))))))
+ `(prog1 (if (null ,keymap) (setq keymap global-map))
+ (define-key (or ,keymap global-map) [menu-bar ,menu-sym] nil)
;; Force a menu-bar update.
(force-mode-line-update)))
diff --git a/hload-path.el b/hload-path.el
index 77f2214..6204e44 100644
--- a/hload-path.el
+++ b/hload-path.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 29-Jun-16 at 14:39:33
;;
-;; Copyright (C) 1992-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1992-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -44,8 +44,8 @@ It must end with a directory separator character.")
;; Perform Koutliner initializations.
(add-to-list 'load-path (expand-file-name "kotl/" hyperb:dir))
-;; Invoke kotl-mode for files ending in ".kotl". Also
-;; allow ".kot" for DOS and Windows users.
+;; Invoke kotl-mode for files ending in ".kotl".
+;; Also allow ".kot" for DOS and Windows users.
(add-to-list 'auto-mode-alist '("\\.kotl?\\'" . kotl-mode))
(provide 'hload-path)
diff --git a/hmh.el b/hmh.el
index 38ac5c9..919903b 100644
--- a/hmh.el
+++ b/hmh.el
@@ -1,4 +1,4 @@
-;;; hmh.el --- GNU Hyperbole buttons in mail reader: Mh
+;;; hmh.el --- GNU Hyperbole buttons in mail reader: Mh
;;
;; Author: Bob Weiner
;;
diff --git a/hmouse-drv.el b/hmouse-drv.el
index 792f145..8142cdf 100644
--- a/hmouse-drv.el
+++ b/hmouse-drv.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 04-Feb-90
;;
-;; Copyright (C) 1989-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1989-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -16,24 +16,12 @@
;;; Other required Elisp libraries
;;; ************************************************************************
-;; Keep this here at the top to prevent recursive reloads from
-;; Hyperbole autoload commands.
-(provide 'hmouse-drv)
-
-(if (and (boundp 'hmouse-alist) hmouse-alist)
- (require 'hui-window)
- ;; Force re-definition of hmouse-alist.
- (makunbound 'hmouse-alist)
- ;; Define hmouse-alist.
- (load "hui-mouse")
- ;; Add drag actions to hmouse-alist.
- (load "hui-window"))
+(require 'hui-window)
(require 'hypb)
;; Quiet byte compiler warnings for these free variables.
-(eval-when-compile
- (defvar hkey-action nil)
- (defvar pred-value nil))
+(defvar hkey-action)
+(defvar pred-value)
;;; ************************************************************************
;;; Public variables
@@ -215,7 +203,7 @@ Any ARGS will be passed to `hmouse-function'."
(setq action-key-cancelled nil
assist-key-depressed-flag nil))
(assist-key-depressed-flag
- (hmouse-function nil nil args))
+ (hmouse-function nil nil args))
((hkey-mouse-help nil args))
(t
(run-hooks 'action-key-release-hook)
@@ -250,13 +238,8 @@ Any ARGS will be passed to `hmouse-function'."
hkey-value nil))))
;;; Smart Key Commands
-(defun action-key ()
- "Use one key to perform functions that vary by context.
-If no matching context is found, the default function set with
-the `action-key-default-function' variable is run. Return t
-unless the `action-key-default-function' variable is not bound to
-a valid function."
- (interactive)
+(defun action-key-clear-variables ()
+ "Clear all Action Key variables."
;; Clear all these variables so there can be no confusion between
;; mouse presses and keyboard presses.
(setq action-key-depress-prev-point nil
@@ -266,7 +249,29 @@ a valid function."
action-key-release-position nil
action-key-release-args nil
action-key-release-window nil
- action-key-release-prev-point nil)
+ action-key-release-prev-point nil))
+
+(defun assist-key-clear-variables ()
+ "Clear all Assist Key variables."
+ ;; Clear all these variables so there can be no confusion between
+ ;; mouse presses and keyboard presses.
+ (setq assist-key-depress-prev-point nil
+ assist-key-depress-position nil
+ assist-key-depress-args nil
+ assist-key-depress-window nil
+ assist-key-release-position nil
+ assist-key-release-args nil
+ assist-key-release-window nil
+ assist-key-release-prev-point nil))
+
+(defun action-key ()
+ "Use one key to perform functions that vary by context.
+If no matching context is found, the default function set with
+the `action-key-default-function' variable is run. Return t
+unless the `action-key-default-function' variable is not bound to
+a valid function."
+ (interactive)
+ (action-key-clear-variables)
(prog1 (action-key-internal)
(run-hooks 'action-key-depress-hook 'action-key-release-hook)))
@@ -287,16 +292,7 @@ the `assist-key-default-function' variable is run. Return
non-nil unless `assist-key-default-function' variable is not
bound to a valid function."
(interactive)
- ;; Clear all these variables so there can be no confusion between
- ;; mouse presses and keyboard presses.
- (setq assist-key-depress-prev-point nil
- assist-key-depress-position nil
- assist-key-depress-args nil
- assist-key-depress-window nil
- assist-key-release-position nil
- assist-key-release-args nil
- assist-key-release-window nil
- assist-key-release-prev-point nil)
+ (assist-key-clear-variables)
(prog1 (assist-key-internal)
(run-hooks 'assist-key-depress-hook 'assist-key-release-hook)))
@@ -337,7 +333,7 @@ bound to a valid function."
The ace-window package, (see \"https://elpa.gnu.org/packages/ace-window.html\"),
assigns short ids to each Emacs window and lets you jump to or
-operate upon a specific window by giving its letter. Hyperbole
+operate upqon a specific window by giving its letter. Hyperbole
can insert an operation into ace-window that allows you to
display items such as dired or buffer menu items in a specific
window.
@@ -358,36 +354,41 @@ window, use {M-o i <id-of-window-to-display-item-in>} and watch the
magic happen."
(require 'ace-window)
(when key (global-set-key key 'ace-window))
+ (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)
+ ;; allows {i} operation to work when only 2 windows exist
+ aw-dispatch-always t)
;; New ace-window frames (window id = z) inherit the size of the
;; prior selected frame; same as HyWindow.
(setq aw-frame-size '(0 . 0)
aw-dispatch-alist (delq (assq ?t aw-dispatch-alist)
(delq (assq ?r aw-dispatch-alist)
(delq (assq ?i aw-dispatch-alist) aw-dispatch-alist))))
- (push '(?i hkey-drag-to "Hyperbole: Drag To") aw-dispatch-alist)
+ (push '(?i hkey-drag-item "Hyperbole: Drag Item") aw-dispatch-alist)
;; Ace-window includes ?m as the swap windows key, so it is not added here.
(push '(?r hkey-replace "Hyperbole: Replace Here") aw-dispatch-alist)
(push '(?t hkey-throw "Hyperbole: Throw To") aw-dispatch-alist)
- (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)
- ;; allows {i} operation to work when only 2 windows exist
- aw-dispatch-always t)
(ace-window-display-mode 1))
;;;###autoload
(defun hkey-drag (release-window)
- "Emulate Smart Mouse Key drag from selected window to RELEASE-WINDOW, interactively chosen via ace-window.
+ "Emulate Smart Mouse Key drag from the selected window to RELEASE-WINDOW, interactively chosen via ace-window.
The drag action determines the final selected window.
-Optional prefix ARG non-nil means emulate Assist Key rather than the
+Optional prefix arg non-nil means emulate Assist Key rather than the
Action Key.
Works only when running under a window system, not from a dumb terminal."
+ ;; Note: Cannot add start-window as first parameter to this function
+ ;; because it is called like many other functions herein with a
+ ;; single release-window argument by 'hmouse-choose-windows'.
+
;; Cancel any partial drag that may have been recorded.
(interactive (list (aw-select " Ace - Hyperbole: Drag")))
(condition-case nil
- ;; This may trigger a No Action error if start-window and
- ;; release-window are the same; in that case, use the error
- ;; handler to handle dragging an item.
+ ;; This may trigger a No Action error if starting window
+ ;; (window of depress) and release-window are the same; in that
+ ;; case: use the error handler to emulate dragging an item if on
+ ;; one.
(progn (if current-prefix-arg
(setq assist-key-depressed-flag nil)
(setq action-key-depressed-flag nil))
@@ -404,7 +405,7 @@ Works only when running under a window system, not from a dumb terminal."
After the drag, the selected window remains the same as it was before
the drag.
-Optional prefix ARG non-nil means emulate Assist Key rather than the
+Optional prefix arg non-nil means emulate Assist Key rather than the
Action Key.
Works only when running under a window system, not from a dumb terminal."
@@ -416,25 +417,75 @@ Works only when running under a window system, not from a dumb terminal."
(hypb:select-window-frame start-window)))))
;;;###autoload
+(defun hkey-drag-item (release-window)
+ "Emulate Smart Mouse Key drag from an item in a selected window to RELEASE-WINDOW, interactively chosen via ace-window.
+RELEASE-WINDOW is left selected unless point is not on an item, in
+which case, an error is signalled.
+
+Optional prefix arg non-nil means emulate Assist Key rather than the
+Action Key.
+
+Works only when running under a window system, not from a dumb terminal."
+ (interactive
+ (list (let ((mode-line-text (concat " Ace - " (nth 2 (assq ?i aw-dispatch-alist)))))
+ (aw-select mode-line-text))))
+ (let ((start-window (if (and (boundp 'start-window) (window-live-p start-window))
+ start-window
+ (if current-prefix-arg
+ assist-key-depress-window
+ action-key-depress-window)))
+ at-item-flag)
+ (unless (window-live-p start-window)
+ (setq start-window (selected-window)))
+ (cond ((and (setq at-item-flag (hmouse-at-item-p))
+ (window-live-p release-window))
+ (hkey-drag release-window)
+ ;; Leave release-window selected
+ (when (window-live-p release-window)
+ (hypb:select-window-frame release-window)))
+ (at-item-flag
+ (error "(hkey-drag-item): No listing item at point"))
+ (t ;; No item at point or selected release is invalid
+ (error "(hkey-drag-item): Invalid final window, %s" release-window)))))
+
+;;;###autoload
(defun hkey-drag-to (release-window)
- "Emulate Smart Mouse Key drag from selected window to RELEASE-WINDOW, interactively chosen via ace-window.
+ "Emulate Smart Mouse Key drag from a selected window to RELEASE-WINDOW, interactively chosen via ace-window.
If an item is dragged to RELEASE-WINDOW, then RELEASE-WINDOW is selected;
-otherwise, the drag action determines the selected window.
+otherwise, the drag action determines the selected window. If no drag
+has taken place, then the selected window's buffer is displayed in
+RELEASE-WINDOW and that becomes the selected window.
-Optional prefix ARG non-nil means emulate Assist Key rather than the
+Optional prefix arg non-nil means emulate Assist Key rather than the
Action Key.
Works only when running under a window system, not from a dumb terminal."
(interactive
(list (let ((mode-line-text (concat " Ace - " (nth 2 (assq ?i aw-dispatch-alist)))))
(aw-select mode-line-text))))
- (if (and (hmouse-at-item-p) (window-live-p release-window))
- (progn (hkey-drag release-window)
- ;; Leave release-window selected
- (when (window-live-p release-window)
- (hypb:select-window-frame release-window)))
- ;; Leave hkey-drag to choose selected window
- (hkey-drag release-window)))
+ (let ((start-window (if (and (boundp 'start-window) (window-live-p start-window))
+ start-window
+ (if current-prefix-arg
+ assist-key-depress-window
+ action-key-depress-window))))
+ (unless (window-live-p start-window)
+ (setq start-window (selected-window)))
+ (if (and (hmouse-at-item-p) (window-live-p release-window))
+ (progn (hkey-drag release-window)
+ ;; Leave release-window selected
+ (when (window-live-p release-window)
+ (hypb:select-window-frame release-window)))
+ ;; Leave hkey-drag to choose final selected window
+ (hkey-drag release-window)
+ ;; (if (eq start-window release-window)
+ ;; ;; Leave hkey-drag to choose final selected window
+ ;; (hkey-drag release-window)
+ ;; ;; Replace release window's buffer with selected
+ ;; ;; window's buffer.
+ ;; (hkey-buffer-to start-window release-window)
+ ;; (when (window-live-p release-window)
+ ;; (hypb:select-window-frame release-window)))
+ )))
;;;###autoload
(defun hkey-replace (release-window)
@@ -454,38 +505,63 @@ Leave TO-WINDOW as the selected window."
(aw-select mode-line-text))))
(hkey-swap-buffers (selected-window) to-window))
+;; Once the "display-until.el" library is added to Emacs, hkey-throw can be simplified to the following:
+;;
+;; (defun hkey-throw (release-window)
+;; "Throw either a displayable item at point or the current buffer for display in RELEASE-WINDOW.
+;; The selected window does not change."
+;; (interactive
+;; (list (let ((mode-line-text (concat " Ace - " (nth 2 (assq ?t aw-dispatch-alist)))))
+;; (aw-select mode-line-text))))
+;; (if (cadr (assq major-mode hmouse-drag-item-mode-forms))
+;; ;; Throw the item at point
+;; (let ((action-key-depress-window (selected-window))
+;; (action-key-release-window release-window)
+;; (action-key-depress-args))
+;; (hmouse-item-to-window)
+;; (select-window action-key-depress-window)
+;; (display-window-until release-window))
+;; ;; Throw the current buffer
+;; (display-window-until release-window (current-buffer))))
+
;;;###autoload
(defun hkey-throw (release-window)
- "Throw either a displayable item at point or the current buffer to RELEASE-WINDOW.
+ "Throw either a displayable item at point or the current buffer for display in RELEASE-WINDOW.
The selected window does not change."
(interactive
(list (let ((mode-line-text (concat " Ace - " (nth 2 (assq ?t aw-dispatch-alist)))))
(aw-select mode-line-text))))
- (let ((depress-frame (selected-frame)))
+ (let ((depress-frame (selected-frame))
+ (display-delay (if (boundp 'temp-display-delay)
+ temp-display-delay
+ 0.5)))
(if (cadr (assq major-mode hmouse-drag-item-mode-forms))
- ;; On an item to throw
+ ;; Throw the item at point
(let ((action-key-depress-window (selected-window))
(action-key-release-window release-window)
(action-key-depress-args))
(hypb:save-selected-window-and-input-focus
(hmouse-item-to-window)
(unless (eq depress-frame (window-frame release-window))
- (message "Buffer or item thrown to frame under this one")
+ ;; Force redisplay or item buffer won't be displayed here.
+ (redisplay t)
;; Show the frame thrown to before it is covered when
;; input-focus is returned to the depress-frame.
- ;; (raise-frame (window-frame release-window))
- ;; (sit-for 1)
+ (raise-frame (window-frame release-window))
+ ;; Don't use sit-for here because it can be interrupted early.
+ (sleep-for display-delay)
)))
;; Throw the current buffer
(set-window-buffer release-window (current-buffer))
(unless (eq depress-frame (window-frame release-window))
- (message "Buffer or item thrown to frame under this one")
+ ;; Force redisplay or item buffer won't be displayed here.
+ (redisplay t)
;; Show the frame thrown to before it is covered when
;; input-focus is returned to the depress-frame.
- ;; (raise-frame (window-frame release-window))
- ;; (sit-for 1)
- ;; (select-frame-set-input-focus depress-frame)
- ))))
+ (raise-frame (window-frame release-window))
+ ;; Don't use sit-for here because it can be interrupted early.
+ (sleep-for display-delay)
+ (select-frame-set-input-focus depress-frame)))))
;;;###autoload
(defun hkey-buffer-to (from-window to-window)
@@ -531,6 +607,14 @@ The selected window does not change."
(hmouse-choose-windows #'hkey-drag-stay))
;;;###autoload
+(defun hmouse-click-to-drag-item ()
+ "Mouse click on start and end windows for use with `hkey-drag-item'.
+Emulate {M-o i} from start window to end window.
+After the drag, the end window is the selected window."
+ (interactive)
+ (hmouse-choose-windows #'hkey-drag-item))
+
+;;;###autoload
(defun hmouse-click-to-drag-to ()
"Mouse click on start and end windows for use with `hkey-drag-to'.
Emulate Smart Mouse Key drag from start window to end window.
@@ -683,6 +767,10 @@ Return non-nil iff a non-nil predicate is found."
With optional ASSIST-FLAG non-nil, display help for the Assist Key command.
Return non-nil iff associated help documentation is found."
(interactive "P")
+ (unless (or action-key-depressed-flag action-key-help-flag)
+ (action-key-clear-variables))
+ (unless (or assist-key-depressed-flag assist-key-help-flag)
+ (assist-key-clear-variables))
(let ((hkey-forms hmouse-alist)
hkey-form pred-value call calls cmd-sym doc)
(while (and (null pred-value) (setq hkey-form (car hkey-forms)))
@@ -893,7 +981,7 @@ Only works when running under a window system, not from a dumb terminal."
(assist-key-depress)
(when (called-interactively-p 'interactive)
(message
- "Assist Key depressed; go to release point and hit {%s %s}."
+ "Assist Key depressed; go to release point and press {%s %s}."
(substitute-command-keys "\\[universal-argument]")
(substitute-command-keys "\\[hkey-operate]"))))
(if action-key-depressed-flag
@@ -902,7 +990,7 @@ Only works when running under a window system, not from a dumb terminal."
(message "Action Key released.")))
(action-key-depress)
(when (called-interactively-p 'interactive)
- (message "Action Key depressed; go to release point and hit {%s}."
+ (message "Action Key depressed; go to release point and press {%s}."
(substitute-command-keys "\\[hkey-operate]"))))))
(defun hkey-summarize (&optional current-window)
@@ -1171,10 +1259,7 @@ Under InfoDock and XEmacs, `zmacs-region' must be t; under GNU Emacs,
;; Save any active region to `hkey-region' when the mouse is moved between frames or buffers.
-(if (featurep 'xemacs)
- (add-hook 'mouse-leave-frame-hook #'hmouse-save-region)
- ;; GNU Emacs
- (add-hook 'mouse-leave-buffer-hook #'hmouse-save-region))
+(add-hook 'mouse-leave-buffer-hook #'hmouse-save-region)
;; BW - Last confirmed in 1999, for some reason, using this next
;; function in byte-compiled form caused the first character
@@ -1189,16 +1274,7 @@ lines or if ARGS is null and there is no graphical window system,
return current point as a marker."
(and (car args) (listp (car args)) (setq args (car args)))
(if (and args (hyperb:window-system))
- (progn (hmouse-set-point-at args)
- (cond ((featurep 'xemacs)
- (if (eventp current-mouse-event)
- (copy-event current-mouse-event)))
- ((equal (hyperb:window-system) "next")
- (let ((win (car args)))
- (list win
- (+ (nth 1 args) (nth 0 (window-edges win)))
- (+ (nth 2 args) (nth 1 (window-edges win))))))
- (t args)))
+ (progn (hmouse-set-point-at args) args)
(list 'keyboard-drag (posn-at-point))))
(defun hmouse-set-point-at (set-point-arg-list)
@@ -1309,4 +1385,5 @@ not."
(or rtn (progn (beep) (message "End of buffer")))
rtn))
+(provide 'hmouse-drv)
;;; hmouse-drv.el ends here
diff --git a/hmouse-info.el b/hmouse-info.el
index b0d74b5..f81b389 100644
--- a/hmouse-info.el
+++ b/hmouse-info.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 04-Apr-89
;;
-;; Copyright (C) 1989-2016 Free Software Foundation, Inc.
+;; Copyright (C) 1989-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -170,9 +170,7 @@ Otherwise, return nil."
(filep (concat "(" nodename ")" "Top"))
(buffer-file-name (concat "(" buffer-file-name ")" nodename))
(t nodename)))
- (if (featurep 'xemacs)
- (Info-goto-node nodename nil t)
- (Info-goto-node nodename))
+ (Info-goto-node nodename)
t)))
(defun Info-handle-in-node-hdr-assist ()
@@ -223,9 +221,7 @@ entry and returns t; otherwise returns nil."
(forward-char 2)
(setq node (Info-extract-menu-node-name nil (Info-index-node)))))
(when node
- (if (featurep 'xemacs)
- (Info-goto-node node nil t)
- (Info-goto-node node))
+ (Info-goto-node node)
t))))
;;; ************************************************************************
diff --git a/hmouse-key.el b/hmouse-key.el
index 81e0fd8..5ea6696 100644
--- a/hmouse-key.el
+++ b/hmouse-key.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 30-May-94 at 00:11:57
;;
-;; Copyright (C) 1994-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -26,7 +26,7 @@
;;; Other required Elisp libraries
;;; ************************************************************************
-(eval-and-compile (mapc #'require '(hsettings hmouse-drv hmouse-sh)))
+(eval-when-compile (mapc #'require '(hsettings hmouse-drv hmouse-sh)))
;;; ************************************************************************
;;; Public functions
diff --git a/hmouse-mod.el b/hmouse-mod.el
index 0c3df2b..4417e2f 100644
--- a/hmouse-mod.el
+++ b/hmouse-mod.el
@@ -1,4 +1,4 @@
-;;; hmouse-mod.el --- Action Key acts as CONTROL modifier and Assist Key as META modifier.
+;;; hmouse-mod.el --- Action Key acts as CONTROL modifier and Assist Key as META modifier.
;;
;; Author: Bob Weiner
;;
diff --git a/hmouse-sh.el b/hmouse-sh.el
index 5fac593..b84d770 100644
--- a/hmouse-sh.el
+++ b/hmouse-sh.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 3-Sep-91 at 21:40:58
;;
-;; Copyright (C) 1991-2016 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -267,114 +267,112 @@ These may be the bindings prior to initializing Hyperbole or the Hyperbole bindi
;; Get mouse bindings under Emacs or XEmacs, even if not under a
;; window system since they can have frames on ttys and windowed
;; displays at the same time.
- (if (not (featurep 'xemacs))
- (mapcar (lambda (key) (cons key (global-key-binding key)))
- (if (eq window-system 'dps)
- ;; NEXTSTEP offers only 2 shift-mouse buttons which we use
- ;; as the Smart Keys.
- '([S-down-mouse-1] [S-drag-mouse-1] [S-mouse-1]
- [S-down-mouse-2] [S-drag-mouse-2] [S-mouse-2]
- [S-double-mouse-1] [S-triple-mouse-1]
- [S-double-mouse-2] [S-triple-mouse-2]
- [header-line S-down-mouse-1] [header-line S-drag-mouse-1]
- [header-line S-mouse-1]
- [header-line S-down-mouse-2] [header-line S-drag-mouse-2]
- [header-line S-mouse-2]
- [left-fringe S-down-mouse-1] [left-fringe S-drag-mouse-1]
- [left-fringe S-mouse-1]
- [left-fringe S-down-mouse-2] [left-fringe S-drag-mouse-2]
- [left-fringe S-mouse-2]
- [right-fringe S-down-mouse-1] [right-fringe S-drag-mouse-1]
- [right-fringe S-mouse-1]
- [right-fringe S-down-mouse-2] [right-fringe S-drag-mouse-2]
- [right-fringe S-mouse-2]
- [vertical-line S-down-mouse-1] [vertical-line S-drag-mouse-1]
- [vertical-line S-mouse-1]
- [vertical-line S-down-mouse-2] [vertical-line S-drag-mouse-2]
- [vertical-line S-mouse-2]
- [mode-line S-down-mouse-1] [mode-line S-drag-mouse-1]
- [mode-line S-mouse-1]
- [mode-line S-down-mouse-2] [mode-line S-drag-mouse-2]
- [mode-line S-mouse-2]
- )
- ;; X, macOS or MS Windows
- '([S-down-mouse-2] [S-drag-mouse-2] [S-mouse-2]
- [S-down-mouse-3] [S-drag-mouse-3] [S-mouse-3]
- [S-double-mouse-2] [S-triple-mouse-2]
- [S-double-mouse-3] [S-triple-mouse-3]
- [header-line S-down-mouse-2] [header-line S-drag-mouse-2]
- [header-line S-mouse-2]
- [header-line S-down-mouse-3] [header-line S-drag-mouse-3]
- [header-line S-mouse-3]
- [left-fringe S-down-mouse-2] [left-fringe S-drag-mouse-2]
- [left-fringe S-mouse-2]
- [left-fringe S-down-mouse-3] [left-fringe S-drag-mouse-3]
- [left-fringe S-mouse-3]
- [right-fringe S-down-mouse-2] [right-fringe S-drag-mouse-2]
- [right-fringe S-mouse-2]
- [right-fringe S-down-mouse-3] [right-fringe S-drag-mouse-3]
- [right-fringe S-mouse-3]
- [vertical-line S-down-mouse-2] [vertical-line S-drag-mouse-2]
- [vertical-line S-mouse-2]
- [vertical-line S-down-mouse-3] [vertical-line S-drag-mouse-3]
- [vertical-line S-mouse-3]
- [mode-line S-down-mouse-2] [mode-line S-drag-mouse-2]
- [mode-line S-mouse-2]
- [mode-line S-down-mouse-3] [mode-line S-drag-mouse-3]
- [mode-line S-mouse-3]
- )))
- (nconc
- (mapcar (lambda (key)
- (cons key (global-key-binding key)))
- '([(shift button2)] [(shift button2up)]
- [(shift button3)] [(shift button3up)]))
- (if (boundp 'mode-line-map)
- (mapcar (lambda (key)
- (cons key (lookup-key mode-line-map key)))
- '([(shift button3)] [(shift button3up)]))))))))
+ (mapcar (lambda (key) (cons key (global-key-binding key)))
+ (if (eq window-system 'dps)
+ ;; NEXTSTEP offers only 2 shift-mouse buttons which we use
+ ;; as the Smart Keys.
+ '([S-down-mouse-1] [S-drag-mouse-1] [S-mouse-1]
+ [S-down-mouse-2] [S-drag-mouse-2] [S-mouse-2]
+ [S-double-mouse-1] [S-triple-mouse-1]
+ [S-double-mouse-2] [S-triple-mouse-2]
+ [header-line S-down-mouse-1] [header-line S-drag-mouse-1]
+ [header-line S-mouse-1]
+ [header-line S-down-mouse-2] [header-line S-drag-mouse-2]
+ [header-line S-mouse-2]
+ [left-fringe S-down-mouse-1] [left-fringe S-drag-mouse-1]
+ [left-fringe S-mouse-1]
+ [left-fringe S-down-mouse-2] [left-fringe S-drag-mouse-2]
+ [left-fringe S-mouse-2]
+ [right-fringe S-down-mouse-1] [right-fringe S-drag-mouse-1]
+ [right-fringe S-mouse-1]
+ [right-fringe S-down-mouse-2] [right-fringe S-drag-mouse-2]
+ [right-fringe S-mouse-2]
+ [vertical-line S-down-mouse-1] [vertical-line S-drag-mouse-1]
+ [vertical-line S-mouse-1]
+ [vertical-line S-down-mouse-2] [vertical-line S-drag-mouse-2]
+ [vertical-line S-mouse-2]
+ [mode-line S-down-mouse-1] [mode-line S-drag-mouse-1]
+ [mode-line S-mouse-1]
+ [mode-line S-down-mouse-2] [mode-line S-drag-mouse-2]
+ [mode-line S-mouse-2]
+ )
+ ;; X, macOS or MS Windows
+ '([S-down-mouse-2] [S-drag-mouse-2] [S-mouse-2]
+ [S-down-mouse-3] [S-drag-mouse-3] [S-mouse-3]
+ [S-double-mouse-2] [S-triple-mouse-2]
+ [S-double-mouse-3] [S-triple-mouse-3]
+ [header-line S-down-mouse-2] [header-line S-drag-mouse-2]
+ [header-line S-mouse-2]
+ [header-line S-down-mouse-3] [header-line S-drag-mouse-3]
+ [header-line S-mouse-3]
+ [left-fringe S-down-mouse-2] [left-fringe S-drag-mouse-2]
+ [left-fringe S-mouse-2]
+ [left-fringe S-down-mouse-3] [left-fringe S-drag-mouse-3]
+ [left-fringe S-mouse-3]
+ [right-fringe S-down-mouse-2] [right-fringe S-drag-mouse-2]
+ [right-fringe S-mouse-2]
+ [right-fringe S-down-mouse-3] [right-fringe S-drag-mouse-3]
+ [right-fringe S-mouse-3]
+ [vertical-line S-down-mouse-2] [vertical-line S-drag-mouse-2]
+ [vertical-line S-mouse-2]
+ [vertical-line S-down-mouse-3] [vertical-line S-drag-mouse-3]
+ [vertical-line S-mouse-3]
+ [mode-line S-down-mouse-2] [mode-line S-drag-mouse-2]
+ [mode-line S-mouse-2]
+ [mode-line S-down-mouse-3] [mode-line S-drag-mouse-3]
+ [mode-line S-mouse-3]
+ )))
+ (nconc
+ (mapcar (lambda (key)
+ (cons key (global-key-binding key)))
+ '([(shift button2)] [(shift button2up)]
+ [(shift button3)] [(shift button3up)]))
+ (if (boundp 'mode-line-map)
+ (mapcar (lambda (key)
+ (cons key (lookup-key mode-line-map key)))
+ '([(shift button3)] [(shift button3up)])))))))
(defun hmouse-get-unshifted-bindings ()
"Return the list of middle mouse key bindings prior to their use as Smart Keys."
;; Do nothing when running in batch mode.
- (if (not (featurep 'xemacs))
- (mapcar (lambda (key) (cons key (global-key-binding key)))
- (if (not (eq window-system 'dps))
- ;; X, macOS or MS Windows
- '([down-mouse-2] [drag-mouse-2] [mouse-2]
- [down-mouse-3] [drag-mouse-3] [mouse-3]
- [double-mouse-2] [triple-mouse-2]
- [double-mouse-3] [triple-mouse-3]
- [header-line down-mouse-2] [header-line drag-mouse-2]
- [header-line mouse-2]
- [left-fringe down-mouse-2] [left-fringe drag-mouse-2]
- [left-fringe mouse-2]
- [right-fringe down-mouse-2] [right-fringe drag-mouse-2]
- [right-fringe mouse-2]
- [vertical-line down-mouse-2] [vertical-line drag-mouse-2]
- [vertical-line mouse-2]
- [left-fringe down-mouse-3] [left-fringe drag-mouse-3]
- [left-fringe mouse-3]
- [right-fringe down-mouse-3] [right-fringe drag-mouse-3]
- [right-fringe mouse-3]
- [vertical-line down-mouse-3] [vertical-line drag-mouse-3]
- [vertical-line mouse-3]
- [mode-line down-mouse-2] [mode-line drag-mouse-2]
- [mode-line mouse-2]
- [mode-line down-mouse-3] [mode-line drag-mouse-3]
- [mode-line mouse-3]
- )))
- (nconc
- (mapcar (lambda (key)
- (cons key (global-key-binding key)))
- '([button2] [button2up]
- [button3] [button3up]
- ))
- (if (boundp 'mode-line-map)
- (mapcar (function
- (lambda (key)
- (cons key (lookup-key mode-line-map key))))
- '([button3] [button3up])))
- )))
+ (mapcar (lambda (key) (cons key (global-key-binding key)))
+ (if (not (eq window-system 'dps))
+ ;; X, macOS or MS Windows
+ '([down-mouse-2] [drag-mouse-2] [mouse-2]
+ [down-mouse-3] [drag-mouse-3] [mouse-3]
+ [double-mouse-2] [triple-mouse-2]
+ [double-mouse-3] [triple-mouse-3]
+ [header-line down-mouse-2] [header-line drag-mouse-2]
+ [header-line mouse-2]
+ [left-fringe down-mouse-2] [left-fringe drag-mouse-2]
+ [left-fringe mouse-2]
+ [right-fringe down-mouse-2] [right-fringe drag-mouse-2]
+ [right-fringe mouse-2]
+ [vertical-line down-mouse-2] [vertical-line drag-mouse-2]
+ [vertical-line mouse-2]
+ [left-fringe down-mouse-3] [left-fringe drag-mouse-3]
+ [left-fringe mouse-3]
+ [right-fringe down-mouse-3] [right-fringe drag-mouse-3]
+ [right-fringe mouse-3]
+ [vertical-line down-mouse-3] [vertical-line drag-mouse-3]
+ [vertical-line mouse-3]
+ [mode-line down-mouse-2] [mode-line drag-mouse-2]
+ [mode-line mouse-2]
+ [mode-line down-mouse-3] [mode-line drag-mouse-3]
+ [mode-line mouse-3]
+ )))
+ (nconc
+ (mapcar (lambda (key)
+ (cons key (global-key-binding key)))
+ '([button2] [button2up]
+ [button3] [button3up]
+ ))
+ (if (boundp 'mode-line-map)
+ (mapcar (function
+ (lambda (key)
+ (cons key (lookup-key mode-line-map key))))
+ '([button3] [button3up])))
+ ))
;; Based on a function from Emacs mouse.el.
(defun hmouse-posn-set-point (position)
@@ -429,12 +427,6 @@ point determined by `mouse-select-region-move-to-beginning'."
(defun hmouse-move-point-eterm (arg-list)
(apply 'mouse-move-point arg-list))
-(defun hmouse-move-point-xemacs ()
- (condition-case ()
- (mouse-set-point current-mouse-event)
- ;; Catch "not in a window" errors, e.g. on modeline
- (error nil)))
-
(defun hmouse-set-key-list (binding key-list)
(mapc (lambda (key) (hkey-global-set-key key binding)) key-list)
nil)
@@ -457,42 +449,20 @@ point determined by `mouse-select-region-move-to-beginning'."
;; this.
(setq kmacro-call-mouse-event nil)
;;
- (cond
- ;; GNU Emacs
- ((not (featurep 'xemacs))
- (setq hmouse-set-point-command 'hmouse-move-point-emacs)
- (if (eq window-system 'dps)
- ;; NEXTSTEP offers only 2 shift-mouse buttons which we use as the Smart Keys.
- (progn
- (hmouse-bind-shifted-key-emacs 1 #'action-key-depress-emacs #'action-mouse-key-emacs)
- (hmouse-bind-shifted-key-emacs 2 #'assist-key-depress-emacs #'assist-mouse-key-emacs))
- ;; X, macOS or MS Windows
- (hmouse-bind-shifted-key-emacs 2 #'action-key-depress-emacs #'action-mouse-key-emacs)
- (hmouse-bind-shifted-key-emacs 3 #'assist-key-depress-emacs #'assist-mouse-key-emacs)
- (with-eval-after-load "company"
- (define-key company-active-map [S-down-mouse-2] 'ignore)
- (define-key company-active-map [S-mouse-2] 'smart-company-to-definition)
- (define-key company-active-map [S-down-mouse-3] 'ignore)
- (define-key company-active-map [S-mouse-3] 'smart-company-help))))
- ;;
- ;; XEmacs
- ((featurep 'xemacs)
- ;; Set mouse bindings under XEmacs, even if not under a window
- ;; system since it can have frames on ttys and windowed displays at
- ;; the same time.
- (setq hmouse-set-point-command 'hmouse-move-point-xemacs)
- (global-set-key '(shift button2) 'action-key-depress)
- (global-set-key '(shift button2up) 'action-mouse-key)
- (if (fboundp 'infodock-set-mouse-bindings)
- (infodock-set-mouse-bindings)
- (if (boundp 'mode-line-map)
- (progn (define-key mode-line-map '(shift button3)
- 'assist-key-depress)
- (define-key mode-line-map '(shift button3up)
- 'assist-mouse-key)
- ))
- (global-set-key '(shift button3) 'assist-key-depress)
- (global-set-key '(shift button3up) 'assist-mouse-key))))
+ (setq hmouse-set-point-command 'hmouse-move-point-emacs)
+ (if (eq window-system 'dps)
+ ;; NEXTSTEP offers only 2 shift-mouse buttons which we use as the Smart Keys.
+ (progn
+ (hmouse-bind-shifted-key-emacs 1 #'action-key-depress-emacs #'action-mouse-key-emacs)
+ (hmouse-bind-shifted-key-emacs 2 #'assist-key-depress-emacs #'assist-mouse-key-emacs))
+ ;; X, macOS or MS Windows
+ (hmouse-bind-shifted-key-emacs 2 #'action-key-depress-emacs #'action-mouse-key-emacs)
+ (hmouse-bind-shifted-key-emacs 3 #'assist-key-depress-emacs #'assist-mouse-key-emacs)
+ (with-eval-after-load "company"
+ (define-key company-active-map [S-down-mouse-2] 'ignore)
+ (define-key company-active-map [S-mouse-2] 'smart-company-to-definition)
+ (define-key company-active-map [S-down-mouse-3] 'ignore)
+ (define-key company-active-map [S-mouse-3] 'smart-company-help)))
(setq hmouse-bindings (hmouse-get-bindings hmouse-middle-flag)
hmouse-bindings-flag t)))
@@ -500,63 +470,38 @@ point determined by `mouse-select-region-move-to-beginning'."
"Binds the middle mouse key as the Action Key and the right mouse key as the Assist Key.
With optional MIDDLE-KEY-ONLY-FLAG non-nil, binds only the middle mouse key."
(interactive)
- (cond ;; GNU Emacs
- ((not (featurep 'xemacs))
- ;; Unbind Emacs push-button mouse keys since Hyperbole handles them.
- (define-key button-map [mouse-2] nil)
- (define-key button-map [mode-line mouse-2] nil)
- (define-key button-map [header-line mouse-2] nil)
- ;; Remove push-button help echo string for mouse-2 key.
- (put 'default-button 'help-echo nil)
- ;;
- ;; In Info-mode, Emacs uses key-translation-map to link mouse-1 to
- ;; do whatever mouse-2 does but because Hyperbole uses both down
- ;; and up bindings on mouse2, this does work. So we rebind
- ;; mouse-1 in Info mode to be an actual Action Mouse Key (which
- ;; makes it follow Info links/cross-references properly, doing a
- ;; superset of what it did before).
- (var:add-and-run-hook 'Info-mode-hook
- (lambda ()
- (define-key Info-mode-map [down-mouse-1] 'action-key-depress-emacs)
- (define-key Info-mode-map [mouse-1] 'action-mouse-key-emacs)
- (define-key Info-mode-map [double-down-mouse-1] 'action-key-depress-emacs)
- (define-key Info-mode-map [double-mouse-1] 'action-mouse-key-emacs)
- (define-key Info-mode-map [mouse-2] nil)))
- ;;
- (unless (eq window-system 'dps)
- ;; X, macOS or MS Windows
- (hmouse-bind-key-emacs 2 #'action-key-depress-emacs #'action-mouse-key-emacs)
- (unless middle-key-only-flag
- (hmouse-bind-key-emacs 3 #'assist-key-depress-emacs #'assist-mouse-key-emacs))
- `(with-eval-after-load "company"
- (define-key company-active-map [down-mouse-2] 'ignore)
- (define-key company-active-map [mouse-2] 'smart-company-to-definition)
- (unless ,middle-key-only-flag
- (define-key company-active-map [down-mouse-3] 'ignore)
- (define-key company-active-map [mouse-3] 'smart-company-help)))))
- ;;
- ;; XEmacs
- ((featurep 'xemacs)
- ;; Set mouse bindings under XEmacs, even if not under a window
- ;; system since it can have frames on ttys and windowed displays at
- ;; the same time.
- ;;
- ;; Get rid of Info-mode button 2 and possibly button 3 bindings since Hyperbole
- ;; handles things in Info.
- (var:add-and-run-hook 'Info-mode-hook
- (lambda () (define-key Info-mode-map 'button2 nil)))
- ;;
- (global-set-key 'button2 'action-key-depress)
- (global-set-key 'button2up 'action-mouse-key)
+ ;; Unbind Emacs push-button mouse keys since Hyperbole handles them.
+ (define-key button-map [mouse-2] nil)
+ (define-key button-map [mode-line mouse-2] nil)
+ (define-key button-map [header-line mouse-2] nil)
+ ;; Remove push-button help echo string for mouse-2 key.
+ (put 'default-button 'help-echo nil)
+ ;;
+ ;; In Info-mode, Emacs uses key-translation-map to link mouse-1 to
+ ;; do whatever mouse-2 does but because Hyperbole uses both down
+ ;; and up bindings on mouse2, this does not work. So we rebind
+ ;; mouse-1 in Info mode to be an actual Action Mouse Key (which
+ ;; makes it follow Info links/cross-references properly, doing a
+ ;; superset of what it did before).
+ (var:add-and-run-hook 'Info-mode-hook
+ (lambda ()
+ (define-key Info-mode-map [down-mouse-1] 'action-key-depress-emacs)
+ (define-key Info-mode-map [mouse-1] 'action-mouse-key-emacs)
+ (define-key Info-mode-map [double-down-mouse-1] 'action-key-depress-emacs)
+ (define-key Info-mode-map [double-mouse-1] 'action-mouse-key-emacs)
+ (define-key Info-mode-map [mouse-2] nil)))
+ ;;
+ (unless (eq window-system 'dps)
+ ;; X, macOS or MS Windows
+ (hmouse-bind-key-emacs 2 #'action-key-depress-emacs #'action-mouse-key-emacs)
(unless middle-key-only-flag
- (if (and (boundp 'Info-mode-map) (keymapp Info-mode-map))
- (funcall (lambda () (define-key Info-mode-map 'button3 nil)))
- (add-hook 'Info-mode-hook unbind-but3))
- (when (boundp 'mode-line-map)
- (define-key mode-line-map 'button3 'assist-key-depress)
- (define-key mode-line-map 'button3up 'assist-mouse-key))
- (global-set-key 'button3 'assist-key-depress)
- (global-set-key 'button3up 'assist-mouse-key)))))
+ (hmouse-bind-key-emacs 3 #'assist-key-depress-emacs #'assist-mouse-key-emacs))
+ `(with-eval-after-load "company"
+ (define-key company-active-map [down-mouse-2] 'ignore)
+ (define-key company-active-map [mouse-2] 'smart-company-to-definition)
+ (unless ,middle-key-only-flag
+ (define-key company-active-map [down-mouse-3] 'ignore)
+ (define-key company-active-map [mouse-3] 'smart-company-help)))))
(provide 'hmouse-sh)
diff --git a/hmouse-tag.el b/hmouse-tag.el
index f921231..2cb4949 100644
--- a/hmouse-tag.el
+++ b/hmouse-tag.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 24-Aug-91
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -635,6 +635,15 @@ buffer."
(beginning-of-line)
(looking-at "\\(;*[ \t]*\\)?(\\(autoload\\|load\\|require\\)")))
+(defun smart-lisp-at-change-log-tag-p ()
+ "When in a change-log mode, match to only bound Elisp identifiers and those with a '-' somewhere in the middle.
+These tight tests help eliminate undesired matches.
+Returns matching ELisp tag name that point is within, else nil."
+ (when (derived-mode-p 'change-log-mode)
+ (let ((identifier (smart-lisp-at-tag-p)))
+ (and identifier (intern-soft identifier)
+ (string-match "[^-]-[^-]" identifier)))))
+
(defun smart-lisp-at-tag-p (&optional no-flash)
"Returns Lisp tag name that point is within, else nil.
Returns nil when point is on the first line of a non-alias Lisp definition."
@@ -644,7 +653,7 @@ Returns nil when point is on the first line of a non-alias Lisp definition."
(save-excursion
(skip-chars-backward identifier-chars)
(if (and (looking-at identifier)
- ;; Ignore any all punctuation matches.
+ ;; Ignore any punctuation matches.
(not (string-match "\\`[-<>*]+\\'" (match-string 0)))
;; Needed to set match string.
(looking-at identifier))
@@ -664,7 +673,7 @@ Returns nil when point is on the first line of a non-alias Lisp definition."
(defun smart-lisp-mode-p ()
"Return t if in a mode which uses Lisp symbols."
(or (smart-emacs-lisp-mode-p)
- (memq major-mode '(lisp-mode scheme-mode change-log-mode))))
+ (memq major-mode '(lisp-mode scheme-mode))))
;;;###autoload
(defun smart-objc (&optional identifier next)
@@ -761,23 +770,35 @@ If key is pressed:
(buffer-substring-no-properties (match-beginning 2) (match-end 2))
(match-beginning 2) (match-end 2)))))))
+(defun smart-jedi-find-file (file line column other-window)
+ "Function that reads a source file for jedi navigation.
+It takes these arguments: (file-to-read other-window-flag line_number column_number)."
+ (hpath:display-buffer (find-file file) other-window)
+ (jedi:goto--line-column line column))
(defun smart-python-jedi-to-definition-p ()
"If the Jedi Python identifier server is running, test and use it to jump to the definition.
See https://tkf.github.io/emacs-jedi/latest/."
;; Use functions from jedi-core.el only, not from jedi.el, since
;; company-jedi.el users will have loaded only jedi-core.el.
- (when (featurep 'jedi-core)
+ (when (and (featurep 'jedi-core) jedi-mode)
(let* ((servers (jedi:-get-servers-in-use))
(proc (epc:manager-server-process (car servers))))
(and servers (processp proc)
(eq 'run (process-status (process-buffer proc)))
;; The goto is performed asynchronously.
;; It reports in the minibuffer when a definition is not found.
- (progn (jedi:goto-definition t)
- ;; For use as a predicate, always return t if the Jedi server
- ;; is running so other lookup techniques are not tried.
- t)))))
+ ;; !! Only works on tag at point, not the tagname passed in as jedi
+ ;; does not accept a tag parameter.
+ ;;
+ ;; jedi:find-file-function is an RSW custom
+ ;; modification that allows display-where to work;
+ ;; otherwise, will just display in another window.
+ (let ((jedi:find-file-function #'smart-jedi-find-file))
+ (jedi:goto-definition hpath:display-where)
+ ;; For use as a predicate, always return t if the Jedi server
+ ;; is running so other lookup techniques are not tried.
+ t)))))
;;;###autoload
(defun smart-python (&optional identifier next)
@@ -1039,7 +1060,7 @@ Returns TAG."
(tags-add-tables nil))
;; For InfoDock (XEmacs may also take this branch), force exact match
;; (otherwise tag might = nil and the following stringp test could fail).
- (if (or (featurep 'infodock) (featurep 'xemacs))
+ (if (featurep 'infodock)
(if (stringp tag) (setq tag (list tag))))
(condition-case ()
(and func (funcall func tag) t)
@@ -1198,7 +1219,7 @@ Look for packages in `smart-java-package-path'."
dir-list (if (setq found (file-exists-p path))
nil
(cdr dir-list))))
- (when (and (not found) subpath hyperb:microcruft-os-p)
+ (when (and (not found) subpath hyperb:microsoft-os-p)
;; Try .jav suffix.
(setq subfile (concat subpath ".jav")
dir-list smart-java-package-path)
@@ -1257,7 +1278,7 @@ See the \"${hyperb:dir}/smart-clib-sym\" script for more information."
;; For InfoDock (XEmacs may also take this branch), force exact match
;; when `next' is false (otherwise tag would = nil and the following
;; stringp test would fail).
- (if (or (featurep 'infodock) (featurep 'xemacs))
+ (if (featurep 'infodock)
(if (stringp tag)
(setq tag (list tag))))
(if (and func (setq find-tag-result (funcall func tag)))
@@ -1279,7 +1300,7 @@ See the \"${hyperb:dir}/smart-clib-sym\" script for more information."
(with-no-warnings (find-tag tag))))
;; Signals an error if tag is not found which is caught by
;; many callers of this function.
- (with-no-warnings (find-tag tag)))))
+ (with-no-warnings (find-tag tag)))))
;;;###autoload
(defun smart-tags-file-path (file)
diff --git a/hpath.el b/hpath.el
index d26678d..d3151f8 100644
--- a/hpath.el
+++ b/hpath.el
@@ -1,10 +1,10 @@
-;;; hpath.el --- GNU Hyperbole support routines for handling UNIX paths
+;;; hpath.el --- GNU Hyperbole support routines for handling POSIX and MSWindows paths
;;
;; Author: Bob Weiner
;;
;; Orig-Date: 1-Nov-91 at 00:44:23
;;
-;; Copyright (C) 1991-2016 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -40,6 +40,178 @@ Default is `nil' since this can slow down normal file finding."
:group 'hyperbole-buttons)
;;; ************************************************************************
+;;; MS WINDOWS PATH CONVERSIONS
+;;; ************************************************************************
+
+;; This section adds automatic recognition of MSWindows implicit path
+;; links and converts disk drive and path separators to whatever
+;; format is needed by the underlying OS upon which Emacs is one,
+;; notably either for POSIX or MSWindows (with no POSIC layer).
+
+;; Especially useful when running Emacs under Windows Subsystem for
+;; Linux (WSL) where the system-type variable is gnu/linux but
+;; MSWindows is underneath so the user likely has many Windows
+;; formatted links.
+
+;; See "https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats"
+;; and "https://docs.microsoft.com/en-us/windows/wsl/interop" for
+;; Windows path specifications and use under WSL.
+
+(defvar hpath:posix-mount-points-regexp
+ "^\\(Filesystem\\|rootfs\\|none\\) "
+ "Regexp of 'mount' command output lines that are not mount points of MSWindows paths.")
+
+(defvar hpath:mswindows-mount-prefix
+ (cond ((eq system-type 'cygwin)
+ "/cygdrive/")
+ (hyperb:microsoft-os-p
+ "")
+ (t ;; POSIX
+ "/mnt/"))
+ "Path prefix to add when converting MSWindows drive paths to POSIX-style.
+Must include a trailing directory separator or be nil.")
+
+(defconst hpath:mswindows-drive-regexp (format "\\`\\(%s\\)?[\\/]?\\([a-zA-Z]\\)[:\\/]"
+ hpath:mswindows-mount-prefix)
+ "Regular expression matching an MSWindows drive letter at the beginning of a path string.
+Grouping 2 is the actual letter of the drive.
+If the value of 'hpath:mswindows-mount-prefix' changes, then re-initialize this constant.")
+
+(defconst hpath:mswindows-path-regexp "\\`.*\\.*[a-zA-Z0-9_.]"
+ "Regular expression matching the start of an MSWindows path that does not start with a drive letter but contains directory separators.")
+
+(defvar hpath:mswindows-path-posix-mount-alist nil
+ "Automatically set alist of (window-path-prefix . posix-mount-point) elements.")
+
+(defvar hpath:directory-expand-alist nil
+ "Automatically set alist of (posix-mount-point . window-path-prefix) elements.
+ Used to expand windows prefixes to posix mount points during mswindows-to-posix.")
+
+;;;###autoload
+(defun hpath:mswindows-to-posix (path)
+ "Convert a recognizable MSWindows PATH to a Posix-style path or return the path unchanged.
+If path begins with an MSWindows drive letter, prefix the converted path with the value of 'hpath:mswindows-mount-prefix'."
+ (interactive "sMSWindows path to convert to POSIX: ")
+ (when (stringp path)
+ (setq path (hpath:mswindows-to-posix-separators path))
+ (when (string-match hpath:mswindows-drive-regexp path)
+ (when (string-match hpath:mswindows-drive-regexp path)
+ (let* ((drive-prefix (downcase (match-string 2 path)))
+ (rest-of-path (substring path (match-end 0)))
+ (absolute-p (and (not (string-empty-p rest-of-path))
+ (= (aref rest-of-path 0) ?/))))
+ ;; Convert MSWindows disk drive paths to POSIX-style with a mount prefix.
+ (setq path (concat hpath:mswindows-mount-prefix drive-prefix
+ (cond (hyperb:microsoft-os-p ":")
+ (absolute-p "")
+ (t "/"))
+ rest-of-path))))))
+ path)
+
+(defun hpath:mswindows-to-posix-separators (path)
+ "Replace all backslashes with forward slashes in PATH and expand the path against `directory-abbrev-alist', if possible.
+Path must be a string or an error will be triggered."
+ (let ((directory-abbrev-alist hpath:directory-expand-alist))
+ (replace-regexp-in-string "\\\\" "/" (abbreviate-file-name path) nil t)))
+
+;;;###autoload
+(defun hpath:posix-to-mswindows (path)
+ "Convert and return a Posix-style PATH to an MSWindows path or return the path unchanged.
+If path begins with an optional mount prefix, 'hpath:mswindows-mount-prefix', followed by an MSWindows drive letter, remove the mount prefix."
+ (interactive "sPOSIX path to convert to MSWindows: ")
+ (when (stringp path)
+ (setq path (hpath:posix-to-mswindows-separators path))
+ ;; Remove any POSIX mount prefix preceding an MSWindows path.
+ (if (eq 0 (string-match hpath:mswindows-mount-prefix path))
+ (setq path (substring path (match-end 0))))
+ (when (string-match hpath:mswindows-drive-regexp path)
+ (when (string-match hpath:mswindows-drive-regexp path)
+ (let* ((drive-prefix (downcase (match-string 2 path)))
+ (rest-of-path (substring path (match-end 0)))
+ (absolute-p (= (aref path (1- (match-end 0))) ?\\)))
+ ;; Convert formerly Posix-style Windows disk drive paths to MSWindows-style.
+ (setq path (concat drive-prefix ":"
+ (if (or (not absolute-p)
+ (string-match "\\`[~/]" rest-of-path))
+ ""
+ "\\")
+ rest-of-path))))))
+ path)
+
+(defun hpath:posix-to-mswindows-separators (path)
+ "Replace all forward slashes with backslashes in PATH and abbreviate the path if possible.
+Path must be a string or an error will be triggered. See
+'abbreviate-file-name' for how path abbreviation is handled."
+ (replace-regexp-in-string "/" "\\\\" (abbreviate-file-name path)))
+
+(defun hpath:posix-path-p (path)
+ "Return non-nil if PATH looks like a Posix path."
+ (and (stringp path) (string-match "/" path)))
+
+;;;###autoload
+(defun hpath:substitute-posix-or-mswindows-at-point ()
+ "If point is within a recognizable Posix or MSWindows path, change the path to the other type of path."
+ (interactive "*")
+ (barf-if-buffer-read-only)
+ (let* ((opoint (point))
+ (str-and-positions (hpath:delimited-possible-path t t))
+ (path (car str-and-positions))
+ (start (nth 1 str-and-positions))
+ (end (nth 2 str-and-positions)))
+ (when path
+ (if (hpath:posix-path-p path)
+ (setq path (hpath:posix-to-mswindows path))
+ (setq path (hpath:mswindows-to-posix path)))
+ (delete-region start end)
+ (insert path)
+ (goto-char (min opoint (point-max))))))
+
+;;;###autoload
+(defun hpath:substitute-posix-or-mswindows (path)
+ "Change a recognizable Posix or MSWindows PATH to the other type of path."
+ (when (stringp path)
+ (if (hpath:posix-path-p path)
+ (hpath:posix-to-mswindows path)
+ (hpath:mswindows-to-posix path))))
+
+;;;###autoload
+(defun hpath:cache-mswindows-mount-points ()
+ "Cache valid MSWindows mount points in 'directory-abbrev-alist' when under a non-MSWindows operating system, e.g. WSL.
+Call this function manually if mount points change after Hyperbole is loaded."
+ (interactive)
+ (when (not hyperb:microsoft-os-p)
+ (let ((mount-points-to-add
+ ;; Sort alist of (path-mounted . mount-point) elements from shortest
+ ;; to longest path so that the longest path is selected first within
+ ;; 'directory-abbrev-alist' (elements are added in reverse order).
+ (sort
+ ;; Convert plist to alist for sorting.
+ (hypb:map-plist (lambda (path mount-point)
+ (if (string-match "\\`\\([a-zA-Z]\\):\\'" path)
+ ;; Drive letter must be downcased
+ ;; in order to work when converted back to Posix.
+ (setq path (concat "/" (downcase (match-string 1 path)))))
+ ;; Assume all mounted Windows paths are
+ ;; lowercase for now.
+ (cons (downcase path) mount-point))
+ ;; Return a plist of MSWindows path-mounted mount-point pairs.
+ (split-string (shell-command-to-string (format "df -a -t drvfs 2> /dev/null | sort | uniq | grep -v '%s' | sed -e 's+ .*[-%%] /+ /+g'" hpath:posix-mount-points-regexp))))
+ (lambda (cons1 cons2) (<= (length (car cons1)) (length (car cons2))))))
+ path mount-point)
+ (mapcar (lambda (path-and-mount-point)
+ (setq path (car path-and-mount-point)
+ mount-point (cdr path-and-mount-point))
+ (add-to-list 'directory-abbrev-alist (cons (format "\\`%s" (regexp-quote path))
+ mount-point)))
+ mount-points-to-add)
+ (setq hpath:directory-expand-alist
+ ;; Save the reverse of each mount-points-to-add so
+ ;; can expand paths when going from posix-to-mswindows.
+ (mapcar (lambda (elt) (cons (cdr elt) (car elt))) mount-points-to-add))
+ mount-points-to-add)))
+
+
+;;; ************************************************************************
;;; FILE VIEWER COMMAND SETTINGS
;;; ************************************************************************
@@ -58,7 +230,8 @@ See the function `hpath:get-external-display-alist' for detailed format document
:type 'regexp
:group 'hyperbole-commands)
-(defvar hpath:external-display-alist-mswindows (list (cons (format "\\.\\(%s\\)$" hpath:external-open-office-suffixes)
+(defvar hpath:external-display-alist-mswindows (list '("\\.vba$" . "/c/Windows/System32/cmd.exe //c start \"${@//&/^&}\"")
+ (cons (format "\\.\\(%s\\)$" hpath:external-open-office-suffixes)
"openoffice.exe"))
"*An alist of (FILENAME-REGEXP . DISPLAY-PROGRAM-STRING-OR-LIST) elements for MS Windows.
See the function `hpath:get-external-display-alist' for detailed format documentation.")
@@ -329,7 +502,7 @@ use with string-match.")
(defconst hpath:markup-link-anchor-regexp
(concat "\\`\\(#?[^#]+\\)\\(#\\)\\([^\]\[#^{}<>\"`'\\\n\t\f\r]*\\)")
- "Regexp that matches an markup filename followed by a hash (#) and an optional in-file anchor name.")
+ "Regexp that matches a markup filename followed by a hash (#) and an optional in-file anchor name.")
(defconst hpath:outline-section-pattern "^\*+[ \t]+%s\\([ \t[:punct:]]*\\)$"
"Regexp matching an Emacs outline section header and containing a %s for replacement of a specific section name.")
@@ -345,6 +518,9 @@ These are used to indicate how to display or execute the pathname.
"\\`/[^/:]+:\\|\\`ftp[:.]\\|\\`www\\.\\|\\`https?:"
"Regexp matching remote pathnames and urls which invoke remote file handlers.")
+(defconst hpath:texinfo-section-pattern "^@node+[ \t]+%s[ \t]*\\(,\\|$\\)"
+ "Regexp matching a Texinfo section header and containing a %s for replacement of a specific section name.")
+
;;; ************************************************************************
;;; Public functions
;;; ************************************************************************
@@ -372,6 +548,14 @@ directories. The first one in which PATH is found is used."
(or (file-exists-p rtn) (setq rtn nil)))
(or rtn path)))))
+(defun hpath:tramp-file-name-regexp ()
+ "Returns a modified tramp-file-name-regexp for matching to the beginning of a remote file name.
+Removes bol anchor and removes match to empty string if present."
+ (let ((tramp-regexp (car (if (fboundp 'tramp-file-name-structure)
+ (tramp-file-name-structure)
+ tramp-file-name-structure))))
+ (substring-no-properties (replace-regexp-in-string "\\\\'" "" tramp-regexp) 1)))
+
(defun hpath:remote-at-p ()
"Returns a remote pathname that point is within or nil.
See the `(emacs)Remote Files' info documentation for pathname format details.
@@ -385,10 +569,7 @@ Always returns nil if (hpath:remote-available-p) returns nil."
(skip-chars-backward "^[ \t\n\r\f\"`'|\(\{<")
(cond
((and (eq remote-package 'tramp)
- ;; Remove match to bol in this regexp before testing.
- (looking-at (substring-no-properties (car (if (fboundp 'tramp-file-name-structure)
- (tramp-file-name-structure)
- tramp-file-name-structure)) 1)))
+ (looking-at (hpath:tramp-file-name-regexp)))
(match-string-no-properties 0))
((looking-at hpath:url-regexp)
(if (string-equal (match-string-no-properties hpath:protocol-grpn) "ftp")
@@ -524,28 +705,37 @@ paths are allowed. Absolute pathnames must begin with a `/' or `~'."
((hpath:www-at-p) nil)
((hpath:is-p (hpath:delimited-possible-path non-exist) type non-exist))))
-(defun hpath:delimited-possible-path (&optional non-exist)
+(defun hpath:delimited-possible-path (&optional non-exist include-positions)
"Returns delimited possible path or non-delimited remote path at point, if any.
No validity checking is done on the possible path. Delimiters may be:
double quotes, open and close single quote, whitespace, or Texinfo file references.
+
With optional NON-EXIST, nonexistent local paths are allowed. Absolute pathnames
-must begin with a `/' or `~'."
- (or (hargs:delimited "\"" "\"")
- ;; Filenames in Info docs or Python files
- (hargs:delimited "[`'‘]" "[`'’]" t t)
- ;; Filenames in TexInfo docs
- (hargs:delimited "@file{" "}")
- ;; Any existing whitespace delimited filename at point.
- ;; If match consists of only punctuation, like
- ;; . or .., don't treat it as a pathname. Only look for
- ;; whitespace delimited filenames if non-exist is nil.
- (unless non-exist
- (let ((p (hargs:delimited "^\\|\\(\\s \\|[\]\[(){}<>\;&,@]\\)*"
- "\\([\]\[(){}<>\;&,@]\\|:*\\s \\)+\\|$"
- t t))
- (punc (char-syntax ?.)))
- (if (delq nil (mapcar (lambda (c) (/= punc (char-syntax c))) p))
- p)))))
+must begin with a `/' or `~'.
+
+With optional INCLUDE-POSITIONS, returns a triplet list of (path start-pos
+end-pos) or nil."
+ ;; Prevents MSWindows to Posix path substitution
+ (let ((hyperb:microsoft-os-p t))
+ (or (hargs:delimited "\"" "\"" nil nil include-positions "[`'’]")
+ ;; Filenames in Info docs or Python files
+ (hargs:delimited "[`'‘]" "[`'’]" t t include-positions "\"")
+ ;; Filenames in TexInfo docs
+ (hargs:delimited "@file{" "}" nil nil include-positions)
+ ;; Any existing whitespace delimited filename at point.
+ ;; If match consists of only punctuation, like
+ ;; . or .., don't treat it as a pathname. Only look for
+ ;; whitespace delimited filenames if non-exist is nil.
+ (unless non-exist
+ (let* ((triplet (hargs:delimited "^\\|\\(\\s-\\|[\]\[(){}<>\;&,@]\\)*"
+ "\\([\]\[(){}<>\;&,@]\\|:*\\s-\\)+\\|$"
+ t t t))
+ (p (car triplet))
+ (punc (char-syntax ?.)))
+ (if (delq nil (mapcar (lambda (c) (/= punc (char-syntax c))) p))
+ (if include-positions
+ triplet
+ p)))))))
;;;###autoload
(defun hpath:display-buffer (buffer &optional display-where)
@@ -612,30 +802,29 @@ Returns non-nil iff file is displayed within a buffer (not with an external
program)."
(interactive "FFind file: ")
(let ((case-fold-search t)
- modifier loc dir anchor hash path)
+ (default-directory default-directory)
+ modifier loc anchor hash path)
(if (string-match hpath:prefix-regexp filename)
(setq modifier (aref filename 0)
filename (substring filename (match-end 0))))
- (setq filename (hpath:substitute-value filename)
+ (setq path (hpath:substitute-value
+ (if (string-match hpath:markup-link-anchor-regexp filename)
+ (progn (setq hash t
+ anchor (match-string 3 filename))
+ (substring filename 0 (match-end 1)))
+ filename))
loc (hattr:get 'hbut:current 'loc)
- dir (file-name-directory
- ;; Loc may be a buffer without a file
- (if (stringp loc) loc default-directory))
- filename (hpath:absolute-to filename dir)
- path (if (string-match hpath:markup-link-anchor-regexp filename)
- (progn (setq hash t
- anchor (match-string 3 filename))
- (substring filename 0 (match-end 1)))
- filename))
+ default-directory (file-name-directory
+ ;; Loc may be a buffer without a file
+ (if (stringp loc) loc default-directory))
+ filename (hpath:absolute-to path default-directory))
(let ((remote-filename (hpath:remote-p path)))
(or modifier remote-filename
- (file-exists-p path)
- (error "(hpath:find): \"%s\" does not exist"
- (file-relative-name filename)))
+ (file-exists-p filename)
+ (error "(hpath:find): \"%s\" does not exist" filename))
(or modifier remote-filename
- (file-readable-p path)
- (error "(hpath:find): \"%s\" is not readable"
- (file-relative-name filename)))
+ (file-readable-p filename)
+ (error "(hpath:find): \"%s\" is not readable" filename))
;; If filename is a remote file (not a directory, we have to copy it to
;; a temporary local file and then display that.
(when (and remote-filename (not (file-directory-p remote-filename)))
@@ -660,7 +849,7 @@ program)."
(hpath:command-string display-executables
filename))
nil)
- ((hypb:functionp display-executables)
+ ((functionp display-executables)
(funcall display-executables filename)
t)
((and (listp display-executables) display-executables)
@@ -707,9 +896,11 @@ program)."
(anchor-name (subst-char-in-string ?- ?\ anchor)))
(goto-char (point-min))
(if (re-search-forward (format
- (if (string-match hpath:markdown-suffix-regexp buffer-file-name)
- hpath:markdown-section-pattern
- hpath:outline-section-pattern)
+ (cond ((string-match hpath:markdown-suffix-regexp buffer-file-name)
+ hpath:markdown-section-pattern)
+ ((eq major-mode 'texinfo-mode)
+ hpath:texinfo-section-pattern)
+ (t hpath:outline-section-pattern))
(regexp-quote anchor-name)) nil t)
(progn (forward-line 0)
(recenter 0))
@@ -719,7 +910,7 @@ program)."
(hash (goto-char (point-min)))))
(defun hpath:find-executable (executable-list)
- "Return the first executable string from EXECUTABLE-LIST found within `exec-path'."
+ "Return the first executable string from EXECUTABLE-LIST found within `exec-path' or nil."
(catch 'found
(mapc
(lambda (executable)
@@ -793,16 +984,14 @@ programs, such as a pdf reader. The cdr of each element may be:
See also `hpath:internal-display-alist' for internal, window-system independent display settings."
(cond ((memq window-system '(dps ns))
hpath:external-display-alist-macos)
- (hyperb:microcruft-os-p
+ (hyperb:microsoft-os-p
hpath:external-display-alist-mswindows)
(t (cdr (assoc (hyperb:window-system)
(list (cons "emacs" hpath:external-display-alist-x) ; GNU Emacs under X
- (cons "xemacs" hpath:external-display-alist-x) ; XEmacs under X
- (cons "xterm" hpath:external-display-alist-x) ; GNU Emacs V18 under X
(cons "next" hpath:external-display-alist-macos)))))))
(defun hpath:is-p (path &optional type non-exist)
- "Returns PATH if PATH is a Unix path, else nil.
+ "Returns PATH if PATH is a Posix or MSWindows path, else nil.
If optional TYPE is the symbol 'file or 'directory, then only that path type
is accepted as a match. The existence of the path is checked only for
locally reachable paths (Info paths are not checked). Single spaces are
@@ -810,93 +999,94 @@ permitted in the middle of existing pathnames, but not at the start or end.
Tabs and newlines are converted to space before the pathname is checked, this
normalized path form is what is returned for PATH. With optional NON-EXIST,
nonexistent local paths are allowed."
- (let ((rtn-path path)
- (suffix))
- (and (stringp path)
- ;; Path may be a link reference with components other than a
- ;; pathname. These components always follow a comma or # symbol, so
- ;; strip them, if any, before checking path.
- (if (string-match "\\`[^#][^#,]*\\([ \t\n\r]*[#,]\\)" path)
- (setq rtn-path (concat (substring path 0 (match-beginning 1))
- "%s" (substring path (match-beginning 1)))
- path (substring path 0 (match-beginning 1)))
- (setq rtn-path (concat rtn-path "%s")))
- ;; If path is just a local reference that begins with #,
- ;; prepend the file name to it.
- (cond ((and buffer-file-name
- ;; ignore HTML color strings
- (not (string-match "\\`#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]\\'" path))
- ;; match to in-file HTML references
- (string-match "\\`#[^\'\"<>#]+\\'" path))
- (setq rtn-path (concat "file://" buffer-file-name rtn-path)
- path buffer-file-name))
- ((string-match "\\`[^#]+\\(#[^#]*\\)\\'" path)
- ;; file and # reference
- (setq path (substring path 0 (match-beginning 1)))
- (if (memq (aref path 0) '(?/ ?~))
- ;; absolute
- (setq rtn-path (concat "file://" rtn-path))
- (setq path (concat default-directory path)
- rtn-path (concat "file://" default-directory rtn-path))))
- (t))
- (if (string-match hpath:prefix-regexp path)
- (setq path (substring path (match-end 0)))
- t)
- (not (or (string-equal path "")
- (string-match "\\`\\s \\|\\s \\'" path)))
- ;; Convert tabs and newlines to space.
- (setq path (hbut:key-to-label (hbut:label-to-key path)))
- (or (not (string-match "[()]" path))
- (string-match "\\`([^ \t\n\r\)]+)[ *A-Za-z0-9]" path))
- (if (string-match "\\$\{[^\}]+}" path)
- (setq path (hpath:substitute-value path))
- t)
- (not (string-match "[\t\n\r\"`'|{}\\]" path))
- (or (not (hpath:www-p path))
- (string-match "\\`ftp[:.]" path))
- (let ((remote-path (string-match "@.+:\\|^/.+:\\|.+:/" path)))
- (if (cond (remote-path
- (cond ((eq type 'file)
- (not (string-equal "/" (substring path -1))))
- ((eq type 'directory)
- (string-equal "/" (substring path -1)))
- (t)))
- ((or (and non-exist
- (or
- ;; Info or remote path, so don't check for.
- (string-match "[()]" path)
- (hpath:remote-p path)
- (setq suffix (hpath:exists-p path t))
- ;; Don't allow spaces in non-existent
- ;; pathnames.
- (not (string-match " " path))))
- (setq suffix (hpath:exists-p path t)))
- (cond ((eq type 'file)
- (not (file-directory-p path)))
- ((eq type 'directory)
- (file-directory-p path))
- (t))))
- (progn
- ;; Might be an encoded URL with % characters, so
- ;; decode it before calling format below.
- (when (string-match "%" rtn-path)
- (let (decoded-path)
- (while (not (equal rtn-path (setq decoded-path (hypb:decode-url rtn-path))))
- (setq rtn-path decoded-path))))
- ;; Quote any % except for one %s at the end of the
- ;; path part of rtn-path (immediately preceding a #
- ;; or , character or the end of string).
- (setq rtn-path (hypb:replace-match-string "%" rtn-path "%%")
- rtn-path (hypb:replace-match-string "%%s\\([#,]\\|\\'\\)" rtn-path "%s\\1"))
- ;; Return path if non-nil return value.
- (if (stringp suffix) ;; suffix could = t, which we ignore
- (if (string-match (concat (regexp-quote suffix) "%s") rtn-path)
- ;; remove suffix
- (concat (substring rtn-path 0 (match-beginning 0))
- (substring rtn-path (match-end 0)))
- ;; add suffix
- (format rtn-path suffix))
- (format rtn-path ""))))))))
+ (when (stringp path)
+ (setq path (hpath:mswindows-to-posix path))
+ (let ((rtn-path path)
+ (suffix))
+ ;; Path may be a link reference with components other than a
+ ;; pathname. These components always follow a comma or # symbol, so
+ ;; strip them, if any, before checking path.
+ (and (if (string-match "\\`[^#][^#,]*\\([ \t\n\r]*[#,]\\)" path)
+ (setq rtn-path (concat (substring path 0 (match-beginning 1))
+ "%s" (substring path (match-beginning 1)))
+ path (substring path 0 (match-beginning 1)))
+ (setq rtn-path (concat rtn-path "%s")))
+ ;; If path is just a local reference that begins with #,
+ ;; prepend the file name to it.
+ (cond ((and buffer-file-name
+ ;; ignore HTML color strings
+ (not (string-match "\\`#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]\\'" path))
+ ;; match to in-file HTML references
+ (string-match "\\`#[^\'\"<>#]+\\'" path))
+ (setq rtn-path (concat "file://" buffer-file-name rtn-path)
+ path buffer-file-name))
+ ((string-match "\\`[^#]+\\(#[^#]*\\)\\'" path)
+ ;; file and # reference
+ (setq path (substring path 0 (match-beginning 1)))
+ (if (memq (aref path 0) '(?/ ?~))
+ ;; absolute
+ (setq rtn-path (concat "file://" rtn-path))
+ (setq path (concat default-directory path)
+ rtn-path (concat "file://" default-directory rtn-path))))
+ (t))
+ (if (string-match hpath:prefix-regexp path)
+ (setq path (substring path (match-end 0)))
+ t)
+ (not (or (string-equal path "")
+ (string-match "\\`\\s \\|\\s \\'" path)))
+ ;; Convert tabs and newlines to space.
+ (setq path (hbut:key-to-label (hbut:label-to-key path)))
+ (or (not (string-match "[()]" path))
+ (string-match "\\`([^ \t\n\r\)]+)[ *A-Za-z0-9]" path))
+ (if (string-match "\\$\{[^\}]+}" path)
+ (setq path (hpath:substitute-value path))
+ t)
+ (not (string-match "[\t\n\r\"`'|{}\\]" path))
+ (or (not (hpath:www-p path))
+ (string-match "\\`ftp[:.]" path))
+ (let ((remote-path (string-match "\\(@.+:\\|^/.+:\\|..+:/\\).*[^:0-9/]" path)))
+ (if (cond (remote-path
+ (cond ((eq type 'file)
+ (not (string-equal "/" (substring path -1))))
+ ((eq type 'directory)
+ (string-equal "/" (substring path -1)))
+ (t)))
+ ((or (and non-exist
+ (or
+ ;; Info or remote path, so don't check for.
+ (string-match "[()]" path)
+ (hpath:remote-p path)
+ (setq suffix (hpath:exists-p path t))
+ ;; Don't allow spaces in non-existent
+ ;; pathnames.
+ (not (string-match " " path))))
+ (setq suffix (hpath:exists-p path t)))
+ (cond ((eq type 'file)
+ (not (file-directory-p path)))
+ ((eq type 'directory)
+ (file-directory-p path))
+ (t))))
+ (progn
+ ;; Might be an encoded URL with % characters, so
+ ;; decode it before calling format below.
+ (when (string-match "%" rtn-path)
+ (let (decoded-path)
+ (while (not (equal rtn-path (setq decoded-path (hypb:decode-url rtn-path))))
+ (setq rtn-path decoded-path))))
+ ;; Quote any % except for one %s at the end of the
+ ;; path part of rtn-path (immediately preceding a #
+ ;; or , character or the end of string).
+ (setq rtn-path (hypb:replace-match-string "%" rtn-path "%%")
+ rtn-path (hypb:replace-match-string "%%s\\([#,]\\|\\'\\)" rtn-path "%s\\1"))
+ ;; Return path if non-nil return value.
+ (if (stringp suffix) ;; suffix could = t, which we ignore
+ (if (string-match (concat (regexp-quote suffix) "%s") rtn-path)
+ ;; remove suffix
+ (concat (substring rtn-path 0 (match-beginning 0))
+ (substring rtn-path (match-end 0)))
+ ;; add suffix
+ (format rtn-path suffix))
+ (format rtn-path "")))))))))
(defun hpath:push-tag-mark ()
"Add a tag return marker at point if within a programming language file buffer.
@@ -992,7 +1182,7 @@ After any match, the resulting path will contain a varible reference like ${vari
)))
;;
-;; The following function recursively resolves all UNIX links to their
+;; The following function recursively resolves all POSIX links to their
;; final referents.
;; Works with variable-based and other strange links like:
;; /usr/local -> $(SERVER_LOCAL)/usr/local, /usr/bin ->
@@ -1051,9 +1241,10 @@ validation checks.
Default-directory should be equal to the current Hyperbole button
source directory when called, so that PATH is expanded relative
to it."
- (cond ((not (stringp path))
- (error "(hpath:validate): \"%s\" is not a pathname." path))
- ((or (string-match "[()]" path) (hpath:remote-p path))
+ (unless (stringp path)
+ (error "(hpath:validate): \"%s\" is not a pathname." path))
+ (setq path (hpath:mswindows-to-posix path))
+ (cond ((or (string-match "[()]" path) (hpath:remote-p path))
;; info or remote path, so don't validate
path)
((if (not (hpath:www-p path))
@@ -1271,7 +1462,7 @@ Returns \"anonymous\" if no default user is set."
string)))
(defun hpath:exists-p (path &optional suffix-flag)
- "Return PATH if it exists. (This does not mean you can read it.)
+ "Return PATH if it exists. (This does not mean you can read it).
If PATH exists with or without a suffix from hpath:suffixes, then that
pathname is returned.
@@ -1321,16 +1512,20 @@ from path or t."
Return nil if FILENAME is a directory name or an image file that emacs can display.
See also documentation for the function (hpath:get-external-display-alist) and the variable
`hpath:internal-display-alist'."
- (cond ((let ((case-fold-search t))
- (hpath:match filename (hpath:get-external-display-alist))))
+ (cond ((and (fboundp 'image-mode)
+ (string-match hpath:native-image-suffixes filename))
+ nil)
((let ((case-fold-search nil))
(hpath:match filename hpath:internal-display-alist)))
+ ((let ((case-fold-search t))
+ (hpath:match filename (hpath:get-external-display-alist))))
((and (stringp filename) (file-directory-p filename))
nil)
- ((and (fboundp 'image-mode)
- (string-match hpath:native-image-suffixes filename))
- nil)
- (t (hpath:find-file-mailcap filename))))
+ ;; 01/21/2019 - RSW commented this next line out since it can
+ ;; trigger external viewers on many file types that Emacs
+ ;; displays natively.
+ ;; (t (hpath:find-file-mailcap filename))
+ ))
(defun hpath:match (filename regexp-alist)
"If FILENAME matches the car of any element in REGEXP-ALIST, return its cdr.
diff --git a/hsettings.el b/hsettings.el
index 1935242..0f4ca10 100644
--- a/hsettings.el
+++ b/hsettings.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 15-Apr-91 at 00:48:49
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -34,7 +34,7 @@
;; The following section applies only to MS-DOS and MS-Windows OSs.
;; Users of other OSs may simply ignore this section.
-;; Some versions of Microcruft OSs don't automatically set the
+;; Some versions of Microsoft OSs don't automatically set the
;; timezone so that Hyperbole can read it. Nor do they include a
;; UNIX-style date program. So follow the commented instructions in
;; the code below here.
@@ -43,7 +43,7 @@
;; timezone properly and you need not do anything. If you receive a
;; timezone error, simply follow the instructions below to set the
;; timezone manually and then reload Hyperbole.
-(if (and hyperb:microcruft-os-p
+(if (and hyperb:microsoft-os-p
(require 'htz)
(not (stringp htz:local)))
(progn
@@ -123,6 +123,19 @@ down a windowful."
(hyperbole-menubar-menu)
(hyperbole-minibuffer-menu))
+(defcustom hyperbole-default-web-search-term-max-lines 2
+ "Provide a default search term using the selected text if the
+active region contains less than or equal to this number of
+lines"
+ :type 'integer
+ :group 'hyperbole-commands)
+
+(defun hyperbole-default-web-search-term ()
+ "Return a default search term if region is active and not too large."
+ (and (region-active-p)
+ (<= (count-lines (region-beginning) (region-end)) hyperbole-default-web-search-term-max-lines)
+ (buffer-substring-no-properties (region-beginning) (region-end))))
+
(defun hyperbole-read-web-search-arguments (&optional service-name search-term)
"Read from the keyboard a list of (web-search-service-string search-term-string) if not given as arguments."
(let ((completion-ignore-case t))
@@ -130,7 +143,8 @@ down a windowful."
(setq service-name (completing-read "Search service: " hyperbole-web-search-alist
nil t)))
(while (or (not (stringp search-term)) (equal search-term ""))
- (setq search-term (read-string (format "Search %s for: " service-name))))
+ (setq search-term (read-string (format "Search %s for: " service-name)
+ (hyperbole-default-web-search-term))))
(list service-name search-term)))
(defun hyperbole-web-search (&optional service-name search-term)
@@ -149,6 +163,24 @@ package to display search results."
search-term)))
(user-error "(Hyperbole): Invalid web search service `%s'" service-name))))
+(defcustom inhibit-hyperbole-messaging t
+ "*Determines whether Hyperbole supports explicit buttons in mail and news buffers.
+The default of t means disable such support (work remains to
+modernize these features). When t, Hyperbole will not alter
+messaging mode hooks nor overload functions from these packages,
+preventing potential incompatibilities.
+
+If you want to use Hyperbole buttons in mail and news buffers, set
+this variable to nil by adding (hyperbole-toggle-messaging 1)
+to your personal Emacs initialization file, prior to loading
+Hyperbole, and then restart Emacs."
+ :type 'boolean
+ :initialize 'custom-initialize-set
+ :set (lambda (symbol value)
+ ;; Invert value to produce ARG for hyperbole-toggle-messaging.
+ (hyperbole-toggle-messaging (if value 0 1)))
+ :group 'hyperbole-buttons)
+
(defcustom hyperbole-web-search-browser-function browse-url-browser-function
"*Function of one url argument called by any Hyperbole Find/Web search."
:type 'boolean
@@ -191,7 +223,7 @@ obtained search string."
;; No-op unless set by one of the conditionals below.
(defun hui:but-flash ())
-(cond ((and (not (featurep 'xemacs)) (not noninteractive))
+(cond ((not noninteractive)
(require 'hui-em-but)
;; Highlight explicit buttons whenever a file is read in.
(add-hook 'find-file-hook #'hproperty:but-create t)
@@ -211,29 +243,6 @@ obtained search string."
;;
;; If you find that the Hyperbole button flash time is too slow
;; or too fast, adjust it here.
- (setq hproperty:but-flash-time 1000))
-
- ((and (featurep 'xemacs) (not noninteractive))
- (require 'hui-xe-but)
- ;;
- ;; Highlight explicit buttons when files are read in.
- (add-hook 'find-file-hook #'hproperty:but-create t)
- (defalias 'hui:but-flash 'hproperty:but-flash)
- ;;
- ;; Substitute for the nil argument below a valid X color name with
- ;; which to highlight buttons if the default highlighting does not
- ;; appeal to you. See "hui-xe-but.el" for how this works.
- (hproperty:cycle-but-color nil)
- ;;
- ;; Non-nil means highlight all explict buttons with `hproperty:but-face'.
- (setq hproperty:but-highlight-flag t)
- ;;
- ;; Non-nil means visually emphasize that button under mouse cursor is
- ;; selectable.
- (setq hproperty:but-emphasize-p nil)
- ;;
- ;; If you find that the Hyperbole button flash time is too slow
- ;; or too fast, adjust it here.
(setq hproperty:but-flash-time 1000)))
;;; ************************************************************************
diff --git a/hsys-org.el b/hsys-org.el
index f9604db..7c916e1 100644
--- a/hsys-org.el
+++ b/hsys-org.el
@@ -4,16 +4,17 @@
;;
;; Orig-Date: 2-Jul-16 at 14:54:14
;;
-;; Copyright (C) 2016 Free Software Foundation, Inc.
+;; Copyright (C) 2016-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
;;; Commentary:
;;
-;; This defines a context-sensitive implicit button type, org-mode, triggered
-;; when the major mode is org-mode and point is anywhere other than
-;; the end of a line.
+;; This defines a context-sensitive implicit button type, org-mode,
+;; triggered when the major mode is org-mode or is derived from
+;; org-mode and point is anywhere other than at the end of a line.
+;;
;; When:
;; on an Org mode link - displays the link referent
;; on an Org mode heading - cycles through the available display
@@ -28,48 +29,262 @@
(require 'hbut)
(require 'org)
+(defvar hsys-org-mode-function #'hsys-org-mode-p
+ "*Boolean function of no arguments that determines whether hsys-org actions are triggered or not.")
+
+(defun hsys-org-mode-p ()
+ "Returns non-nil if an Org-related major or minor mode is active in the current buffer."
+ (or (derived-mode-p 'org-mode)
+ (and (boundp 'outshine-mode) outshine-mode)
+ (and (boundp 'poporg-mode) poporg-mode)))
+
+
+(defun hsys-org-cycle ()
+ "Calls org-cycle and forces it to be set as this-command to cycle through all states."
+ (setq last-command 'org-cycle
+ this-command 'org-cycle)
+ (org-cycle))
+
+(defun hsys-org-global-cycle ()
+ "Calls org-global-cycle and forces it to be set as this-command to cycle through all states."
+ (setq last-command 'org-cycle
+ this-command 'org-cycle)
+ (org-global-cycle nil))
+
;;; ************************************************************************
;;; Public Button Types
;;; ************************************************************************
(defib org-mode ()
- "Follows any Org mode link at point or cycles through views of the outline subtree at point.
-The variable, `browse-url-browser-function', customizes the url browser that
-is used for urls. Valid values of this variable include `browse-url-default-browser'
-and `browse-url-generic'."
- (when (eq major-mode 'org-mode)
- (cond ((org-link-at-p)
- (hact 'org-link nil))
- ((org-at-heading-p)
- (hact 'org-cycle nil))
- (t (hact 'org-meta-return)))))
+ "Follows Org mode references, cycles outline visibility and executes code blocks.
+
+First, this follows internal links in Org mode files. When pressed on a
+link referent/target, the link definition is displayed, allowing two-way
+navigation between definitions and targets.
+
+Second, this follows Org mode external links.
+
+Third, within a radio target definition, this jumps to the first
+occurrence of an associated radio target.
+
+Fourth, when point is on an outline heading in Org mode, this
+cycles the view of the subtree at point.
+
+Fifth, with point on the first line of a code block definition, this
+executes the code block via the Org mode standard binding of {C-c C-c},
+(org-ctrl-c-ctrl-c).
+
+In any other context besides the end of a line, the Action Key invokes the
+Org mode standard binding of {M-RET}, (org-meta-return)."
+ (when (funcall hsys-org-mode-function)
+ (let (start-end)
+ (cond ((setq start-end (hsys-org-internal-link-target-at-p))
+ (hsys-org-set-ibut-label start-end)
+ (hact 'org-internal-link-target))
+ ((hsys-org-radio-target-def-at-p)
+ (hact 'org-radio-target))
+ ((setq start-end (hsys-org-link-at-p))
+ (hsys-org-set-ibut-label start-end)
+ (hact 'org-link))
+ ((org-at-heading-p)
+ (hact 'hsys-org-cycle))
+ ((hsys-org-at-block-start-p)
+ (org-ctrl-c-ctrl-c))
+ (t
+ (hact 'org-meta-return))))))
(defun org-mode:help (&optional _but)
"If on an Org mode heading, cycles through views of the whole buffer outline.
If on an Org mode link, displays standard Hyperbole help."
- (when (eq major-mode 'org-mode)
- (cond ((org-link-at-p)
+ (when (derived-mode-p 'org-mode)
+ (cond ((hsys-org-link-at-p)
(hkey-help current-prefix-arg)
t)
((org-at-heading-p)
- (org-global-cycle nil)
+ (hact 'hsys-org-global-cycle)
t))))
-(defact org-link (link)
- "Follows an Org mode LINK. If LINK is nil, follows the link at point."
+(defact org-link (&optional link)
+ "Follows an optional Org mode LINK to its target.
+If LINK is nil, follows any link at point. Otherwise, triggers an error."
(if (stringp link)
(org-open-link-from-string link) ;; autoloaded
- (org-open-at-point-global))) ;; autoloaded
+ (org-open-at-point))) ;; autoloaded
+
+(defact org-internal-link-target (&optional link-target)
+ "Follows an optional Org mode LINK-TARGET back to its link definition.
+If LINK-TARGET is nil, follows any link target at point. Otherwise, triggers an error."
+ (let (start-end)
+ (cond ((stringp link-target)
+ (setq start-end t)
+ (hsys-org-search-internal-link-p link-target))
+ ((null link-target)
+ (when (setq start-end (hsys-org-internal-link-target-at-p))
+ (hsys-org-search-internal-link-p (buffer-substring-no-properties
+ (car start-end) (cdr start-end))))))
+ (unless start-end
+ (error "(org-internal-link-target): Point must be on a link target (not the link itself)"))))
+
+
+(defact org-radio-target (&optional target)
+ "Jumps to the next occurrence of an optional Org mode radio TARGET link.
+If TARGET is nil and point is on a radio target definition or link, it
+uses that one. Otherwise, triggers an error."
+ (let (start-end)
+ (cond ((stringp target)
+ (setq start-end t)
+ (hsys-org-to-next-radio-target-link target))
+ ((null target)
+ (when (setq start-end (hsys-org-radio-target-at-p))
+ (hsys-org-to-next-radio-target-link (buffer-substring-no-properties
+ (car start-end) (cdr start-end))))))
+ (unless start-end
+ (error "(org-radio-target): Point must be on a radio target definition or link"))))
;;; ************************************************************************
;;; Public functions
;;; ************************************************************************
+(defun hsys-org-region-with-text-property-value (pos property)
+ "Returns (start . end) buffer positions of the region around POS that shares its non-nil text PROPERTY value, else nil."
+ (if (null pos) (setq pos (point)))
+ (let ((property-value (get-text-property pos property))
+ (start-point pos))
+ (when property-value
+ ;; Can't use previous-single-property-change here because it
+ ;; ignores characters that lack the property, i.e. have nil values.
+ (if (bobp)
+ (setq start-point (point-min))
+ (while (equal (get-text-property (1- start-point) property) property-value)
+ (setq start-point (1- start-point))))
+ (cons start-point (next-single-property-change start-point property)))))
+
+(defun hsys-org-at-block-start-p ()
+ "Returns non-nil if point is on the first line of an Org block definition, else nil."
+ (save-excursion
+ (forward-line 0)
+ (or (looking-at org-block-regexp)
+ (looking-at org-dblock-start-re))))
+
+(defun hsys-org-link-at-p ()
+ "Returns non-nil iff point is on an Org mode link.
+Assumes caller has already checked that the current buffer is in org-mode."
+ (or (org-in-regexp org-any-link-re)
+ (hsys-org-face-at-p 'org-link)))
+
;; Assumes caller has already checked that the current buffer is in org-mode.
-(defun org-link-at-p ()
+(defun hsys-org-target-at-p ()
+ "Returns non-nil iff point is on an Org mode radio target (definition) or link target (referent).
+Assumes caller has already checked that the current buffer is in org-mode."
+ (hsys-org-face-at-p 'org-target))
+
+(defun hsys-org-radio-target-link-at-p ()
+ "Returns (target-start . target-end) positions iff point is on an Org mode radio target link (referent), else nil."
+ (and (get-text-property (point) 'org-linked-text)
+ (hsys-org-link-at-p)
+ (hsys-org-region-with-text-property-value (point) 'org-linked-text)))
+
+(defun hsys-org-radio-target-def-at-p ()
+ "Returns (target-start . target-end) positions iff point is on an Org mode radio target (definition), including any delimiter characters, else nil."
+ (when (hsys-org-target-at-p)
+ (save-excursion
+ (if (not (looking-at "<<<"))
+ (goto-char (or (previous-single-property-change (point) 'face) (point-min))))
+ (if (looking-at "<<<")
+ (goto-char (match-end 0)))
+ (and (get-text-property (point) 'org-linked-text)
+ (hsys-org-region-with-text-property-value (point) 'face)))))
+
+(defun hsys-org-radio-target-at-p ()
+ "Returns (target-start . target-end) positions iff point is on an Org mode <<<radio target definition>>> or radio target link (referent), including any delimiter characters, else nil."
+ (or (hsys-org-radio-target-def-at-p)
+ (hsys-org-radio-target-link-at-p)))
+
+(defun hsys-org-internal-link-target-at-p ()
+ "Returns (target-start . target-end) positions iff point is on an Org mode <<link target>>, including any delimiter characters, else nil."
+ (when (hsys-org-target-at-p)
+ (save-excursion
+ (if (not (looking-at "<<"))
+ (goto-char (or (previous-single-property-change (point) 'face) (point-min))))
+ (if (looking-at "<<<?")
+ (goto-char (match-end 0)))
+ (and (not (get-text-property (point) 'org-linked-text))
+ (hsys-org-region-with-text-property-value (point) 'face)))))
+
+(defun hsys-org-face-at-p (org-face-type)
+ "Returns `org-face-type` iff point is on a character with face `org-face-type', a symbol, else nil."
(let ((face-prop (get-text-property (point) 'face)))
- (or (eq face-prop 'org-link)
- (and (listp face-prop) (memq 'org-link face-prop)))))
+ (when (or (eq face-prop org-face-type)
+ (and (listp face-prop) (memq org-face-type face-prop)))
+ org-face-type)))
+
+(defun hsys-org-search-internal-link-p (target)
+ "Searches from buffer start for an Org internal link definition matching TARGET.
+White spaces are insignificant. Returns t if a link is found, else nil."
+ (if (string-match "<<.+>>" target)
+ (setq target (substring target 2 -2)))
+ (let ((re (format "%s"
+ (mapconcat #'regexp-quote
+ (split-string target)
+ "[ \t]+\\(?:\n[ \t]*\\)?")))
+ (origin (point)))
+ (goto-char (point-min))
+ (catch :link-match
+ (while (re-search-forward re nil t)
+ (backward-char)
+ (let ((object (org-element-context)))
+ (when (eq (org-element-type object) 'link)
+ (org-show-context 'link-search)
+ (throw :link-match t))))
+ (goto-char origin)
+ nil)))
+
+(defun hsys-org-search-radio-target-link-p (target)
+ "Searches from point for a radio target link matching TARGET.
+White spaces are insignificant. Returns t if a target link is found, else nil."
+ (if (string-match "<<<.+>>>" target)
+ (setq target (substring target 3 -3)))
+ (let ((re (format "%s"
+ (mapconcat #'regexp-quote
+ (split-string target)
+ "[ \t]+\\(?:\n[ \t]*\\)?")))
+ (origin (point)))
+ (catch :radio-match
+ (while (re-search-forward re nil t)
+ (backward-char)
+ (let ((object (org-element-context)))
+ (when (eq (org-element-type object) 'link)
+ (org-show-context 'link-search)
+ (throw :radio-match t))))
+ (goto-char origin)
+ nil)))
+
+(defun hsys-org-set-ibut-label (start-end)
+ "Record the label and START-END positions of any implicit button at point."
+ (when (consp start-end)
+ (ibut:label-set (ibut:key-to-label
+ (ibut:label-to-key
+ (buffer-substring-no-properties (car start-end) (cdr start-end))))
+ (car start-end) (cdr start-end))))
+
+
+(defun hsys-org-to-next-radio-target-link (target)
+ "Moves to the start of the next radio TARGET link if found. TARGET must be a string."
+ (if (string-match "<<<.+>>>" target)
+ (setq target (substring target 3 -3)))
+ (let ((opoint (point))
+ (start-end (hsys-org-radio-target-at-p))
+ found)
+ (if start-end
+ ;; Move past any current target link
+ (goto-char (cdr start-end)))
+ (while (and (hsys-org-search-radio-target-link-p target)
+ (setq found t)
+ (not (hsys-org-radio-target-link-at-p))))
+ (when found
+ (if (hsys-org-radio-target-link-at-p)
+ (goto-char (or (previous-single-property-change (point) 'face) (point-min)))
+ (goto-char opoint)))))
;;; ************************************************************************
;;; Private functions
diff --git a/hsys-www.el b/hsys-www.el
index c46b138..663a7c1 100644
--- a/hsys-www.el
+++ b/hsys-www.el
@@ -1,4 +1,4 @@
-;;; hsys-www.el --- GNU Hyperbole support for Emacs World-Wide Web (WWW) browsing
+;;; hsys-www.el --- GNU Hyperbole support for Emacs World-Wide Web (WWW) browsing
;;
;; Author: Bob Weiner
;;
diff --git a/htz.el b/htz.el
index f467077..6ff6713 100644
--- a/htz.el
+++ b/htz.el
@@ -1,4 +1,4 @@
-;;; htz.el --- Timezone-based time and date support for GNU Hyperbole
+;;; htz.el --- Timezone-based time and date support for GNU Hyperbole
;;
;; Author: Masanobu Umeda / Bob Weiner
;;
@@ -61,8 +61,8 @@ Optional 2nd argument TIMEZONE specifies a timezone to be represented in."
(defun htz:date-parse (date &optional parsed-current-date)
"Parse DATE string and return a vector [year month day time timezone].
-19 is prepended to year if necessary. Timezone in DATE is optional, it
-defaults to the value of `htz:local'.
+If a two-digit year, the first two digits of the current year are prepended.
+Timezone in DATE is optional, it defaults to the value of `htz:local'.
Recognizes the following styles:
(1) \"(1 30 1999)\" or \"(1 30 1999)\" `calendar-julian-date' requires `parsed-current-date' arg
@@ -73,11 +73,8 @@ Recognizes the following styles:
(6) \"Mar 29 14:00\" `ls -l date' requires `parsed-current-date' arg
(7) \"Mar 7 1994\" `ls -l date' requires `parsed-current-date' arg"
(let ((date (or date ""))
- (year nil)
- (month nil)
- (day nil)
- (time nil)
- (zone nil)) ; This may be nil.
+ year month day time
+ zone) ; This may be nil.
(if (listp date)
(setq month (nth 0 date)
day (nth 1 date)
@@ -87,31 +84,34 @@ Recognizes the following styles:
;; Style (1)
(setq year 3 month 1 day 2 time nil zone nil))
((string-match
- "\\([0-9][0-9][0-9][0-9]\\)\\([0-1][0-9]\\)\\([0-3][0-9]\\):?\\([0-2][0-9]:[0-5][0-9:]+\\)[ ]*\\'" date)
- ;; Style (4)
+ ;; Allow for 3 digits in hour to handle prior error in
+ ;; generating hours fixed on 2019-06-10; 3rd digit
+ ;; removed in htz:time-make-string and htz:time-parse.
+ "\\([0-9][0-9][0-9][0-9]\\)\\([0-1][0-9]\\)\\([0-3][0-9]\\):?\\([0-9][0-9][0-9]?:[0-5][0-9:]+\\)[ ]*\\'" date)
+ ;; Style (5)
(setq year 1 month 2 day 3 time 4 zone nil))
((string-match
"\\([0-9]+\\) \\([^ ,]+\\) \\([0-9]+\\) \\([0-9]+:[0-9:]+\\)[ ]*\\'" date)
- ;; Styles: (1) and (2) without timezone
+ ;; Styles: (2) and (3) without timezone
(setq year 3 month 2 day 1 time 4 zone nil))
((string-match
"\\([0-9]+\\) \\([^ ,]+\\) \\([0-9]+\\) \\([0-9]+:[0-9:]+\\)[ ]*\\([-+a-zA-Z0-9]+\\)" date)
- ;; Styles: (1) and (2) with timezone and buggy timezone
+ ;; Styles: (2) and (3) with timezone and buggy timezone
(setq year 3 month 2 day 1 time 4 zone 5))
((string-match
- "\\([^ ,]+\\) +\\([0-9]+\\) \\([0-9]+:[0-9:]+\\) \\([0-9]+\\)" date)
- ;; Styles: (3) without timezone
- (setq year 4 month 1 day 2 time 3 zone nil))
+ "\\([^ ,]+\\) +\\([0-9]+\\) \\([0-9]+:[0-9:]+\\(:[0-9]+\\)?\\) \\([0-9]+\\)" date)
+ ;; Styles: (4) without timezone
+ (setq year 5 month 1 day 2 time 3 zone nil))
((string-match
- "\\([^ ,]+\\) +\\([0-9]+\\) \\([0-9]+:[0-9:]+\\) \\([-+a-zA-Z0-9]+\\) \\([0-9]+\\)" date)
- ;; Styles: (3) with timezone
- (setq year 5 month 1 day 2 time 3 zone 4))
+ "\\([^ ,]+\\) +\\([0-9]+\\) \\([0-9]+:[0-9:]+\\(:[0-9]+\\)?\\) \\([-+a-zA-Z0-9]+\\) \\([0-9]+\\)" date)
+ ;; Styles: (4) with timezone
+ (setq year 6 month 1 day 2 time 3 zone 5))
((string-match "^\\([^ ,]+\\) +\\([0-9]+\\) +\\([0-9]+:[0-9:]+\\)$" date)
- ;; Style: (5)
+ ;; Style: (6)
(setq year nil month 1 day 2 time 3 zone nil))
((string-match
"^\\([^ ,]+\\) +\\([0-9]+\\) +\\([0-9][0-9][0-9][0-9]\\)$" date)
- ;; Style: (6)
+ ;; Style: (7)
(setq year 3 month 1 day 2 time nil zone nil))
(t (error "(htz:date-parse): Invalid date format: `%s'" date)))
(if year
@@ -249,7 +249,10 @@ See `htz:date-parse' for a list of acceptable date formats."
;; Return [hour minute second]
(vector
(if hour
- (substring time (match-beginning hour) (match-end hour)) "0")
+ ;; Remove possible 3rd digit in hour to handle prior error in
+ ;; generating hours fixed on 2019-06-10; 3rd digit
+ ;; removed in htz:time-make-string and here.
+ (format "%02.2s" (substring time (match-beginning hour) (match-end hour))) "0")
(if minute
(substring time (match-beginning minute) (match-end minute)) "0")
(if second
@@ -322,7 +325,7 @@ Optional argument TIMEZONE specifies a time zone."
;; Partly copied from Calendar program by Edward M. Reingold.
(defun htz:time-make-string (hour minute second)
"Make time string from HOUR, MINUTE, and SECOND."
- (format "%02d:%02d:%02d" hour minute second))
+ (format "%02.2d:%02.2d:%02.2d" hour minute second))
(defun htz:zone-to-hour (timezone)
"Translate TIMEZONE (in zone name or integer) to integer hour."
diff --git a/hui-em-but.el b/hui-em-but.el
index 8d463d9..9292230 100644
--- a/hui-em-but.el
+++ b/hui-em-but.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 21-Aug-92
;;
-;; Copyright (C) 1992-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1992-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -16,7 +16,7 @@
;;; Code:
-(when (or (featurep 'xemacs) noninteractive)
+(when noninteractive
;; FIXME: Loading a file should always be harmless!
(error "(hui-em-but.el): Load only when running GNU Emacs interactively"))
@@ -125,7 +125,7 @@ expression which matches an entire button string.
If REGEXP-MATCH is non-nil, only buttons matching this argument are
highlighted."
(when hproperty:but-highlight-flag
- (ebut:map (lambda (lbl start end)
+ (hbut:map (lambda (lbl start end)
(hproperty:but-add start end hproperty:but-face))
start-delim end-delim regexp-match 'include-delims)))
diff --git a/hui-jmenu.el b/hui-jmenu.el
index 981ab85..59b4861 100644
--- a/hui-jmenu.el
+++ b/hui-jmenu.el
@@ -1,4 +1,4 @@
-;;; hui-jmenu.el --- Popup menus for jumping to and managing buffers, frames, and windows
+;;; hui-jmenu.el --- Popup menus for jumping to and managing buffers, frames, and windows
;;
;; Author: Bob Weiner
;;
@@ -141,13 +141,12 @@
;;; ************************************************************************
(defun hui-menu-buffer-mode-name (buffer)
- (let ((mname (cdr (assq 'mode-name (buffer-local-variables buffer)))))
+ (let ((mname (buffer-local-value 'mode-name buffer)))
(if mname
;; Next line needed to ensure mode name is always formatted as
;; a string.
(format-mode-line mname)
- (capitalize (symbol-name
- (cdr (assq 'major-mode (buffer-local-variables buffer))))))))
+ (capitalize (symbol-name (buffer-local-value 'major-mode buffer))))))
(defun hui-menu-frame-name (frame)
"Return the name of FRAME."
diff --git a/hui-menu.el b/hui-menu.el
index a725cde..d8335fb 100644
--- a/hui-menu.el
+++ b/hui-menu.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 28-Oct-94 at 10:59:44
;;
-;; Copyright (C) 1994-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -186,10 +186,7 @@ Return t if cutoff, else nil."
;; setting. Invoking this item should then make it
;; visible.
(hyperb:init-menubar))
- ((cond ((not (featurep 'xemacs))
- (global-key-binding [menu-bar Hyperbole]))
- ((boundp 'current-menubar)
- (car (find-menu-item current-menubar '("Hyperbole")))))
+ ((global-key-binding [menu-bar Hyperbole])
;; Already on the menubar, remove it.
(hui-menu-remove Hyperbole))
(t;; Add it.
@@ -198,10 +195,8 @@ Return t if cutoff, else nil."
:selected
(cond ((boundp 'menubar-configuration)
(memq 'Hyperbole menubar-configuration))
- ((not (featurep 'xemacs))
- (and (global-key-binding [menu-bar Hyperbole]) t))
- ((boundp 'current-menubar)
- (car (find-menu-item current-menubar '("Hyperbole")))))]
+ (t
+ (and (global-key-binding [menu-bar Hyperbole]) t)))]
"----"
["Find-File-Accepts-URLs"
hpath:find-file-urls-mode
@@ -302,7 +297,7 @@ REBUILD-FLAG is non-nil, in which case the menu is rebuilt."
(setq infodock-hyperbole-menu
(delq nil
(list
- (if (featurep 'xemacs) "%_Hyperbole" "Hyperbole")
+ "Hyperbole"
:config 'Hyperbole
hui-menu-about
["Demonstration" (hypb:display-file-with-logo
@@ -363,7 +358,7 @@ REBUILD-FLAG is non-nil, in which case the menu is rebuilt."
))
'("Explicit-Button"
:filter hui-menu-explicit-buttons
- ["Activate" hui:hbut-act t]
+ ["Activate" hui:ebut-act t]
["Create" hui:ebut-create t]
["Delete" hui:ebut-delete t]
["Edit" hui:ebut-modify t]
@@ -413,6 +408,8 @@ REBUILD-FLAG is non-nil, in which case the menu is rebuilt."
["Activate-at-Point" hui:hbut-current-act t]
["Delete-Type" (hui:htype-delete 'ibtypes) t]
["Help" hui:hbut-help t]
+ ["Label" hui:ibut-label-create t]
+ ["Rename" hui:ibut-rename t]
["Types" (hui:htype-help 'ibtypes 'no-sort) t]
)
'("Koutliner"
diff --git a/hui-mini.el b/hui-mini.el
index a2f1054..70b626a 100644
--- a/hui-mini.el
+++ b/hui-mini.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 15-Oct-91 at 20:13:17
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -17,6 +17,7 @@
;;; ************************************************************************
(require 'hypb)
+(require 'hsettings) ;For hyperbole-web-search-alist
(require 'browse-url)
;;; ************************************************************************
@@ -149,13 +150,9 @@ With optional HELP-STRING-FLAG, instead returns the one line help string for the
"Uses CHAR-STR or last input character as minibuffer argument."
(interactive)
(let ((input (or char-str (aref (recent-keys) (1- (length (recent-keys)))))))
- (cond ((not (featurep 'xemacs))
- (and (not (integerp input))
- (eventp input)
- (setq input (event-basic-type input))))
- ((featurep 'xemacs)
- (if (eventp input)
- (setq input (event-to-character input)))))
+ (and (not (integerp input))
+ (eventp input)
+ (setq input (event-basic-type input)))
(if (or (symbolp input)
(and (integerp input) (= input ?\r)))
(setq input (hargs:at-p)))
@@ -202,24 +199,6 @@ With optional HELP-STRING-FLAG, instead returns the one line help string for the
(if (eq owind (minibuffer-window))
(select-window owind)))))
-(defun hui:menu-xemacs (&optional menu menu-list)
- "Returns an XEmacs menu built from a Hyperbole minibuffer menu.
-Optional MENU (a symbol) specifies a specific submenu of optional MENU-LIST.
-a Hyperbole menu list structure. Otherwise, all menus are used.
-MENU defaults to 'hyperbole and MENU-LIST to `hui:menus'. See `hui:menus'
-definition for the format of the menu list structure."
- (mapcar
- (lambda (entry)
- (or (consp entry)
- (error "(hui:menu-xemacs): Invalid menu entry: %s" entry))
- (let ((label (car entry))
- (content (car (cdr entry))))
- (cond ((null content) (hypb:replace-match-string ">$" label "" t))
- ((and (consp content) (eq (car content) 'menu))
- (hui:menu-xemacs (cdr content)))
- (t (vector label content 't)))))
- (cdr (assq (or menu 'hyperbole) (or menu-list hui:menus)))))
-
(defun hui:menu-select (menu-alist &optional doc-flag help-string-flag)
"Prompts user to choose the first character of any item from MENU-ALIST.
Case is not significant. If chosen by direct selection with the Assist Key,
@@ -384,10 +363,6 @@ constructs. If not given, the top-level Hyperbole menu is used."
(define-key hui:menu-mode-map [backtab] #'hui:menu-backward-item) ;; Shift-TAB
(define-key hui:menu-mode-map "\M-\C-i" #'hui:menu-backward-item) ;; M-TAB
;;
- ;; This next binding is necessary since the default button1 binding under
- ;; XEmacs, mouse-track, is broken under XEmacs V19.8.
- (and (featurep 'xemacs) window-system
- (define-key hui:menu-mode-map 'button1 'mouse-set-point))
(let ((i 32))
(while (<= i 126)
(define-key hui:menu-mode-map (char-to-string i) 'hui:menu-enter)
@@ -552,8 +527,8 @@ constructs. If not given, the top-level Hyperbole menu is used."
))
'(ebut .
(("EButton>")
- ("Act" hui:hbut-act
- "Activates button at point or prompts for explicit button.")
+ ("Act" hui:ebut-act
+ "Activates explicit button at point or prompts for explicit button to activate.")
("Create" hui:ebut-create)
("Delete" hui:ebut-delete)
("Edit" hui:ebut-modify "Modifies any desired button attributes.")
@@ -605,6 +580,10 @@ constructs. If not given, the top-level Hyperbole menu is used."
("Help" hui:hbut-help "Reports on button's attributes.")
("Info" (id-info "(hyperbole)Implicit Buttons")
"Displays manual section on implicit buttons.")
+ ("Label" hui:ibut-label-create
+ "Creates an implicit button label preceding an existing implicit button at point, if any.")
+ ("Rename" hui:ibut-rename
+ "Modifies a label preceding an implicit button in the current buffer.")
("Types" (hui:htype-help 'ibtypes 'no-sort)
"Displays documentation for one or all implicit button types.")
))
@@ -635,7 +614,7 @@ constructs. If not given, the top-level Hyperbole menu is used."
))
'(otl
. (("Kotl>")
- ("All" kotl-mode:show-all "Expand all collapsed cells.")
+ ("All" kotl-mode:show-all "Expand all collapsed cells.")
("Blanks" kvspec:toggle-blank-lines
"Toggle blank lines between cells on or off.")
("Create" kfile:find "Create or edit an outline file.")
@@ -659,7 +638,7 @@ constructs. If not given, the top-level Hyperbole menu is used."
(kotl-mode:show-tree (kcell-view:label)))
"Expand tree rooted at point.")
("Top" kotl-mode:top-cells
- "Hide all but top-level cells.")
+ "Hide all but top-level cells.")
("Vspec" kvspec:activate
"Prompt for and activate a view specifiction.")
))
diff --git a/hui-mouse.el b/hui-mouse.el
index c46b732..d3396b2 100644
--- a/hui-mouse.el
+++ b/hui-mouse.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 04-Feb-89
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2018 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -243,10 +243,11 @@ Its default value is #'smart-scroll-down."
;;
;; Python files - ensure this comes before Imenu for more advanced
;; definition lookups
- ((and (or (and (eq major-mode 'python-mode) buffer-file-name)
- (string-match "^Pydoc:\\|\\*?Python" (buffer-name)))
- (smart-python-at-tag-p)) .
- ((smart-python) . (smart-python nil 'next-tag)))
+ ((and (or (and (derived-mode-p 'python-mode) buffer-file-name)
+ (let ((case-fold-search))
+ (string-match "\\`\\([ *]?Pydoc[: ]\\|\\*?Python\\)" (buffer-name))))
+ (setq hkey-value (smart-python-at-tag-p))) .
+ ((smart-python hkey-value) . (smart-python hkey-value 'next-tag)))
;;
;; Imenu listing in GNU Emacs
((smart-imenu-item-at-p)
@@ -271,8 +272,11 @@ Its default value is #'smart-scroll-down."
buffer-file-name (smart-asm-at-tag-p)) .
((smart-asm) . (smart-asm nil 'next-tag)))
;;
- ((and (smart-lisp-mode-p) (smart-lisp-at-tag-p)) .
- ((smart-lisp) . (smart-lisp 'show-doc)))
+ ((or (and (smart-lisp-mode-p) (smart-lisp-at-tag-p))
+ ;; Tightly limit Lisp matches in change-log-mode.
+ (smart-lisp-at-change-log-tag-p)) .
+ ((smart-lisp) . (smart-lisp 'show-doc)))
+ ;;
;;
((and (eq major-mode 'java-mode) buffer-file-name
(or (smart-java-at-tag-p)
@@ -399,7 +403,7 @@ smart keyboard keys.")
(require 'hmouse-key)
;; This next library adds drag actions to `hmouse-alist'.
-(load "hui-window")
+(require 'hui-window)
;;; ************************************************************************
;;; support code
@@ -599,7 +603,7 @@ If key is pressed:
((< (current-column) 5) (calendar-cursor-to-nearest-date)
(scroll-calendar-right-three-months 1))
(t (calendar-cursor-to-nearest-date)
- (view-diary-entries 1))))
+ (diary-view-entries 1))))
(defun smart-calendar-assist ()
"Uses a single assist-key or mouse assist-key to manipulate the scrolling calendar.
@@ -627,12 +631,12 @@ If assist-key is pressed:
;;; ************************************************************************
;; These functions are called from hkey-alist when keyboard Smart Keys
-;; are used but for mouse keys, they are bound to local keys in
+;; are used. For mouse keys, they are bound to local keys in
;; company-mode's minor mode map.
(defun smart-company-to-definition (event)
"Action Key binding for company-mode completions popup to show item definition.
-Use left mouse key or RET key to select a completion and exit."
+Use left mouse key, RET or TAB key to select a completion and exit."
(interactive "e")
(when (mouse-event-p last-command-event)
(company-select-mouse event))
@@ -735,9 +739,13 @@ If assist-key is pressed:
(goto-char (point-max)))
((looking-at "~") (dired-flag-backup-files))
((looking-at "#") (dired-flag-auto-save-files))
- (t (if (fboundp 'dired-flag-file-deletion)
- (dired-flag-file-deletion 1)
- (dired-flag-file-deleted 1)))))
+ (t
+ ;; Prevent any region selection from causing multiple files
+ ;; to be marked for deletion; we want to mark only one.
+ (deactivate-mark t)
+ (if (fboundp 'dired-flag-file-deletion)
+ (dired-flag-file-deletion 1)
+ (dired-flag-file-deleted 1)))))
;;; ************************************************************************
;;; smart-gnus functions
diff --git a/hui-select.el b/hui-select.el
index 596bb25..aa91d8c 100644
--- a/hui-select.el
+++ b/hui-select.el
@@ -1,10 +1,10 @@
-;;; hui-select.el --- Select larger and larger syntax-driven regions in a buffer.
+;;; hui-select.el --- Select larger and larger syntax-driven regions in a buffer.
;;
;; Author: Bob Weiner
;;
;; Orig-Date: 19-Oct-96 at 02:25:27
;;
-;; Copyright (C) 1996-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1996-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -247,14 +247,12 @@ Also, add language-specific syntax setups to aid in thing selection."
(unless (boundp 'hyperbole-loading)
(require 'hyperbole))
(if hkey-init
- (cond ((not (featurep 'xemacs))
- (transient-mark-mode 1)
- (hkey-global-set-key [double-down-mouse-1] nil)
- (hkey-global-set-key [double-mouse-1] 'hui-select-thing-with-mouse)
- (hkey-global-set-key [triple-down-mouse-1] nil)
- (hkey-global-set-key [triple-mouse-1] 'hui-select-thing-with-mouse))
- ((featurep 'xemacs)
- (add-hook 'mouse-track-click-hook #'hui-select-double-click-hook))))
+ (progn
+ (transient-mark-mode 1)
+ (hkey-global-set-key [double-down-mouse-1] nil)
+ (hkey-global-set-key [double-mouse-1] 'hui-select-thing-with-mouse)
+ (hkey-global-set-key [triple-down-mouse-1] nil)
+ (hkey-global-set-key [triple-mouse-1] 'hui-select-thing-with-mouse)))
;;
;; These hooks let you select C++ and Java methods and classes by
;; double-clicking on the first character of a definition or on its
@@ -310,6 +308,19 @@ Also, add language-specific syntax setups to aid in thing selection."
(setq sentence-end "\\([^ \t\n\r>]<\\|>\\(<[^>]*>\\)*\\|[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)\\)[ \t\n]*")
(define-key web-mode-map "\C-c." 'hui-select-goto-matching-tag))))
+(defun hui-select-get-region-boundaries ()
+ "Return the (START . END) boundaries of region for `hui-select-thing'."
+ (or (hui-select-boundaries (point))
+ (when (eq hui-select-previous 'punctuation)
+ (hui-select-word (point)))))
+
+;;;###autoload
+(defun hui-select-get-region ()
+ "Return the region that `hui-select-thing' would select."
+ (let ((region-bounds (hui-select-get-region-boundaries)))
+ (when region-bounds
+ (buffer-substring-no-properties (car region-bounds) (cdr region-bounds)))))
+
;;;###autoload
(defun hui-select-thing ()
"Select a region based on the syntax of the thing at point.
@@ -325,7 +336,7 @@ interactively, the type of selection is displayed in the minibuffer."
;; Reset selection based on the syntax of character at point.
(hui-select-reset)
nil)))
- (let ((region (hui-select-boundaries (point))))
+ (let ((region (hui-select-get-region-boundaries)))
(unless region
(when (eq hui-select-previous 'punctuation)
(setq region (hui-select-word (point)))))
diff --git a/hui-treemacs.el b/hui-treemacs.el
index db1aee6..2cdface 100644
--- a/hui-treemacs.el
+++ b/hui-treemacs.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 19-Nov-17
;;
-;; Copyright (C) 2017 Free Software Foundation, Inc.
+;; Copyright (C) 2017-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -18,14 +18,21 @@
(eval-and-compile (require 'treemacs nil t))
-(eval-when (load)
- (unless (>= (string-to-number treemacs-version) 1.14)
- (error "(hui-treemacs): Hyperbole requires Treemacs package version 1.14 or greater")))
+(unless (and (featurep 'treemacs) (string-greaterp treemacs-version "v2"))
+ (error "(hui-treemacs): Hyperbole requires Treemacs package version 2.0 or greater"))
;;; ************************************************************************
;;; smart-treemacs functions
;;; ************************************************************************
+;; Want to be able to select Treemacs window with ace-window.
+;; This also averts window labeling problems with ace-window.
+(eval-after-load "ace-window"
+ '(setq aw-ignored-buffers (delq 'treemacs-mode aw-ignored-buffers)))
+
+(unless (fboundp 'treemacs-quit)
+ (fset 'treemacs-quit #'bury-buffer))
+
;;;###autoload
(defun smart-treemacs ()
"Uses a single key or mouse key to manipulate directory entries.
@@ -51,10 +58,10 @@ If key is pressed:
(interactive)
(cond ((first-line-p)
(if (eolp)
- (treemacs-toggle)
+ (treemacs-quit)
(hact 'link-to-directory default-directory)))
((and (last-line-p) (eolp))
- (treemacs-toggle))
+ (treemacs-quit))
((eolp)
(funcall (if assist-flag assist-key-eol-function action-key-eol-function)))
(t (let ((over-icon (and (treemacs-current-button)
@@ -65,7 +72,7 @@ If key is pressed:
(hact 'link-to-buffer-tmp (seq-elt result 0) (seq-elt result 1))
;; (bufferp result)
(hact 'link-to-buffer-tmp result))
- (treemacs-push-button current-prefix-arg))))))
+ (treemacs-toggle-node current-prefix-arg))))))
;;;###autoload
(defun smart-treemacs-modeline ()
@@ -77,28 +84,24 @@ quit/hide the Treemacs window. Otherwise, display the Treemacs window
with the default directory of the buffer modeline clicked upon.
Suitable for use as a value of `action-key-modeline-buffer-id-function'."
- (if (fboundp 'treemacs)
- (progn
- (require 'treemacs)
- (cond
- ;; Clicked on Treemacs buffer id
- ((if action-key-depress-window
- (treemacs-is-treemacs-window? action-key-depress-window)
- (string-match " Treemacs " (format-mode-line mode-line-format)))
- ;; Quit/hide treemacs.
- (treemacs-toggle))
- ;;
- ;; Treemacs is visible and displaying the same dir as
- ;; the default dir of the clicked on modeline.
- ((and (treemacs-buffer-exists?)
- (string-equal (expand-file-name default-directory)
- (with-current-buffer (treemacs-buffer-exists?)
- default-directory)))
- ;; Quit/hide treemacs.
- (treemacs-toggle))
- ;;
- ;; Otherwise, invoke treemacs on the default dir of the clicked on modeline.
- (t (treemacs))))
- (error "(smart-treemacs-modeline): Treemacs package is not installed")))
+ (cond
+ ;; Clicked on Treemacs buffer id
+ ((if action-key-depress-window
+ (treemacs-is-treemacs-window? action-key-depress-window)
+ (string-match " Treemacs " (format-mode-line mode-line-format)))
+ ;; Quit/hide treemacs.
+ (treemacs-quit))
+ ;;
+ ;; Treemacs is visible and displaying the same dir as
+ ;; the default dir of the clicked on modeline.
+ ((and (eq (treemacs-current-visibility) 'visible)
+ (string-equal (expand-file-name default-directory)
+ (with-current-buffer (treemacs-get-local-buffer)
+ default-directory)))
+ ;; Quit/hide treemacs.
+ (treemacs-quit))
+ ;;
+ ;; Otherwise, invoke treemacs on the default dir of the clicked on modeline.
+ (t (treemacs))))
(provide 'hui-treemacs)
diff --git a/hui-window.el b/hui-window.el
index c5b64d4..8b5536f 100644
--- a/hui-window.el
+++ b/hui-window.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 21-Sep-92
;;
-;; Copyright (C) 1992-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1992-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -145,10 +145,10 @@ drag release window.")
:group 'hyperbole-keys)
;; Mats Lidell says this should be 10 characters for GNU Emacs.
-(defvar hmouse-edge-sensitivity (if (featurep 'xemacs) 3 10)
+(defvar hmouse-edge-sensitivity 10
"*Number of characters from window edges within which a click is considered at an edge.")
-(defvar hmouse-side-sensitivity (if (featurep 'xemacs) 1 5)
+(defvar hmouse-side-sensitivity 5
"*Characters in either direction from window side within which a click is considered on the side.")
(defvar hmouse-x-drag-sensitivity 5
@@ -171,9 +171,9 @@ drag release window.")
;;;
;;; Add window handling to hmouse-alist dispatch table.
-;;;
-(if (not (boundp 'hmouse-alist))
- (error "\"hui-window.el\": `hmouse-alist' must be defined before loading this.")
+
+(defvar hmouse-alist)
+(defun hmouse-alist-add-window-handlers ()
(unless (assoc #'(hmouse-inactive-minibuffer-p) hmouse-alist)
(setq hmouse-alist
(append
@@ -241,6 +241,7 @@ drag release window.")
;;
)
hmouse-alist))))
+(with-eval-after-load 'hui-mouse (hmouse-alist-add-window-handlers))
;;; ************************************************************************
;;; Public functions
@@ -249,7 +250,7 @@ drag release window.")
(defun hmouse-at-item-p ()
"Return t if point is on an item draggable by Hyperbole, otherwise nil."
(let* ((buf (and (window-live-p action-key-depress-window) (window-buffer action-key-depress-window)))
- (mode (and buf (cdr (assq 'major-mode (buffer-local-variables buf))))))
+ (mode (and buf (buffer-local-value 'major-mode buf))))
(and buf (with-current-buffer buf
;; Point must be on an item, not after one
(not (looking-at "\\s-*$")))
@@ -624,12 +625,7 @@ Value returned is nil if not a vertical line drag, 'up if drag moved up or
(defun hmouse-drag-window-side ()
"Returns non-nil if Action Key was dragged from a window side divider and released in the same window.
If free variable `assist-flag' is non-nil, uses Assist Key."
- (cond ((featurep 'xemacs)
- ;; Depress events in scrollbars or in non-text area of buffer are
- ;; not visible or identifiable at the Lisp-level, so always return
- ;; nil.
- nil)
- ((hyperb:window-system)
+ (cond ((hyperb:window-system)
(let* ((depress-args (if assist-flag assist-key-depress-args
action-key-depress-args))
(release-args (if assist-flag assist-key-release-args
@@ -690,14 +686,10 @@ Beeps and prints message if the window cannot be split further."
(defun smart-coords-in-window-p (coords window)
"Tests if COORDS are in WINDOW. Returns WINDOW if they are, nil otherwise."
(cond ((null coords) nil)
- ((and (not (featurep 'xemacs)) (eventp coords))
+ ((eventp coords)
(let ((w-or-f (posn-window (event-start coords))))
(if (framep w-or-f) (setq w-or-f (frame-selected-window w-or-f)))
(eq w-or-f window)))
- ((if (featurep 'xemacs)
- (if (eventp coords)
- (eq (event-window coords) window)
- (eq (car coords) window))))
((fboundp 'window-edges)
(let* ((edges (window-edges window))
(w-xmin (nth 0 edges))
@@ -715,24 +707,19 @@ Beeps and prints message if the window cannot be split further."
Ignores minibuffer window."
(cond ((markerp coords)
(marker-position coords))
- ((and (not (featurep 'xemacs)) (eventp coords))
- (posn-point (event-start coords)))
- ((and (featurep 'xemacs) (eventp coords))
- (event-point coords))))
+ ((eventp coords)
+ (posn-point (event-start coords)))))
(defun smart-window-of-coords (coords)
"Returns window in which COORDS fall or nil if none.
Ignores minibuffer window."
- (cond ((markerp coords)
+ (cond ((null coords) nil)
+ ((markerp coords)
(get-buffer-window (marker-buffer coords)))
- ((and (not (featurep 'xemacs)) (eventp coords))
+ ((eventp coords)
(let ((w-or-f (posn-window (event-start coords))))
(if (framep w-or-f) (setq w-or-f (frame-selected-window w-or-f)))
w-or-f))
- ((if (featurep 'xemacs)
- (if (eventp coords)
- (event-window coords)
- (car coords))))
(t (let ((window-list (hypb:window-list 'no-minibuf))
(window)
(w))
@@ -1005,23 +992,20 @@ If free variable `assist-flag' is non-nil, uses Assist Key."
(defun hmouse-emacs-at-modeline-buffer-id-p ()
"GNU Emacs: Return t if mouse position is within the buffer name field of the current window's mode-line, else nil."
- (unless (featurep 'xemacs)
- (let* ((coords (hmouse-window-coordinates)) ;; in characters
- (x-coord (caadr coords))
- (mode-line-string (and (integerp x-coord) (>= x-coord 0) (format-mode-line mode-line-format)))
- (keymap (and mode-line-string
- (<= x-coord (1- (length mode-line-string)))
- (plist-get (text-properties-at x-coord mode-line-string) 'local-map))))
- (when keymap
- (eq (lookup-key keymap [mode-line mouse-1]) 'mode-line-previous-buffer)))))
+ (let* ((coords (hmouse-window-coordinates)) ;; in characters
+ (x-coord (caadr coords))
+ (mode-line-string (and (integerp x-coord) (>= x-coord 0) (format-mode-line mode-line-format)))
+ (keymap (and mode-line-string
+ (<= x-coord (1- (length mode-line-string)))
+ (plist-get (text-properties-at x-coord mode-line-string) 'local-map))))
+ (when keymap
+ (eq (lookup-key keymap [mode-line mouse-1]) 'mode-line-previous-buffer))))
(defun hmouse-modeline-resize-window ()
"Resizes window whose mode line was depressed on by the last Smart Key.
Resize amount depends upon the vertical difference between press and release
of the Smart Key."
(cond ((not (hyperb:window-system)) nil)
- ((and (featurep 'xemacs) (not (fboundp 'window-edges)))
- (error "Drag from a mode-line with button1 to resize windows."))
(t (let* ((owind (selected-window))
(window (smart-window-of-coords
(if assist-flag assist-key-depress-args
@@ -1143,12 +1127,7 @@ release must be."
"Resizes window whose side was depressed on by the last Smart Key.
Resize amount depends upon the horizontal difference between press and release
of the Smart Key."
- (cond ((featurep 'xemacs)
- ;; Depress events in scrollbars or in non-text area of buffer are
- ;; not visible or identifiable at the Lisp-level, so always return
- ;; nil.
- nil)
- ((hyperb:window-system)
+ (cond ((hyperb:window-system)
(let* ((owind (selected-window))
(window (smart-window-of-coords
(if assist-flag assist-key-depress-args
@@ -1246,10 +1225,6 @@ of the Smart Key."
(+ (car (posn-col-row args))
(nth 0 (window-edges w-or-f)))))
(t (car args)))))
- ("xemacs" . (if (eventp args)
- (event-x args)
- (car args)))
- ("xterm" . (car args))
("next" . (nth 1 args))
)))))))
(if (integerp x) x)))
@@ -1265,10 +1240,6 @@ of the Smart Key."
(+ (cdr (posn-col-row args))
(nth 1 (window-edges w-or-f)))))
(t (cdr args)))))
- ("xemacs" . (if (eventp args)
- (event-y args)
- (cdr args)))
- ("xterm" . (nth 1 args))
("next" . (nth 2 args))
))))))
(if (integerp y) y)))
diff --git a/hui-xe-but.el b/hui-xe-but.el
deleted file mode 100644
index 4ce0a77..0000000
--- a/hui-xe-but.el
+++ /dev/null
@@ -1,466 +0,0 @@
-;;; hui-xe-but.el --- XEmacs button highlighting and flashing support
-;;
-;; Author: Bob Weiner
-;;
-;; Orig-Date: 21-Aug-92
-;;
-;; Copyright (C) 1992-2017 Free Software Foundation, Inc.
-;; See the "HY-COPY" file for license information.
-;;
-;; This file is part of GNU Hyperbole.
-
-;;; Commentary:
-;;
-;; Can't use read-only buttons here because then outline-mode
-;; becomes unusable.
-;;
-
-;;; Code:
-
-(unless (featurep 'xemacs)
- (error "(hui-xe-but.el): Load only when running XEmacs."))
-
-;;; ************************************************************************
-;;; Other required Elisp libraries
-;;; ************************************************************************
-
-(require 'custom) ;; For defface.
-(require 'hbut)
-
-(defun hproperty:background ()
- "Returns default background color for selected frame."
- (face-background (get-face 'default)))
-
-(defun hproperty:foreground ()
- "Returns default foreground color for selected frame."
- (face-foreground (get-face 'default)))
-
-;;; ************************************************************************
-;;; Public variables
-;;; ************************************************************************
-
-(defcustom hproperty:but-highlight-flag t
- "*Non-nil (default value) means highlight all explict buttons with `hproperty:but-face'."
- :type 'boolean
- :group 'hyperbole-buttons)
-
-(defcustom hproperty:but-emphasize-flag nil
- "*Non-nil means visually emphasize that button under mouse cursor is selectable."
- :type 'boolean
- :group 'hyperbole-buttons)
-
-(defcustom hproperty:but-flash-time 1000
- "*Machine specific value for empty loop counter, Emacs button flash delay."
- :type '(integer :match (lambda (_widget value) (and (integerp value) (> value 0))))
- :group 'hyperbole-buttons)
-
-(defcustom hproperty:item-highlight-color (hproperty:foreground)
- "Color with which to highlight list/menu selections.
-Call (hproperty:set-item-highlight <color>) to change value."
- :type 'color
- :initialize (lambda (_symbol _value) (hproperty:foreground))
- :group 'hyperbole-buttons)
-
-;;; ************************************************************************
-;;; Public functions
-;;; ************************************************************************
-
-(defun hproperty:but-add (start end face)
- "Add between START and END a button using FACE in current buffer.
-If `hproperty:but-emphasize-flag' is non-nil when this is called, emphasize
-that button is selectable whenever the mouse cursor moves over it."
- (let ((but (make-extent start end)))
- (set-extent-face but face)
- (set-extent-property but 'highlight hproperty:but-emphasize-flag)))
-
-(defun hproperty:but-color ()
- "Return current color of buffer's buttons."
- (if hproperty:color-ptr
- (car hproperty:color-ptr)
- (hproperty:foreground)))
-
-(defun hproperty:but-clear ()
- "Delete all Hyperbole buttons from current buffer."
- (interactive)
- (map-extents (lambda (extent unused-arg)
- (if (eq (extent-face extent) 'hbut)
- (delete-extent extent)))))
-
-(defun hproperty:but-create (&optional start-delim end-delim regexp-match)
- "Highlight all hyper-buttons in buffer using XEmacs extents.
-Will use optional strings START-DELIM and END-DELIM instead of default values.
-If END-DELIM is a symbol, e.g. t, then START-DELIM is taken as a regular
-expression which matches an entire button string.
-If REGEXP-MATCH is non-nil, only buttons matching this argument are
-highlighted.
-
-If `hproperty:but-emphasize-flag' is non-nil when this is called, emphasize
-that button is selectable whenever the mouse cursor moves over it."
- (interactive)
- (hproperty:but-clear)
- (hproperty:but-create-all start-delim end-delim regexp-match))
-
-(defun hproperty:but-create-all (&optional start-delim end-delim regexp-match)
- "Mark all hyper-buttons in buffer as XEmacs buttons, for later highlighting.
-Will use optional strings START-DELIM and END-DELIM instead of default values.
-If END-DELIM is a symbol, e.g. t, then START-DELIM is taken as a regular
-expression which matches an entire button string.
-If REGEXP-MATCH is non-nil, only buttons matching this argument are
-highlighted."
- (when hproperty:but-highlight-flag
- (ebut:map (lambda (lbl start end)
- (hproperty:but-add start end hproperty:but-face))
- start-delim end-delim regexp-match 'include-delims)))
-
-(defun hproperty:but-create-on-yank (prop-value start end)
- (save-restriction
- (narrow-to-region start end)
- (hproperty:but-create-all)))
-
-(add-to-list 'yank-handled-properties '(hproperty:but-face . hproperty:but-create-on-yank))
-
-(defun hproperty:but-delete (&optional pos)
- (let ((extent (extent-at (or pos (point)))))
- (if extent (delete-extent extent))))
-
-;;; ************************************************************************
-;;; Private functions
-;;; ************************************************************************
-
-(defsubst hproperty:list-cycle (list-ptr list)
- "Move LIST-PTR to next element in LIST or when at end to first element."
- (or (and list-ptr (setq list-ptr (cdr list-ptr)))
- (setq list-ptr list)))
-
-;;; ************************************************************************
-;;; Private variables
-;;; ************************************************************************
-
-(defconst hproperty:color-list
- '("red" "blue" "paleturquoise4" "mediumpurple2"
- "lightskyblue3" "springgreen2" "salmon" "yellowgreen" "darkorchid2"
- "aquamarine4" "slateblue4" "slateblue1" "olivedrab1" "goldenrod4"
- "goldenrod3" "cadetblue2" "burlywood1" "slategrey" "mistyrose"
- "limegreen" "lightcyan" "goldenrod" "gainsboro" "skyblue1" "honeydew"
- "yellow2" "tomato3" "skyblue" "purple4" "orange3" "bisque3" "bisque2"
- "grey34" "gray99" "gray63" "gray44" "gray37" "gray33" "gray26" "azure1"
- "snow4" "peru" "red" "lightgoldenrod4" "mediumseagreen" "blush"
- "mediumorchid2" "lightskyblue1" "darkslateblue" "midnightblue"
- "lightsalmon1" "lemonchiffon" "yellow" "lightsalmon" "coral"
- "dodgerblue3" "darkorange4" "blue" "royalblue4" "red" "green" "cyan"
- "darkviolet" "darksalmon" "darkorange" "blue" "pink" "magenta2"
- "sienna4" "khaki2" "grey75" "grey74" "grey73" "grey69" "grey68" "grey35"
- "grey13" "gray90" "gray81" "gray55" "gray51" "gray31" "snow2" "pink3"
- "grey7" "gray1" "red4" "red3" "tan" "red" "yellow" "mediumvioletred"
- "lightslategrey" "lavenderblush4" "turquoise" "darkturquoise"
- "darkslategrey" "lightskyblue" "lightsalmon4" "lightsalmon3"
- "forestgreen" "dodgerblue4" "orchid" "rosybrown4" "brown" "peachpuff3"
- "palegreen3" "orangered2" "rose" "lightcyan4" "indianred4" "indianred3"
- "seagreen2" "indianred" "deeppink1" "navyblue" "lavender" "grey"
- "deeppink" "salmon4" "salmon3" "oldlace" "grey78" "grey77" "grey54"
- "grey45" "grey21" "gray97" "gray96" "gray95" "gray88" "gray87" "gray86"
- "gray70" "gray57" "gray38" "gray12" "gray11" "plum3" "linen" "gray9"
- "gray8" "blue4" "beige" "turquoise" "blue" "lemonchiffon4"
- "darkseagreen1" "antiquewhite3" "mediumorchid" "springgreen"
- "turquoise4" "steelblue3" "mistyrose2" "lightcyan2" "red" "firebrick2"
- "royalblue" "cadetblue" "skyblue3" "yellow3" "salmon1" "orange4"
- "hotpink" "grey90" "gray56" "gray39" "gray18" "gray14" "plum4" "grey6"
- "gray6" "gold3" "gold1" "blue2" "tan2" "cyan" "mediumspringgreen"
- "darkolivegreen2" "goldenrod" "lightsteelblue" "brown" "whip"
- "chartreuse3" "violetred4" "royalblue2" "royalblue1" "papayawhip"
- "mistyrose3" "lightcyan1" "aquamarine" "skyblue4" "hotpink4" "hotpink3"
- "hotpink2" "dimgray" "tomato" "grey66" "grey65" "grey64" "grey33"
- "grey27" "gray76" "gray69" "gray68" "grey0" "azure" "green"
- "darkgoldenrod4" "darkgoldenrod3" "darkgoldenrod2" "darkgoldenrod"
- "brown" "lightsalmon2" "deepskyblue4" "deepskyblue3" "deepskyblue2"
- "deepskyblue" "darkorange1" "violetred3" "violetred2" "violetred1"
- "slateblue3" "slateblue2" "drab" "indianred1" "firebrick1" "cadetblue4"
- "violetred" "rosybrown" "blue" "firebrick" "grey100" "wheat4" "grey79"
- "grey76" "grey61" "gray93" "gray84" "gray65" "gray36" "gray32" "gray13"
- "gray10" "azure3" "snow1" "tan1" "gray" "darkolivegreen1" "blue"
- "almond" "lavenderblush3" "lavenderblush2" "lavenderblush1"
- "darkolivegreen" "lavenderblush" "aquamarine2" "red" "olivedrab2"
- "mistyrose4" "mistyrose1" "lightcyan3" "lightcoral" "chartreuse"
- "peachpuff" "palegreen" "mintcream" "skyblue2" "moccasin" "tomato1"
- "orchid3" "maroon3" "salmon" "grey81" "grey62" "grey39" "grey38"
- "grey37" "gray92" "gray83" "gray66" "gray54" "gray50" "gray30" "gray19"
- "gray15" "azure4" "grey3" "tan3" "pink" "gray" "blue" "lightsteelblue2"
- "lightsteelblue1" "green" "lightslategray" "lemonchiffon2"
- "springgreen1" "greenyellow" "chartreuse2" "grey" "royalblue3"
- "powderblue" "peachpuff2" "palegreen2" "cream" "slateblue" "seashell2"
- "deeppink2" "darkkhaki" "maroon4" "sienna" "grey71" "grey67" "grey18"
- "gray59" "gray43" "gray25" "bisque" "red1" "mediumslateblue"
- "lightgoldenrod1" "goldenrod" "paleturquoise3" "lightskyblue4" "green"
- "yellow" "smoke" "blue" "white" "steelblue4" "rosybrown3" "peachpuff1"
- "palegreen1" "blueviolet" "seashell4" "sienna3" "grey40" "gray91"
- "gray82" "gray5" "cyan2" "cyan1" "blue1" "snow" "lightgoldenrod2"
- "lightslateblue" "mediumorchid3" "darkseagreen4" "springgreen3" "green"
- "slategray4" "slategray3" "slategray2" "blue" "peachpuff4" "palegreen4"
- "green" "orangered3" "goldenrod1" "ghostwhite" "firebrick4" "firebrick3"
- "cadetblue3" "slategray" "seashell3" "honeydew3" "cornsilk4" "cornsilk2"
- "purple1" "dimgrey" "khaki1" "ivory3" "grey70" "grey60" "grey32"
- "grey22" "grey12" "gray98" "gray89" "gray71" "gray64" "gray60" "gray49"
- "azure2" "gray3" "paleturquoise1" "mediumpurple1" "purple"
- "lemonchiffon1" "blue" "navajowhite3" "darkorchid1" "orange"
- "goldenrod2" "khaki" "chocolate2" "burlywood2" "honeydew1" "darkgreen"
- "thistle3" "thistle2" "thistle1" "thistle" "maroon2" "maroon1" "grey53"
- "grey44" "grey25" "gray74" "gray45" "gray41" "gray35" "gray27" "gray23"
- "gray16" "brown4" "wheat" "coral" "tan4" "lightgoldenrodyellow" "blue"
- "green" "gray" "palevioletred3" "mediumpurple4" "mediumpurple3"
- "saddlebrown" "blue" "darkorchid4" "darkorchid3" "puff" "olivedrab4"
- "lightblue4" "lightpink" "lightgray" "honeydew2" "cornsilk1" "lace"
- "sienna1" "bisque4" "orchid" "khaki3" "grey84" "grey83" "grey82"
- "grey72" "grey52" "grey43" "grey26" "grey14" "grey10" "gray75" "gray53"
- "gray21" "gray20" "brown3" "grey8" "red2" "navy" "grey" "gold"
- "mediumaquamarine" "lightgoldenrod" "darkslategray4" "darkseagreen3"
- "darkseagreen2" "antiquewhite4" "white" "springgreen4" "lightyellow4"
- "white" "aquamarine1" "turquoise3" "steelblue2" "rosybrown2" "pink"
- "gray" "indianred2" "dodgerblue" "green" "seagreen1" "deeppink4"
- "aliceblue" "magenta1" "pink" "sienna2" "orchid1" "gray100" "grey97"
- "grey94" "grey87" "grey86" "grey51" "grey42" "grey19" "gray94" "gray85"
- "gray61" "brown2" "khaki" "grey1" "gold4" "blue" "green" "grey"
- "turquoise" "paleturquoise" "mediumorchid4" "antiquewhite2"
- "lightyellow2" "violet" "salmon" "chartreuse1" "turquoise1" "sandybrown"
- "orangered1" "lightpink1" "lightblue2" "lightblue1" "grey" "seagreen4"
- "seagreen3" "lightblue" "deeppink3" "burlywood" "seashell" "hotpink1"
- "gray" "yellow4" "yellow" "purple" "orange" "ivory4" "grey99" "grey89"
- "grey63" "grey58" "grey49" "grey31" "grey24" "grey20" "green4" "green1"
- "gray73" "gray67" "coral3" "coral2" "plum2" "pink4" "ivory" "gray4"
- "gray2" "gold2" "aquamarine" "grey" "lightgoldenrod3" "darkolivegreen3"
- "darkgoldenrod1" "goldenrod" "orchid" "chiffon" "navajowhite4"
- "deepskyblue1" "lightyellow" "floralwhite" "blue" "mediumblue"
- "chocolate4" "chocolate3" "burlywood4" "turquoise" "steelblue" "green"
- "lawngreen" "honeydew4" "seagreen" "orchid4" "wheat1" "violet" "ivory1"
- "grey88" "grey85" "grey57" "grey56" "grey55" "grey48" "grey47" "grey46"
- "grey30" "grey17" "gray47" "gray29" "pink2" "grey5" "grey4" "green"
- "gray0" "brown" "lightsteelblue4" "darkolivegreen4" "palevioletred4"
- "blue" "darkslategray3" "darkslategray2" "darkslategray1"
- "blanchedalmond" "palegoldenrod" "blue" "lightseagreen" "lemonchiffon3"
- "darkslategray" "green" "darkseagreen" "antiquewhite" "darkorange2"
- "chartreuse4" "blue" "rosybrown1" "olivedrab3" "lightpink2" "orangered"
- "thistle4" "blue" "cornsilk" "salmon2" "orchid2" "ivory2" "grey93"
- "grey92" "grey91" "grey36" "grey29" "grey28" "grey16" "gray79" "gray78"
- "gray77" "gray48" "gray17" "coral4" "coral1" "plum1" "pink1" "grey9"
- "grey2" "gray7" "cyan4" "blue3" "plum" "cornflowerblue" "lightskyblue2"
- "antiquewhite1" "navajowhite2" "navajowhite1" "lightyellow3"
- "navajowhite" "darkorange3" "whitesmoke" "turquoise2" "steelblue1"
- "lightpink4" "lightblue3" "green" "chocolate1" "blue" "olivedrab"
- "lightgrey" "chocolate" "magenta4" "magenta3" "yellow1" "purple3"
- "purple2" "orange2" "orange1" "magenta" "bisque1" "wheat2" "maroon"
- "khaki4" "grey96" "grey95" "grey80" "grey50" "grey41" "grey15" "grey11"
- "gray80" "gray58" "gray40" "gray34" "gray22" "brown1" "snow3"
- "mediumturquoise" "lightsteelblue3" "palevioletred2" "palevioletred1"
- "paleturquoise2" "green" "palevioletred" "mediumorchid1" "white"
- "mediumpurple" "lightyellow1" "dodgerblue2" "dodgerblue1" "violet"
- "aquamarine3" "slategray1" "gray" "orangered4" "lightpink3" "blue"
- "darkorchid" "cadetblue1" "burlywood3" "seashell1" "cornsilk3" "tomato4"
- "tomato2" "wheat3" "grey98" "grey59" "grey23" "green3" "green2" "gray72"
- "gray62" "gray52" "gray46" "gray42" "gray28" "gray24" "white" "cyan3"
- "black"))
-
-(defvar hproperty:color-ptr nil
- "Pointer to current color name table to use for Hyperbole buttons in XEmacs.")
-
-(defconst hproperty:good-colors
- '(
- "medium violet red" "indianred4" "firebrick1" "DarkGoldenrod" "NavyBlue"
- "darkorchid" "tomato3" "mediumseagreen" "deeppink" "forestgreen"
- "mistyrose4" "slategrey" "purple4" "dodgerblue3" "mediumvioletred"
- "lightsalmon3" "orangered2" "turquoise4" "Gray55"
- )
- "Good colors for contrast against wheat background and black foreground.")
-
-
-;;; ************************************************************************
-;;; Public functions
-;;; ************************************************************************
-
-(defun hproperty:cycle-but-color (&optional color)
- "Switches button color to optional COLOR name or next item referenced by hproperty:color-ptr."
- (interactive "sHyperbole button color: ")
- (if (not (or (and (fboundp 'device-class) (eq (device-class) 'color))
- (x-display-color-p)))
- nil
- (if color (setq hproperty:color-ptr nil))
- (set-face-foreground
- hproperty:but-face
- (or color (car (hproperty:list-cycle
- hproperty:color-ptr hproperty:good-colors))))
- (hproperty:set-flash-color)
- (sit-for 0) ;; Force display update
- t))
-
-(defun hproperty:set-flash-color ()
- "Set button flashing colors based upon current color set."
- (if (not (x-display-color-p))
- nil
- (set-face-background hproperty:flash-face (hproperty:but-color))
- (set-face-foreground hproperty:flash-face (hproperty:background))))
-
-(defun hproperty:but-flash ()
- "Flash a XEmacs Hyperbole button at or near point to indicate selection."
- (interactive)
- (let ((ibut) (prev)
- (start (hattr:get 'hbut:current 'lbl-start))
- (end (hattr:get 'hbut:current 'lbl-end))
- (b) (a))
- (if (and start end (setq prev (extent-at start)
- ibut t))
- (progn (if (not prev) (hproperty:but-add start end hproperty:but-face))
- (setq b (and start (extent-at start))))
- (setq b (extent-at (point))))
- (if (setq a (and (extentp b) (extent-face b)))
- (unwind-protect
- (progn
- (set-extent-face b hproperty:flash-face)
- (sit-for 0);; Force display update
- ;; Delay before redraw button
- (let ((i 0)) (while (< i hproperty:but-flash-time) (setq i (1+ i)))))
- (set-extent-face b a)
- (sit-for 0))) ;; Force display update
- (if (and ibut (not prev)) (hproperty:but-delete start))))
-
-(defun hproperty:set-item-highlight (&optional background foreground)
- "Setup or reset item highlight face using optional BACKGROUND and FOREGROUND."
- (make-local-variable 'hproperty:item-face)
- (if background (setq hproperty:item-highlight-color background))
- (if (not hproperty:highlight-face)
- (progn
- (setq hproperty:highlight-face
- (or (find-face 'hproperty:highlight-face)
- (face-name
- (defface hproperty:highlight-face nil
- "Item highlighting face. Use (hproperty:set-item-highlight) to set."))))
- (set-face-foreground hproperty:highlight-face
- (or foreground (hproperty:background)))
- (set-face-underline-p hproperty:highlight-face nil)))
-
- (let* ((tty (and (fboundp 'device-type)
- (eq 'tty (device-type (selected-device)))))
- (specifiers-function
- (if (fboundp 'specifier-specs) 'specifier-specs 'identity))
- (color-function
- (if (fboundp 'color-name) 'color-name 'identity))
- (update-hyrolo-highlight-flag
- (and (boundp 'hyrolo-highlight-face) (find-face hyrolo-highlight-face)
- (or (null
- (funcall specifiers-function
- (face-foreground hyrolo-highlight-face)))
- (equal
- (funcall color-function
- (face-foreground hyrolo-highlight-face))
- (funcall color-function (face-foreground 'default)))
- (face-equal hproperty:highlight-face hyrolo-highlight-face)))))
- (if tty
- (copy-face 'italic 'hproperty:highlight-face)
- (if (and (funcall specifiers-function
- (face-background hproperty:highlight-face))
- (equal (funcall color-function
- (face-background hproperty:highlight-face))
- hproperty:item-highlight-color))
- nil
- (set-face-background hproperty:highlight-face
- hproperty:item-highlight-color))
- (and background (not (equal (face-background
- hproperty:highlight-face) background))
- (set-face-background hproperty:highlight-face background))
- (and foreground (not (equal (face-foreground
- hproperty:highlight-face) foreground))
- (set-face-foreground hproperty:highlight-face foreground)))
- ;; If no colors are specified under InfoDock, use the default color
- ;; scheme.
- (or background foreground (not (fboundp 'id-set-face))
- (id-set-face hproperty:highlight-face))
- (setq hproperty:item-face hproperty:highlight-face)
- (if update-hyrolo-highlight-flag
- (if tty
- (copy-face 'italic 'hyrolo-highlight-face)
- (copy-face hproperty:highlight-face hyrolo-highlight-face)))))
-
-(defun hproperty:select-item (&optional pnt)
- "Select item in current buffer at optional position PNT using hproperty:item-face."
- (if hproperty:item-button
- nil
- (set-extent-face (setq hproperty:item-button (make-extent (point) (point)))
- hproperty:item-face))
- (if pnt (goto-char pnt))
- (skip-chars-forward " \t")
- (skip-chars-backward "^ \t\n\r")
- (let ((start (point)))
- (save-excursion
- (skip-chars-forward "^ \t\n\r")
- (set-extent-endpoints hproperty:item-button start (point))))
- ;; Force display update
- (sit-for 0))
-
-(defun hproperty:select-line (&optional pnt)
- "Select line in current buffer at optional position PNT using hproperty:item-face."
- (if hproperty:item-button
- nil
- (set-extent-face (setq hproperty:item-button (make-extent (point) (point)))
- hproperty:item-face))
- (if pnt (goto-char pnt))
- (save-excursion
- (beginning-of-line)
- (set-extent-endpoints
- hproperty:item-button (point) (progn (end-of-line) (point))))
- ;; Force display update
- (sit-for 0))
-
-;;; ************************************************************************
-;;; Private variables
-;;; ************************************************************************
-
-(defvar hproperty:but-face
- (face-name (defface hproperty:but-face nil
- "Face for hyper-buttons."))
- "Face for hyper-buttons.")
-(setq hproperty:but hproperty:but-face)
-
-;; Init. files may set face properties, so run this after emacs initialization.
-(defun hproperty:set-face-after-init ()
- (if (and (fboundp 'device-type)
- (eq 'tty (device-type (selected-device))))
- (copy-face 'italic 'hproperty:but-face)
- (set-face-foreground hproperty:but-face (hproperty:but-color))
- (set-face-background hproperty:but-face (hproperty:background))))
-(if after-init-time
- (hproperty:set-face-after-init)
- (add-hook 'after-init-hook #'hproperty:set-face-after-init))
-
-(defvar hproperty:flash-face
- (face-name (defface hproperty:flash-face nil
- "Face for flashing hyper-buttons."))
- "Face for flashing hyper-buttons.")
-(hproperty:set-flash-color)
-
-(defvar hproperty:item-button nil
- "Button used to highlight an item in a listing buffer.")
-(make-variable-buffer-local 'hproperty:item-button)
-
-(defvar hproperty:item-face nil
- "Item marking face.")
-(or hproperty:item-face
- (setq hproperty:item-face
- (face-name (defface hproperty:item-face nil "Item marking face."))))
-
-(unless (boundp 'hproperty:highlight-face)
-(defvar hproperty:highlight-face nil
- "Item highlighting face. Use (hproperty:set-item-highlight) to set.")
-(if hproperty:highlight-face
- nil
- (setq hproperty:highlight-face
- (face-name
- (defface hproperty:highlight-face nil
- "Item highlighting face. Use (hproperty:set-item-highlight) to set.")))
- ;; Reverse foreground and background colors for default block-style highlighting.
- (hproperty:set-item-highlight (hproperty:foreground) (hproperty:background))))
-
-(provide 'hui-xe-but)
-
-
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
-
-;;; hui-xe-but.el ends here
diff --git a/hui.el b/hui.el
index d32ea3d..12f2680 100644
--- a/hui.el
+++ b/hui.el
@@ -1,4 +1,4 @@
-;;; hui.el --- GNU Hyperbole button and hyperlink user interface
+;;; hui.el --- GNU Hyperbole button and hyperlink user interface
;;
;; Author: Bob Weiner
;;
@@ -65,8 +65,27 @@
(message "{%s} now runs `%s'; prior {%s} binding removed" new-key-text cmd old-key-text))
(message "{%s} now runs `%s'" new-key-text cmd))))
+(defun hui:ebut-act (&optional but)
+ "Executes action for optional explicit button symbol BUT in current buffer.
+Default is the current button."
+ (interactive
+ (let ((but (ebut:at-p)) (lst))
+ (list
+ (cond (but)
+ ((setq lst (ebut:alist))
+ (ebut:get (ebut:label-to-key
+ (hargs:read-match "Button to execute: " lst nil t
+ (ebut:label-p 'as-label) 'ebut))))
+ (t (hypb:error "(ebut-act): No explicit buttons in buffer."))))))
+ (cond ((and (called-interactively-p 'interactive) (null but))
+ (hypb:error "(ebut-act): No current explicit button to activate."))
+ ((not (hbut:is-p but))
+ (hypb:error "(ebut-act): Explicit button is invalid; it has no attributes."))
+ (t (or but (setq but 'hbut:current))
+ (hui:but-flash) (hbut:act but))))
+
(defun hui:ebut-create (&optional start end)
- "Creates an explicit but starting from label between optional START and END.
+ "Creates 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."
(interactive (list (and (marker-position (hypb:mark-marker t))
@@ -79,10 +98,10 @@ label."
(hui:hbut-label-default start end (not (called-interactively-p 'interactive)))
lbl (hui:hbut-label default-lbl "ebut-create"))
(if (not (equal lbl default-lbl)) (setq default-lbl nil))
-
+
(setq but-buf (if default-lbl (current-buffer) (hui:ebut-buf)))
(hui:buf-writable-err but-buf "ebut-create")
-
+
(hattr:set 'hbut:current 'loc (hui:key-src but-buf))
(hattr:set 'hbut:current 'dir (hui:key-dir but-buf))
(setq actype (hui:actype))
@@ -118,7 +137,7 @@ Signals an error if point is not within a button."
(hui:ebut-delete-op interactive but-key key-src)
(message ""))
(hui:ebut-delete-op interactive but-key key-src))))
-
+
(defun hui:ebut-edit ()
"Creates or modifies an explicit Hyperbole button when conditions are met.
A region must have been delimited with the action-key and point must now be
@@ -153,13 +172,13 @@ Signals an error when no such button is found in the current buffer."
(but-buf (current-buffer))
actype but new-lbl)
(save-excursion
- (or (called-interactively-p 'interactive)
- (hui:buf-writable-err but-buf "ebut-modify"))
-
- (or (setq but (ebut:get lbl-key but-buf))
- (progn (pop-to-buffer but-buf)
- (hypb:error "(ebut-modify): Invalid button, no data for '%s'." lbl)))
-
+ (unless (called-interactively-p 'interactive)
+ (hui:buf-writable-err but-buf "ebut-modify"))
+
+ (unless (setq but (ebut:get lbl-key but-buf))
+ (pop-to-buffer but-buf)
+ (hypb:error "(ebut-modify): Invalid button, no data for '%s'." lbl))
+
(setq new-lbl
(hargs:read
"Change button label to: "
@@ -169,7 +188,7 @@ Signals an error when no such button is found in the current buffer."
(format "(ebut-modify): Enter a string of at most %s chars."
ebut:max-len)
'string))
-
+
(hattr:set 'hbut:current 'loc (hui:key-src but-buf))
(hattr:set 'hbut:current 'dir (hui:key-dir but-buf))
(setq actype (hui:actype (hattr:get but 'actype)))
@@ -220,19 +239,17 @@ Signals an error if any problem occurs."
(list curr-label new-label))))
(save-excursion
- (if (called-interactively-p 'interactive)
- nil
+ (unless (called-interactively-p 'interactive)
(hui:buf-writable-err (current-buffer) "ebut-rename")
(if (or (not (stringp curr-label)) (string= curr-label ""))
(hypb:error "(ebut-rename): 'curr-label' must be a non-empty string: %s"
- curr-label))
+ curr-label))
(and (stringp new-label) (string= new-label "")
(hypb:error "(ebut-rename): 'new-label' must be a non-empty string: %s"
- new-label)))
+ new-label)))
(or (ebut:get (ebut:label-to-key curr-label))
(hypb:error "(ebut-rename): Can't rename %s since no button data."
- curr-label))
- )
+ curr-label)))
(cond (new-label
(ebut:operate curr-label new-label)
(setq hui:ebut-label-prev nil)
@@ -280,8 +297,12 @@ a menu to find any of the occurrences."
(hypb:error "(hui:error): Obsolete, use hypb:error instead."))
(defun hui:gbut-create (lbl)
- "Creates Hyperbole global button with LBL."
- (interactive "sCreate global button labeled: ")
+ "Creates Hyperbole explicit global button with LBL.
+
+To create an implicit global button, add the text for an implicit
+button to `gbut:file` and then with point on the implicit button,
+invoke: {C-h h i l}, to label/name it."
+ (interactive "sCreate explicit global button labeled: ")
(let (but-buf actype)
(save-excursion
(setq actype (hui:actype))
@@ -306,6 +327,7 @@ a menu to find any of the occurrences."
(defun hui:gbut-modify (lbl-key)
"Modifies a global Hyperbole button given by LBL-KEY.
+The button may be explicit or a labeled implicit button.
Signals an error when no such button is found."
(interactive (list (save-excursion
(hui:buf-writable-err
@@ -318,14 +340,13 @@ Signals an error when no such button is found."
(but-buf (find-file-noselect gbut:file))
actype but new-lbl)
(save-excursion
- (or (called-interactively-p 'interactive)
- (hui:buf-writable-err but-buf "gbut-modify"))
-
- (or (setq but (ebut:get lbl-key but-buf))
- (progn (pop-to-buffer but-buf)
- (hypb:error
- "(gbut-modify): Invalid button, no data for '%s'." lbl)))
-
+ (unless (called-interactively-p 'interactive)
+ (hui:buf-writable-err but-buf "gbut-modify"))
+
+ (unless (setq but (gbut:get lbl-key))
+ (pop-to-buffer but-buf)
+ (hypb:error "(gbut-modify): Invalid button, no data for '%s'." lbl))
+
(setq new-lbl
(hargs:read
"Change global button label to: "
@@ -335,16 +356,26 @@ Signals an error when no such button is found."
(format "(gbut-modify): Enter a string of at most %s chars."
ebut:max-len)
'string))
-
- (hattr:set 'hbut:current 'loc (hui:key-src but-buf))
- (hattr:set 'hbut:current 'dir (hui:key-dir but-buf))
- (setq actype (hui:actype (hattr:get but 'actype)))
- (hattr:set 'hbut:current 'actype actype)
- (hattr:set 'hbut:current 'args (hargs:actype-get actype 'modifying))
- (hattr:set 'hbut:current 'action
- (and hui:ebut-prompt-for-action (hui:action actype)))
- (set-buffer but-buf)
- (ebut:operate lbl new-lbl))))
+
+ (if (eq (hattr:get but 'categ) 'explicit)
+ (progn
+ ;; Explicit buttons
+ (hattr:set 'hbut:current 'loc (hui:key-src but-buf))
+ (hattr:set 'hbut:current 'dir (hui:key-dir but-buf))
+ (setq actype (hui:actype (hattr:get but 'actype)))
+ (hattr:set 'hbut:current 'actype actype)
+ (hattr:set 'hbut:current 'args (hargs:actype-get actype 'modifying))
+ (hattr:set 'hbut:current 'action
+ (and hui:ebut-prompt-for-action (hui:action actype)))
+ (set-buffer but-buf)
+ (ebut:operate lbl new-lbl))
+ ;; Ixplicit buttons
+ (save-excursion
+ (set-buffer but-buf)
+ (ibut:rename lbl new-lbl)
+ (when (and (called-interactively-p 'interactive)
+ (ibut:at-p))
+ (hui:ibut-message t)))))))
(defun hui:hbut-act (&optional but)
"Executes action for optional Hyperbole button symbol BUT in current buffer.
@@ -353,11 +384,11 @@ Default is the current button."
(let ((but (hbut:at-p)) (lst))
(list
(cond (but)
- ((setq lst (ebut:alist))
- (ebut:get (ebut:label-to-key
+ ((setq lst (nconc (ebut:alist) (ibut:alist)))
+ (hbut:get (hbut:label-to-key
(hargs:read-match "Button to execute: " lst nil t
- (ebut:label-p 'as-label) 'ebut))))
- (t (hypb:error "(hbut-act): No explicit buttons in buffer."))))))
+ (hbut:label-p 'as-label) 'hbut))))
+ (t (hypb:error "(hbut-act): No labeled buttons in buffer."))))))
(cond ((and (called-interactively-p 'interactive) (null but))
(hypb:error "(hbut-act): No current button to activate."))
((not (hbut:is-p but))
@@ -383,28 +414,28 @@ BUT defaults to the button whose label point is within."
(ebut:get (ebut:label-to-key
(hargs:read-match "Help for button: "
(ebut:alist) nil t nil 'ebut)))))
- (or but
- (hypb:error "(hbut-help): Move point to a valid Hyperbole button."))
- (if (not (hbut:is-p but))
- (cond (but (hypb:error "(hbut-help): Invalid button."))
- (t (hypb:error
- "(hbut-help): Not on an implicit button and no buffer explicit buttons."))))
+ (unless but
+ (hypb:error "(hbut-help): Move point to a valid Hyperbole button."))
+ (unless (hbut:is-p but)
+ (cond (but (hypb:error "(hbut-help): Invalid button."))
+ (t (hypb:error
+ "(hbut-help): Not on an implicit button and no buffer explicit buttons."))))
(let ((type-help-func (intern-soft
(concat
(htype:names 'ibtypes (hattr:get but 'categ))
":help"))))
- (or (equal (hypb:indirect-function 'hui:but-flash)
- (lambda nil))
- ;; Only flash button if point is on it.
- (let ((lbl-key (hattr:get but 'lbl-key)))
- (and lbl-key
- (or (equal lbl-key (ebut:label-p))
- (equal lbl-key (ibut:label-p)))
- (hui:but-flash))))
+ (unless (equal (hypb:indirect-function 'hui:but-flash)
+ (lambda nil))
+ ;; Only flash button if point is on it.
+ (let ((lbl-key (hattr:get but 'lbl-key)))
+ (and lbl-key
+ (or (equal lbl-key (ebut:label-p))
+ (equal lbl-key (ibut:label-p)))
+ (hui:but-flash))))
(if (functionp type-help-func)
(funcall type-help-func but)
(let ((total (hbut:report but)))
- (if total (hui:help-ebut-highlight))))))
+ (when total (hui:help-ebut-highlight))))))
(defun hui:hbut-label (default-label func-name)
"Reads button label from user using DEFAULT-LABEL and caller's FUNC-NAME."
@@ -438,12 +469,79 @@ See 'hbut:report'."
(if (and arg (symbolp arg))
(hui:hbut-help arg)
(let ((total (hbut:report arg)))
- (if total
- (progn (hui:help-ebut-highlight)
- (message "%d button%s." total (if (/= total 1) "s" "")))))))
+ (when total
+ (hui:help-ebut-highlight)
+ (message "%d button%s." total (if (/= total 1) "s" ""))))))
(defalias 'hui:hbut-summarize 'hui:hbut-report)
+(defun hui:ibut-label-create ()
+ "Creates an implicit button label preceding an existing implicit button at point, if any.
+Adds the label and delimiters around it plus any necessary label instance number.
+Signals an error if point is not on an implicit button or if the button already has a label.
+
+If the implicit button type does not specify the starting locations of
+its buttons, the the label is simply inserted at point."
+ (interactive)
+ (hui:buf-writable-err (current-buffer) "ibut-label-create")
+ (let* ((ibut (ibut:at-p))
+ (ibut-start (when ibut (hattr:get 'hbut:current 'lbl-start)))
+ ;; non-nil when point is within an existing ibut label
+ (label-key-start-end (when ibut (ibut:label-p nil nil nil t t)))
+ lbl actype)
+ (cond (label-key-start-end
+ (error "(hui:ibut-label-create): ibutton at point already has a label; try hui:ibut-rename"))
+ (ibut
+ (save-excursion
+ (when ibut-start
+ (goto-char ibut-start))
+ (save-excursion
+ ;; Check if ibut has an existing preceding label
+ (skip-chars-backward "][:=<>a-zA-Z0-9#@!$%^&* -")
+ (skip-chars-forward " ")
+ (when (looking-at (concat (regexp-quote ibut:label-start) "\\s-*[:=a-zA-Z0-9#@!$%^&* -]+" (regexp-quote ibut:label-end)))
+ (error "(hui:ibut-label-create): ibutton at point already has a label; try hui:ibut-rename")))
+ (setq lbl (hui:hbut-label nil "ibut-label-create")) ; prompts for label
+ ;; !! Handle adding instance to label
+ (insert ibut:label-start lbl ibut:label-end ibut:label-separator))
+ (when (called-interactively-p 'interactive)
+ (hui:ibut-message nil)))
+ (t (error "(hui:ibut-label-create): To add a label, point must be within the text of an implicit button")))))
+
+(defun hui:ibut-rename (lbl-key)
+ "Renames a label preceding a Hyperbole implicit button in the current buffer given by LBL-KEY.
+Signals an error when no such button is found in the current buffer."
+ (interactive (list (save-excursion
+ (hui:buf-writable-err (current-buffer) "ibut-rename")
+ (or (ibut:label-p)
+ (ibut:label-to-key
+ (hargs:read-match "Labeled implicit button to rename: "
+ (ibut:alist) nil t nil 'ibut))))))
+ (let ((lbl (ibut:key-to-label lbl-key))
+ (but-buf (current-buffer))
+ actype but new-lbl)
+ (unless (called-interactively-p 'interactive)
+ (hui:buf-writable-err but-buf "ibut-rename"))
+
+ (unless (setq but (ibut:get lbl-key but-buf))
+ (hypb:error "(ibut-rename): Invalid button: '%s'." lbl))
+
+ (setq new-lbl
+ (hargs:read
+ "Change implicit button label to: "
+ (lambda (lbl)
+ (and (not (string= lbl "")) (<= (length lbl) ebut:max-len)))
+ lbl
+ (format "(ibut-rename): Enter a string of at most %s chars."
+ ebut:max-len)
+ 'string))
+
+ (save-excursion
+ (ibut:rename lbl new-lbl)
+ (when (and (called-interactively-p 'interactive)
+ (ibut:at-p))
+ (hui:ibut-message t)))))
+
(defun hui:link-directly ()
"Creates a Hyperbole link button at depress point, linked to release point.
See also documentation for `hui:link-possible-types'."
@@ -724,8 +822,8 @@ All args are optional, the current button and buffer file are the defaults."
(defun hui:hbut-term-highlight (start end)
"For terminals only: Emphasize a button spanning from START to END."
- (save-restriction
- (save-excursion
+ (save-excursion
+ (save-restriction
(goto-char start)
(narrow-to-region (point-min) start)
(sit-for 0)
@@ -739,8 +837,8 @@ All args are optional, the current button and buffer file are the defaults."
(defun hui:hbut-term-unhighlight (start end)
"For terminals only: Remove any emphasis from hyper-button at START to END."
- (save-restriction
- (save-excursion
+ (save-excursion
+ (save-restriction
(goto-char start)
(narrow-to-region (point-min) start)
(sit-for 0)
@@ -817,13 +915,25 @@ Optional NO-SORT means display in decreasing priority order (natural order)."
'(("\\`*Help" . ((lambda (buf _alist) (switch-to-buffer buf)))))))
(hui:htype-help htype-sym no-sort)))
+(defun hui:ibut-message (but-modify-flag)
+ (let ((actype (symbol-name (hattr:get 'hbut:current 'actype)))
+ (args (hattr:get 'hbut:current 'args)))
+ (if (string-match "\\`actypes::" actype)
+ (setq actype (intern (substring actype (match-end 0)))))
+ (message "%s%s%s %s %S"
+ ibut:label-start
+ (hbut:key-to-label (hattr:get 'hbut:current 'lbl-key))
+ ibut:label-end
+ (if but-modify-flag "now executes" "executes")
+ (cons actype args))))
+
(defun hui:key-dir (but-buf)
"Returns button key src directory based on BUT-BUF, a buffer."
(if (bufferp but-buf)
(let ((file (buffer-file-name but-buf)))
(if file
(file-name-directory (hpath:symlink-referent file))
- (cdr (assq 'default-directory (buffer-local-variables but-buf)))))
+ (buffer-local-value 'default-directory but-buf)))
(hypb:error "(hui:key-dir): '%s' is not a valid buffer.")))
(defun hui:key-src (but-buf)
@@ -836,7 +946,7 @@ button's source file name when the button data is stored externally."
(t but-buf))))
(defun hui:link-create (modify but-window lbl-key but-loc but-dir type-and-args)
- "Creates or modifies a new Hyperbole link button.
+ "Creates or modifies a new Hyperbole explicit link button.
If MODIFY is non-nil, modifies button at point in BUT-WINDOW,
otherwise, prompts for button label and creates a button.
LBL-KEY is internal form of button label. BUT-LOC is file or buffer
@@ -864,7 +974,9 @@ possible types.
Referent Context Possible Link Type Returned
----------------------------------------------------
+Global Button link-to-gbut
Explicit Button link-to-ebut
+Implicit Button link-to-ibut
Info Index Item link-to-Info-index-item
Info Node link-to-Info-node
Mail Reader Message link-to-mail
@@ -879,8 +991,12 @@ Buffer without File link-to-buffer-tmp"
(let (val)
(delq nil
- (list (if (ebut:at-p)
- (list 'link-to-ebut buffer-file-name (ebut:label-p)))
+ (list (cond ((eq (current-buffer) (get-file-buffer gbut:file))
+ (list 'link-to-gbut buffer-file-name (hbut:label-p)))
+ ((ebut:at-p)
+ (list 'link-to-ebut buffer-file-name (ebut:label-p)))
+ ((setq val (ibut:at-p t))
+ (list 'link-to-ibut buffer-file-name val)))
(cond ((eq major-mode 'Info-mode)
(if (and Info-current-node
(member Info-current-node
diff --git a/hversion.el b/hversion.el
index ae92998..4b2845a 100644
--- a/hversion.el
+++ b/hversion.el
@@ -5,7 +5,7 @@
;;
;; Orig-Date: 1-Jan-94
;;
-;; Copyright (C) 1994-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -23,17 +23,23 @@
;;; Public variables
;;; ************************************************************************
-(defconst hyperb:version "7.0.2a" "GNU Hyperbole revision number.")
+(defconst hyperb:version "7.0.3b" "GNU Hyperbole revision number.")
;;;###autoload
-(defvar hyperb:microcruft-os-p
+(defvar hyperb:microsoft-os-p
(memq system-type '(ms-windows windows-nt ms-dos win32))
- "T iff Hyperbole is running under a Microcruft OS.")
+ "Non-nil iff Hyperbole is running under a Microsoft OS but not under Windows Subsystem for Linux (WSL).
+Use `hyperb:wsl-os-p' to test if running under WSL.")
+
+;;;###autoload
+(defvar hyperb:wsl-os-p
+ (and (eq system-type 'gnu/linux) (executable-find "wsl.exe") t)
+ "T iff Hyperbole is running under Microsoft Windows Subsystem for Linux (WSL).")
;;;###autoload
(defvar hyperb:mouse-buttons
- (if (or (and hyperb:microcruft-os-p (not (memq window-system '(w32 w64 x))))
- (and (not (featurep 'xemacs)) (memq window-system '(ns dps))))
+ (if (or (and hyperb:microsoft-os-p (not (memq window-system '(w32 w64 x))))
+ (memq window-system '(ns dps)))
2 3)
"Number of live buttons available on the mouse.
Override this if the system-computed default is incorrect for your specific mouse.")
@@ -127,7 +133,7 @@ Where a part in the term-type is delimited by a `-' or an `_'."
;; then there is a window system to support.
(display-mouse-p))
;; X11, macOS, NEXTSTEP (DPS), or OS/2 Presentation Manager (PM)
- (if (featurep 'xemacs) "xemacs" "emacs"))
+ "emacs")
((or (featurep 'eterm-fns)
(equal (getenv "TERM") "NeXT")
(equal (getenv "TERM") "eterm"))
diff --git a/hvm.el b/hvm.el
index 50417dd..8351d0e 100644
--- a/hvm.el
+++ b/hvm.el
@@ -1,4 +1,4 @@
-;;; hvm.el --- GNU Hyperbole buttons in mail reader: Vm
+;;; hvm.el --- GNU Hyperbole buttons in mail reader: Vm
;;
;; Author: Bob Weiner
;;
diff --git a/hypb.el b/hypb.el
index 8701d85..29b11b1 100644
--- a/hypb.el
+++ b/hypb.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 6-Oct-91 at 03:42:38
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -27,7 +27,11 @@
This should end with a space.")
(defcustom hypb:rgrep-command
- (format "%sgrep -insIHr" (if (executable-find "zgrep") "z" ""))
+ ;; Only the FreeBSD version of zgrep supports all of the grep
+ ;; options that Hyperbole needs: -r, --include, and --exclude
+ (format "%sgrep -insIHr" (if (and (executable-find "zgrep")
+ (string-match-p "bsd" (shell-command-to-string "zgrep --version | head -1")))
+ "z" ""))
"*Grep command string and initial arguments to send to `hypb:rgrep' command.
It must end with a space."
:type 'string
@@ -220,7 +224,10 @@ Global keymap is used unless optional KEYMAP is given."
(defun hypb:error (&rest args)
"Signals an error typically to be caught by `hyperbole'."
- (let ((msg (if (< (length args) 2) (car args) (apply 'format args))))
+ (let ((msg (if (< (length args) 2)
+ (car args)
+ (apply 'format (cons (car args)
+ (mapcar #'hypb:format-quote (cdr args)))))))
(put 'error 'error-message msg)
(error msg)))
@@ -233,25 +240,16 @@ FILE is temporarily read into a buffer to determine the major mode if necessary.
(unless (or existing-flag (null buf))
(kill-buffer buf)))))
-(defun hypb:format-quote (string)
- "Replace all single % with %% in STRING so a call to `format' or `message' ignores them."
- (if (stringp string)
+(defun hypb:format-quote (arg)
+ "Replace all single % with %% in any string ARG so that a call to `format' or `message' ignores them.
+Return either the modified string or the original ARG."
+ (if (stringp arg)
(replace-regexp-in-string
"@@@" "%%" (replace-regexp-in-string
- "%" "%%" (replace-regexp-in-string "%%" "@@@" string nil t)
+ "%" "%%" (replace-regexp-in-string "%%" "@@@" arg nil t)
nil t)
- nil t)))
-
-;;;###autoload
-(defun hypb:functionp (obj)
-"Returns t if OBJ is a function, nil otherwise."
- (cond
- ((symbolp obj) (fboundp obj))
- ((subrp obj))
- ((hypb:emacs-byte-code-p obj))
- ((consp obj)
- (if (eq (car obj) 'lambda) (listp (car (cdr obj)))))
- (t nil)))
+ nil t)
+ arg))
(defun hypb:function-copy (func-symbol)
"Copies FUNC-SYMBOL's body for overloading. Returns copy of body."
@@ -455,13 +453,18 @@ then `locate-post-command-hook'."
(defalias 'hypb:mark #'mark)
-(if (featurep 'xemacs)
- (defalias 'hypb:mark-marker 'mark-marker)
- (defun hypb:mark-marker (inactive-p)
- "Return this buffer's mark as a marker object, or nil if no mark.
+(defun hypb:mark-marker (inactive-p)
+ "Return this buffer's mark as a marker object, or nil if no mark.
INACTIVE-P is unused, it is for compatibility with XEmacs' version of
mark-marker."
- (mark-marker)))
+ (mark-marker))
+
+;;;###autoload
+(defun hypb:map-plist (func plist)
+ "Returns result of applying FUNC of two args, key and value, to key-value pairs in PLIST, a property list."
+ (cl-loop for (k v) on plist by #'cddr
+ collect (funcall func k v) into result
+ finally return result))
(defun hypb:map-sublists (func list)
"Applies FUNC to every atom found at any level of LIST.
@@ -512,7 +515,7 @@ NEWTEXT may instead be a function of one argument (the string to replace in)
that returns a replacement string."
(unless (stringp str)
(error "(hypb:replace-match-string): 2nd arg must be a string: %s" str))
- (unless (or (stringp newtext) (hypb:functionp newtext))
+ (unless (or (stringp newtext) (functionp newtext))
(error "(hypb:replace-match-string): 3rd arg must be a string or function: %s"
newtext))
(let ((rtn-str "")
@@ -526,7 +529,7 @@ that returns a replacement string."
(concat
rtn-str
(substring str prev-start match)
- (cond ((hypb:functionp newtext)
+ (cond ((functionp newtext)
(hypb:replace-match-string
regexp (substring str match start)
(funcall newtext str) literal))
@@ -688,14 +691,9 @@ nor nil it means to not count the minibuffer window even if it is active."
(defvar hypb:hyperbole-banner-keymap
(let ((map (make-sparse-keymap)))
- (cond ((not (featurep 'xemacs))
- (define-key map [mouse-1] 'hypb:browse-home-page)
- (define-key map [mouse-2] 'hypb:browse-home-page)
- (define-key map "\C-m" 'hypb:browse-home-page))
- ((featurep 'xemacs)
- (define-key map 'button1 'hypb:browse-home-page)
- (define-key map 'button2 'hypb:browse-home-page)
- (define-key map '(return) 'hypb:browse-home-page)))
+ (define-key map [mouse-1] 'hypb:browse-home-page)
+ (define-key map [mouse-2] 'hypb:browse-home-page)
+ (define-key map "\C-m" 'hypb:browse-home-page)
map)
"Keymap used when on the Hyperbole banner glyph.")
@@ -706,9 +704,7 @@ Without file, the banner is prepended to the current buffer."
(if file
;; A stub for this function is defined in hversion.el when not running in InfoDock.
(id-browse-file file))
- (if (not (featurep 'xemacs))
- (hypb:display-file-with-logo-emacs file)
- (hypb:display-file-with-logo-xemacs file))
+ (hypb:display-file-with-logo-emacs file)
(goto-char (point-min))
(skip-syntax-forward "-")
(set-window-start (selected-window) 1)
@@ -767,39 +763,9 @@ Without file, the banner is prepended to the current buffer."
(setq button (make-button (- (point) 3) (- (point) 2) :type 'hyperbole-banner))
(button-put button 'help-echo (concat "Click to visit " hypb:home-page))
(button-put button 'action #'hypb:browse-home-page)
+ (button-put button 'face 'default)
(button-put button 'keymap hypb:hyperbole-banner-keymap)))))
-(defun hypb:display-file-with-logo-xemacs (&optional file)
- "Display an optional text FILE with the Hyperbole banner prepended.
-Without file, the banner is prepended to the current buffer."
- (let ((hyperbole-banner-path (expand-file-name "hyperbole-banner.png" hyperb:dir)))
- (if (not (file-readable-p hyperbole-banner-path))
- (setq hyperbole-banner-path (if (fboundp 'locate-data-file)
- (locate-data-file "hyperbole-banner.png")
- (expand-file-name "hyperbole-banner.png"
- data-directory))))
- (if (or (not (fboundp 'make-glyph))
- (let ((extent (next-extent (current-buffer))))
- (and extent (extent-property extent 'hyperbole-banner)))
- (not hyperbole-banner-path)
- (not (file-readable-p hyperbole-banner-path)))
- ;; Either image support is unavailable, the file cannot be read
- ;; or the image has already been inserted, so don't reinsert it.
- nil
- (let ((hyperbole-banner (make-glyph hyperbole-banner-path))
- (buffer-read-only)
- extent)
- (goto-char (point-min))
- (insert "\n")
- (indent-to (startup-center-spaces hyperbole-banner))
- (insert "\n\n")
- (setq extent (make-extent (- (point) 3) (- (point) 2)))
- (set-extent-end-glyph extent hyperbole-banner)
- (set-extent-property extent 'hyperbole-banner t)
- (set-extent-property extent 'help-echo
- (concat "Click to visit " hypb:home-page))
- (set-extent-property extent 'keymap hypb:hyperbole-banner-keymap)))))
-
(defun hypb:locate-pathnames ()
(save-excursion
(goto-char (point-min))
@@ -824,7 +790,7 @@ Without file, the banner is prepended to the current buffer."
;;; Private variables
;;; ************************************************************************
-(if (not (featurep 'xemacs)) (define-button-type 'hyperbole-banner))
+(define-button-type 'hyperbole-banner)
(provide 'hypb)
diff --git a/hyperbole-pkg.el b/hyperbole-pkg.el
deleted file mode 100644
index c2390d7..0000000
--- a/hyperbole-pkg.el
+++ /dev/null
@@ -1,8 +0,0 @@
-;; -*- no-byte-compile: t -*-
-(define-package "hyperbole" "7.0.2a" "GNU Hyperbole: The Everyday Hypertextual Information Manager"
- '((emacs "24.4"))
- :url "http://www.gnu.org/software/hyperbole"
- :keywords '("comm" "convenience" "files" "frames" "hypermedia" "languages"
- "mail" "matching" "mouse" "multimedia" "outlines" "tools" "wp"))
-
-(setq byte-compile-warnings '(not interactive-only find-tag free-vars unresolved))
diff --git a/hyperbole.el b/hyperbole.el
index 73b1b61..fd50086 100644
--- a/hyperbole.el
+++ b/hyperbole.el
@@ -1,12 +1,12 @@
;;; hyperbole.el --- GNU Hyperbole: The Everyday Hypertextual Information Manager
-;; Copyright (C) 1992-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1992-2019 Free Software Foundation, Inc.
;; Author: Bob Weiner
-;; Maintainer: Bob Weiner <rsw@gnu.org> and Mats Lidell <matsl@gnu.org>
+;; Maintainer: Bob Weiner <rsw@gnu.org>, Mats Lidell <matsl@gnu.org>
;; Created: 06-Oct-92 at 11:52:51
-;; Released: 23-Nov-17
-;; Version: 7.0.2a
+;; Released: 21-Jan-19
+;; Version: 7.0.3
;; Keywords: comm, convenience, files, frames, hypermedia, languages, mail, matching, mouse, multimedia, outlines, tools, wp
;; Package: hyperbole
;; Package-Requires: ((emacs "24.4"))
@@ -177,24 +177,6 @@ context (wherever point is). {C-u \\[hkey-help]} shows what the Assist Key will
:type 'boolean
:group 'hyperbole-keys)
-(defcustom inhibit-hyperbole-messaging t
- "*Determines whether Hyperbole supports explicit buttons in mail and news buffers.
-The default of t means disable such support (work remains to
-modernize these features). When t, Hyperbole will not alter
-messaging mode hooks nor overload functions from these packages,
-preventing potential incompatibilities.
-
-If you want to use Hyperbole buttons in mail and news buffers, set
-this variable to nil by adding (hyperbole-toggle-messaging t)
-to your personal Emacs initialization file, prior to loading
-Hyperbole, and then restart Emacs."
- :type 'boolean
- :initialize (lambda (symbol value) (set symbol value))
- :set (lambda (symbol value)
- (set symbol (not value))
- (hyperbole-toggle-messaging nil))
- :group 'hyperbole-buttons)
-
;;; ************************************************************************
;;; Public key bindings
;;; ************************************************************************
@@ -318,7 +300,7 @@ With third argument NO-ADD non-nil, skip storage of prior KEY binding
which prevents automatic removal of any local bindings to the same key."
(or (global-key-binding key)
(where-is-internal command)
- (hkey-global-set-key key command)))
+ (hkey-global-set-key key command no-add)))
(defun hkey-set-bindings (key-binding-list)
"Set keys bound by Hyperbole to those in KEY-BINDING-LIST.
@@ -353,6 +335,16 @@ bindings after load)."
;;; Load Hyperbole mouse bindings
;;; ************************************************************************
+;; From mouse-position.c in Emacs:
+;; f = SELECTED_FRAME ();
+;; XSETFRAME (lispy_dummy, f);
+;;
+;; It seems like the XSETFRAME macro is not properly copying the value of f on initial frame selection under the macOS window system.
+;; The problem occurs on other systems as well, e.g. Emacs 25.2 under Windows 7.
+;;
+;; Hyperbole resolves this problem by setting the
+;; `mouse-position-function' variable below to properly set the
+;; newly selected frame.
(if (boundp 'mouse-position-function)
(setq mouse-position-function
(lambda (frame-x-dot-y)
@@ -362,7 +354,8 @@ frame, those functions by default still return the prior frame."
(if (consp frame-x-dot-y) (setcar frame-x-dot-y (selected-frame)))
frame-x-dot-y)))
-(require 'hmouse-key)
+;; hmouse-drv will load hui-mouse and hmouse-key
+(mapc #'require '(hsettings hmouse-drv hmouse-sh))
;;; ************************************************************************
;;; You shouldn't need to modify anything below here.
@@ -530,7 +523,7 @@ With optional ARG, override them iff ARG is positive."
;; "Creates implicit button TYPE (unquoted sym) with PARAMS, described by DOC."
;; nil 'macro)
-;; (autoload 'ebut:map "hyperbole" "Map over Hyperbole buffer buttons." nil)
+;; (autoload 'ebut:map "hyperbole" "Map over the Hyperbole explicit buttons in a buffer." nil)
;; (autoload 'hbut:key-src "hyperbole" "Called by {e} command in rolo match buffer.")
;; (autoload 'hui:ebut-rename "hyperbole" "Rename a Hyperbole button." t)
;; (autoload 'hyperbole "hyperbole" "Hyperbole info manager menus." t)
@@ -668,8 +661,6 @@ If FLAG is nil then text is shown, while if FLAG is t the text is hidden."
;;; Load Site-specific Configurations and Initialize Hyperbole Package
;;; ************************************************************************
-(require 'hsettings)
-
(defun hyperb:init ()
"Standard configuration routine for Hyperbole."
(interactive)
@@ -687,6 +678,14 @@ If FLAG is nil then text is shown, while if FLAG is t the text is hidden."
;; Conditionally initialize Hyperbole key bindings (when hkey-init is t)
(hkey-initialize)
;;
+ ;; Abbreviate MSWindows mount point paths.
+ (when (or (file-exists-p "/mnt/c")
+ (file-exists-p "/cygdrive"))
+ (add-to-list 'directory-abbrev-alist '("\\`\\(/mnt\\|/cygdrive\\)/" . "/")))
+ ;; When running under a POSIX system with possible access to MSWindows servers,
+ ;; cache valid MSWindows mount points.
+ (hpath:cache-mswindows-mount-points)
+ ;;
;; Save button attribute file whenever same dir file is saved and
;; `ebut:hattr-save' is non-nil.
(add-hook (if (boundp 'write-file-functions)
diff --git a/hyrolo-logic.el b/hyrolo-logic.el
index e257df8..d532b6c 100644
--- a/hyrolo-logic.el
+++ b/hyrolo-logic.el
@@ -1,4 +1,4 @@
-;;; hyrolo-logic.el --- Logic functions for GNU Hyperbole Rolo files
+;;; hyrolo-logic.el --- Logic functions for GNU Hyperbole Rolo files
;;
;; Author: Bob Weiner
;;
diff --git a/hyrolo-menu.el b/hyrolo-menu.el
index 75e70b0..874dbe5 100644
--- a/hyrolo-menu.el
+++ b/hyrolo-menu.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 28-Oct-94 at 10:59:44
;;
-;; Copyright (C) 1994-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -35,9 +35,10 @@
["Display-Prior-Matches" (id-tool-invoke 'hyrolo-display-matches) t]
["Edit-Entry" (id-tool-invoke 'hyrolo-edit) t]
["Edit-Rolo" (id-tool-invoke
- '(progn (require 'hyrolo)
- (find-file (car hyrolo-file-list))
- (setq buffer-read-only nil)))
+ '(lambda ()
+ (require 'hyrolo)
+ (find-file (car hyrolo-file-list))
+ (setq buffer-read-only nil)))
t]
["Insert-Entry-at-Point" (id-tool-invoke 'hyrolo-yank) t]
["Mail-to-Address" (id-tool-invoke 'hyrolo-mail-to) t]
@@ -112,21 +113,15 @@
;;; Public functions
;;; ************************************************************************
-;;; This definition is used only by XEmacs and Emacs.
+;;; This definition is used only by Emacs.
(defun hyrolo-menubar-menu ()
"Add a HyRolo menu to the rolo match buffer menubar."
(cond ((fboundp 'popup-mode-menu)
(setq mode-popup-menu id-popup-hyrolo-menu))
- ((featurep 'xemacs)
- (define-key hyrolo-mode-map 'button3 'hyrolo-popup-menu))
- (t ;; (not (featurep 'xemacs))
+ (t
(define-key hyrolo-mode-map [C-down-mouse-3] 'hyrolo-popup-menu)
(define-key hyrolo-mode-map [C-mouse-3] nil)))
- (unless (cond ((not (featurep 'xemacs))
- (global-key-binding [menu-bar Rolo]))
- ((boundp 'current-menubar)
- (car (find-menu-item current-menubar '("Rolo")))))
- (if (featurep 'xemacs) (set-buffer-menubar (copy-sequence current-menubar)))
+ (unless (global-key-binding [menu-bar Rolo])
(easy-menu-define nil hyrolo-mode-map "Rolo Menubar Menu" id-popup-hyrolo-menu)
;; Force a menu-bar update.
(force-mode-line-update)))
diff --git a/hyrolo.el b/hyrolo.el
index b5fbb92..b6058ff 100644
--- a/hyrolo.el
+++ b/hyrolo.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 7-Jun-89 at 22:08:29
;;
-;; Copyright (C) 1991-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2019 Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -85,10 +85,10 @@ executable must be found as well (for Oauth security)."
(ms "c:/_rolo.otl")
(unix "~/.rolo.otl")
(list (delq nil (if (and (boundp 'bbdb-file) (stringp bbdb-file))
- (if hyperb:microcruft-os-p
+ (if hyperb:microsoft-os-p
(list ms bbdb-file gcontacts)
(list "~/.rolo.otl" bbdb-file gcontacts))
- (if hyperb:microcruft-os-p (list ms gcontacts) (list unix gcontacts))))))
+ (if hyperb:microsoft-os-p (list ms gcontacts) (list unix gcontacts))))))
(setq hyrolo-file-list list)
(when (called-interactively-p 'interactive)
(message "HyRolo Search List: %S" list))
@@ -112,16 +112,10 @@ A hyrolo-file consists of:
:group 'hyperbole-rolo)
(unless hyrolo-highlight-face
(setq hyrolo-highlight-face
- (cond ((not (featurep 'xemacs))
- (if (fboundp 'defface)
- (defface hyrolo-highlight-face nil
- "*Face used to highlight rolo search matches."
- :group 'hyperbole-rolo)))
- (t (if (fboundp 'defface)
- (face-name
- (defface hyrolo-highlight-face nil
- "*Face used to highlight rolo search matches."
- :group 'hyperbole-rolo))))))
+ (if (fboundp 'defface)
+ (defface hyrolo-highlight-face nil
+ "*Face used to highlight rolo search matches."
+ :group 'hyperbole-rolo)))
(if (fboundp 'hproperty:set-item-highlight)
(hproperty:set-item-highlight)))
@@ -189,10 +183,8 @@ entry which begins with the parent string."
parent (substring name 0 end)
name (substring name (min (1+ end) (length name))))
(if (re-search-forward
- (concat "\\(" hyrolo-entry-regexp "\\)[ \t]*"
- (regexp-quote parent)) nil t)
- (setq level (buffer-substring-no-properties (match-beginning 1)
- (match-end 1)))
+ (concat hyrolo-entry-regexp (regexp-quote parent)) nil t)
+ (setq level (match-string-no-properties hyrolo-entry-group-number))
(error "(hyrolo-add): `%s' category not found in \"%s\"."
parent file)))
(narrow-to-region (point)
@@ -210,10 +202,10 @@ entry which begins with the parent string."
;; entry by moving to an entry with the same (or nearest) first character
;; to that of `name'.
(if (and (= level-len 1)
- (equal hyrolo-entry-regexp "^\\*+"))
+ (equal hyrolo-entry-regexp "^\\(\\*+\\)\\([ \t]+\\)"))
(progn (goto-char (point-min))
- (if (re-search-forward (concat "^\\*[ \t]*"
- (char-to-string first-char))
+ (if (re-search-forward (concat hyrolo-entry-regexp
+ (regexp-quote (char-to-string first-char)))
nil t)
(goto-char (match-beginning 0))
(goto-char (point-max))
@@ -235,17 +227,12 @@ entry which begins with the parent string."
(setq again nil)))))
(goto-char (point-min)))
- (while (and again
- (re-search-forward
- (concat "\\(" hyrolo-entry-regexp "\\)\\([ \t]*\\)")
- nil 'end))
- (setq entry-level (buffer-substring-no-properties (match-beginning 1)
- (match-end 1)))
+ (while (and again (re-search-forward hyrolo-entry-regexp nil 'end))
+ (setq entry-level (match-string-no-properties hyrolo-entry-group-number))
(if (/= (length entry-level) level-len)
(hyrolo-to-entry-end t entry-level)
(setq entry (buffer-substring-no-properties (point) (+ (point) len))
- entry-spc (buffer-substring-no-properties (match-beginning 2)
- (match-end 2)))
+ entry-spc (match-string-no-properties hyrolo-entry-trailing-space-group-number))
(cond ((string< entry name)
(hyrolo-to-entry-end t entry-level))
((string< name entry)
@@ -534,7 +521,7 @@ Returns t if entry is killed, nil otherwise."
(defun hyrolo-locate ()
"Interactively search for an entry beginning with a set of search characters."
(interactive)
- (hyrolo-isearch-for-regexp (concat hyrolo-entry-regexp "[ \t]*")))
+ (hyrolo-isearch-for-regexp hyrolo-entry-regexp))
(defun hyrolo-mail-to ()
"Start composing mail addressed to the first e-mail address at or after point."
@@ -606,7 +593,7 @@ XEmacs only."
(defun hyrolo-rename (old-file new-file)
"Prompt user to rename OLD-FILE to NEW-FILE."
- (interactive (if hyperb:microcruft-os-p
+ (interactive (if hyperb:microsoft-os-p
'("c:/_rolodex.otl" "c:/_rolo.otl")
'("~/.rolodex.otl" "~/.rolo.otl")))
(if (and (equal (car hyrolo-file-list) new-file)
@@ -694,7 +681,7 @@ If ARG is zero, move to the beginning of the current line."
(if (null arg) (setq arg 1))
(forward-visible-line arg))
-;; Derived from `sort-lines' in "sort.el" since through Emacs 25.0
+;; Derived from `sort-lines' in "sort.el" since through at least Emacs 25.0
;; invisible lines are not grouped with the prior visible line, making
;; rolo entry (or any record) sorts fail. This next function fixes that.
(defun hyrolo-sort-lines (reverse beg end)
@@ -1276,8 +1263,7 @@ Name is returned as `last, first-and-middle'."
"\\([^\" \t()]+\\)[ \t]*[)\"]\\)?[ \t]*$")
from)
(setq name (hyrolo-format-name from 3 4))
- (or email (setq email (substring from (match-beginning 1)
- (match-end 1)))))
+ (or email (setq email (match-string 1 from))))
;; Match: <email>, name <email>, "name" <email>
((string-match
(concat "^\\(\"?\\([^\"<>()\n]+\\)[ \t]+"
@@ -1285,8 +1271,7 @@ Name is returned as `last, first-and-middle'."
"<\\([^\"<>() \t\n\r\f]+\\)>[ \t]*$")
from)
(setq name (hyrolo-format-name from 2 3))
- (or email (setq email (substring from (match-beginning 4)
- (match-end 4)))))))
+ (or email (setq email (match-string 4 from))))))
(if (or name email)
(list name email))))
@@ -1301,8 +1286,7 @@ Name is returned as `last, first-and-middle'."
(skip-chars-forward " \t")
(if (or (looking-at "[^ \t\n\r]+ ?, ?[^ \t\n\r]+")
(looking-at "\\( ?[^ \t\n\r]+\\)+"))
- (buffer-substring-no-properties (match-beginning 0)
- (match-end 0))))))))
+ (match-string-no-properties 0)))))))
(defun hyrolo-narrowed-p ()
(or (/= (point-min) 1) (/= (1+ (buffer-size)) (point-max))))
@@ -1393,11 +1377,8 @@ Returns point where matching entry begins or nil if not found."
(while (and (not level) (search-forward parent nil t))
(save-excursion
(beginning-of-line)
- (if (looking-at
- (concat "\\(" hyrolo-entry-regexp "\\)[ \t]*"
- (regexp-quote parent)))
- (setq level (buffer-substring-no-properties (match-beginning 1)
- (match-end 1))))))
+ (if (looking-at (concat hyrolo-entry-regexp (regexp-quote parent)))
+ (setq level (match-string-no-properties hyrolo-entry-group-number)))))
level))
((equal name real-name)) ;; Try next file.
(t ;; Found parent but not child
@@ -1415,9 +1396,7 @@ Returns point where matching entry begins or nil if not found."
(beginning-of-line)
(setq found
(if (looking-at
- (concat "\\(" hyrolo-entry-regexp
- "\\)[ \t]*"
- (regexp-quote name)))
+ (concat hyrolo-entry-regexp (regexp-quote name)))
(point))))))))
(or found (hyrolo-kill-buffer))) ;; conditionally kill
(widen)
@@ -1425,11 +1404,7 @@ Returns point where matching entry begins or nil if not found."
(defun hyrolo-to-buffer (buffer &optional other-window-flag frame)
"Pop to BUFFER."
- (cond ((featurep 'xemacs)
- (pop-to-buffer buffer other-window-flag
- ;; default is to use selected frame
- (or frame (selected-frame))))
- (t (pop-to-buffer buffer other-window-flag))))
+ (pop-to-buffer buffer other-window-flag))
(defun hyrolo-to-entry-end (&optional include-sub-entries curr-entry-level)
"Moves point to the end of the whole entry that point is within if optional INCLUDE-SUB-ENTRIES is non-nil.
@@ -1472,10 +1447,18 @@ Calls the functions given by `hyrolo-mode-hook'.
"Buffer used to display set of last matching rolo entries.")
(define-obsolete-variable-alias 'rolo-display-buffer 'hyrolo-display-buffer "06.00")
-(defvar hyrolo-entry-regexp "^\\*+"
+(defvar hyrolo-entry-group-number 1
+ "Group number within `hyrolo-entry-regexp' whose length represents the level of any entry matched.")
+
+(defvar hyrolo-entry-trailing-space-group-number 2
+ "Group number within `hyrolo-entry-regexp; containing trailing space.")
+
+(defvar hyrolo-entry-regexp "^\\(\\*+\\)\\([ \t]+\\)"
"Regular expression to match the beginning of a rolo entry.
-This pattern must match the beginning of the line. Entries may be nested
-through the use of increasingly longer beginning patterns.")
+This pattern must match the beginning of the line. Use
+`hyrolo-entry-group-number' to compute the entry's level in the
+hierarchy. Use `hyrolo-entry-trailing-space-group-number' to capture
+the whitespace following the entry hierarchy level.")
(define-obsolete-variable-alias 'rolo-entry-regexp 'hyrolo-entry-regexp "06.00")
(defconst hyrolo-hdr-format
diff --git a/hywconfig.el b/hywconfig.el
index d11318f..983a6f3 100644
--- a/hywconfig.el
+++ b/hywconfig.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 15-Mar-89
;;
-;; Copyright (C) 1989-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1989-2019 Free Software Foundation, Inc.
;; See the "../HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -51,12 +51,6 @@
(require 'ring)
(require 'set)
-;; XEmacs compatibility
-(or (fboundp 'frame-parameter)
- (fset 'frame-parameter 'frame-property))
-(or (fboundp 'set-frame-parameter)
- (fset 'set-frame-parameter 'set-frame-property))
-
;;; ************************************************************************
;;; Public variables
;;; ************************************************************************
diff --git a/kotl/kexport.el b/kotl/kexport.el
index d0a0de3..501a5d4 100644
--- a/kotl/kexport.el
+++ b/kotl/kexport.el
@@ -89,10 +89,10 @@
;; make klinks into hyperlinks
(cons (concat "&lt;\\s-*@\\s-*" kexport:kcell-reference-regexp
"[^&>]*&gt;")
- "<A HREF=\"#\\1\">\\0</A>")
+ "<A HREF=\"#k\\1\">\\0</A>")
(cons (format "&lt;\\s-*@\\s-*\\(%s\\)[^=&>]*&gt;"
kexport:kcell-partial-reference-regexp)
- "<A HREF=\"#\\1\">\\0</A>")
+ "<A HREF=\"#k\\1\">\\0</A>")
(cons (format "&lt;\\s-*\\([^ \t\n\r,<>]+\\)\\s-*,\\s-*%s[^=&>]*&gt;"
kexport:kcell-reference-regexp)
'kexport:html-file-klink)
@@ -185,7 +185,7 @@ STILL TODO:
title)))
(princ "<HTML><HEAD>\n\n")
- (princ "<A ID=\"top\"></A><A ID=\"0\"></A>\n")
+ (princ "<A ID=\"top\"></A><A ID=\"k0\"></A>\n")
(princ (format "<TITLE>%s</TITLE>\n" title))
(if kexport:html-description
(princ (format "<META ID=\"description\" CONTENT=\"%s\">\n"
@@ -211,8 +211,8 @@ STILL TODO:
(setq i (1- i)))
(princ "<TABLE><TR>\n")
(setq label (kcell-view:label))
- (princ (format "<A ID=\"%s\"></A>" label))
- (princ (format "<A ID=\"%s\"></A>\n" (kcell-view:idstamp)))
+ (princ (format "<A ID=\"k%s\"></A>" label))
+ (princ (format "<A ID=\"k%s\"></A>\n" (kcell-view:idstamp)))
(princ "<TD WIDTH=2% VALIGN=top><PRE>\n")
(princ (format
"<FONT %s>%s%s</FONT></PRE></TD>\n"
@@ -251,8 +251,8 @@ Works exclusively within a call to `hypb:replace-match-string'."
(match-end 1))))
(if (equal filename (file-name-nondirectory
kexport:input-filename))
- "<A HREF=\"#\\2\">\\0</A>"
- (format "<A HREF=\"file://%s#\\2\">\\0</A>"
+ "<A HREF=\"#k\\2\">\\0</A>"
+ (format "<A HREF=\"file://%s#k\\2\">\\0</A>"
(expand-file-name filename
(if kexport:input-filename
(file-name-directory
diff --git a/kotl/kfill.el b/kotl/kfill.el
index 238d7f5..27a8b6c 100644
--- a/kotl/kfill.el
+++ b/kotl/kfill.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 23-Jan-94
;;
-;; Copyright (C) 1994-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2019 Free Software Foundation, Inc.
;; See the "../HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -95,7 +95,7 @@ number of lines that could not be moved, otherwise 0."
(forward-visible-line n)
(if (< n 0)
nil
- (skip-chars-forward "[\n\r]"))
+ (skip-chars-forward "\n\r"))
; (- (abs n) (count-matches "\n" opoint (point)))
0))
@@ -106,6 +106,7 @@ number of lines that could not be moved, otherwise 0."
;; Need this or Emacs ignores fill-prefix when inside a
;; comment.
(comment-multi-line t)
+ (fill-paragraph-handle-comment t)
fill-prefix)
(kfill:adapt nil)
(do-auto-fill))
@@ -150,8 +151,8 @@ number of lines that could not be moved, otherwise 0."
(if (not (derived-mode-p 'kotl-mode))
(apply orig-fun args)
(setq prior-fill-prefix fill-prefix)
- (if (equal prior-fill-prefix "")
- (setq prior-fill-prefix nil))
+ (when (equal prior-fill-prefix "")
+ (setq prior-fill-prefix nil))
(apply orig-fun args)
(cond (fill-prefix
(message "fill-prefix: \"%s\"; prior-fill-prefix: \"%s\""
diff --git a/kotl/kmenu.el b/kotl/kmenu.el
index cee1760..344868a 100644
--- a/kotl/kmenu.el
+++ b/kotl/kmenu.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 28-Mar-94 at 11:22:09
;;
-;; Copyright (C) 1994-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2019 Free Software Foundation, Inc.
;; See the "../HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -197,16 +197,10 @@
(cond ((fboundp 'popup-mode-menu)
(defvar mode-popup-menu)
(setq mode-popup-menu id-popup-kotl-menu))
- ((featurep 'xemacs)
- (define-key kotl-mode-map 'button3 'kotl-popup-menu))
- (t ;; (not (featurep 'xemacs))
+ (t
(define-key kotl-mode-map [C-down-mouse-3] 'kotl-popup-menu)
(define-key kotl-mode-map [C-mouse-3] nil)))
- (unless (cond ((not (featurep 'xemacs))
- (global-key-binding [menu-bar Koutline]))
- ((boundp 'current-menubar)
- (car (find-menu-item current-menubar '("Koutline")))))
- (if (featurep 'xemacs) (set-buffer-menubar (copy-sequence current-menubar)))
+ (unless (global-key-binding [menu-bar Koutline])
(easy-menu-define nil kotl-mode-map "Koutline Menubar Menu" id-popup-kotl-menu)
;; Force a menu-bar update.
(force-mode-line-update)))
diff --git a/kotl/kotl-autoloads.el b/kotl/kotl-autoloads.el
index 287ece2..daf4bc0 100644
--- a/kotl/kotl-autoloads.el
+++ b/kotl/kotl-autoloads.el
@@ -3,7 +3,7 @@
;;; Code:
-;;;### (autoloads nil "kexport" "kexport.el" (23052 38385 0 0))
+;;;### (autoloads nil "kexport" "kexport.el" (0 0 0 0))
;;; Generated autoloads from kexport.el
(autoload 'kexport:html "kexport" "\
@@ -16,6 +16,8 @@ STILL TODO:
\(fn EXPORT-FROM OUTPUT-TO &optional SOFT-NEWLINES-FLAG)" t nil)
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "kexport" '("kexport:")))
+
;;;***
;;;### (autoloads nil "kfile" "kfile.el" (22412 20800 0 0))
@@ -39,7 +41,14 @@ View an existing kotl version-2 file FILE-NAME in a read-only mode.
;;;***
-;;;### (autoloads nil "kimport" "kimport.el" (23052 38368 0 0))
+;;;### (autoloads nil "kfill" "kfill.el" (0 0 0 0))
+;;; Generated autoloads from kfill.el
+
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "kfill" '("fill-paragraph" "kfill:" "prior-fill-prefix" "set-fill-prefix")))
+
+;;;***
+
+;;;### (autoloads nil "kimport" "kimport.el" (0 0 0 0))
;;; Generated autoloads from kimport.el
(defvar kimport:mode-alist '((t . kimport:text) (outline-mode . kimport:star-outline)) "\
@@ -124,6 +133,8 @@ The variable, `paragraph-start,' is used to determine paragraphs.
\(fn IMPORT-FROM OUTPUT-TO &optional CHILDREN-P)" t nil)
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "kimport" '("kimport:")))
+
;;;***
;;;### (autoloads nil "klink" "klink.el" (22481 28335 0 0))
@@ -138,7 +149,14 @@ See documentation for `kcell:ref-to-id' for valid cell-ref formats.
;;;***
-;;;### (autoloads nil "kotl-mode" "kotl-mode.el" (23052 38304 0 0))
+;;;### (autoloads nil "kmenu" "kmenu.el" (0 0 0 0))
+;;; Generated autoloads from kmenu.el
+
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "kmenu" '("id-" "kotl-")))
+
+;;;***
+
+;;;### (autoloads nil "kotl-mode" "kotl-mode.el" (0 0 0 0))
;;; Generated autoloads from kotl-mode.el
(autoload 'kotl-mode "kotl-mode" "\
@@ -187,11 +205,26 @@ Signal an error if current buffer is not a Hyperbole outline, else return t.
\(fn)" nil nil)
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "kotl-mode" '("delete-selection-pre-hook" "kotl-mode" "yank-")))
+
+;;;***
+
+;;;### (autoloads nil "kview" "kview.el" (0 0 0 0))
+;;; Generated autoloads from kview.el
+
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "kview" '("kcell-view:" "kview:")))
+
+;;;***
+
+;;;### (autoloads nil "kvspec" "kvspec.el" (0 0 0 0))
+;;; Generated autoloads from kvspec.el
+
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "kvspec" '("kvspec:")))
+
;;;***
-;;;### (autoloads nil nil ("kcell.el" "kfill.el" "klabel.el" "kmenu.el"
-;;;;;; "knode.el" "kprop-em.el" "kprop-xe.el" "kproperty.el" "kview.el"
-;;;;;; "kvspec.el") (23052 38356 0 0))
+;;;### (autoloads nil nil ("kcell.el" "klabel.el" "knode.el" "kprop-em.el"
+;;;;;; "kprop-xe.el" "kproperty.el") (0 0 0 0))
;;;***
diff --git a/kotl/kotl-mode.el b/kotl/kotl-mode.el
index 7e2f70c..72e5761 100644
--- a/kotl/kotl-mode.el
+++ b/kotl/kotl-mode.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 6/30/93
;;
-;; Copyright (C) 1993-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1993-2019 Free Software Foundation, Inc.
;; See the "../HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -257,8 +257,10 @@ It provides the following keys:
(set-syntax-table text-mode-syntax-table)
;; Turn off filladapt minor mode if on, so that it does not interfere with
;; the filling code in "kfill.el".
- (and (bound-and-true-p 'filladapt-mode)
- (fboundp 'filladapt-mode) (filladapt-mode 0))
+ ;; FIXME: Is it still needed now that they all use advice?
+ (and (fboundp 'filladapt-mode)
+ (bound-and-true-p 'filladapt-mode)
+ (filladapt-mode 0))
;; Ensure that outline structure data is saved when save-buffer is called
;; from save-some-buffers, {C-x s}.
(add-hook (if (featurep 'xemacs)
@@ -325,7 +327,7 @@ It provides the following keys:
(kvspec:activate))))
;; We have been converting a buffer from a foreign format to a koutline.
;; Now that it is converted, ensure that `kotl-previous-mode' is set to
- ;; koutline now.
+ ;; koutline.
(setq kotl-previous-mode 'kotl-mode)
(add-hook 'change-major-mode-hook #'kotl-mode:show-all nil t)
;; Always run the mode-hook last.
@@ -392,10 +394,7 @@ Direction is determined from the value of `delete-key-deletes-forward' or
whether the Backspace key exists on the keyboard. If there is no Backspace
key, the delete key should always delete backward one character."
(interactive "*p")
- (if (not (featurep 'xemacs))
- (kotl-mode:delete-char (if normal-erase-is-backspace arg (- arg)) nil)
- ;; XEmacs
- (kotl-mode:delete-char (if (delete-forward-p) arg (- arg)) nil)))
+ (kotl-mode:delete-char (if normal-erase-is-backspace arg (- arg)) nil))
(defun kotl-mode:center-line ()
"Center the line point is on, within the width specified by `fill-column'.
@@ -848,15 +847,17 @@ too long."
With arg N, insert N newlines."
(interactive "*p")
(let* ((bolp (and (kotl-mode:bolp) (not (kotl-mode:bocp))))
- (indent (kcell-view:indent)))
+ (indent (kcell-view:indent))
+ (add-prefix (and (stringp fill-prefix)
+ (not (string-empty-p fill-prefix)))))
(while (> arg 0)
(save-excursion
(insert ?\n)
- (if (and (not bolp) fill-prefix)
+ (if (and (not bolp) add-prefix)
(insert fill-prefix)
(insert-char ?\ indent)))
(setq arg (1- arg)))
- (if (and bolp fill-prefix)
+ (if (and bolp add-prefix)
(progn (delete-horizontal-space)
(insert fill-prefix)))))
@@ -1441,20 +1442,6 @@ doc string for `insert-for-yank-1', which see."
(defalias 'kotl-mode:scroll-down-command 'kotl-mode:scroll-down)
(defalias 'kotl-mode:scroll-up-command 'kotl-mode:scroll-up)
-;;; Cursor and keypad key functions aliases for XEmacs.
-(if (featurep 'xemacs)
- (progn
- (defalias 'kotl-mode:backward-char-command 'kotl-mode:backward-char)
- (defalias 'kotl-mode:forward-char-command 'kotl-mode:forward-char)
- (defalias 'kotl-mode:fkey-backward-char 'kotl-mode:backward-char)
- (defalias 'kotl-mode:fkey-forward-char 'kotl-mode:forward-char)
- (defalias 'kotl-mode:fkey-next-line 'kotl-mode:next-line)
- (defalias 'kotl-mode:fkey-previous-line 'kotl-mode:previous-line)
- (defalias 'kotl-mode:deprecated-scroll-down 'kotl-mode:scroll-down)
- (defalias 'kotl-mode:deprecated-scroll-up 'kotl-mode:scroll-up)
- (defalias 'kotl-mode:deprecated-bob 'kotl-mode:beginning-of-buffer)
- (defalias 'kotl-mode:deprecated-eob 'kotl-mode:end-of-buffer)))
-
(defun kotl-mode:back-to-indentation ()
"Move point to the first non-read-only non-whitespace character on this line."
(interactive)
@@ -2145,7 +2132,7 @@ If key is pressed:
otherwise hide it;
(3) between cells or within the read-only indentation region to the left of
a cell, then move point to prior location and begin creation of a
- klink to some other outline cell; hit the Action Key twice to select the
+ klink to some other outline cell; press the Action Key twice to select the
link referent cell;
(4) anywhere else, invoke `action-key-eol-function', typically to scroll up
a windowful."
@@ -2180,7 +2167,7 @@ If assist-key is pressed:
each cell in tree beginning at point;
(3) between cells or within the read-only indentation region to the left of
a cell, then move point to prior location and prompt to move one tree to
- a new location in the outline; hit the Action Key twice to select the
+ a new location in the outline; press the Action Key twice to select the
tree to move and where to move it;
(4) anywhere else, invoke `assist-key-eol-function', typically to scroll down
a windowful."
@@ -2737,7 +2724,8 @@ With optional prefix ARG, toggle display of blank lines between cells."
(kview:set-attr kview 'lines-to-show 0)
(outline-flag-region (point-min) (point-max) nil)
(if arg (kvspec:toggle-blank-lines))
- (kvspec:update t))))
+ (if (called-interactively-p 'interactive)
+ (kvspec:update t)))))
;;;###autoload
(defun kotl-mode:top-cells (&optional arg)
diff --git a/kotl/kproperty.el b/kotl/kproperty.el
index 134e737..3734548 100644
--- a/kotl/kproperty.el
+++ b/kotl/kproperty.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 7/27/93
;;
-;; Copyright (C) 1993-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1993-2019 Free Software Foundation, Inc.
;; See the "../HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
diff --git a/kotl/kview.el b/kotl/kview.el
index 14954a4..ff0ddf9 100644
--- a/kotl/kview.el
+++ b/kotl/kview.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 6/30/93
;;
-;; Copyright (C) 1993-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1993-2019 Free Software Foundation, Inc.
;; See the "../HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -689,43 +689,25 @@ the lines displayed, since it has hidden branches."
(save-excursion (and (kcell-view:next nil label-sep-len)
(kcell-view:invisible-p (point) label-sep-len))))
-(cond ((not (featurep 'xemacs))
- (defun kview:goto-cell-id (id-string)
- "Move point to start of cell with idstamp ID-STRING and return t, else nil."
- (let ((cell-id (string-to-number id-string))
- (opoint (point))
- pos kcell)
- (goto-char (point-min))
- (while (and (setq pos (kproperty:next-single-change (point) 'kcell))
- (goto-char pos)
- (or (null (setq kcell (kproperty:get pos 'kcell)))
- (/= (kcell:idstamp kcell) cell-id))
- ;; Skip to the end of this kcell property
- (setq pos (kproperty:next-single-change (point) 'kcell))
- (goto-char pos)))
- (if pos
- (progn
- (forward-char (kview:label-separator-length kview))
- t)
- (goto-char opoint)
- nil))))
- ;;
- ;; XEmacs
- (t (defun kview:goto-cell-id (id-string)
- "Move point to start of cell with idstamp ID-STRING and return t, else nil."
- (let ((cell-id (string-to-number id-string))
- label-end kcell)
- (setq label-end
- (map-extents
- (lambda (extent _)
- (setq kcell (extent-property extent 'kcell))
- (and kcell (= (kcell:idstamp kcell) cell-id)
- (extent-end-position extent)))
- nil nil nil nil nil 'kcell))
- (if (null label-end)
- nil
- (goto-char label-end)
- t)))))
+(defun kview:goto-cell-id (id-string)
+ "Move point to start of cell with idstamp ID-STRING and return t, else nil."
+ (let ((cell-id (string-to-number id-string))
+ (opoint (point))
+ pos kcell)
+ (goto-char (point-min))
+ (while (and (setq pos (kproperty:next-single-change (point) 'kcell))
+ (goto-char pos)
+ (or (null (setq kcell (kproperty:get pos 'kcell)))
+ (/= (kcell:idstamp kcell) cell-id))
+ ;; Skip to the end of this kcell property
+ (setq pos (kproperty:next-single-change (point) 'kcell))
+ (goto-char pos)))
+ (if pos
+ (progn
+ (forward-char (kview:label-separator-length kview))
+ t)
+ (goto-char opoint)
+ nil)))
(defun kview:id-counter (kview)
"Return the highest current idstamp (an integer) used by KVIEW."
diff --git a/kotl/kvspec.el b/kotl/kvspec.el
index a9e5354..d6c111d 100644
--- a/kotl/kvspec.el
+++ b/kotl/kvspec.el
@@ -4,7 +4,7 @@
;;
;; Orig-Date: 21-Oct-95 at 15:17:07
;;
-;; Copyright (C) 1995-2017 Free Software Foundation, Inc.
+;; Copyright (C) 1995-2019 Free Software Foundation, Inc.
;; See the "../HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.
@@ -116,16 +116,15 @@ display all levels of cells."
(kview:set-attr kview 'levels-to-show levels-to-keep))
(defun kvspec:show-lines-per-cell (num)
- "Show NUM lines per cell."
+ "Show NUM lines per visible cell; 0 means show all lines in each visible cell."
(if (or (not (integerp num)) (< num 0))
(error "(kvspec:show-lines-per-cell): Invalid lines per cell, `%d'" num))
(kview:set-attr kview 'lines-to-show num)
- (if (not (zerop num))
- ;; Now show NUM lines in cells.
- (kview:map-tree (lambda (_kview)
- (kcell-view:expand (point))
- (kvspec:show-lines-this-cell num))
- kview t t)))
+ ;; Now show NUM lines in cells.
+ (kview:map-tree (lambda (_kview)
+ (kcell-view:expand (point))
+ (kvspec:show-lines-this-cell num))
+ kview t t))
(defun kvspec:toggle-blank-lines ()
"Toggle blank lines between cells on or off."
@@ -251,32 +250,25 @@ characters at run-time.")
;; "l" means use value of kview:default-levels-to-show.
;; "l0" means show all levels.
(let (levels)
- (if (not (string-match "l\\([0-9]+\\)?" kvspec:current))
- ;; Don't change the view if no view spec is given but note that
- ;; all levels should be shown in the future.
- (kview:set-attr kview 'levels-to-show 0)
- (if (match-beginning 1)
- (setq levels (string-to-number (match-string 1 kvspec:current)))
- (setq levels kview:default-levels-to-show))
- (kvspec:levels-to-show levels))))
+ (if (and (string-match "l\\([0-9]+\\)?" kvspec:current)
+ (match-beginning 1))
+ (setq levels (string-to-number (match-string 1 kvspec:current)))
+ (setq levels kview:default-levels-to-show))
+ (kvspec:levels-to-show levels)))
(defun kvspec:lines-to-show ()
"Show a set number of lines per cell according to `kvspec:current'."
- ;; "c" means use value of kview:default-lines-to-show.
+ ;; "c" or no "c" means use value of kview:default-lines-to-show.
;; "c0" means show all lines.
- (cond ((not (string-match "c\\([0-9]+\\)?" kvspec:current))
- ;; Don't change the view if no view spec is given but note that all
- ;; lines should be shown in the future.
- (kview:set-attr kview 'lines-to-show 0))
- ((match-beginning 1)
- (kvspec:show-lines-per-cell
- (string-to-number (match-string 1 kvspec:current))))
- (t (kvspec:show-lines-per-cell kview:default-lines-to-show))))
+ (if (and (string-match "c\\([0-9]+\\)?" kvspec:current)
+ (match-beginning 1))
+ (kvspec:show-lines-per-cell
+ (string-to-number (match-string 1 kvspec:current)))
+ (kvspec:show-lines-per-cell kview:default-lines-to-show)))
(defun kvspec:numbering ()
"Set the type of numbering (label) display according to `kvspec:current'."
- (if (not (string-match "n\\([.*~0-2]\\)?" kvspec:current))
- nil
+ (when (string-match "n\\([.*~0-2]\\)?" kvspec:current)
;; "n" means use value of kview:default-label-type.
;; "n0" means display idstamps.
;; "n1" means display alpha labels.
@@ -286,23 +278,22 @@ characters at run-time.")
;; "n~" means no labels.
(let (spec type)
(if (match-beginning 1)
- (setq spec (string-to-char
- (substring kvspec:current
- (match-beginning 1) (match-end 1)))
+ (setq spec (string-to-char (match-string 1 kvspec:current))
type (cdr (assq spec kvspec:label-type-alist)))
(setq type kview:default-label-type))
(kview:set-label-type kview type))))
(defun kvspec:show-lines-this-cell (num)
"Assume the current cell is fully expanded and collapse to show NUM lines within it.
-If NUM is greater than the number of lines available, the cell remains fully expanded."
+If NUM is less than 1 or greater than the number of lines available, the cell remains fully expanded."
;; Use free variable label-sep-len bound in kview:map-* for speed.
- (defvar label-sep-len)
- (goto-char (kcell-view:start (point) label-sep-len))
- (let ((end (kcell-view:end-contents)))
- ;; Hide all but num lines of the cell.
- (and (> num 0) (search-forward "\n" end t num)
- (outline-flag-region (1- (point)) end t))))
+ (unless (< num 1)
+ (defvar label-sep-len)
+ (goto-char (kcell-view:start (point) label-sep-len))
+ (let ((end (kcell-view:end-contents)))
+ ;; Hide all but num lines of the cell.
+ (and (search-forward "\n" end t num)
+ (outline-flag-region (1- (point)) end t)))))
(defun kvspec:update-modeline ()
"Setup or update display of the current kview spec in the modeline."
@@ -315,19 +306,7 @@ If NUM is greater than the number of lines available, the cell remains fully exp
(memq 'modeline-buffer-identification
mode-line-format))))
(if elt
- (setcdr elt (cons 'kvspec:string (cdr elt)))
- ;;
- ;; XEmacs 19.14 introduced extents into the modeline that we
- ;; must work around. Assume any XEmacs is at least that new.
- (if (featurep 'xemacs)
- (let ((mf modeline-format)
- elt)
- (while mf
- (setq elt (car mf))
- (if (and (consp elt) (eq (cdr elt) 'modeline-buffer-identification))
- (progn (setcdr mf (cons 'kvspec:string (cdr mf)))
- (setq mf nil)))
- (setq mf (cdr mf)))))))))
+ (setcdr elt (cons 'kvspec:string (cdr elt)))))))
(defun kvspec:update-view ()
"Update view according to current setting of local `kvspec:current' variable."
diff --git a/man/hkey-help.txt b/man/hkey-help.txt
index 25dca92..c567c6d 100644
--- a/man/hkey-help.txt
+++ b/man/hkey-help.txt
@@ -9,7 +9,7 @@ Hyperbole
1st press at an arg value Value copied to minibuffer <- same
2nd press at an arg value Value used as argument <- same
In minibuffer Accepts minibuffer arg Completion help
- On an implicit button Activates button Button help
+ On an implicit button/path Activates button Button help
Within a koutline cell Collapses and expands Shows tree props
Left of a koutline cell Creates a klink Moves a tree
HyRolo Match Buffer Edits entries and mails to e-mail addresses
@@ -73,6 +73,8 @@ Mouse-only Control
Hyperbole Key Press/Click in Special Modes
Region Active Yanks region at release Kills and yanks at release
+ Company Mode Completion Displays definition Displays documentation
+ Treemacs Displays item Display item
Emacs Push Button Activates button Button help
Thing Begin or End Mark thing region Mark & kill thing region
Page Directory Listing Jumps to page <- same
@@ -81,7 +83,8 @@ Hyperbole Key Press/Click in Special Modes
Assembly Language Mode Jumps to id/include def Jumps to next def
Java Cross-reference Tag Jumps to identifier def Jumps to next def
JavaScript and Python Modes Jumps to identifier def Jumps to next def
- Any Lisp or Fortran Mode Jumps to identifier def Jumps to next def
+ Any Known Lisp or ChangeLog Jumps to identifier def Referent Doc
+ Fortran Mode Jumps to identifier def Jumps to next def
Emacs Lisp Compiler Error Jumps to def with error <- same
Other Compiler Error Jumps to src error line <- same
Grep or Occur Match Jumps to match source line <- same
diff --git a/man/hyperbole.html b/man/hyperbole.html
index bd2b5c6..21c93f1 100644
--- a/man/hyperbole.html
+++ b/man/hyperbole.html
@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This manual is for GNU Hyperbole
-(Edition 7.0.2a, Published December 12, 2017).
+(Edition 7.0.3b, Published August 11, 2019).
-Copyright (C) 1989-2017 Free Software Foundation, Inc.
+Copyright (C) 1989-2019 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -154,7 +154,10 @@ ul.no-bullet {list-style: none}
<ul class="no-bullet">
<li><a name="toc-Explicit-Buttons-1" href="#Explicit-Buttons">3.1 Explicit Buttons</a></li>
<li><a name="toc-Global-Buttons-1" href="#Global-Buttons">3.2 Global Buttons</a></li>
- <li><a name="toc-Implicit-Buttons-1" href="#Implicit-Buttons">3.3 Implicit Buttons</a></li>
+ <li><a name="toc-Implicit-Buttons-1" href="#Implicit-Buttons">3.3 Implicit Buttons</a>
+ <ul class="no-bullet">
+ <li><a name="toc-Implicit-Button-Type-Summaries-1" href="#Implicit-Button-Type-Summaries">3.3.1 Implicit Button Type Summaries</a></li>
+ </ul></li>
<li><a name="toc-Button-Files-1" href="#Button-Files">3.4 Button Files</a></li>
<li><a name="toc-Action-Types-1" href="#Action-Types">3.5 Action Types</a></li>
<li><a name="toc-Button-Type-Precedence-1" href="#Button-Type-Precedence">3.6 Button Type Precedence</a></li>
@@ -260,47 +263,48 @@ ul.no-bullet {list-style: none}
</ul></li>
<li><a name="toc-Smart-Keyboard-Keys-1" href="#Smart-Keyboard-Keys">E.2 Smart Keyboard Keys</a>
<ul class="no-bullet">
- <li><a name="toc-Smart-Key-_002d-Treemacs-1" href="#Smart-Key-_002d-Treemacs">E.2.1 Smart Key - Treemacs</a></li>
- <li><a name="toc-Smart-Key-_002d-Emacs-Pushbuttons-1" href="#Smart-Key-_002d-Emacs-Pushbuttons">E.2.2 Smart Key - Emacs Pushbuttons</a></li>
- <li><a name="toc-Smart-Key-_002d-Argument-Completion-1" href="#Smart-Key-_002d-Argument-Completion">E.2.3 Smart Key - Argument Completion</a></li>
- <li><a name="toc-Smart-Key-_002d-ID-Edit-Mode-1" href="#Smart-Key-_002d-ID-Edit-Mode">E.2.4 Smart Key - ID Edit Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029-1" href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029">E.2.5 Smart Key - Emacs Cross-references (Xrefs)</a></li>
- <li><a name="toc-Smart-Key-_002d-Smart-Scrolling-1" href="#Smart-Key-_002d-Smart-Scrolling">E.2.6 Smart Key - Smart Scrolling</a></li>
- <li><a name="toc-Smart-Key-_002d-Smart-Menus-1" href="#Smart-Key-_002d-Smart-Menus">E.2.7 Smart Key - Smart Menus</a></li>
- <li><a name="toc-Smart-Key-_002d-Dired-Mode-1" href="#Smart-Key-_002d-Dired-Mode">E.2.8 Smart Key - Dired Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Hyperbole-Buttons-1" href="#Smart-Key-_002d-Hyperbole-Buttons">E.2.9 Smart Key - Hyperbole Buttons</a></li>
- <li><a name="toc-Smart-Key-_002d-View-Mode-1" href="#Smart-Key-_002d-View-Mode">E.2.10 Smart Key - View Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Delimited-Things-1" href="#Smart-Key-_002d-Delimited-Things">E.2.11 Smart Key - Delimited Things</a></li>
- <li><a name="toc-Smart-Key-_002d-The-Koutliner-1" href="#Smart-Key-_002d-The-Koutliner">E.2.12 Smart Key - The Koutliner</a></li>
- <li><a name="toc-Smart-Key-_002d-RDB-Mode-1" href="#Smart-Key-_002d-RDB-Mode">E.2.13 Smart Key - RDB Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Help-Buffers-1" href="#Smart-Key-_002d-Help-Buffers">E.2.14 Smart Key - Help Buffers</a></li>
- <li><a name="toc-Smart-Key-_002d-Pages-Directory-Mode-1" href="#Smart-Key-_002d-Pages-Directory-Mode">E.2.15 Smart Key - Pages Directory Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Python-Source-Code-1" href="#Smart-Key-_002d-Python-Source-Code">E.2.16 Smart Key - Python Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-Identifier-Menu-Mode-1" href="#Smart-Key-_002d-Identifier-Menu-Mode">E.2.17 Smart Key - Identifier Menu Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-C-Source-Code-1" href="#Smart-Key-_002d-C-Source-Code">E.2.18 Smart Key - C Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-C_002b_002b-Source-Code-1" href="#Smart-Key-_002d-C_002b_002b-Source-Code">E.2.19 Smart Key - C++ Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-Assembly-Source-Code-1" href="#Smart-Key-_002d-Assembly-Source-Code">E.2.20 Smart Key - Assembly Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-Lisp-Source-Code-1" href="#Smart-Key-_002d-Lisp-Source-Code">E.2.21 Smart Key - Lisp Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-Java-Source-Code-1" href="#Smart-Key-_002d-Java-Source-Code">E.2.22 Smart Key - Java Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-JavaScript-Source-Code-1" href="#Smart-Key-_002d-JavaScript-Source-Code">E.2.23 Smart Key - JavaScript Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-Objective_002dC-Source-Code-1" href="#Smart-Key-_002d-Objective_002dC-Source-Code">E.2.24 Smart Key - Objective-C Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-Fortran-Source-Code-1" href="#Smart-Key-_002d-Fortran-Source-Code">E.2.25 Smart Key - Fortran Source Code</a></li>
- <li><a name="toc-Smart-Key-_002d-Occurrence-Matches-1" href="#Smart-Key-_002d-Occurrence-Matches">E.2.26 Smart Key - Occurrence Matches</a></li>
- <li><a name="toc-Smart-Key-_002d-Calendar-Mode-1" href="#Smart-Key-_002d-Calendar-Mode">E.2.27 Smart Key - Calendar Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Man-Page-Apropos-1" href="#Smart-Key-_002d-Man-Page-Apropos">E.2.28 Smart Key - Man Page Apropos</a></li>
- <li><a name="toc-Smart-Key-_002d-Emacs-Outline-Mode-1" href="#Smart-Key-_002d-Emacs-Outline-Mode">E.2.29 Smart Key - Emacs Outline Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Info-Manuals-1" href="#Smart-Key-_002d-Info-Manuals">E.2.30 Smart Key - Info Manuals</a></li>
- <li><a name="toc-Smart-Key-_002d-Email-Composers-1" href="#Smart-Key-_002d-Email-Composers">E.2.31 Smart Key - Email Composers</a></li>
- <li><a name="toc-Smart-Key-_002d-GNUS-Newsreader-1" href="#Smart-Key-_002d-GNUS-Newsreader">E.2.32 Smart Key - GNUS Newsreader</a></li>
- <li><a name="toc-Smart-Key-_002d-Buffer-Menus-1" href="#Smart-Key-_002d-Buffer-Menus">E.2.33 Smart Key - Buffer Menus</a></li>
- <li><a name="toc-Smart-Key-_002d-Tar-File-Mode-1" href="#Smart-Key-_002d-Tar-File-Mode">E.2.34 Smart Key - Tar File Mode</a></li>
- <li><a name="toc-Smart-Key-_002d-Man-Pages-1" href="#Smart-Key-_002d-Man-Pages">E.2.35 Smart Key - Man Pages</a></li>
- <li><a name="toc-Smart-Key-_002d-WWW-URLs-1" href="#Smart-Key-_002d-WWW-URLs">E.2.36 Smart Key - WWW URLs</a></li>
- <li><a name="toc-Smart-Key-_002d-HyRolo-Match-Buffers-1" href="#Smart-Key-_002d-HyRolo-Match-Buffers">E.2.37 Smart Key - HyRolo Match Buffers</a></li>
- <li><a name="toc-Smart-Key-_002d-Image-Thumbnails-1" href="#Smart-Key-_002d-Image-Thumbnails">E.2.38 Smart Key - Image Thumbnails</a></li>
- <li><a name="toc-Smart-Key-_002d-Gomoku-Game-1" href="#Smart-Key-_002d-Gomoku-Game">E.2.39 Smart Key - Gomoku Game</a></li>
- <li><a name="toc-Smart-Key-_002d-The-OO_002dBrowser-1" href="#Smart-Key-_002d-The-OO_002dBrowser">E.2.40 Smart Key - The OO-Browser</a></li>
- <li><a name="toc-Smart-Key-_002d-Default-Context-1" href="#Smart-Key-_002d-Default-Context">E.2.41 Smart Key - Default Context</a></li>
+ <li><a name="toc-Smart-Key-_002d-Company-Mode-1" href="#Smart-Key-_002d-Company-Mode">E.2.1 Smart Key - Company Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Treemacs-1" href="#Smart-Key-_002d-Treemacs">E.2.2 Smart Key - Treemacs</a></li>
+ <li><a name="toc-Smart-Key-_002d-Emacs-Pushbuttons-1" href="#Smart-Key-_002d-Emacs-Pushbuttons">E.2.3 Smart Key - Emacs Pushbuttons</a></li>
+ <li><a name="toc-Smart-Key-_002d-Argument-Completion-1" href="#Smart-Key-_002d-Argument-Completion">E.2.4 Smart Key - Argument Completion</a></li>
+ <li><a name="toc-Smart-Key-_002d-ID-Edit-Mode-1" href="#Smart-Key-_002d-ID-Edit-Mode">E.2.5 Smart Key - ID Edit Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029-1" href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029">E.2.6 Smart Key - Emacs Cross-references (Xrefs)</a></li>
+ <li><a name="toc-Smart-Key-_002d-Smart-Scrolling-1" href="#Smart-Key-_002d-Smart-Scrolling">E.2.7 Smart Key - Smart Scrolling</a></li>
+ <li><a name="toc-Smart-Key-_002d-Smart-Menus-1" href="#Smart-Key-_002d-Smart-Menus">E.2.8 Smart Key - Smart Menus</a></li>
+ <li><a name="toc-Smart-Key-_002d-Dired-Mode-1" href="#Smart-Key-_002d-Dired-Mode">E.2.9 Smart Key - Dired Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Hyperbole-Buttons-1" href="#Smart-Key-_002d-Hyperbole-Buttons">E.2.10 Smart Key - Hyperbole Buttons</a></li>
+ <li><a name="toc-Smart-Key-_002d-View-Mode-1" href="#Smart-Key-_002d-View-Mode">E.2.11 Smart Key - View Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Delimited-Things-1" href="#Smart-Key-_002d-Delimited-Things">E.2.12 Smart Key - Delimited Things</a></li>
+ <li><a name="toc-Smart-Key-_002d-The-Koutliner-1" href="#Smart-Key-_002d-The-Koutliner">E.2.13 Smart Key - The Koutliner</a></li>
+ <li><a name="toc-Smart-Key-_002d-RDB-Mode-1" href="#Smart-Key-_002d-RDB-Mode">E.2.14 Smart Key - RDB Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Help-Buffers-1" href="#Smart-Key-_002d-Help-Buffers">E.2.15 Smart Key - Help Buffers</a></li>
+ <li><a name="toc-Smart-Key-_002d-Pages-Directory-Mode-1" href="#Smart-Key-_002d-Pages-Directory-Mode">E.2.16 Smart Key - Pages Directory Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Python-Source-Code-1" href="#Smart-Key-_002d-Python-Source-Code">E.2.17 Smart Key - Python Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-Identifier-Menu-Mode-1" href="#Smart-Key-_002d-Identifier-Menu-Mode">E.2.18 Smart Key - Identifier Menu Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-C-Source-Code-1" href="#Smart-Key-_002d-C-Source-Code">E.2.19 Smart Key - C Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-C_002b_002b-Source-Code-1" href="#Smart-Key-_002d-C_002b_002b-Source-Code">E.2.20 Smart Key - C++ Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-Assembly-Source-Code-1" href="#Smart-Key-_002d-Assembly-Source-Code">E.2.21 Smart Key - Assembly Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-Lisp-Source-Code-1" href="#Smart-Key-_002d-Lisp-Source-Code">E.2.22 Smart Key - Lisp Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-Java-Source-Code-1" href="#Smart-Key-_002d-Java-Source-Code">E.2.23 Smart Key - Java Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-JavaScript-Source-Code-1" href="#Smart-Key-_002d-JavaScript-Source-Code">E.2.24 Smart Key - JavaScript Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-Objective_002dC-Source-Code-1" href="#Smart-Key-_002d-Objective_002dC-Source-Code">E.2.25 Smart Key - Objective-C Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-Fortran-Source-Code-1" href="#Smart-Key-_002d-Fortran-Source-Code">E.2.26 Smart Key - Fortran Source Code</a></li>
+ <li><a name="toc-Smart-Key-_002d-Occurrence-Matches-1" href="#Smart-Key-_002d-Occurrence-Matches">E.2.27 Smart Key - Occurrence Matches</a></li>
+ <li><a name="toc-Smart-Key-_002d-Calendar-Mode-1" href="#Smart-Key-_002d-Calendar-Mode">E.2.28 Smart Key - Calendar Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Man-Page-Apropos-1" href="#Smart-Key-_002d-Man-Page-Apropos">E.2.29 Smart Key - Man Page Apropos</a></li>
+ <li><a name="toc-Smart-Key-_002d-Emacs-Outline-Mode-1" href="#Smart-Key-_002d-Emacs-Outline-Mode">E.2.30 Smart Key - Emacs Outline Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Info-Manuals-1" href="#Smart-Key-_002d-Info-Manuals">E.2.31 Smart Key - Info Manuals</a></li>
+ <li><a name="toc-Smart-Key-_002d-Email-Composers-1" href="#Smart-Key-_002d-Email-Composers">E.2.32 Smart Key - Email Composers</a></li>
+ <li><a name="toc-Smart-Key-_002d-GNUS-Newsreader-1" href="#Smart-Key-_002d-GNUS-Newsreader">E.2.33 Smart Key - GNUS Newsreader</a></li>
+ <li><a name="toc-Smart-Key-_002d-Buffer-Menus-1" href="#Smart-Key-_002d-Buffer-Menus">E.2.34 Smart Key - Buffer Menus</a></li>
+ <li><a name="toc-Smart-Key-_002d-Tar-File-Mode-1" href="#Smart-Key-_002d-Tar-File-Mode">E.2.35 Smart Key - Tar File Mode</a></li>
+ <li><a name="toc-Smart-Key-_002d-Man-Pages-1" href="#Smart-Key-_002d-Man-Pages">E.2.36 Smart Key - Man Pages</a></li>
+ <li><a name="toc-Smart-Key-_002d-WWW-URLs-1" href="#Smart-Key-_002d-WWW-URLs">E.2.37 Smart Key - WWW URLs</a></li>
+ <li><a name="toc-Smart-Key-_002d-HyRolo-Match-Buffers-1" href="#Smart-Key-_002d-HyRolo-Match-Buffers">E.2.38 Smart Key - HyRolo Match Buffers</a></li>
+ <li><a name="toc-Smart-Key-_002d-Image-Thumbnails-1" href="#Smart-Key-_002d-Image-Thumbnails">E.2.39 Smart Key - Image Thumbnails</a></li>
+ <li><a name="toc-Smart-Key-_002d-Gomoku-Game-1" href="#Smart-Key-_002d-Gomoku-Game">E.2.40 Smart Key - Gomoku Game</a></li>
+ <li><a name="toc-Smart-Key-_002d-The-OO_002dBrowser-1" href="#Smart-Key-_002d-The-OO_002dBrowser">E.2.41 Smart Key - The OO-Browser</a></li>
+ <li><a name="toc-Smart-Key-_002d-Default-Context-1" href="#Smart-Key-_002d-Default-Context">E.2.42 Smart Key - Default Context</a></li>
</ul></li>
</ul></li>
<li><a name="toc-Suggestion-or-Bug-Reporting-1" href="#Suggestion-or-Bug-Reporting">Appendix F Suggestion or Bug Reporting</a></li>
@@ -328,7 +332,10 @@ Next: <a href="#Introduction" accesskey="n" rel="next">Introduction</a>, Previou
<CENTER><H2>The Everyday Hypertextual Information Manager</H2></CENTER>
-<P>Copyright &copy; 1989-2017 Free Software Foundation, Inc.</P>
+<CENTER><H3><A HREF="https://saythanks.io/to/rswgnu">Say thanks if you like Hyperbole.</A></H3></CENTER>
+
+
+<P>Copyright &copy; 1989-2019 Free Software Foundation, Inc.</P>
<P>GNU Hyperbole is available for use, modification, and distribution under
the terms of the GNU General Public License (GPL) Version 3 or later,
@@ -340,8 +347,8 @@ WITHOUT ANY WARRANTY, without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</P>
<PRE>
-Edition 7.0.2a
-Printed December 12, 2017.
+Edition 7.0.3b
+Printed August 11, 2019.
Published by the Free Software Foundation, Inc.
Author: Bob Weiner
@@ -512,6 +519,12 @@ Buttons
</td></tr>
<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+Implicit Buttons
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
Utilizing Explicit Buttons
</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Creation">Creation</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
@@ -692,7 +705,9 @@ Smart Mouse Keys
Smart Keyboard Keys
-</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Treemacs">Smart Key - Treemacs</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Company-Mode">Smart Key - Company Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Treemacs">Smart Key - Treemacs</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Emacs-Pushbuttons">Smart Key - Emacs Pushbuttons</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
@@ -722,6 +737,8 @@ Smart Keyboard Keys
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Pages-Directory-Mode">Smart Key - Pages Directory Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Identifier-Menu-Mode">Smart Key - Identifier Menu Mode </a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-C-Source-Code">Smart Key - C Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
@@ -736,8 +753,6 @@ Smart Keyboard Keys
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-JavaScript-Source-Code">Smart Key - JavaScript Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
-</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Objective_002dC-Source-Code">Smart Key - Objective-C Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Fortran-Source-Code">Smart Key - Fortran Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
@@ -788,7 +803,7 @@ Next: <a href="#Smart-Keys" accesskey="n" rel="next">Smart Keys</a>, Previous: <
<h2 class="chapter">1 Introduction</h2>
<p>This edition of the GNU Hyperbole Manual is for use with any version
-7.0.2a or greater of GNU Hyperbole. Hyperbole runs atop GNU Emacs 24.3
+7.0.3b or greater of GNU Hyperbole. Hyperbole runs atop GNU Emacs 24.3
or higher. It will trigger an error if your Emacs is older.
</p>
<p>This chapter summarizes the structure of the rest of the manual,
@@ -826,16 +841,17 @@ Next: <a href="#Motivation" accesskey="n" rel="next">Motivation</a>, Previous: <
you prefer a simpler, more interactive introduction to Hyperbole,
the <samp>DEMO</samp> file included in the Hyperbole distribution demonstrates
many of Hyperbole&rsquo;s standard facilities without the need to read through
-this reference manual. It is a good way to rapidly understand some of what
-Hyperbole can do for you. Once Hyperbole is installed, (see <a href="#Setup">Setup</a>),
-you can access the DEMO with the key sequence <kbd>{C-h h d d}</kbd>.
+this reference manual. The DEMO is a good way to rapidly understand some
+of what Hyperbole can do for you. Once Hyperbole is installed,
+(see <a href="#Setup">Setup</a>), you can access the DEMO with the key sequence <kbd>{C-h h
+d d}</kbd>.
</p>
<p>See <a href="#Glossary">Glossary</a>, for definitions of Hyperbole terms. In some cases,
-terms are not precisely defined within the body of this manual since
-they are defined within the glossary. Be sure to reference the
-glossary if a term is unclear to you. Although you need not have a keen
-understanding of all of these terms, a quick scan of the glossary should
-help throughout Hyperbole use.
+terms are not precisely defined within the body of this manual since they
+are defined within the glossary. Be sure to reference the glossary if a
+term is unclear to you. Although you need not have a keen understanding of
+all of these terms, a quick scan of the glossary helps throughout Hyperbole
+use.
</p>
<p>See <a href="#Setup">Setup</a>, for explanations of how to obtain, install, configure
and load Hyperbole for use. This appendix includes information on
@@ -911,19 +927,19 @@ its use as the prime means of organizing and interlinking the constant
flows of daily information.
</p>
<p>GNU Hyperbole takes a distinctly different approach. It has its own
-hypertext technology that can interface perfectly with web links but
-which are much easier to create (simply drag from the source to the
-destination of a link to create a new hyperlink). Hyperbole
-hyperbuttons can link not only to static information but can perform
-arbitrary actions through the use of button types written in a single,
-highly interactive language, Emacs Lisp. Hyperbole adds all of this
-power to your written documents, e-mail, news articles, contact
-management, outlines, directory listings, and much more. Hyperbole
-works well with the very latest versions of GNU Emacs.
+hypertext technology that can interface perfectly with web links but which
+are much easier to create (simply drag from the source to the destination
+of a link to create a new hyperlink). Hyperbole hyperbuttons can link not
+only to static information but can perform arbitrary actions (through the
+use of button types written in a single, highly interactive language, Emacs
+Lisp). Hyperbole adds all of this power to your written documents, e-mail,
+news articles, contact management, outlines, directory listings, and much
+more. Hyperbole works well with the very latest versions of GNU Emacs
+across every editing and viewing mode in Emacs.
</p>
-<p>Unlock the power of GNU Hyperbole to make your information work for
-you. One system. One language. One manual. One solution. Learn GNU
-Hyperbole and start moving further, faster.
+<p>Unlock the power of GNU Hyperbole to make your information work for you.
+One system. One language. One manual. One solution. Learn Hyperbole and
+start moving further, faster.
</p>
<hr>
<a name="Hyperbole-Overview"></a>
@@ -940,7 +956,7 @@ Next: <a href="#Mail-Lists" accesskey="n" rel="next">Mail Lists</a>, Previous: <
<a name="index-Emacs-Lisp"></a>
<a name="index-Emacs"></a>
<p>GNU Hyperbole (pronounced Ga-new Hi-per-bo-lee), or just Hyperbole, is
-an efficient and programmable hypertextual information management
+an efficient, programmable hypertextual information management
system. It is intended for everyday work on any GNU Emacs platform.
Hyperbole allows hypertext buttons to be embedded within unstructured
and structured files, mail messages and news articles. It offers
@@ -954,9 +970,12 @@ archives, and the World-Wide Web (WWW).
<dt><em>Buttons and Smart Keys</em></dt>
<dd><p>Hyperbole hyperlink and other kinds of buttons (explicit buttons) may be
added to documents with a simple drag between windows, no markup language
-needed. Implicit buttons are patterns automatically recognized within text
-that perform actions, e.g. bug#24568 displays the bug status information
-for that bug number. See <a href="#Buttons">Buttons</a>.
+needed. Implicit buttons are patterns automatically recognized within
+existing text that perform actions, e.g. bug#24568 displays the bug status
+information for that Emacs bug number, without the need for any additional
+markup. Global buttons are buttons that are activated by name from
+anywhere within Emacs.
+See <a href="#Buttons">Buttons</a>.
</p>
<p>Buttons are accessed by clicking on them or referenced by name (global
buttons), so they can be activated regardless of what is on screen.
@@ -978,7 +997,8 @@ fast, flexible file and text finding commands. A powerful, hierarchical
contact manager, see <a href="#HyRolo">HyRolo</a>, which anyone can use, is also included.
It is easy to learn since it introduces only a few new mechanisms
and has a menu interface, which may be operated from the keyboard or the
-mouse;
+mouse; it may also be used to look up any record-based information and
+Hyperbole buttons may be embedded in any records;
</p>
</dd>
<dt><em>Screen Control</em></dt>
@@ -987,14 +1007,15 @@ Emacs, see <a href="#HyControl">HyControl</a>. With just a few keystrokes, you
increasing a window&rsquo;s height by 5 lines to moving a frame by 220 pixels
or immediately moving it to a screen corner. Text in each window or
frame may be enlarged or shrunk (zoomed) for easy viewing, plus many
-other features;
+other features; this allows Hyperbole to quickly control the way
+information is presented on-screen;
</p>
</dd>
<dt><em>Hypertextual Outliner</em></dt>
<dd><p>an advanced outliner, see <a href="#Koutliner">Koutliner</a>, with multi-level
autonumbering and permanent identifiers attached to each outline node
for use as hypertext link anchors, per node properties and flexible
-view specifications that can be embedded within links or used
+view specifications that can be included in links or used
interactively;
</p>
</dd>
@@ -1048,7 +1069,7 @@ links to external information sources. See <a href="#Koutliner">Koutliner</a>.
<p>Some of Hyperbole&rsquo;s most significant features are:
</p>
<ul>
-<li> Buttons may link to information or may execute procedures, such as
+<li> Buttons may link to information or may execute functions, such as
starting or communicating with external programs;
</li><li> A simple mouse drag from a button source location to its link
@@ -1292,7 +1313,7 @@ Hyperbole
1st press at an arg value Value copied to minibuffer &lt;- same
2nd press at an arg value Value used as argument &lt;- same
In minibuffer Accepts minibuffer arg Completion help
- On an implicit button Activates button Button help
+ On an implicit button/path Activates button Button help
Within a koutline cell Collapses and expands Shows tree props
Left of a koutline cell Creates a klink Moves a tree
HyRolo Match Buffer Edits entries and mails to e-mail addresses
@@ -1356,6 +1377,8 @@ Mouse-only Control
Hyperbole Key Press/Click in Special Modes
Region Active Yanks region at release Kills and yanks at release
+ Company Mode Completion Displays definition Displays documentation
+ Treemacs Displays item Display item
Emacs Push Button Activates button Button help
Thing Begin or End Mark thing region Mark &amp; kill thing region
Page Directory Listing Jumps to page &lt;- same
@@ -1364,7 +1387,8 @@ Hyperbole Key Press/Click in Special Modes
Assembly Language Mode Jumps to id/include def Jumps to next def
Java Cross-reference Tag Jumps to identifier def Jumps to next def
JavaScript and Python Modes Jumps to identifier def Jumps to next def
- Any Lisp or Fortran Mode Jumps to identifier def Jumps to next def
+ Any Known Lisp or ChangeLog Jumps to identifier def Referent Doc
+ Fortran Mode Jumps to identifier def Jumps to next def
Emacs Lisp Compiler Error Jumps to def with error &lt;- same
Other Compiler Error Jumps to src error line &lt;- same
Grep or Occur Match Jumps to match source line &lt;- same
@@ -1671,7 +1695,7 @@ on the last line to end the dired session (bury its buffer).
<p>If you use the Treemacs file viewer Emacs package, you can configure Hyperbole
to use this instead of Dired when you click on a modeline buffer id.
</p>
-<p>Since this is a customization option, it may be change permanently like so.
+<p>Since this is a customization option, it may be changed permanently like so.
Use <kbd>{M-x customize-set-variable <span class="key">RET</span> action-key-modeline-buffer-id-function <span class="key">RET</span>}</kbd>.
Change the value to <code>smart-treemacs-modeline</code>. Then press <tt class="key">RET</tt>. To change it back
to Hyperbole&rsquo;s default, use the value, <code>dired-jump</code>.
@@ -1963,14 +1987,15 @@ Next: <a href="#Keyboard-Drags" accesskey="n" rel="next">Keyboard Drags</a>, Pre
<a name="index-drag_002c-dired-item"></a>
<a name="index-drag_002c-buffer-menu-item"></a>
<a name="index-drag_002c-Treemacs-item"></a>
-<p>You can do the same thing with items in dired, buffer menu and ibuffer menu
-listing buffers rather than buffers themselves. Drag with the Action Mouse Key
-and the selected item will be displayed in any Emacs window in which you
-release. Drag outside Emacs and it will be displayed in a new frame. To
-display the last item you want, press the Action Key on it and it will display
-within the listing window itself. (If you use the Treemacs file viewer package,
-item dragging works there as well). Remember that you can emulate these drags
-from the keyboard when needed, see <a href="#Keyboard-Drags">Keyboard Drags</a>.
+<p>You can also drag items to other windows with the Action Key in Dired,
+Buffer Menu, Ibuffer and Treemacs listing buffers, rather than the
+buffers themselves. Drag with the Action Mouse Key and the selected
+item will be displayed in any Emacs window in which you release. Drag
+outside Emacs and it will be displayed in a new frame. To display the
+last item you want within the listing window itself, press and release
+the Action Key on that item after dragging your other items to their
+respective windows. Remember that you can emulate these drags from
+the keyboard when needed, see <a href="#Keyboard-Drags">Keyboard Drags</a>.
</p>
<p>So now you can put a bunch of buffers and files on your screen wherever
you like. Typically, a brief visual pulse is shown first at the source item and
@@ -2010,38 +2035,71 @@ session since drag actions are not supported without a window system.
<a name="index-window-by-letter"></a>
<a name="index-jump-to-window-by-letter"></a>
<a name="index-keyboard_002c-jump-to-window"></a>
-<p>For even faster keyboard-based display of items, use the Emacs
-package <code>ace-window</code> (see <a href="https://elpa.gnu.org/packages/ace-window.html">https://elpa.gnu.org/packages/ace-window.html</a>).
+<p>For even faster keyboard-based display of items and drag emulations,
+use the Emacs package <code>ace-window</code>
+(see <a href="https://elpa.gnu.org/packages/ace-window.html">https://elpa.gnu.org/packages/ace-window.html</a>).
</p>
<p>The ace-window package assigns short letter IDs to each Emacs window and lets
you jump to or operate upon a specific window by giving its ID. Hyperbole can
add commands to ace-window that replace the two-step drag emulation key
-described above with a single key sequence that displays dired or
-buffer menu <em>items</em>.
+described above with a single key sequence that does not require moving to
+the drag target window since it is specified by ID as part of the command.
</p>
<p>To enable this feature, in your Emacs initialization file after
Hyperbole is initialized, if you do not have a key bound for
<code>ace-window</code>, then call: <code>(hkey-ace-window-setup \&quot;\M-o\&quot;)</code>
-to bind it to <kbd>{M-o}</kbd>. Otherwise, call the setup function without
-a key: <code>(hkey-ace-window-setup)</code>.
+to bind it to <kbd>{M-o}</kbd>, replacing Hyperbole&rsquo;s
+default <code>hkey-operate</code> command there (because ace-window can emulate
+the drags performed by <code>hkey-operate</code>). If you already have a key bound
+for <code>ace-window</code>, then just ensure it is initialized by calling
+<code>(hkey-ace-window-setup)</code> without a key argument.
</p>
<a name="index-link-creation-from-keyboard"></a>
<a name="index-keyboard-link-creation"></a>
<a name="index-M_002do-i-_003cwindow_002did_003e"></a>
+<a name="index-M_002do-m-_003cwindow_002did_003e"></a>
+<a name="index-M_002do-r-_003cwindow_002did_003e"></a>
<a name="index-M_002do-t-_003cwindow_002did_003e"></a>
<a name="index-drag-item"></a>
+<a name="index-replace-window-buffer"></a>
+<a name="index-swap-window-buffers"></a>
<a name="index-throw-item"></a>
+<a name="index-buffer-replace"></a>
+<a name="index-buffers-swap"></a>
<a name="index-item-drag"></a>
<a name="index-item-throw"></a>
<p>After setup, the leftmost character or two of each window&rsquo;s modeline will show
the ID to type to use that window as the drag destination. Then whenever point
is on an item you want displayed in another window, use <kbd>{M-o i
-&lt;id-of-window-to-display-item-in&gt;}</kbd> and watch the magic happen. You can also use
-this command to create explicit button links to other window buffers when in an editable
-buffer rather than on an item. If you want to display multiple items in different
-windows, instead use the <kbd>{M-o t &lt;id-of-window-to-display-item-in&gt;}</kbd> key sequence to
-<em>throw</em> the item to the window.
+&lt;id-of-window-to-display-item-in&gt;}</kbd> and watch the magic happen. If you
+want to display multiple items in different windows, instead use
+the <kbd>{M-o t &lt;id-of-window-to-display-item-in&gt;}</kbd> key sequence to
+<em>throw</em> the item to the window. To <em>replace</em>
+the selected window&rsquo;s buffer with that of another window, use
+<kbd>{M-o r &lt;id-of-window-displaying-desired-buffer&gt;}</kbd>. To instead
+<em>swap</em> the selected window&rsquo;s buffer with that of another window,
+use <kbd>{M-o m &lt;id-of-window-to-swap-with&gt;}</kbd>.
+</p>
+<p>In summary:
+</p><dl compact="compact">
+<dt>M-o i &lt;window&gt;</dt>
+<dd><p>insert listing item at point into &lt;window&gt;; if not on a listing item,
+trigger an error
+</p>
+</dd>
+<dt>M-o m &lt;window&gt;</dt>
+<dd><p>swap the buffers in the selected window and &lt;window&gt;
+</p>
+</dd>
+<dt>M-o r &lt;window&gt;</dt>
+<dd><p>replace the selected (current) window&rsquo;s buffer with that of &lt;window&gt;
</p>
+</dd>
+<dt>M-o t &lt;window&gt;</dt>
+<dd><p>throw listing item at point or current buffer to &lt;window&gt;
+</p></dd>
+</dl>
+
@@ -2280,10 +2338,10 @@ type</em> identifies a pattern or state that when matched triggers
an <em>action</em> associated with the implicit button type. The action
is specified by either a Hyperbole action type (see <a href="#Action-Types">Action Types</a>)
or an Emacs Lisp function. Implicit button types may use the same
-action types that explicit buttons use. As an example, a pathname
-implicit button type would match to any existing local filename or
-directory name and its action would be to display the associated file
-or directory, typically in another window.
+action types that explicit buttons use. As an example, the pathname
+implicit button type matches to any existing local filename or
+directory name and its action displays the associated file or
+directory, typically in another window.
</p>
<a name="index-file_002c-hibtypes_002eel"></a>
<a name="index-context"></a>
@@ -2291,28 +2349,60 @@ or directory, typically in another window.
<a name="index-activating-implicit-button"></a>
<a name="index-menu-item_002c-Ibut_002fAct"></a>
<a name="index-C_002dh-h-i-a"></a>
-<p>Unlike explicit buttons, implicit buttons have no individual button data
-other than their textual labels. You use implicit button types which
-include boolean expressions (predicates) that match to both the label
-and the context required of any button of the type. Each time a Smart
-Key is pressed at a location, Hyperbole evaluates the predicates from
-the list of implicit button types and the first one that evaluates true
-is selected and its associated action is triggered. The Ibut/Act menu
-item, <kbd>{C-h h i a}</kbd>, also activates any implicit button found at the
+<p>Unlike explicit buttons, implicit buttons have no individual button
+data other than their text and optional labels. You use implicit
+button types which include boolean expressions (predicates) that match
+to both the label and the context required of any button of the type.
+Each time a Smart Key is pressed at a location, Hyperbole evaluates
+the predicates from the list of implicit button types and the first
+one that evaluates true is selected and its associated action is
+triggered. Alternatively, you can use the Ibut/Act menu
+item, <kbd>{C-h h i a}</kbd>, to activate any implicit button found at the
current point.
</p>
<p>All of this happens transparently and is easy to use once you try it.
The Hyperbole Smart Keys offer additional extensive context-sensitive
point-and-click type behavior beyond implicit button types. See <a href="#Smart-Key-Operations">Smart Key Operations</a>.
</p>
+<a name="index-implicit-button-labels"></a>
+<a name="index-labeling-implicit-buttons"></a>
+<a name="index-naming-implicit-buttons"></a>
+<p>Individual implicit buttons may be labeled, allowing activation by
+name or use as a link target by other buttons. Here is a pathname
+button with a label of &rsquo;My Emacs Files&rsquo;:
+</p>
+<div class="example">
+<pre class="example">&lt;[My Emacs Files]&gt;: &quot;~/.emacs.d&quot;
+</pre></div>
+
+<p>The label is delimited by &lsquo;<samp>&lt;[</samp>&rsquo; and &lsquo;<samp>]&gt;</samp>&rsquo; and can be followed
+by any number of :, - or = separator characters, including none. You
+can activate the button either from its label or its text. With point
+on an implicit button, <kbd>{C-h h i l}</kbd> will label it or you
+may simply type the label and delimiters manually.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Implicit-Button-Type-Summaries" accesskey="1">Implicit Button Type Summaries</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr>
+<a name="Implicit-Button-Type-Summaries"></a>
+<div class="header">
+<p>
+Previous: <a href="#Implicit-Buttons" accesskey="p" rel="prev">Implicit Buttons</a>, Up: <a href="#Implicit-Buttons" accesskey="u" rel="up">Implicit Buttons</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Implicit-Button-Type-Summaries-1"></a>
+<h4 class="subsection">3.3.1 Implicit Button Type Summaries</h4>
+
<a name="index-ibtypes_002c-list-of"></a>
<a name="index-implicit-button-types"></a>
<p>Below, standard implicit button types are listed in the order in which
Hyperbole tries to match to the types when looking for an implicit
button; <kbd>{C-h h i t <span class="key">RET</span>}</kbd> provides similar information. See
the Hyperbole file, <samp>hibtypes.el</samp>, for complete examples of
-implicit button types (where they are listed in reverse in increasing
-order of priority).
+implicit button types (they are listed in increasing order of
+priority).
</p>
<dl compact="compact">
<dd>
@@ -2434,14 +2524,63 @@ within an error line.
breakpoint line. This works with gdb, dbx, and xdb. Such lines are
recognized in any buffer.
</p>
-<a name="index-ibtypes-grep_002dmsg"></a>
+<a name="index-ibtypes-ripgrep_002dmsg"></a>
<a name="index-grep"></a>
+<a name="index-ripgrep"></a>
+<a name="index-match-lines"></a>
+</dd>
+<dt><code>ripgrep-msg</code></dt>
+<dd><p>Jumps to line associated with a ripgrep (rg) line numbered msg.
+Ripgrep outputs each pathname once followed by all matching lines in
+that pathname. Messages are recognized in any buffer (other than a
+helm completion buffer).
+</p>
+<a name="index-ibtypes-ipython_002dstack_002dframe"></a>
+<a name="index-ipython"></a>
+<a name="index-stack-frame-1"></a>
+</dd>
+<dt><code>ipython-stack-frame</code></dt>
+<dd><p>Jumps to line associated with an ipython stack frame line numbered msg.
+ipython outputs each pathname once followed by all matching lines in that pathname.
+Messages are recognized in any buffer (other than a helm completion buffer).
+</p>
+<a name="index-ibtypes-grep_002dmsg"></a>
+<a name="index-grep-1"></a>
<a name="index-compiler-error-1"></a>
+<a name="index-match-lines-1"></a>
</dd>
<dt><code>grep-msg</code></dt>
<dd><p>Jumps to a line associated with grep or compilation error messages.
Messages are recognized in any buffer.
</p>
+<a name="index-ibtypes-link_002dto_002dibut"></a>
+<a name="index-implicit-button-link"></a>
+<a name="index-link-to-implicit-button"></a>
+<a name="index-ilink"></a>
+</dd>
+<dt><code>link-to-ibut &lt;ilink&gt;</code></dt>
+<dd><p>At point, activates a link to an implicit button within the current buffer.
+Recognizes the format ’&lt;ilink:’ &lt;button label&gt; ’&gt;’, e.g. &lt;ilink: my sequence of keys&gt;.
+</p>
+<a name="index-ibtypes-link_002dto_002dgbut"></a>
+<a name="index-global-button-link"></a>
+<a name="index-link-to-global-button"></a>
+<a name="index-glink"></a>
+</dd>
+<dt><code>link-to-gbut &lt;glink&gt;</code></dt>
+<dd><p>At point, activates a link to a global button.
+The global button’s action is executed in the context of the current buffer.
+Recognizes the format ’&lt;glink:’ &lt;button label&gt; ’&gt;’, e.g. &lt;glink: open todos&gt;.
+</p>
+<a name="index-ibtypes-link_002dto_002debut"></a>
+<a name="index-explicit-button-link"></a>
+<a name="index-link-to-explicit-button"></a>
+<a name="index-elink"></a>
+</dd>
+<dt><code>link-to-ebut &lt;elink&gt;</code></dt>
+<dd><p>At point, activates a link to an explicit button within the current buffer.
+Recognizes the format ’&lt;elink:’ &lt;button label&gt; ’&gt;’, e.g. &lt;elink: project-list&gt;.
+</p>
<a name="index-ibtypes-klink"></a>
<a name="index-klink"></a>
<a name="index-koutline-link"></a>
@@ -2477,11 +2616,13 @@ retrievals.
</p>
<a name="index-ibtypes-kbd_002dkey"></a>
<a name="index-key-sequence"></a>
+<a name="index-sequence-of-keys"></a>
</dd>
<dt><code>kbd-key</code></dt>
-<dd><p>Executes a key sequence found around point, delimited by curly braces, {}, if any.
-Key sequences should be in human readable form, e.g. <kbd>{C-x C-b}</kbd>. Formats such
-as {^x^b} will not be recognized.
+<dd><p>Executes a key series (series of key sequences) found around point,
+delimited by curly braces, {}, if any. Key series should be in
+human readable form, e.g. <kbd>{C-x C-b}</kbd>. Formats such as {^x^b}
+will not be recognized.
</p>
<p>Any key sequence must be a string of one of the following:
</p><ul>
@@ -2497,7 +2638,7 @@ as {^x^b} will not be recognized.
</dd>
<dt><code>dir-summary</code></dt>
<dd><p>Detects filename buttons in files named &quot;MANIFEST&quot; or &quot;DIR&quot;.
-Displays selected files. Each file name must be at the beginning of the
+Displays selected files. Each filename must be at the beginning of the
line and must be followed by one or more spaces and then another
non-space, non-parenthesis, non-brace character.
</p>
@@ -2507,7 +2648,7 @@ non-space, non-parenthesis, non-brace character.
</dd>
<dt><code>text-toc</code></dt>
<dd><p>Jumps to the text file section referenced by a table of contents entry
-at point. The file name of the current buffer must contain
+at point. The filename of the current buffer must contain
<samp>README</samp> and there must be a &lsquo;Table of Contents&rsquo; or &lsquo;Contents&rsquo;
label on a line by itself (it may begin with an asterisk), preceding the
table of contents. Each toc entry must begin with some whitespace
@@ -2624,7 +2765,7 @@ produced by git log.
</dd>
<dt><code>github-reference</code></dt>
<dd><p>Displays the Github entity associated with REFERENCE and optional USER and PROJECT.
-See <samp>DEMO#Github (Remote) References</samp> for examples.
+See <samp>../DEMO#Github (Remote) References</samp> for examples.
</p>
<p>REFERENCE is a string of one of the following forms:
</p><ul>
@@ -2659,6 +2800,51 @@ If given, PROJECT overrides any project value in REFERENCE. If no
PROJECT value is provided, it defaults to the value of
<code>hibtypes-github-default-project</code>.
</p>
+<a name="index-ibtypes-gitlab_002dreference"></a>
+<a name="index-gitlab-reference"></a>
+<a name="index-version-control-3"></a>
+<a name="index-hibtypes_002dgitlab_002ddefault_002dproject"></a>
+<a name="index-hibtypes_002dgitlab_002ddefault_002duser"></a>
+</dd>
+<dt><code>gitlab-reference</code></dt>
+<dd><p>Displays the Gitlab entity associated with REFERENCE and optional USER and PROJECT.
+See <samp>../DEMO#Gitlab (Remote) References</samp> for examples.
+</p>
+<p>REFERENCE is a string of one of the following forms:
+</p><ul>
+<li> &lt;ref-item&gt;
+</li><li> &lt;user&gt;/&lt;project&gt;/&lt;ref-item&gt;
+</li><li> &lt;project&gt;/&lt;ref-item&gt;
+</li><li> /&lt;group&gt;/&lt;project&gt;.
+or
+</li><li> /&lt;project-or-group&gt; (where a group is a colection of projects)
+</li></ul>
+
+<p>&lt;ref-item&gt; is one of these:
+</p><dl compact="compact">
+<dt>&bull; one of the words: activity, analytics, boards or kanban, branches, commits, contributors, groups, issues or list, jobs, labels, merge_requests, milestones, pages, pipelines, pipeline_charts, members or people or staff, projects, pulls, schedules, snippets, status or tags</dt>
+<dd><p>the associated items are listed
+</p></dd>
+<dt>&bull; one of the words: branch, commit(s), issue(s), milestone(s), pull(s), snippet(s) or tag(s) followed by a &rsquo;/&rsquo; or &rsquo;=&rsquo; and an item-id</dt>
+<dd><p>the item is shown
+</p></dd>
+<dt>&bull; an issue reference given by a positive integer, e.g. <em>92</em> or prefaced with <em>GL-</em>, like GL-92</dt>
+<dd><p>the issue is displayed
+</p></dd>
+<dt>&bull; a commit reference given by a hex number, 55a1f0</dt>
+<dd><p>the commit diff is displayed
+</p></dd>
+<dt>&bull; a branch or tag reference given by an alphanumeric name, e.g. hyper20</dt>
+<dd><p>the files in the branch are listed.
+</p></dd>
+</dl>
+
+<a name="index-hibtypes_002dgitlab_002ddefault_002duser-1"></a>
+<p>USER defaults to the value of <code>hibtypes-gitlab-default-user</code>.
+If given, PROJECT overrides any project value in REFERENCE. If no
+PROJECT value is provided, it defaults to the value of
+<code>hibtypes-gitlab-default-project</code>.
+</p>
<a name="index-ibtypes-social_002dreference"></a>
<a name="index-hashtag"></a>
<a name="index-username"></a>
@@ -2763,11 +2949,12 @@ at line-num and optional column-num. Also works for remote pathnames.
</dd>
<dt><code>pathname</code></dt>
<dd><p>Makes a valid pathname display the path entry. Also works for
-delimited and non-delimited remote pathnames, Texinfo <samp></samp> entries,
-and hash-style link references to HTML, Markdown or Emacs outline
-headings. Emacs Lisp library files (filenames without any directory
-component that end in .el and .elc) are looked up using
-the <code>load-path</code> directory list.
+delimited and non-delimited remote pathnames, Texinfo @file{}
+entries, and hash-style link references to HTML, Markdown or Emacs
+outline headings, and MSWindows paths (see <samp>${hyperb:dir}/DEMO#POSIX
+and MSWindows Paths</samp> for details). Emacs Lisp library files
+(filenames without any directory component that end in .el and .elc)
+are looked up using the <code>load-path</code> directory list.
</p>
<p>See the function documentation for <code>hpath:at-p</code> for possible
delimiters. See the variable documentation for <code>hpath:suffixes</code> for
@@ -2776,21 +2963,38 @@ for a valid match. See the function documentation for <code>hpath:find</code>
for special file display options.
</p>
<a name="index-ibtypes-org_002dmode"></a>
-<a name="index-browse_002durl_002dbrowser_002dfunction-1"></a>
<a name="index-org_002dmode"></a>
<a name="index-Org-mode"></a>
+<a name="index-radio-target"></a>
+<a name="index-code-block"></a>
+<a name="index-C_002dc-C_002dc"></a>
+<a name="index-M_002dRET-1"></a>
+<a name="index-org_002dctrl_002dc_002dctrl_002dc"></a>
+<a name="index-org_002dmeta_002dreturn"></a>
</dd>
<dt><code>org-mode</code></dt>
-<dd><p>The Action Key follows any Org mode link at point or cycles through
-views of the outline subtree at point. In any other context besides
-the end of a line, the Action Key will invoke the Org mode standard
-binding of <kbd>{M-<span class="key">RET</span>}</kbd>, (org-meta-return). The Assist Key on
-an Org mode heading cycles through views of the whole buffer outline
-and on an Org mode link, displays standard Hyperbole help.
+<dd><p>For users of Emacs Org mode, Hyperbole does quite a few things.
+</p>
+<p>First, the Action Key follows internal links in Org mode files. When
+pressed on a link referent/target, the link definition is displayed,
+allowing two-way navigation between definitions and targets.
+</p>
+<p>Second, the Action Key follows Org mode external links. The Assist
+Key displays help when pressed on an Org mode link.
+</p>
+<p>Third, within a radio target definition, the Action Key jumps to the
+first occurrence of an associated radio target.
</p>
-<p>The variable, <code>browse-url-browser-function</code>, customizes the url
-browser that is used for urls. Valid values of this variable
-include <code>browse-url-default-browser</code> and <code>browse-url-generic</code>.
+<p>Fourth, when point is on an outline heading in Org mode, the Action Key
+cycles the view of the subtree at point and the Assist Key cycles the
+view of all headings in the buffer.
+</p>
+<p>Fifth, with point on the first line of a code block definition, the
+Action Key executes the code block via the Org mode standard binding
+of <kbd>{C-c C-c}</kbd>, <code>org-ctrl-c-ctrl-c</code>.
+</p>
+<p>In any other context besides the end of a line, the Action Key invokes
+the Org mode standard binding of <kbd>{M-RET}</kbd>, <code>org-meta-return</code>.
</p>
<a name="index-ibtypes-doc_002did"></a>
<a name="index-online-library"></a>
@@ -2978,7 +3182,7 @@ signalled.
<a name="index-actypes-link_002dto_002debut"></a>
</dd>
<dt><code>link-to-ebut</code></dt>
-<dd><p>Performs an action given by another explicit button, specified by KEY and KEY-FILE.
+<dd><p>Performs an action given by an explicit button, specified by KEY and KEY-FILE.
</p>
<a name="index-actypes-link_002dto_002delisp_002ddoc"></a>
</dd>
@@ -2996,6 +3200,11 @@ the buffer is displayed with POINT at the top of the window.
<dt><code>link-to-file-line</code></dt>
<dd><p>Displays a file given by PATH scrolled to LINE-NUM.
</p>
+<a name="index-actypes-link_002dto_002dgbut"></a>
+</dd>
+<dt><code>link-to-gbut</code></dt>
+<dd><p>Performs an action given by an existing global button, specified by KEY.
+</p>
<a name="index-actypes-link_002dto_002dInfo_002dindex_002ditem"></a>
</dd>
<dt><code>link-to-Info-index-item</code></dt>
@@ -3012,6 +3221,11 @@ available. Filename may be given without the .info suffix.&quot;
filename and nodename is available. Filename may be given without the
.info suffix.
</p>
+<a name="index-actypes-link_002dto_002dibut"></a>
+</dd>
+<dt><code>link-to-ibut</code></dt>
+<dd><p>Performs an action given by an implicit button, specified by KEY-FILE, KEY and optional POINT.
+</p>
<a name="index-actypes-link_002dto_002dkcell"></a>
<a name="index-kcell_003aref_002dto_002did"></a>
</dd>
@@ -3108,15 +3322,18 @@ at point.
<a name="index-URL-1"></a>
<a name="index-World_002dwide-Web-1"></a>
<a name="index-WWW-1"></a>
-<a name="index-browse_002durl_002dbrowser_002dfunction-2"></a>
+<a name="index-browse_002durl_002dbrowser_002dfunction-1"></a>
</dd>
<dt><code>www-url</code></dt>
<dd><p>Follows a link given by a URL. The variable,
<code>browse-url-browser-function</code>, customizes the url browser
-that is used. See its documentation string for details.
+that is used. Valid values of this variable include
+<code>browse-url-default-browser</code> and <code>browse-url-generic</code>.
+See its documentation string for details.
</p></dd>
</dl>
+
<a name="index-action-1"></a>
<a name="index-hui_003aebut_002dprompt_002dfor_002daction"></a>
<p>Action types create a convenient way of specifying button behavior
@@ -3272,12 +3489,14 @@ upon the referent context in which the Action Key is released.
<div class="example">
<pre class="example">Referent Context Link Type
----------------------------------------------------
+Global Button link-to-gbut
Explicit Button link-to-ebut
+Implicit Button link-to-ibut
Info Index Item link-to-Info-index-item
Info Node link-to-Info-node
Mail Reader Message link-to-mail
Directory Name link-to-directory
-File Name link-to-file
+Filename link-to-file
Koutline Cell link-to-kcell
Outline Heading link-to-string-match
Buffer attached to File link-to-file
@@ -3792,7 +4011,7 @@ access to popular web search engines.
</p>
<p>Below are each of the commands on the Find menu.
</p>
-<a name="index-match-lines"></a>
+<a name="index-match-lines-2"></a>
<a name="index-remove-lines"></a>
<a name="index-save-lines"></a>
<a name="index-locate-files"></a>
@@ -4870,7 +5089,7 @@ level to insertion at the child level.
<dt><kbd>{C-u C-c c}</kbd></dt>
<dd><p>Copy &lt;tree&gt; to follow as the first child of &lt;cell&gt;.
</p>
-<a name="index-C_002dc-C_002dc"></a>
+<a name="index-C_002dc-C_002dc-1"></a>
</dd>
<dt><kbd>{C-c C-c}</kbd></dt>
<dd><p>Copy &lt;tree&gt; to be the predecessor of &lt;cell&gt;.
@@ -5139,8 +5358,8 @@ Next: <a href="#Exporting" accesskey="n" rel="next">Exporting</a>, Previous: <a
<a name="index-outline_002c-foreign-file"></a>
<p>The paragraphs of another buffer or file may be inserted into a koutline
as a set of cells by using the <kbd>{C-x i}</kbd> command. When prompted,
-you may use a buffer name or file name from which to insert;
-completion is provided for file names only.
+you may use a buffer name or filename from which to insert;
+completion is provided for filenames only.
</p>
<a name="index-koutliner_002c-C_002du-C_002dx-i"></a>
<p>The elements from the original buffer are converted into kcells and
@@ -5172,7 +5391,7 @@ entire file into the current cell following point.
files. You can import a file into an existing koutline,
following the tree at point, or can create a new koutline from the
imported file contents. <kbd>{M-x kimport:file <span class="key">RET</span>}</kbd> selects the
-importation type based on the buffer or file name suffix of the file to
+importation type based on the buffer or filename suffix of the file to
import.
</p>
<a name="index-kotl_002dmode-1"></a>
@@ -5233,7 +5452,7 @@ World-Wide Web.
</p>
<p><kbd>{M-x kexport:html <span class="key">RET</span>}</kbd> prompts for the koutline buffer or
file to export, the HTML file or buffer to which to output, and the
-title to use for the HTML file. Completion of file names is provided.
+title to use for the HTML file. Completion of filenames is provided.
The conversion will then be done and the output file or buffer will be
written; the output file will not be displayed.
</p>
@@ -5595,7 +5814,7 @@ that reference the cell.
<dt><em>create-time</em></dt>
<dd><p>The time at which the cell was created. This is stored in a form that
allows for easy data comparisons but is displayed in a human readable
-format, such as &lsquo;<samp>Jan 28 18:27:59 CST 2017</samp>&rsquo;.
+format, such as &lsquo;<samp>Jan 28 18:27:59 CST 2019</samp>&rsquo;.
</p></dd>
</dl>
@@ -5727,7 +5946,7 @@ automatically added by HyRolo whenever a new record is added.
==================================================================
* Smith, John &lt;js@hiho.com&gt; W708-555-2001 F708-321-1492
Chief Ether Maintainer, HiHo Industries
- 05/24/2017
+ 05/24/2019
</pre></div>
<p>We call rolo records, <em>entries</em>. Entries begin with a delimiter
@@ -6099,7 +6318,7 @@ list. In general, you should leave your personal rolo file as the
first entry in the list, since this is the only file to which the Add
command on the rolo menu adds entries.
</p>
-<p>Hyperbole releases earlier than 4.17 used a different file name for the
+<p>Hyperbole releases earlier than 4.17 used a different filename for the
personal rolo. If such a file exists, you will be prompted to rename
it whenever the HyRolo system is loaded.
</p>
@@ -6668,7 +6887,7 @@ identifier or a permanent idstamp.
<a name="index-argument_002c-mail-message"></a>
</dd>
<dt><code>+M</code></dt>
-<dd><p>Prompts for a mail message date and the file name in which it resides.
+<dd><p>Prompts for a mail message date and the filename in which it resides.
The mail parameters prompted for by this character code may change in
the future.
</p>
@@ -7194,13 +7413,13 @@ windows exist within a frame.
<a name="index-gbut_003afile"></a>
</dd>
<dt><b>Global Button</b></dt>
-<dd><p>A form of explicit button which is accessed by name rather than direct
+<dd><p>A Hyperbole button which is accessed by name rather than direct
selection. Global buttons are useful when one wants quick access to
actions such as jumping to common file locations or for performing
-sequences of operations. One need not locate them since they are always
-available by name, with full completion offered. All global buttons are
-stored in the file given by the variable <code>gbut:file</code> and may be
-activated as regular explicit buttons by visiting this file. By
+sequences of operations. One need not locate them since they are
+always available by name, with full completion offered. All global
+buttons are stored in the file given by the variable <code>gbut:file</code>
+and may be activated with the Action Key when editing this file. By
default, this is the same as the user&rsquo;s personal button file.
</p>
</dd>
@@ -7255,7 +7474,8 @@ DataBase (BBDB) package.
</dd>
<dt><b>Implicit Button</b></dt>
<dd><p>A button recognized contextually by Hyperbole. Such buttons contain no
-button data. See also <b>implicit button type</b>.
+button data but may have an optional preceding label that looks like this:
+&lsquo;<samp>&lt;[label]&gt;</samp>&rsquo;. See also <b>implicit button type</b>.
</p>
</dd>
<dt><b>Implicit Button Type</b></dt>
@@ -7265,7 +7485,20 @@ to documents created and managed by tools other than Hyperbole, for
example, programming documentation. <b>Ibtype</b> is a synonym for
implicit button type. See also <b>system encapsulation</b>.
</p>
-
+<a name="index-InfoDock"></a>
+</dd>
+<dt><b>InfoDock</b></dt>
+<dd><p>InfoDock was an integrated productivity toolset for software engineers
+and knowledge workers built atop XEmacs; it is no longer maintained or
+updated. An older version from 1999 may be found at
+infodock.sf.net.
+</p>
+<p>InfoDock has much of the power of GNU Emacs, but with an
+easier to use and more comprehensive menu-based user interface. Most
+objections people raise to using emacs have already been addressed in
+InfoDock. InfoDock was meant for people who wanted a complete,
+pre-customized environment in one package.
+</p>
</dd>
<dt><b>Instance Number</b></dt>
<dd><p>A colon prefaced number appended to the label of a newly created button
@@ -7280,6 +7513,16 @@ any number of buttons with the same base label within a single buffer.
<p>Jedi is a Emacs package for Python completion, definition and documentation lookup.
</p>
</dd>
+<dt><b>Key Sequence</b></dt>
+<dd><p>A single sequence of keys that can invoke an Emacs command.
+</p>
+</dd>
+<dt><b>Key Series</b></dt>
+<dd><p>A series of one or more Emacs key sequences delimited by braces that
+Hyperbole processes when activated as an implicit button, as if the
+keys were typed in by the user.
+</p>
+</dd>
<dt><b>Koutline</b></dt>
<dd><p>A hierarchically ordered grouping of cells which may be stored as a file
and viewed and edited as an outline.
@@ -7530,12 +7773,11 @@ Next: <a href="#Invocation" accesskey="n" rel="next">Invocation</a>, Previous: <
installed by using the Emacs Package Manager. If you are not familiar
with it, see <a href="http://www.gnu.org/software/emacs/manual/html_mono/emacs.html#Packages">Packages</a> in <cite>the GNU Emacs Manual</cite>.
</p>
-<p>If you have Hyperbole 5.10 or higher installed and simply want to
-upgrade it, invoke the Emacs Package Manager with <kbd>{M-x
-list-packages <span class="key">RET</span>}</kbd>, then use the <kbd>{U}</kbd> key followed by
-the <kbd>{x}</kbd> key to upgrade all out-of-date packages, Hyperbole among
-them. Then skip the text below and move on to the next
-section, see <a href="#Invocation">Invocation</a>.
+<p>If you have Hyperbole installed and simply want to upgrade it, invoke
+the Emacs Package Manager with <kbd>{M-x list-packages <span class="key">RET</span>}</kbd>,
+then use the <kbd>{U}</kbd> key followed by the <kbd>{x}</kbd> key to upgrade all
+out-of-date packages, Hyperbole among them. Then skip the text below
+and move on to the next section, see <a href="#Invocation">Invocation</a>.
</p>
<p>Otherwise, to download and install the Hyperbole package, you should add
several lines to your personal Emacs initialization file, <samp>~/.emacs</samp>.
@@ -7724,25 +7966,86 @@ Next: <a href="#Internal-Viewers" accesskey="n" rel="next">Internal Viewers</a>,
<a name="index-referent-display"></a>
<a name="index-link-display"></a>
<a name="index-display-where"></a>
+<a name="index-display-outside-Emacs"></a>
<a name="index-where-to-display"></a>
-<p>Hyperbole lets you control where link referents are displayed and even
-what Emacs function or external program is used to display them.
-There are three categories of referents, each with its own display
-setting:
-</p><div class="example">
+<a name="index-image-display"></a>
+<a name="index-internal-display"></a>
+<a name="index-external-display"></a>
+<p>Hyperbole lets you control where link referents are displayed. It also
+permits setting a specific Emacs function or external program
+to display them. There are four categories of referents, each with
+its own display setting, listed in decreasing order of priority. All
+of these variables are defined within <samp>hpath.el</samp>.
+</p>
+<div class="example">
<pre class="example">Referent Category Variable Setting
========================================================================
-Internal Standard Display hpath:display-where
+Internal Image Display hpath:native-image-suffixes
Internal Custom Display hpath:internal-display-alist
External Display hpath:external-display-alist
+Internal Standard Display hpath:display-where
</pre></div>
+<p>Continue reading the next sections for information on how referents
+are displayed internally and externally.
+</p>
+<hr>
+<a name="Internal-Viewers"></a>
+<div class="header">
+<p>
+Next: <a href="#External-Viewers" accesskey="n" rel="next">External Viewers</a>, Previous: <a href="#Referent-Display" accesskey="p" rel="prev">Referent Display</a>, Up: <a href="#Customization" accesskey="u" rel="up">Customization</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Internal-Viewers-1"></a>
+<h4 class="subsection">B.3.2 Internal Viewers</h4>
+<a name="index-hpath_003ainternal_002ddisplay_002dalist"></a>
+<a name="index-file-display-function"></a>
+<a name="index-display-function"></a>
+<a name="index-internal-viewer"></a>
+<a name="index-link_002c-display-function"></a>
+
+<a name="index-internal-image-display"></a>
+<a name="index-hpath_003anative_002dimage_002dsuffixes"></a>
+<a name="index-internal-custom-display"></a>
+<a name="index-hpath_003ainternal_002ddisplay_002dalist-1"></a>
+<a name="index-internal-standard-display"></a>
+<a name="index-hpath_003adisplay_002dwhere-1"></a>
+<p>When given a filename to display, Hyperbole first checks if its suffix
+is matched by <code>hpath:native-image-suffixes</code>. If so and if the
+function <code>image-mode</code> is defined, it uses that mode together with
+the value of <code>hpath:display-where</code> to display the image within an
+Emacs buffer.
+</p>
+<p>If no match is found, the <code>hpath:internal-display-alist</code> variable
+is checked for a filename match. Its value is an association list
+whose elements are (&lt;file-name-regular-expression&gt;
+. &lt;function-of-one-arg&gt;) pairs. Any path whose name matches
+a &lt;file-name-regular-expression&gt; will be displayed by calling the
+associated &lt;function-of-one-arg&gt; with the filename as the argument.
+The first regular expression that matches each filename is the one
+used. This can be used to format raw data files for convenient
+display.
+</p>
+<p>By default, this setting handles the following types of files:
+</p><dl compact="compact">
+<dt><em>Audio Files</em></dt>
+<dd><p>Major audio format files are played with the <code>play-sound-file</code> command.
+</p></dd>
+<dt><em>Info Manuals</em></dt>
+<dd><p>Files with a <samp>.info</samp> suffix (may also be compressed) are displayed in the Info browser.
+</p></dd>
+<dt><em>RDB Files</em></dt>
+<dd><p>Files with an <samp>.rdb</samp> suffix are displayed as relational databases using the RDB package
+available with InfoDock.
+</p></dd>
+</dl>
+
<a name="index-menu_002c-Cust_002fReferents"></a>
<a name="index-C_002dh-h-c-r"></a>
-<p>Regular file links are displayed in an Emacs window specified by the
-<code>hpath:display-where</code> setting which may be changed with the Cust/Referents
-<kbd>{C-h h c r}</kbd> menu.
+<p>Links to standard files, those which don&rsquo;t match any special referent
+category described earlier, are displayed in an Emacs window specified
+by the <code>hpath:display-where</code> setting. It may be changed with the
+Cust/Referents <kbd>{C-h h c r}</kbd> menu.
</p>
<p>Available options are:
</p>
@@ -7764,7 +8067,7 @@ External Display hpath:external-display-alist
the default)
</p></dd>
<dt><em>&bull; Single-Win</em></dt>
-<dd><p>Display in a window of the selected frame and delete its other windows
+<dd><p>Display in a window of the selected frame and delete its other windows
</p></dd>
</dl>
@@ -7775,51 +8078,7 @@ the default)
<img src="im/menu-display-referents.png" alt="Display Referents Menu">
<div class="float-caption"><p><strong>Image B.2: </strong>Display Referents Menu</p></div></div><br>
-<p>Continue reading the next sections for information on custom Internal
-and External Viewers for link referencts.
-</p>
-<hr>
-<a name="Internal-Viewers"></a>
-<div class="header">
-<p>
-Next: <a href="#External-Viewers" accesskey="n" rel="next">External Viewers</a>, Previous: <a href="#Referent-Display" accesskey="p" rel="prev">Referent Display</a>, Up: <a href="#Customization" accesskey="u" rel="up">Customization</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
-</div>
-<a name="Internal-Viewers-1"></a>
-<h4 class="subsection">B.3.2 Internal Viewers</h4>
-<a name="index-hpath_003ainternal_002ddisplay_002dalist"></a>
-<a name="index-file-display-function"></a>
-<a name="index-display-function"></a>
-<a name="index-internal-viewer"></a>
-<a name="index-link_002c-display-function"></a>
-<p>When given a file name, Hyperbole will by default display the file for
-editing within an Emacs buffer. The <code>hpath:internal-display-alist</code>
-variable can be used to specify file name patterns, such as matching
-suffixes, which will invoke a special Emacs Lisp function to display
-any matching files within Emacs. This can be used to format raw data
-files for convenient display.
-</p>
-<p>For those who want to change this variable, <code>hpath:internal-display-alist</code>
-is defined in <samp>hpath.el</samp>. Its value is an association list whose
-elements are (&lt;file-name-regular-expression&gt; . &lt;function-of-one-arg&gt;)
-pairs. Any path whose name matches a &lt;file-name-regular-expression&gt;
-will be displayed by calling the associated &lt;function-of-one-arg&gt; with
-the file name as the argument.
-</p>
-<p>By default, this variable handles the following types of files:
-</p><dl compact="compact">
-<dt><em>Audio Files</em></dt>
-<dd><p>Major audio format files are played with the <code>play-sound-file</code> command.
-</p></dd>
-<dt><em>Info Manuals</em></dt>
-<dd><p>Files with a <samp>.info</samp> suffix (may also be compressed) are displayed in the Info browser.
-</p></dd>
-<dt><em>RDB Files</em></dt>
-<dd><p>Files with an <samp>.rdb</samp> suffix are displayed as relational databases using the RDB package
-available with InfoDock.
-</p></dd>
-</dl>
-
-<p>See <a href="#External-Viewers">External Viewers</a>, for instructions on associating file names with
+<p>See <a href="#External-Viewers">External Viewers</a>, for instructions on associating filenames with
external, window-system specific viewers.
</p>
<hr>
@@ -7838,10 +8097,13 @@ Next: <a href="#Link-Variable-Substitution" accesskey="n" rel="next">Link Variab
<a name="index-external-program"></a>
<a name="index-external-viewer"></a>
<a name="index-link_002c-viewer-program"></a>
-<p>If you will be using Hyperbole under a window system,
-the <code>hpath:get-external-display-alist</code> function
-in <samp>hpath.el</samp> supports hyperlinks that open files using external, non-Emacs
-tools, e.g. a pdf reader or a vector graphic viewer.
+
+<a name="index-external-display-1"></a>
+<a name="index-hpath_003aexternal_002ddisplay_002dalist"></a>
+<p>If you use Hyperbole under a window system,
+the <code>hpath:get-external-display-alist</code> function in <samp>hpath.el</samp>
+supports hyperlinks that open files using external, non-Emacs tools, e.g.
+a pdf reader or a vector graphics viewer.
</p>
<p>The value returned by <code>hpath:get-external-display-alist</code> is determined
based on the window system supported by the current frame and the version
@@ -7851,8 +8113,8 @@ path whose name matches a &lt;file-name-regular-expression&gt; will be
displayed using the corresponding viewer-program or the first
viewer-program found on the system from a list of programs. If a
&lt;viewer-program&gt; entry contains a &lsquo;<samp>%s</samp>&rsquo; string, the filename to
-display will be substituted at that point within the string.
-Otherwise, the filename will be appended to the &lt;viewer-program&gt;
+display is substituted at that point within the string.
+Otherwise, the filename is appended to the &lt;viewer-program&gt;
entry. Alternatively, the viewer-program may be a Lisp function that
takes a single filename argument.
</p>
@@ -7862,14 +8124,7 @@ for each available window system: <code>hpath:external-display-alist-macos</code
<code>hpath:external-display-alist-x</code>. Examine and modify these
values to suit your needs.
</p>
-<a name="index-MIME"></a>
-<a name="index-mailcap"></a>
-<a name="index-external-viewer-1"></a>
-<p>On systems that have a MIME mailcap file (see
-<samp>www.wikiwand.com/en/Mailcap</samp>), this is used as a fallback
-set of external viewer associations when none are found
-within <code>hpath:get-external-display-alist</code>.
-</p>
+
<hr>
<a name="Link-Variable-Substitution"></a>
<div class="header">
@@ -7890,16 +8145,15 @@ compared against the values in <code>hpath:variables</code>. The first
match found, if any, is selected and its associated variable name is
substituted into the link pathname, in place of its literal value.
When a link button is activated, potentially at a different site,
-Hyperbole replaces each variable within the link pathname with the
-first matching value from this list to recreate the literal pathname.
+Hyperbole replaces each variable in the link pathname with the first
+matching value from this list to recreate the literal pathname.
Environment variables are also replaced whenever link paths are
resolved.
</p>
<p>This permits sharing of links over wide areas, where the variable values
differ between link creator and link activator. The entire process
is wholly transparent to the user; it is explained here simply to help
-you in deciding whether or not to modify the value of
-<code>hpath:variables</code>.
+you in deciding whether or not to modify the value of <code>hpath:variables</code>.
</p>
<hr>
<a name="Web-Search-Engines"></a>
@@ -7981,7 +8235,7 @@ Hyperbole: <code>(hpath:find-file-urls-mode 1)</code>.
<a name="index-URLs_002c-abbreviated"></a>
<a name="index-Tramp-1"></a>
<p>Both full URLs and abbreviated ones, like <samp>www.gnu.org</samp>, are
-recognized. File name completion does not work with URLs; you
+recognized. filename completion does not work with URLs; you
have to type or paste in the entire URL. This feature will work only
if you have the builtin Tramp Emacs Lisp package; if you don&rsquo;t have
Tramp, an error message will be displayed when you try to enable
@@ -8017,9 +8271,11 @@ through invisible/hidden text, making the text temporarily visible
until point moves past that hidden part. When a search match is
selected, the surrounding text remains visible.
</p>
-<p>This command toggles that setting (turns it off if a prefix
-argument less than or equal to 0 is given) and makes searches look at
-only visible text.
+<p>You can temporarily disable searching of hidden text by typing <kbd>{M-s i}</kbd>
+while in an incremental search. This key sequence toggles that
+setting and makes searches look at only visible text (or the reverse
+when invoked again). The setting lasts only through the current
+interactive search.
</p>
<hr>
<a name="Button-Colors"></a>
@@ -8096,7 +8352,7 @@ shown here:
</p>
<dl compact="compact">
<dd><a name="index-key-binding_002c-M_002dRET"></a>
-<a name="index-M_002dRET-1"></a>
+<a name="index-M_002dRET-2"></a>
</dd>
<dt><kbd>{M-<span class="key">RET</span>}</kbd></dt>
<dd><p>Action Key: Invoke the Action Key in the present context.
@@ -8635,7 +8891,7 @@ Called from a program, takes three args: START, END and COLUMN.
<dt><code>kimport:insert-file <kbd>{C-x i}</kbd></code></dt>
<dd><p>Insert each paragraph in IMPORT-FROM as a separate cell in the current view.
Insert as sibling cells following the current cell. IMPORT-FROM may be a
-buffer name or file name (file name completion is provided).
+buffer name or filename (filename completion is provided).
</p>
<a name="index-kimport_003ainsert_002dregister"></a>
</dd>
@@ -9338,23 +9594,25 @@ Previous: <a href="#Smart-Mouse-Keys" accesskey="p" rel="prev">Smart Mouse Keys<
<h3 class="section">E.2 Smart Keyboard Keys</h3>
<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Treemacs" accesskey="1">Smart Key - Treemacs</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Company-Mode" accesskey="1">Smart Key - Company Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Treemacs" accesskey="2">Smart Key - Treemacs</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Emacs-Pushbuttons" accesskey="2">Smart Key - Emacs Pushbuttons</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Emacs-Pushbuttons" accesskey="3">Smart Key - Emacs Pushbuttons</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Argument-Completion" accesskey="3">Smart Key - Argument Completion</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Argument-Completion" accesskey="4">Smart Key - Argument Completion</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="4">Smart Key - ID Edit Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="5">Smart Key - ID Edit Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029" accesskey="5">Smart Key - Emacs Cross-references (Xrefs)</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029" accesskey="6">Smart Key - Emacs Cross-references (Xrefs)</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Smart-Scrolling" accesskey="6">Smart Key - Smart Scrolling</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Smart-Scrolling" accesskey="7">Smart Key - Smart Scrolling</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Smart-Menus" accesskey="7">Smart Key - Smart Menus</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Smart-Menus" accesskey="8">Smart Key - Smart Menus</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Dired-Mode" accesskey="8">Smart Key - Dired Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Dired-Mode" accesskey="9">Smart Key - Dired Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Hyperbole-Buttons" accesskey="9">Smart Key - Hyperbole Buttons</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Hyperbole-Buttons">Smart Key - Hyperbole Buttons</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-View-Mode">Smart Key - View Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
@@ -9368,6 +9626,8 @@ Previous: <a href="#Smart-Mouse-Keys" accesskey="p" rel="prev">Smart Mouse Keys<
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Pages-Directory-Mode">Smart Key - Pages Directory Mode</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Identifier-Menu-Mode">Smart Key - Identifier Menu Mode </a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-C-Source-Code">Smart Key - C Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
@@ -9382,8 +9642,6 @@ Previous: <a href="#Smart-Mouse-Keys" accesskey="p" rel="prev">Smart Mouse Keys<
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-JavaScript-Source-Code">Smart Key - JavaScript Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
-</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Objective_002dC-Source-Code">Smart Key - Objective-C Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="#Smart-Key-_002d-Fortran-Source-Code">Smart Key - Fortran Source Code</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
@@ -9422,14 +9680,37 @@ Previous: <a href="#Smart-Mouse-Keys" accesskey="p" rel="prev">Smart Mouse Keys<
</td></tr>
</table>
+
+<hr>
+<a name="Smart-Key-_002d-Company-Mode"></a>
+<div class="header">
+<p>
+Next: <a href="#Smart-Key-_002d-Treemacs" accesskey="n" rel="next">Smart Key - Treemacs</a>, Previous: <a href="#Smart-Keyboard-Keys" accesskey="p" rel="prev">Smart Keyboard Keys</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Smart-Key-_002d-Company-Mode-1"></a>
+<h4 class="subsection">E.2.1 Smart Key - Company Mode</h4>
+
+<a name="index-company_002dmode"></a>
+<a name="index-completion-2"></a>
+<p>Company mode is an extensive in-buffer completion framework, often used to complete programming identifiers.
+</p>
+<div class="format">
+<pre class="format">When company-mode is active:
+ ACTION KEY
+ Displays selected item&rsquo;s definition.
+ ASSIST KEY
+ Displays the documentation, if any, for the selected item.
+</pre></div>
+
+
<hr>
<a name="Smart-Key-_002d-Treemacs"></a>
<div class="header">
<p>
-Next: <a href="#Smart-Key-_002d-Emacs-Pushbuttons" accesskey="n" rel="next">Smart Key - Emacs Pushbuttons</a>, Previous: <a href="#Smart-Keyboard-Keys" accesskey="p" rel="prev">Smart Keyboard Keys</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+Next: <a href="#Smart-Key-_002d-Emacs-Pushbuttons" accesskey="n" rel="next">Smart Key - Emacs Pushbuttons</a>, Previous: <a href="#Smart-Key-_002d-Company-Mode" accesskey="p" rel="prev">Smart Key - Company Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Treemacs-1"></a>
-<h4 class="subsection">E.2.1 Smart Key - Treemacs</h4>
+<h4 class="subsection">E.2.2 Smart Key - Treemacs</h4>
<a name="index-Treemacs-1"></a>
<p>Treemacs is an add-on Emacs package that offers a fixed, per-frame, graphical
@@ -9447,10 +9728,10 @@ See <a href="#Displaying-File-and-Buffer-Items">Displaying File and Buffer Items
collapse the entry;
(2) elsewhere within an entry line, the item is displayed for editing,
normally in another window;
- (3) at the end of an entry line: invoke <code>action-key-eol-function</code>,
- typically to scroll up proportionally, if an Action Key press; invoke
- <code>assist-key-eol-function</code>, typically to scroll down proportionally,
- if an Asisst Key press;
+ (3) at the end of an entry line: if an Action Key press, invokes
+ <code>action-key-eol-function</code>, typically to scroll up proportionally;
+ if an Assist Key press, invokes <code>assist-key-eol-function</code>, typically
+ to scroll down proportionally;
(4) on the first line of the buffer (other than the end of line),
dired is run on the current directory of this Treemacs;
(5) at the end of the first or last line of the buffer,
@@ -9465,7 +9746,7 @@ See <a href="#Displaying-File-and-Buffer-Items">Displaying File and Buffer Items
Next: <a href="#Smart-Key-_002d-Argument-Completion" accesskey="n" rel="next">Smart Key - Argument Completion</a>, Previous: <a href="#Smart-Key-_002d-Treemacs" accesskey="p" rel="prev">Smart Key - Treemacs</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Emacs-Pushbuttons-1"></a>
-<h4 class="subsection">E.2.2 Smart Key - Emacs Pushbuttons</h4>
+<h4 class="subsection">E.2.3 Smart Key - Emacs Pushbuttons</h4>
<div class="format">
<pre class="format">When over an Emacs pushbutton:
@@ -9482,7 +9763,7 @@ Next: <a href="#Smart-Key-_002d-Argument-Completion" accesskey="n" rel="next">Sm
Next: <a href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="n" rel="next">Smart Key - ID Edit Mode</a>, Previous: <a href="#Smart-Key-_002d-Emacs-Pushbuttons" accesskey="p" rel="prev">Smart Key - Emacs Pushbuttons</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Argument-Completion-1"></a>
-<h4 class="subsection">E.2.3 Smart Key - Argument Completion</h4>
+<h4 class="subsection">E.2.4 Smart Key - Argument Completion</h4>
<a name="index-Smart-Keyboard-Keys"></a>
<div class="format">
@@ -9493,7 +9774,7 @@ Next: <a href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="n" rel="next">Smart Key
Offers completions for the current minibuffer argument.
</pre></div>
-<a name="index-completion-2"></a>
+<a name="index-completion-3"></a>
<div class="format">
<pre class="format">When reading a Hyperbole menu item or an argument with completion:
ACTION KEY
@@ -9513,7 +9794,7 @@ Next: <a href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="n" rel="next">Smart Key
Next: <a href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029" accesskey="n" rel="next">Smart Key - Emacs Cross-references (Xrefs)</a>, Previous: <a href="#Smart-Key-_002d-Argument-Completion" accesskey="p" rel="prev">Smart Key - Argument Completion</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-ID-Edit-Mode-1"></a>
-<h4 class="subsection">E.2.4 Smart Key - ID Edit Mode</h4>
+<h4 class="subsection">E.2.5 Smart Key - ID Edit Mode</h4>
<div class="format">
<pre class="format">If in ID Edit mode (a package within InfoDock, not included in
Hyperbole, that supports rapid marking, killing, copying, yanking and
@@ -9529,7 +9810,7 @@ display-management):
Next: <a href="#Smart-Key-_002d-Smart-Scrolling" accesskey="n" rel="next">Smart Key - Smart Scrolling</a>, Previous: <a href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="p" rel="prev">Smart Key - ID Edit Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029-1"></a>
-<h4 class="subsection">E.2.5 Smart Key - Emacs Cross-references (Xrefs)</h4>
+<h4 class="subsection">E.2.6 Smart Key - Emacs Cross-references (Xrefs)</h4>
<div class="format">
<pre class="format">When over an Emacs cross-reference:
@@ -9547,7 +9828,7 @@ Next: <a href="#Smart-Key-_002d-Smart-Scrolling" accesskey="n" rel="next">Smart
Next: <a href="#Smart-Key-_002d-Smart-Menus" accesskey="n" rel="next">Smart Key - Smart Menus</a>, Previous: <a href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029" accesskey="p" rel="prev">Smart Key - Emacs Cross-references (Xrefs)</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Smart-Scrolling-1"></a>
-<h4 class="subsection">E.2.6 Smart Key - Smart Scrolling</h4>
+<h4 class="subsection">E.2.7 Smart Key - Smart Scrolling</h4>
<a name="index-smart_002dscroll_002dproportional"></a>
<a name="index-proportional-scrolling-1"></a>
@@ -9585,7 +9866,7 @@ Next: <a href="#Smart-Key-_002d-Smart-Menus" accesskey="n" rel="next">Smart Key
Next: <a href="#Smart-Key-_002d-Dired-Mode" accesskey="n" rel="next">Smart Key - Dired Mode</a>, Previous: <a href="#Smart-Key-_002d-Smart-Scrolling" accesskey="p" rel="prev">Smart Key - Smart Scrolling</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Smart-Menus-1"></a>
-<h4 class="subsection">E.2.7 Smart Key - Smart Menus</h4>
+<h4 class="subsection">E.2.8 Smart Key - Smart Menus</h4>
<p>Smart Menus are an older in-buffer menu system that worked on dumb
terminals and pre-dated Emacs&rsquo; own dumb terminal menu support. They
@@ -9619,7 +9900,7 @@ necesary for its use.
Next: <a href="#Smart-Key-_002d-Hyperbole-Buttons" accesskey="n" rel="next">Smart Key - Hyperbole Buttons</a>, Previous: <a href="#Smart-Key-_002d-Smart-Menus" accesskey="p" rel="prev">Smart Key - Smart Menus</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Dired-Mode-1"></a>
-<h4 class="subsection">E.2.8 Smart Key - Dired Mode</h4>
+<h4 class="subsection">E.2.9 Smart Key - Dired Mode</h4>
<a name="index-click_002c-dired"></a>
<a name="index-drag_002c-dired"></a>
<a name="index-dired-browsing"></a>
@@ -9660,7 +9941,7 @@ Next: <a href="#Smart-Key-_002d-Hyperbole-Buttons" accesskey="n" rel="next">Smar
Next: <a href="#Smart-Key-_002d-View-Mode" accesskey="n" rel="next">Smart Key - View Mode</a>, Previous: <a href="#Smart-Key-_002d-Dired-Mode" accesskey="p" rel="prev">Smart Key - Dired Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Hyperbole-Buttons-1"></a>
-<h4 class="subsection">E.2.9 Smart Key - Hyperbole Buttons</h4>
+<h4 class="subsection">E.2.10 Smart Key - Hyperbole Buttons</h4>
<a name="index-click_002c-button"></a>
<a name="index-button-click"></a>
@@ -9680,7 +9961,7 @@ Next: <a href="#Smart-Key-_002d-View-Mode" accesskey="n" rel="next">Smart Key -
Next: <a href="#Smart-Key-_002d-Delimited-Things" accesskey="n" rel="next">Smart Key - Delimited Things</a>, Previous: <a href="#Smart-Key-_002d-Hyperbole-Buttons" accesskey="p" rel="prev">Smart Key - Hyperbole Buttons</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-View-Mode-1"></a>
-<h4 class="subsection">E.2.10 Smart Key - View Mode</h4>
+<h4 class="subsection">E.2.11 Smart Key - View Mode</h4>
<a name="index-view-mode"></a>
<div class="format">
@@ -9699,7 +9980,7 @@ Next: <a href="#Smart-Key-_002d-Delimited-Things" accesskey="n" rel="next">Smart
Next: <a href="#Smart-Key-_002d-The-Koutliner" accesskey="n" rel="next">Smart Key - The Koutliner</a>, Previous: <a href="#Smart-Key-_002d-View-Mode" accesskey="p" rel="prev">Smart Key - View Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Delimited-Things-1"></a>
-<h4 class="subsection">E.2.11 Smart Key - Delimited Things</h4>
+<h4 class="subsection">E.2.12 Smart Key - Delimited Things</h4>
<a name="index-thing-1"></a>
<a name="index-list-1"></a>
@@ -9737,7 +10018,7 @@ original location and yanks it at the new location.
Next: <a href="#Smart-Key-_002d-RDB-Mode" accesskey="n" rel="next">Smart Key - RDB Mode</a>, Previous: <a href="#Smart-Key-_002d-Delimited-Things" accesskey="p" rel="prev">Smart Key - Delimited Things</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-The-Koutliner-1"></a>
-<h4 class="subsection">E.2.12 Smart Key - The Koutliner</h4>
+<h4 class="subsection">E.2.13 Smart Key - The Koutliner</h4>
<div class="format">
<pre class="format">When pressed within a Hyperbole Koutliner buffer (kotl-mode):
ACTION KEY
@@ -9772,7 +10053,7 @@ Next: <a href="#Smart-Key-_002d-RDB-Mode" accesskey="n" rel="next">Smart Key - R
Next: <a href="#Smart-Key-_002d-Help-Buffers" accesskey="n" rel="next">Smart Key - Help Buffers</a>, Previous: <a href="#Smart-Key-_002d-The-Koutliner" accesskey="p" rel="prev">Smart Key - The Koutliner</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-RDB-Mode-1"></a>
-<h4 class="subsection">E.2.13 Smart Key - RDB Mode</h4>
+<h4 class="subsection">E.2.14 Smart Key - RDB Mode</h4>
<a name="index-rdb_002dmode"></a>
<a name="index-database"></a>
<div class="format">
@@ -9805,7 +10086,7 @@ relational databases (part of InfoDock):
Next: <a href="#Smart-Key-_002d-Pages-Directory-Mode" accesskey="n" rel="next">Smart Key - Pages Directory Mode</a>, Previous: <a href="#Smart-Key-_002d-RDB-Mode" accesskey="p" rel="prev">Smart Key - RDB Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Help-Buffers-1"></a>
-<h4 class="subsection">E.2.14 Smart Key - Help Buffers</h4>
+<h4 class="subsection">E.2.15 Smart Key - Help Buffers</h4>
<a name="index-help-buffer"></a>
<div class="format">
<pre class="format">
@@ -9819,10 +10100,10 @@ When pressed at the end of a Help buffer:
<a name="Smart-Key-_002d-Pages-Directory-Mode"></a>
<div class="header">
<p>
-Next: <a href="#Smart-Key-_002d-Identifier-Menu-Mode" accesskey="n" rel="next">Smart Key - Identifier Menu Mode</a>, Previous: <a href="#Smart-Key-_002d-Help-Buffers" accesskey="p" rel="prev">Smart Key - Help Buffers</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+Next: <a href="#Smart-Key-_002d-Python-Source-Code" accesskey="n" rel="next">Smart Key - Python Source Code</a>, Previous: <a href="#Smart-Key-_002d-Help-Buffers" accesskey="p" rel="prev">Smart Key - Help Buffers</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Pages-Directory-Mode-1"></a>
-<h4 class="subsection">E.2.15 Smart Key - Pages Directory Mode</h4>
+<h4 class="subsection">E.2.16 Smart Key - Pages Directory Mode</h4>
<div class="format">
<pre class="format">Pages-directory-mode is used in special buffers that contain title lines extracted from files consisting of titled, page-delimited contents, e.g. Info files.
@@ -9838,10 +10119,10 @@ When pressed on a pages-directory-mode entry line:
<a name="Smart-Key-_002d-Python-Source-Code"></a>
<div class="header">
<p>
-Next: <a href="#Smart-Key-_002d-Objective_002dC-Source-Code" accesskey="n" rel="next">Smart Key - Objective-C Source Code</a>, Previous: <a href="#Smart-Key-_002d-JavaScript-Source-Code" accesskey="p" rel="prev">Smart Key - JavaScript Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+Next: <a href="#Smart-Key-_002d-Identifier-Menu-Mode" accesskey="n" rel="next">Smart Key - Identifier Menu Mode</a>, Previous: <a href="#Smart-Key-_002d-Pages-Directory-Mode" accesskey="p" rel="prev">Smart Key - Pages Directory Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Python-Source-Code-1"></a>
-<h4 class="subsection">E.2.16 Smart Key - Python Source Code</h4>
+<h4 class="subsection">E.2.17 Smart Key - Python Source Code</h4>
<div class="format">
<pre class="format">When the Jedi identifier server or the OO-Browser has been loaded and the press is
within a Python buffer:
@@ -9869,16 +10150,17 @@ within a Python buffer:
<a name="Smart-Key-_002d-Identifier-Menu-Mode"></a>
<div class="header">
<p>
-Next: <a href="#Smart-Key-_002d-C-Source-Code" accesskey="n" rel="next">Smart Key - C Source Code</a>, Previous: <a href="#Smart-Key-_002d-Pages-Directory-Mode" accesskey="p" rel="prev">Smart Key - Pages Directory Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+Next: <a href="#Smart-Key-_002d-C-Source-Code" accesskey="n" rel="next">Smart Key - C Source Code</a>, Previous: <a href="#Smart-Key-_002d-Python-Source-Code" accesskey="p" rel="prev">Smart Key - Python Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Identifier-Menu-Mode-1"></a>
-<h4 class="subsection">E.2.17 Smart Key - Identifier Menu Mode</h4>
+<h4 class="subsection">E.2.18 Smart Key - Identifier Menu Mode</h4>
<div class="format">
-<pre class="format">This works only for identifiers defined within the same source file in which they are referenced.
-It requires either Emacs&rsquo; imenu or XEmacs&rsquo; func-menu library and it requires that an index of
-identifiers has been built for the current buffer. Other handlers handle identifier references
-and definitions across multiple files.
+<pre class="format">This works only for identifiers defined within the same source file in
+which they are referenced. It requires either Emacs&rsquo; imenu library
+and it requires that an index of identifiers has been built for the
+current buffer. Other handlers handle identifier references and
+definitions across multiple files.
When pressed on an identifier name after an identifier index has been generated:
ACTION KEY
@@ -9895,7 +10177,7 @@ When pressed on an identifier name after an identifier index has been generated:
Next: <a href="#Smart-Key-_002d-C_002b_002b-Source-Code" accesskey="n" rel="next">Smart Key - C++ Source Code</a>, Previous: <a href="#Smart-Key-_002d-Identifier-Menu-Mode" accesskey="p" rel="prev">Smart Key - Identifier Menu Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-C-Source-Code-1"></a>
-<h4 class="subsection">E.2.18 Smart Key - C Source Code</h4>
+<h4 class="subsection">E.2.19 Smart Key - C Source Code</h4>
<a name="index-smart_002dc_002dcpp_002dinclude_002dpath"></a>
<a name="index-smart_002dc_002dinclude_002dpath"></a>
@@ -9927,7 +10209,7 @@ Next: <a href="#Smart-Key-_002d-C_002b_002b-Source-Code" accesskey="n" rel="next
Next: <a href="#Smart-Key-_002d-Assembly-Source-Code" accesskey="n" rel="next">Smart Key - Assembly Source Code</a>, Previous: <a href="#Smart-Key-_002d-C-Source-Code" accesskey="p" rel="prev">Smart Key - C Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-C_002b_002b-Source-Code-1"></a>
-<h4 class="subsection">E.2.19 Smart Key - C++ Source Code</h4>
+<h4 class="subsection">E.2.20 Smart Key - C++ Source Code</h4>
<a name="index-c_002b_002b_002dcpp_002dinclude_002dpath"></a>
<a name="index-c_002b_002b_002dinclude_002dpath"></a>
@@ -9980,7 +10262,7 @@ buffer:
Next: <a href="#Smart-Key-_002d-Lisp-Source-Code" accesskey="n" rel="next">Smart Key - Lisp Source Code</a>, Previous: <a href="#Smart-Key-_002d-C_002b_002b-Source-Code" accesskey="p" rel="prev">Smart Key - C++ Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Assembly-Source-Code-1"></a>
-<h4 class="subsection">E.2.20 Smart Key - Assembly Source Code</h4>
+<h4 class="subsection">E.2.21 Smart Key - Assembly Source Code</h4>
<a name="index-smart_002dasm_002dinclude_002dpath"></a>
<div class="format">
@@ -10005,11 +10287,12 @@ Next: <a href="#Smart-Key-_002d-Lisp-Source-Code" accesskey="n" rel="next">Smart
Next: <a href="#Smart-Key-_002d-Java-Source-Code" accesskey="n" rel="next">Smart Key - Java Source Code</a>, Previous: <a href="#Smart-Key-_002d-Assembly-Source-Code" accesskey="p" rel="prev">Smart Key - Assembly Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Lisp-Source-Code-1"></a>
-<h4 class="subsection">E.2.21 Smart Key - Lisp Source Code</h4>
+<h4 class="subsection">E.2.22 Smart Key - Lisp Source Code</h4>
<div class="format">
-<pre class="format">When pressed on a Lisp symbol within any of these types of buffers
-(Lisp code, debugger, compilation, or help):
+<pre class="format"><a name="index-change_002dlog_002dmode"></a><a name="index-lisp-identifier"></a><a name="index-elisp-identifier"></a>When pressed on a Lisp symbol within any of these types of buffers
+(Lisp code, debugger, compilation, or help) or in change-log-mode
+on an Emacs Lisp bound identifier:
ACTION KEY
Jumps to the definition of any selected Lisp construct. If on an
Emacs Lisp require, load, or autoload clause and the (find-library)
@@ -10027,7 +10310,7 @@ Next: <a href="#Smart-Key-_002d-Java-Source-Code" accesskey="n" rel="next">Smart
Next: <a href="#Smart-Key-_002d-JavaScript-Source-Code" accesskey="n" rel="next">Smart Key - JavaScript Source Code</a>, Previous: <a href="#Smart-Key-_002d-Lisp-Source-Code" accesskey="p" rel="prev">Smart Key - Lisp Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Java-Source-Code-1"></a>
-<h4 class="subsection">E.2.22 Smart Key - Java Source Code</h4>
+<h4 class="subsection">E.2.23 Smart Key - Java Source Code</h4>
<a name="index-smart_002djava_002dpackage_002dpath"></a>
<div class="format">
@@ -10067,10 +10350,10 @@ buffer:
<a name="Smart-Key-_002d-JavaScript-Source-Code"></a>
<div class="header">
<p>
-Next: <a href="#Smart-Key-_002d-Python-Source-Code" accesskey="n" rel="next">Smart Key - Python Source Code</a>, Previous: <a href="#Smart-Key-_002d-Java-Source-Code" accesskey="p" rel="prev">Smart Key - Java Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+Next: <a href="#Smart-Key-_002d-Objective_002dC-Source-Code" accesskey="n" rel="next">Smart Key - Objective-C Source Code</a>, Previous: <a href="#Smart-Key-_002d-Java-Source-Code" accesskey="p" rel="prev">Smart Key - Java Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-JavaScript-Source-Code-1"></a>
-<h4 class="subsection">E.2.23 Smart Key - JavaScript Source Code</h4>
+<h4 class="subsection">E.2.24 Smart Key - JavaScript Source Code</h4>
<div class="format">
<pre class="format">When pressed within a JavaScript source code file:
@@ -10088,10 +10371,10 @@ Next: <a href="#Smart-Key-_002d-Python-Source-Code" accesskey="n" rel="next">Sma
<a name="Smart-Key-_002d-Objective_002dC-Source-Code"></a>
<div class="header">
<p>
-Next: <a href="#Smart-Key-_002d-Fortran-Source-Code" accesskey="n" rel="next">Smart Key - Fortran Source Code</a>, Previous: <a href="#Smart-Key-_002d-Python-Source-Code" accesskey="p" rel="prev">Smart Key - Python Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+Next: <a href="#Smart-Key-_002d-Fortran-Source-Code" accesskey="n" rel="next">Smart Key - Fortran Source Code</a>, Previous: <a href="#Smart-Key-_002d-JavaScript-Source-Code" accesskey="p" rel="prev">Smart Key - JavaScript Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Objective_002dC-Source-Code-1"></a>
-<h4 class="subsection">E.2.24 Smart Key - Objective-C Source Code</h4>
+<h4 class="subsection">E.2.25 Smart Key - Objective-C Source Code</h4>
<a name="index-objc_002dcpp_002dinclude_002dpath"></a>
<a name="index-objc_002dinclude_002dpath"></a>
@@ -10142,7 +10425,7 @@ OO-Browser):
Next: <a href="#Smart-Key-_002d-Occurrence-Matches" accesskey="n" rel="next">Smart Key - Occurrence Matches</a>, Previous: <a href="#Smart-Key-_002d-Objective_002dC-Source-Code" accesskey="p" rel="prev">Smart Key - Objective-C Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Fortran-Source-Code-1"></a>
-<h4 class="subsection">E.2.25 Smart Key - Fortran Source Code</h4>
+<h4 class="subsection">E.2.26 Smart Key - Fortran Source Code</h4>
<div class="format">
<pre class="format">When pressed within a Fortran source code file:
@@ -10160,7 +10443,7 @@ Next: <a href="#Smart-Key-_002d-Occurrence-Matches" accesskey="n" rel="next">Sma
Next: <a href="#Smart-Key-_002d-Calendar-Mode" accesskey="n" rel="next">Smart Key - Calendar Mode</a>, Previous: <a href="#Smart-Key-_002d-Fortran-Source-Code" accesskey="p" rel="prev">Smart Key - Fortran Source Code</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Occurrence-Matches-1"></a>
-<h4 class="subsection">E.2.26 Smart Key - Occurrence Matches</h4>
+<h4 class="subsection">E.2.27 Smart Key - Occurrence Matches</h4>
<div class="format">
<pre class="format">When pressed within an occur-mode, moccur-mode or amoccur-mode buffer:
@@ -10175,7 +10458,7 @@ Next: <a href="#Smart-Key-_002d-Calendar-Mode" accesskey="n" rel="next">Smart Ke
Next: <a href="#Smart-Key-_002d-Man-Page-Apropos" accesskey="n" rel="next">Smart Key - Man Page Apropos</a>, Previous: <a href="#Smart-Key-_002d-Occurrence-Matches" accesskey="p" rel="prev">Smart Key - Occurrence Matches</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Calendar-Mode-1"></a>
-<h4 class="subsection">E.2.27 Smart Key - Calendar Mode</h4>
+<h4 class="subsection">E.2.28 Smart Key - Calendar Mode</h4>
<div class="format">
<pre class="format">When pressed within a calendar-mode buffer:
@@ -10202,7 +10485,7 @@ Next: <a href="#Smart-Key-_002d-Man-Page-Apropos" accesskey="n" rel="next">Smart
Next: <a href="#Smart-Key-_002d-Emacs-Outline-Mode" accesskey="n" rel="next">Smart Key - Emacs Outline Mode</a>, Previous: <a href="#Smart-Key-_002d-Calendar-Mode" accesskey="p" rel="prev">Smart Key - Calendar Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Man-Page-Apropos-1"></a>
-<h4 class="subsection">E.2.28 Smart Key - Man Page Apropos</h4>
+<h4 class="subsection">E.2.29 Smart Key - Man Page Apropos</h4>
<div class="format">
<pre class="format">When pressed within a man page apropos buffer or listing:
ACTION KEY
@@ -10224,7 +10507,7 @@ Next: <a href="#Smart-Key-_002d-Emacs-Outline-Mode" accesskey="n" rel="next">Sma
Next: <a href="#Smart-Key-_002d-Info-Manuals" accesskey="n" rel="next">Smart Key - Info Manuals</a>, Previous: <a href="#Smart-Key-_002d-Man-Page-Apropos" accesskey="p" rel="prev">Smart Key - Man Page Apropos</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Emacs-Outline-Mode-1"></a>
-<h4 class="subsection">E.2.29 Smart Key - Emacs Outline Mode</h4>
+<h4 class="subsection">E.2.30 Smart Key - Emacs Outline Mode</h4>
<a name="index-selective_002ddisplay"></a>
<div class="format">
<pre class="format">If pressed within an outline-mode buffer or when no other context is matched
@@ -10261,7 +10544,7 @@ and outline-minor-mode is enabled:
Next: <a href="#Smart-Key-_002d-Email-Composers" accesskey="n" rel="next">Smart Key - Email Composers</a>, Previous: <a href="#Smart-Key-_002d-Emacs-Outline-Mode" accesskey="p" rel="prev">Smart Key - Emacs Outline Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Info-Manuals-1"></a>
-<h4 class="subsection">E.2.30 Smart Key - Info Manuals</h4>
+<h4 class="subsection">E.2.31 Smart Key - Info Manuals</h4>
<div class="format">
<pre class="format"><a name="index-click_002c-Info"></a><a name="index-Info-browsing"></a><a name="index-Info_002dglobal_002dnext"></a><a name="index-Info_002dglobal_002dprev"></a>If pressed within an Info manual node:
@@ -10302,7 +10585,7 @@ Use <kbd>{s}</kbd> within an Info manual to search for any concept that interest
Next: <a href="#Smart-Key-_002d-GNUS-Newsreader" accesskey="n" rel="next">Smart Key - GNUS Newsreader</a>, Previous: <a href="#Smart-Key-_002d-Info-Manuals" accesskey="p" rel="prev">Smart Key - Info Manuals</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Email-Composers-1"></a>
-<h4 class="subsection">E.2.31 Smart Key - Email Composers</h4>
+<h4 class="subsection">E.2.32 Smart Key - Email Composers</h4>
<a name="index-hmail_003areader"></a>
<a name="index-hmail_003alister"></a>
<div class="format">
@@ -10341,7 +10624,7 @@ Next: <a href="#Smart-Key-_002d-GNUS-Newsreader" accesskey="n" rel="next">Smart
Next: <a href="#Smart-Key-_002d-Buffer-Menus" accesskey="n" rel="next">Smart Key - Buffer Menus</a>, Previous: <a href="#Smart-Key-_002d-Email-Composers" accesskey="p" rel="prev">Smart Key - Email Composers</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-GNUS-Newsreader-1"></a>
-<h4 class="subsection">E.2.32 Smart Key - GNUS Newsreader</h4>
+<h4 class="subsection">E.2.33 Smart Key - GNUS Newsreader</h4>
<a name="index-click_002c-Gnus"></a>
<a name="index-Gnus-browsing"></a>
<div class="format">
@@ -10408,7 +10691,7 @@ Next: <a href="#Smart-Key-_002d-Buffer-Menus" accesskey="n" rel="next">Smart Key
Next: <a href="#Smart-Key-_002d-Tar-File-Mode" accesskey="n" rel="next">Smart Key - Tar File Mode</a>, Previous: <a href="#Smart-Key-_002d-GNUS-Newsreader" accesskey="p" rel="prev">Smart Key - GNUS Newsreader</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Buffer-Menus-1"></a>
-<h4 class="subsection">E.2.33 Smart Key - Buffer Menus</h4>
+<h4 class="subsection">E.2.34 Smart Key - Buffer Menus</h4>
<a name="index-click_002c-buffer-menu"></a>
<a name="index-buffer-menu-2"></a>
<div class="format">
@@ -10465,7 +10748,7 @@ Next: <a href="#Smart-Key-_002d-Tar-File-Mode" accesskey="n" rel="next">Smart Ke
Next: <a href="#Smart-Key-_002d-Man-Pages" accesskey="n" rel="next">Smart Key - Man Pages</a>, Previous: <a href="#Smart-Key-_002d-Buffer-Menus" accesskey="p" rel="prev">Smart Key - Buffer Menus</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Tar-File-Mode-1"></a>
-<h4 class="subsection">E.2.34 Smart Key - Tar File Mode</h4>
+<h4 class="subsection">E.2.35 Smart Key - Tar File Mode</h4>
<a name="index-click_002c-tar"></a>
<a name="index-tar-archive-browsing"></a>
<a name="index-extracting-from-tar-files"></a>
@@ -10492,7 +10775,7 @@ Next: <a href="#Smart-Key-_002d-Man-Pages" accesskey="n" rel="next">Smart Key -
Next: <a href="#Smart-Key-_002d-WWW-URLs" accesskey="n" rel="next">Smart Key - WWW URLs</a>, Previous: <a href="#Smart-Key-_002d-Tar-File-Mode" accesskey="p" rel="prev">Smart Key - Tar File Mode</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Man-Pages-1"></a>
-<h4 class="subsection">E.2.35 Smart Key - Man Pages</h4>
+<h4 class="subsection">E.2.36 Smart Key - Man Pages</h4>
<a name="index-man-page-references"></a>
<a name="index-smart_002dman_002dc_002droutine_002dref"></a>
<div class="format">
@@ -10512,11 +10795,11 @@ containing its pathname:
Next: <a href="#Smart-Key-_002d-HyRolo-Match-Buffers" accesskey="n" rel="next">Smart Key - HyRolo Match Buffers</a>, Previous: <a href="#Smart-Key-_002d-Man-Pages" accesskey="p" rel="prev">Smart Key - Man Pages</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-WWW-URLs-1"></a>
-<h4 class="subsection">E.2.36 Smart Key - WWW URLs</h4>
+<h4 class="subsection">E.2.37 Smart Key - WWW URLs</h4>
<a name="index-click_002c-world_002dwide-web"></a>
<a name="index-W3"></a>
<a name="index-URL-2"></a>
-<a name="index-browse_002durl_002dbrowser_002dfunction-3"></a>
+<a name="index-browse_002durl_002dbrowser_002dfunction-2"></a>
<a name="index-World_002dwide-Web-2"></a>
<a name="index-WWW-2"></a>
<a name="index-C_002dh-h-c-u-1"></a>
@@ -10538,7 +10821,7 @@ Next: <a href="#Smart-Key-_002d-HyRolo-Match-Buffers" accesskey="n" rel="next">S
Next: <a href="#Smart-Key-_002d-Image-Thumbnails" accesskey="n" rel="next">Smart Key - Image Thumbnails</a>, Previous: <a href="#Smart-Key-_002d-WWW-URLs" accesskey="p" rel="prev">Smart Key - WWW URLs</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-HyRolo-Match-Buffers-1"></a>
-<h4 class="subsection">E.2.37 Smart Key - HyRolo Match Buffers</h4>
+<h4 class="subsection">E.2.38 Smart Key - HyRolo Match Buffers</h4>
<a name="index-click_002c-hyrolo-matches"></a>
<a name="index-hyrolo-matches"></a>
<div class="format">
@@ -10554,7 +10837,7 @@ Next: <a href="#Smart-Key-_002d-Image-Thumbnails" accesskey="n" rel="next">Smart
Next: <a href="#Smart-Key-_002d-Gomoku-Game" accesskey="n" rel="next">Smart Key - Gomoku Game</a>, Previous: <a href="#Smart-Key-_002d-HyRolo-Match-Buffers" accesskey="p" rel="prev">Smart Key - HyRolo Match Buffers</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Image-Thumbnails-1"></a>
-<h4 class="subsection">E.2.38 Smart Key - Image Thumbnails</h4>
+<h4 class="subsection">E.2.39 Smart Key - Image Thumbnails</h4>
<a name="index-images"></a>
<a name="index-thumbnails"></a>
<a name="index-dired_002c-images"></a>
@@ -10575,7 +10858,7 @@ Next: <a href="#Smart-Key-_002d-Gomoku-Game" accesskey="n" rel="next">Smart Key
Next: <a href="#Smart-Key-_002d-The-OO_002dBrowser" accesskey="n" rel="next">Smart Key - The OO-Browser</a>, Previous: <a href="#Smart-Key-_002d-Image-Thumbnails" accesskey="p" rel="prev">Smart Key - Image Thumbnails</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Gomoku-Game-1"></a>
-<h4 class="subsection">E.2.39 Smart Key - Gomoku Game</h4>
+<h4 class="subsection">E.2.40 Smart Key - Gomoku Game</h4>
<a name="index-game_002c-gomoku"></a>
<a name="index-gomoku"></a>
<div class="format">
@@ -10593,7 +10876,7 @@ Next: <a href="#Smart-Key-_002d-The-OO_002dBrowser" accesskey="n" rel="next">Sma
Next: <a href="#Smart-Key-_002d-Default-Context" accesskey="n" rel="next">Smart Key - Default Context</a>, Previous: <a href="#Smart-Key-_002d-Gomoku-Game" accesskey="p" rel="prev">Smart Key - Gomoku Game</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-The-OO_002dBrowser-1"></a>
-<h4 class="subsection">E.2.40 Smart Key - The OO-Browser</h4>
+<h4 class="subsection">E.2.41 Smart Key - The OO-Browser</h4>
<a name="index-OO_002dBrowser"></a>
<a name="index-object_002doriented-code-browsing"></a>
@@ -10667,7 +10950,7 @@ buffer after an OO-Browser Environment has been loaded:
Previous: <a href="#Smart-Key-_002d-The-OO_002dBrowser" accesskey="p" rel="prev">Smart Key - The OO-Browser</a>, Up: <a href="#Smart-Keyboard-Keys" accesskey="u" rel="up">Smart Keyboard Keys</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" rel="index">Index</a>]</p>
</div>
<a name="Smart-Key-_002d-Default-Context-1"></a>
-<h4 class="subsection">E.2.41 Smart Key - Default Context</h4>
+<h4 class="subsection">E.2.42 Smart Key - Default Context</h4>
<a name="index-action_002dkey_002ddefault_002dfunction-1"></a>
<a name="index-assist_002dkey_002ddefault_002dfunction-1"></a>
<a name="index-hyperbole-1"></a>
@@ -10906,10 +11189,8 @@ providing sketches of possible additions;
</li><li> and to acknowledge known weaknesses in the current system.
</li></ul>
-<p>If you would like to see some of this work done, consider funding
-its development. Without any serious interest from users, progress
-on these fronts will be slow. Here are some new features we have
-in mind, however.
+<p>Without any serious interest from users, progress on these fronts will
+be slow. Here are some new features we have in mind, however.
</p>
<dl compact="compact">
<dt>Button Copying, Killing, and Yanking</dt>
@@ -11279,7 +11560,7 @@ Next: <a href="#Function" accesskey="n" rel="next">Function</a>, Previous: <a hr
<tr><td></td><td valign="top"><a href="#index-a"><code>a</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-A"><code>A</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Action-Key-1"><code>Action Key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Keys">Smart Keys</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Action-Key_002c-web-browsing-1"><code>Action Key, web browsing</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Action-Key_002c-web-browsing-1"><code>Action Key, web browsing</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Assist-Key-1"><code>Assist Key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Keys">Smart Keys</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Key-Index_ky_letter-B">B</a></th><td></td><td></td></tr>
@@ -11304,7 +11585,8 @@ Next: <a href="#Function" accesskey="n" rel="next">Function</a>, Previous: <a hr
<tr><td></td><td valign="top"><a href="#index-C_002dc-c"><code>C-c c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002da"><code>C-c C-a</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002db"><code>C-c C-b</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Around">Moving Around</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dc"><code>C-c C-c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dc"><code>C-c C-c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dc-1"><code>C-c C-c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dd"><code>C-c C-d</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Around">Moving Around</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002df"><code>C-c C-f</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Around">Moving Around</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dh"><code>C-c C-h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
@@ -11335,7 +11617,7 @@ Next: <a href="#Function" accesskey="n" rel="next">Function</a>, Previous: <a hr
<tr><td></td><td valign="top"><a href="#index-C_002dh-h-1"><code>C-h h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dh-h-c-a"><code>C-h h c a</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customization">Customization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dh-h-c-d"><code>C-h h c d</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Debugging">Smart Key Debugging</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-C_002dh-h-c-r"><code>C-h h c r</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dh-h-c-r"><code>C-h h c r</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dh-h-c-u"><code>C-h h c u</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dh-h-c-u-1"><code>C-h h c u</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-WWW-URLs">Smart Key - WWW URLs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-C_002dh-h-c-w"><code>C-h h c w</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Web-Search-Engines">Web Search Engines</a></td></tr>
@@ -11450,9 +11732,12 @@ Next: <a href="#Function" accesskey="n" rel="next">Function</a>, Previous: <a hr
<tr><td></td><td valign="top"><a href="#index-M_002do"><code>M-o</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-M_002do-1"><code>M-o</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-M_002do-i-_003cwindow_002did_003e"><code>M-o i &lt;window-id&gt;</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-M_002do-m-_003cwindow_002did_003e"><code>M-o m &lt;window-id&gt;</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-M_002do-r-_003cwindow_002did_003e"><code>M-o r &lt;window-id&gt;</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-M_002do-t-_003cwindow_002did_003e"><code>M-o t &lt;window-id&gt;</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-M_002dRET"><code>M-<span class="key">RET</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-M_002dRET-1"><code>M-<span class="key">RET</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-M_002dRET-1"><code>M-RET</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-M_002dRET-2"><code>M-<span class="key">RET</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-M_002dx-kotl_002dmode_003ashow_002dsubtree"><code>M-x kotl-mode:show-subtree</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-middle-mouse-key-1"><code>middle mouse key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
@@ -11735,6 +12020,8 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002delisp_002ddoc"><code>actypes link-to-elisp-doc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002dfile"><code>actypes link-to-file</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002dfile_002dline"><code>actypes link-to-file-line</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002dgbut"><code>actypes link-to-gbut</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002dibut"><code>actypes link-to-ibut</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002dInfo_002dindex_002ditem"><code>actypes link-to-Info-index-item</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002dInfo_002dnode"><code>actypes link-to-Info-node</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-actypes-link_002dto_002dkcell"><code>actypes link-to-kcell</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
@@ -11763,10 +12050,9 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><td></td><td valign="top"><a href="#index-assist_002dmouse_002dkey"><code>assist-mouse-key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Function_fn_letter-B">B</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-browse_002durl_002dbrowser_002dfunction">browse-url-browser-function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-browse_002durl_002dbrowser_002dfunction-1">browse-url-browser-function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-browse_002durl_002dbrowser_002dfunction-2">browse-url-browser-function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-browse_002durl_002dbrowser_002dfunction-3">browse-url-browser-function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-WWW-URLs">Smart Key - WWW URLs</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-browse_002durl_002dbrowser_002dfunction">browse-url-browser-function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-browse_002durl_002dbrowser_002dfunction-1">browse-url-browser-function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-browse_002durl_002dbrowser_002dfunction-2">browse-url-browser-function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-WWW-URLs">Smart Key - WWW URLs</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Function_fn_letter-C">C</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-c_002b_002b_002dcpp_002dinclude_002dpath">c++-cpp-include-path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-C_002b_002b-Source-Code">Smart Key - C++ Source Code</a></td></tr>
@@ -11809,14 +12095,14 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><td></td><td valign="top"><a href="#index-file_002c-_002ehypb">file, .hypb</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-Buttons">Explicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-_002ekotl-suffix">file, .kotl suffix</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-Outlines">Creating Outlines</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-DEMO-1">file, DEMO</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperbole-Overview">Hyperbole Overview</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-file_002c-DIR">file, DIR</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_002c-DIR">file, DIR</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-EXAMPLE_002ekotl">file, EXAMPLE.kotl</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner">Koutliner</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-file_002c-func_002dmenu_002eel">file, func-menu.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_002c-func_002dmenu_002eel">file, func-menu.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hactypes_002eel">file, hactypes.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-Types">Creating Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hactypes_002eel-1">file, hactypes.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Type-Creation">Action Type Creation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hbut_002eel">file, hbut.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Type-Creation">Action Type Creation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hbut_002eel-1">file, hbut.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programmatic-Button-Creation">Programmatic Button Creation</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-file_002c-hib_002ddebbugs_002eel">file, hib-debbugs.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_002c-hib_002ddebbugs_002eel">file, hib-debbugs.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hib_002dkbd_002eel">file, hib-kbd.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hibtypes_002eel">file, hibtypes.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hibtypes_002eel-1">file, hibtypes.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-Types">Creating Types</a></td></tr>
@@ -11836,7 +12122,7 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><td></td><td valign="top"><a href="#index-file_002c-man_002fhyperbole_002einfo">file, man/hyperbole.info</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invocation">Invocation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-man_002fhyperbole_002epdf">file, man/hyperbole.pdf</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invocation">Invocation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-man_002fhyperbole_002etexi">file, man/hyperbole.texi</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invocation">Invocation</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-file_002c-MANIFEST">file, MANIFEST</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_002c-MANIFEST">file, MANIFEST</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-fill_002dcolumn">fill-column</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner-Keys">Koutliner Keys</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-fill_002dprefix">fill-prefix</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Label-Normalization">Button Label Normalization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-find_002dfile"><code>find-file</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
@@ -11854,12 +12140,15 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><td></td><td valign="top"><a href="#index-hbut_003alabel_002dto_002dkey">hbut:label-to-key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Label-Normalization">Button Label Normalization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hibtypes_002dbegin_002dload_002dhook">hibtypes-begin-load-hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hibtypes_002dend_002dload_002dhook">hibtypes-end-load-hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgit_002ddefault_002dproject">hibtypes-git-default-project</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgit_002ddefault_002dproject-1">hibtypes-git-default-project</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgithub_002ddefault_002dproject">hibtypes-github-default-project</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgithub_002ddefault_002duser">hibtypes-github-default-user</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgithub_002ddefault_002duser-1">hibtypes-github-default-user</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hibtypes_002dsocial_002ddefault_002dservice">hibtypes-social-default-service</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgit_002ddefault_002dproject">hibtypes-git-default-project</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgit_002ddefault_002dproject-1">hibtypes-git-default-project</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgithub_002ddefault_002dproject">hibtypes-github-default-project</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgithub_002ddefault_002duser">hibtypes-github-default-user</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgithub_002ddefault_002duser-1">hibtypes-github-default-user</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgitlab_002ddefault_002dproject">hibtypes-gitlab-default-project</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgitlab_002ddefault_002duser">hibtypes-gitlab-default-user</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dgitlab_002ddefault_002duser-1">hibtypes-gitlab-default-user</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hibtypes_002dsocial_002ddefault_002dservice">hibtypes-social-default-service</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hkey_002dace_002dwindow_002dsetup"><code>hkey-ace-window-setup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hkey_002dalist">hkey-alist</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Questions-and-Answers">Questions and Answers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hkey_002dalways_002ddisplay_002dmenu">hkey-always-display-menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Smart-Menus">Smart Key - Smart Menus</a></td></tr>
@@ -11886,16 +12175,20 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><td></td><td valign="top"><a href="#index-hmouse_002dx_002ddrag_002dsensitivity">hmouse-x-drag-sensitivity</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a Window</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hmouse_002dy_002ddiagonal_002dsensitivity">hmouse-y-diagonal-sensitivity</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a Window</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hmouse_002dy_002ddrag_002dsensitivity">hmouse-y-drag-sensitivity</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a Window</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hpath_003aat_002dp"><code>hpath:at-p</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hpath_003aat_002dp"><code>hpath:at-p</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003adisplay_002dwhere">hpath:display-where</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hpath_003adisplay_002dwhere-1">hpath:display-where</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hpath_003aexternal_002ddisplay_002dalist">hpath:external-display-alist</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003aexternal_002ddisplay_002dalist_002dmacos">hpath:external-display-alist-macos</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003aexternal_002ddisplay_002dalist_002dmswindows">hpath:external-display-alist-mswindows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003aexternal_002ddisplay_002dalist_002dx">hpath:external-display-alist-x</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hpath_003afind"><code>hpath:find</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hpath_003afind"><code>hpath:find</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003afind_002dfile_002durls_002dmode"><code>hpath:find-file-urls-mode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003aget_002dexternal_002ddisplay_002dalist"><code>hpath:get-external-display-alist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003ainternal_002ddisplay_002dalist">hpath:internal-display-alist</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hpath_003asuffixes">hpath:suffixes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hpath_003ainternal_002ddisplay_002dalist-1">hpath:internal-display-alist</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hpath_003anative_002dimage_002dsuffixes">hpath:native-image-suffixes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hpath_003asuffixes">hpath:suffixes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hpath_003avariables">hpath:variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-Variable-Substitution">Link Variable Substitution</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hproperty_003abut_002dcreate"><code>hproperty:but-create</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Colors">Button Colors</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hproperty_003abut_002demphasize_002dflag">hproperty:but-emphasize-flag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Colors">Button Colors</a></td></tr>
@@ -11975,42 +12268,48 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><th><a name="Function_fn_letter-I">I</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-ibtype_003acreate"><code>ibtype:create</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-ibtype_003adelete"><code>ibtype:delete</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-annot_002dbib"><code>ibtypes annot-bib</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-completion"><code>ibtypes completion</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-cscope"><code>ibtypes cscope</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-ctags"><code>ibtypes ctags</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-debbugs_002dgnu_002dmode"><code>ibtypes debbugs-gnu-mode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-debbugs_002dgnu_002dquery"><code>ibtypes debbugs-gnu-query</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-debugger_002dsource"><code>ibtypes debugger-source</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-dir_002dsummary"><code>ibtypes dir-summary</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-doc_002did"><code>ibtypes doc-id</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-elisp_002dcompiler_002dmsg"><code>ibtypes elisp-compiler-msg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-etags"><code>ibtypes etags</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-function_002din_002dbuffer"><code>ibtypes function-in-buffer</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-git_002dcommit_002dreference"><code>ibtypes git-commit-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-git_002dreference"><code>ibtypes git-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-github_002dreference"><code>ibtypes github-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-gnus_002dpush_002dbutton"><code>ibtypes gnus-push-button</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-grep_002dmsg"><code>ibtypes grep-msg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-hyp_002daddress"><code>ibtypes hyp-address</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-hyp_002dsource"><code>ibtypes hyp-source</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-id_002dcflow"><code>ibtypes id-cflow</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-Info_002dnode"><code>ibtypes Info-node</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-kbd_002dkey"><code>ibtypes kbd-key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-klink"><code>ibtypes klink</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-mail_002daddress"><code>ibtypes mail-address</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-man_002dapropos"><code>ibtypes man-apropos</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-markdown_002dinternal_002dlink"><code>ibtypes markdown-internal-link</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-org_002dmode"><code>ibtypes org-mode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-patch_002dmsg"><code>ibtypes patch-msg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-pathname"><code>ibtypes pathname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-pathname_002dline_002dand_002dcolumn"><code>ibtypes pathname-line-and-column</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-rfc"><code>ibtypes rfc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-rfc_002dtoc"><code>ibtypes rfc-toc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-social_002dreference"><code>ibtypes social-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-texinfo_002dref"><code>ibtypes texinfo-ref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-text_002dtoc"><code>ibtypes text-toc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes-www_002durl"><code>ibtypes www-url</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-annot_002dbib"><code>ibtypes annot-bib</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-completion"><code>ibtypes completion</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-cscope"><code>ibtypes cscope</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-ctags"><code>ibtypes ctags</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-debbugs_002dgnu_002dmode"><code>ibtypes debbugs-gnu-mode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-debbugs_002dgnu_002dquery"><code>ibtypes debbugs-gnu-query</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-debugger_002dsource"><code>ibtypes debugger-source</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-dir_002dsummary"><code>ibtypes dir-summary</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-doc_002did"><code>ibtypes doc-id</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-elisp_002dcompiler_002dmsg"><code>ibtypes elisp-compiler-msg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-etags"><code>ibtypes etags</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-function_002din_002dbuffer"><code>ibtypes function-in-buffer</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-git_002dcommit_002dreference"><code>ibtypes git-commit-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-git_002dreference"><code>ibtypes git-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-github_002dreference"><code>ibtypes github-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-gitlab_002dreference"><code>ibtypes gitlab-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-gnus_002dpush_002dbutton"><code>ibtypes gnus-push-button</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-grep_002dmsg"><code>ibtypes grep-msg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-hyp_002daddress"><code>ibtypes hyp-address</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-hyp_002dsource"><code>ibtypes hyp-source</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-id_002dcflow"><code>ibtypes id-cflow</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-Info_002dnode"><code>ibtypes Info-node</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-ipython_002dstack_002dframe"><code>ibtypes ipython-stack-frame</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-kbd_002dkey"><code>ibtypes kbd-key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-klink"><code>ibtypes klink</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-link_002dto_002debut"><code>ibtypes link-to-ebut</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-link_002dto_002dgbut"><code>ibtypes link-to-gbut</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-link_002dto_002dibut"><code>ibtypes link-to-ibut</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-mail_002daddress"><code>ibtypes mail-address</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-man_002dapropos"><code>ibtypes man-apropos</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-markdown_002dinternal_002dlink"><code>ibtypes markdown-internal-link</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-org_002dmode"><code>ibtypes org-mode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-patch_002dmsg"><code>ibtypes patch-msg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-pathname"><code>ibtypes pathname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-pathname_002dline_002dand_002dcolumn"><code>ibtypes pathname-line-and-column</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-rfc"><code>ibtypes rfc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-rfc_002dtoc"><code>ibtypes rfc-toc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-ripgrep_002dmsg"><code>ibtypes ripgrep-msg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-social_002dreference"><code>ibtypes social-reference</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-texinfo_002dref"><code>ibtypes texinfo-ref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-text_002dtoc"><code>ibtypes text-toc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes-www_002durl"><code>ibtypes www-url</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-ibut_003aat_002dp"><code>ibut:at-p</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-image_002ddired_002dexternal_002dviewer">image-dired-external-viewer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Image-Thumbnails">Smart Key - Image Thumbnails</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Info_002ddirectory_002dlist">Info-directory-list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invocation">Invocation</a></td></tr>
@@ -12158,6 +12457,8 @@ Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previ
<tr><th><a name="Function_fn_letter-O">O</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-objc_002dcpp_002dinclude_002dpath">objc-cpp-include-path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Objective_002dC-Source-Code">Smart Key - Objective-C Source Code</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-objc_002dinclude_002dpath">objc-include-path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Objective_002dC-Source-Code">Smart Key - Objective-C Source Code</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-org_002dctrl_002dc_002dctrl_002dc"><code>org-ctrl-c-ctrl-c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-org_002dmeta_002dreturn"><code>org-meta-return</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Function_fn_letter-R">R</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-run_002dhooks"><code>run-hooks</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glossary">Glossary</a></td></tr>
@@ -12305,7 +12606,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-Action-Key_002c-cell-argument">Action Key, cell argument</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Action-Key_002c-hide-or-show-cell">Action Key, hide or show cell</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Action-Key_002c-klink">Action Key, klink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Action-Key_002c-web-browsing">Action Key, web browsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Action-Key_002c-web-browsing">Action Key, web browsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Action-Mouse-Key">Action Mouse Key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Action-Mouse-Key-1">Action Mouse Key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Action-Mouse-Key-drag">Action Mouse Key drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Key-Drags">Smart Mouse Key Drags</a></td></tr>
@@ -12317,7 +12618,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-active-region-1">active region</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a Window</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-actype_002c-link_002dto_002dmail">actype, link-to-mail</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-actypes_002c-list-of">actypes, list of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-address">address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-address">address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-alpha-labels">alpha labels</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Autonumbering">Autonumbering</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-anonymous-ftp">anonymous ftp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Top">Top</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-API">API</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Embedding-Hyperbole">Embedding Hyperbole</a></td></tr>
@@ -12355,12 +12656,12 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><th><a name="Concept-Index_cp_letter-B">B</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-balance-windows">balance windows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-BBDB">BBDB</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Settings">HyRolo Settings</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-bibliography">bibliography</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliography">bibliography</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Big-Brother-DataBase">Big Brother DataBase</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Settings">HyRolo Settings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-blank-lines_002c-toggle">blank lines, toggle</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-bookmarks">bookmarks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Buttons">Global Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-boolean-expressions">boolean expressions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-breakpoint">breakpoint</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-breakpoint">breakpoint</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-browsing-URLs">browsing URLs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-browsing-URLs-in-find_002dfile">browsing URLs in find-file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer-id">buffer id</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Key-Modeline-Clicks">Smart Mouse Key Modeline Clicks</a></td></tr>
@@ -12368,12 +12669,14 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-buffer-menu-1">buffer menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Minibuffer-Menu-Activation">Minibuffer Menu Activation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer-menu-2">buffer menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Buffer-Menus">Smart Key - Buffer Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer-menu-item-drag">buffer menu item drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displaying-File-and-Buffer-Items">Displaying File and Buffer Items</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-buffer-replace">buffer replace</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer_002c-bury">buffer, bury</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer_002c-copy">buffer, copy</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displaying-Buffers">Displaying Buffers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer_002c-swap">buffer, swap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Swapping-Buffers">Swapping Buffers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer_002c-swap-1">buffer, swap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-buffer_002c-unbury">buffer, unbury</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-bug-tracking">bug tracking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-buffers-swap">buffers swap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bug-tracking">bug tracking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-bury-buffer">bury buffer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Key-Modeline-Clicks">Smart Mouse Key Modeline Clicks</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-burying">burying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-button">button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons">Buttons</a></td></tr>
@@ -12423,14 +12726,14 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-button_002c-moving">button, moving</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-Buttons">Explicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-button_002c-multiple-lines">button, multiple lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Label-Normalization">Button Label Normalization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-button_002c-split-across-lines">button, split across lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Label-Normalization">Button Label Normalization</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-byte-compiler-error">byte compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-byte-compiler-error">byte compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-C">C</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-C-call-tree">C call tree</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-C-flow-graph">C flow graph</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-C_002fC_002b_002b-call-trees">C/C++ call trees</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-C_002fC_002b_002b-cross_002dreference">C/C++ cross-reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-call-tree_002c-C">call tree, C</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C-call-tree">C call tree</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C-flow-graph">C flow graph</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002fC_002b_002b-call-trees">C/C++ call trees</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002fC_002b_002b-cross_002dreference">C/C++ cross-reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-call-tree_002c-C">call tree, C</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-cell_002c-adding">cell, adding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Adding-and-Killing">Adding and Killing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-cell_002c-appending">cell, appending</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Splitting-and-Appending">Splitting and Appending</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-cell_002c-attribute">cell, attribute</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cell-Attributes">Cell Attributes</a></td></tr>
@@ -12461,6 +12764,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-cell_002c-yanking-contents">cell, yanking contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Adding-and-Killing">Adding and Killing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-change-key-bindings">change key bindings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-change-key-bindings-1">change key bindings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-change_002dlog_002dmode">change-log-mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Lisp-Source-Code">Smart Key - Lisp Source Code</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-changing-the-view-spec">changing the view spec</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-click_002c-buffer-menu">click, buffer menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Buffer-Menus">Smart Key - Buffer Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-click_002c-button">click, button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Hyperbole-Buttons">Smart Key - Hyperbole Buttons</a></td></tr>
@@ -12475,17 +12779,20 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-clone-window">clone window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cloning-Windows">Cloning Windows</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-clone-window-1">clone window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-clone-window-2">clone window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-outside-a-Window">Smart Mouse Drags outside a Window</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-code-block">code block</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-code-block-selection">code block selection</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Thing-Selection">Smart Key Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-collaboration">collaboration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner-History">Koutliner History</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-collapse-lines">collapse lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-collapsing">collapsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-comment">comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-comment-1">comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-compiler-error">compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-compiler-error-1">compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-company_002dmode">company-mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Company-Mode">Smart Key - Company Mode</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compiler-error">compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compiler-error-1">compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-completion">completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Argument-Selection">Smart Key Argument Selection</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-completion-1">completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-completion-2">completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Argument-Completion">Smart Key - Argument Completion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion-1">completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion-2">completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Company-Mode">Smart Key - Company Mode</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion-3">completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Argument-Completion">Smart Key - Argument Completion</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-configuration">configuration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customization">Customization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-contacts_002c-Google">contacts, Google</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Settings">HyRolo Settings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-context">context</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
@@ -12502,9 +12809,9 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-creator-attribute">creator attribute</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cell-Attributes">Cell Attributes</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-credits">credits</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Top">Top</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-cross-referencing">cross referencing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner-History">Koutliner History</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cross_002dreference_002c-Texinfo">cross-reference, Texinfo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cscope">Cscope</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ctags-entry">ctags entry</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreference_002c-Texinfo">cross-reference, Texinfo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Cscope">Cscope</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ctags-entry">ctags entry</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-customization">customization</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customization">Customization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-customization-1">customization</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customization">Customization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-customize">customize</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
@@ -12518,7 +12825,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><th><a name="Concept-Index_cp_letter-D">D</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-database">database</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-RDB-Mode">Smart Key - RDB Mode</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-datestamps">datestamps</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Keys">HyRolo Keys</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-dbx">dbx</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dbx">dbx</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-debugging-Smart-Keys">debugging Smart Keys</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Debugging">Smart Key Debugging</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-default-label-type">default label type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-default-Smart-Key-context">default Smart Key context</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Operations">Smart Key Operations</a></td></tr>
@@ -12545,10 +12852,11 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-disable-local-key-override">disable local key override</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-display">display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-display-function">display function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-display-outside-Emacs">display outside Emacs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-display-where">display where</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-DisplayHere-mode">DisplayHere mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Dired-Mode">Smart Key - Dired Mode</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-distributed-collaboration">distributed collaboration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner-History">Koutliner History</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-document-identifier">document identifier</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-document-identifier">document identifier</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-double-click">double click</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Argument-Selection">Smart Key Argument Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-drag">drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#By-Dragging">By Dragging</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-drag-1">drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
@@ -12580,13 +12888,15 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-dragging-outside-Emacs">dragging outside Emacs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-outside-a-Window">Smart Mouse Drags outside a Window</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-E">E</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-e_002dmail-address">e-mail address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-e_002dmail-address">e-mail address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-e_002dmail-address-1">e-mail address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cell-Attributes">Cell Attributes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-elink">elink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-elisp-identifier">elisp identifier</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Lisp-Source-Code">Smart Key - Lisp Source Code</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-ellipses">ellipses</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Emacs">Emacs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperbole-Overview">Hyperbole Overview</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Emacs-1">Emacs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Emacs-Lisp">Emacs Lisp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperbole-Overview">Hyperbole Overview</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Emacs-Lisp-compiler-error">Emacs Lisp compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Emacs-Lisp-compiler-error">Emacs Lisp compiler error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Emacs-Lisp-variables">Emacs Lisp variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-Variable-Substitution">Link Variable Substitution</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-emacs-outline">emacs outline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Emacs-support">Emacs support</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Colors">Button Colors</a></td></tr>
@@ -12597,7 +12907,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-Engelbart-1">Engelbart</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glossary">Glossary</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-environment-variables">environment variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-Variable-Substitution">Link Variable Substitution</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-equalize-windows">equalize windows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-etags-entry">etags entry</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-etags-entry">etags entry</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-exchanging-cells">exchanging cells</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Transposing">Transposing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-exit-HyControl">exit HyControl</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-expanding">expanding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
@@ -12606,6 +12916,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-explicit-button-creation">explicit button creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#By-Dragging">By Dragging</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-explicit-button-deletion">explicit button deletion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Deletion">Deletion</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-explicit-button-formats">explicit button formats</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Operational-and-Storage-Formats">Operational and Storage Formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-explicit-button-link">explicit button link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-explicit-button-modification">explicit button modification</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modification">Modification</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-explicit-button-renaming">explicit button renaming</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Renaming">Renaming</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-explicit-button-searching">explicit button searching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-and-Summarizing">Searching and Summarizing</a></td></tr>
@@ -12614,10 +12925,11 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-explicit-button_002c-creation">explicit button, creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programmatic-Button-Creation">Programmatic Button Creation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-exporting">exporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exporting">Exporting</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-exporting-an-outline">exporting an outline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-external-display">external display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-external-display-1">external display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-external-klink">external klink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-external-program">external program</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-external-viewer">external viewer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-external-viewer-1">external viewer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-extracting-from-tar-files">extracting from tar files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Tar-File-Mode">Smart Key - Tar File Mode</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-F">F</a></th><td></td><td></td></tr>
@@ -12626,7 +12938,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-file_002c-DEMO">file, DEMO</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Manual-Overview">Manual Overview</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-hycontrol_002eel">file, hycontrol.el</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-file_002c-importing">file, importing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-filename">filename</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filename">filename</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-fill-prefix">fill prefix</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Label-Normalization">Button Label Normalization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-filling">filling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filling">Filling</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-filling-1">filling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filling">Filling</a></td></tr>
@@ -12647,22 +12959,25 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-frame_002c-to-edge">frame, to edge</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-frame_002c-zoom">frame, zoom</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-frames-control">frames control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ftp">ftp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ftp-1">ftp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-func_002dmenu">func-menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ftp">ftp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ftp-1">ftp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-func_002dmenu">func-menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-function">function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-function-1">function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-function-menu">function menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-function-menu">function menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-G">G</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-game_002c-gomoku">game, gomoku</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Gomoku-Game">Smart Key - Gomoku Game</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-gdb">gdb</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-git-commit-reference">git commit reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-git-reference">git reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-github-reference">github reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gdb">gdb</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-git-commit-reference">git commit reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-git-reference">git reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-github-reference">github reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gitlab-reference">gitlab reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-glink">glink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-global-button">global button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons">Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-global-button-1">global button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Buttons">Global Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-global-button-2">global button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Files">Button Files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-global-button-link">global button link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-global-button_002c-modify">global button, modify</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Questions-and-Answers">Questions and Answers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-glossary">glossary</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glossary">Glossary</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Gmail-Contacts">Gmail Contacts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Settings">HyRolo Settings</a></td></tr>
@@ -12671,10 +12986,11 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-Gnus">Gnus</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Gnus-1">Gnus</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-News">Buttons in News</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Gnus-browsing">Gnus browsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-GNUS-Newsreader">Smart Key - GNUS Newsreader</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-GNUS-push_002dbuttons">GNUS push-buttons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GNUS-push_002dbuttons">GNUS push-buttons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-gomoku">gomoku</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Gomoku-Game">Smart Key - Gomoku Game</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Google-Contacts">Google Contacts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Settings">HyRolo Settings</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-grep">grep</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-grep">grep</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-grep-1">grep</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Grep">Grep</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-grep-files">grep files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-grid-of-windows">grid of windows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
@@ -12682,7 +12998,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-groupware">groupware</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glossary">Glossary</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-H">H</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hashtag">hashtag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hashtag">hashtag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-help-buffer">help buffer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Help-Buffers">Smart Key - Help Buffers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-help_002c-button">help, button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Operations">Smart Key Operations</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-help_002c-menu-items">help, menu items</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
@@ -12692,7 +13008,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-hide-subtree">hide subtree</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hide-tree">hide tree</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hiding">hiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-hiding-signatures">hiding signatures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hiding-signatures">hiding signatures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-highlighting-buttons">highlighting buttons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Button-Colors">Button Colors</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-history">history</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hook-variables">hook variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
@@ -12718,13 +13034,13 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-Hyperbole-features">Hyperbole features</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperbole-Overview">Hyperbole Overview</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-help">Hyperbole help</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Argument-Selection">Smart Key Argument Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-mail-comment">Hyperbole mail comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Hyperbole-mail-list">Hyperbole mail list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Hyperbole-mail-list">Hyperbole mail list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-main-menu">Hyperbole main menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-manual">Hyperbole manual</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invocation">Invocation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-menubar-menu">Hyperbole menubar menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-hyperbole-popup-menu">hyperbole popup menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-pulldown-menu">Hyperbole pulldown menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Hyperbole-report">Hyperbole report</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Hyperbole-report">Hyperbole report</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-types">Hyperbole types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-Types">Creating Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole-version">Hyperbole version</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suggestion-or-Bug-Reporting">Suggestion or Bug Reporting</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Hyperbole_002c-embedding">Hyperbole, embedding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Embedding-Hyperbole">Embedding Hyperbole</a></td></tr>
@@ -12752,7 +13068,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-ibtype_002c-help">ibtype, help</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-ibtype_002c-predicate">ibtype, predicate</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-ibtype_002c-return-val">ibtype, return val</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-ibtypes_002c-list-of">ibtypes, list of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ibtypes_002c-list-of">ibtypes, list of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-ibuffer-menu">ibuffer menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Key-Modeline-Clicks">Smart Mouse Key Modeline Clicks</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-ibuffer-menu-1">ibuffer menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Buffer-Menus">Smart Key - Buffer Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-idea-structuring">idea structuring</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner-History">Koutliner History</a></td></tr>
@@ -12761,18 +13077,23 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-idstamp-0">idstamp 0</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Idstamps">Idstamps</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-idstamp-attribute">idstamp attribute</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cell-Attributes">Cell Attributes</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-idstamp-counter">idstamp counter</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Idstamps">Idstamps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ilink">ilink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-image-display">image display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-images">images</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Image-Thumbnails">Smart Key - Image Thumbnails</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-implicit-button">implicit button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons">Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-implicit-button-1">implicit button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-implicit-button-labels">implicit button labels</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-implicit-button-link">implicit button link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-implicit-button-type">implicit button type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Types">Implicit Button Types</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-implicit-button-types">implicit button types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-implicit-button-types">implicit button types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-importing">importing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-importing-a-file">importing a file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-inactive-minibuffer">inactive minibuffer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Minibuffer-Menu-Activation">Minibuffer Menu Activation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Info-browser">Info browser</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Key-Modeline-Clicks">Smart Mouse Key Modeline Clicks</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Info-browsing">Info browsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Info-Manuals">Smart Key - Info Manuals</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Info-manual">Info manual</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invocation">Invocation</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Info-node">Info node</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Info-node">Info node</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-InfoDock">InfoDock</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glossary">Glossary</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-initialization-file">initialization file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Autonumbering">Autonumbering</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-inserting-tabs">inserting tabs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-insertion">insertion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
@@ -12786,14 +13107,19 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-interactive-cmd-char_002c-_002bX">interactive cmd char, +X</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Type-Creation">Action Type Creation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-interactive-computing">interactive computing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glossary">Glossary</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-interactive-form">interactive form</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Type-Creation">Action Type Creation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-internal-custom-display">internal custom display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-internal-display">internal display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-internal-image-display">internal image display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-internal-klink">internal klink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-internal-standard-display">internal standard display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-internal-viewer">internal viewer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Internet-RFC">Internet RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Internet-RFC-1">Internet RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Internet-RFC">Internet RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Internet-RFC-1">Internet RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-invoking-HyControl">invoking HyControl</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-invoking-Hyperbole">invoking Hyperbole</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ipython">ipython</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-isearch">isearch</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invisible-Text-Searches">Invisible Text Searches</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-issue-tracking">issue tracking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-issue-tracking">issue tracking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-item-drag">item drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-item-throw">item throw</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
@@ -12803,7 +13129,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-jump-to-window-by-letter">jump to window by letter</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-K">K</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-kcell-link">kcell link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kcell-link">kcell link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-key-binding-list">key binding list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-key-binding_002c-C_002dc-_002e">key binding, C-c .</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-key-binding_002c-C_002dc-_0040">key binding, C-c @</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
@@ -12819,7 +13145,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-key-binding_002c-smart-keys">key binding, smart keys</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-key-bindings_002c-toggle">key bindings, toggle</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-key-bindings_002c-toggle-1">key bindings, toggle</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-key-sequence">key sequence</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-key-sequence">key sequence</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-keyboard-drags">keyboard drags</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-keyboard-link-creation">keyboard link creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-keyboard_002c-jump-to-window">keyboard, jump to window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
@@ -12828,7 +13154,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-kill-and-yank-1">kill and yank</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-between-Windows">Smart Mouse Drags between Windows</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-kill-and-yank-2">kill and yank</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-kill-region">kill region</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Thing-Selection">Smart Key Thing Selection</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-klink">klink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-klink">klink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-klink-1">klink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-klink-referent">klink referent</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-klink_002c-activating">klink, activating</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
@@ -12838,7 +13164,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-klink_002c-internal">klink, internal</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-klink_002c-view-spec">klink, view spec</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-knowledge-transfer">knowledge transfer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner-History">Koutliner History</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-koutline-link">koutline link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-koutline-link">koutline link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-koutline-mode">koutline mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Koutliner-commands">Koutliner commands</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menu-Commands">Menu Commands</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Koutliner-menu">Koutliner menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menu-Commands">Menu Commands</a></td></tr>
@@ -12856,23 +13182,28 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-label-type_002c-legal-1">label type, legal</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-label_002c-button">label, button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-Buttons">Explicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-label_002c-button-1">label, button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Buttons">Global Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-labeling-implicit-buttons">labeling implicit buttons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-legal-labels">legal labels</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Autonumbering">Autonumbering</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-level">level</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-level-1">level</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-line-and-column">line and column</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-line-and-column">line and column</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link">link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Links">Links</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link-action-types">link action types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link-button">link button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-Buttons">Explicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link-creation">link creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#By-Dragging">By Dragging</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link-creation-from-keyboard">link creation from keyboard</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link-display">link display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-to-explicit-button">link to explicit button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-to-global-button">link to global button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-to-implicit-button">link to implicit button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link_002c-creation">link, creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#By-Menu">By Menu</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link_002c-display-function">link, display function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-link_002c-pathname">link, pathname</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-link_002c-pathname-line-and-column">link, pathname line and column</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link_002c-pathname">link, pathname</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link_002c-pathname-line-and-column">link, pathname line and column</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link_002c-viewer-program">link, viewer program</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-link_002c-web-search">link, web search</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-linking_002c-in_002dplace">linking, in-place</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-Buttons">Explicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lisp-identifier">lisp identifier</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Lisp-Source-Code">Smart Key - Lisp Source Code</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Lisp-variables">Lisp variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-Variable-Substitution">Link Variable Substitution</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-list">list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-list-1">list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
@@ -12888,20 +13219,21 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-mail-hooks">mail hooks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-mail-inclusion">mail inclusion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-mail-reader">mail reader</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-mailcap">mailcap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-mailer-initialization">mailer initialization</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-mailing-an-outline">mailing an outline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-mailing-buttons">mailing buttons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-make-frame">make frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-make-window">make window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-man-apropos">man apropos</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-man-apropos">man apropos</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-man-page-references">man page references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Man-Pages">Smart Key - Man Pages</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-man-pages">man pages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-man-pages">man pages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-margin">margin</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filling">Filling</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-markdown-link">markdown link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-markdown-link">markdown link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-markup-pair">markup pair</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-markup-pair-1">markup pair</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-match-lines">match lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-match-lines">match lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-match-lines-1">match lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-match-lines-2">match lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-maximize-frame">maximize frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-maximize-window">maximize window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-menu-help">menu help</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
@@ -12938,7 +13270,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-menu_002c-Button_002dFile">menu, Button-File</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-menu_002c-Cust">menu, Cust</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-menu_002c-Cust-1">menu, Cust</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customization">Customization</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-menu_002c-Cust_002fReferents">menu, Cust/Referents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-menu_002c-Cust_002fReferents">menu, Cust/Referents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Internal-Viewers">Internal Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-menu_002c-Cust_002fURL_002dDisplay">menu, Cust/URL-Display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-menu_002c-Cust_002fURL_002dDisplay-1">menu, Cust/URL-Display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-WWW-URLs">Smart Key - WWW URLs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-menu_002c-Cust_002fWeb_002dSearch">menu, Cust/Web-Search</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Web-Search-Engines">Web Search Engines</a></td></tr>
@@ -12985,7 +13317,6 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-Messages-buffer">Messages buffer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Debugging">Smart Key Debugging</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-MH_002de">MH-e</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-middle-mouse-key">middle mouse key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Keys">Smart Keys</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-MIME">MIME</a>:</td><td>&nbsp;</td><td valign="top"><a href="#External-Viewers">External Viewers</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-minibuffer-menu">minibuffer menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-minibuffer-menu-1">minibuffer menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Minibuffer-Menu-Activation">Minibuffer Menu Activation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-minibuffer-menus">minibuffer menus</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
@@ -13022,6 +13353,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><th><a name="Concept-Index_cp_letter-N">N</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-name_002c-button">name, button</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-Buttons">Explicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-named-window-configuration">named window configuration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Window-Configurations">Window Configurations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-naming-implicit-buttons">naming implicit buttons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-news">news</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-news-comment">news comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-News">Buttons in News</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-news-hooks">news hooks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
@@ -13035,13 +13367,13 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><th><a name="Concept-Index_cp_letter-O">O</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-object_002doriented-code-browsing">object-oriented code browsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-The-OO_002dBrowser">Smart Key - The OO-Browser</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-obtaining-Hyperbole">obtaining Hyperbole</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-online-library">online library</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-online-library">online library</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-OO_002dBrowser">OO-Browser</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-The-OO_002dBrowser">Smart Key - The OO-Browser</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-option-setting">option setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customization">Customization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-option-settings">option settings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Org-mode">Org mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Org-mode">Org mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Org-mode-1">Org mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Questions-and-Answers">Questions and Answers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-org_002dmode">org-mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-org_002dmode">org-mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-other-frame">other frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-other-window">other window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-outline-file-suffix">outline file suffix</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-Outlines">Creating Outlines</a></td></tr>
@@ -13083,9 +13415,9 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-pasting-a-region">pasting a region</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-pasting-a-region-1">pasting a region</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-between-Windows">Smart Mouse Drags between Windows</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-pasting-a-region-2">pasting a region</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-patch-output">patch output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-pathname">pathname</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-pathname_002c-line-and-column">pathname, line and column</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-patch-output">patch output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pathname">pathname</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pathname_002c-line-and-column">pathname, line and column</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-permanent-identifier">permanent identifier</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner">Koutliner</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-permanent-identifier-1">permanent identifier</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Idstamps">Idstamps</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-pipe-character">pipe character</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
@@ -13106,10 +13438,11 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-quit-HyControl">quit HyControl</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-R">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-radio-target">radio target</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-raise-frame">raise frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-rdb_002dmode">rdb-mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-RDB-Mode">Smart Key - RDB Mode</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-rebalance-windows">rebalance windows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-and-Deleting-Windows">Creating and Deleting Windows</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-reference">reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reference">reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-referent">referent</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-Buttons">Explicit Buttons</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-referent-display">referent display</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Referent-Display">Referent Display</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-refilling">refilling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filling">Filling</a></td></tr>
@@ -13117,21 +13450,23 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-region_002c-active">region, active</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a Window</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-relative-autonumber">relative autonumber</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Koutliner">Koutliner</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-relative-identifier">relative identifier</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Autonumbering">Autonumbering</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-remote-file">remote file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-remote-path">remote path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-remote-file">remote file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-remote-path">remote path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-remote-pathnames">remote pathnames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-remove-lines">remove lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-removing-Hyperbole-menu">removing Hyperbole menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Request-For-Comment">Request For Comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Request-For-Comment-1">Request For Comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-replace-window-buffer">replace window buffer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Request-For-Comment">Request For Comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Request-For-Comment-1">Request For Comment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-resize-frame-percentage">resize frame percentage</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-resizing-windows">resizing windows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Resizing-Windows">Resizing Windows</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-restoring-windows">restoring windows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Window-Configurations">Window Configurations</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-RFC">RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-RFC-1">RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-RFC">RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-RFC-1">RFC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ripgrep">ripgrep</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Rmail">Rmail</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Rolo">Rolo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo">HyRolo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-rolo-address">rolo address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rolo-address">rolo address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Rolo-commands">Rolo commands</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Menu">HyRolo Menu</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-rolo-entry">rolo entry</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Concepts">HyRolo Concepts</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-rolo-file">rolo file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Concepts">HyRolo Concepts</a></td></tr>
@@ -13171,6 +13506,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-searching_002c-rolo">searching, rolo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyRolo-Searching">HyRolo Searching</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-selection">selection</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Thing-Selection">Smart Key Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-selection_002c-menu-items">selection, menu items</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sequence-of-keys">sequence of keys</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-set">set</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-set-1">set</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-setting-the-view-spec">setting the view spec</a>:</td><td>&nbsp;</td><td valign="top"><a href="#View-Specs">View Specs</a></td></tr>
@@ -13182,7 +13518,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-shrink-frame">shrink frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-shrink-window">shrink window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-side-drag">side drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Side_002dby_002dSide-Window-Resizing">Side-by-Side Window Resizing</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-signatures_002c-hiding">signatures, hiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-signatures_002c-hiding">signatures, hiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Smart-Key">Smart Key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Keys">Smart Keys</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Smart-Key-1">Smart Key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glossary">Glossary</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Smart-Key-2">Smart Key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Questions-and-Answers">Questions and Answers</a></td></tr>
@@ -13205,11 +13541,12 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-Smart-Mouse-Key-toggle">Smart Mouse Key toggle</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Smart-Mouse-Keys">Smart Mouse Keys</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Keys">Smart Mouse Keys</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-smart-selection">smart selection</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Thing-Selection">Smart Key Thing Selection</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-social-media">social media</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-social-reference">social reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-source-line">source line</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-social-media">social media</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-social-reference">social reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-source-line">source line</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-splitting-a-cell">splitting a cell</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Splitting-and-Appending">Splitting and Appending</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-stack-frame">stack frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-stack-frame">stack frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-stack-frame-1">stack frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-star-outline">star outline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-starting-HyControl">starting HyControl</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-starting-Hyperbole">starting Hyperbole</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
@@ -13221,20 +13558,21 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-subtree_002c-hide">subtree, hide</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-subtree_002c-show">subtree, show</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-swap-buffers">swap buffers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Swapping-Buffers">Swapping Buffers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-swap-window-buffers">swap window buffers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-swapping">swapping</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-system-encapsulation">system encapsulation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encapsulating-Systems">Encapsulating Systems</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-T">T</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-table-of-contents">table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-table-of-contents-1">table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-table-of-contents">table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-table-of-contents-1">table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-table-of-contents-2">table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-tabs_002c-inserting">tabs, inserting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-tag">tag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-TAGS-file">TAGS file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-tags-file">tags file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tag">tag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TAGS-file">TAGS file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tags-file">tags file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-tar-archive-browsing">tar archive browsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Tar-File-Mode">Smart Key - Tar File Mode</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-terminal-use">terminal use</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons">Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Texinfo-cross_002dreference">Texinfo cross-reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Texinfo-cross_002dreference">Texinfo cross-reference</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Texinfo-manual">Texinfo manual</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invocation">Invocation</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-text-file">text file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Inserting-and-Importing">Inserting and Importing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-thing">thing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
@@ -13243,7 +13581,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-throw-item">throw item</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Drags">Keyboard Drags</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-thumbnails">thumbnails</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Image-Thumbnails">Smart Key - Image Thumbnails</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-toc-action-type">toc action type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-toc-implicit-button-type">toc implicit button type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-toc-implicit-button-type">toc implicit button type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-toggle-HyControl-mode">toggle HyControl mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-toggle-key-bindings">toggle key bindings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-toggle-key-bindings-1">toggle key bindings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Global-Key-Bindings">Global Key Bindings</a></td></tr>
@@ -13252,7 +13590,7 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-top_002dlevel-cell-1">top-level cell</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Idstamps">Idstamps</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-top_002dlevel-menu">top-level menu</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Menus">Menus</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-top_002dlevel-view">top-level view</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hiding-and-Showing">Hiding and Showing</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tramp">Tramp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Tramp">Tramp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-Tramp-1">Tramp</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-transposing-cells">transposing cells</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Transposing">Transposing</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-tree_002c-copying">tree, copying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Relocating-and-Copying">Relocating and Copying</a></td></tr>
@@ -13279,26 +13617,27 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><th><a name="Concept-Index_cp_letter-U">U</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-unbury-buffer">unbury buffer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Key-Modeline-Clicks">Smart Mouse Key Modeline Clicks</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-unburying">unburying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-UNIX-manual">UNIX manual</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-UNIX-manual">UNIX manual</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-unshifted-mouse-bindings">unshifted mouse bindings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-unshifted-mouse-keys">unshifted mouse keys</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Bindings">Smart Key Bindings</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-URL">URL</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL">URL</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-URL-1">URL</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-URL-2">URL</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-WWW-URLs">Smart Key - WWW URLs</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-URLs_002c-abbreviated">URLs, abbreviated</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-URLs_002c-using-with-find_002dfile">URLs, using with find-file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-URLs-with-Find_002dFile">Using URLs with Find-File</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-USENET">USENET</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-Mail">Buttons in Mail</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-USENET-1">USENET</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Buttons-in-News">Buttons in News</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-username">username</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-username">username</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-V">V</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-variable-setting">variable setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customization">Customization</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-variables">variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hook-Variables">Hook Variables</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-vector">vector</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Thing-Selection">Thing Selection</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-vector-1">vector</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-Delimited-Things">Smart Key - Delimited Things</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-version-control">version control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-version-control-1">version control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-version-control-2">version control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-version-control">version control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-version-control-1">version control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-version-control-2">version control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-version-control-3">version control</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-version-description">version description</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suggestion-or-Bug-Reporting">Suggestion or Bug Reporting</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-vertical-drag">vertical drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-and-Deleting-Windows">Creating and Deleting Windows</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-vertical-drag-1">vertical drag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a Window</a></td></tr>
@@ -13353,15 +13692,15 @@ Previous: <a href="#Function" accesskey="p" rel="prev">Function</a>, Up: <a href
<tr><td></td><td valign="top"><a href="#index-windows_002c-equalize">windows, equalize</a>:</td><td>&nbsp;</td><td valign="top"><a href="#HyControl">HyControl</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-windows_002c-rebalance">windows, rebalance</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Creating-and-Deleting-Windows">Creating and Deleting Windows</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-word-wrap">word wrap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filling">Filling</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-World_002dwide-Web">World-wide Web</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-World_002dwide-Web">World-wide Web</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-World_002dwide-Web-1">World-wide Web</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-World_002dwide-Web-2">World-wide Web</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-WWW-URLs">Smart Key - WWW URLs</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-WWW">WWW</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-WWW">WWW</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-WWW-1">WWW</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Action-Types">Action Types</a></td></tr>
<tr><td></td><td valign="top"><a href="#index-WWW-2">WWW</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-_002d-WWW-URLs">Smart Key - WWW URLs</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-X">X</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-xdb">xdb</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Buttons">Implicit Buttons</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xdb">xdb</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-Button-Type-Summaries">Implicit Button Type Summaries</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Concept-Index_cp_letter-Y">Y</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="#index-yank-region">yank region</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Smart-Key-Thing-Selection">Smart Key Thing Selection</a></td></tr>
diff --git a/man/hyperbole.info b/man/hyperbole.info
index 24fd99a..4465571 100644
--- a/man/hyperbole.info
+++ b/man/hyperbole.info
Binary files differ
diff --git a/man/hyperbole.pdf b/man/hyperbole.pdf
index 314f65f..157752d 100644
--- a/man/hyperbole.pdf
+++ b/man/hyperbole.pdf
Binary files differ
diff --git a/man/hyperbole.texi b/man/hyperbole.texi
index c699a03..fad543c 100644
--- a/man/hyperbole.texi
+++ b/man/hyperbole.texi
@@ -52,7 +52,7 @@
This manual is for GNU Hyperbole
(Edition @value{EDITION}, Published @value{UPDATED}).
-Copyright @copyright{} 1989-2017 Free Software Foundation, Inc.
+Copyright @copyright{} 1989-2019 Free Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -139,7 +139,10 @@ Texinfo markup language.
<CENTER><H2>The Everyday Hypertextual Information Manager</H2></CENTER>
-<P>Copyright &copy; 1989-2017 Free Software Foundation, Inc.</P>
+<CENTER><H3><A HREF="https://saythanks.io/to/rswgnu">Say thanks if you like Hyperbole.</A></H3></CENTER>
+
+
+<P>Copyright &copy; 1989-2019 Free Software Foundation, Inc.</P>
<P>GNU Hyperbole is available for use, modification, and distribution under
the terms of the GNU General Public License (GPL) Version 3 or later,
@@ -151,8 +154,8 @@ WITHOUT ANY WARRANTY, without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</P>
<PRE>
-Edition 7.0.2a
-Printed December 12, 2017.
+Edition 7.0.3b
+Printed August 11, 2019.
Published by the Free Software Foundation, Inc.
Author: Bob Weiner
@@ -176,11 +179,11 @@ Printed December 12, 2017.
@center The Everyday Hypertextual Information Manager
-@center Edition 7.0.2a, December 12, 2017.
+@center Say thanks: https://saythanks.io/to/rswgnu
@sp 2
@noindent
-Copyright @copyright{} 1989-2017 Free Software Foundation, Inc.
+Copyright @copyright{} 1989-2019 Free Software Foundation, Inc.
GNU Hyperbole is available for use, modification, and distribution
under the terms of the GNU General Public License (GPL) Version 3 or
@@ -193,6 +196,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@sp 2
@example
+Edition 7.0.3b
+Augut 11, 2019
+
Published by the Free Software Foundation, Inc.
Author: Bob Weiner
E-mail: <hyperbole-users@@gnu.org> (This is a mail list).
@@ -309,6 +315,10 @@ Buttons
* Button Type Precedence::
* Utilizing Explicit Buttons::
+Implicit Buttons
+
+* Implicit Button Type Summaries::
+
Utilizing Explicit Buttons
* Creation::
@@ -413,6 +423,7 @@ Smart Mouse Keys
Smart Keyboard Keys
+* Smart Key - Company Mode::
* Smart Key - Treemacs::
* Smart Key - Emacs Pushbuttons::
* Smart Key - Argument Completion::
@@ -428,6 +439,7 @@ Smart Keyboard Keys
* Smart Key - RDB Mode::
* Smart Key - Help Buffers::
* Smart Key - Pages Directory Mode::
+* Smart Key - Python Source Code::
* Smart Key - Identifier Menu Mode ::
* Smart Key - C Source Code::
* Smart Key - C++ Source Code::
@@ -435,7 +447,6 @@ Smart Keyboard Keys
* Smart Key - Lisp Source Code::
* Smart Key - Java Source Code::
* Smart Key - JavaScript Source Code::
-* Smart Key - Python Source Code::
* Smart Key - Objective-C Source Code::
* Smart Key - Fortran Source Code::
* Smart Key - Occurrence Matches::
@@ -462,7 +473,7 @@ Smart Keyboard Keys
@chapter Introduction
This edition of the GNU Hyperbole Manual is for use with any version
-7.0.2a or greater of GNU Hyperbole. Hyperbole runs atop GNU Emacs 24.3
+7.0.3b or greater of GNU Hyperbole. Hyperbole runs atop GNU Emacs 24.3
or higher. It will trigger an error if your Emacs is older.
This chapter summarizes the structure of the rest of the manual,
@@ -490,16 +501,17 @@ This is a reference manual with extensive details about Hyperbole use. If
you prefer a simpler, more interactive introduction to Hyperbole,
the @file{DEMO} file included in the Hyperbole distribution demonstrates
many of Hyperbole's standard facilities without the need to read through
-this reference manual. It is a good way to rapidly understand some of what
-Hyperbole can do for you. Once Hyperbole is installed, (@pxref{Setup}),
-you can access the DEMO with the key sequence @bkbd{C-h h d d}.
+this reference manual. The DEMO is a good way to rapidly understand some
+of what Hyperbole can do for you. Once Hyperbole is installed,
+(@pxref{Setup}), you can access the DEMO with the key sequence @bkbd{C-h h
+d d}.
@xref{Glossary}, for definitions of Hyperbole terms. In some cases,
-terms are not precisely defined within the body of this manual since
-they are defined within the glossary. Be sure to reference the
-glossary if a term is unclear to you. Although you need not have a keen
-understanding of all of these terms, a quick scan of the glossary should
-help throughout Hyperbole use.
+terms are not precisely defined within the body of this manual since they
+are defined within the glossary. Be sure to reference the glossary if a
+term is unclear to you. Although you need not have a keen understanding of
+all of these terms, a quick scan of the glossary helps throughout Hyperbole
+use.
@xref{Setup}, for explanations of how to obtain, install, configure
and load Hyperbole for use. This appendix includes information on
@@ -570,19 +582,19 @@ its use as the prime means of organizing and interlinking the constant
flows of daily information.
GNU Hyperbole takes a distinctly different approach. It has its own
-hypertext technology that can interface perfectly with web links but
-which are much easier to create (simply drag from the source to the
-destination of a link to create a new hyperlink). Hyperbole
-hyperbuttons can link not only to static information but can perform
-arbitrary actions through the use of button types written in a single,
-highly interactive language, Emacs Lisp. Hyperbole adds all of this
-power to your written documents, e-mail, news articles, contact
-management, outlines, directory listings, and much more. Hyperbole
-works well with the very latest versions of GNU Emacs.
-
-Unlock the power of GNU Hyperbole to make your information work for
-you. One system. One language. One manual. One solution. Learn GNU
-Hyperbole and start moving further, faster.
+hypertext technology that can interface perfectly with web links but which
+are much easier to create (simply drag from the source to the destination
+of a link to create a new hyperlink). Hyperbole hyperbuttons can link not
+only to static information but can perform arbitrary actions (through the
+use of button types written in a single, highly interactive language, Emacs
+Lisp). Hyperbole adds all of this power to your written documents, e-mail,
+news articles, contact management, outlines, directory listings, and much
+more. Hyperbole works well with the very latest versions of GNU Emacs
+across every editing and viewing mode in Emacs.
+
+Unlock the power of GNU Hyperbole to make your information work for you.
+One system. One language. One manual. One solution. Learn Hyperbole and
+start moving further, faster.
@node Hyperbole Overview, Mail Lists, Motivation, Introduction
@section Hyperbole Overview
@@ -593,7 +605,7 @@ Hyperbole and start moving further, faster.
@cindex Emacs Lisp
@cindex Emacs
GNU Hyperbole (pronounced Ga-new Hi-per-bo-lee), or just Hyperbole, is
-an efficient and programmable hypertextual information management
+an efficient, programmable hypertextual information management
system. It is intended for everyday work on any GNU Emacs platform.
Hyperbole allows hypertext buttons to be embedded within unstructured
and structured files, mail messages and news articles. It offers
@@ -609,9 +621,12 @@ Hyperbole consists of five parts:
@item Buttons and Smart Keys
Hyperbole hyperlink and other kinds of buttons (explicit buttons) may be
added to documents with a simple drag between windows, no markup language
-needed. Implicit buttons are patterns automatically recognized within text
-that perform actions, e.g. bug#24568 displays the bug status information
-for that bug number. @xref{Buttons}.
+needed. Implicit buttons are patterns automatically recognized within
+existing text that perform actions, e.g. bug#24568 displays the bug status
+information for that Emacs bug number, without the need for any additional
+markup. Global buttons are buttons that are activated by name from
+anywhere within Emacs.
+@xref{Buttons}.
Buttons are accessed by clicking on them or referenced by name (global
buttons), so they can be activated regardless of what is on screen.
@@ -632,7 +647,8 @@ fast, flexible file and text finding commands. A powerful, hierarchical
contact manager, @pxref{HyRolo}, which anyone can use, is also included.
It is easy to learn since it introduces only a few new mechanisms
and has a menu interface, which may be operated from the keyboard or the
-mouse;
+mouse; it may also be used to look up any record-based information and
+Hyperbole buttons may be embedded in any records;
@item Screen Control
the fastest, easiest-to-use window and frame control available for GNU
@@ -640,13 +656,14 @@ Emacs, @pxref{HyControl}. With just a few keystrokes, you can shift from
increasing a window's height by 5 lines to moving a frame by 220 pixels
or immediately moving it to a screen corner. Text in each window or
frame may be enlarged or shrunk (zoomed) for easy viewing, plus many
-other features;
+other features; this allows Hyperbole to quickly control the way
+information is presented on-screen;
@item Hypertextual Outliner
an advanced outliner, @pxref{Koutliner}, with multi-level
autonumbering and permanent identifiers attached to each outline node
for use as hypertext link anchors, per node properties and flexible
-view specifications that can be embedded within links or used
+view specifications that can be included in links or used
interactively;
@item Programming Library
@@ -701,7 +718,7 @@ Some of Hyperbole's most significant features are:
@itemize @bullet
@item
-Buttons may link to information or may execute procedures, such as
+Buttons may link to information or may execute functions, such as
starting or communicating with external programs;
@item
@@ -1179,7 +1196,7 @@ on the last line to end the dired session (bury its buffer).
If you use the Treemacs file viewer Emacs package, you can configure Hyperbole
to use this instead of Dired when you click on a modeline buffer id.
-Since this is a customization option, it may be change permanently like so.
+Since this is a customization option, it may be changed permanently like so.
Use @bkbd{M-x customize-set-variable @key{RET} action-key-modeline-buffer-id-function @key{RET}}.
Change the value to @code{smart-treemacs-modeline}. Then press @key{RET}. To change it back
to Hyperbole's default, use the value, @code{dired-jump}.
@@ -1409,14 +1426,15 @@ unless it is the only window in that frame.
@cindex drag, dired item
@cindex drag, buffer menu item
@cindex drag, Treemacs item
-You can do the same thing with items in dired, buffer menu and ibuffer menu
-listing buffers rather than buffers themselves. Drag with the Action Mouse Key
-and the selected item will be displayed in any Emacs window in which you
-release. Drag outside Emacs and it will be displayed in a new frame. To
-display the last item you want, press the Action Key on it and it will display
-within the listing window itself. (If you use the Treemacs file viewer package,
-item dragging works there as well). Remember that you can emulate these drags
-from the keyboard when needed, @pxref{Keyboard Drags}.
+You can also drag items to other windows with the Action Key in Dired,
+Buffer Menu, Ibuffer and Treemacs listing buffers, rather than the
+buffers themselves. Drag with the Action Mouse Key and the selected
+item will be displayed in any Emacs window in which you release. Drag
+outside Emacs and it will be displayed in a new frame. To display the
+last item you want within the listing window itself, press and release
+the Action Key on that item after dragging your other items to their
+respective windows. Remember that you can emulate these drags from
+the keyboard when needed, @pxref{Keyboard Drags}.
So now you can put a bunch of buffers and files on your screen wherever
you like. Typically, a brief visual pulse is shown first at the source item and
@@ -1450,37 +1468,66 @@ session since drag actions are not supported without a window system.
@cindex window by letter
@cindex jump to window by letter
@cindex keyboard, jump to window
-For even faster keyboard-based display of items, use the Emacs
-package @code{ace-window} (see @url{https://elpa.gnu.org/packages/ace-window.html}).
+For even faster keyboard-based display of items and drag emulations,
+use the Emacs package @code{ace-window}
+(see @url{https://elpa.gnu.org/packages/ace-window.html}).
The ace-window package assigns short letter IDs to each Emacs window and lets
you jump to or operate upon a specific window by giving its ID. Hyperbole can
add commands to ace-window that replace the two-step drag emulation key
-described above with a single key sequence that displays dired or
-buffer menu @emph{items}.
+described above with a single key sequence that does not require moving to
+the drag target window since it is specified by ID as part of the command.
To enable this feature, in your Emacs initialization file after
Hyperbole is initialized, if you do not have a key bound for
@code{ace-window}, then call: @code{(hkey-ace-window-setup \"\M-o\")}
-to bind it to @bkbd{M-o}. Otherwise, call the setup function without
-a key: @code{(hkey-ace-window-setup)}.
+to bind it to @bkbd{M-o}, replacing Hyperbole's
+default @code{hkey-operate} command there (because ace-window can emulate
+the drags performed by @code{hkey-operate}). If you already have a key bound
+for @code{ace-window}, then just ensure it is initialized by calling
+@code{(hkey-ace-window-setup)} without a key argument.
@cindex link creation from keyboard
@cindex keyboard link creation
@kindex M-o i <window-id>
+@kindex M-o m <window-id>
+@kindex M-o r <window-id>
@kindex M-o t <window-id>
@cindex drag item
+@cindex replace window buffer
+@cindex swap window buffers
@cindex throw item
+@cindex buffer replace
+@cindex buffers swap
@cindex item drag
@cindex item throw
After setup, the leftmost character or two of each window's modeline will show
the ID to type to use that window as the drag destination. Then whenever point
is on an item you want displayed in another window, use @bkbd{M-o i
-<id-of-window-to-display-item-in>} and watch the magic happen. You can also use
-this command to create explicit button links to other window buffers when in an editable
-buffer rather than on an item. If you want to display multiple items in different
-windows, instead use the @bkbd{M-o t <id-of-window-to-display-item-in>} key sequence to
-@emph{throw} the item to the window.
+<id-of-window-to-display-item-in>} and watch the magic happen. If you
+want to display multiple items in different windows, instead use
+the @bkbd{M-o t <id-of-window-to-display-item-in>} key sequence to
+@emph{throw} the item to the window. To @emph{replace}
+the selected window's buffer with that of another window, use
+@bkbd{M-o r <id-of-window-displaying-desired-buffer>}. To instead
+@emph{swap} the selected window's buffer with that of another window,
+use @bkbd{M-o m <id-of-window-to-swap-with>}.
+
+In summary:
+@table @asis
+@item M-o i <window>
+insert listing item at point into <window>; if not on a listing item,
+trigger an error
+
+@item M-o m <window>
+swap the buffers in the selected window and <window>
+
+@item M-o r <window>
+replace the selected (current) window's buffer with that of <window>
+
+@item M-o t <window>
+throw listing item at point or current buffer to <window>
+@end table
@c -------
@@ -1517,7 +1564,7 @@ windows, instead use the @bkbd{M-o t <id-of-window-to-display-item-in>} key sequ
@c normally under Hyperbole.
@c The code for Smart Key modifiers can be found in
-@c @file{@code{$@{hyperb:dir@}}/hmouse-mod.el}.
+@c @file{$@{hyperb:dir@}/hmouse-mod.el}.
@node Buttons, Menus, Smart Keys, Top
@@ -1719,10 +1766,10 @@ type} identifies a pattern or state that when matched triggers
an @emph{action} associated with the implicit button type. The action
is specified by either a Hyperbole action type (@pxref{Action Types})
or an Emacs Lisp function. Implicit button types may use the same
-action types that explicit buttons use. As an example, a pathname
-implicit button type would match to any existing local filename or
-directory name and its action would be to display the associated file
-or directory, typically in another window.
+action types that explicit buttons use. As an example, the pathname
+implicit button type matches to any existing local filename or
+directory name and its action displays the associated file or
+directory, typically in another window.
@vindex file, hibtypes.el
@cindex context
@@ -1730,14 +1777,15 @@ or directory, typically in another window.
@cindex activating implicit button
@cindex menu item, Ibut/Act
@kindex C-h h i a
-Unlike explicit buttons, implicit buttons have no individual button data
-other than their textual labels. You use implicit button types which
-include boolean expressions (predicates) that match to both the label
-and the context required of any button of the type. Each time a Smart
-Key is pressed at a location, Hyperbole evaluates the predicates from
-the list of implicit button types and the first one that evaluates true
-is selected and its associated action is triggered. The Ibut/Act menu
-item, @bkbd{C-h h i a}, also activates any implicit button found at the
+Unlike explicit buttons, implicit buttons have no individual button
+data other than their text and optional labels. You use implicit
+button types which include boolean expressions (predicates) that match
+to both the label and the context required of any button of the type.
+Each time a Smart Key is pressed at a location, Hyperbole evaluates
+the predicates from the list of implicit button types and the first
+one that evaluates true is selected and its associated action is
+triggered. Alternatively, you can use the Ibut/Act menu
+item, @bkbd{C-h h i a}, to activate any implicit button found at the
current point.
All of this happens transparently and is easy to use once you try it.
@@ -1745,14 +1793,38 @@ The Hyperbole Smart Keys offer additional extensive context-sensitive
point-and-click type behavior beyond implicit button types. @xref{Smart
Key Operations}.
+@cindex implicit button labels
+@cindex labeling implicit buttons
+@cindex naming implicit buttons
+Individual implicit buttons may be labeled, allowing activation by
+name or use as a link target by other buttons. Here is a pathname
+button with a label of 'My Emacs Files':
+
+@example
+<[My Emacs Files]>: "~/.emacs.d"
+@end example
+
+The label is delimited by @samp{<[} and @samp{]>} and can be followed
+by any number of :, - or = separator characters, including none. You
+can activate the button either from its label or its text. With point
+on an implicit button, @bkbd{C-h h i l} will label it or you
+may simply type the label and delimiters manually.
+
+@menu
+* Implicit Button Type Summaries::
+@end menu
+
+@node Implicit Button Type Summaries, , Implicit Buttons, Implicit Buttons
+@subsection Implicit Button Type Summaries
+
@cindex ibtypes, list of
@cindex implicit button types
Below, standard implicit button types are listed in the order in which
Hyperbole tries to match to the types when looking for an implicit
button; @bkbd{C-h h i t @key{RET}} provides similar information. See
the Hyperbole file, @file{hibtypes.el}, for complete examples of
-implicit button types (where they are listed in reverse in increasing
-order of priority).
+implicit button types (they are listed in increasing order of
+priority).
@table @code
@@ -1863,13 +1935,57 @@ Jumps to the source line associated with a debugger stack frame or
breakpoint line. This works with gdb, dbx, and xdb. Such lines are
recognized in any buffer.
+@findex ibtypes ripgrep-msg
+@cindex grep
+@cindex ripgrep
+@cindex match lines
+@item ripgrep-msg
+Jumps to line associated with a ripgrep (rg) line numbered msg.
+Ripgrep outputs each pathname once followed by all matching lines in
+that pathname. Messages are recognized in any buffer (other than a
+helm completion buffer).
+
+@findex ibtypes ipython-stack-frame
+@cindex ipython
+@cindex stack frame
+@item ipython-stack-frame
+Jumps to line associated with an ipython stack frame line numbered msg.
+ipython outputs each pathname once followed by all matching lines in that pathname.
+Messages are recognized in any buffer (other than a helm completion buffer).
+
@findex ibtypes grep-msg
@cindex grep
@cindex compiler error
+@cindex match lines
@item grep-msg
Jumps to a line associated with grep or compilation error messages.
Messages are recognized in any buffer.
+@findex ibtypes link-to-ibut
+@cindex implicit button link
+@cindex link to implicit button
+@cindex ilink
+@item link-to-ibut <ilink>
+At point, activates a link to an implicit button within the current buffer.
+Recognizes the format ’<ilink:’ <button label> ’>’, e.g. <ilink: my sequence of keys>.
+
+@findex ibtypes link-to-gbut
+@cindex global button link
+@cindex link to global button
+@cindex glink
+@item link-to-gbut <glink>
+At point, activates a link to a global button.
+The global button’s action is executed in the context of the current buffer.
+Recognizes the format ’<glink:’ <button label> ’>’, e.g. <glink: open todos>.
+
+@findex ibtypes link-to-ebut
+@cindex explicit button link
+@cindex link to explicit button
+@cindex elink
+@item link-to-ebut <elink>
+At point, activates a link to an explicit button within the current buffer.
+Recognizes the format ’<elink:’ <button label> ’>’, e.g. <elink: project-list>.
+
@findex ibtypes klink
@cindex klink
@cindex koutline link
@@ -1902,10 +2018,12 @@ retrievals.
@findex ibtypes kbd-key
@cindex key sequence
+@cindex sequence of keys
@item kbd-key
-Executes a key sequence found around point, delimited by curly braces, @{@}, if any.
-Key sequences should be in human readable form, e.g.@: @bkbd{C-x C-b}. Formats such
-as @{^x^b@} will not be recognized.
+Executes a key series (series of key sequences) found around point,
+delimited by curly braces, @{@}, if any. Key series should be in
+human readable form, e.g.@: @bkbd{C-x C-b}. Formats such as @{^x^b@}
+will not be recognized.
Any key sequence must be a string of one of the following:
@itemize @bullet
@@ -1920,7 +2038,7 @@ Any key sequence must be a string of one of the following:
@vindex file, DIR
@item dir-summary
Detects filename buttons in files named "MANIFEST" or "DIR".
-Displays selected files. Each file name must be at the beginning of the
+Displays selected files. Each filename must be at the beginning of the
line and must be followed by one or more spaces and then another
non-space, non-parenthesis, non-brace character.
@@ -1929,7 +2047,7 @@ non-space, non-parenthesis, non-brace character.
@cindex toc implicit button type
@item text-toc
Jumps to the text file section referenced by a table of contents entry
-at point. The file name of the current buffer must contain
+at point. The filename of the current buffer must contain
@file{README} and there must be a `Table of Contents' or `Contents'
label on a line by itself (it may begin with an asterisk), preceding the
table of contents. Each toc entry must begin with some whitespace
@@ -2033,7 +2151,7 @@ produced by git log.
@vindex hibtypes-github-default-user
@item github-reference
Displays the Github entity associated with REFERENCE and optional USER and PROJECT.
-See @file{DEMO#Github (Remote) References} for examples.
+See @file{../DEMO#Github (Remote) References} for examples.
REFERENCE is a string of one of the following forms:
@itemize @bullet
@@ -2063,6 +2181,45 @@ If given, PROJECT overrides any project value in REFERENCE. If no
PROJECT value is provided, it defaults to the value of
@code{hibtypes-github-default-project}.
+@findex ibtypes gitlab-reference
+@cindex gitlab reference
+@cindex version control
+@vindex hibtypes-gitlab-default-project
+@vindex hibtypes-gitlab-default-user
+@item gitlab-reference
+Displays the Gitlab entity associated with REFERENCE and optional USER and PROJECT.
+See @file{../DEMO#Gitlab (Remote) References} for examples.
+
+REFERENCE is a string of one of the following forms:
+@itemize @bullet
+@item <ref-item>
+@item <user>/<project>/<ref-item>
+@item <project>/<ref-item>
+@item /<group>/<project>.
+or
+@item /<project-or-group> (where a group is a colection of projects)
+@end itemize
+
+<ref-item> is one of these:
+@table @asis
+@item @bullet{} one of the words: activity, analytics, boards or kanban, branches, commits, contributors, groups, issues or list, jobs, labels, merge_requests, milestones, pages, pipelines, pipeline_charts, members or people or staff, projects, pulls, schedules, snippets, status or tags
+the associated items are listed
+@item @bullet{} one of the words: branch, commit(s), issue(s), milestone(s), pull(s), snippet(s) or tag(s) followed by a '/' or '=' and an item-id
+the item is shown
+@item @bullet{} an issue reference given by a positive integer, e.g. @emph{92} or prefaced with @emph{GL-}, like GL-92
+the issue is displayed
+@item @bullet{} a commit reference given by a hex number, 55a1f0
+the commit diff is displayed
+@item @bullet{} a branch or tag reference given by an alphanumeric name, e.g. hyper20
+the files in the branch are listed.
+@end table
+
+@vindex hibtypes-gitlab-default-user
+USER defaults to the value of @code{hibtypes-gitlab-default-user}.
+If given, PROJECT overrides any project value in REFERENCE. If no
+PROJECT value is provided, it defaults to the value of
+@code{hibtypes-gitlab-default-project}.
+
@findex ibtypes social-reference
@cindex hashtag
@cindex username
@@ -2170,11 +2327,12 @@ at line-num and optional column-num. Also works for remote pathnames.
@cindex link, pathname
@item pathname
Makes a valid pathname display the path entry. Also works for
-delimited and non-delimited remote pathnames, Texinfo @file{} entries,
-and hash-style link references to HTML, Markdown or Emacs outline
-headings. Emacs Lisp library files (filenames without any directory
-component that end in .el and .elc) are looked up using
-the @code{load-path} directory list.
+delimited and non-delimited remote pathnames, Texinfo @@file@{@}
+entries, and hash-style link references to HTML, Markdown or Emacs
+outline headings, and MSWindows paths (see @file{$@{hyperb:dir@}/DEMO#POSIX
+and MSWindows Paths} for details). Emacs Lisp library files
+(filenames without any directory component that end in .el and .elc)
+are looked up using the @code{load-path} directory list.
@noindent
See the function documentation for @code{hpath:at-p} for possible
@@ -2184,20 +2342,37 @@ for a valid match. See the function documentation for @code{hpath:find}
for special file display options.
@findex ibtypes org-mode
-@vindex browse-url-browser-function
@cindex org-mode
@cindex Org mode
+@cindex radio target
+@cindex code block
+@kindex C-c C-c
+@kindex M-RET
+@findex org-ctrl-c-ctrl-c
+@findex org-meta-return
@item org-mode
-The Action Key follows any Org mode link at point or cycles through
-views of the outline subtree at point. In any other context besides
-the end of a line, the Action Key will invoke the Org mode standard
-binding of @bkbd{M-@key{RET}}, (org-meta-return). The Assist Key on
-an Org mode heading cycles through views of the whole buffer outline
-and on an Org mode link, displays standard Hyperbole help.
+For users of Emacs Org mode, Hyperbole does quite a few things.
+
+First, the Action Key follows internal links in Org mode files. When
+pressed on a link referent/target, the link definition is displayed,
+allowing two-way navigation between definitions and targets.
+
+Second, the Action Key follows Org mode external links. The Assist
+Key displays help when pressed on an Org mode link.
+
+Third, within a radio target definition, the Action Key jumps to the
+first occurrence of an associated radio target.
+
+Fourth, when point is on an outline heading in Org mode, the Action Key
+cycles the view of the subtree at point and the Assist Key cycles the
+view of all headings in the buffer.
+
+Fifth, with point on the first line of a code block definition, the
+Action Key executes the code block via the Org mode standard binding
+of @bkbd{C-c C-c}, @code{org-ctrl-c-ctrl-c}.
-The variable, @code{browse-url-browser-function}, customizes the url
-browser that is used for urls. Valid values of this variable
-include @code{browse-url-default-browser} and @code{browse-url-generic}.
+In any other context besides the end of a line, the Action Key invokes
+the Org mode standard binding of @bkbd{M-RET}, @code{org-meta-return}.
@findex ibtypes doc-id
@cindex online library
@@ -2357,7 +2532,7 @@ signalled.
@findex actypes link-to-ebut
@item link-to-ebut
-Performs an action given by another explicit button, specified by KEY and KEY-FILE.
+Performs an action given by an explicit button, specified by KEY and KEY-FILE.
@findex actypes link-to-elisp-doc
@item link-to-elisp-doc
@@ -2372,6 +2547,10 @@ the buffer is displayed with POINT at the top of the window.
@item link-to-file-line
Displays a file given by PATH scrolled to LINE-NUM.
+@findex actypes link-to-gbut
+@item link-to-gbut
+Performs an action given by an existing global button, specified by KEY.
+
@findex actypes link-to-Info-index-item
@item link-to-Info-index-item
Displays an Info index ITEM cross-reference.
@@ -2386,6 +2565,10 @@ Displays an Info NODE. NODE must be a string of the form
filename and nodename is available. Filename may be given without the
.info suffix.
+@findex actypes link-to-ibut
+@item link-to-ibut
+Performs an action given by an implicit button, specified by KEY-FILE, KEY and optional POINT.
+
@findex actypes link-to-kcell
@findex kcell:ref-to-id
@item link-to-kcell
@@ -2477,9 +2660,12 @@ at point.
@item www-url
Follows a link given by a URL. The variable,
@code{browse-url-browser-function}, customizes the url browser
-that is used. See its documentation string for details.
+that is used. Valid values of this variable include
+@code{browse-url-default-browser} and @code{browse-url-generic}.
+See its documentation string for details.
@end table
+
@cindex action
@vindex hui:ebut-prompt-for-action
Action types create a convenient way of specifying button behavior
@@ -2602,12 +2788,14 @@ upon the referent context in which the Action Key is released.
@example
Referent Context Link Type
----------------------------------------------------
+Global Button link-to-gbut
Explicit Button link-to-ebut
+Implicit Button link-to-ibut
Info Index Item link-to-Info-index-item
Info Node link-to-Info-node
Mail Reader Message link-to-mail
Directory Name link-to-directory
-File Name link-to-file
+Filename link-to-file
Koutline Cell link-to-kcell
Outline Heading link-to-string-match
Buffer attached to File link-to-file
@@ -4189,8 +4377,8 @@ This helps maintain any special formatting the appended text may have.
@cindex outline, foreign file
The paragraphs of another buffer or file may be inserted into a koutline
as a set of cells by using the @bkbd{C-x i} command. When prompted,
-you may use a buffer name or file name from which to insert;
-completion is provided for file names only.
+you may use a buffer name or filename from which to insert;
+completion is provided for filenames only.
@kindex koutliner, C-u C-x i
The elements from the original buffer are converted into kcells and
@@ -4222,7 +4410,7 @@ The outliner supports conversion of three types of files into koutline
files. You can import a file into an existing koutline,
following the tree at point, or can create a new koutline from the
imported file contents. @bkbd{M-x kimport:file @key{RET}} selects the
-importation type based on the buffer or file name suffix of the file to
+importation type based on the buffer or filename suffix of the file to
import.
@findex kotl-mode
@@ -4277,7 +4465,7 @@ World-Wide Web.
@bkbd{M-x kexport:html @key{RET}} prompts for the koutline buffer or
file to export, the HTML file or buffer to which to output, and the
-title to use for the HTML file. Completion of file names is provided.
+title to use for the HTML file. Completion of filenames is provided.
The conversion will then be done and the output file or buffer will be
written; the output file will not be displayed.
@@ -4588,7 +4776,7 @@ The e-mail address of the person who created this cell.
@item create-time
The time at which the cell was created. This is stored in a form that
allows for easy data comparisons but is displayed in a human readable
-format, such as @samp{Jan 28 18:27:59 CST 2017}.
+format, such as @samp{Jan 28 18:27:59 CST 2019}.
@end table
@kindex koutliner, C-c C-i
@@ -4699,7 +4887,7 @@ automatically added by HyRolo whenever a new record is added.
==================================================================
* Smith, John <js@@hiho.com> W708-555-2001 F708-321-1492
Chief Ether Maintainer, HiHo Industries
- 05/24/2017
+ 05/24/2019
@end group
@end example
@@ -5046,7 +5234,7 @@ list. In general, you should leave your personal rolo file as the
first entry in the list, since this is the only file to which the Add
command on the rolo menu adds entries.
-Hyperbole releases earlier than 4.17 used a different file name for the
+Hyperbole releases earlier than 4.17 used a different filename for the
personal rolo. If such a file exists, you will be prompted to rename
it whenever the HyRolo system is loaded.
@@ -5503,7 +5691,7 @@ Prompts for a klink specification. See the documentation for the function
@cindex interactive cmd char, +M
@cindex argument, mail message
@item +M
-Prompts for a mail message date and the file name in which it resides.
+Prompts for a mail message date and the filename in which it resides.
The mail parameters prompted for by this character code may change in
the future.
@@ -5955,13 +6143,13 @@ windows exist within a frame.
@vindex gbut:file
@item Global Button
-A form of explicit button which is accessed by name rather than direct
+A Hyperbole button which is accessed by name rather than direct
selection. Global buttons are useful when one wants quick access to
actions such as jumping to common file locations or for performing
-sequences of operations. One need not locate them since they are always
-available by name, with full completion offered. All global buttons are
-stored in the file given by the variable @code{gbut:file} and may be
-activated as regular explicit buttons by visiting this file. By
+sequences of operations. One need not locate them since they are
+always available by name, with full completion offered. All global
+buttons are stored in the file given by the variable @code{gbut:file}
+and may be activated with the Action Key when editing this file. By
default, this is the same as the user's personal button file.
@item Global Button File
@@ -6007,7 +6195,8 @@ DataBase (BBDB) package.
@item Implicit Button
A button recognized contextually by Hyperbole. Such buttons contain no
-button data. See also @b{implicit button type}.
+button data but may have an optional preceding label that looks like this:
+@samp{<[label]>}. See also @b{implicit button type}.
@item Implicit Button Type
A specification of how to recognize and activate implicit buttons of a
@@ -6016,16 +6205,18 @@ to documents created and managed by tools other than Hyperbole, for
example, programming documentation. @b{Ibtype} is a synonym for
implicit button type. See also @b{system encapsulation}.
-@c @cindex InfoDock
-@c @item InfoDock
-@c InfoDock is an integrated productivity toolset for software engineers
-@c and knowledge workers. It is presently built atop XEmacs and is no
-@c longer maintained. An older version from 1999 may be found at
-@c infodock.sf.net. InfoDock has all the power of emacs, but with an
-@c easier to use and more comprehensive menu-based user interface. Most
-@c objections people raise to using emacs have already been addressed in
-@c InfoDock. InfoDock was meant for people who wanted a complete,
-@c pre-customized environment in one package.
+@cindex InfoDock
+@item InfoDock
+InfoDock was an integrated productivity toolset for software engineers
+and knowledge workers built atop XEmacs; it is no longer maintained or
+updated. An older version from 1999 may be found at
+infodock.sf.net.
+
+InfoDock has much of the power of GNU Emacs, but with an
+easier to use and more comprehensive menu-based user interface. Most
+objections people raise to using emacs have already been addressed in
+InfoDock. InfoDock was meant for people who wanted a complete,
+pre-customized environment in one package.
@item Instance Number
A colon prefaced number appended to the label of a newly created button
@@ -6038,6 +6229,14 @@ See also @url{https://tkf.github.io/emacs-jedi/latest/}.
Jedi is a Emacs package for Python completion, definition and documentation lookup.
+@item Key Sequence
+A single sequence of keys that can invoke an Emacs command.
+
+@item Key Series
+A series of one or more Emacs key sequences delimited by braces that
+Hyperbole processes when activated as an implicit button, as if the
+keys were typed in by the user.
+
@item Koutline
A hierarchically ordered grouping of cells which may be stored as a file
and viewed and edited as an outline.
@@ -6240,12 +6439,11 @@ Once you have Emacs set up at your site, GNU Hyperbole may be
installed by using the Emacs Package Manager. If you are not familiar
with it, @pxref{Packages,,,emacs,the GNU Emacs Manual}.
-If you have Hyperbole 5.10 or higher installed and simply want to
-upgrade it, invoke the Emacs Package Manager with @bkbd{M-x
-list-packages @key{RET}}, then use the @bkbd{U} key followed by
-the @bkbd{x} key to upgrade all out-of-date packages, Hyperbole among
-them. Then skip the text below and move on to the next
-section, @pxref{Invocation}.
+If you have Hyperbole installed and simply want to upgrade it, invoke
+the Emacs Package Manager with @bkbd{M-x list-packages @key{RET}},
+then use the @bkbd{U} key followed by the @bkbd{x} key to upgrade all
+out-of-date packages, Hyperbole among them. Then skip the text below
+and move on to the next section, @pxref{Invocation}.
Otherwise, to download and install the Hyperbole package, you should add
several lines to your personal Emacs initialization file, @file{~/.emacs}.
@@ -6417,25 +6615,78 @@ be of interest to users.
@cindex referent display
@cindex link display
@cindex display where
+@cindex display outside Emacs
@cindex where to display
-Hyperbole lets you control where link referents are displayed and even
-what Emacs function or external program is used to display them.
-There are three categories of referents, each with its own display
-setting:
+@cindex image display
+@cindex internal display
+@cindex external display
+Hyperbole lets you control where link referents are displayed. It also
+permits setting a specific Emacs function or external program
+to display them. There are four categories of referents, each with
+its own display setting, listed in decreasing order of priority. All
+of these variables are defined within @file{hpath.el}.
+
@example
Referent Category Variable Setting
========================================================================
-Internal Standard Display hpath:display-where
+Internal Image Display hpath:native-image-suffixes
Internal Custom Display hpath:internal-display-alist
External Display hpath:external-display-alist
+Internal Standard Display hpath:display-where
@end example
+@noindent
+Continue reading the next sections for information on how referents
+are displayed internally and externally.
+
+@node Internal Viewers, External Viewers, Referent Display, Customization
+@subsection Internal Viewers
+@vindex hpath:internal-display-alist
+@cindex file display function
+@cindex display function
+@cindex internal viewer
+@cindex link, display function
+
+@cindex internal image display
+@vindex hpath:native-image-suffixes
+@cindex internal custom display
+@vindex hpath:internal-display-alist
+@cindex internal standard display
+@vindex hpath:display-where
+When given a filename to display, Hyperbole first checks if its suffix
+is matched by @code{hpath:native-image-suffixes}. If so and if the
+function @code{image-mode} is defined, it uses that mode together with
+the value of @code{hpath:display-where} to display the image within an
+Emacs buffer.
+
+If no match is found, the @code{hpath:internal-display-alist} variable
+is checked for a filename match. Its value is an association list
+whose elements are (<file-name-regular-expression>
+. <function-of-one-arg>) pairs. Any path whose name matches
+a <file-name-regular-expression> will be displayed by calling the
+associated <function-of-one-arg> with the filename as the argument.
+The first regular expression that matches each filename is the one
+used. This can be used to format raw data files for convenient
+display.
+
+By default, this setting handles the following types of files:
+@table @emph
+@item Audio Files
+Major audio format files are played with the @code{play-sound-file} command.
+@item Info Manuals
+Files with a @file{.info} suffix (may also be compressed) are displayed in the Info browser.
+@item RDB Files
+Files with an @file{.rdb} suffix are displayed as relational databases using the RDB package
+available with InfoDock.
+@end table
+
@cindex menu, Cust/Referents
@kindex C-h h c r
-Regular file links are displayed in an Emacs window specified by the
-@code{hpath:display-where} setting which may be changed with the Cust/Referents
-@bkbd{C-h h c r} menu.
+Links to standard files, those which don't match any special referent
+category described earlier, are displayed in an Emacs window specified
+by the @code{hpath:display-where} setting. It may be changed with the
+Cust/Referents @bkbd{C-h h c r} menu.
@noindent
Available options are:
@@ -6453,7 +6704,7 @@ Display in a new single window frame
Display in another, possibly new window of the selected frame (this is
the default)
@item @bullet{} Single-Win
-Display in a window of the selected frame and delete its other windows
+Display in a window of the selected frame and delete its other windows
@end table
@page
@@ -6466,43 +6717,7 @@ Alternatively, you can use the Hyperbole menubar menu as shown here:
@end float
@sp 1
-@noindent
-Continue reading the next sections for information on custom Internal
-and External Viewers for link referencts.
-
-@node Internal Viewers, External Viewers, Referent Display, Customization
-@subsection Internal Viewers
-@vindex hpath:internal-display-alist
-@cindex file display function
-@cindex display function
-@cindex internal viewer
-@cindex link, display function
-When given a file name, Hyperbole will by default display the file for
-editing within an Emacs buffer. The @code{hpath:internal-display-alist}
-variable can be used to specify file name patterns, such as matching
-suffixes, which will invoke a special Emacs Lisp function to display
-any matching files within Emacs. This can be used to format raw data
-files for convenient display.
-
-For those who want to change this variable, @code{hpath:internal-display-alist}
-is defined in @file{hpath.el}. Its value is an association list whose
-elements are (<file-name-regular-expression> . <function-of-one-arg>)
-pairs. Any path whose name matches a <file-name-regular-expression>
-will be displayed by calling the associated <function-of-one-arg> with
-the file name as the argument.
-
-By default, this variable handles the following types of files:
-@table @emph
-@item Audio Files
-Major audio format files are played with the @code{play-sound-file} command.
-@item Info Manuals
-Files with a @file{.info} suffix (may also be compressed) are displayed in the Info browser.
-@item RDB Files
-Files with an @file{.rdb} suffix are displayed as relational databases using the RDB package
-available with InfoDock.
-@end table
-
-@xref{External Viewers}, for instructions on associating file names with
+@xref{External Viewers}, for instructions on associating filenames with
external, window-system specific viewers.
@node External Viewers, Link Variable Substitution, Internal Viewers, Customization
@@ -6515,10 +6730,13 @@ external, window-system specific viewers.
@cindex external program
@cindex external viewer
@cindex link, viewer program
-If you will be using Hyperbole under a window system,
-the @code{hpath:get-external-display-alist} function
-in @file{hpath.el} supports hyperlinks that open files using external, non-Emacs
-tools, e.g.@: a pdf reader or a vector graphic viewer.
+
+@cindex external display
+@vindex hpath:external-display-alist
+If you use Hyperbole under a window system,
+the @code{hpath:get-external-display-alist} function in @file{hpath.el}
+supports hyperlinks that open files using external, non-Emacs tools, e.g.@:
+a pdf reader or a vector graphics viewer.
The value returned by @code{hpath:get-external-display-alist} is determined
based on the window system supported by the current frame and the version
@@ -6528,8 +6746,8 @@ path whose name matches a <file-name-regular-expression> will be
displayed using the corresponding viewer-program or the first
viewer-program found on the system from a list of programs. If a
<viewer-program> entry contains a @samp{%s} string, the filename to
-display will be substituted at that point within the string.
-Otherwise, the filename will be appended to the <viewer-program>
+display is substituted at that point within the string.
+Otherwise, the filename is appended to the <viewer-program>
entry. Alternatively, the viewer-program may be a Lisp function that
takes a single filename argument.
@@ -6539,13 +6757,13 @@ for each available window system: @code{hpath:external-display-alist-macos},
@code{hpath:external-display-alist-x}. Examine and modify these
values to suit your needs.
-@cindex MIME
-@cindex mailcap
-@cindex external viewer
-On systems that have a MIME mailcap file (see
-@file{www.wikiwand.com/en/Mailcap}), this is used as a fallback
-set of external viewer associations when none are found
-within @code{hpath:get-external-display-alist}.
+@c @cindex MIME
+@c @cindex mailcap
+@c @cindex external viewer
+@c On systems that have a MIME mailcap file (see
+@c @file{www.wikiwand.com/en/Mailcap}), this is used as a fallback
+@c set of external viewer associations when none are found
+@c within @code{hpath:get-external-display-alist}.
@node Link Variable Substitution, Web Search Engines, External Viewers, Customization
@subsection Link Variable Substitution
@@ -6561,16 +6779,15 @@ compared against the values in @code{hpath:variables}. The first
match found, if any, is selected and its associated variable name is
substituted into the link pathname, in place of its literal value.
When a link button is activated, potentially at a different site,
-Hyperbole replaces each variable within the link pathname with the
-first matching value from this list to recreate the literal pathname.
+Hyperbole replaces each variable in the link pathname with the first
+matching value from this list to recreate the literal pathname.
Environment variables are also replaced whenever link paths are
resolved.
This permits sharing of links over wide areas, where the variable values
differ between link creator and link activator. The entire process
is wholly transparent to the user; it is explained here simply to help
-you in deciding whether or not to modify the value of
-@code{hpath:variables}.
+you in deciding whether or not to modify the value of @code{hpath:variables}.
@node Web Search Engines, Using URLs with Find-File, Link Variable Substitution, Customization
@subsection Web Search Engines
@@ -6642,7 +6859,7 @@ Hyperbole: @code{(hpath:find-file-urls-mode 1)}.
@cindex URLs, abbreviated
@cindex Tramp
Both full URLs and abbreviated ones, like @file{www.gnu.org}, are
-recognized. File name completion does not work with URLs; you
+recognized. filename completion does not work with URLs; you
have to type or paste in the entire URL. This feature will work only
if you have the builtin Tramp Emacs Lisp package; if you don't have
Tramp, an error message will be displayed when you try to enable
@@ -6673,9 +6890,11 @@ through invisible/hidden text, making the text temporarily visible
until point moves past that hidden part. When a search match is
selected, the surrounding text remains visible.
-This command toggles that setting (turns it off if a prefix
-argument less than or equal to 0 is given) and makes searches look at
-only visible text.
+You can temporarily disable searching of hidden text by typing @bkbd{M-s i}
+while in an incremental search. This key sequence toggles that
+setting and makes searches look at only visible text (or the reverse
+when invoked again). The setting lasts only through the current
+interactive search.
@node Button Colors, , Invisible Text Searches, Customization
@subsection Configuring Button Colors
@@ -7197,7 +7416,7 @@ Called from a program, takes three args: START, END and COLUMN.
@item kimport:insert-file @bkbd{C-x i}
Insert each paragraph in IMPORT-FROM as a separate cell in the current view.
Insert as sibling cells following the current cell. IMPORT-FROM may be a
-buffer name or file name (file name completion is provided).
+buffer name or filename (filename completion is provided).
@findex kimport:insert-register
@item kimport:insert-register @bkbd{C-x r i}
@@ -7815,6 +8034,7 @@ If dragged from an Emacs window to outside of Emacs:
@section Smart Keyboard Keys
@menu
+* Smart Key - Company Mode::
* Smart Key - Treemacs::
* Smart Key - Emacs Pushbuttons::
* Smart Key - Argument Completion::
@@ -7830,6 +8050,7 @@ If dragged from an Emacs window to outside of Emacs:
* Smart Key - RDB Mode::
* Smart Key - Help Buffers::
* Smart Key - Pages Directory Mode::
+* Smart Key - Python Source Code::
* Smart Key - Identifier Menu Mode ::
* Smart Key - C Source Code::
* Smart Key - C++ Source Code::
@@ -7837,7 +8058,6 @@ If dragged from an Emacs window to outside of Emacs:
* Smart Key - Lisp Source Code::
* Smart Key - Java Source Code::
* Smart Key - JavaScript Source Code::
-* Smart Key - Python Source Code::
* Smart Key - Objective-C Source Code::
* Smart Key - Fortran Source Code::
* Smart Key - Occurrence Matches::
@@ -7858,7 +8078,26 @@ If dragged from an Emacs window to outside of Emacs:
* Smart Key - Default Context::
@end menu
-@node Smart Key - Treemacs, Smart Key - Emacs Pushbuttons, Smart Keyboard Keys, Smart Keyboard Keys
+
+@node Smart Key - Company Mode, Smart Key - Treemacs, Smart Keyboard Keys, Smart Keyboard Keys
+@subsection Smart Key - Company Mode
+
+@cindex company-mode
+@cindex completion
+Company mode is an extensive in-buffer completion framework, often used to complete programming identifiers.
+
+@format
+@group
+When company-mode is active:
+ ACTION KEY
+ Displays selected item's definition.
+ ASSIST KEY
+ Displays the documentation, if any, for the selected item.
+@end group
+@end format
+
+
+@node Smart Key - Treemacs, Smart Key - Emacs Pushbuttons, Smart Key - Company Mode, Smart Keyboard Keys
@subsection Smart Key - Treemacs
@cindex Treemacs
@@ -7879,10 +8118,10 @@ When in a Treemacs file browser buffer:
collapse the entry;
(2) elsewhere within an entry line, the item is displayed for editing,
normally in another window;
- (3) at the end of an entry line: invoke @code{action-key-eol-function},
- typically to scroll up proportionally, if an Action Key press; invoke
- @code{assist-key-eol-function}, typically to scroll down proportionally,
- if an Asisst Key press;
+ (3) at the end of an entry line: if an Action Key press, invokes
+ @code{action-key-eol-function}, typically to scroll up proportionally;
+ if an Assist Key press, invokes @code{assist-key-eol-function}, typically
+ to scroll down proportionally;
(4) on the first line of the buffer (other than the end of line),
dired is run on the current directory of this Treemacs;
(5) at the end of the first or last line of the buffer,
@@ -8218,7 +8457,7 @@ When pressed at the end of a Help buffer:
@end group
@end format
-@node Smart Key - Pages Directory Mode, Smart Key - Identifier Menu Mode , Smart Key - Help Buffers, Smart Keyboard Keys
+@node Smart Key - Pages Directory Mode, Smart Key - Python Source Code, Smart Key - Help Buffers, Smart Keyboard Keys
@subsection Smart Key - Pages Directory Mode
@format
@@ -8234,7 +8473,8 @@ When pressed on a pages-directory-mode entry line:
@end group
@end format
-@node Smart Key - Python Source Code, Smart Key - Objective-C Source Code, Smart Key - JavaScript Source Code, Smart Keyboard Keys
+@page
+@node Smart Key - Python Source Code, Smart Key - Identifier Menu Mode , Smart Key - Pages Directory Mode, Smart Keyboard Keys
@subsection Smart Key - Python Source Code
@format
@group
@@ -8263,16 +8503,16 @@ When pressed within a Python source code file (without the OO-Browser):
@end group
@end format
-@page
-@node Smart Key - Identifier Menu Mode , Smart Key - C Source Code, Smart Key - Pages Directory Mode, Smart Keyboard Keys
+@node Smart Key - Identifier Menu Mode , Smart Key - C Source Code, Smart Key - Python Source Code, Smart Keyboard Keys
@subsection Smart Key - Identifier Menu Mode
@format
@group
-This works only for identifiers defined within the same source file in which they are referenced.
-It requires either Emacs' imenu or XEmacs' func-menu library and it requires that an index of
-identifiers has been built for the current buffer. Other handlers handle identifier references
-and definitions across multiple files.
+This works only for identifiers defined within the same source file in
+which they are referenced. It requires either Emacs' imenu library
+and it requires that an index of identifiers has been built for the
+current buffer. Other handlers handle identifier references and
+definitions across multiple files.
@noindent
When pressed on an identifier name after an identifier index has been generated:
@@ -8284,6 +8524,7 @@ When pressed on an identifier name after an identifier index has been generated:
@end group
@end format
+@page
@node Smart Key - C Source Code, Smart Key - C++ Source Code, Smart Key - Identifier Menu Mode , Smart Keyboard Keys
@subsection Smart Key - C Source Code
@@ -8312,7 +8553,6 @@ When pressed within a C source code file:
@end group
@end format
-@page
@node Smart Key - C++ Source Code, Smart Key - Assembly Source Code, Smart Key - C Source Code, Smart Keyboard Keys
@subsection Smart Key - C++ Source Code
@@ -8342,6 +8582,7 @@ buffer:
@end group
@end format
+@page
@format
@group
When pressed within a C++ source code file (without the OO-Browser):
@@ -8364,7 +8605,6 @@ When pressed within a C++ source code file (without the OO-Browser):
@end group
@end format
-@page
@node Smart Key - Assembly Source Code, Smart Key - Lisp Source Code, Smart Key - C++ Source Code, Smart Keyboard Keys
@subsection Smart Key - Assembly Source Code
@@ -8391,8 +8631,12 @@ When pressed within an assembly source code file:
@format
@group
+@cindex change-log-mode
+@cindex lisp identifier
+@cindex elisp identifier
When pressed on a Lisp symbol within any of these types of buffers
-(Lisp code, debugger, compilation, or help):
+(Lisp code, debugger, compilation, or help) or in change-log-mode
+on an Emacs Lisp bound identifier:
ACTION KEY
Jumps to the definition of any selected Lisp construct. If on an
Emacs Lisp require, load, or autoload clause and the (find-library)
@@ -8445,7 +8689,7 @@ When pressed within a Java source code file (without the OO-Browser):
@end group
@end format
-@node Smart Key - JavaScript Source Code, Smart Key - Python Source Code, Smart Key - Java Source Code, Smart Keyboard Keys
+@node Smart Key - JavaScript Source Code, Smart Key - Objective-C Source Code, Smart Key - Java Source Code, Smart Keyboard Keys
@subsection Smart Key - JavaScript Source Code
@format
@@ -8462,7 +8706,7 @@ When pressed within a JavaScript source code file:
@end format
-@node Smart Key - Objective-C Source Code, Smart Key - Fortran Source Code, Smart Key - Python Source Code, Smart Keyboard Keys
+@node Smart Key - Objective-C Source Code, Smart Key - Fortran Source Code, Smart Key - JavaScript Source Code, Smart Keyboard Keys
@subsection Smart Key - Objective-C Source Code
@vindex objc-cpp-include-path
@@ -9250,10 +9494,8 @@ to direct further development effort towards known needs;
and to acknowledge known weaknesses in the current system.
@end itemize
-If you would like to see some of this work done, consider funding
-its development. Without any serious interest from users, progress
-on these fronts will be slow. Here are some new features we have
-in mind, however.
+Without any serious interest from users, progress on these fronts will
+be slow. Here are some new features we have in mind, however.
@table @asis
diff --git a/man/im/C-hh.png b/man/im/C-hh.png
index c6e5bb3..10dde2e 100644
--- a/man/im/C-hh.png
+++ b/man/im/C-hh.png
Binary files differ
diff --git a/man/im/wgrid4x3.png b/man/im/wgrid4x3.png
new file mode 100644
index 0000000..b3cef2e
--- /dev/null
+++ b/man/im/wgrid4x3.png
Binary files differ
diff --git a/man/version.texi b/man/version.texi
index 381bfab..25d4cc6 100644
--- a/man/version.texi
+++ b/man/version.texi
@@ -1,4 +1,4 @@
-@set UPDATED December 12, 2017
-@set UPDATED-MONTH Dec 2017
-@set EDITION 7.0.2a
-@set VERSION 7.0.2a
+@set UPDATED August 11, 2019
+@set UPDATED-MONTH August 2019
+@set EDITION 7.0.3b
+@set VERSION 7.0.3b
diff --git a/set.el b/set.el
index abe4b3b..1ab32f5 100644
--- a/set.el
+++ b/set.el
@@ -1,4 +1,4 @@
-;;; set.el --- General mathematical operators for unordered sets
+;;; set.el --- General mathematical operators for unordered sets
;;
;; Author: Bob Weiner
;;
diff --git a/smart-clib-sym b/smart-clib-sym
index 3b46765..f1b6403 100755..100644
--- a/smart-clib-sym
+++ b/smart-clib-sym
@@ -23,10 +23,6 @@
# Either 1 if symbol is found or 0 if not.
# Code:
-#
-# Perl script used to tell whether one file is newer than another.
-#
-set fn = "file-newer"
# Create this file and place in the file the full path for each C, C++ or
# Objective-C library that you want scanned for symbol names. One filename
@@ -40,16 +36,10 @@ set clib_list = "~/.CLIBS-LIST"
#
set clib_symbols = "~/.clibs-symbols"
-# Try to locate 'perl' and 'file-newer' script for use.
-
-which perl >& /dev/null
-if ($status) unset fn
-
set st = 0 rebuild = 0
if (-e $clib_list) then
if (! -e $clib_symbols || -z $clib_symbols) set rebuild = 1
- if (! $rebuild && $?fn) @ rebuild = `perl $fn $clib_list $clib_symbols`
- if ($rebuild) then
+ if ($rebuild || (-M $clib_list) > (-M $clib_symbols)) then
nm -g `cat $clib_list` | grep '^[0-9 ].* _[A-Za-z]' | sed -e 's/^[^_][^_]*_//g' | sort | uniq > $clib_symbols
endif
fgrep -sx $1 $clib_symbols >& /dev/null
@@ -58,3 +48,6 @@ endif
echo $st
exit $st
+
+
+
diff --git a/topwin.py b/topwin.py
index 2892cad..2a3c983 100755..100644
--- a/topwin.py
+++ b/topwin.py
@@ -23,7 +23,7 @@ if len(argv) < 3:
x = int(argv[1]); y = int(argv[2])
-# Return the first window only that x,y falls within since the windows are listed in z-order (top of stack to bottom)
+# Return the first window that x,y falls within since the windows are listed in z-order (top of stack to bottom)
def filter_and_print_top_window(x, y):
win_x = win_y = win_width = win_height = 0