[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] scratch/hyperbole-lexbind 6e555e7 20/20: Merge remote-tracking br
From: |
Stefan Monnier |
Subject: |
[elpa] scratch/hyperbole-lexbind 6e555e7 20/20: Merge remote-tracking branch 'hyperbole/master' into externals/hyperbole |
Date: |
Wed, 14 Aug 2019 04:30:25 -0400 (EDT) |
branch: scratch/hyperbole-lexbind
commit 6e555e763567c66ad8e50724a7dd5e286dbb1e65
Merge: 98a5ecb 332ef33
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>
Merge remote-tracking branch 'hyperbole/master' into externals/hyperbole
---
.gitignore | 2 +-
Changes | 552 ++++++++++++++++++++-
DEMO | 236 ++++++---
HY-ABOUT | 5 +-
HY-ANNOUNCE | 207 ++++++++
HY-NEWS | 284 ++++++++++-
HY-WHY.kotl | 55 ++-
MANIFEST | 2 -
Makefile | 23 +-
README.md | 16 +-
README.md.html | 28 +-
_config.yml | 1 +
_hypb | Bin 2234 -> 4188 bytes
hact.el | 5 +-
hactypes.el | 62 ++-
hargs.el | 87 +++-
hbdata.el | 13 +-
hbmap.el | 2 +-
hbut.el | 1049 ++++++++++++++++++++++++++-------------
hib-kbd.el | 131 +++--
hib-social.el | 281 +++++++++--
hibtypes.el | 242 ++++++---
hinit.el | 21 +-
hload-path.el | 6 +-
hmh.el | 2 +-
hmouse-drv.el | 243 +++++----
hmouse-info.el | 10 +-
hmouse-key.el | 4 +-
hmouse-mod.el | 2 +-
hmouse-sh.el | 351 ++++++-------
hmouse-tag.el | 45 +-
hpath.el | 495 +++++++++++++------
hsettings.el | 65 +--
hsys-org.el | 261 +++++++++-
hsys-www.el | 2 +-
htz.el | 47 +-
hui-em-but.el | 6 +-
hui-jmenu.el | 7 +-
hui-menu.el | 19 +-
hui-mini.el | 47 +-
hui-mouse.el | 36 +-
hui-select.el | 33 +-
hui-treemacs.el | 63 +--
hui-window.el | 77 +--
hui-xe-but.el | 466 ------------------
hui.el | 254 +++++++---
hversion.el | 20 +-
hvm.el | 2 +-
hypb.el | 104 ++--
hyperbole-pkg.el | 8 -
hyperbole.el | 53 +-
hyrolo-logic.el | 2 +-
hyrolo-menu.el | 21 +-
hyrolo.el | 89 ++--
hywconfig.el | 8 +-
kotl/kexport.el | 14 +-
kotl/kfill.el | 9 +-
kotl/kmenu.el | 12 +-
kotl/kotl-autoloads.el | 45 +-
kotl/kotl-mode.el | 44 +-
kotl/kproperty.el | 2 +-
kotl/kview.el | 58 +--
kotl/kvspec.el | 79 ++-
man/hkey-help.txt | 7 +-
man/hyperbole.html | 1277 ++++++++++++++++++++++++++++++------------------
man/hyperbole.info | Bin 489710 -> 514598 bytes
man/hyperbole.pdf | Bin 1263857 -> 1272682 bytes
man/hyperbole.texi | 676 +++++++++++++++++--------
man/im/C-hh.png | Bin 898836 -> 737355 bytes
man/im/wgrid4x3.png | Bin 0 -> 3854568 bytes
man/version.texi | 8 +-
set.el | 2 +-
smart-clib-sym | 15 +-
topwin.py | 2 +-
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 <address@hidden>
+
+* hyrolo-menu.el (infodock-hyrolo-menu): Fixed Edit-Rolo to call a function
rather than an sexp.
+
+2019-08-05 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* man/hyperbole.texi (Referent Display): Rewrote and added details on how the
4 types
+ of referents are processed.
+
+2019-07-22 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hbut.el (ibut:label-separator): Added.
+
+2019-07-17 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* hui.el (hui:ibut-label-create, hui:ibut-rename, hui:ibut-message): Added.
+
+2019-07-15 Bob Weiner <address@hidden>
+
+* hibtypes.el (debugger-source): Handled Python tracebacks properly.
+
+2019-07-14 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hbut.el (ibut:label-separator-regexp, hbut:outside-comment-p): Added doc
+for expanded Org mode reference handling.
+
+2019-07-01 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hyrolo.el (hyrolo-add): Fixed bug in call to match-string-no-properties.
+
+2019-06-21 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hibtypes.el (grep-msg): Allowed for null char in place of first colon in
colored grep output lines.
+
+2019-06-17 Bob Weiner <address@hidden>
+
+* hactypes.el (link-to-gbut): Added.
+ hui.el (hui:link-possible-types): Added link-to-gbut.
+
+2019-06-16 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hibtypes.el (debugger-source): Added support for pytype package errors
(close to Python pdb ones)
+
+2019-06-06 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hibtypes.el (ipython-stack-frame): Added to handle ipython stack traces and
exceptions.
+
+2019-05-30 Bob Weiner <address@hidden>
+
+* hyperbole.el (hkey-maybe-global-set-key): Fix missing no-add argument
+ to hkey-global-set-key call.
+
+2019-05-26 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* man/hyperbole.texi (Implicit Buttons, gitlab-reference):
+ DEMO (Gitlab (Remote) References): Added these sections.
+
+2019-02-16 Bob Weiner <address@hidden>
+
+* hui-window.el (smart-window-of-coords): Handled null coords parameter.
+
+2019-02-10 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hsys-org.el (org-mode): Support derived modes too.
+
+2019-01-31 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* hib-social.el (github-reference): Added =item-id syntax.
+ (gitlab-reference): Added to support Gitlab references.
+
+2017-12-18 Bob Weiner <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
+
+* 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 <address@hidden>
* 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 <address@hidden>
* 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 <address@hidden>
@@ -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 <address@hidden>
* 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 <address@hidden>
+To: address@hidden, address@hidden, address@hidden, address@hidden,
address@hidden
+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:address@hidden:" 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 <address@hidden>
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 "address@hidden" create-time "20171212:19:44:57" id-counter 37 file
"/Users/bk/Dropbox/emacs/hyperbole/HY-WHY.kotl")]
+ (creator "address@hidden" create-time "20190512:130:33:52" id-counter 38
file "/home/bob.weiner/Dropbox/emacs/hyperbole/HY-WHY.kotl")]
[1
(creator "address@hidden" create-time "20160524:15:04:17" no-fill t)]
[17
@@ -124,6 +129,8 @@ alpha ;; label-type
(creator "address@hidden" create-time "20171114:23:37:20" no-fill t)]
[2
(creator "address@hidden" create-time "20160524:15:04:24" no-fill t)]
+ [38
+ (creator "address@hidden" create-time "20190512:131:21:14" no-fill t)]
[31
(creator "address@hidden" 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
Binary files a/_hypb and b/_hypb 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 <address@hidden> and Mats Lidell
<address@hidden>
+;; Maintainer: Bob Weiner <address@hidden>, Mats Lidell <address@hidden>
;; 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 "<\\s-*@\\s-*" kexport:kcell-reference-regexp
"[^&>]*>")
- "<A HREF=\"#\\1\">\\0</A>")
+ "<A HREF=\"#k\\1\">\\0</A>")
(cons (format "<\\s-*@\\s-*\\(%s\\)[^=&>]*>"
kexport:kcell-partial-reference-regexp)
- "<A HREF=\"#\\1\">\\0</A>")
+ "<A HREF=\"#k\\1\">\\0</A>")
(cons (format "<\\s-*\\([^ \t\n\r,<>]+\\)\\s-*,\\s-*%s[^=&>]*>"
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 © 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 © 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">• <a
href="#Implicit-Button-Type-Summaries">Implicit Button Type
Summaries</a>:</td><td> </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">• <a
href="#Creation">Creation</a>:</td><td> </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">• <a
href="#Smart-Key-_002d-Treemacs">Smart Key -
Treemacs</a>:</td><td> </td><td align="left" valign="top">
+</pre></th></tr><tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Company-Mode">Smart Key - Company
Mode</a>:</td><td> </td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Treemacs">Smart Key -
Treemacs</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Emacs-Pushbuttons">Smart Key - Emacs
Pushbuttons</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
@@ -722,6 +737,8 @@ Smart Keyboard Keys
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Pages-Directory-Mode">Smart Key - Pages Directory
Mode</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source
Code</a>:</td><td> </td><td align="left" valign="top">
+</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Identifier-Menu-Mode">Smart Key - Identifier Menu Mode
</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-C-Source-Code">Smart Key - C Source
Code</a>:</td><td> </td><td align="left" valign="top">
@@ -736,8 +753,6 @@ Smart Keyboard Keys
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-JavaScript-Source-Code">Smart Key - JavaScript Source
Code</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source
Code</a>:</td><td> </td><td align="left" valign="top">
-</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Objective_002dC-Source-Code">Smart Key - Objective-C
Source Code</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Fortran-Source-Code">Smart Key - Fortran Source
Code</a>:</td><td> </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’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’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’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 <- 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
@@ -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 & kill
thing region
Page Directory Listing Jumps to page <- 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 <- same
Other Compiler Error Jumps to src error line <- same
Grep or Occur Match Jumps to match source line <- 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’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
\"\M-o\")</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’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’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
-<id-of-window-to-display-item-in>}</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
<id-of-window-to-display-item-in>}</kbd> key sequence to
-<em>throw</em> the item to the window.
+<id-of-window-to-display-item-in>}</kbd> and watch the magic happen. If
you
+want to display multiple items in different windows, instead use
+the <kbd>{M-o t <id-of-window-to-display-item-in>}</kbd> key sequence to
+<em>throw</em> the item to the window. To <em>replace</em>
+the selected window’s buffer with that of another window, use
+<kbd>{M-o r <id-of-window-displaying-desired-buffer>}</kbd>. To instead
+<em>swap</em> the selected window’s buffer with that of another window,
+use <kbd>{M-o m <id-of-window-to-swap-with>}</kbd>.
+</p>
+<p>In summary:
+</p><dl compact="compact">
+<dt>M-o i <window></dt>
+<dd><p>insert listing item at point into <window>; if not on a listing
item,
+trigger an error
+</p>
+</dd>
+<dt>M-o m <window></dt>
+<dd><p>swap the buffers in the selected window and <window>
+</p>
+</dd>
+<dt>M-o r <window></dt>
+<dd><p>replace the selected (current) window’s buffer with that of
<window>
</p>
+</dd>
+<dt>M-o t <window></dt>
+<dd><p>throw listing item at point or current buffer to <window>
+</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 ’My Emacs Files’:
+</p>
+<div class="example">
+<pre class="example"><[My Emacs Files]>: "~/.emacs.d"
+</pre></div>
+
+<p>The label is delimited by ‘<samp><[</samp>’ and
‘<samp>]></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, <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">• <a
href="#Implicit-Button-Type-Summaries" accesskey="1">Implicit Button Type
Summaries</a>:</td><td> </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> [<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 <ilink></code></dt>
+<dd><p>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>.
+</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 <glink></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 â<glink:â <button label> â>â, e.g.
<glink: open todos>.
+</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 <elink></code></dt>
+<dd><p>At point, activates a link to an explicit button within the current
buffer.
+Recognizes the format â<elink:â <button label> â>â, e.g.
<elink: project-list>.
+</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 "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.
</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 ‘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
@@ -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> <ref-item>
+</li><li> <user>/<project>/<ref-item>
+</li><li> <project>/<ref-item>
+</li><li> /<group>/<project>.
+or
+</li><li> /<project-or-group> (where a group is a colection of projects)
+</li></ul>
+
+<p><ref-item> is one of these:
+</p><dl compact="compact">
+<dt>• 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>• 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</dt>
+<dd><p>the item is shown
+</p></dd>
+<dt>• 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>• a commit reference given by a hex number, 55a1f0</dt>
+<dd><p>the commit diff is displayed
+</p></dd>
+<dt>• 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."
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 <tree> to follow as the first child of <cell>.
</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 <tree> to be the predecessor of <cell>.
@@ -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 ‘<samp>Jan 28 18:27:59 CST 2017</samp>’.
+format, such as ‘<samp>Jan 28 18:27:59 CST 2019</samp>’.
</p></dd>
</dl>
@@ -5727,7 +5946,7 @@ automatically added by HyRolo whenever a new record is
added.
==================================================================
* Smith, John <address@hidden> 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’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:
+‘<samp><[label]></samp>’. 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> [<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 (<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.
+</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’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>• 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> [<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 (<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.
-</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
<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</samp>’ 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.
</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’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">• <a href="#Smart-Key-_002d-Treemacs"
accesskey="1">Smart Key - Treemacs</a>:</td><td> </td><td
align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Company-Mode" accesskey="1">Smart Key - Company
Mode</a>:</td><td> </td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">• <a href="#Smart-Key-_002d-Treemacs"
accesskey="2">Smart Key - Treemacs</a>:</td><td> </td><td
align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Emacs-Pushbuttons" accesskey="2">Smart Key - Emacs
Pushbuttons</a>:</td><td> </td><td align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Emacs-Pushbuttons" accesskey="3">Smart Key - Emacs
Pushbuttons</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Argument-Completion" accesskey="3">Smart Key - Argument
Completion</a>:</td><td> </td><td align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Argument-Completion" accesskey="4">Smart Key - Argument
Completion</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="4">Smart Key - ID Edit
Mode</a>:</td><td> </td><td align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-ID-Edit-Mode" accesskey="5">Smart Key - ID Edit
Mode</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029"
accesskey="5">Smart Key - Emacs Cross-references
(Xrefs)</a>:</td><td> </td><td align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Emacs-Cross_002dreferences-_0028Xrefs_0029"
accesskey="6">Smart Key - Emacs Cross-references
(Xrefs)</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Smart-Scrolling" accesskey="6">Smart Key - Smart
Scrolling</a>:</td><td> </td><td align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Smart-Scrolling" accesskey="7">Smart Key - Smart
Scrolling</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Smart-Menus" accesskey="7">Smart Key - Smart
Menus</a>:</td><td> </td><td align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Smart-Menus" accesskey="8">Smart Key - Smart
Menus</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a href="#Smart-Key-_002d-Dired-Mode"
accesskey="8">Smart Key - Dired Mode</a>:</td><td> </td><td
align="left" valign="top">
+<tr><td align="left" valign="top">• <a href="#Smart-Key-_002d-Dired-Mode"
accesskey="9">Smart Key - Dired Mode</a>:</td><td> </td><td
align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Hyperbole-Buttons" accesskey="9">Smart Key - Hyperbole
Buttons</a>:</td><td> </td><td align="left" valign="top">
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Hyperbole-Buttons">Smart Key - Hyperbole
Buttons</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-View-Mode">Smart Key - View
Mode</a>:</td><td> </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">• <a
href="#Smart-Key-_002d-Pages-Directory-Mode">Smart Key - Pages Directory
Mode</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
+<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source
Code</a>:</td><td> </td><td align="left" valign="top">
+</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Identifier-Menu-Mode">Smart Key - Identifier Menu Mode
</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-C-Source-Code">Smart Key - C Source
Code</a>:</td><td> </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">• <a
href="#Smart-Key-_002d-JavaScript-Source-Code">Smart Key - JavaScript Source
Code</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
-<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Python-Source-Code">Smart Key - Python Source
Code</a>:</td><td> </td><td align="left" valign="top">
-</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Objective_002dC-Source-Code">Smart Key - Objective-C
Source Code</a>:</td><td> </td><td align="left" valign="top">
</td></tr>
<tr><td align="left" valign="top">• <a
href="#Smart-Key-_002d-Fortran-Source-Code">Smart Key - Fortran Source
Code</a>:</td><td> </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> [<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’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> [<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> [<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> [<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>
[<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>
[<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> [<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>
[<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>
[<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’ 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> [<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> [<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> [<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>
[<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>
[<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>
[<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> [<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> [<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> [<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> [<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> [<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> [<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> [<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’ 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.
+<pre class="format">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.
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> [<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> [<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> [<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> [<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> [<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> [<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> [<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> [<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> [<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>
[<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> [<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> [<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> [<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>
[<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> [<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> [<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>
[<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>
[<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>
[<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> [<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> [<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> [<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> [<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> [<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> [<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> [<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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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
<window-id></code></a>:</td><td> </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
<window-id></code></a>:</td><td> </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
<window-id></code></a>:</td><td> </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
<window-id></code></a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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
Binary files a/man/hyperbole.info and b/man/hyperbole.info differ
diff --git a/man/hyperbole.pdf b/man/hyperbole.pdf
index 314f65f..157752d 100644
Binary files a/man/hyperbole.pdf and b/man/hyperbole.pdf 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 © 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 © 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
Binary files a/man/im/C-hh.png and b/man/im/C-hh.png differ
diff --git a/man/im/wgrid4x3.png b/man/im/wgrid4x3.png
new file mode 100644
index 0000000..b3cef2e
Binary files /dev/null and b/man/im/wgrid4x3.png 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
old mode 100755
new mode 100644
index 3b46765..f1b6403
--- 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
old mode 100755
new mode 100644
index 2892cad..2a3c983
--- 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
- [elpa] scratch/hyperbole-lexbind 0829631 13/20: Fix small logic errors in new e/g/ilink functions, (continued)
- [elpa] scratch/hyperbole-lexbind 0829631 13/20: Fix small logic errors in new e/g/ilink functions, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind b128464 06/20: Update Changes and add 7.0.3 release message to HY-ANNOUNCE, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind 332ef33 19/20: V7.0.3b test release: Basic DEMO updates, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind c547ad4 10/20: Merge branch '7.0.3a' into prepare-pr-for-merging, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind 131295e 07/20: Remove conditionals on xemacs, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind ff0f602 11/20: Merge pull request #11 from matsl/prepare-pr-for-merging, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind da8f3fa 09/20: Add labeled implicit buttons, in-buffer links to g/e/ibuts, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind 9ad2bf0 08/20: Remove all featurep checks on xemacs and emacs, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind 21c7432 15/20: Most changes for 7.0.3a release, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind f38ee21 14/20: 7.0.3a changes for creating and modifying ibut labels, small fixes, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind 6e555e7 20/20: Merge remote-tracking branch 'hyperbole/master' into externals/hyperbole,
Stefan Monnier <=
- [elpa] scratch/hyperbole-lexbind d56c8c0 16/20: Most changes for 7.0.3a release, Stefan Monnier, 2019/08/14
- [elpa] scratch/hyperbole-lexbind 64c3563 17/20: Expanded Org mode doc; introduce 'key series' term in Glossary, Stefan Monnier, 2019/08/14