* Overview

This file demonstrates simple usage of the basic Hyperbole button-action
types and shows how Hyperbole can support a style of self-documenting,
interactive files.  See the glossary in the Hyperbole Manual,
"(hyperbole.info)Glossary", if 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.  The Action Key is the shift-middle
mouse button on a 3-button mouse or shift-left button on a two button mouse
or {M-RET} on your keyboard.  The Assist Key is the shift-right mouse button
or {C-u M-RET}.  (InfoDock users may also use the middle mouse button as the
Action Key.)

See also the later section, <(Smart Mouse Keys)>.


** Button Activation and Help

This button prints the <(factorial)> of 5 in the minibuffer when activated
with the Action Key.  (Once you have Hyperbole installed, just press the
Action Key on the word, <(factorial)>.)  If you instead press the Assist Key,
you get help for the preceding button.  The help provides a summary report of
the button.  You will see that it utilizes the 'eval-elisp' action type.  You
can also see who created it.  Try it.

Note that the create-time and mod-time are displayed using your own
timezone but they are stored as universal times.  So if you work with
people at other sites, you can mix their buttons with your own within
the same document and see one unified view of the modification times on
each button.  These times will also be useful for sorting buttons by
time when such features are provided in future Hyperbole releases.

** Smart Scrolling

By default, the variable smart-scroll-proportional is set to t (TRUE).  This
makes a press of the Action Key at the end of a line scroll forward, so that
the current line is placed at the top of the window; the Assist Key does the
reverse when pressed at the end of line; it places the current line at the
bottom of the window.  This is called proportional scrolling because the
amount of scrolling is relative to the point's position in the window.  Try
it and then come back here.

Alternatively, if this variable is set to nil (FALSE), the Smart Keys scroll
forward or backward a windowful when at the end of a line, regardless of
which line point is on, just as {C-v} and {M-v} do.

Let's try windowful scrolling a bit.  Click this 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 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 hyperb:init-hook, which executes
whenever Hyperbole is loaded, e.g.:

   (setq hyperb:init-hook
    (list (function (lambda () (setq smart-scroll-proportional nil)))))


** Hyperbole Menus

To display the top-level Hyperbole menu, click the Action Key anywhere
within this paragraph or alternatively, use {C-h h}.  Clicking within the
paragraph, applies the default operation, given by action-key-default-function,
since the Action Key finds no more specialized context.  The default
operation happens to bring up the Hyperbole menu.

{q} or {C-g} will quit from the menu without invoking any commands if you
just want to take a look.  A menu item is selected by pressing the Action Key
over it or by typing its first letter in upper or lower case.

A click of the Assist Key on a menu item gives help on it.


** Help Buffers

Context-sensitive Action Key help typically is bound to {C-h A}.  {C-u C-h A}
displays the same kind of help for the Assist Key.  Try it.

Any buffer whose name ends in `Help*' is presumed to be a temporary buffer
that one wants to inspect and then remove from view.  If you click either the
Action or Assist Key at the end of a help buffer, the buffer is buried from
view and your window configuration is restored to its state prior to
displaying the help.  If you have removed the Smart Key help buffer, bring it
back.  Then press one of the Smart Keys at its end to remove it.  Note how
your window configuration is restored.

Remember that this works for any help buffer, whether or not Hyperbole
generated it.

* Explicit Button Samples

Hyperbole is pretty forgiving about the format of explicit buttons.  For
example, all of the following represent the same button, as long as one
clicks on the *first* line of the button, within the button delimiters:

  <(factorial button)>

  <( factorial      button)>

  Pam>  <(factorial
  Pam>    button)>

  ;; <(factorial
  ;;   button)>

  /* <( factorial      */
  /*    button )> */


If your <(Info-directory-list)> or <(Info-directory)> variables include the
directory that contains the online GNU Emacs manual, activation of the
next button will tell you about <(keyboard macros)>.  Can't remember a
Hyperbole term?  Check out the Hyperbole Manual <(glossary)>.

Here is a <(keyboard macro)> button.  It displays documentation for the first
Emacs Lisp function that follows it, e.g. (hbut:report).  You can see that a
button label can consist of a number of words, up to a set <(maximum
length)>.

A <(shell command)> button can do many things, such as display the length of
this file.  While such commands are executing, you can perform other
operations.  If you create a button that runs a shell command which
displays its own window system window, i.e. a window outside of Emacs, use
'exec-window-cmd' rather than 'exec-shell-cmd' as its action type.

You can link to files such as your <(.login)> file.  Or directories,
like the <(tmp directory)>.  When creating file links, if the file you
are linking to is loaded in a buffer, you are prompted as to whether you
want the link to jump to the present point in that buffer.  If so, the
link will always jump there, so position point within the referent file
to take advantage of this feature.  Note how a separate window is used
when you activate file link buttons.  Most basic Hyperbole action types
display their results in this manner.

You can make a button an alias for another by using the 'link-to-ebut'
action type.  This <(factorial alias)> button does whatever the earlier
<(factorial)> button does.

The 'link-to-mail' action type allows you to reference mail messages
that you have stored away.  We can't demonstrate it here since we don't
have the mail messages that you do.

Hyperbole buttons may also be embedded within mail messages.  Even
buttons copied into mail replies can work:

    Emile said:
    >
    > Hyperbole is better than home baked bread but not as filling.
    > The following sample button displays a message, <(as long as 
    > you click within its first line)>.


* Implicit Button Samples

** Key Sequence Buttons

Any Emacs key sequence delimited with braces may be executed by
activating it as a button, for example {C-u C-p} should leave point four
lines above the button line.  A help request upon the key sequence
displays the documentation for its command binding, i.e. what it does.
If it does not represent a bound key sequence, it will not be
treated as a key sequence button.

** Implicit Path Links

Any doubly quoted pathname acts as an implicit button that either displays the
referenced path within a buffer, passes it to an external viewer program, or
runs a function that operates upon the path.  These are 'pathname' implicit
buttons.  For example, activate "README".

Most pathnames simply link to the files that they name and so are simply
displayed for editing.  The variable 'hpath:suffixes' is a list of filename
suffix strings that are added to or removed from pathnames when searching for
a match.  "So if "README.gz" existed, the pathname button "README" would
display it.  If you use the Emacs "crypt.el" package, then compressed files
will be uncompressed before they are displayed.  Activate "README.gz" and
you'll see that the README file is displayed as desired.

The variable 'hpath:display-alist' contains pairs of pathname expressions and
edit functions.  When a pathname matches an expression, the associated edit
function is invoked upon the pathname.

The variable 'hpath:find-alist' determines the file suffixes which should be
viewed with external programs.  It also specifies the associated viewer
program for each different window system under which Hyperbole may be run.
See its documentation for more details.  Under the X window system, for
example, if you have the 'xv' program, all of the following file formats may
be displayed as images: gif, tiff, xbm, pm, pbm, and jpeg.

Several prefix characters may be attached to pathnames to indicate that
a different action should be taken when the button is activated.
An exclamation point prefix indicates that the full pathname should be run
as a non-windowed shell program.  For example, try "!/bin/date".
An ampersand prefix means run the full pathname as a windowed program, e.g.
"&/usr/bin/X11/xeyes".  Finally, a hyphen indicates that the filename should
be evaluated as an Emacs Lisp program, e.g. "-hibtypes.elc", rather than
displayed.

If you use the ange-ftp or efs add-on to GNU Emacs, such remote pathnames
will work as well.  (The latest version of ange-ftp may always be obtained
via anonymous ftp to:
  "/anonymous@alpha.gnu.ai.mit.edu:ange-ftp/ange-ftp.tar.gz"). 

Once you have *loaded* the ange-ftp or the efs package (or you use a
version of Emacs 19 which autoloads ange-ftp), if you are on the
Internet, you can click on any of the following to browse the contents
of the Hyperbole distribution at the XEmacs Archive (limit the amount
you do this so as not to deny others access to the archive):

	 "/anonymous@ftp.xemacs.org:pub/infodock/"
          /anonymous@128.174.252.16:/pub/infodock/
	  /ftp.xemacs.org:pub/infodock/

You can see that for ange-ftp/efs pathnames, Hyperbole recognizes them with
or without the double quote delimiters.  These same pathnames can be used
within explicit buttons which link to files or directories.  The HTML
(HyperText Markup Language) ftp pathname format used by World-Wide-Web
browsers is also recognized:

	 "ftp://ftp.xemacs.org/pub/infodock/


GNU Info (filename)node references such as "(hyperbole.info)Glossary" or
"(emacs)Glossary", work similarly, thanks to the 'Info-node' button type.
Try one of the Glossary buttons above.

If you want to quickly learn how to create explicit buttons, see
"(hyperbole.info)Drags" and "(hyperbole.info)Menus".

So now when browsing the many documents that refer to filenames or Info
nodes in this way, you can just click on the name to see the contents.
(If a doubly quoted string references a local pathname that does not
exist within the file system, it will not be considered a pathname
button by Hyperbole.)  Pathname implicit buttons provide one example of
how Hyperbole can improve your working environment without you having to
do any work at all.


Hyperbole provides a history command which returns you to previous button
locations in the reverse order of the way you traverse them.  You access it
by selecting the Hist command from the top-level Hyperbole menu, {C-h h h}.
Remember this because you will want to use that command to return to this
DEMO later.

Now suppose you want to browse through a number of files within the
Hyperbole distribution.  You could use the Emacs dired subsystem,
"(emacs)Dired", but a faster way is to note that files named MANIFEST
and DIR are used to summarize the files in a directory, so we can use
each of their entries as an implicit button (of 'dir-summary' type) to
take us to the file.

Let's look at "MANIFEST".  Now click anywhere within a line in the MANIFEST
file and you see that it is displayed as expected.  (Remember to use the
Hyperbole history command to return here.)  You can get help on these buttons
just like any others.

Table of contents entries in "README" files act similarly.  Click on "README"
to view that file and then click on a table of contents entry to jump to the
associated section in the "README" file.

** World-Wide-Web URL Buttons

If you use the w3 World-Wide-Web browser add-on to GNU Emacs, you can browse
URLs (universal resource locators) from within any buffer just as you would
any other implicit button, once you do some initial setup.

First you must ensure that you load the Hyperbole library that supports URL
viewing.  Either your "hsite.el" file should require hsys-w3 as part of
'hibtypes:begin-load-hook' or you should move point after the following line
and hit {C-x C-e} to evaluate it.

         (progn (require 'w3) (require 'hsys-w3))

Now try using the Action Key on:

         "http://www.ncsa.uiuc.edu"

** Grep, Occurrence, Debugger and Compiler Error Buttons, and Cscope Analyzer
   Lines

The output of 'grep -n', the UNIX line pattern matcher, can be
activated as buttons that jump to each matched line within its source
file; use {M-x grep RET}.

Compiler error messages also serve as implicit buttons that jump to
associated source lines; use {M-x compile RET}.  GDB, DBX or XDB stack frames
along with GDB breakpoint listing lines also link to source lines.

{M-x occur RET} (find matches in a single buffer) and {M-x moccur RET}
(find matches across multiple buffers and files) also produce implicit
button output that displays associated source lines.

If you have the Cscope C/C++ code analyzer from the AT&T Toolchest and have
loaded the cscope.el library add-on for GNU Emacs, then the output lines from
a cscope query serve as implicit buttons which jump to associated source
lines.  Cscope goes beyond the basic Emacs tags facility to allow you to see
the callers of a function and the functions called by a specific routine.

** Annotated Bibliography Buttons

Here's a use of an annotated bibliography reference implicit button
which allows you to see a bibliography entry such as [Stallman 87] when
you activate the button between brackets.

** Completion Buttons

Often when Emacs or Hyperbole prompts for an argument in the
minibuffer, a list of possible argument completions is available by
pressing {?}.  A single Action Key press on any of these completions
inserts it into the minibuffer for your inspection.  A second press on
the same completion causes it to be used as the argument value and any
succeeding argument prompt is then displayed.  Test this technique
with a {C-x C-f} (find-file) and then a {?}.

** Hyperbole Source Buttons

If you ask for help on the [Stallman 87] button, the first line of the
help buffer will look like this:

@loc> "DEMO"

except it will contain the full pathname of the file.  If the button
were embedded within a buffer without an attached file, the first line
of the help buffer might look like:

@loc> #<buffer *scratch*>

If you click on the buffer name, the buffer will be displayed just as a
file buffer would.  This type of implicit button is called a
'hyp-source' button.

You can also activate any explicit buttons shown in a help buffer.

** UNIX Man Apropos Buttons

Below are some lines output by the UNIX 'apropos' command (with a little
touchup for display purposes).  A button activation anywhere within such
a line recognizes the line as an apropos entry and tries to display the
man page for the entry.  Try it.  (If you happen to use the 'superman'
package which fetches man pages in the background, you'll have to wait
for the next version of superman which removes incompatibilities with
the standard man page fetch command before you can use these
'man-apropos' implicit buttons.)

grep, egrep, fgrep (1V) - search a file for a string or regular expression
rm, rmdir (1)           - remove (unlink) files or directories
touch (1V)              - update the access and modification times of a file
cat (1V)                - concatenate and display 

** Internet Request For Comments (RFC) Document Browsing

If you are on the Internet and you have the ange-ftp or efs remote file
handling package for GNU Emacs, you can retrieve and browse RFC documents
used in Internet standard-making.  Simply use the Action Key on an RFC
document identifier, like RFC-822.  Rfc822 and rfc 822 work as well.  The
'rfc' implicit button type provides this service.  The 'hpath:rfc' variable
specifies the location from which to retrieve RFCs.

Once you have retrieved an RFC, an Action Key press most anywhere within a
line typically will produce a table of contents summary of the RFC (via the
'rfc-toc' implicit button type).  An Action Key press on any of the table of
contents lines then displays that section, for easy random access browsing.

** Site-specific Online Library Document IDs

Hyperbole offers a powerful, yet easy to use facility for building online
libraries through the use of the 'doc-id' implicit button type.  A document id
is used just like a reference citation in traditional publications but
it actually links to the document that it references and the card catalog
(index) entry for the document.  One can easily pass around doc ids to point
people to appropriate documents.  For example, a mail message in response to
a question might say, "See [Emacs-001] for examples of what Emacs can do."

Since the format and handling of document identifiers and their index entries
is site-specific, document id handling is not completely configured in a
default Hyperbole configuration.  If you wish to setup this facility for
site or personal use, see the DESCRIPTION section in "hib-doc-id.el" for
installation and use information.


* Smart Mouse Keys

If you use Emacs with mouse support under the X window system, NeXTstep,
OpenWindows, SunView, or Apollo's DM window system, Hyperbole automatically
configures your mouse keys for use as Smart Keys and provides additional
display-oriented operations as demonstrated here.

See the Hyperbole menu item, Doc/SmartKy, for a summary of all Smart Key
operations.  For extensive details on Smart Key operation, see the Hyperbole
manual section, "(hyperbole.info)Smart Key Reference".

When Hyperbole is installed, a key may be bound which allows you to
switch between the Smart Key mouse bindings and your prior ones. `C-h w
hmouse-toggle-bindings RTN' should show you any key which performs this
command.  If no key binding has been established or if you prefer one of
your own, simply select a key and bind it within your "~/.emacs" file. 
For example, (global-set-key "\C-ct" 'hmouse-toggle-bindings).


** Context-sensitive Help

Since the Smart Keys perform different operations in different contexts, it
is important to have context-sensitive help available.  The earlier section
on Help Buffers explained how to display such help from the keyboard.  The
same help can be displayed using the mouse by depressing the Smart Key for
which you want help, performing any action necessary to register a context,
such as a drag motion, and then pressing the other Smart Key.

Here is an example.  Depress the Action Key somewhere within this paragraph
and while holding it down, depress the Assist Key.  Then release the keys in
any order and the help display will pop up.  It explains that there was no
particular matching Smart Key context, so a default operation is performed
(the value of the variable 'action-key-default-function' determines the
operation performed).

** Scrolling to the Beginning and End of Buffers

A left to right horizontal drag of the Action Key of 5 or more characters
scrolls the current buffer to its end (what {M->} does by default).  A right
to left drag of the Action Key does the opposite; it scrolls to the buffer's
beginning (what {M-<} does by default).  Try out these operations and then
use the Smart Key end of line scrolling capability to return here.

** Creating and Deleting Windows

Horizontal and vertical drags of the Assist Key within a single window can be
used to create and delete Emacs windows.

A horizontal drag of five or more characters from left to right creates a new
window by splitting the current window into two windows, one on top of the
other.  A horizontal drag from right to left deletes the current window.  A
vertical drag in either direction splits the current window into two
side-by-side windows.

Let's try these.  Remember to use your Assist Key.  You need only move your
mouse pointer a few characters to register a drag.  First, split this window
with a left to right drag, then delete either one of the windows with a right
to left drag.

Now try a side-by-side window split.  Drag vertically in the up or down
direction three or more lines to split the window and then use a right to
left drag to delete either one of the side-by-side windows.

** Resizing Windows

You can easily resize Emacs windows by dragging their window separators
(modelines or vertical side lines) within a frame.  Simply depress either
Smart Key on a modeline or near a window side, hold it down while you drag to
a new location and then release.  The window separator will then jump to the
location of release.  Basically, just drag the window separator to where you
want it.  If you want a single window to fill an entire frame, drag its
modeline, and if necessary its side, to the edge of the frame.

Did you follow all that?  Let's try it to be sure.  First, you need at least
two windows, so create a new one with the drag techniques you just learned.
Now drag with either Smart Key from the shared window edge to a new location.
See how both windows change size?

Try to drag the bottom modeline.  You see that you can't.

** Swapping Buffers

Swapping buffer locations is quick and easy with Hyperbole.  Simply drag
from one window to another with the Assist Key.

Split the current window into two, one above the other.  Drag the upper
modeline so that one window is clearly bigger than the other.  Now try
dragging from inside one window to another with the Assist Key.

** Modeline Clicks

Window modelines are treated specially be Hyperbole.  They are broken up into
three regions, each with their own Smart Key operations.  The regions are:
the left edge, the right edge, and the middle portion (the non-edge part of
the modeline).  The edge regions are the left or rightmost three characters
of the modeline, by default.

*** Switching to Another Buffer

An Action Key click in the left edge of a modeline buries the current buffer,
i.e. puts it on the bottom of the buffer list and removes it from view, if it
is not the only available buffer.  An Assist Key click in the left edge of a
modeline unburies the bottom buffer.  Repeated clicks of either key allow you
to cycle through buffers to get to the one you want.  Try this out.

*** Displaying Documentation

An Action Key click in the right edge of a modeline displays the Info manual
browsing system, see "(info)".  Once in Info, you can click with your Action
Key to follow menu items, cross references, or to jump to Info nodes
referenced within the top header line of a node.  Try browsing a bit and
while in Info display context-sensitive help for both the Action and Assist
Keys to see all that they can do.

If you click again with the Action Key on the right edge of the window
displaying Info, it will hide the Info buffer.  Thus, it works as a toggle to
display or to hide the Info buffer.  Try it.

A click of the Assist Key at the right edge of a modeline toggles between
display and removal of a Smart Key operation summary.  To remove the summary,
you must click on the modeline of the window displaying the summary.


*** Buffer Menu Display

An Action Key click in the center portion of a modeline displays a buffer
menu, a summary of available buffers.  An Action Key click on any buffer menu
line then displays that buffer.

This behavior is subject to change in the future if a more useful Action Key
operation is found for the middle of modelines.


** Saving and Restoring Window Configurations

A window configuration consists of the set of windows within a single Emacs
frame.  This includes their locations, buffers, and scrolled positions of
their buffers.

Hyperbole allows you to save and restore window configurations with simple
diagonal mouse drags within a single window.  A diagonal drag in any
direction of the Action Key saves the current window configuration to a ring
of window configurations, just like the Emacs text kill ring.  (See
"(Emacs)Kill Ring".)  Each diagonal drag in any direction of the Assist Key
restores a prior saved window configuration from the ring.  Window
configurations are restored in reverse order of the way they were saved.
Since a ring is circular, after the oldest element is restored, the newest
element will again be restored and so on.

If these operations are unclear to you, just forget about them and move on.
They are not necessary to enjoy the rest of Hyperbole.  Otherwise, give them
a try by creating various window configurations and then saving and restoring
them.

* Outliner

The Hyperbole outliner only works under GNU Emacs version 19 or higher and
XEmacs version 19.9 or higher.  You can tell whether you are running a
version of Emacs which supports the outliner by hitting
@{@kbd{C-h h}@} to display the Hyperbole menu.  If you see an
@code{Otl/} entry in the menu, then the outliner is available.
Otherwise, the outliner does not work with your version of Emacs, so
this section of the DEMO will not be of interest to you.

The Hyperbole outliner 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.

If the outliner works in your Emacs, see "kotl/EXAMPLE.kotl", an outline file
that explains how to operate the outliner.    Use the @code{Otl/Example} menu
entry to display this file.  Additional documentation can be found in
"(hyperbole.info)Outliner".  "(hyperbole.info)Outliner Keys"
summarizes in alphabetical order the outliner commands which are bound
to keys.


* References

[Stallman 87]  Stallman, Richard.  GNU Emacs Manual.  Free Software
Foundation, Cambridge: MA, March 1987.

* THE END
