diff man/hyperbole.texi @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/man/hyperbole.texi	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,6193 @@
+\input texinfo
+@c
+@c FILE:         hypb.texi
+@c SUMMARY:      The Hyperbole User Manual for V3
+@c USAGE:        Hardcopy man from TeX; Info man from 'texinfo-format-buffer'.
+@c
+@c AUTHOR:       Bob Weiner
+@c ORG:          Brown U.
+@c
+@c ORIG-DATE:     6-Nov-91 at 11:18:03
+@c LAST-MOD:      3-Nov-95 at 23:55:27 by Bob Weiner
+
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename ../info/hyperbole.info
+@settitle Hyperbole User Manual
+@c %**end of header (This is for running Texinfo on a region.)
+@synindex vr fn
+
+@iftex
+@finalout
+@end iftex
+
+@titlepage
+@sp 4
+@center @titlefont{Hyperbole Manual}
+@sp 1
+@center Everyday Information Management
+@sp 5
+@center Bob Weiner
+@sp 1
+@center E-mail: <hyperbole@@hub.ucsb.edu>  (This is a mail list.)
+@sp 2
+@center Edition 4.01
+@sp 2
+@center November 3, 1995
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1991, 1992, 1993, 1994, 1995  Free Software Foundation, Inc.
+
+All trademarks referenced herein are trademarks of their respective
+holders.
+@setchapternewpage odd
+@end titlepage
+@page
+
+@node Top, Introduction, (dir), (dir)
+@c  node-name,  next,  previous,  up
+@unnumbered Preface
+
+@ifinfo
+@noindent
+Copyright @copyright{} 1991, 1992, 1993, 1994, 1995  Free Software Foundation, Inc.
+
+All trademarks referenced herein are trademarks of their respective holders.
+
+@end ifinfo
+This edition of the Hyperbole User Manual is for use with any version
+4.01 or greater of Hyperbole.
+
+Hyperbole is free software; you can use it, redistribute it and/or modify it
+without fee under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option) any later
+version.
+
+Hyperbole is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs or XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+@cindex credits
+@cindex InfoDock, obtaining
+@cindex Hyperbole, obtaining
+@cindex anonymous ftp
+Hyperbole was designed and written by Bob Weiner.  Motorola,
+Inc@. funded and donated this work for free redistribution as part of
+the InfoDock integrated software engineering and productivity toolset.
+For information on how to obtain Hyperbole, @ref{Obtaining}.  InfoDock
+can be found at the same location.
+
+This manual explains user operation and summarizes basic developer
+facilities of Hyperbole.  This major release of Hyperbole concentrates
+on providing convenient access to information and control over its
+display.  The Hyperbole outliner emphasizes flexible views and structure
+manipulation within bodies of information.
+
+@cindex Hyperbole
+@cindex hypertext
+@cindex Emacs Lisp
+@cindex Emacs 19
+@cindex Epoch
+@cindex XEmacs
+@cindex Lucid Emacs
+Hyperbole (pronounced Hi-purr-boe-lee) is an open, efficient,
+programmable information management and hypertext system.  It is
+intended for everyday work on any UNIX platform supported by GNU Emacs.
+It works well with the versions of Emacs that support multiple X or
+NEXTSTEP windows: Emacs 19, XEmacs (formerly called Lucid Emacs) and
+Epoch.  Hyperbole allows hypertext buttons to be embedded within
+unstructured and structured files, mail messages and news articles.  It
+offers intuitive mouse-based control of information display within
+multiple windows.  It also provides point-and-click access to Info
+manuals, ftp archives, Wide-Area Information Servers (WAIS), and the
+World-Wide Web (WWW) hypertext system through encapsulations of software
+that support these protocols.
+
+@noindent
+Hyperbole consists of four parts:
+
+@table @bullet
+@item Info Management
+an interactive information management interface, including a powerful
+rolodex, which anyone can use.  It is easy to pick up and use since it
+introduces only a few new mechanisms and provides user-level facilities
+through a menu interface, which you control from the keyboard or the
+mouse;
+
+@item Hypertext Outliner
+an outliner with multi-level autonumbering and permanent ids attached to
+each outline node for use as hypertext link anchors, plus flexible view
+specifications that can be embedded within links or used interactively;
+
+@item Button Types
+a set of hyper-button types that provides core hypertext and other
+behaviors.  Users can make simple changes to button types and those
+familiar with Emacs Lisp can quickly prototype and deliver new types;
+
+@item Programming Library
+a set of programming library classes for system developers who want to
+integrate Hyperbole with another user interface or as a back-end to a
+distinct system.  (All of Hyperbole is written in Emacs Lisp for ease of
+modification.  Although Hyperbole was initially designed as a prototype,
+it has been engineered for real-world usage and is well structured.)
+@end table
+
+@cindex GNU Emacs
+@kindex C-h t
+@vindex file, DEMO
+@cindex demonstration
+@cindex button demo
+Hyperbole may be used simply for browsing through documents
+pre-configured with Hyperbole buttons, in which case, one can safely
+ignore most of the information in this manual.  The @file{DEMO} file
+included in the Hyperbole distribution demonstrates many of Hyperbole's
+standard facilities.  It offers a much less technical introduction for
+Hyperbole users by providing good examples of how buttons may be
+used and an introduction to the outliner.
+
+So if this manual is too detailed for your taste, you can skip it
+entirely and just jump right into the demonstration, normally by typing
+@{@kbd{C-h h d d}@}, assuming Hyperbole has already been installed at
+your site.  Otherwise, @ref{Installation}, for Hyperbole installation
+and configuration information.
+
+Many users, however, will want to do more than browse with Hyperbole,
+e.g@.  create their own buttons.  The standard Hyperbole button editing
+user interface is GNU Emacs-based, so a basic familiarity with the Emacs
+editing model is useful.  The material covered in the GNU Emacs
+tutorial, normally bound to @{@kbd{C-h t}@} within Emacs, is more than
+sufficient as background.  If some GNU Emacs terms are unfamiliar to
+you, @ref{Glossary, Emacs Glossary,, emacs, the GNU Emacs Manual}.
+
+Before we delve into Hyperbole, a number of acknowledgments are in
+order.  Peter Wegner has encouraged the growth in this work.  Morris
+Moore has helped me pursue my own research visions and kept me striving
+for excellence.  Doug Engelbart has shown me the bigger picture and
+continues to be an inspiration.  His work provides a model from which I
+am beginning to draw.  Kellie Clark and I jointly designed the Hyperbole
+outliner while sharing a life together.  Chris Nuzum, as a user of
+Hyperbole, has helped demonstrate its power since its inception; he
+knows how to work with Hyperbole far better than I.
+
+@menu
+* Introduction::
+* Installation::
+* Buttons::
+* Smart Keys::
+* Menus::
+* Entering Arguments::
+* Outliner::
+* Rolodex::
+* Window Configurations::
+* Developing with Hyperbole::
+* Glossary::
+* Smart Key Reference::
+* Outliner Keys::
+* Suggestion or Bug Reporting::
+* Questions and Answers::
+* Future Work::
+* References::
+* Key Binding Index::
+* Code and File Index::
+* Concept Index::
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Hyperbole Overview::
+* Mail Lists::
+* Manual Overview::
+
+Installation
+
+* Obtaining::
+* Building::
+* Installing::
+* Configuring::
+
+Configuring
+
+* Internal Viewers::
+* External Viewers::
+* Link Variable Substitution::
+* Button Colors::
+
+Buttons
+
+* Explicit Buttons::
+* Global Buttons::
+* Implicit Buttons::
+* Action Types::
+* Button Type Precedence::
+* Button Files::
+* Utilizing Explicit Buttons::
+
+Utilizing Explicit Buttons
+
+* Creation::
+* Renaming::
+* Deletion::
+* Modification::
+* Location::
+* Buttons in Mail::
+* Buttons in News::
+
+Creation
+
+* By Dragging::                 Creation Via Action Key Drags
+* By Menu::                     Creation Via Menus
+
+Outliner
+
+* Menu Commands::
+* Creating Outlines::
+* Autonumbering::
+* Idstamps::
+* Editing::
+* Viewing::
+* Links::
+* Cell Attributes::
+* Outliner History::
+
+Editing
+
+* Adding and Killing::
+* Moving Around::
+* Relocating and Copying::
+* Filling::
+* Transposing::
+* Splitting and Appending::
+* Inserting and Importing::
+
+Viewing
+
+* Hiding and Showing::
+* View Specs::
+
+Rolodex
+
+* Rolo Concepts::
+* Rolo Menu::
+* Rolo Keys::
+* Rolo Settings::
+
+Developing with Hyperbole
+
+* Hook Variables::
+* Creating Types::
+* Explicit Button Technicalities::
+* Encapsulating Systems::
+* Embedding Hyperbole::
+
+Creating Types
+
+* Action Type Creation::
+* Implicit Button Types::
+
+Explicit Button Technicalities
+
+* Button Label Normalization::
+* Operational and Storage Formats::
+* Programmatic Button Creation::
+
+Smart Key Reference
+
+* Smart Mouse Keys::
+* Smart Keyboard Keys::
+@end menu
+
+@node Introduction, Installation, Top, Top
+@chapter Introduction
+
+This chapter describes what Hyperbole is, lists some of its potential
+applications, explains how to subscribe to its mail lists, and then
+summarizes the structure of the rest of the manual.
+
+@menu
+* Hyperbole Overview::
+* Mail Lists::
+* Manual Overview::
+@end menu
+
+@node Hyperbole Overview, Mail Lists, Introduction, Introduction
+@section   Hyperbole Overview
+@cindex button
+A Hyperbole user works with @emph{buttons} embedded within textual
+documents; he may create, modify, move or delete buttons.  Each button
+performs a specific action, such as linking to a file or executing a
+shell command.
+
+@cindex button, explicit
+@cindex button, global
+@cindex button, implicit
+@cindex button category
+@cindex explicit button
+@cindex global button
+@cindex implicit button
+There are three categories of Hyperbole buttons:
+@table @dfn
+@item explicit buttons
+created by Hyperbole, accessible from within a single document;
+
+@item global buttons
+created by Hyperbole, accessible anywhere within a user's network of
+documents;
+
+@item implicit buttons
+created and managed by other programs or embedded within the structure
+of a document, accessible from within a single document.  Hyperbole
+recognizes implicit buttons by contextual patterns given in their type
+specifications (explained later).
+@end table
+
+Explicit Hyperbole buttons may be embedded within any type of text file.
+Implicit buttons may be recognized anywhere within a text file,
+depending on the implicit button types that are available.  All global
+buttons are stored in a single location and activated by entering their
+names, rather than by direct selection, the means used to activate
+explicit and implicit buttons.
+
+@noindent
+To summarize:
+
+@example
+Button Category   Active Within        Activation Means      Managed By
+========================================================================
+Explicit          a single document    direct selection      Hyperbole
+Global            any document         specifying its name   Hyperbole
+Implicit          a matching context   direct selection      other tools
+========================================================================
+@end example
+
+@cindex terminal use
+Hyperbole buttons may be clicked upon with a mouse to activate them or
+to describe their actions.  Thus, a user can always check how a button
+will act before activating it.  Buttons may also be activated from a
+keyboard.  (In fact, virtually all Hyperbole operations, including menu
+usage, may be performed from any standard character terminal interface,
+so one need not be anchored to a workstation all day).  @xref{Smart
+Keys}.
+
+@cindex Hyperbole features
+Hyperbole does not enforce any particular hypertext or information
+management model, but instead allows you to organize your information in
+large or small chunks as you see fit.  The Hyperbole outliner organizes
+information hierarchies which may also contain links to external
+information sources.
+
+@noindent
+Some of Hyperbole's most important features include:
+
+@itemize @bullet
+@item
+Buttons may link to information or may execute procedures, such as
+starting or communicating with external programs;
+
+@item
+One simply drags between a button source location and a link destination
+to create or to modify a link button.  The same result can be achieved
+from the keyboard.
+
+@item
+Buttons may be embedded within electronic mail messages;
+
+@item
+Outlines allow rapid browsing, editing and movement of chunks of
+information organized into trees (hierarchies);
+
+@item
+Other hypertext and information retrieval systems may be encapsulated
+under a Hyperbole user interface (a number of samples are provided).
+@end itemize
+
+@cindex Hyperbole applications
+@noindent
+Typical Hyperbole applications include:
+
+@table @strong
+@item personal information management
+Overlapping link paths provide a variety of views into an information space.
+A search facility locates buttons in context and permits quick selection.
+
+@item documentation and code browsing
+Cross-references may be embedded within documentation.  One can add a
+point-and-click interface to existing documentation, link code with
+associated design documents, or jump to the definition of an identifier
+by selecting its name within code or documentation.
+
+@item brainstorming
+The Hyperbole outliner, @xref{Outliner}, is an
+effective tool for capturing ideas and then quickly reorganizing them in
+a meaningful way.  Links to related ideas are easy to create,
+eliminating the need to copy and paste information into a single place.
+
+@item help/training systems
+Tutorials containing buttons can show students how things work while
+explaining the concepts, e.g@. an introduction to local commands.  This
+technique can be much more effective than written documentation alone.
+
+@item archive managers
+Programs that manage archives from incoming information streams may be
+supplemented by having them add topic-based buttons that link to the
+archive holdings.  Users can then search and create their own links to
+archive entries.
+@end table
+
+@node Mail Lists, Manual Overview, Hyperbole Overview, Introduction
+@section   Mail Lists
+
+If you maintain or use Hyperbole, you should consider joining one of the
+two Hyperbole interest mailing lists.  @xref{Menus}, and the description
+of the the Msg/ menu item, for a convenient means of joining and mailing
+to these lists.
+
+@cindex mail lists
+@cindex e-mail
+There are several Hyperbole-related mail addresses.  Learn what each is
+for before you mail to any of them.
+
+@cindex mail list requests
+@cindex joining a mail list
+@cindex subscribing to a mail list
+@cindex unsubscribing from a mail list
+@format
+<hyperbole-request@@hub.ucsb.edu>
+<hyperbole-announce-request@@hub.ucsb.edu>
+@end format
+
+@display
+@strong{All} mail concerning administration of the Hyperbole mailing
+lists should be sent to the appropriate one of these addresses.  That
+includes addition, change, or deletion requests.  Don't consider sending
+such a request to a Hyperbole mail list or people will wonder why you
+don't know that all Internet mail lists have a -request address for
+administrative requests.@refill
+
+Use the following formats on your subject line to execute requests,
+where you substitute your own values for the <> delimited items.@refill
+
+   Subject: Subscribe '<' <user@@domain> '>' (<your name>).
+   Subject: Unsubscribe '<' <user@@domain> '>'.
+
+To change your address, you must unsubscribe your old address in one
+message and then subscribe your new address in another message.@refill
+
+For example:
+
+   To: hyperbole-announce-request@@hub.ucsb.edu
+   Subject: Unsubscribe <joe@@any.com>.
+
+   To: hyperbole-announce-request@@hub.ucsb.edu
+   Subject: Subscribe <joe@@any.com> (Joe Williams).
+@end display
+
+@noindent
+There are two Hyperbole-related mail lists.  Subscribe to one or the other,
+not to both.
+
+@cindex hyperbole mail list
+@format
+<hyperbole@@hub.ucsb.edu>
+@end format
+
+@display
+Mail list for discussion of all Hyperbole issues.  Bug reports and
+suggestions may also be sent here.@refill
+
+@cindex e-mail, effective communication
+@cindex effective communication
+Always use your Subject and/or Summary: lines to state the position that
+your message takes on the topic that it addresses.
+
+For example, send:
+
+   Subject: Basic bug in top-level minibuffer menu.
+
+rather than:
+
+   Subject: Hyperbole bug.
+
+Statements end with periods, questions with question marks (typically),
+and high energy, high impact declarations with exclamation points.  This
+simple rule makes all e-mail communication much easier for recipients to
+handle appropriately.@refill
+
+@cindex Hyperbole version
+@cindex Emacs version
+@vindex emacs-version
+If you ask a question, your subject line should end with a ?,
+e.g@. "Subject: How can man page SEE ALSOs be made implicit buttons?"  A
+"Subject: Re: How can ..." then indicates an answer to the question.
+Question messages should normally include your Hyperbole and Emacs
+version numbers and clearly explain your problem and surrounding issues.
+Otherwise, you will simply waste the time of those who may want to help
+you.  (Your top-level Hyperbole menu shows its version number and @{@kbd{M-x
+emacs-version @key{RET}}@} gives the other.)@refill
+
+If you ask questions, you should consider adding to the discussion by
+telling people the kinds of work you are doing or contemplating doing
+with Hyperbole.  In this way, the list will not be overwhelmed by
+messages that ask for, but provide no information.@refill
+@end display
+
+@cindex hyperbole-announce mail list
+@format
+<hyperbole-announce@@hub.ucsb.edu>
+@end format
+
+@display
+Those who don't want to participate in the discussion but want to hear
+about bug fixes and new releases of Hyperbole should subscribe to this
+list.  Anyone on the `hyperbole' list is automatically on this one too,
+so there is no need to subscribe to this one in that case.  This list is
+for official fixes and announcements so don't send your own fixes here.
+Send them to `hyperbole' instead.
+@end display
+
+
+@node Manual Overview,  , Mail Lists, Introduction
+@section   Manual Overview
+
+Remember that the @file{DEMO} file included in the Hyperbole
+distribution demonstrates many of Hyperbole's standard facilities,
+(@pxref{Top, Preface}) for more details.
+
+@xref{Glossary}, for definitions of Hyperbole terms for quick
+reference, so in some cases terms are not precisely defined within the
+text.  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.
+
+If you have a question, feature suggestion or bug report on Hyperbole,
+follow the instructions given in @ref{Suggestion or Bug Reporting}.  A few
+commonly asked questions are answered in the manual, @ref{Questions and
+Answers}.  If you are interested in classic articles on hypertext,
+@ref{References}.
+
+@xref{Installation}, for explanations of how to obtain, install, configure
+and load Hyperbole for use.
+
+@xref{Buttons}, for an overview of Hyperbole buttons and how to use them.
+
+@xref{Smart Keys}, for an explanation of the innovative,
+context-sensitive mouse and keyboard Action and Assist Keys offered by
+Hyperbole.  @xref{Smart Key Reference}, for a complete reference on what
+the Action and Assist Keys do in each particular context that they
+recognize.
+
+(Keep in mind as you read about how to use Hyperbole that in many cases,
+it provides a number of overlapping interaction methods are provided to
+support different work styles and hardware limitations.  You need learn
+only one with which you can become comfortable, in such instances.)
+
+@xref{Menus}, for summaries of Hyperbole menu commands and how to use
+the minibuffer-based menus that work on dumb terminals.
+
+@xref{Entering Arguments}, for special support that Hyperbole provides for
+entering arguments when prompted for them.
+
+@xref{Outliner}, for concept and usage information on the
+autonumbered, hypertextual outliner.  A full summary of the outliner
+commands that are bound to keys may be found in @ref{Outliner Keys}.
+
+@xref{Rolodex}, for concept and usage information on the
+rapid lookup, hierarchical, free text record management system included
+with Hyperbole.
+
+@xref{Window Configurations}, for instructions on how to save and restore
+the set of buffers and windows that appear with a frame.  This feature
+lets you switch among working contexts easily, even on a dumb terminal.
+Such configurations only last throughout your current editor session.
+
+Developers comfortable with Emacs Lisp will want to continue on through
+to, @ref{Developing with Hyperbole}.
+
+@xref{Future Work}, for future directions in Hyperbole's evolution.
+
+
+@node Installation, Buttons, Introduction, Top
+@chapter Installation
+
+@cindex installation
+Hyperbole must be installed at your site before you can use it.  The
+following sections explain how to obtain, install and configure
+Hyperbole for use.
+
+@vindex file, hsite.el
+@cindex customization, init
+If you want to customize the basic Hyperbole initialization sequence for
+yourself rather than the users at your site, you should make a personal
+copy of the @file{hsite.el} file, modify it the way you want, and then
+load it.  (If you are familiar with Emacs Lisp, @ref{Hook Variables}.)
+
+@menu
+* Obtaining::
+* Building::
+* Installing::
+* Configuring::
+@end menu
+
+@node Obtaining, Building, Installation, Installation
+@section   Obtaining
+
+@cindex InfoDock
+@cindex ftp
+@cindex anonymous ftp
+Hyperbole is actually part of an integrated tool framework that we have
+developed called InfoDock.  InfoDock provides a modern user interface on top
+of Emacs, information management, and powerful software development tools,
+all in one package.  Hyperbole or InfoDock can be obtained via anonymous
+ftp on the Internet from:
+
+@file{ftp://ftp.xemacs.org/pub/infodock}.
+
+@cindex downloading Hyperbole
+@cindex obtaining Hyperbole
+@cindex Hyperbole, obtaining
+@noindent
+Here are detailed instructions for downloading and unpacking Hyperbole.
+
+Move to a directory below which you want the @file{hyperbole} directory to
+be created.  Unpacking the Hyperbole archive will create the
+@file{hyperbole} directory and will place all of the files below it.
+
+@example
+  cd <LOCAL-EMACS-LISP-DIR>
+@end example
+
+@noindent
+Ftp to ftp.xemacs.org  (Internet Host ID = 128.174.252.16):
+
+@example
+   prompt> ftp ftp.xemacs.org
+@end example
+
+@noindent
+Login as @emph{anonymous} with your own @emph{<user-id>@@<site-name>} as
+a password.
+
+@example
+   Name (ftp.xemacs.org): anonymous
+   331 Guest login ok, send EMAIL address (e.g@. user@@host.domain)
+       as password.
+   Password:
+   230 Guest login ok, access restrictions apply.
+@end example
+
+@noindent
+Move to the Hyperbole directory:
+
+@example
+   ftp> cd pub/infodock
+@end example
+
+@noindent
+Set your transfer mode to binary:
+
+@example
+   ftp> bin
+   200 Type set to I.
+@end example
+
+@noindent
+Turn off prompting:
+
+@example
+   ftp> prompt
+   Interactive mode off.
+@end example
+
+@noindent
+Retrieve just the Hyperbole archive and any diff-based patches (there may not
+be any patches):
+
+@example
+   ftp> mget hyperbole*
+   ftp> mget hdiff*
+@end example
+
+@noindent
+Close the ftp connection:
+
+@example
+   ftp> quit
+   221 Goodbye.
+@end example
+
+@cindex gzcat
+@cindex zcat
+@cindex gunzip
+@cindex tar archive
+@cindex uncompressing archives
+@cindex unpacking archives
+@noindent
+Unpack the tar archive using the GNU version of the @code{zcat} program,
+sometimes called @code{gzcat} or the @code{gunzip} program:
+
+@example
+   zcat hyperbole*tar.gz | tar xvf -
+or
+   gunzip hyperbole*tar.gz; tar xvf hyperbole*tar
+@end example
+
+@noindent
+Apply any patches you retrieved:
+
+@example
+   cd hyperbole; patch < <patch-file>
+@end example
+
+
+@node Building, Installing, Obtaining, Installation
+@section   Building
+
+@vindex file, Makefile
+@vindex file, hsite.el
+@cindex Hyperbole, building
+@cindex building Hyperbole
+The following explains how to Use the Hyperbole @file{Makefile} to
+compile any needed code, to generate the @file{hsite.el} file used for
+site-specific Hyperbole customization, and to produce printable
+documentation.
+
+@vindex EMACS, environment variable
+@cindex compiling Lisp
+@cindex Lisp compilation
+Edit the line near the top of @file{Makefile} that represents the emacs
+version that you use, so that it corresponds to the emacs executable
+name used on your system.  Then immediatly below there, set the
+@var{EMACS} variable to the variable name for the emacs that you will
+use to compile the Hyperbole Lisp files.
+
+@vindex SITE-PRELOADS, environment variable
+You may also have to set the @var{SITE-PRELOADS} variable defined further down
+in the file; follow the instructions that precede the @var{SITE-PRELOADS =}
+line.  Make these changes now and save the @file{Makefile}.
+
+@cindex HYPERBOLE-DIR
+The following instructions use the term @file{<HYPERBOLE-DIR>/} to refer
+to your @file{hyperbole/} directory, so substitute your own value.
+
+@noindent
+To install Hyperbole for use with InfoDock, XEmacs, GNU Emacs or Epoch, from
+a shell:
+
+@example
+   cd <HYPERBOLE-DIR>; make
+@end example
+
+@noindent
+All of the .elc compiled Lisp files are already built for XEmacs and V19, so
+this build will finish very quickly.  If you really want to rebuild all of
+the .elc files, use:
+
+@example
+   cd <HYPERBOLE-DIR>; make all-elc
+@end example
+
+@cindex Postscript
+@cindex manual, generating Postscript
+@vindex file, man/hyperbole.ps
+@noindent
+To produce the Postscript version of the Hyperbole manual, you must have
+the TeX formatter on your system:
+
+@example
+   cd <HYPERBOLE-DIR>; make ps
+@end example
+
+@noindent
+To install Hyperbole for use with GNU Emacs V18 or Epoch:
+
+@example
+   cd <HYPERBOLE-DIR>; make all-elc-v18
+@end example
+
+@noindent
+This will produce a complete set of Emacs V18 .elc files.
+
+
+@node Installing, Configuring, Building, Installation
+@section   Installing
+
+@cindex configuration
+You may want to explore the Hyperbole configuration options before
+installing it.  @xref{Configuring}.  If you just want to get up and
+running quickly, however, there is no need to configure anything, just
+follow these instructions to install Hyperbole.
+
+@cindex Hyperbole, initializing
+@cindex initializing Hyperbole
+@cindex installation
+@cindex site initialization
+@vindex file, hsite.el
+@vindex file, ~/.emacs
+Add the following lines to a site initialization file such as
+@file{site-start.el} to set up so that all users have Hyperbole
+loaded for them when they run Emacs.  Otherwise, each user will have to
+add these lines to his own @file{~/.emacs} initialization file.
+
+@cindex autoloading Hyperbole
+@cindex Hyperbole, autoloading
+@noindent
+To autoload Hyperbole so that it loads only when needed:
+
+@vindex hyperb:dir
+@vindex file, hversion.el
+@vindex file, hyperbole.el
+@lisp
+(defvar hyperb:dir "<HYPERBOLE-DIR>/")
+  "Directory where the Hyperbole executable code is kept.
+It must end with a directory separator character.")
+
+(load (expand-file-name "hversion" hyperb:dir))
+(load (expand-file-name "hyperbole" hyperb:dir))
+@end lisp
+
+@cindex loading Hyperbole
+@cindex Hyperbole, loading
+This establishes a few key bindings and sets up Hyperbole to
+automatically load whenever you activate its menu.  If you would rather
+have the whole Hyperbole system loaded when you start up so that you can
+always use the Smart Keys and other facilities, add the additional line:
+
+@lisp
+(require 'hsite)
+@end lisp
+
+If you use mouse keys, be sure to add the above lines after any setup of
+mouse key bindings, to ensure that Hyperbole's mouse keys are properly
+initialized.  @xref{Smart Keys}, for further details.  If you use any
+Hyperbole mail or news support, @ref{Buttons in Mail}, be certain to
+perform all of your personal mail/news initializations before the point
+at which you load Hyperbole.  Otherwise, the mail/news support may not
+be configured properly.  For example, if you use the Emacs add-on
+Supercite package, its setup should come before Hyperbole initialization.
+
+@cindex Hyperbole manual
+@noindent
+The Hyperbole Manual is included in the distribution in two forms:
+
+@cindex Info manual
+@cindex Texinfo manual
+@vindex file, man/hyperbole.info
+@vindex file, man/hyperbole.texi
+@example
+@file{man/hyperbole.info}   - online version
+@file{man/hyperbole.texi}   - source form
+@end example
+
+@vindex Info-directory-list
+@noindent
+To add pointers to the Info version of the Hyperbole manual within your
+Info directory, follow these instructions.  If @var{Info-directory-list}
+is bound as a variable within your Emacs (all versions except V18 and
+Epoch), then you can simply set it so that <HYPERBOLE-DIR> is an element
+in the list:
+
+@lisp
+(setq Info-directory-list (cons "<HYPERBOLE-DIR>" Info-directory-list))
+@end lisp
+
+@noindent
+Otherwise, from a shell:
+
+@vindex Info-directory
+@example
+   cd to the directory given by your @var{Info-directory} variable
+   rm hyperbole.info*; cp <HYPERBOLE-DIR>/man/hyperbole.info* .
+@end example
+
+@noindent
+For all versions of Emacs, add an Info menu entry for the Hyperbole
+manual in your Info @file{dir} file (the `*' should be placed in the
+first column of the file):
+
+@example
+* Hyperbole::  GNU Emacs-based everyday information management system.
+    Use @{C-h h d d@} for a demonstration.  Includes context-sensitive
+    mouse and keyboard support, a powerful rolodex, an autonumbered
+    outliner with hyperlink anchors for each outline cell, and extensible
+    hypertext facilities including hyper-links in mail and news messages.
+@end example
+
+@cindex invoking Hyperbole
+@cindex starting Hyperbole
+@cindex Hyperbole, starting
+@cindex Hyperbole main menu
+@kindex C-h h
+@findex hyperbole
+That's all there is to the installation.  Once Hyperbole has been
+installed for use at your site, you can invoke it with @{@kbd{C-h h}@}
+or @{@kbd{M-x hyperbole @key{RET}}@} to bring up the Hyperbole main menu
+in the minibuffer window.
+
+
+@node Configuring,  , Installing, Installation
+@section   Configuring
+
+@cindex configuration
+@vindex file, hyperbole.el
+@vindex file, hsite.el
+There are many Hyperbole configuration options that may be changed by
+editing the @file{hyperbole.el} and @file{hsite.el} files in the
+@file{hyperbole/} directory.  The following sections discuss the
+configuration options most likely to be of interest to users.
+
+@menu
+* Internal Viewers::
+* External Viewers::
+* Link Variable Substitution::
+* Button Colors::
+@end menu
+
+
+@node Internal Viewers, External Viewers, Configuring, Configuring
+@subsection  Internal Viewers
+@vindex hpath:display-alist
+@vindex file, hsite.el
+@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 @var{hpath: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.
+
+Configure the @var{hpath:display-alist} variable in @file{hsite.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.@refill
+
+@xref{External Viewers}, for instructions on associating file names with
+external, window-system specific viewers.
+
+@node External Viewers, Link Variable Substitution, Internal Viewers, Configuring
+@subsection  External Viewers
+@vindex hpath:find-alist
+@vindex file, hsite.el
+@cindex window system
+@cindex external program
+@cindex external viewer
+@cindex link, viewer program
+If you will be using Hyperbole under a window system, you may want to
+configure the @var{hpath:find-alist} variable in @file{hsite.el} to
+support hyperlinks which open files using non-Emacs tools, e.g@. a
+fax reader or a bitmap viewer.
+
+The value of @var{hpath:find-alist} is determined when Hyperbole is
+initialized based upon the current window system and the version of
+Emacs in use.  The value is an association list whose elements are
+(<file-name-regular-expression> . <viewer-program>) pairs.  Any path
+whose name matches a <file-name-regular-expression> will be
+displayed using the corresponding viewer-program.  If a <viewer-program>
+entry contains a @code{%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> entry.  See the "x-suffixes"
+and "nextstep-suffixes" settings within the definition of
+@var{hpath:find-alist} as examples.@refill
+
+@node Link Variable Substitution, Button Colors, External Viewers, Configuring
+@subsection  Link Variable Substitution
+@vindex hpath:variables
+@cindex environment variables
+@cindex Emacs Lisp variables
+@cindex Lisp variables
+Another variable to consider modifying in the @file{hsite.el} file is
+@var{hpath:variables}.   This variable consists of a list of Emacs Lisp
+variable names, each of which may have a pathname or a list of pathnames
+as a value.  Whenever a Hyperbole file or directory link button is
+created, its pathname is compared against the values in
+@var{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 the link is resolved (the button is
+activated), Hyperbole replaces each variable with the first matching
+value from this list.  (Environment variables are also replaced whenever
+link paths are resolved.
+
+This permits sharing of links over wide areas, where the variable values
+may 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
+@var{hpath:variables}.
+
+@node Button Colors,  , Link Variable Substitution, Configuring
+@subsection  Configuring Button Colors
+@cindex XEmacs support
+@cindex Emacs 19 support
+@cindex Epoch support
+@cindex button highlighting
+@cindex button flashing
+@vindex file, hui-ep*.el
+@findex hproperty:cycle-but-color
+When Hyperbole is run under a window system together with Emacs 19,
+XEmacs or Epoch, it automatically highlights any explicit buttons in
+a buffer and makes them flash when selected.  The main setting
+you may want change is the selection of a color (or style) for button
+highlighting and button flashing.  See the @file{hui-*-b*.el} files for
+lists of potential colors and the code which supports this behavior.  A
+call to @code{(hproperty:cycle-but-color)} within a Hyperbole
+initialization sequence in the @file{hsite.el} file changes the color
+used to highlight and flash explicit buttons.
+
+@cindex button emphasis
+@vindex hproperty:but-emphasize-p
+@vindex file, hsite.el
+Additionally, under XEmacs and Emacs 19, if @var{hproperty:but-emphasize-p}
+is set to @code{t} in @file{hsite.el}, then whenever the mouse pointer
+moves over an explicit button, it will be emphasized in a different
+color or style.  This emphasis is in addition to any non-mouse-sensitive
+button highlighting.
+
+@cindex button highlighting, forcing
+@findex hproperty:but-create
+If you read in a file with explicit buttons before you load Hyperbole,
+these buttons won't be highlighted.  Load Hyperbole and then use
+@code{M-x hproperty:but-create @key{RET}} to highlight the buttons in
+the current buffer.
+
+
+@node Buttons, Smart Keys, Installation, Top
+@chapter Buttons
+
+This chapter explains the user-level notion of Hyperbole buttons.
+Hyperbole buttons that are stored in files persist across Emacs
+sessions, so they provide a convenient means of linking from one
+information source to another.
+
+@menu
+* Explicit Buttons::
+* Global Buttons::
+* Implicit Buttons::
+* Action Types::
+* Button Type Precedence::
+* Button Files::
+* Utilizing Explicit Buttons::
+@end menu
+
+@node Explicit Buttons, Global Buttons, Buttons, Buttons
+@section   Explicit Buttons
+
+@cindex explicit button
+@cindex button, explicit
+@cindex button label
+Hyperbole creates and manages @emph{explicit buttons} which look like
+this @code{<(fake button)>} to a Hyperbole user.  They are quickly
+recognizable, yet relatively non-distracting as one scans the text in
+which they are embedded.  The text between the @code{<(} and
+@code{)>} delimiters is called the @dfn{button label}.  Spacing between
+words within a button label is irrelevant to Hyperbole, so button labels
+may wrap across several lines without causing a problem.
+
+@cindex button data
+@cindex button attribute
+@vindex file, .hypb
+Hyperbole stores the @dfn{button data} that gives an explicit button its
+behavior, separately from the button label, in a file named @file{.hypb}
+within the same directory as the file in which the button is created.
+Thus, all files in the same directory share a common button data file.
+Button data is comprised of individual @dfn{button attribute} values.  A
+user never sees this data in its raw form but may see a formatted
+version by asking for help on a button.
+
+@cindex button, moving
+@cindex moving buttons
+Explicit buttons may be freely moved about within the buffer in which
+they are created.  (No present support exists for moving buttons between
+buffers).  A single button may also appear multiple times within the
+same buffer; one simply copies the button label with its delimiters
+to a new location in such cases.
+
+Each explicit button is assigned an action type which determines the
+actions that it performs.  @dfn{Link action types} connect buttons to
+particular types of referents.  @dfn{Activation} of such buttons then
+displays the referents.
+
+@cindex linking, in-place
+@cindex Hyperbole data model
+Hyperbole does not manage referent data; this is left to the
+applications that generate the data.  This means that Hyperbole
+provides in-place linking and does not require reformatting of data to
+integrate it with a Hyperbole framework.
+
+@node Global Buttons, Implicit Buttons, Explicit Buttons, Buttons
+@section   Global Buttons
+
+@cindex global button
+@cindex button, global
+@cindex button label
+Access to explicit buttons depends upon the information on your screen
+since they are embedded within particular buffers.  Sometimes it is
+useful to activate buttons without regard to the information with which
+you are presently working.  In such instances, you use @dfn{global
+buttons}, which are simply explicit buttons which may be activated or
+otherwise operated upon by entering their labels when they are prompted
+for, rather than selecting the buttons within a buffer.
+
+If you want a permanent link to a file section that you can follow at
+any time, you can use a global button.  Or what about an Emacs keyboard
+macro that you use frequently?  Create an @code{exec-kbd-macro} button
+with an easy to type name and then you can easily activate it whenever
+the need arises.
+
+@node Implicit Buttons, Action Types, Global Buttons, Buttons
+@section   Implicit Buttons
+
+@cindex button, implicit
+@cindex implicit button
+Implicit buttons are those defined by the natural structure of a
+document.  They are identified by contextual patterns which limit the
+locations or states in which they can appear.  Their behavior is
+determined by one or more actions which they trigger when activated.  An
+action is derived from either a Hyperbole action type specification,
+@ref{Action Types}, or an Emacs Lisp function.  Implicit
+button types may use the same action types that explicit buttons do.
+
+@vindex file, hibtypes.el
+@cindex context
+Implicit buttons never have any button data associated with them.  They
+are recognized in context based on predicate matches defined within
+implicit button types.  For example, Hyperbole recognizes file names
+enclosed in double quotes and can quickly display their associated files
+in response to simple mouse clicks.
+
+@cindex ibtypes, list of
+@noindent
+See @file{hibtypes.el} for complete examples.  Standard implicit button
+types include (in alphabetical order):
+
+@table @code
+
+@item annot-bib
+@findex ibtypes::annot-bib
+@cindex bibliography
+@cindex reference
+Displays annotated bibliography entries referenced internally, delimeters = [].
+References must be delimited by square brackets, must begin with a
+word constituent character, and must not be in buffers whose
+names begin with a ' ' or '*' character.
+
+@item completion
+@findex ibtypes::completion
+@cindex completion
+Inserts completion at point into minibuffer or other window.
+
+@item dir-summary
+@findex ibtypes::dir-summary
+@vindex file, MANIFEST
+@vindex file, DIR
+Detects filename buttons in files named "MANIFEST" or "DIR".
+Displays selected files.
+Each file name 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.
+
+@item doc-id
+@findex ibtypes::doc-id
+@cindex online library
+@cindex document identifier
+Displays an index entry for a site-specific document given its id.  Ids
+must be delimited by 'doc-id-start' and 'doc-id-end' and must match the
+function given by 'doc-id-p'.  This permits creation of catalogued
+online libraries.  See @file{$@{hyperb:dir@}/hib-doc-id.el} for more
+information.@refill
+
+@item elisp-compiler-msg
+@findex ibtypes::elisp-compiler-msg
+@cindex byte compiler error
+@cindex Emacs Lisp compiler error
+@cindex compiler error
+Jumps to source code for definition associated with byte-compiler error
+message.  Works when activated anywhere within an error line.
+
+@item debugger-source
+@findex ibtypes::debugger-source
+@cindex gdb
+@cindex dbx
+@cindex xdb
+@cindex stack frame
+@cindex breakpoint
+@cindex source line
+Jumps to source line associated with debugger stack frame or breakpoint lines.
+This works with gdb, dbx, and xdb.  Such lines are recognized in any buffer.
+
+@item grep-msg
+@findex ibtypes::grep-msg
+@cindex grep
+@cindex compiler error
+Jumps to line associated with grep or compilation error msgs.
+Messages are recognized in any buffer.
+
+@item hyp-address
+@findex ibtypes::hyp-address
+@cindex Hyperbole mail list
+Turns a Hyperbole e-mail list address into an implicit button which
+inserts Hyperbole environment information.
+Useful when sending mail to a Hyperbole mail list.  See also the
+documentation for @code{actypes::hyp-config}.
+
+@item hyp-source
+@findex ibtypes::hyp-source
+@cindex Hyperbole report
+Turns source location entries in Hyperbole reports into buttons that jump to the associated location.
+
+@item Info-node
+@findex ibtypes::Info-node
+@cindex Info node
+Makes "(file)node" buttons display the associated Info node.
+
+@item kbd-key
+@findex ibtypes::kbd-key
+@cindex key sequence
+Executes a key sequence delimited by curly braces.
+Key sequences should be in human readable form, e.g@. @{@kbd{C-b}@}.
+Forms such as @{@}, @{@}, and @{^b@} will not be recognized.
+
+@item klink
+@findex ibtypes::klink
+@cindex klink
+@cindex koutline link
+@cindex kcell link
+Follows a link delimited by <> to a koutline cell.
+See documentation for @code{actypes::link-to-kotl} for valid link
+specifiers.
+
+@item mail-address
+@findex ibtypes::mail-address
+@cindex e-mail address
+@cindex rolodex address
+@cindex address
+If on an e-mail address in a specific buffer type, mail to that address
+in another window. Applies to the rolodex match buffer, any buffer
+attached to a file in @var{rolo-file-list}, or any buffer with @file{mail}
+or @file{rolo} (case-insensitive) within its name.
+
+@item man-apropos
+@findex ibtypes::man-apropos
+@item UNIX manual
+@item man pages
+@item man apropos
+Makes man apropos entries display associated man pages when selected.
+
+@item patch-msg
+@findex ibtypes::patch-msg
+@cindex patch output
+Jumps to source code associated with output from the @code{patch}
+program.  Patch applies diffs to source code.
+
+@item pathname
+@findex ibtypes::pathname
+@findex hpath:at-p
+@findex hpath:find
+@vindex hpath:suffixes
+@cindex ange-ftp
+@cindex efs
+@cindex pathname
+@cindex remote path
+@cindex filename
+@cindex link, pathname
+Makes a delimited, valid pathname display the path entry.
+Also works for delimited and non-delimited ange-ftp and efs pathnames.
+See @code{hpath:at-p} function documentation for possible delimiters.
+See @var{hpath:suffixes} variable documentation for suffixes that are
+added to or removed from pathname when searching for a valid match.
+See @code{hpath:find} function documentation and
+@var{hpath:display-alist} and @var{hpath:find-alist} variable
+documentation for special file display options.
+
+@item rfc
+@findex ibtypes::rfc
+@cindex Internet RFC
+@cindex Request For Comment
+@cindex RFC
+@cindex ange-ftp
+@cindex efs
+Retrieves and displays an Internet rfc referenced at point.
+Requires ange-ftp or efs when needed for remote retrievals.  The
+following formats are recognized: RFC822, rfc-822, and RFC 822.  The
+@var{hpath:rfc} variable specifies the location from which to retrieve
+RFCs."
+
+@item rfc-toc
+@findex ibtypes::rfc-toc
+@cindex Internet RFC
+@cindex Request For Comment
+@cindex RFC
+@cindex table of contents
+Summarizes contents of an Internet rfc from anywhere within rfc buffer.
+Each line in summary may be selected to jump to section.
+
+@item text-toc
+@findex ibtypes::text-toc
+@cindex table of contents
+@cindex toc implicit button type
+Jumps to the text file section referenced by a table of contents entry
+at point. File name 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 followed by one or more asterisk
+characters.  Each file section name line must start with one or more
+asterisk characters at the very beginning of the line.
+
+@item www-url
+@findex ibtypes::www-url
+@cindex URL
+@cindex World-wide Web
+@cindex WWW
+@cindex Action Key, web browsing
+@kindex Action Key, web browsing
+@vindex action-key-url-function
+When not in a w3 browser buffer, follow any non-ftp url (link) at point.
+The variable, @var{action-key-url-function}, can be used to customize
+the url browser that is used.
+@end table
+
+The Hyperbole Smart Keys offer extensive additional context-sensitive
+point-and-click type behavior beyond these standard implicit button
+types.  @xref{Smart Keys}.
+
+
+@node Action Types, Button Type Precedence, Implicit Buttons, Buttons
+@section   Action Types
+
+@cindex action type
+@cindex argument, use
+@cindex action
+@dfn{Action types} provide action procedures that specify button behavior.
+The arguments needed by an action type are prompted for at button creation
+time.  When a button is activated, the stored arguments are fed to the
+action type's @dfn{action} body to achieve the desired result.  Hyperbole
+handles all of this transparently.
+
+@cindex actypes, list of
+@noindent
+Standard action types in alphabetical order include:
+
+@table @code
+@item annot-bib
+@findex actypes::annot-bib
+Follows internal ref KEY within an annotated bibliography, delimiters=[].
+
+@item completion
+@findex actypes::completion
+Inserts completion at point into minibuffer or other window.
+Unless at end of buffer or if completion has already been inserted, then
+deletes completions window.
+
+@item eval-elisp
+@findex actypes::eval-elisp
+Evaluates a Lisp expression LISP-EXPR.
+
+@item exec-kbd-macro
+@findex actypes::exec-kbd-macro
+Executes KBD-MACRO REPEAT-COUNT times.
+KBD-MACRO may be a string of editor command characters or a function symbol.
+Optional REPEAT-COUNT nil means execute once, zero means repeat until
+error.
+
+@item exec-shell-cmd
+@findex actypes::exec-shell-cmd
+Executes a SHELL-CMD string asynchronously.
+Optional non-nil second argument INTERNAL-CMD means do not display the shell
+command line executed.  Optional non-nil third argument KILL-PREV means
+kill last output to shell buffer before executing SHELL-CMD.
+
+@item exec-window-cmd
+@findex actypes::exec-window-cmd
+Executes an external window-based SHELL-CMD string asynchronously.
+
+@item hyp-config
+@findex actypes::hyp-config
+Inserts Hyperbole configuration info at end of optional OUT-BUF or current.
+
+@item hyp-request
+@findex actypes::hyp-request
+Inserts Hyperbole mail list request help into optional OUT-BUF or current.
+
+@item hyp-source
+@findex actypes::hyp-source
+Displays a buffer or file from a line beginning with 'hbut:source-prefix'.
+
+@item kbd-key
+@findex actypes::kbd-key
+Executes the function binding for KEY-SEQUENCE, delimited by @{@}.
+Returns t if a KEY-SEQUENCE has a binding, else nil.
+
+@item link-to-buffer-tmp
+@findex actypes::link-to-buffer-tmp
+Displays a BUFFER in another window.
+Link is generally only good for current Emacs session.
+Use 'link-to-file' instead for a permanent link.
+
+@item link-to-directory
+@findex actypes::link-to-directory
+Displays a DIRECTORY in Dired mode in another window.
+
+@item link-to-doc
+@findex actypes::link-to-doc
+Displays online version of a document given by DOC-ID, in other window.
+If the online version of a document is not found in
+@var{doc-id-indices}, an error is signalled.
+
+@item link-to-ebut
+@findex actypes::link-to-ebut
+Performs action given by another button, specified by KEY and KEY-FILE.
+
+@item link-to-elisp-doc
+@findex actypes::link-to-elisp-doc
+Displays documentation for FUNC-SYMBOL.
+
+@item link-to-file
+@findex actypes::link-to-file
+Displays a PATH in another window scrolled to optional POINT.
+With POINT, buffer is displayed with POINT at the top of the window.
+
+@item link-to-file-line
+@findex actypes::link-to-file-line
+Displays a PATH in another window scrolled to LINE-NUM.
+
+@item link-to-kcell
+@findex actypes::link-to-kcell
+Displays FILE with kcell given by CELL-REF at the top of the window.
+CELL-REF may be a kcell's display label or its permanant idstamp.
+If FILE is nil, the current buffer is used.
+If CELL-REF is nil, the first cell in the view is shown.
+
+@item link-to-kotl
+@findex actypes::link-to-kotl
+Displays at the top of another window the referent pointed to by LINK.
+LINK may be of any of the following forms, with or without delimiters:
+@example
+  < pathname [, cell-ref] >
+  < [-!&] pathname >
+  < @@ cell-ref >
+@end example
+
+@noindent
+See documentation for @code{kcell:ref-to-id} for valid cell-ref formats.
+
+
+@item link-to-Info-node
+@findex actypes::link-to-Info-node
+Displays an Info NODE in another window.
+NODE must be a string of the form '(file)nodename'.
+
+@item link-to-mail
+@findex actypes::link-to-mail
+Displays mail msg with MAIL-MSG-ID from MAIL-FILE in other window.
+See documentation for the variable @var{hmail:init-function} for
+information on how to specify a mail reader to use.
+
+@item link-to-regexp-match
+@findex actypes::link-to-regexp-match
+Finds REGEXP's Nth occurrence in FILE and displays location at window top.
+Returns t if found, signals an error if not.
+
+@item link-to-rfc
+@findex actypes::link-to-rfc
+Retrieves and displays an Internet rfc given by RFC-NUM.
+RFC-NUM may be a string or an integer.  Requires ange-ftp or efs for
+remote retrievals.
+
+@item link-to-string-match
+@findex actypes::link-to-string-match
+Finds STRING's Nth occurrence in FILE and displays location at window top.
+Returns t if found, nil if not.
+
+@item man-show
+@findex actypes::man-show
+Displays man page on TOPIC, which may be of the form @code{<command>(<section>}).
+
+@item rfc-toc
+@findex actypes::rfc-toc
+Computes and displays summary of an Internet rfc in BUF-NAME.
+Assumes point has already been moved to start of region to summarize.
+Optional OPOINT is point to return to in BUF-NAME after displaying summary.
+
+@item text-toc
+@findex actypes::text-toc
+@cindex table of contents
+@cindex toc action type
+Jumps to the text file SECTION referenced by a table of contents entry
+at point.
+
+@item www-url
+@findex actypes::www-url
+@cindex URL
+@cindex World-wide Web
+@cindex WWW
+@vindex action-key-url-function
+Follows a link given by URL.
+The variable, @var{action-key-url-function}, can be used to customize
+the url browser that is used.
+@end table
+
+@cindex action
+@vindex hui:ebut-prompt-for-action
+The use of action types provides a convenient way of specifying button
+behavior without the need to know how to program.  Expert users who are
+familiar with Emacs Lisp, however, may find that they often want to
+tailor button actions in a variety of ways not easily captured within a
+type system.  In such cases, @var{hui:ebut-prompt-for-action} should be
+set non-nil.  This will cause Hyperbole to prompt for an action to
+override the button's action type at each explicit button creation.  For
+those cases where the action type is sufficient, a nil value should be
+entered for the action.  An action may be any Lisp form that may be
+evaluated.
+
+@node Button Type Precedence, Button Files, Action Types, Buttons
+@section   Button Type Precedence
+
+@cindex button precedence
+@cindex button label overlap
+Explicit buttons always take precedence over implicit buttons.  Thus, if
+a button selection is made which falls within both an explicit and
+implicit button, only the explicit button will be selected.  Explicit
+button labels are not allowed to overlap; Hyperbole's behavior in such
+cases is undefined.
+
+@cindex ibtype, evaluation order
+If there is no explicit button at point during a selection request, then
+each implicit button type predicate is tested in turn until one returns
+non-nil or all are exhausted.  Since two implicit button types may have
+overlapping domains (those contexts in which their predicates are true),
+only the first matching type is used.  The type predicates are tested
+in @strong{reverse} order of definition, i.e@. most recently entered
+types are tested first, so that personal types defined after standard
+system types take precedence.  It is important to keep this order in
+mind when defining new implicit button types.  By making their match
+predicates as specific as possible, one can minimize any overlapping of
+implicit button type domains.
+
+@cindex type redefinition
+Once a type name is defined, its precedence relative to other types
+remains the same even if you redefine the body of the type, as long as
+you don't change its name.  This allows incremental modifications to
+types without having to worry about shifts in type precedence.
+@xref{Creating Types}, for information on how to develop
+or modify types.
+
+@node Button Files, Utilizing Explicit Buttons, Button Type Precedence, Buttons
+@section   Button Files
+
+@cindex button files
+It is often convenient to create lists of buttons that can be used as
+menus to provide centralized access to distributed information pools or
+for other purposes.  These files can serve as useful roadmaps to help
+efficiently guide a user through both unfamiliar and highly familiar
+information spaces.  Files that are created specifically for this
+purpose, we call @dfn{button files}.
+
+@vindex hbmap:filename
+@cindex button file, personal
+@cindex button file, directory
+The Hyperbole menu system provides quick access to two types of these
+button files: personal and directory-specific, through the ButFile menu.
+(The variable, @var{hbmap:filename}, contains the base name of these
+standard button files.  Its standard value is @file{HYPB}.)
+
+@vindex dir, ~/.hyperb
+@vindex hbmap:dir-user
+@cindex global button
+A personal button file may serve as a user's own roadmap to frequently
+used resources.  Selection of the ButFile/PersonalFile menu item
+displays this file for editing.  The default personal button file is
+stored within the directory given by the @var{hbmap:dir-user} variable
+whose standard value is @file{~/.hyperb}.  The standard Hyperbole
+configuration also appends all global buttons to the end of this file,
+one per line, as they are created.  So you can edit or annotate them
+within the file.
+
+A directory-specific button file may exist for each file system
+directory.  Such files are useful for explaining the contents of
+directories and pointing readers to particular highlights within the
+directories.  Selection of the ButFile/DirFile menu item displays the
+button file for the current directory; this provides an easy means of
+updating this file when working on a file within the same directory.
+If you want to view some other directory-specific button file, simply
+use the normal Emacs file finding commands.
+
+One might suggest that menu quick access be provided for group-specific
+and site-specific button files.  Instead, link buttons to such things
+should be placed at the top of your personal button file.  This provides
+a more flexible means of quick access.
+
+@node Utilizing Explicit Buttons,  , Button Files, Buttons
+@section   Utilizing Explicit Buttons
+
+Explicit buttons are a fundamental building block for creating personal
+or organizational hypertext networks with Hyperbole.  This section
+summarizes the user-level operations available for managing these
+buttons.
+
+@menu
+* Creation::
+* Renaming::
+* Deletion::
+* Modification::
+* Location::
+* Buttons in Mail::
+* Buttons in News::
+@end menu
+
+@node Creation, Renaming, Utilizing Explicit Buttons, Utilizing Explicit Buttons
+@subsection  Creation
+
+@menu
+* By Dragging::                 Creation Via Action Key Drags
+* By Menu::                     Creation Via Menus
+@end menu
+
+@node By Dragging, By Menu, Creation, Creation
+@subsubsection Creation Via Action Key Drags
+
+@cindex explicit button, creation
+@cindex button, creation
+@cindex link, creation
+@cindex drag
+@cindex Action Key drag
+The most efficient way to create an explicit button interactively is to
+use the mouse Action Key to drag from a button source window to a window
+showing its link referent.  More specifically, you should split your
+current Emacs frame into two windows: one which contains the point at
+which you want a button to be inserted and another which shows the point
+to which you want to link.  Depress the mouse Action Key at the point at
+which the button should be inserted, drag to the other window and
+release it at the point of the link referent.  The process becomes quite
+simple with a little practice. (@xref{By Menu, Creation Via Menus}, for a
+more detailed explanation of the explicit button creation process.)
+
+Hyperbole uses the link referent context to determine the type of link
+to make.  If there are a few different types of links which are
+applicable from the context, you will be prompted with a list of the
+types.  Simply use the Action Key or the first letter of the link
+type to select one of the type names and to finish the link creation.
+Hyperbole will then insert explicit button delimiters around the button
+label and will display a message in the minibuffer indicating both the
+button name and its action/link type.
+
+@kindex M-o
+@kindex C-u M-o
+@kindex C-x o
+@findex hkey-operate
+If you run Emacs under a window system, you can emulate an Action Key
+drag from the keyboard by: hitting @{@kbd{M-o}@}, the
+@code{hkey-operate} command, at the button source location, moving
+to the link destination, e.g@. with @{@kbd{C-x o}@}, and then hitting
+@{@kbd{M-o}@} again.  This simulates a depress and then release of the
+Action Key.  @{@kbd{C-u M-o}@} emulates drags of the Assist Key.
+This will not work when Hyperbole is run from a dumb terminal Emacs
+session since drag actions are not supported without a window system.
+
+@page
+@node By Menu,  , By Dragging, Creation
+@subsubsection Creation Via Menus
+
+You can alternatively use the Hyperbole menus to create explicit
+buttons.  First, mark a short region of text in any fashion allowed by
+GNU Emacs and then select the Hyperbole menu item sequence, Ebut/Create.
+You will be prompted for the button's label with the marked region as
+the default.  If you accept the default and enter the rest of the
+information you are prompted for, the button will be created within the
+current buffer and Hyperbole will surround the marked region with
+explicit button delimiters to indicate success.
+
+If you do not mark a region before invoking the button create command,
+you will be prompted for both a label and a target buffer for the button
+and the delimited label text will be inserted into the target buffer
+after a successful button creation.
+
+After Hyperbole has the button label and its target buffer, it will
+prompt you for an action type for the button.  Use the @{@kbd{?}@}
+completion help key to see the available types.  The type selected
+determines any following values for which you will be prompted.
+
+@cindex button instance
+@cindex instance number
+If a previous button with the same label exists in the same buffer,
+Hyperbole will add an @dfn{instance number} to the label when it adds
+the delimiters so that the name is unique.  Thus, you don't have to
+worry about accidental button name conflicts.  If you want the same
+button to appear in multiple places within the buffer, just enter the
+label again and delimit it yourself.  Hyperbole will interpret all
+occurrences of the same delimited label within a buffer as the same
+button.
+
+@cindex link, creation
+If you create link buttons using the Hyperbole menus, the best technique
+is to place on screen both the source buffer for the button and the
+buffer to which it will link.  Mark the region of text to use for your
+button label, invoke the button create command from the menu, choose an
+action type which begins with @code{link-to-} and then use the direct
+selection techniques mentioned in @ref{Entering Arguments}, to select
+the link referent.
+
+
+@node Renaming, Deletion, Creation, Utilizing Explicit Buttons
+@subsection  Renaming
+
+@cindex explicit button, renaming
+@cindex button, renaming
+Once an explicit button has been created, its label text must be
+treated specially.  Any inter-word spacing within the label may be
+freely changed, as may happen when a paragraph is refilled.  But a
+special command must be invoked to rename it.
+
+The rename command operates in two different ways.  If point is within a
+button label when it is invoked, it will tell you to edit the button
+label and then invoke the rename command again.  The second invocation
+will actually rename the button.  If instead the command is originally
+invoked outside of any explicit button, it will prompt for the button
+label to replace and the label to replace it with and then will perform
+the rename.  All occurrences of the same button in the buffer will be
+renamed, so you need locate only one occurrence of the button.
+
+@vindex file, .~/.emacs
+@vindex file, hsite.el
+@kindex C-c C-r
+The rename command may be invoked from the Hyperbole menu via
+Ebut/Rename.  A faster method is to use a key bound to the
+@code{hui:ebut-rename} command.  Your site installation may include such
+a key.  @{@kbd{C-h w hui:ebut-rename @key{RET}}@} should show you any
+key it is on.  If no key binding has been established or if you prefer
+one of your own, simply bind it within your @file{~/.emacs} file.  We
+recommend the @{@kbd{C-c C-r}@} key, as in: @code{(global-set-key
+"\C-c\C-r" 'hui:ebut-rename)}.
+
+
+@node Deletion, Modification, Renaming, Utilizing Explicit Buttons
+@subsection  Deletion
+
+@cindex explicit button, deleting
+@cindex button, deleting
+Ebut/Delete works similarly to the Rename command but deletes the
+selected button.  The button's delimiters are removed to confirm the
+delete.  If the delete command is invoked with a prefix argument, then
+both the button label and the delimiters are removed as confirmation.
+
+@vindex hui:ebut-delete-confirm-p
+Presently there is no way to recover a deleted button; it must
+be recreated.  Therefore, the @var{hui:ebut-delete-confirm-p} variable
+is true by default, causing Hyperbole to require confirmation before
+interactively deleting explicit buttons.  Set it to nil if you prefer no
+confirmation.
+
+@node Modification, Location, Deletion, Utilizing Explicit Buttons
+@subsection  Modification
+
+@cindex explicit button, modifying
+@cindex button, modifying
+@cindex Smart Mouse Key drag
+Ebut/Modify prompts you with each of the elements from the button's
+data list and allows you to modify each in turn.
+
+There is a quicker way to modify explicit link buttons.  Simply drag with the
+mouse Action Key from within the button label to a link destination in a
+different window, just as you would when creating a new button with a mouse
+drag.  Remember that drags may also be emulated from the keyboard.
+@xref{Creation}.
+
+@node Location, Buttons in Mail, Modification, Utilizing Explicit Buttons
+@subsection  Location
+
+@cindex explicit button, summarizing
+@cindex button, summarizing
+@cindex button, help
+The Ebut/Help menu can be used to summarize a single explicit button or
+all such buttons within a single buffer.  The buttons summarized may
+then be activated directly from the summary.
+
+Ebut/Help/BufferButs summarizes the explicit buttons in the order in
+which they appear in the buffer.  Ebut/Help/CurrentBut summarizes only
+the button at point.  Ebut/Help/OrderedButs summarizes the buttons in
+alphabetical order.  All of these summary commands eliminate duplicate
+instances of buttons from their help displays.
+
+@cindex explicit button, searching
+@cindex button, searching
+Ebut/Search prompts for a search pattern and searches across all the
+locations in which you have previously created explicit buttons.  It
+asks you whether to match to any part of a button label or only complete
+labels.  It then displays a list of button matches with a single line of
+surrounding context from their sources.  Any button in the match list
+may be activated as usual.  An Action Key press on the surrounding context
+jumps to the associated source line or a press on the filename preceding
+the matches jumps to the file without selecting a particular line.
+
+There are presently no user-level facilities for globally locating buttons
+created by others or for searching on particular button attributes.
+
+@node Buttons in Mail, Buttons in News, Location, Utilizing Explicit Buttons
+@subsection  Buttons in Mail
+
+@kindex C-x m
+@findex mail
+Hyperbole allows the embedding of buttons within electronic mail
+messages that are composed in Emacs with the standard @code{(mail)}
+command, normally bound to @{@kbd{C-x m}@} or with other Emacs-based
+mail composing functions.  An enhanced mail reader can then be used
+to activate the buttons within messages just like any other buttons.
+
+@cindex button, mailing
+@cindex button, posting
+@cindex mailing buttons
+@cindex posting buttons
+@cindex mail reader
+@cindex mailer initialization
+@cindex RMAIL
+@cindex VM
+@cindex PIEmail
+@cindex MH-e
+@cindex GNUS
+@cindex USENET
+@cindex news
+@vindex file, hmail.el
+Hyperbole automatically supports the following mail readers:  Rmail,
+@ref{Rmail,,,emacs, the GNU Emacs Manual}, VM, @ref{Introduction,,,vm,
+the VM Manual}, and PIEmail, and MH-e.  Button inclusion and activation
+within USENET news articles is also supported in the same fashion via
+the GNUS news reader, @ref{Introduction,,,gnus, the GNUS Manual}, if
+available at your site.  (The @file{hmail.el} file provides a
+generalized interface that can be used to hook in other mail or news
+readers if the necessary interface functions are written.)
+
+@vindex mail-yank-original
+@kindex C-c C-y
+@cindex mail inclusion
+All explicit buttons to be mailed must be created within the outgoing
+message buffer. There is no present support for including text from
+other buffers or files which contain explicit buttons, except for the
+ability to yank the contents of a message being replied to, together
+with all of its buttons, via the @code{(mail-yank-original)} command
+bound to @{@kbd{C-c C-y}@}.  From a user's perspective, buttons are
+created in precisely the same way as in any other buffer.  They also
+appear just like any other buttons to both the message sender and the
+reader who uses the Hyperbole enhanced readers.  Button operation may be
+tested any time before a message is sent.  A person who does not use
+Hyperbole enhanced mail readers can still send messages with embedded
+buttons since mail composing is independent of any mail reader
+choice.
+
+Hyperbole buttons embedded within received mail messages act just like
+any other buttons.  The mail does not contain any of the action type
+definitions used by the buttons, so the receiver must have these or she
+will receive an error when she activates the buttons.  Buttons which
+appear in message @emph{Subject} lines are copied to summary buffers
+whenever such summaries are generated.  Thus, they may be activated from
+either the message or summary buffers.
+
+Nothing bad will happen if a mail message with explicit buttons is sent
+to a non-Hyperbole user.  The user will simply see the text
+of the message followed by a series of lines of button data at its end.
+Hyperbole mail users never see this data in its raw form.
+
+@vindex smail:comment
+@cindex mail comment
+In order to alert readers of your mail messages that you can utilize
+Hyperbole mail buttons, the system automatically inserts a comment into
+each mail message that you compose to announce this fact.  The variable,
+@var{smail:comment} controls this behavior.  See its documentation for
+technical details.  By default, it produces a message of the form:
+
+@example
+Comments: Hyperbole mail buttons accepted, vX.XX.
+@end example
+
+@vindex file, ~/.emacs
+@noindent
+where the X's indicate your Hyperbole version number.  You can cut this
+out of particular messages before you send them.  If you don't want any
+message at all, add the following to your @file{~/.emacs} file before
+the point at which you load Hyperbole.
+
+@lisp
+(setq smail:comment nil)
+@end lisp
+
+@cindex actype, link-to-mail
+A final mail-related facility provided by Hyperbole is the ability to
+save a pointer to a received mail message by creating an explicit button
+with a @code{link-to-mail} action type.  When prompted for the mail
+message to link to, if you press the Action Key on an Rmail message, the
+appropriate parameter will be copied to the argument prompt, as
+described in @ref{Entering Arguments}.
+
+
+@node Buttons in News,  , Buttons in Mail, Utilizing Explicit Buttons
+@subsection  Buttons in News
+
+@cindex button, posting
+@cindex news reader/poster
+@cindex posting news
+@cindex GNUS
+@cindex USENET
+@vindex file, hgnus.el
+@vindex file, hsite.el
+Explicit buttons may be embedded within outgoing USENET news articles
+and may be activated from news articles that are being read.  This
+support is available for the GNUS news reader.  It is enabled by default
+within @file{hsite.el} by autoloading the @file{hgnus.el} file.
+
+All Hyperbole support should work just as it does when reading or
+sending mail.  @xref{Buttons in Mail}.  When reading news, buttons which
+appear in message @emph{Subject} lines may be activated within the GNUS
+subject buffer as well as the article buffer.  When posting news, the
+*post-news* buffer is used for outgoing news articles rather than the
+*mail* buffer.
+
+Remember that the articles you post do not contain the action type
+definitions used by the buttons, so the receiver must have these or she
+will receive an error when he activates the buttons.  You should also
+keep in mind that most USENET readers will not be using Hyperbole, so if
+they receive a news article containing explicit buttons, they will
+wonder what the button data at the end of the message is.  You should
+therefore limit distribution of such messages.  For example, if most
+people at your site read news with GNUS and use Hyperbole, it would be
+reasonable to embed buttons in postings to local newsgroups.
+
+@cindex news comment
+In order to alert readers of your postings that you can utilize
+Hyperbole mail buttons embedded within personal replies,
+the system automatically inserts the same comment that is included
+within mail messages to announce this fact.  @xref{Buttons in Mail}, for
+details and an explanation of how to turn this feature off.
+
+@node Smart Keys, Menus, Buttons, Top
+@chapter Smart Keys
+
+@cindex Smart Key
+@cindex mouse support
+@cindex Action Key
+@cindex Assist Key
+@kindex Action Key
+@kindex Assist Key
+Hyperbole provides two special @dfn{Smart Keys} that perform
+context-sensitive operations, the Action Key and the Assist Key.  By
+default, the @dfn{Action Key} is bound to your shift-middle mouse button (or
+shift-left on a 2-button mouse) and the @dfn{Assist Key} is bound to your
+shift-right mouse button, assuming Hyperbole is run under an external window
+system.  (InfoDock users should use the middle mouse button as the
+Action Key, instead.)
+
+@findex hmouse-shift-buttons
+Mouse configuration is automatic for InfoDock, XEmacs, and Epoch under
+the X window system and for GNU Emacs versions 18 and 19 under X,
+OpenWindows, NEXTSTEP, SunView and Apollo's Display Manager, assuming
+your Emacs program has been built with support for any of these window
+systems.  The command, @code{hmouse-shift-buttons}, can be used to
+select between shifted and unshifted Smart Mouse Keys.
+
+@vindex hkey-init
+@kindex C-u M-RET
+@kindex M-RET
+By default (if @var{hkey-init} is set to @code{t} in @file{hsite.el}),
+then @{@kbd{M-@key{RET}}@} may also be used as the Action Key and
+@{@kbd{C-u M-@key{RET}}@} may be used as the Assist Key.  In many
+read-only modes like Dired and Rmail,
+@{@key{RET}@} also functions as the Action Key.  These key bindings allow
+context sensitive operation from any keyboard.
+
+@cindex key binding, smart keys
+@cindex smart key commands
+@findex action-key
+@findex assist-key
+@findex action-mouse-key
+@findex assist-mouse-key
+If you prefer other key bindings, simply bind the commands
+@code{action-key} and @code{assist-key} to keyboard keys.
+@code{hkey-either} may be used instead if you prefer a single
+key binding for both commands; a prefix argument then invokes
+@code{assist-key}.
+
+You may also bind @code{action-mouse-key} and @code{assist-mouse-key}
+to mouse keys, as you like.
+
+@cindex button activation
+@cindex activation
+@cindex button help
+The Action Key generally selects entities, creates links and
+activates buttons.  The Assist Key generally provides help,
+such as reporting on a button's attributes, or serves a complementary
+function to whatever the Action Key does within a context.
+
+@cindex Smart Key operation
+You can get a summary of what the Smart Keys do in all of their
+different contexts by pressing the Assist Key in the right
+corner (within the rightmost 3 characters) of a window modeline or by
+using the Hyperbole Doc/SmartKy menu entry.
+
+The following table is an example of this summary.  Much of the browsing
+power of Hyperbole comes from use of the Smart Keys, so you should spend
+some time practicing how to use them.  This table may appear daunting at
+first, but as you practice and notice that the Smart Keys do just a few
+context-sensitive things per editor mode, you will find it easy to just
+point and click and let Hyperbole do the rest.
+
+For extensive reference documentation on the Smart Keys, @ref{Smart
+Key Reference}.
+
+@page
+@iftex
+@example
+@include ../etc/hypb-mouse.txt
+@end example
+@end iftex
+@ifinfo
+@format
+@include ../etc/hypb-mouse.txt
+@end format
+@end ifinfo
+
+@vindex action-key-default-function
+@vindex assist-key-default-function
+Note how the last line in the table explains the default behavior of the
+Smart Keys.  That is what they do when they cannot find a context match
+at your current location.  See the documentation for the variables
+@var{action-key-default-function} and @var{assist-key-default-function}
+for information on how to customize the behavior of the Smart Keys
+within default contexts.
+
+@cindex Hyperbole help
+A prime design criterion of Hyperbole's user interface is that one
+should be able to see what an operation will do before using it.
+The Assist Key shows you what a button or minibuffer menu item will do
+before you activate it.   Hyperbole also shows the result of directly
+selecting an argument value with the mouse, to provide feedback as to
+whether the right item has been selected.  A second click is necessary
+before an argument is accepted and processed.
+
+@cindex Smart Key help
+@cindex help, Smart Key
+@cindex context sensitive help
+When you use a mouse and you want to find out what either of the Smart
+Keys does within a context, depress the one you want to check on and
+hold it down, then press the other and release as you please.  A help
+buffer will pop up explaining the actions that will be performed in that
+context, if any.  A press of either Smart Key at the end of that
+help buffer will restore your display to its configuration prior to
+invoking help.
+
+@kindex C-h A
+@vindex hkey-init
+By default (if @var{hkey-init} is left set equal to @code{t} in
+@file{hsite.el}), then @{@kbd{C-h A}@} will display this same
+context-sensitive help for the Action Key while @{@kbd{C-u C-h
+A}@} will display the help for the Assist Key.  Note that
+@{@kbd{C-h a}@} will perform a function unrelated to Hyperbole, so you
+must press the shift key when you hit the @kbd{A} character.
+
+@cindex Smart Key toggle
+@cindex mouse key toggle
+@vindex file, ~/.emacs
+@vindex file, hsite.el
+@kindex C-c t
+When Hyperbole is installed, a key may be bound which allows you
+to switch between the Smart Key mouse bindings and your prior ones.
+@kbd{C-h w hmouse-toggle-bindings @key{RET}} 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 @file{~/.emacs} file.  For example, @code{(global-set-key
+"\C-ct" 'hmouse-toggle-bindings)}.
+
+
+@node Menus, Entering Arguments, Smart Keys, Top
+@chapter Menus
+
+@cindex InfoDock
+@cindex XEmacs
+@cindex Emacs 19
+@cindex menu use
+@cindex menubar, Hyperbole menu
+Under InfoDock, XEmacs, and Emacs 19, pulldown and popup menus are
+available to invoke Hyperbole commands, including those from the rolodex
+and the outliner.  These menus operate like any other X window menus.
+Use the Quit command on the Hyperbole menubar menu to get rid of the
+menu if you do not need it.  Invoking Hyperbole again will add the menu
+back to the menubar.
+
+@cindex minibuffer menus
+This section discusses only the specialized @dfn{minibuffer menus} that
+appear in the minibuffer window and that work with all Emacs versions.
+Minibuffer menu items may be selected from either the keyboard or via
+mouse clicks.  When used with the keyboard, they provide rapid command
+access similar to key bindings.
+
+@kindex C-h h
+@vindex action-key-default-function
+@cindex menu, top level
+The top level menu is invoked from a key given in your @file{hsite.el}
+file (by default, @{@kbd{C-h h}@}) or via an Action Key press in a
+location with no other action defined.  The menu will appear in the
+minibuffer and should look mostly like so:
+
+@noindent
+@example
+Hy4>  Act Butfile/ Doc/ Ebut/ Gbut/ Hist Ibut/ Msg/ Otl/ Rolo/ Win/
+@end example
+
+@noindent
+The above menu items can be summarized as follows:
+
+@table @strong
+@cindex menu, Act
+@item Act
+Perform the action associated with any button at point or prompt for the
+name of an explicit button to activate if point is not on one.
+
+@cindex menu, ButFile
+@cindex button file, HYPB
+@vindex file, HYPB
+@item Butfile/
+Display a local or global file of buttons, providing easy access.
+@file{HYPB} for a local button file and @file{~/.hyperb/HYPB} for your
+global file.  These are good places to start your button creation testing.
+
+@cindex menu, EBut
+@item Ebut/
+All explicit button commands.
+
+@cindex menu, Doc
+@cindex menu, Types
+@item Doc/
+Hyperbole documentation quick access.  Contains Types/ submenu for
+documentation on Hyperbole implicit button and action types.
+
+@cindex menu, Global Buttons
+@item Gbut/
+All global button commands.  Global buttons are accessed by name
+rather than by direct selection.
+
+@cindex menu, History
+@cindex history
+@item Hist
+Jumps back to last position in button traversal history.
+
+@cindex menu, Implicit Buttons
+@item Ibut/
+All implicit button commands.
+
+@cindex menu, Message
+@item Msg/
+Hyperbole-specific mail and news messaging support commands.
+Use this to send mail to the Hyperbole discussion list or to
+add/modify your entry on a Hyperbole mail list.
+
+@cindex menu, Outliner
+@item Otl/
+Autonumbered, structured outliner and hyper-node manager commands.
+@xref{Outliner}.
+
+@cindex menu, Rolodex
+@item Rolo/
+Hierarchical, multi-file rolodex lookup and edit commands.
+@xref{Rolodex}.
+
+@cindex menu, Window Configurations
+@cindex menu, Windows
+@item Win/
+Window configuration management such as adding and restoring window
+configurations by name. @xref{Window Configurations}.
+
+@end table
+
+@cindex submenus
+@cindex menu help
+@cindex help, menu items
+All menu items are selected via the first character of their names
+(letter case does not matter) or via a press of the Action Key.  "/" at
+the end of an item name indicates that it brings up a sub-menu.  A press
+of the Assist Key on an item displays help for the item, including the
+action that it performs.
+
+@kindex C-t
+@kindex q
+@kindex C-g
+While a menu is active, to re-activate the top-level Hyperbole menu, you
+must use @{@kbd{C-t}@}.  This allows you to browse the submenus and then
+return to the top.  You can quit without selecting an item by using
+@{@kbd{q}@}.  @{@kbd{C-g}@} aborts whether you are at a menu prompt or
+any other Hyperbole prompt.
+
+
+
+@node Entering Arguments, Outliner, Menus, Top
+@chapter Entering Arguments
+
+@cindex argument entry
+@cindex direct selection
+@cindex double click
+Many Hyperbole commands prompt you for arguments.  The standard
+Hyperbole user interface has an extensive core of argument types that it
+recognizes.  Whenever Hyperbole is prompting you for an argument, it
+knows the type that it needs and provides some error checking to help
+you get it right.  More importantly, it allows you to press the Action
+Key within an entity that you want to use as an argument and it will grab the
+appropriate thing and show it to you at the input prompt within the
+minibuffer.  If you press the Action Key again at the same point (click
+with a mouse) on the same thing again, it accepts the entity as the
+argument and moves on.  Thus, a double click registers a desired
+argument.  Double-quoted strings, pathnames, mail messages, Info nodes,
+dired listings, buffers, numbers, completion items and so forth are all
+recognized at appropriate times.  All of the argument types mentioned in
+the documentation for the Emacs Lisp @code{(interactive)} function are
+recognized.  Experiment a little and you will quickly get used to this
+direct selection technique.
+
+@cindex completion
+Wherever possible, standard Emacs completion is offered, see
+@ref{Completion,,,emacs, the Gnu Emacs Manual}.  Remember to use @{@kbd{?}@}
+to see what your possibilities for an argument are.  Once you have a
+list of possible completions on screen, you can double click the Action
+Key on any one to enter it as the argument.
+
+
+@node Outliner, Rolodex, Entering Arguments, Top
+@chapter Outliner
+
+@cindex outliner
+@cindex autonumber
+@cindex relative autonumber
+@cindex permanent identifier
+@cindex idstamp
+@cindex hyperlink anchor
+The Hyperbole outliner, also known as the Koutliner (pronounced
+Kay-outliner), produces structured, autonumbered documents composed of
+hierarchies of cells.  Each @dfn{cell} has two identifiers, a
+@dfn{relative identifier} indicating its present position within the
+outline and a @dfn{permanent identifier} called an @dfn{idstamp},
+suitable for use within hyperlink references to the cell.  The idstamp
+is typically not displayed but is available when needed.
+@xref{Autonumbering}.
+
+Cells also store their time of creation and the user who created the
+cell.  User-defined attributes may also be added to cells.  @xref{Cell
+Attributes}.
+
+@cindex menu, Outline
+The outliner works only under GNU Emacs version 19 or higher, XEmacs
+version 19.9 or higher or under InfoDock.  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 manual will not be of interest to you.  (The same is
+true of the Hyperbole/Outline pulldown menu; if it appears, the outliner
+is available for use.)
+
+@vindex file, EXAMPLE.kotl
+@cindex menu, Outline/Example
+This chapter expands on the information given in @file{EXAMPLE.kotl}
+file included with Hyperbole.  Use @{@kbd{C-h h o e}@} to display that
+file.  It is an actual outline file that explains major outliner
+operations.  You can test out the viewing and motion commands with this
+file.  If you want to experiment with editing operations, use @{@kbd{C-x
+C-w}@} to write the outline to a temporary file such as,
+@file{/tmp/e.kotl}, and then use @{@kbd{C-x C-q}@} to make the outline
+editable.
+
+@xref{Outliner Keys}, for a full summary of the key bindings and
+commands available in the outliner.
+
+@menu
+* Menu Commands::
+* Creating Outlines::
+* Autonumbering::
+* Idstamps::
+* Editing::
+* Viewing::
+* Links::
+* Cell Attributes::
+* Outliner History::
+@end menu
+
+
+@node Menu Commands, Creating Outlines, Outliner, Outliner
+@section   Menu Commands
+
+The Otl/ menu entry on the Hyperbole top-level menu provides access to
+a number of major outliner commands:
+
+@example
+@group
+@cindex outliner commands
+@cindex Koutliner commands
+@findex kotl-mode:show-all
+@findex kvspec:toggle-blank-lines
+@findex kfile:find
+@findex kotl-mode:hide-sublevels
+@findex kotl-mode:hide-tree
+@findex kotl-mode:kill-tree
+@findex klink:create
+@findex kotl-mode:overview
+@findex kotl-mode:show-tree
+@findex kotl-mode:top-cells
+@findex kvspec:activate
+@cindex menu, Outline
+Menu Item    Command                    Description
+====================================================================
+All          kotl-mode:show-all         Expand all cells
+Blanks       kvspec:toggle-blank-lines  Toggle blank lines on or off
+Create       kfile:find                 Edit or create an outline
+Downto       kotl-mode:hide-sublevels   Hide cells deeper than a level
+Examp        <sample outliner file>     Show self-descriptive example
+Hide         kotl-mode:hide-tree        Hide tree with root at point
+Info         <outliner documentation>   Show outliner manual section
+Kill         kotl-mode:kill-tree        Kill the current tree
+Link         klink:create               Create a link to another cell
+Overvw       kotl-mode:overview         Show first line of each cell
+Show         kotl-mode:show-tree        Show tree with root at point
+Top          kotl-mode:top-cells        Collapse to top-level cells
+Vspec        kvspec:activate            Set a view specification
+====================================================================
+@end group
+@end example
+
+
+@node Creating Outlines, Autonumbering, Menu Commands, Outliner
+@section   Creating Outlines
+
+@cindex outline file suffix
+@cindex outline, creating
+@vindex file, .kotl suffix
+In addition to the Otl/Create menu item, you can create and experiment
+with outline files simply by finding a file, @{@kbd{C-x C-f}@} with a
+@file{.kotl} suffix.  @file{.kot} will also work for DOS or
+Windows-impaired users.
+
+@cindex root cell
+@cindex top-level cell
+@cindex cell, top-level
+@cindex cell, idstamp 0
+When a new koutline is created, an invisible root cell is created.  Its
+permanent and relative ids are both 0, and it is considered to be at
+level 0 in the outline.  All visible cells in the outline are at level 1
+or deeper, and thus are descendants of this root cell.  Some koutliner
+commands prompt for cell numbers as arguments.  An argument of 0 makes
+commands operate upon the entire outline.
+
+An initial level 1 cell is also created to make it easy to start
+entering text in the outline.  A koutline always has at least one
+visible cell in it.
+
+@xref{Autonumbering}, which explains how cells are labeled according to their
+respective levels in the outline and how these labels are updated as the
+structure of the outline changes.
+
+
+@node Autonumbering, Idstamps, Creating Outlines, Outliner
+@section   Autonumbering
+
+@cindex autonumber
+@cindex relative identifier
+@xref{Adding and Killing}, which explains how to add new cells to or remove
+cells from a koutline.  As you do this, or as you promote or demote
+cells within the outline, the labels preceding the contents of each cell
+automatically update to reflect the new structure.  These labels are
+also known as @dfn{autonumbers} and as @dfn{relative ids} because they
+change as the structure changes.
+
+@cindex outline structure
+The outline structure is shown by these labels and by the indentation of
+each outline level.  Normally, each deeper level is indented another
+three characters, to reflect the nesting.
+
+@cindex label type, alpha
+@cindex label type, legal
+@cindex alpha labels
+@cindex legal labels
+@cindex outline, label type
+The default autonumbers are called @dfn{alphanumeric labels} because
+they alternate between using numbers and letters to distinguish each
+successive level.  Each alphanumeric label uniquely identifies a cell's
+position in an outline, so that there is no need to scan back to prior
+cells to see what the current section number of an outline is.  This is
+similar to a legal numbering scheme but without all the period
+characters between level numbers.  As an example, 1b3 is equivalent to a
+legal label of 1.2.3.  Both refer to the 3rd cell at level 3,
+below the 2nd child of the first cell at level 1.  Said another way,
+this is the 3rd child of the 1st cell's 2nd child.  In other words, it
+is easier to visualize hierarchies than to talk about them.
+
+Alphanumeric labels are the default because they are shorter and easier
+to read aloud than equivalent legal ones.  They also simplify
+distinguishing between even and odd level labels because of the
+alternating character set.
+
+@kindex C-c C-l
+@cindex label type, changing
+You can change the labeling scheme used in a particular outline with the
+command @{@kbd{C-c C-l}@}.  A @{@kbd{?}@} then will show all of your
+options.  Legal labels, partial alpha labels (single level autonumbering
+where only the last part of the level number is shown, as commonly seen
+in other outliner products), idstamps (permanent cell ids), and star
+outline level labels (Emacs asterisk-based outline labeling) are all
+available.  Or you may choose to turn autonumbering off.  Cells are
+still indented to reflect the outline structure whether or not labels
+are displayed.
+
+@cindex label separator, changing
+@cindex cell, label separator
+@cindex outline, label separator
+@kindex C-c M-l
+@kindex C-u C-c M-l
+A cell label is normally followed by two spaces, called the @dfn{label
+separator}, prior to the start of the cell contents.  You can change the
+separator with for the current outline with @{@kbd{C-c M-l}@}.
+@{@kbd{C-u C-c M-l}@} will additionally change the default separator
+value used when new outlines are created (for the current session only).
+For example, use the value ". " to get a trailing period after each cell
+label.  The separator must be at least two characters long but may be
+longer.
+
+@vindex file, ~/.emacs
+@cindex initialization file
+If you find a separator that you prefer for all outlines, change the
+separator setting permanently by adding the following line to your Emacs
+initialization file, @file{~/.emacs}, substituting for `your-separator':
+
+@cindex label separator, default
+@vindex kview:default-label-separator
+@lisp
+(setq kview:default-label-separator "your-separator")
+@end lisp
+
+
+@node Idstamps, Editing, Autonumbering, Outliner
+@section   Idstamps
+
+@cindex permanent identifier
+@cindex idstamp
+Idstamps (permanent ids) are associated with each cell and can be
+used in hyperlinks that are maintained as cells are reordered in a file.
+@xref{Links}.  Idstamps may also be displayed in place of the outline
+level relative ids.  Use @{@kbd{C-c C-l id RET}@}.
+
+@cindex idstamp counter
+An idstamp counter for each outline starts at 0 and is incremented by
+one each time a cell is added to the outline.  This idstamp stays with
+the cell no matter where it is moved within the outline.  If the cell is
+deleted, its idstamp is not reused.
+
+@cindex root cell
+@cindex top-level cell
+@cindex cell, top-level
+@cindex cell, idstamp 0
+@cindex idstamp 0
+The 0 idstamp is always assigned to the root node of the entire outline.
+This node is never visible within the outline, but is used so that the
+outline may be treated as a single tree when needed.  Idstamps always
+begin with a 0, as in 012, to distinguish them from relative ids.
+
+
+@node Editing, Viewing, Idstamps, Outliner
+@section   Editing
+
+You edit text and move around in the Koutliner just as you would in any
+other Emacs buffer, except when you want to deal with the structural
+components of an outline.  Within the contents of a cell, all of your
+standard editing keys should work properly.  You can just type in text
+and the left and right margins of the lines will be maintained for you.
+@xref{Filling}, for the times when you need to refill a paragraph or to
+control when filling occurs.@refill
+
+Don't invoke editing commands with @{@kbd{M-x command-name @key{RET}}@}
+since the Koutliner uses special differently named commands made to act
+like the regular editing commands but which account for the structure
+and indentation in koutlines.
+
+@cindex cell, selection
+You can use the mouse to select parts of the contents of a single cell
+for editing.  But don't drag across cell boundaries and then edit the
+selected region, since that can destroy the outline structure.
+
+@menu
+* Adding and Killing::
+* Moving Around::
+* Relocating and Copying::
+* Filling::
+* Transposing::
+* Splitting and Appending::
+* Inserting and Importing::
+@end menu
+
+@node Adding and Killing, Relocating and Copying, Editing, Editing
+@subsection  Adding and Killing
+
+@kindex C-j
+@kindex C-u c-j
+@kindex C-c a
+@kindex C-c p
+@cindex cell, adding
+@cindex cell, creating
+@{@kbd{C-j}@} adds a new cell as a successor sibling of the
+current cell, that is, the next cell at the same level as the current
+cell.  If you enter a positive number as a prefix argument, that number
+of cells will be inserted, all at the same level.  @{@kbd{C-u C-j}@} is
+handled specially.  It adds a single cell as a child of the current cell.
+@{@kbd{C-c a}@} does the same thing.  @{@kbd{C-c p}@} adds the cell as
+the successor of the current cell's parent.
+
+@kindex C-c C-k
+@kindex C-c k
+@kindex C-u C-c k
+@kindex C-y
+@cindex cell, killing
+@cindex cell, yanking contents
+@cindex tree, killing
+@{@kbd{C-c C-k}@} kills the current cell and its entire subtree.
+@{@kbd{C-c k}@} kills the contents of a cell from point through the end
+of the cell; it does not remove the cell itself.  @{@kbd{C-u C-c k}@}
+kills the entire contents of the cell regardless of the location of
+point.  You may then yank the contents into another cell or another
+buffer with @{@kbd{C-y}@}.
+
+
+@node Relocating and Copying, Moving Around, Adding and Killing, Editing
+@subsection  Relocating and Copying
+
+@cindex promotion
+@cindex demotion
+@cindex tree, promoting
+@cindex tree, demoting
+@dfn{Demotion} is the act of moving a tree down one or more levels in the
+outline.  The new tree will become either the successor or the first
+child of the cell which precedes it in the outline.  @dfn{Promotion} is
+the inverse operation.  Note that trees (cells and their entire
+substructure) are promoted and demoted, not individual cells.
+
+@kindex @key{TAB}
+@kindex M-@key{TAB}
+Trees may be demoted or promoted by pressing @{@key{TAB}@} or
+@{@kbd{M-@key{TAB}}@} respectively, as in most outliners today.
+@{@kbd{M-0 @key{TAB}}@} and @{@kbd{M-0 M-@key{TAB}}@} demote and
+promote trees and additionally refill each cell that is not specially
+marked to prevent refilling.  @xref{Filling}.  A positive or negative
+prefix argument to these commands promotes or demotes the tree up to a
+maximum of the number of levels given by the argument.  The outline may
+not support movement of the tree by the number of levels requested.
+
+@cindex tree, copying
+@cindex tree, moving
+@cindex Action Key, cell argument
+@kindex Action Key, cell argument
+For maximum flexibility in rearranging outlines, there are commands that
+move or copy entire trees.  Each of these commands prompts for the label
+of the root cell to move or copy and for second cell at the new location
+for the moved or copied tree.  You can either accept the default
+provided, type in the cell label or when a mouse is available, simple
+double click with the Action Key on the contents of a cell.  The
+Koutliner knows to use the cell's label in such cases.
+
+In these following commands, words delimited with <> represent the
+arguments for which each command prompts.  Note how the use of prefix
+arguments changes each command's behavior from insertion at the sibling
+level to insertion at the child level.
+
+@table @kbd
+@kindex C-c c
+@item C-c c
+Copy <tree> to be the successor of <cell>.
+@kindex C-u C-c c
+@itemx C-u C-c c
+Copy <tree> to follow as the first child of <cell>.
+
+@kindex C-c C-c
+@item C-c C-c
+Copy <tree> to be the predecessor of <cell>.
+@kindex C-u C-c C-c
+@itemx C-u C-c C-c
+Copy <tree> to be the first child of the parent of <cell>.
+
+@kindex C-c m
+@item C-c m
+Move <tree> to be the successor of <cell>.
+@kindex C-u C-c m
+@itemx C-u C-c m
+Move <tree> to follow as the first child of <cell>.
+
+@kindex C-c C-m
+@item C-c C-m
+Move <tree> to precede <cell>.
+@kindex C-u C-c C-m
+@itemx C-u C-c C-m
+Move <tree> to be the first child of the parent of <cell>.
+@end table
+
+@cindex mouse, moving trees
+If you have mouse support under Hyperbole, you can move entire trees
+with mouse clicks.  Simply click the Assist Key within the indentation
+to the left of a cell and you will be prompted for a tree to move.
+Double click the Action Key within the contents the root cell of the tree
+to move and then double click within the contents of the root cell of the
+tree you want it to follow as a sucessor.
+
+Copying and moving only work within a single outline right now, so don't
+try to use them to move trees across different outline files.  You can,
+however, copy an outline tree to a non-outline buffer with:
+
+@cindex tree, exporting
+@cindex outline, exporting
+@cindex tree, mailing
+@cindex outline, mailing
+@cindex exporting an outline
+@cindex mailing an outline
+@table @kbd
+@kindex C-c M-c
+@item C-c M-c
+Copy  <tree> to a non-koutline buffer.
+@kindex C-c @@
+@itemx C-c @@
+Copy a <tree> to an outgoing mail message.
+@end table
+
+@node Moving Around, Filling, Relocating and Copying, Editing
+@subsection  Moving Around
+
+@cindex outline, motion
+In addition to normal Emacs movement commands, you can move within a
+cell or from one cell or tree to another.
+
+@table @kbd
+@kindex C-c ,
+@item C-c ,
+Move to the beginning of the current cell.
+@kindex C-c .
+@itemx C-c .
+Move to the end of the current cell.
+
+@kindex C-c C-n
+@item C-c C-n
+Move to the next visible cell, regardless of level.
+@kindex C-c C-p
+@itemx C-c C-p
+Move to the previous visible cell, regardless of level.
+
+@kindex C-c C-f
+@item C-c C-f
+Move forward to this cell's successor, if any.
+@kindex C-c C-b
+@itemx C-c C-b
+Move backward to this cell's predecessor, if any.
+
+@kindex C-c C-d
+@item C-c C-d
+Move to the first child of the current cell, if any.
+@kindex C-c C-u
+@itemx C-c C-u
+Move to the parent cell of the current cell, if any.
+
+@kindex C-c <
+@item C-c <
+Move to the first sibling at the current level within this tree.
+@kindex C-c >
+@itemx C-c >
+Move to the last sibling at the current level within this tree.
+
+@kindex C-c ^
+@item C-c ^
+Move to the level 1 root cell of the current tree.
+@kindex C-c $
+@itemx C-c $
+Move to the last cell in the tree rooted at point, regardless of level.
+@end table
+
+
+@node Filling, Transposing, Moving Around, Editing
+@subsection  Filling
+
+@cindex outline, filling
+Filling is the process of extending lines that are shorter than the
+right margin and reducing lines which extend past the margin by moving
+words among the lines.  Commands are provided to fill a paragraph within
+a cell or a whole cell, which may have multiple paragraphs.
+
+@cindex filling
+@cindex cell, filling
+@cindex paragraph, filling
+@cindex tree, filling
+@cindex margin
+@kindex M-q
+@kindex M-j
+@kindex C-c M-q
+@kindex C-c M-j
+@kindex C-M-q
+@kindex C-M-j
+@{@kbd{M-q}@} or @{@kbd{M-j}@} refills a paragraph within a
+cell so that its lines wrap within the current margin settings.
+@{@kbd{C-c M-q}@} or @{@kbd{C-c M-j}@} refills all paragraphs within a
+cell.  @{@kbd{C-M-q}@} or @{@kbd{C-M-j}@} refills all cells within a
+tree.  See your Emacs or InfoDock manual for information on how to set
+the left and right margins.
+
+@vindex kotl-mode:refill-flag
+@cindex refilling
+@cindex attribute, no-fill
+@cindex cell, no-fill attribute
+Set the variable, @var{kotl-mode:refill-flag}, to t if you want
+moving, promoting, demoting, exchanging, splitting and appending cells
+to also automatically refill each cell.  Generally, this is not
+recommended since if you happen to move a cell that you have carefully
+formatted and forgot to give it a `no-fill' property, your formatting
+will be lost.
+
+
+@node Transposing, Splitting and Appending, Filling, Editing
+@subsection  Transposing
+
+The Koutliner move and copy commands rearrange entire trees.  The
+following two commands, in contrast, exchange the locations of two
+individual cells.
+
+@kindex C-c e
+@cindex cell, transposing
+@cindex cell, exchanging
+@cindex exchanging cells
+@cindex transposing cells
+@{@kbd{C-c e}@} prompts for two cell addresses and exchanges the cell
+locations.
+
+@kindex C-c t
+@{@kbd{C-c t}@} does not prompt.  It exchanges the current
+and immediatly prior cell, regardless of their levels.  If there is no
+prior cell it exchanges the current and next cell.
+
+@cindex cell, mark and point
+@kindex M-0 C-c t
+@{@kbd{M-0 C-c t}@} exchanges the cells in which point and mark fall.
+@{@kbd{C-c t}@} with a non-zero numeric prefix argument, N, moves
+the current tree past maximally the next N visible cells.  If there are
+fewer visible, it makes the current cell the last cell in the outline.
+
+
+@node Splitting and Appending, Inserting and Importing, Transposing, Editing
+@subsection  Splitting and Appending
+
+@cindex splitting a cell
+@cindex cell, splitting
+@kindex C-c s
+@kindex C-u C-c s
+You can split one cell into two adjacent sibling cells with @{@kbd{C-c
+s}@}.  This leaves the cell contents preceding point in the current
+cell, minus any trailing whitespace, and moves the contents following
+point to a new sibling cell which is inserted into the outline.
+@{@kbd{C-u C-c s}@} instead adds the new cell as the first child of the
+original cell, rather than as its successor.
+
+All cell attributes in the original cell are propagated to the new one,
+aside from the creation attributes and idstamp.
+
+@kindex C-c +
+@cindex cell, appending
+@cindex appending to a cell
+@cindex attribute, no-fill
+@cindex cell, no-fill attribute
+@{@kbd{C-c +}@} appends the contents of a specified cell to the end of
+another cell.  It has no effect on cell attributes, except that if one
+cell has a `no-fill' attribute that prevents all but user requested
+filling of a cell, then the cell appended to inherits this property.
+This helps maintain any special formatting the appended text may have.
+
+
+@node Inserting and Importing,  , Splitting and Appending, Editing
+@subsection  Inserting and Importing
+
+@cindex outline, inserting into
+@cindex outline, importing into
+@cindex importation
+@cindex insertion
+@kindex C-x i
+@cindex outline, foreign file
+The elements of another buffer or file may be inserted into a koutline
+as a set of cells by using the @{@kbd{C-x i}@} command.  When prompted,
+you may use a buffer name or file name from which to insert, though
+completion is provided only for file names.
+
+@kindex C-u C-x i
+The elements from the original buffer are converted into kcells and
+inserted as the successors of the current cell.  If @{@kbd{C-u C-x i}@}
+is used, they are instead inserted as the inital children of the current
+cell.
+
+@vindex kimport:mode-alist
+@vindex kimport:suffix-alist
+@cindex outline, conversion
+@findex kotl-mode
+@cindex outline mode
+@cindex koutline mode
+@cindex file, importing
+@cindex importing a file
+See the documentation for the variables, kimport:mode-alist and
+kimport:suffix-alist, for information on mode and suffix-specific
+conversions performed on file elements before they are inserted.  This
+same conversion process applies if you invoke @{@kbd{M-x kotl-mode
+RET}@} in a non-koutline buffer or if you perform a generic file import
+as described later in this section.
+
+@findex kotl-mode:insert-file-contents
+Use @{@kbd{M-x kotl-mode:insert-file-contents RET}@} to insert the
+entire contents of a file into the current cell at the location of
+point.
+
+@findex kimport:file
+The outliner presently supports conversion of three types of files into
+koutline files.  You can choose to import a file into an existing
+koutline, following the tree at point, or to create a new koutline of
+the imported file contents.  @{@kbd{M-x kimport:file RET}@} will select
+the importation type based on the buffer or file name suffix of the file
+to import.
+
+@findex kotl-mode
+If you want to convert a buffer from some other mode into a koutline and
+then want to save the converted buffer back to its original file,
+thereby replacing the original format, then use @{@kbd{M-x kotl-mode
+RET}@} to convert the buffer into a koutline.  Remember that you will
+lose the old format of the buffer when you do this.
+
+Use one of the following commands if you really need explicit control over the
+type of importation used on some text.  With these commands, your
+original file remains intact.
+
+@findex kimport:text
+@cindex text file
+Use @{@kbd{M-x kimport:text RET}@} and you will be prompted for a text
+buffer or file to import and the new koutline buffer or file to create
+from its text.  It will also import the contents, attributes and level
+structure of cells from a koutline.
+
+@findex kimport:star-outline
+@cindex emacs outline
+@cindex star outline
+Star outlines are standard Emacs outlines where each entry begins with
+one or more asterisk characters.  Use @{@kbd{M-x kimport:star-outline
+RET}@} and you will be prompted for the star outline buffer or file to
+import and the new koutline buffer or file to create.
+
+@cindex Augment outline
+@findex kimport:aug-post-outline
+(Skip this if you are unfamiliar with the Augment system.)  Files
+exported from the Augment system as text often have alphanumeric
+statement identifiers on the right side.  You can import such files
+while maintaining there outline structure.  Use @{@kbd{M-x
+kimport:aug-post-outline RET}@} and you will be prompted for the Augment
+buffer or file to import and the koutline to create.
+
+
+@node Viewing, Links, Editing, Outliner
+@section   Viewing
+
+@cindex outline, viewing
+@cindex view
+The Koutliner has very flexible viewing facilities to allow you to
+effectively browse and study large amounts of material.
+
+@menu
+* Hiding and Showing::
+* View Specs::
+@end menu
+
+@node Hiding and Showing, View Specs, Viewing, Viewing
+@subsection  Hiding and Showing
+
+@cindex outline, hiding
+@cindex outline, showing
+@cindex collapsing
+@cindex expanding
+@cindex hiding
+@cindex showing
+Individual cells, branches, or particular levels in the outline may be
+hidden or shown.  These commands work even when an outline buffer is
+read-only, e.g. when its file is not checked out of a version control
+system yet, so that you can get effective views of an outline without
+editing it.  Some of these commands affect the current view spec,
+@ref{View Specs}.
+
+@table @kbd
+@cindex hide tree
+@cindex tree, show
+@kindex C-c C-h
+@item C-c C-h
+Hide (collapse) the tree rooted at point.
+@cindex show tree
+@cindex tree, show
+@kindex C-c C-s
+@itemx C-c C-s
+Show (expand) the tree rooted at point.
+
+@cindex outline, all cells
+@cindex cell, show all
+@kindex C-c C-a
+@item C-c C-a
+Show (expand) all of the cells in the outline.
+@cindex level
+@cindex cell, show levels
+@cindex outline, show levels
+@kindex C-x $
+@itemx C-x $
+Show all of the cells down to a particular <level>.  You are prompted
+for the level or a prefix argument may be given.
+
+@cindex subtree, hide
+@cindex tree, hide subtree
+@cindex cell, hide subtree
+@cindex hide subtree
+@kindex C-M-h
+@item C-M-h
+Hide the subtree at point, excluding the root cell.
+@cindex subtree, show
+@cindex tree, show subtree
+@cindex cell, show subtree
+@cindex show subtree
+@itemx M-x kotl-mode:show-subtree
+Show the subtree at point.  Use @{@kbd{C-c C-s}@} to achieve a similar
+effect.  The only difference is that it will expand the root cell too.
+
+@cindex overview
+@cindex outline, overview
+@kindex C-c C-o
+@item C-c C-o
+Show an overview of the outline by showing only the first line of
+every cell.  This also turns off blank lines between cells to maximize
+your view of the outline.
+@cindex top-level view
+@cindex outline, top-level
+@kindex C-c C-t
+@itemx C-c C-t
+Show a top-level view of the outline by showing only the first line of
+each level one cell.  This does not turn off blank lines.
+@end table
+
+@kindex Action Key, hide or show cell
+@cindex Action Key, hide or show cell
+@cindex cell, collapse
+@cindex cell, expand
+@kindex M-@key{RET}
+A click or a press of the Action Key within a cell's body, but not on a 
+Hyperbole button, toggles between hiding and showing the tree rooted at
+point.  Try it with either your mouse or with @{@kbd{M-@key{RET}}@}.
+
+
+@node View Specs,  , Hiding and Showing, Viewing
+@subsection  View Specs
+
+@cindex view spec
+@cindex modeline, view spec
+@vindex kvspec:string
+@cindex pipe character
+@cindex |
+@cindex <|viewspec>
+@dfn{View specifications} (view specs, for short) are short codes used
+to control the view of a koutline.  The view specs in effect for an
+outline are always displayed in the modeline of the outline's window,
+following the outline buffer name, unless the variable,
+@var{kvspec:string}, has been set to @code{nil} to disable view spec
+modeline display.  The modeline display appears as <|viewspec> so that
+you can easily pick them out.  The | (pipe character) is also used in
+links that specify view specs to indicate the start of a view spec
+sequence.  @xref{Links}.
+
+@cindex outline, view specs
+The current view spec is saved whenever the outline is saved.  The next
+time the outline is read in, this will be the initial view.
+
+The rest of this section documents the the view spec characters that are
+presently supported and explains how to invoke a view spec.  There is no
+user-level way to add your own view spec characters, so all character
+codes are reserved for future use.
+
+@kindex C-c C-v
+@cindex view spec, setting
+@cindex view spec, changing
+@cindex changing the view spec
+@cindex setting the view spec
+@{@kbd{C-c C-v}@} prompts for a new view spec setting in which the following
+codes are valid.  Any invalid characters in a view spec are ignored.
+Characters are evaluated in an order meant to do the right thing, even
+when you use conflicting view spec characters.  The standard initial
+view spec is <|ben>.
+
+@cindex view spec, characters
+@table @kbd
+@cindex view spec, all lines and levels
+@item a
+Show all cell levels and all lines in cells.
+
+@kindex C-c b
+@cindex blank lines, toggle
+@cindex view spec, blank lines
+@kindex C-c b
+@cindex toggling blank lines
+@item b
+Turn on blank lines between cells.  Without this character, blank lines
+will be turned off.  You can also use the @{@kbd{C-c b}@} key binding to
+toggle line numbers on and off independent of any other view settings.
+
+@cindex view spec, lines per cell
+@cindex hide lines
+@cindex collapse lines
+@cindex cutoff lines
+@item cN
+Hide any lines greater than N in each cell.  0 means don't cutoff any
+lines.
+
+@cindex ellipses
+@cindex view spec, ellipses
+@item e
+Show ellipses when some content of a cell or its subtree is hidden.
+
+@cindex level
+@cindex cell, hiding levels
+@cindex hide levels
+@cindex view spec, show levels
+@item lN
+Hide cells at levels deeper than N.  0 means don't hide any cells.
+
+@cindex label type
+@cindex view spec, label type
+@vindex kview:default-label-type
+@cindex default label type
+@item n
+Turn on the default label type, as given by the variable,
+@var{kview:default-label-type}.  Normally, this is alphanumeric labels.
+@cindex label type, idstamps
+@itemx n0
+Display idstamps.
+@cindex label type, alpha
+@itemx n1
+Display alpha labels.
+@cindex label type, partial alpha
+@itemx n2
+Display partial alpha labels (don't use this, as full alpha labels are
+better).
+@cindex label type, legal
+@itemx n.
+Display legal labels.
+@cindex label type, star
+@cindex label type, asterisk
+@itemx n*
+Display star labels.  A level three cell would have three asterisks as a
+label, for example.
+@cindex label type, no labels
+@itemx n~
+Turn off labels.  (n viewspec is removed from modeline).
+@end table
+
+@cindex view spec, example
+As a test, use @{@kbd{C-h h o e}@} to display the example koutline.
+Then use @{@kbd{C-c C-v}@} to set a view spec of `c2l1'.  This will turn
+off blank lines, clip each cell after its second line, and hide all
+cells below level one.
+
+
+@node Links, Cell Attributes, Viewing, Outliner
+@section   Links
+
+@cindex link
+@cindex hyperlink
+@cindex klink
+@cindex <> delimiters
+Hyperlinks may be embedded in cells and may refer to other cells or
+external sources of information.  Explicit Hyperbole buttons may be
+created as usual via mouse drags, @ref{By Dragging, Creation Via Action
+Key Drags}.  A @dfn{klink} is a special implicit link button, delimited
+by <> separators, that jumps to a specific outline cell.  This section
+discusses klinks.
+
+@kindex Action Key, klink
+@cindex Action Key, klink
+@cindex klink, activating
+@cindex klink referent
+Press the Action Key over a klink to follow it.  This will flash the
+klink as a button and then will display its referent in the other
+window.  If the klink contains a view spec, that will be used when the
+referent is displayed.
+
+@cindex klink, inserting
+@kindex C-c l
+There are a number of easy ways to insert klinks into koutlines.  If you
+have mouse support under Hyperbole, simply click the Action Key within
+the indentation to the left of a cell text.  If you then double click on
+some cell, a link to that cell will be inserted where you started.  From
+a keyboard, use @{@kbd{C-c l}@} when in a koutline or @{@kbd{C-h h o
+l}@} when not in a koutline to insert a klink.  Since klinks are
+implicit buttons, you can type in the text of the klink just as you see
+it in the examples below and it will work exactly as if it had been
+entered with the insert link command.
+
+@cindex klink, formats
+@noindent
+There are basically three forms of klinks:
+
+@table @bullet
+@cindex internal klink
+@cindex klink, internal
+@cindex <@@ klink>
+@item internal
+<@@ 2b=06> is an internal klink, since it refers to the koutline in which
+it is embedded.  When activated, it jumps to the cell within the current
+outline which has permanent id `06' and relative id `2b'.  <@@ 06> does
+the same thing, as does <@@ 2b>, though this latter form will not
+maintain the link properly if the cell is moved elsewhere within the
+outline.  The form, <@@ 2b=06 |ben> additionally sets the view spec of
+the current outline back to the default value, with a blank line between
+each cell and all levels and lines of cells displayed.
+
+@cindex external klink
+@cindex klink, external
+@item external
+The second klink format is an external link to another koutline, such
+as, <EXAMPLE.kotl, 3=012 |c1e>, which displays the named file, starting
+at the cell 3 (whose permanent identifer is 012), with the view
+specification of: blank lines turned off, cutoff after one line per
+cell, and show ellipses for cells or trees which are clipped.
+
+@cindex klink, view spec
+@cindex view spec klink
+@item view spec
+The third format simply allows you to set a view spec for the current
+koutline.  For example, <|ben>, when activated, sets the view in the
+current outline to display blank lines, ellipses following collapsed
+lines and standard alphanumeric numbering.
+@end table
+
+
+@node Cell Attributes, Outliner History, Links, Outliner
+@section   Cell Attributes
+
+@cindex cell, attribute
+@cindex attribute
+@dfn{Attributes} are named variables whose values are specific to a
+particular outline cell.  Thus, each cell has its own attribute list.
+Every cell has three standard attributes:
+
+@table @bullet
+@cindex idstamp attribute
+@item idstamp
+The permanent id of the cell, typically used in cross-file hyperlinks
+that reference the cell.
+
+@cindex creator attribute
+@cindex e-mail address
+@cindex mail address
+@item creator
+The e-mail address of the person who created this cell.
+
+@cindex create-time attribute
+@cindex cell, creation time
+@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 "Jan 28 18:27:59 CST 1994".
+@end table
+
+@kindex C-c C-i
+@cindex attribute, adding
+@cindex attribute, modifying
+@cindex attribute, removing
+@{@kbd{C-c C-i}@} is the command to add an attribute to or to modify an
+existing attribute in the cell at point.  Think of it as inserting an
+attribute value.  To remove an attribute from cell, set its value to
+@code{nil}.
+
+
+@cindex attribute, no-fill
+@cindex cell, no-fill attribute
+@cindex no-fill attribute
+@vindex kotl-mode:refill-flag
+The `no-fill' attribute is special.  When added with a non-nil value, it
+prevents moving, promoting, demoting, exchanging, splitting and
+appending cells from refilling the cell, even if the variable,
+@var{kotl-mode:refill-flag}, is set to t.  It does not prevent you from
+invoking explicit commands that refill the cell.  @xref{Filling}.
+
+@kindex Assist Key, listing attributes
+@cindex Assist Key, listing attributes
+@cindex listing attributes
+@cindex outline, attribute list
+The attribute lists for the cells in the tree rooted at point can be
+displayed by pressing the Assist Key within the contents of a cell.
+
+@kindex C-c h
+@kindex C-u C-c h
+@{@kbd{C-c h}@} prompts for a cell label and displays the cell's
+attributes.  @{@kbd{C-u C-c h}@} prompts for a cell label and displays
+the attributes for it and its subtree; use 0 as the kcell id to see
+attributes for all visible cells in the outline.
+
+
+@node Outliner History,  , Cell Attributes, Outliner
+@section   Outliner History
+
+@cindex NLS
+@cindex Augment
+@cindex Engelbart
+Much of the Hyperbole outliner design is based upon concepts pioneered
+in the NLS/Augment system, @cite{[Eng84a]}.  Augment treated documents as
+a hierarchical set of nodes, called statements, rather than cells.
+Every Augment document utilized this intrinsic structure.
+
+@cindex distributed collaboration
+@cindex collaboration
+The system could rapidly change the view of a document by collapsing,
+expanding, generating, clipping, filtering, including or reordering
+these nodes.  It could also map individual views to multiple workstation
+displays across a network to aid in distributed, collaborative work.
+
+@cindex knowledge transfer
+@cindex idea structuring
+@cindex cross referencing
+These facilities aided greatly in idea structuring, cross-referencing,
+and knowledge transfer.  The Koutliner is a start at bringing
+these capabilities back into the mainstream of modern computing culture.
+
+
+@node Rolodex, Window Configurations, Outliner, Top
+@chapter Rolodex
+
+@cindex rolodex
+@cindex wrolo
+Hyperbole includes a complete, advanced rolodex system, Wrolo, for
+convenient management of hierarchical, record-oriented information.
+
+@cindex rolo, buttons in
+Hyperbole buttons may be included within rolodex records and then
+manually activated whenever their records are retrieved.
+
+@vindex file, wrolo.el
+See the description at the top of the @file{wrolo.el} file for
+details on programmatic interfacing to the rolodex.  The following
+subsections explain use and basic customization of the rolodex.
+
+@menu
+* Rolo Concepts::
+* Rolo Menu::
+* Rolo Keys::
+* Rolo Settings::
+@end menu
+
+@node Rolo Concepts, Rolo Menu, Rolodex, Rolodex
+@section   Rolo Concepts
+
+@cindex rolodex file
+@cindex rolodex entry
+The rolodex manages and searches rolodex files.  A @dfn{rolodex file}
+consists of an optional header which starts and ends with a line of
+equal signs (at least three equal signs starting at the beginning of a
+line), followed by any non-negative number of rolodex records.  You must
+manually add a header to any rolodex file if you want it to have one.
+
+@noindent
+Here is an example of a simple rolodex file.
+
+@example
+@group
+==================================================================
+                        PERSONAL ROLODEX
+<Last-Name>, <First>  <Email>        W<Work#>       F<Fax#>
+==================================================================
+*   Smith, John       <js@@hiho.com> W708-555-2001  F708-321-1492
+        Chief Ether Maintainer, HiHo Industries
+        10/24/95
+@end group
+@end example
+
+We call rolodex records, @dfn{entries}.  Entries begin with a delimiter,
+some number of `*' characters at the beginning of a line.  Entries may
+be arranged in a hierarchy, where child entries begin with one more `*'
+characters than do their parents.  Top level entries begin with a single
+`*'.
+
+Beyond this initial delimiter, entries are completely free-form text.
+It is best to use a "lastname, firstname" format, however, when adding
+contact entries into a rolodex.  Then the rolodex system will
+automatically keep your entries alphabetized as you enter them.  You'll
+also be able to sort them whenever you desire.
+
+Any search done on the rolodex scans the full text of each entry.
+During a search, the rolodex file header separator lines and anything in
+between are appended to the buffer of matched entries before any entries
+are retrieved from the file.  Whenever an entry is matched, it and all
+of its descendant entries are retrieved.  If your Emacs version supports
+textual highlighting, each search match is highlighted for quick, visual
+location.
+
+@noindent
+For example, a search on "Company" could retrieve the following:
+
+@example
+@group
+==================================================================
+                        COMPANY ROLODEX
+==================================================================
+*    Company
+**     Manager
+***      Underlings
+@end group
+@end example
+
+@noindent
+Thus, searching for Company retrieves all listed employees.
+Searching for Manager turns up all Underlings.
+
+
+@node Rolo Menu, Rolo Keys, Rolo Concepts, Rolodex
+@section   Rolo Menu
+
+@cindex rolodex menu
+The Rolo/ menu entry on the Hyperbole top-level menu provides the
+user interface to the rolodex.  The rolo menu provides access to the
+following commands:
+
+@example
+@group
+@cindex rolodex commands
+@cindex Wrolo commands
+@findex rolo-add
+@findex rolo-display-matches
+@findex rolo-edit
+@findex rolo-kill
+@findex rolo-mail-to
+@findex rolo-sort
+@findex rolo-grep
+@findex rolo-fgrep
+@findex rolo-word
+@findex rolo-yank
+Menu Item       Command               Description
+====================================================================
+Add             rolo-add              Adds a rolodex entry
+Display         rolo-display-matches  Displays last matches again
+Edit            rolo-edit             Edits an existing rolodex entry
+Info                                  Displays Rolodex manual entry
+Kill            rolo-kill             Removes an entry from the rolodex
+Mail            rolo-mail             Mail to address following point
+Order           rolo-sort             Sorts all levels in rolodex
+RegexFind       rolo-grep             Finds all entries containing
+                                        a regular expression
+StringFind      rolo-fgrep            Finds all entries containing
+                                        a string
+WordFind        rolo-word             Finds all entries containing
+                                        a string of whole words
+Yank            rolo-yank             Inserts first matching rolodex
+                                        entry at point
+====================================================================
+@end group
+@end example
+
+A prefix argument used with either of the find commands listed above
+limits the search to a maximum number of matches given by the argument.
+The search is terminated whenever that number of matches is found.
+
+For any of the above commands that prompt for a name, you may use the
+form parent/child to locate a child entry below a parent entry.  So for
+a rolodex which looked like so:
+
+@example
+@group
+*    Company
+**     Manager
+***      Underlings
+@end group
+@end example
+
+@noindent
+You could edit the Underlings entry by identifying it as
+Company/Manager/Underlings.  Do not use this hierarchical notation in
+search expressions since the whole rolodex will be searched anyway.
+Thus, "Underlings" as a search pattern will find an entry containing
+"Underlings" at any level in a hierarchy, like so:
+
+@example
+***      Underlings
+@end example
+
+@node Rolo Keys, Rolo Settings, Rolo Menu, Rolodex
+@section   Rolo Keys
+
+@kindex e
+@cindex rolodex, editing an entry
+Use the @{@kbd{e}@} key to edit the entry at point within the rolodex
+source file.
+
+@cindex wrolo menu
+@cindex rolodex keys
+After a rolodex search is performed, point is left in the @dfn{rolodex
+match buffer}, @file{*Rolodex*}, which uses @code{wrolo-mode} to
+simplify browsing many rolodex matches.  Press @{@kbd{?}@} when in the
+match buffer for a summary of available keys.
+
+@kindex TAB
+@kindex M-TAB
+@kindex r
+@cindex rolodex, highlighting matches
+@cindex rolodex, finding matches
+@cindex rolodex, moving through matches
+If your Emacs version supports textual highlighting, each search match
+is highlighted for quick, visual location.  @{@key{TAB}@} moves point
+forward to successive spans of text which match the search expression.
+@{@kbd{M-@key{TAB}}@} or @{@kbd{r}@} moves point backward to earlier
+matches.  These keys allow you to quickly find the matching entry of
+most interest to you if your search expression failed to narrow the
+matches sufficiently.
+
+@kindex M-s
+@kindex C-r
+@cindex rolodex, extending a match
+@cindex rolodex, interactive searching
+If you want to extend the match expression with some more characters to
+find a particular entry, use @{@kbd{M-s}@}, which performs an
+interactive search forward for the match expression.  You can add or
+delete characters to this expression to find different occurences.
+@{@kbd{C-r}@} will reverse the direction of the search.
+
+@kindex a
+@kindex h
+@kindex s
+@kindex t
+@cindex rolodex, outlining
+Single key outlining commands are also available for browsing matches.
+If your search matches a large number of entries, use
+@{@kbd{t}@} to get a top-level overview of all the entries.  Each entry
+is collapsed so that only its first line shows.  Press @{@kbd{s}@} to
+show (expand) the entry at point.  Use @{@kbd{h}@} to hide (collapse)
+the entry again.  Press @{@kbd{a}@} to expand all entries in the buffer.
+
+Many other keys are defined to help you move through matching entries.
+
+@cindex rolodex, moving to entries
+@table @kbd
+@kindex b
+@item b
+Move to the previous entry at the same level as the current entry.
+@kindex f
+@item f
+Move to the next entry at the same level as the current entry.
+@kindex n
+@item n
+Move to the next entry at any level.
+@kindex p
+@item p
+Move to the previous entry at any level.
+@kindex u
+@item u
+Move the the previous entry one level up.
+@kindex .
+@kindex <
+@item .
+@itemx <
+Move to the beginning of the buffer.
+@kindex ,
+@kindex >
+@item ,
+@itemx >
+Move to the end of the buffer.
+@kindex @key{DEL}
+@item @key{DEL}
+Scroll backward a windowful.
+@kindex @key{SPC}
+@item @key{SPC}
+Scroll forward a windowful.
+@end table
+
+@kindex q
+@cindex rolodex, quitting
+Once you have found an entry of interest and you want to remove the
+rolodex match buffer, use @{@kbd{q}@} to quit.  This will restore your
+current frame to its state prior to the rolodex search.
+
+@node Rolo Settings,  , Rolo Keys, Rolodex
+@section   Rolo Settings
+
+@vindex rolo-highlight-face
+@cindex rolodex, highlighting matches
+If textual highlighting is available in your Emacs on your current
+display type, the rolodex uses the value of @var{rolo-highlight-face} as
+the face to use to highlight search matches.
+
+@vindex rolo-kill-buffers-after-use
+The buffers containing the rolodex files are not killed after a search
+on the assumption that another search is likely to follow within this
+Emacs session.  You may wish to change this behavior with the following
+setting: @code{(setq rolo-kill-buffers-after-use t)}.
+
+@vindex rolo-save-buffers-after-use
+After an entry is killed, the modified rolodex file is automatically
+saved.  If you would rather always save files yourself, use this
+setting: @code{(setq rolo-save-buffers-after-use nil)}.
+
+@vindex rolo-email-format
+When adding an entry from within a buffer containing a mail message, the
+rolodex add function will extract the sender's name and e-mail address
+and prompt you with the name as a default.  If you accept it, it will
+enter the name and the email address using the format given by the
+@var{rolo-email-format} variable.  See its documentation if you want to
+change its value.
+
+@vindex rolo-file-list
+@cindex rolodex, personal
+The files used in any rolodex search are given by the
+@var{rolo-file-list} variable, whose default value is
+@code{("~/.rolodex.otl")}, so that searches initially scan only your
+personal rolodex.  Any entries added to this list should be file
+pathnames.  If a file in the list does not exist or is not readable, it
+is skipped.  Files are searched in the order in which they appear in the
+list.  In general, you should leave your personal rolodex file as the
+first entry in the list, since this is the only file to which the rolo
+menu Add command adds entries.@refill
+
+@vindex rolo-entry-regexp
+The rolodex entry start delimiter is given by the regular expression
+variable, @var{rolo-entry-regexp}, whose default value is "^\*+".
+
+@vindex rolo-hdr-regexp
+A rolodex file may begin with an optional header section which is copied
+to the match display buffer whenever any matches are found during a
+search.  The start and end lines of this header are controlled by
+the regular expression variable, @var{rolo-hdr-regexp}, whose default
+value is "^===".  This allows lines of all equal signs to visually
+separate matching entries from multiple files retrieved from a single
+search.
+
+@node Window Configurations, Developing with Hyperbole, Rolodex, Top
+@chapter Window Configurations
+
+@cindex window configurations
+@cindex restoring windows
+@cindex saving window configurations
+@vindex file, wconfig.el
+Hyperbole includes the @file{wconfig.el} package which lets you save and
+restore window configurations, i.e@. the window layout and buffers
+displayed within an Emacs frame.  This is useful to save a particular
+working context and then to jump back to it at a later time during an
+Emacs session.  It is also useful during demonstrations to pull up many
+informational artifacts all at once, e.g@. all of the windows for a
+particular subsystem.  None of this information is stored between Emacs
+sessions, so your window configurations will last only through a single
+session of use.
+
+The wconfig library provides two distinct means of managing window
+configurations.  The first means associates a name with each stored
+window configuration.  The name can then be used to retrieve the window
+configuration later.  The second means uses a ring structure to save
+window configurations and then allows browsing through the sequence of
+saved configurations.
+
+The Win/ menu entry on the Hyperbole top-level menu displays a menu of
+window configuration commands:
+
+@noindent
+@display
+WinConfig>  AddName  DeleteName  RestoreName  PopRing  SaveRing  YankRing
+@end display
+
+@example
+@group
+@cindex wconfig commands
+@cindex window configuration commands
+@findex wconfig-add-by-name
+@findex wconfig-delete-by-name
+@findex wconfig-restore-by-name
+@findex wconfig-delete-pop
+@findex wconfig-ring-save
+@findex wconfig-yank-pop
+Menu Item       Command                   Description
+====================================================================
+AddName         wconfig-add-by-name       Name current wconfig
+DeleteName      wconfig-delete-by-name    Delete wconfig with name
+RestoreName     wconfig-restore-by-name   Restore wconfig by name
+
+PopRing         wconfig-delete-pop        Restore and delete wconfig
+SaveRing        wconfig-ring-save         Store wconfig to ring
+YankRing        wconfig-yank-pop          Restore next wconfig
+====================================================================
+@end group
+@end example
+
+Saving and restoring window configurations by name is the easiest
+method, but it requires that you input the chosen name from the
+keyboard.  The ring commands permit saving and restoring through mouse
+interaction only, if so desired.  The prior section, @ref{Smart Keys},
+mentions how to save and restore window configurations with the Smart Keys.
+Since the ring commands are a bit more complex than their by-name
+counterparts, the following paragraphs explain them in more detail.
+
+@vindex kill-ring
+Wconfig creates a ring structure that operates just like the Emacs
+@var{kill-ring}, @ref{Kill Ring,,,emacs, The GNU Emacs Manual}, but its
+elements are window configurations rather than text regions.  One can
+add an element to the ring based upon the current window configuration.
+After several elements are in the ring, one can walk through all of them
+in sequence until the desired configuration is restored.
+
+@findex wconfig-ring-save
+SaveRing executes the @code{wconfig-ring-save} command which
+saves the current window configuration to the ring.
+
+@findex wconfig-yank-pop
+YankRing executes the @code{wconfig-yank-pop} command.  It restores the
+window configuration from the currently pointed to configuration in the
+ring.  It does not delete this configuration from the ring but it does
+move the pointer to the prior ring element.  Repeated calls to this
+command thus restore successive window configurations until the ring
+pointer wraps around.  Simply stop when a desired configuration appears
+and use @{@kbd{q}@} to quit from the minibuffer menu.
+
+@findex wconfig-delete-pop
+PopRing calls the @code{wconfig-delete-pop} command.
+It is used to restore a previously saved configuration and at the same
+time delete it from the ring.  Simply stop when a desired configuration
+appears and use @{@kbd{q}@} to quit from the minibuffer menu.
+
+@vindex wconfig-ring-max
+The maximum number of elements the ring can hold is set by the
+@var{wconfig-ring-max} variable whose default is 10.  Any saves beyond
+this value cause deletion of the oldest element in the ring before
+a new one is added.
+
+@node Developing with Hyperbole, Glossary, Window Configurations, Top
+@chapter Developing with Hyperbole
+
+This chapter is only for people who are familiar with Emacs Lisp and
+wish to customize Hyperbole, to extend it, or to develop other systems
+using Hyperbole as a base.
+
+@menu
+* Hook Variables::
+* Creating Types::
+* Explicit Button Technicalities::
+* Encapsulating Systems::
+* Embedding Hyperbole::
+@end menu
+
+@node Hook Variables, Creating Types, Developing with Hyperbole, Developing with Hyperbole
+@section   Hook Variables
+
+@cindex variables
+@cindex hook variables
+Hyperbole provides a number of hook variables that allow you to adjust
+its basic operations to meet your own needs, without requiring you to
+change the code for those operations.
+
+We find it best to always set the value of hook variables either to nil
+or to a list of function names of no arguments, each of which will be
+called in sequence when the hook is triggered.
+
+Given the name of a function, a Hyperbole hook variable triggered within
+that function has the same name as the function with a @code{-hook}
+appended.  Hyperbole provides the following hook variables:
+
+@table @var
+
+@vindex hyperb:init-hook
+@item hyperb:init-hook
+For customization at Hyperbole initialization time.  Use this to load
+any personal Hyperbole type definitions you might have.  It is run after
+Hyperbole support code is loaded but before Hyperbole session
+initializations take place.
+
+@vindex action:act-hook
+@vindex hbut:current
+@item action:act-hook
+Run before each Hyperbole button activation.
+The variable @var{hbut:current} contains the button to be activated when
+this is run.
+
+@vindex ebut:create-hook
+@item ebut:create-hook
+To add to the Hyperbole explicit button creation process.
+
+@vindex ebut:delete-hook
+@item ebut:delete-hook
+To add to the Hyperbole explicit button deletion process.
+
+@vindex ebut:modify-hook
+@item ebut:modify-hook
+Executed when an explicit button's attributes are modified.
+
+@vindex hibtypes:begin-load-hook
+@item hibtypes:begin-load-hook
+Executed prior to loading of standard Hyperbole implicit button types.
+Used to load site-specific low priority implicit button types since
+lowest priority ibtypes are loaded first.
+
+@vindex hibtypes:end-load-hook
+@item hibtypes:end-load-hook
+Executed after loading of standard Hyperbole implicit button types.
+Used to load site-specific high priority implicit button types since
+highest priority ibtypes are loaded last.
+
+@vindex htype:create-hook
+@item htype:create-hook
+Executed when a Hyperbole type (e.g@. action type or implicit button
+type) is added to the environment.
+
+@vindex htype:delete-hook
+@item htype:delete-hook
+Executed when a type is deleted from the environment.
+
+@vindex kotl-mode-hook
+@item kotl-mode-hook
+Executed when a Koutline is created or read in or when kotl-mode is
+invoked.
+
+@vindex wrolo-display-hook
+@item wrolo-display-hook
+Executed when rolodex matches are displayed.
+
+@vindex wrolo-mode-hook
+@item wrolo-mode-hook
+Executed when a rolodex match buffer is created and put into wrolo-mode.
+
+@vindex wrolo-yank-reformat-function
+@cindex yank, reformatting
+@item wrolo-yank-reformat-function
+A variable whose value may be set to a function of two arguments, START
+and END, indicating the region of the rolodex entry yanked into the
+current buffer by the rolo-yank command.  The function may reformat this
+region to meed user-specific needs.
+
+@end table
+
+@noindent
+Hyperbole also makes use of a number of external Emacs hook variables.
+
+@table @var
+
+@vindex find-file-hooks
+@cindex button highlighting
+@item find-file-hooks
+This is called whenever a file is read into a GNU Emacs buffer.
+Hyperbole uses it to highlight any buttons within files when run under
+any NEXTSTEP or X window system-based versions of GNU Emacs.
+
+@vindex write-file-hooks
+@cindex button data saving
+@item write-file-hooks
+This is called whenever a GNU Emacs buffer is written to a file.
+Hyperbole uses it to save any modified button data associated with the
+file's directory.
+
+@cindex mail hooks
+@cindex news hooks
+Hyperbole mail and news facilities also utilize a number of external hook
+variables.  These hide button data and highlight buttons if possible.
+See the various support files for details.
+@end table
+
+@node Creating Types, Explicit Button Technicalities, Hook Variables, Developing with Hyperbole
+@section   Creating Types
+
+@cindex type definition
+@cindex type redefinition
+@noindent
+To define or redefine a single Hyperbole type, you may either:
+
+@itemize @bullet
+@kindex C-M-x
+@findex eval-defun
+@kindex C-x C-e
+@findex eval-last-sexp
+@item
+move your Emacs point to within the type definition and use
+@{@kbd{C-M-x}@} @code{(eval-defun)} (only works in Emacs Lisp mode);
+
+@item
+or move your point to the end of the last line of the type definition and
+use @{@kbd{C-x C-e}@} @code{(eval-last-sexp)} (works in most modes).
+@end itemize
+
+@cindex Hyperbole types
+@vindex class, htype
+The functions from the @code{htype} class may be applied to any
+Hyperbole types, if needed.
+
+@vindex file, hactypes.el
+@vindex file, hibtypes.el
+The following subsections explain the specifics of Hyperbole type
+definitions which are beyond standard practice for Emacs Lisp programming.
+See the definitions of the standard types in @file{hactypes.el}
+and @file{hibtypes.el} for examples.
+
+@menu
+* Action Type Creation::
+* Implicit Button Types::
+@end menu
+
+@node Action Type Creation, Implicit Button Types, Creating Types, Creating Types
+@subsection  Action Type Creation
+
+@findex actype:create
+@vindex file, hactypes.el
+@vindex file, hbut.el
+New forms of explicit buttons may be created by adding new action types
+to a Hyperbole environment.  The file, @file{hactypes.el}, provides
+many examples of working action types.
+
+@cindex action type, creation
+@findex defact
+@findex actype:create
+An action type is created, i.e@. loaded into the Hyperbole environment,
+with the @code{(defact)} function (which is an alias for
+@code{(actype:create)}).  The calling signature for this function is
+given in its documentation; it is the same as that of @code{(defun)}
+except that a documentation string is required.  (An interactive calling
+form is also required if the action type has formal parameters and is to
+be used in explicit button definitions.  Implicit buttons never use an
+action type's interactive form.  It is good practice to include an
+interactive form since the type creator cannot know how users may choose
+to apply the type.)@refill
+
+An action type's parameters are used differently than those of a
+function being called.  Its interactive calling form is used when an
+explicit button is created to prompt for type-specific button
+attributes.  The rest of its body is used when a button with that action
+type is activated.  Then the button attributes together with the action
+type body are used to form an action that is executed in response to the
+button activation.  The action's result is returned to the action caller
+unless it returns nil, in which case t is returned to the caller to
+ensure that it registers the performance of the action.
+
+An action type body may perform any computation using Emacs Lisp and
+Hyperbole functions.
+
+@cindex interactive form
+@findex interactive
+The interactive calling form for an action type is of the same form as
+that of a regular Emacs Lisp function definition (see the documentation
+for the Emacs Lisp @code{(interactive)} form).  It may additionally use
+Hyperbole command character extensions when the form is given as a
+string.  Each such extension character @emph{must} be preceded by a plus
+sign, @code{+}, in order to be recognized since such characters may also
+have standard interactive form meanings.
+
+The present Hyperbole extension characters are:
+
+@table @strong
+@cindex argument, Info node
+@cindex interactive cmd char, +I
+@item +I
+Prompts for an existing Info node name and file.
+
+@cindex argument, kcell
+@cindex argument, koutline
+@cindex interactive cmd char, +K
+@item +K
+Prompts for an existing kcell identifier, either a full outline level
+identifier or a permanent idstamp.
+
+@cindex interactive cmd char, +M
+@cindex argument, mail message
+@item +M
+Prompts for a mail message date and the file name it resides in.
+The mail parameters prompted for by this character code are likely to
+change in the future.
+
+@cindex argument, view spec
+@cindex interactive cmd char, +V
+@item +V
+Prompts for a Hyperbole view specification.
+Not yet available for use.
+
+@end table
+
+@vindex class, hargs
+@cindex argument, reading
+Arguments are read by the functions in Hyperbole's @code{hargs} class,
+rather than the standard Lisp @code{read} functions, in order to allow
+direct selection of arguments via the Action Key.
+
+If an action type create is successful, the symbol that Hyperbole uses
+internally to reference the type is returned.  @code{Nil} is returned on
+failure so that you may test whether or not the operation succeeds.
+
+Once you have defined an action type within your present Hyperbole
+environment, you can create new explicit buttons which use it.  There is
+no explicit button type beyond its action type, so no further work is
+necessary.
+
+@findex actype:delete
+Call @code{(actype:delete)} to remove an action type from a Hyperbole
+environment.  It takes a single parameter which should be the same type
+symbol used in the type definition call (not the Hyperbole symbol
+returned by the call).
+
+@node Implicit Button Types,  , Action Type Creation, Creating Types
+@subsection  Implicit Button Types
+
+@cindex implicit button type
+@cindex ibtype
+@findex defib
+@findex ibtype:create
+An implicit button type is created or loaded via the @code{(defib)}
+function (which is an alias for @code{(ibtype:create)}).  The calling
+signature for this function is given in its documentation; it is the
+same as that of @code{(defun)}, but with a number of constraints.  The
+parameter list should always be empty since no parameters will be used.
+A documentation string is required.  The type's body follows this.
+
+@cindex ibtype, predicate
+@cindex ibtype, argument
+@cindex ibtype, return val
+@cindex ibtype, actype
+The body of an implicit button type is a predicate which determines
+whether or not point is within an implicit button of the type.  If not,
+the predicate returns @code{nil}.  If so, it may optionally setup to
+flash the button and then perform one or more actions.  A call of the
+form: @code{(ibut:label-set label start-pos end-pos)} is used to setup
+the button flashing, if desired.  This is then typically immediately
+followed by an action invocation of the form:
+@code{(hact 'actype &rest actype-arguments)}.  It is imperative that all
+actions (non-predicate code) be invoked through the @code{(hact)}
+function rather than directly or your ibtypes will not work properly.
+(Hyperbole first tests to see if any ibtype matches the current context
+before activating any type, so it ensures that @code{(hact)} calls are
+disabled during this testing.)  Any action types used may be created
+before or after the implicit button type definition but obviously should
+be defined before any implicit buttons of the given type are activated;
+an error will result, otherwise.
+
+If an implicit button type create is successful, the symbol that
+Hyperbole uses internally to reference the type is returned.  @code{Nil}
+is returned on failure so that you may test whether or not the operation
+succeeds.  Implicit button type names and action type names may be the
+same without any conflict.  In fact, such naming is encouraged when an
+implicit button type is the exclusive user of an action type.
+
+@findex ibtype:delete
+Call @code{(ibtype:delete)} to remove an implicit button type from a
+Hyperbole environment.  It takes a single parameter which should be the
+same type symbol used in the type definition call (not the Hyperbole
+symbol returned by the call).  This will not delete the action type used
+by the implicit button; that must be done separately.
+
+@cindex ibtype, help
+@findex ibut:at-p
+@vindex class, hattr
+@vindex class, hbut
+@vindex file, hib-kbd.el
+By default, a request for help on an implicit button will display the
+button's attributes in the same manner as is done for explicit buttons.
+For some implicit button types, other forms of help will be more
+appropriate.  If an Emacs Lisp function is defined whose name is formed
+from the concatenation of the type name followed by @code{:help}, e.g@.
+@code{my-ibtype:help}, it is used to respond to requests for
+help on buttons of that type.  Any such function should take a single
+argument of an implicit button construct.  (This is what
+@code{(ibut:at-p)} returns when point is within an implicit button
+context.)  The button may be queried for its attributes using functions
+from the @code{hbut} and @code{hattr} classes.  See the @file{hib-kbd.el}
+file for an example of a custom help function.
+
+@node Explicit Button Technicalities, Encapsulating Systems, Creating Types, Developing with Hyperbole
+@section   Explicit Button Technicalities
+@menu
+* Button Label Normalization::
+* Operational and Storage Formats::
+* Programmatic Button Creation::
+@end menu
+
+@node Button Label Normalization, Operational and Storage Formats, Explicit Button Technicalities, Explicit Button Technicalities
+@subsection  Button Label Normalization
+@cindex normalized label
+@cindex button label
+@cindex button key
+@vindex hbut:label-to-key
+Hyperbole uses a normalized form of button labels called button keys (or
+label keys) for all internal operations.  See the documentation for the
+function @code{(hbut:label-to-key)} for details of the normalization
+process.  The normalized form permits Hyperbole to recognize buttons that
+are the same but whose labels appear different from one another, due to
+text formatting conventions.  For example, all of the following would
+be recognized as the same button.
+
+@example
+  <(fake button)>     <( fake      button)>
+
+  Pam>  <(fake
+  Pam>    button)>
+
+  ;; <(fake
+  ;;   button)>
+
+  /* <( fake      */
+  /*    button )> */
+@end example
+
+@vindex hbut:fill-prefix-regexps
+@vindex fill-prefix
+@cindex fill prefix
+@cindex button, multiple lines
+@cindex button, split across lines
+The last three examples demonstrate how Hyperbole ignores common fill
+prefix patterns that happen to fall within the middle of a button label
+that spans multiple lines.  As long as such buttons are selected with
+point at a location within the label's first line, the button will be
+recognized.  The variable @var{hbut:fill-prefix-regexps} holds the list
+of fill prefixes recognized when embedded within button labels.  All
+such prefixes are recognized (one per button label), regardless of the
+setting of the GNU Emacs variable, @var{fill-prefix}, so no user
+intervention is required.
+
+@node Operational and Storage Formats, Programmatic Button Creation, Button Label Normalization, Explicit Button Technicalities
+@subsection  Operational and Storage Formats
+
+@cindex explicit button, formats
+@cindex explicit button, storage
+@cindex storage manager
+@cindex button attributes
+@vindex hbut:current
+Hyperbole uses a terse format to store explicit buttons and a more
+meaningful one to show users and to manipulate during editing.  The
+terse format consists solely of button attribute values whereas the edit
+format includes an attribute name with each attribute value.  A button
+in edit format consists of a Lisp symbol together with its attribute list
+which holds the attribute names and values.  In this way, buttons may be
+passed along from function to function simply by passing the symbol to
+which the button is attached.  Most functions utilize the pre-defined
+@var{hbut:current} symbol by default to store and retrieve the last
+encountered button in edit format.
+
+@vindex class, hbdata
+@vindex class, ebut
+@vindex class, hbut
+The @code{hbdata} class handles the terse, stored format.  The
+@code{hbut}, @code{ebut}, and @code{ibut} classes work with the
+name/value format.  This separation permits the wholesale replacement of
+the storage manager with another, with any interface changes hidden from
+any Hyperbole client programming.
+
+@node Programmatic Button Creation,  , Operational and Storage Formats, Explicit Button Technicalities
+@subsection  Programmatic Button Creation
+
+@cindex explicit button, creation
+A common need when developing with Hyperbole is the ability to create or
+modify explicit buttons without user interaction.  For example, an
+application might require the addition of an explicit summary button to
+a file for each new mail message a user reads that contains a set of
+keywords.  The user could then check the summary file and jump to
+desired messages quickly.
+
+@vindex class, ebut
+@vindex file, hbut.el
+@findex ebut:create
+@findex ebut:map
+The Hyperbole class @code{ebut} supports programmatic access to explicit
+buttons.  See it within the @file{hbut.el} file for full details.  The
+documentation for @code{(ebut:create)} explains the set of attributes
+settings necessary to create an explicit button.  For operations over
+the whole set of buttons within the visible (non-narrowed) portion of a
+buffer, use the @code{(ebut:map)} function.
+
+@page
+@node Encapsulating Systems, Embedding Hyperbole, Explicit Button Technicalities, Developing with Hyperbole
+@section   Encapsulating Systems
+
+@vindex file, hsys-*
+@cindex Hyperbole, system encapsulation
+@cindex system encapsulation
+A powerful use of implicit button types is to provide a Hyperbole-based
+interface to external systems.  The basic idea is to interpret patterns
+output by the application as implicit buttons.
+
+See the @file{hsys-*} files for examples of how to do this.
+Encapsulations are provided for the following systems (the systems
+themselves are not included with Hyperbole):
+
+@table @bullet
+@item World-Wide Web
+The world-wide web system originally developed at CERN, that now spans
+the Internet universe.  This is automatically loaded by Hyperbole so
+that a press of the Action Key follows a URL.
+
+@item WAIS
+The Wide Area Information Systems full text-retrieval system orginally
+developed at Thinking Machines and then later at WAIS Inc.
+
+@item HyperBase
+A hypertextual storage manager that stores textual nodes as records with
+locking so that multiple users can read and edit hypertexts.
+@end table
+
+
+@node Embedding Hyperbole,  , Encapsulating Systems, Developing with Hyperbole
+@section   Embedding Hyperbole
+
+[NOTE: We have never done this ourselves, though we have done similar
+things which leads us to infer that the task should not be difficult.]
+
+@cindex Hyperbole API
+@cindex API
+@cindex programming interface
+@cindex Hyperbole, embedding
+The standard Emacs-based Hyperbole user interface has purposely been
+separated from the Hyperbole backend to support the development of
+alternative interfaces and the embedding of Hyperbole functionality
+within other system prototypes.  The Hyperbole backend functionality
+that system developers can make use of is called its Application
+Programming Interface (API).  The API may be used to make server-based
+calls to Hyperbole when Emacs is run as a non-interactive (batch)
+process, with its input/output streams attached to another process.
+
+The public functions and variables from the following files may be
+considered the present Hyperbole API:
+
+@noindent
+@file{hact.el}, @file{hargs.el}, @file{hbmap.el}, @file{hbut.el},
+@file{hhist.el}, @file{hmail.el}, @file{hmoccur.el}, @file{hpath.el},
+@file{htz.el}, @file{hypb.el}, @file{set.el}, @file{wconfig.el},
+@file{wrolo.el}, and @file{wrolo-logic.el}.@refill
+
+@noindent
+Note when looking at these files, that they are divided into sections
+that separate one data abstraction (class) from another.  A line of
+dashes within a class separates public parts of the class from the
+private parts that follow the line.
+
+This API does not include the Hyperbole outliner, as it has been
+designed for interactive use, rather than programmatic extensibility.
+You can certainly study its code, below the @file{hyperbole/kotl/}
+directory and learn to program it, however.
+
+
+@node Glossary, Smart Key Reference, Developing with Hyperbole, Top
+@appendix Glossary
+
+Concepts pertinent to operational usage of Hyperbole are defined here.
+If some GNU Emacs terms are unfamiliar to you, @ref{Glossary, Emacs
+Glossary,, emacs, the GNU Emacs Manual}.
+
+@table @code
+
+@cindex action
+@item action
+An executable behavior associated with a Hyperbole button.  A specific
+class of actions which display entities are called @emph{links},
+such as a link to a file.
+
+@cindex Action Key
+@item Action Key
+See @emph{Smart Key}.
+
+@cindex action type
+@item action type
+A behavioral specification for use within Hyperbole buttons.  Action
+types usually contain a set of parameters which must be given values for
+each button with which they are associated.  An action type together
+with a set of values, called arguments, may be considered an @emph{action}.
+@emph{Actype} is a synonym for action type.
+
+@cindex activation
+@item activation
+Request for a Hyperbole button to perform its action.
+Ordinarily the user presses a key which selects and activates a button.
+
+@cindex ange-ftp
+@cindex ftp
+@item ange-ftp
+A standard GNU Emacs Lisp package which allows one to use pathnames
+that are accessible via the Internet File Transfer Protocol (ftp) just
+like other pathnames, for example when finding a file.  The
+latest version of ange-ftp may always be obtained via anonymous ftp to:
+@file{/ftp.gnu.ai.mit.edu:ange-ftp/ange-ftp.tar.gz}.
+
+@cindex argument
+@item argument
+A button-specific value fed to a Hyperbole type specification when the
+button is activated.
+
+@cindex Assist Key
+@item Assist Key
+See @emph{Smart Key}.
+
+@cindex attributes
+@item attributes
+Slot names associated with Hyperbole buttons.  An @emph{attribute value}
+is associated with each button attribute.
+
+@cindex Augment
+@cindex NLS
+@cindex hypertext
+@cindex interactive computing
+@cindex mouse
+@cindex windows
+@cindex hypertext
+@cindex outline processor
+@cindex groupware
+@cindex digital signature
+@cindex Engelbart
+@item Augment
+The Augment system, originally named NLS, was a pioneering research and
+production system aimed at augmenting human intellect and group
+knowledge processing capabilities through integrated tools and
+organizational development strategies.  This approach led to the
+invention of much of interactive computing technology decades ahead of
+other efforts, including: the mouse, screen windows, true hypertext,
+outline processors, groupware, and digitally signed documents.
+@xref{References}, which cites several Douglas Engelbart papers on the
+subject.  The Koutliner concept emerged from studies of publicly
+available information concerning Augment.
+
+@cindex button
+@item button
+A selectable Hyperbole construct which performs an action.  A button
+consists of a set of attributes that includes: a textual label, a
+category, a type and zero or more arguments.  @emph{Explicit buttons}
+also have creator, create time, last modifier, and last modifier time
+attributes.
+
+Buttons provide the user's gateway to information.  The user sees and
+interacts with button labels, the rest of the button data is managed
+invisibly by Hyperbole and displayed only in response to user queries.
+
+@cindex button activation
+@item button activation
+See @emph{activation}.
+
+@cindex button attributes
+@item button attributes
+See @emph{attributes}.
+
+@cindex button data
+@item button data
+Lists of button attribute values explicitly saved and managed by Hyperbole.
+One list for each button created by Hyperbole.
+
+@cindex button file, local
+@item button file, local
+A per-directory file named @file{HYPB} that may be used to store any
+desired buttons and may then be displayed via a menu selection whenever
+a user is within that directory.
+
+@cindex button file, personal
+@item button file, personal
+A per-user file named @file{HYPB} that may be used to store any desired
+buttons and may then be displayed via a menu selection.
+
+@cindex button key
+@item button key
+A normalized form of a @emph{button label} used internally by Hyperbole.
+
+@cindex button label
+@item button label
+A text string that visually indicates a Hyperbole button location and
+provides it with a name and unique identifier.  Within a buffer, buttons
+with the same label are considered separate views of the same button and
+so behave exactly alike.  Since button labels are simply text strings,
+they may be embedded within any text to provide non-linear information
+or operational access points.
+
+The maximum length of a button label is limited by the variable
+@var{ebut:max-len}.
+
+@cindex button selection
+@item button selection
+The act of designating a Hyperbole button upon which to operate.
+Use the Action Key to select a button.
+
+@cindex category
+@item category
+A high-level, conceptual grouping of Hyperbole buttons into classes.
+@emph{Implicit} and @emph{explicit} groupings represent categories.
+
+@cindex cell
+@item cell
+See @emph{kcell}.
+
+@cindex children
+@item children
+The set of koutline cells which share a common parent cell and are one
+level deeper than the parent.
+
+@cindex class
+@item class
+A group of functions and variables with the same prefix in their names,
+used to provide an interface to an internal or external Hyperbole
+abstraction.
+
+@cindex context
+@item context
+A programmatic or positional state recognized by Hyperbole.
+We speak of Smart Key and implicit button contexts.  Both are typically
+defined in terms of surrounding patterns within a buffer, but may be
+defined by arbitrary Emacs Lisp predicates.  (Context may come to have a
+broader meaning within future versions of Hyperbole.)
+
+@cindex environment
+@item environment
+See @emph{Hyperbole environment}.
+
+@cindex efs
+@item efs
+The much larger successor to ange-ftp.  It does the same thing as
+ange-ftp but works with more types of ftp hosts.  See @emph{ange-ftp}.
+
+@cindex explicit button
+@item explicit button
+A button created and managed by Hyperbole.  By default, explicit buttons
+are delimited like this @code{<(fake button)>}.  Direct selection is
+used to operate upon an explicit button.
+
+@cindex global button
+@item global button
+@vindex gbut:file
+A form of explicit button which is typically 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 @var{gbut:file} and
+may be activated as regular explicit buttons by visiting this file.  By
+default, this is the same as the user's personal button file.
+
+@cindex global button file
+@item global button file
+See @emph{button file, personal}.
+
+@findex run-hooks
+@cindex hook variable
+@item hook variable
+A variable that permits customization of an existing function's
+operation without the need to edit the function's code.  See also the
+documentation for the function @code{(run-hooks)}.
+
+@cindex Hyperbole
+@item Hyperbole
+A flexible, programmable information management and viewing system built
+on top of GNU Emacs.  It utilizes a button-action model and supports
+hypertextual linkages.  Hyperbole is all things to all people.
+
+@cindex Hyperbole environment
+@item Hyperbole environment
+A programmatic context within which Hyperbole operates.  This includes
+the set of Hyperbole types defined and the set of Hyperbole code modules
+loaded.  It does not include the set of accessible buttons.
+Although the entire Emacs environment is available to Hyperbole, we do
+not speak of this as part of the Hyperbole environment.
+
+@cindex hypertext
+@item hypertext
+A text or group of texts which may be explored in a non-linear fashion
+through associative linkages embedded throughout the text.  Instead of
+simply referring to other pieces of work, hypertext references when
+followed actually take you to the works themselves.
+
+@cindex implicit button
+@item implicit button
+A button recognized contextually by Hyperbole.  Such buttons contain no
+button data.  See also @emph{implicit button type}.
+
+@cindex implicit button type
+@item implicit button type
+A specification of how to recognize and activate implicit buttons of a
+specific kind.  Implicit button types often utilize structure internal
+to documents created and managed without Hyperbole assistance, for
+example, programming documentation.  @emph{Ibtype} is a synonym for
+implicit button type.  See also @emph{system encapsulation}.
+
+@cindex instance number
+@item instance number
+A colon prefaced number appended to the label of a newly created button
+when the button's label duplicates the label of an existing button in
+the current buffer.  This number makes the label unique and so allows
+any number of buttons with the same base label within a single buffer.
+
+@cindex koutline
+@item koutline
+A hierarchically ordered grouping of cells which may be stored as a file
+and viewed and edited as an outline.
+
+@cindex Koutliner
+@item Koutliner
+Koutliner, the Hyperbole outliner, is a powerful autonumbering outliner
+with permanent hypertext anchors for easy hyperlinking and view
+specs for rapid outline view alteration.  
+
+@cindex kcell
+@item kcell
+Cells or kcells are elements within koutlines.  Each cell contains
+textual and graphical contents, a relative identifier, a permanent
+identifier and a set of attributes such as the user who created the cell
+and the time of creation.  See also @emph{Koutliner}.
+
+@cindex link
+@item link
+A reference from a Hyperbole button to an entity.  The referenced entity
+is sometimes called a @emph{node} or @emph{referent}.
+A specific class of actions which display entities are called
+@emph{links}, such as a link to a file.
+
+@cindex local button file
+@item local button file
+See @emph{button file, local}.
+
+@cindex minibuffer window
+@item minibuffer window
+The one line window at the bottom of a frame where messages and prompts
+are displayed.
+
+@cindex minibuffer menu
+@item minibuffer menu
+A Hyperbole menu displayed in the minibuffer window.  Each menu item
+within a minibuffer menu begins with a different letter that can be used
+to invoke the item (case doesn't matter).  Items that display other
+menus end with a forward slash, /.
+
+@cindex mouse button
+@item mouse button
+@item mouse key
+See @emph{Smart Key}.
+
+@cindex node
+@item node
+See @emph{link} or @emph{cell}.
+
+@cindex outline
+@item outline
+See @emph{koutline}.
+
+@cindex parent
+@item parent
+Any koutline cell which has children.
+
+@cindex predecessor
+@item predecessor
+The previous same level koutline cell with the same parent.
+
+@cindex predicate
+@item predicate
+A boolean (nil = false, non-nil = true) Lisp expression typically
+evaluated as part of a conditional expression.
+
+@cindex referent
+@item referent
+See @emph{link}.
+
+@cindex rolodex
+@item rolodex
+Wrolo, the Hyperbole rolodex, provides rapid lookup of multi-line,
+hierarchically ordered free form text records.
+
+@cindex root cell
+@item root cell
+A koutline cell which has cells below it.  All such cells share the same
+root cell.
+
+@cindex Smart Key
+@vindex smart-scroll-proportional
+@cindex proportional scrolling
+@cindex scrolling
+@item Smart Key
+A context-sensitive key used within Hyperbole and beyond.  Actually,
+there are two Smart Keys, the Action Key and the Assist Key.  The
+Action Key, typically bound to the shift-middle mouse key (or shift-left
+mouse key on a 2-button mouse), activates Hyperbole buttons and scrolls
+the current buffer line to the top of the window when pressed at the end
+of a line.  The Assist Key, typically bound to the shift-right mouse
+key, explains what a Hyperbole button does or scrolls the current line
+to the bottom of the window when pressed at the end of a line.  (See the
+documentation for the variable, @var{smart-scroll-proportional}, for
+information on how to make these keys scroll forward and backward a
+windowful at a time).
+
+To see what a Smart Key will do within a particular context, depress and
+hold the key at the point desired and depress the other Smart Key.  A
+buffer containing a description of its contextual function will then be
+displayed.  You may release the two keys in any order after you have
+them both depressed.  A press of the Assist Key in an unsupported
+context displays a summary of Smart Key functions in each context, as
+does the Doc/SmartKy menu item.
+
+@cindex source buffer
+@cindex source file
+@item source buffer / file
+The buffer or file within which a Hyperbole button is embedded.
+
+@cindex subtree
+@item subtree
+All of the cells in a koutline which share the same root cell, excluding
+the root cell.
+
+@cindex successor
+@item successor
+The next same level koutline cell with the same parent.
+
+@cindex system encapsulation
+@item system encapsulation
+Use of Hyperbole to provide an improved or simply consistent user
+interface to another system.  Typically, implicit button types are
+defined to recognize and activate button-type constructs managed by the
+other system.
+
+@cindex tree
+@item tree
+The set of cells in a koutline that share a common root cell, including
+the root cell.
+
+@cindex view
+@item view
+A perspective on some information.  A view can affect the extent of the
+information displayed, its format, modes used to operate on it, its
+display location and so forth.
+
+@cindex view spec
+@item view spec
+A terse (and to the uninitiated, cryptic) string that specifies a
+particular view of koutline or a link referent.  If a view spec is in
+use in a buffer, the view spec appears in the modeline delimited by
+<|view spec>.
+
+@end table
+
+@node Smart Key Reference, Outliner Keys, Glossary, Top
+@appendix Smart Key Reference
+
+This appendix supplies complete documentation on Smart Key operation.  It is
+quite extensive and is meant for reference rather than sequential reading.
+@xref{Smart Keys}, for a description of the Smart Keys.  That section also
+describes how to get context-sensitive Smart Key help, with which you can
+explore Smart Key operation bit by bit.
+
+Smart Key operations are context-sensitive.  Contexts are described herein as
+conditionals, e.g@. when depressed here, if this is true, etc.  Each Smart
+Key context is listed in the order in which it will be checked.  The first
+matching context is always the one applied.  Within each context, the
+actions performed by the Action and Assist Keys are listed.
+
+@menu
+* Smart Mouse Keys::
+* Smart Keyboard Keys::
+@end menu
+
+@node Smart Mouse Keys, Smart Keyboard Keys, Smart Key Reference, Smart Key Reference
+@section   Smart Mouse Keys
+
+@cindex Smart Mouse Keys
+Smart Key drags and modeline presses can only be used when running under
+a window system with mouse key support.  So keep in mind that the
+operations in this section apply only if you have mouse support within
+Hyperbole.  The Smart Key operations in, @ref{Smart Keyboard Keys},
+apply to both mouse and keyboard Smart Key usage.
+
+@format
+@group
+@cindex drag, side edge
+@cindex side drag
+If dragged from a side-by-side window edge or from the immediate left of
+a vertical scroll bar:
+  ACTION or ASSIST
+     Resizes adjacent window sides to the point of drag release.
+@end group
+@end format
+
+@format
+@group
+@cindex drag, between windows
+If dragged from inside one window to another:
+  ACTION
+     Creates a new link button at the drag start location, linked to the
+     drag end location.  If drag start position is within a button,
+     modifies the button to link to drag end location.
+  ASSIST
+     Swaps buffers in the two windows.
+@end group
+@end format
+
+@page
+@format
+@group
+@cindex drag, horizontal
+@cindex horizontal drag
+If dragged horizontally within a single window while depressed
+(hmouse-x-drag-sensitivity sets the minimal horizontal movement which
+registers a drag):
+  ACTION
+     Goes to buffer end if drag was to the right, otherwise goes to beginning.
+  ASSIST
+     Splits window vertically if drag was to the right, otherwise deletes
+     window.
+@end group
+@end format
+
+@format
+@group
+@cindex depress, modeline
+@cindex modeline depress
+If depressed within a window mode line:
+  ACTION
+     (1) clicked on left edge of a window's modeline,
+         window's buffer is buried (placed at bottom of buffer list);
+     (2) clicked on right edge of a window's modeline,
+         the Info buffer is displayed, or if already displayed and the
+         modeline clicked belongs to a window displaying Info, the Info
+         buffer is hidden;
+     (3) clicked anywhere in the middle of a window's modeline,
+	 the functions listed in 'assist-key-modeline-hook' are
+         called;
+     (4) dragged vertically from modeline to within a window,
+         the modeline is moved to point of key release, thereby resizing
+         its window and potentially its vertical neighbors.
+  ASSIST
+     (1) clicked on left edge of a window's modeline,
+         bottom buffer in buffer list is unburied and placed in window;
+     (2) clicked on right edge of a window's modeline,
+         the summary of Smart Key behavior is displayed, or if already
+         displayed and the modeline clicked belongs to a window displaying
+         the summary, the summary buffer is hidden;
+     (3) clicked anywhere in the middle of a window's modeline,
+         a popup menu (if available) is displayed;
+     (4) dragged vertically from modeline to within a window,
+         the modeline is moved to point of key release, thereby resizing
+         its window and potentially its vertical neighbors.
+@end group
+@end format
+
+@page
+@format
+@group
+@cindex drag, vertical
+@cindex vertical drag
+If dragged vertically within a single window while depressed
+(hmouse-y-drag-sensitivity sets the minimal vertical movement which
+registers a drag):
+  ACTION or ASSIST
+     Splits current window into two side-by-side windows.
+@end group
+@end format
+
+@format
+@group
+@cindex drag, diagonal
+@cindex diagonal drag
+If dragged diagonally within a single window while depressed
+(hmouse-x-diagonal-sensitivity and hmouse-y-diagonal-sensitivity set the
+minimal diagonal movement which registers a drag):
+  ACTION
+     Save current window configuration onto a ring of window configurations.
+  ASSIST
+     Restores prior window configuration from ring.  A prefix argument N
+     specifies the Nth prior configuration from the ring.
+@end group
+@end format
+
+@page
+
+@node Smart Keyboard Keys,  , Smart Mouse Keys, Smart Key Reference
+@section   Smart Keyboard Keys
+
+@cindex Smart Keyboard Keys
+@format
+@group
+When prompting for a Hyperbole argument, a press in the minibuffer:
+  ACTION
+     Terminates this minibuffer argument.
+  ASSIST
+     Offers completion help for current minibuffer argument.
+@end group
+@end format
+
+@format
+@group
+When reading a Hyperbole menu item or a Hyperbole completion-based argument:
+  ACTION
+     Returns value selected at point if any, else nil.  If
+     value is the same as the contents of the minibuffer, it is used as the
+     current minibuffer argument, otherwise, the minibuffer is erased and
+     value is inserted there.
+
+  ASSIST
+     Displays Hyperbole menu item help when item is selected.
+@end group
+@end format
+
+@vindex smart-scroll-proportional
+@cindex proportional scrolling
+@cindex scrolling
+@format
+@group
+@cindex click, end of line
+@cindex end of line click
+When pressed at the end of a line but not the end of a buffer:
+  ACTION
+     Scrolls up according to value of smart-scroll-proportional.  If
+     smart-scroll-proportional is nil or if point is on the top
+     window line, scrolls up (forward) a windowful.  Otherwise, tries to
+     bring current line to top of window.  Leaves point at end of line and
+     returns t if scrolled, nil if not.
+  ASSIST
+     Scrolls down according to value of smart-scroll-proportional.  If
+     smart-scroll-proportional is nil or if point is on the
+     bottom window line, scrolls down (backward) a windowful.  Otherwise,
+     tries to bring current line to bottom of window.  Leaves point at end of
+     line and returns t if scrolled, nil if not.
+@end group
+@end format
+
+@format
+@group
+@cindex click, button
+@cindex button click
+When pressed on a Hyperbole button:
+  ACTION
+     Activates button.
+  ASSIST
+     Displays help for button, typically a summary of its attributes.
+@end group
+@end format
+
+@format
+@group
+If pressed within a buffer in View major or minor mode:
+  ACTION
+     Scrolls buffer forward a windowful and quits from view mode when at
+     the last line of the buffer.
+  ASSIST
+     Scrolls buffer backward a windowful.
+@end group
+@end format
+
+@format
+@group
+When pressed within a Hyperbole outliner buffer (kotl-mode):
+  ACTION
+     (1) at the end of buffer, uncollapse and unhide all cells in view;
+     (2) within a cell, if its subtree is hidden then show it,
+         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 link referent cell;
+     (4) anywhere else, scroll up a windowful.
+  ASSIST
+     (1) at the end of buffer, collapse all cells and hide all non-level-one
+         cells;
+     (2) on a header line but not at the beginning or end, display
+         properties of each cell in kotl 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 tree to move and where to move it;
+     (4) anywhere else, scroll down a windowful.
+@end group
+@end format
+
+@format
+@group
+When pressed on a Smart Menu item:
+  ACTION
+    Activates item.
+  ASSIST
+    Displays help for item.
+@end group
+@end format
+
+@page
+@format
+@group
+When pressed at the end of a Help buffer:
+  ACTION or ASSIST
+    Restores window configuration prior to help display.
+@end group
+@end format
+
+@format
+@group
+When pressed within an OO-Browser listing window:
+  ACTION
+     (1) in a blank buffer or at the end of a buffer, browser help
+         information is displayed in the viewer window;
+     (2) at the beginning of a (non-single char) class name, the class'
+         ancestors are listed;
+     (3) at the end of an entry line, scrolls listing up;
+     (4) on the '...', following a class name, point is moved to the class
+         descendency expansion;
+     (5) before an element name, the implementor classes of the name are
+         listed;
+     (6) anywhere else on an entry line, the source is displayed for editing.
+  ASSIST
+     (1) in a blank buffer, a selection list of buffer files is displayed;
+     (2) at the beginning of a (non-single char) entry, the class'
+         descendants are listed;
+     (3) at the end of an entry line, scrolls listing down;
+     (4) on the '...', following a class name, point is moved to the class
+         expansion;
+     (5) anywhere else on a class entry line, lists the class' elements;
+     (6) anywhere else on an element line, lists the element's implementor
+         classes;
+     (7) on a blank line following all entries, the current listing buffer
+         is exited.
+@end group
+@end format
+
+@format
+@group
+When pressed within an OO-Browser Command Help Menu buffer:
+  ACTION
+     Executes an OO-Browser command whose key binding is at point.
+  ASSIST
+     Displays help for an OO-Browser command whose key binding is at point.
+@end group
+@end format
+
+@format
+@group
+When pressed on an identifier within an OO-Browser source file:
+  ACTION
+     Tries to display identifier definition.
+  ASSIST
+     Not applicable.
+@end group
+@end format
+
+@page
+@format
+@group
+When pressed within a C source code file:
+  ACTION
+     Jumps to the definition of selected C construct:
+     (1) on a '#include' statement, the include file is displayed;
+         Look for include file in directory lists
+         'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'.
+     (2) on a C identifier, the identifier definition is displayed,
+         assuming the identifier is found within an 'etags' generated tag file
+         in the current directory or any of its ancestor directories.
+     (3) if 'smart-c-use-lib-man' is non-nil, the C identifier is
+         recognized as a library symbol, and a man page is found for the
+         identifier, then the man page is displayed.
+  ASSIST
+     Jumps to the next tag matching an identifier at point.
+@end group
+@end format
+
+@format
+@group
+When pressed within an assembly source code file:
+  ACTION
+     Jumps to the definition of selected assembly construct:
+     (1) on an include statement, the include file is displayed;
+         Look for include file in directory list
+         'smart-asm-include-dirs'.
+     (2) on an identifier, the identifier definition is displayed,
+         assuming the identifier is found within an 'etags' generated
+	 tag file in the current directory or any of its ancestor
+	 directories.
+  ASSIST
+     Jumps to the next tag matching an identifier at point.
+@end group
+@end format
+
+@page
+@format
+@group
+When pressed within a C++ source code file:
+  ACTION
+     Jumps to the definition of selected C+ construct:
+     (1) on a '#include' statement, the include file is displayed;
+         Look for include file in directory lists
+         'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'.
+     (2) on a C++ identifier, the identifier definition is displayed,
+         assuming the identifier is found within an 'etags' generated tag file
+         in the current directory or any of its ancestor directories.
+     (3) if 'smart-c-use-lib-man' is non-nil, the C++ identifier is
+         recognized as a library symbol, and a man page is found for the
+         identifier, then the man page is displayed.
+  ASSIST
+     Jumps to the next tag matching an identifier at point.
+@end group
+@end format
+
+@format
+@group
+When pressed within a Objective-C source code file:
+  ACTION
+     Jumps to the definition of selected C+ construct:
+     (1) on a '#include' statement, the include file is displayed;
+         Look for include file in directory lists
+         'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'.
+     (2) on an Objective-C identifier, the identifier definition is displayed,
+         assuming the identifier is found within an 'etags' generated tag file
+         in the current directory or any of its ancestor directories.
+     (3) if 'smart-c-use-lib-man' is non-nil, the Objective-C identifier is
+         recognized as a library symbol, and a man page is found for the
+         identifier, then the man page is displayed.
+  ASSIST
+     Jumps to the next tag matching an identifier at point.
+@end group
+@end format
+
+@page
+@format
+@group
+When pressed on a Lisp symbol within a Lisp code buffer:
+  ACTION
+     Jumps to the definition of any selected Lisp construct.
+     If on an Emacs Lisp require, load, or autoload clause and 'find-library'
+     from load-library package by Hallvard Furuseth <hallvard@@ifi.uio.no> has
+     been loaded, jumps to library source, if possible.
+  ASSIST
+     Jumps to the next tag matching an identifier at point or if using the
+     "wtags" package and identifier is an Emacs Lisp symbol, then displays
+     documentation for the symbol.
+@end group
+@end format
+
+@format
+@group
+When the OO-Browser has been loaded and the press is within a C++ buffer:
+  ACTION or ASSIST
+     Jumps to the definition of selected C++ construct via OO-Browser support.
+     (1) on a '#include' statement, the include file is displayed;
+         Look for include file in directory lists
+         'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'.
+     (2) within a method declaration, its definition is displayed;
+     (3) on a class name, the class definition is shown.
+@end group
+@end format
+
+@format
+@group
+When the OO-Browser has been loaded and the press is within a
+Objective-C buffer:
+  ACTION or ASSIST
+     Jumps to the definition of selected Objective-C construct via
+     OO-Browser support.
+     (1) on a '#include' statement, the include file is displayed;
+         Look for include file in directory lists
+         'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'.
+     (2) within a method declaration, its definition is displayed;
+     (3) on a class name, the class definition is shown.
+@end group
+@end format
+
+@format
+@group
+When pressed within an occur-mode or moccur-mode buffer:
+  ACTION or ASSIST
+     Jumps to the source buffer and line of the current occurrence.
+@end group
+@end format
+
+@page
+@format
+@group
+When pressed within a calendar-mode buffer:
+  ACTION
+     (1) at the end of the buffer, the calendar is scrolled forward 3 months;
+     (2) to the left of any dates on a calendar line, the calendar is scrolled
+         backward 3 months;
+     (3) on a date, the diary entries for the date, if any, are displayed.
+  ASSIST
+     (1) at the end of the buffer, the calendar is scrolled backward 3 months;
+     (2) to the left of any dates on a calendar line, the calendar is scrolled
+         forward 3 months;
+     (3) anywhere else, all dates with marking diary entries are marked in the
+         calendar window.
+@end group
+@end format
+
+@format
+@group
+When pressed within a man page apropos buffer:
+  ACTION
+     (1) on a UNIX man apropos entry, the man page for that entry is
+         displayed in another window;
+     (2) on or after the last line, the buffer in the other window is
+         scrolled up a windowful.
+  ASSIST
+     (1) on a UNIX man apropos entry, the man page for that entry is
+         displayed in another window;
+     (2) on or after the last line, the buffer in the other window is
+         scrolled down a windowful.
+@end group
+@end format
+
+@format
+@group
+If Smart Menu package has been loaded and 'hkey-always-display-menu' is
+non-nil:
+  ACTION or ASSIST
+     Pops up a window with a Smart Menu of commands.
+     Menu displayed is selected by (smart-menu-choose-menu).
+@end group
+@end format
+
+@page
+@format
+@group
+If pressed within an outline-mode buffer or when 'selective-display' is
+non-nil:
+  ACTION
+     Collapses, expands, and moves outline entries.
+     (1) after an outline heading has been cut via the Action Key, then paste
+         the cut heading at point;
+     (2) at the end of buffer, show all buffer text
+     (3) at the beginning of a heading line, cut the headings subtree from the
+         buffer;
+     (4) on a header line but not at the beginning or end, if headings
+         subtree is hidden then show it, otherwise hide it;
+     (5) anywhere else, scroll up a windowful.
+  ASSIST
+     (1) after an outline heading has been cut via the Action Key, allow
+         multiple pastes throughout the buffer (last paste should be done
+         with the Action Key, not the Assist Key);
+     (2) at the end of buffer, hide all bodies in buffer;
+     (3) at the beginning of a heading line, cut the current heading (sans
+         subtree) from the buffer;
+     (4) on a header line but not at the beginning or end, if heading body is
+         hidden then show it, otherwise hide it;
+     (5) anywhere else, scroll down a windowful.
+@end group
+@end format
+
+@format
+@group
+@cindex click, Info
+@cindex Info browsing
+If pressed within an Info manual node:
+  ACTION
+     (1) the first line of an Info Menu Entry or Cross Reference, the desired
+         node is found;
+     (2) the Up,Next,or Previous entries of a Node Header (first line),
+         the desired node is found;
+     (3) the File entry of a Node Header (first line),
+         the 'Top' node within that file is found;
+     (4) at the end of the current node, the Next node is found (this will
+         descend subtrees if the function 'Info-global-next' is bound);
+     (5) anywhere else (e.g@. at the end of a line), the current node entry is
+         scrolled up a windowful.
+  ASSIST
+     (1) the first line of an Info Menu Entry or Cross Reference, the desired
+         node is found;
+     (2) the Up,Next,or Previous entries of a Node Header (first line),
+         the last node in the history list is found;
+     (3) the File entry of a Node Header (first line),
+         the 'DIR' root-level node is found;
+     (4) at the end of the current node, the Previous node is found (this will
+         return from subtrees if the function 'Info-global-prev is bound);
+     (5) anywhere else (e.g@. at the end of a line), the current node entry is
+         scrolled down a windowful.
+@end group
+@end format
+
+@page
+@format
+@group
+If pressed within a Hyperbole-supported mail reader, 'hmail:reader', or mail
+summary mode, 'hmail:lister', buffer at:
+  ACTION
+     (1) a msg buffer, within the first line or at the end of a message,
+         the next undeleted message is displayed;
+     (2) a msg buffer within the first line of an Info cross reference, the
+         reference is followed;
+     (3) anywhere else in a msg buffer, the window is scrolled up one
+	 windowful;
+     (4) a msg summary buffer on a header entry, the message corresponding to
+         the header is displayed in the msg window;
+     (5) a msg summary buffer, on or after the last line, the messages marked
+         for deletion are expunged.
+  ASSIST
+     (1) a msg buffer, within the first line or at the end of a message,
+         the previous undeleted message is displayed;
+     (2) a msg buffer within the first line of an Info cross reference, the
+         reference is followed;
+     (3) anywhere else in a msg buffer, the window is scrolled down one
+         windowful;
+     (4) a msg summary buffer on a header entry, the message corresponding to
+         the header is marked as deleted;
+     (5) a msg summary buffer, on or after the last line, all messages are
+         marked undeleted.
+@end group
+@end format
+
+@format
+@group
+@cindex click, GNUS
+@cindex GNUS browsing
+If pressed within a GNUS listing of newsgroups buffer at:
+  ACTION
+     (1) a GNUS-GROUP line, that newsgroup is read;
+     (2) to the left of any GNUS-GROUP line, on any of the whitespace, the
+         current group is unsubscribed or resubscribed;
+     (3) at the end of the GNUS-GROUP buffer, after all lines, checks for new
+         news.
+  ASSIST
+     (1) a GNUS-GROUP line, that newsgroup is read;
+     (2) to the left of any GNUS-GROUP line, on any of the whitespace, the
+         user is prompted for a group name to subscribe or unsubscribe to;
+     (3) at the end of the GNUS-GROUP buffer, after all lines, quits from the
+         newsreader.
+@end group
+@end format
+
+@page
+@format
+@group
+If pressed within a GNUS newsreader subject listing buffer at:
+  ACTION
+     (1) a GNUS-SUBJECT line, that article is read, marked deleted, and
+         scrolled forward;
+     (2) at the end of the GNUS-SUBJECT buffer, the next undeleted article
+         is read or the next group is entered.
+  ASSIST
+     (1) a GNUS-SUBJECT line, that article is read and scrolled backward;
+     (2) at the end of the GNUS-SUBJECT buffer, the subject is exited, the
+         user is returned to group mode.
+@end group
+@end format
+
+@format
+@group
+If pressed within a GNUS newsreader article buffer at:
+  ACTION
+     (1) the first line or end of an article, the next unread message is
+         displayed;
+     (2) the first line of an Info cross reference, the reference is followed;
+     (3) anywhere else, the window is scrolled up a windowful.
+  ASSIST
+     (1) the first line or end of an article, the previous message is
+         displayed;
+     (2) the first line of an Info cross reference, the reference is followed;
+     (3) anywhere else, the window is scrolled down a windowful.
+@end group
+@end format
+
+@page
+@format
+@group
+@cindex click, buffer menu
+@cindex buffer menu
+If pressed within a listing of buffers (Buffer-menu-mode):
+  ACTION
+     (1) on the first column of an entry, the selected buffer is marked for
+         display;
+     (2) on the second column of an entry, the selected buffer is marked to be
+         saved;
+     (3) anywhere else within an entry line, all saves and deletes are done,
+         and selected buffers are displayed, including the one just clicked
+         on (if in the OO-Browser, only the selected buffer is displayed);
+     (4) on or after the last line in the buffer, all saves and deletes are
+         done.
+  ASSIST
+     (1) on the first or second column of an entry, the selected buffer is
+         unmarked for display and for saving or deletion;
+     (2) anywhere else within an entry line, the selected buffer is marked for
+         deletion;
+     (3) on or after the last line in the buffer, all display, save, and delete
+         marks on all entries are undone.
+@end group
+@end format
+
+@format
+@group
+@cindex click, dired
+@cindex dired browsing
+If pressed within a dired-mode buffer:
+  ACTION
+     (1) within an entry line, the selected file/directory is displayed
+         for editing in the other window;
+     (2) on or after the last line in the buffer, if any deletes are to be
+         performed, they are executed after user verification, otherwise, this
+         dired invocation is quit.
+  ASSIST
+     (1) on a '~' character, all backup files in the directory are marked for
+         deletion;
+     (2) on a '#' character, all auto-save files in the directory are marked
+         for deletion;
+     (3) anywhere else within an entry line, the current entry is marked for
+         deletion;
+     (4) on or after the last line in the buffer, all delete marks on all
+         entries are undone.
+@end group
+@end format
+
+@page
+@format
+@group
+@cindex click, tar
+@cindex tar archive browsing
+@cindex extracting from tar files
+If pressed within a tar-mode buffer:
+  ACTION
+     (1) within an entry line, the selected file/directory is displayed
+         for editing in the other window;
+     (2) on or after the last line in the buffer, if any deletes are to be
+         performed, they are executed after user verification, otherwise, this
+         tar file browser is quit.
+  ASSIST
+     (1) on an entry line, the current entry is marked for deletion;
+     (2) on or after the last line in the buffer, all delete marks on all
+         entries are undone.
+@end group
+@end format
+
+@format
+@group
+@cindex man page references
+If pressed on a cross reference within a man page entry section labeled
+NAME, SEE ALSO, or PACKAGES USED, or within a man page C routine
+specification (see 'smart-man-c-routine-ref') and man page buffer
+has either an attached file or else a @var{man-path} local variable
+containing its pathname:
+  ACTION or ASSIST
+     Displays man page or source code for cross reference.
+@end group
+@end format
+
+@format
+@group
+@cindex click, world-wide web
+@cindex W3
+@cindex URL
+@cindex world-wide web
+If pressed on a world-wide web universal resource locator:
+  ACTION
+     Displays the URL referent at point.
+  ASSIST
+     Goes back to a previously displayed web page.
+@end group
+@end format
+
+@format
+@group
+@cindex game, gomoku
+@cindex gomoku
+If pressed in a Gomoku game buffer.
+  ACTION
+     Makes a move at the space pointed to.
+  ASSIST
+     Takes back a prior move made at the space pointed to.
+@end group
+@end format
+
+@format
+@group
+@cindex click, wrolo matches
+@cindex wrolo matches
+If pressed within an entry in the wrolo match display buffer:
+  ACTION or ASSIST
+     The entry is edited in the other window.
+@end group
+@end format
+
+@node Outliner Keys, Suggestion or Bug Reporting, Smart Key Reference, Top
+@appendix Outliner Keys
+
+@cindex outliner keys
+This appendix summarizes the specialized key bindings available when
+editing an outline with Hyperbole.  Each key is shown together with its
+command binding and the documentation for that command.  Normal emacs
+editing keys are modified to account for the structure within outlines.
+An outliner command which overloads an Emacs command named @emph{cmd}
+would be named @emph{kotl-mode:cmd}.
+
+@table @code
+
+@findex kfile:write
+@item kfile:write  @{@kbd{C-x C-w}@}
+Write current outline to FILE.
+
+@findex klink:create
+@item klink:create  @{@kbd{C-c l}@}
+Insert at point an implicit link to REFERENCE.
+REFERENCE should be a cell-ref or a string containing "filename, cell-ref".
+See documentation for @code{kcell:ref-to-id} for valid cell-ref formats.
+
+@findex kotl-mode:add-cell
+@item kotl-mode:add-cell  @{@key{LFD}@}
+Add a cell following current cell at optional RELATIVE-LEVEL with CONTENTS string.
+Optional prefix arg RELATIVE-LEVEL means add as sibling if nil or >= 0, as child
+if equal to universal argument, @kbd{C-u}, and as sibling of current cell's
+parent, otherwise.  If added as sibling of current level, RELATIVE-LEVEL is
+used as a repeat count for the number of cells to add.
+
+Return last newly added cell.
+
+@findex kotl-mode:add-child
+@item kotl-mode:add-child  @{@kbd{C-c a}@}
+Add a new cell to current kview as first child of current cell.
+
+@findex kotl-mode:add-parent
+@item kotl-mode:add-parent  @{@kbd{C-c p}@}
+Add a new cell to current kview as sibling of current cell's parent.
+
+@findex kotl-mode:append-cell
+@item kotl-mode:append-cell  @{@kbd{C-c +}@}
+Append CONTENTS-CELL to APPEND-TO-CELL.
+APPEND-TO-CELL is refilled if neither cell has a no-fill property and
+kotl-mode:refill-flag is enabled.
+
+@findex kotl-mode:back-to-indentation
+@item kotl-mode:back-to-indentation  @{@kbd{M-m}@}
+Move point to the first non-read-only non-whitespace character on this line.
+
+@findex kotl-mode:backward-cell
+@item kotl-mode:backward-cell  @{@kbd{C-c C-b}@}
+Move to prefix ARGth prior cell (same level) within current view.
+Return number of cells left to move.
+
+@findex kotl-mode:backward-char
+@item kotl-mode:backward-char  @{@kbd{C-b}@}
+Move point backward ARG (or 1) characters and return point.
+
+@findex kotl-mode:backward-kill-word
+@item kotl-mode:backward-kill-word  @{@kbd{M-DEL}@}
+Kill up to prefix ARG words preceding point within a single cell.
+
+@findex kotl-mode:backward-sentence
+@item kotl-mode:backward-sentence  @{@kbd{M-a}@}
+Move point backward ARG (or 1) sentences and return point.
+
+@findex kotl-mode:backward-word
+@item kotl-mode:backward-word  @{@kbd{M-b}@}
+Move point backward ARG (or 1) words and return point.
+
+@findex kotl-mode:beginning-of-buffer
+@item kotl-mode:beginning-of-buffer  @{@kbd{M-<}@}
+Move point to beginning of buffer and return point.
+
+@findex kotl-mode:beginning-of-cell
+@item kotl-mode:beginning-of-cell  @{@kbd{C-c ,}@}
+Move point to beginning of current or ARGth - 1 prior cell and return point.
+
+@findex kotl-mode:beginning-of-line
+@item kotl-mode:beginning-of-line  @{@kbd{C-a}@}
+Move point to beginning of current or ARGth - 1 line and return point.
+
+@findex kotl-mode:beginning-of-tree
+@item kotl-mode:beginning-of-tree  @{@kbd{C-c ^}@}
+Move point to the level 1 root of the current cell's tree.
+Leave point at the start of the cell.
+
+@findex kotl-mode:center-line
+@item kotl-mode:center-line  @{@kbd{M-s}@}
+@vindex fill-column
+Center the line point is on, within the width specified by @var{fill-column}.
+This means adjusting the indentation so that it equals the distance between
+the end of the text and @var{fill-column}.
+
+@findex kotl-mode:center-paragraph
+@item kotl-mode:center-paragraph  @{@kbd{M-S}@}
+Center each nonblank line in the paragraph at or after point.
+See @code{center-line} for more info.
+
+@findex kotl-mode:copy-after
+@item kotl-mode:copy-after  @{@kbd{C-c c}@}
+Copy tree rooted at FROM-CELL-REF to follow tree rooted at TO-CELL-REF.
+If prefix arg CHILD-P is non-nil, make FROM-CELL-REF the first child of
+TO-CELL-REF, otherwise make it the sibling following TO-CELL-REF.
+
+Leave point at the start of the root cell of the new tree.
+
+@findex kotl-mode:copy-before
+@item kotl-mode:copy-before  @{@kbd{C-c C-c}@}
+Copy tree rooted at FROM-CELL-REF to precede tree rooted at TO-CELL-REF.
+If prefix arg PARENT-P is non-nil, make FROM-CELL-REF the first child of
+TO-CELL-REF's parent, otherwise make it the preceding sibling of TO-CELL-REF.
+
+Leave point at the start of the root cell of the new tree.
+
+@findex kotl-mode:copy-to-buffer
+@item kotl-mode:copy-to-buffer  @{@kbd{C-c M-c}@}
+Copy outline tree rooted at CELL-REF to a non-koutline BUFFER.
+Use 0 to copy the whole outline buffer.
+
+@findex kotl-mode:copy-to-register
+@item kotl-mode:copy-to-register  @{@kbd{C-x x}@}
+Copy into REGISTER the region START to END.
+With optional prefix arg DELETE-FLAG, delete region.
+
+@findex kotl-mode:delete-backward-char
+@item kotl-mode:delete-backward-char  @{@kbd{DEL}@}
+Delete up to the preceding prefix ARG characters.
+Return number of characters deleted.
+Optional KILL-FLAG non-nil means save in kill ring instead of deleting.
+Does not delete across cell boundaries.
+
+@findex kotl-mode:delete-blank-lines
+@item kotl-mode:delete-blank-lines  @{@kbd{C-x C-o}@}
+On blank line within a cell, delete all surrounding blank lines, leaving just one.
+On isolated blank line, delete that one.
+On nonblank line, delete all blank lines that follow it.
+
+If nothing but whitespace follows point until the end of a cell, delete all
+whitespace at the end of the cell.
+
+@findex kotl-mode:delete-char
+@item kotl-mode:delete-char  @{@kbd{C-d}@}
+Delete up to prefix ARG characters following point.
+Return number of characters deleted.
+Optional KILL-FLAG non-nil means save in kill ring instead of deleting.
+Does not delete across cell boundaries.
+
+@findex kotl-mode:delete-indentation
+@item kotl-mode:delete-indentation  @{@kbd{M-^}@}
+Join this line to previous and fix up whitespace at join.
+If there is a fill prefix, delete it from the beginning of this line.
+With argument, join this line to following line.
+
+@findex kotl-mode:demote-tree
+@vindex kotl-mode:refill-flag
+@item kotl-mode:demote-tree  @{@kbd{TAB}@}
+Move current kotl a maximum of prefix ARG levels lower in current view.
+Each cell is refilled iff its @emph{no-fill} attribute is nil and
+@var{kotl-mode:refill-flag} is non-nil.  With prefix ARG = 0, cells are
+demoted up to one level and kotl-mode:refill-flag is treated as true.
+
+@findex kotl-mode:down-level
+@item kotl-mode:down-level  @{@kbd{C-c C-d}@}
+Move down prefix ARG levels lower within current tree.
+
+@findex kotl-mode:end-of-buffer
+@item kotl-mode:end-of-buffer  @{@kbd{M->}@}
+Move point to end of buffer and return point.
+
+@findex kotl-mode:end-of-cell
+@item kotl-mode:end-of-cell  @{@kbd{C-c .}@}
+Move point to end of current or ARGth - 1 succeeding cell and return point.
+
+@findex kotl-mode:end-of-line
+@item kotl-mode:end-of-line  @{@kbd{C-e}@}
+Move point to end of current or ARGth - 1 line and return point.
+
+@findex kotl-mode:end-of-tree
+@item kotl-mode:end-of-tree  @{@kbd{C-c $}@}
+Move point to the last cell in tree rooted at the current cell.
+Leave point at the start of the cell.
+
+@findex kotl-mode:exchange-cells
+@item kotl-mode:exchange-cells  @{@kbd{C-c e}@}
+Exchange CELL-REF-1 with CELL-REF-2 in current view.  Don't move point.
+
+@findex kotl-mode:fill-cell
+@item kotl-mode:fill-cell  @{@kbd{C-c M-j}@}
+Fill current cell within current view if it does not have the 'no-fill attribute.
+With optional JUSTIFY, justify cell as well.
+IGNORE-COLLAPSED-P is used when caller has already expanded cell, indicating
+it is not collapsed.
+
+@findex kotl-mode:fill-paragraph
+@item kotl-mode:fill-paragraph  @{@kbd{C-x f}@}
+Fill current paragraph within cell.  With optional JUSTIFY, justify
+paragraph as well.  Ignore any non-nil no-fill attribute attached to the
+cell.
+
+@findex kotl-mode:fill-tree
+@item kotl-mode:fill-tree  @{@kbd{C-M-j}@}
+Refill each cell within the tree whose root is at point.
+
+@findex kotl-mode:first-sibling
+@item kotl-mode:first-sibling  @{@kbd{C-c <}@}
+Move point to the first sibling of the present cell.
+Leave point at the start of the cell or at its present position if it is
+already within the first sibling cell.
+
+@findex kotl-mode:fkey-backward-char
+@item kotl-mode:fkey-backward-char  @{@kbd{left}@}
+Move point backward ARG (or 1) characters and return point.
+
+@findex kotl-mode:fkey-forward-char
+@item kotl-mode:fkey-forward-char  @{@kbd{right}@}
+Move point forward ARG (or 1) characters and return point.
+
+@findex kotl-mode:fkey-next-line
+@item kotl-mode:fkey-next-line  @{@kbd{down}@}
+Move point to ARGth next line and return point.
+
+@findex kotl-mode:fkey-previous-line
+@item kotl-mode:fkey-previous-line  @{@kbd{up}@}
+Move point to ARGth previous line and return point.
+
+@findex kotl-mode:forward-cell
+@item kotl-mode:forward-cell  @{@kbd{C-c C-f}@}
+Move to prefix ARGth following cell (same level) within current view.
+Return number of cells left to move.
+
+@findex kotl-mode:forward-char
+@item kotl-mode:forward-char  @{@kbd{C-f}@}
+Move point forward ARG (or 1) characters and return point.
+
+@findex kotl-mode:forward-para
+@item kotl-mode:forward-para  @{@kbd{M-n}@}
+Move to prefix ARGth next cell (any level) within current view.
+
+@findex kotl-mode:forward-paragraph
+@item kotl-mode:forward-paragraph  @{@kbd{M-]}@}
+Move to prefix ARGth next cell (any level) within current view.
+
+@findex kotl-mode:forward-sentence
+@item kotl-mode:forward-sentence  @{@kbd{M-e}@}
+Move point forward ARG (or 1) sentences and return point.
+
+@findex kotl-mode:forward-word
+@item kotl-mode:forward-word  @{@kbd{M-f}@}
+Move point forward ARG (or 1) words and return point.
+
+@findex kotl-mode:goto-cell
+@item kotl-mode:goto-cell  @{@kbd{C-c g}@}
+Move point to start of cell given by CELL-REF.  (See 'kcell:ref-to-id'.)
+Return point iff CELL-REF is found within current view.
+With a prefix argument, CELL-REF is assigned the argument value for use
+as an idstamp.
+
+Optional second arg, ERROR-P, non-nil means signal an error if CELL-REF is
+not found within current view.  Will signal same error if called
+interactively when CELL-REF is not found.
+
+@findex kotl-mode:hide-sublevels
+@item kotl-mode:hide-sublevels  @{@kbd{C-X $}@}
+Hide all cells in outline at levels deeper than LEVELS-TO-KEEP (a
+number). Shows any hidden cells within LEVELS-TO-KEEP.  1 is the first
+level.
+
+@findex kotl-mode:hide-subtree
+@item kotl-mode:hide-subtree  @{@kbd{C-M-h}@}
+Hide subtree, ignoring root, at optional CELL-REF (defaults to cell at
+point).
+
+@findex kotl-mode:hide-tree
+@item kotl-mode:hide-tree  @{@kbd{C-c BS}@}
+Collapse kotl rooted at optional CELL-REF (defaults to cell at point).
+
+@findex kotl-mode:insert-file
+@item kotl-mode:insert-file  @{@kbd{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).
+
+@findex kotl-mode:insert-register
+@item kotl-mode:insert-register  @{@kbd{C-c r i}@}
+Insert contents of register REGISTER at point in current cell.
+REGISTER is a character naming the register to insert.
+Normally puts point before and mark after the inserted text.
+If optional second arg is non-nil, puts mark before and point after.
+Interactively, second arg is non-nil if prefix arg is supplied.
+
+@findex kotl-mode:just-one-space
+@item kotl-mode:just-one-space  @{@kbd{M-\}@}
+Delete all spaces and tabs around point and leave one space.
+
+@findex kotl-mode:kcell-help
+@item kotl-mode:kcell-help  @{@kbd{C-c h}@}
+Display a temporary buffer with CELL-REF's properties.
+CELL-REF defaults to current cell.
+Optional prefix arg CELLS-FLAG selects the cells to print:
+  If = 1, print CELL-REF's cell only;
+  If > 1, print CELL-REF's visible kotl (the tree rooted at CELL-REF);
+  If < 1, print all visible cells in current view  (CELL-REF is not used).
+
+See also the documentation for @code{kotl-mode:properties}.
+
+@findex kotl-mode:kill-contents
+@item kotl-mode:kill-contents  @{@kbd{C-c k}@}
+Kill contents of cell from point to cell end.
+With prefix ARG, kill entire cell contents.
+
+@findex kotl-mode:kill-line
+@item kotl-mode:kill-line  @{@kbd{C-k}@}
+Kill ARG lines from point.
+
+@findex kotl-mode:kill-region
+@item kotl-mode:kill-region  @{@kbd{C-w}@}
+Kill region between START and END within a single kcell.
+With optional COPY-P equal to 't, copy region to kill ring but does not
+kill it.  With COPY-P any other non-nil value, return region as a
+string without affecting kill ring.
+
+If the buffer is read-only and COPY-P is nil, the region will not be deleted
+but it will be copied to the kill ring and then an error will be signaled.
+
+@findex kotl-mode:kill-ring-save
+@item kotl-mode:kill-ring-save  @{@kbd{M-w}@}
+Copy region between START and END within a single kcell to kill ring.
+
+@findex kotl-mode:kill-sentence
+@item kotl-mode:kill-sentence  @{@kbd{M-k}@}
+Kill up to prefix ARG (or 1) sentences following point within a single cell.
+
+@findex kotl-mode:kill-tree
+@item kotl-mode:kill-tree  @{@kbd{C-c C-k}@}
+Kill ARG following trees starting with tree rooted at point.
+If ARG is not a non-positive number, nothing is done.
+
+@findex kotl-mode:kill-word
+@item kotl-mode:kill-word  @{@kbd{M-d}@}
+Kill up to prefix ARG words following point within a single cell.
+
+@findex kotl-mode:last-sibling
+@item kotl-mode:last-sibling  @{@kbd{C-c >}@}
+Move point to the last sibling of the present cell.
+Leave point at the start of the cell or at its present position if it is
+already within the last sibling cell.
+
+@findex kotl-mode:mail-tree
+@item kotl-mode:mail-tree  @{@kbd{C-c @@}@}
+Mail outline tree rooted at CELL-REF.  Use "0" for whole outline buffer.
+
+@findex kotl-mode:move-after
+@item kotl-mode:move-after  @{@kbd{C-c m}@}
+Move tree rooted at FROM-CELL-REF to follow tree rooted at TO-CELL-REF.
+If prefix arg CHILD-P is non-nil, make FROM-CELL-REF the first child of
+TO-CELL-REF, otherwise make it the sibling following TO-CELL-REF.
+With optional COPY-P, copies tree rather than moving it.
+
+Leave point at original location but return the tree's new start point.
+
+@findex kotl-mode:move-before
+@item kotl-mode:move-before  @{@kbd{C-c RET}@}
+Move tree rooted at FROM-CELL-REF to precede tree rooted at TO-CELL-REF.
+If prefix arg PARENT-P is non-nil, make FROM-CELL-REF the first child of
+TO-CELL-REF's parent, otherwise make it the preceding sibling of TO-CELL-REF.
+With optional COPY-P, copies tree rather than moving it.
+
+Leave point at original location but return the tree's new start point.
+
+@findex kotl-mode:newline
+@item kotl-mode:newline  @{@kbd{RET}@}
+Insert a newline.  With ARG, insert ARG newlines.
+In Auto Fill mode, if no numeric arg, break the preceding line if it is
+too long.
+
+@findex kotl-mode:next-cell
+@item kotl-mode:next-cell  @{@kbd{C-c C-n}@}
+Move to prefix ARGth next cell (any level) within current view.
+
+@findex kotl-mode:next-line
+@item kotl-mode:next-line  @{@kbd{C-n}@}
+Move point to ARGth next line and return point.
+
+@findex kotl-mode:open-line
+@item kotl-mode:open-line  @{@kbd{C-o}@}
+Insert a newline and leave point before it.
+With arg N, insert N newlines.
+
+@findex kotl-mode:overview
+@item kotl-mode:overview  @{@kbd{C-c C-o}@}
+Show only the first line of each cell in the current outline.
+
+@findex kotl-mode:previous-cell
+@item kotl-mode:previous-cell  @{@kbd{C-c C-p}@}
+Move to prefix ARGth previous cell (any level) within current view.
+
+@findex kotl-mode:previous-line
+@item kotl-mode:previous-line  @{@kbd{C-p}@}
+Move point to ARGth previous line and return point.
+
+@findex kotl-mode:promote-tree
+@vindex kotl-mode:refill-flag
+@item kotl-mode:promote-tree  @{@kbd{M-TAB}@}
+Move current kotl a maximum of prefix ARG levels higher in current view.
+Each cell is refilled iff its @emph{no-fill} attribute is nil and
+@var{kotl-mode:refill-flag} is non-nil.  With prefix ARG = 0, cells are
+promoted up to one level and kotl-mode:refill-flag is treated as true.
+
+@findex kotl-mode:scroll-down
+@item kotl-mode:scroll-down  @{@kbd{M-v}@}
+Scroll text of current window downward ARG lines; or a windowful if no ARG.
+
+@findex kotl-mode:scroll-up
+@item kotl-mode:scroll-up  @{@kbd{C-v}@}
+Scroll text of current window upward ARG lines; or a windowful if no ARG.
+
+@findex kotl-mode:set-cell-attribute
+@item kotl-mode:set-cell-attribute  @{@kbd{C-c C-i}@}
+Include ATTRIBUTE VALUE with the current cell or the cell at optional POS.
+Replaces any existing value that ATTRIBUTE has.
+When called interactively, it displays the setting in the minibuffer as
+confirmation.
+
+@findex kotl-mode:set-fill-prefix
+@item kotl-mode:set-fill-prefix  @{@kbd{C-x l}@}
+Sets fill prefix to line up to point.
+With prefix arg TURN-OFF or at begin of line, turns fill prefix off.
+
+@findex kotl-mode:show-all
+@item kotl-mode:show-all  @{@kbd{C-c C-a}@}
+Show (expand) all cells in current view.
+
+@findex kotl-mode:show-subtree
+@item kotl-mode:show-subtree
+Show subtree, ignoring root, at optional CELL-REF (defaults to cell at
+point).
+
+@findex kotl-mode:show-tree
+@item kotl-mode:show-tree  @{@kbd{C-c C-s}@}
+Display fully expanded kotl rooted at CELL-REF.
+
+@findex kotl-mode:split-cell
+@item kotl-mode:split-cell  @{@kbd{C-c s}@}
+Split cell into two cells and move to new cell.
+Cell contents after point become part of newly created cell.
+Default is to create new cell as sibling of current cell.
+With optional universal ARG, @kbd{C-u}, new cell is added as child of
+current cell.
+
+@findex kotl-mode:top-cells
+@item kotl-mode:top-cells  @{@kbd{C-c C-t}@}
+Collapse all level 1 cells in view and hide any deeper sublevels.
+
+@findex kotl-mode:transpose-cells
+@item kotl-mode:transpose-cells  @{@kbd{C-c t}@}
+Exchange current and previous visible cells, leaving point after both.
+If no previous cell, exchange current with next cell.
+With prefix ARG, take current cell and move it past ARG cells.
+With prefix ARG = 0, interchange the cell that contains point with the cell
+that contains mark.
+
+@findex kotl-mode:transpose-chars
+@item kotl-mode:transpose-chars  @{@kbd{C-t}@}
+Interchange characters around point, moving forward one character.
+With prefix ARG, take character before point and drag it forward past ARG
+other characters (backward if ARG negative).
+If no prefix ARG and at end of line, the previous two characters are
+exchanged.
+
+@findex kotl-mode:transpose-lines
+@item kotl-mode:transpose-lines  @{@kbd{C-x C-t}@}
+Exchange current line and previous line, leaving point after both.
+If no previous line, exchange current with next line.
+With prefix ARG, take previous line and move it past ARG lines.
+With prefix ARG = 0, interchange the line that contains point with the line
+that contains mark.
+
+@findex kotl-mode:transpose-words
+@item kotl-mode:transpose-words  @{@kbd{M-t}@}
+Interchange words around point, leaving point after both words.
+With prefix ARG, take word before or around point and drag it forward past
+ARG other words (backward if ARG negative).  If ARG is zero, the words around
+or after point and around or after mark are interchanged.
+
+@findex kotl-mode:up-level
+@item kotl-mode:up-level  @{@kbd{C-c C-u}@}
+Move up prefix ARG levels higher in current outline view.
+
+@findex kotl-mode:yank
+@item kotl-mode:yank  @{@kbd{C-y}@}
+Reinsert the last stretch of killed text.
+More precisely, reinsert the stretch of killed text most recently
+killed OR yanked.  Put point at end, and set mark at beginning.
+With just C-u as argument, same but put point at beginning (and mark at end).
+With argument N, reinsert the Nth most recently killed stretch of killed
+text.
+See also the command M-x kotl-mode:yank-pop.
+
+@findex kotl-mode:yank-pop
+@item kotl-mode:yank-pop  @{@kbd{M-y}@}
+Replace just-yanked stretch of killed text with a different stretch.
+This command is allowed only immediately after a @code{yank} or a
+@code{yank-pop}.  At such a time, the region contains a stretch of
+reinserted previously-killed text.  @code{yank-pop} deletes that text
+and inserts in its place a different stretch of killed text.
+
+With no argument, the previous kill is inserted.
+With argument N, insert the Nth previous kill.
+If N is negative, this is a more recent kill.
+
+The sequence of kills wraps around, so that after the oldest one
+comes the newest one.
+
+@findex kotl-mode:zap-to-char
+@item kotl-mode:zap-to-char  @{@kbd{M-z}@}
+Kill up to and including prefix ARG'th occurrence of CHAR.
+Goes backward if ARG is negative; error if CHAR not found.
+
+@findex kview:set-label-type
+@item kview:set-label-type  @{@kbd{C-c C-l}@}
+Change kview's label display type to NEW-TYPE, updating all displayed labels.
+See documentation for variable, kview:default-label-type, for
+valid values of NEW-TYPE.
+
+@findex kvspec:activate
+@item kvspec:activate  @{@kbd{C-c C-v}@}
+Activate optional VIEW-SPEC or existing view spec in the current koutline.
+VIEW-SPEC is a string.  See <$@{hyperb:dir@}/kotl/EXAMPLE.kotl, 2b17=048> for
+details on valid view specs.
+
+@findex kvspec:toggle-blank-lines
+@item kvspec:toggle-blank-lines @{@kbd{C-c b}@}
+Toggle blank lines between cells on or off.
+
+@end table
+
+@node Suggestion or Bug Reporting, Questions and Answers, Outliner Keys, Top
+@appendix Suggestion or Bug Reporting
+
+@xref{Mail Lists}, for complete details on Hyperbole mailing lists and
+how to subscribe.
+
+@cindex version description
+@cindex Hyperbole version
+If you find any errors in Hyperbole's operation or documentation, feel
+free to report them to the Hyperbole discussion list:
+<hyperbole@@hub.ucsb.edu>.  Be sure to use the Msg/Compose-Hypb-Mail
+minibuffer menu item whenever you send a message to the mail list since
+it will insert important system version information for you.
+
+If you use Hyperbole mail or news support, @ref{Buttons in Mail}, a
+click with your Action Key on the Hyperbole mail list address
+will insert a description of your Hyperbole configuration information
+into your outgoing message, so that you do not have to type it.  This is
+useful when composing a reply for the Hyperbole mail list.  Otherwise,
+be sure to include your Emacs, Hyperbole and window system versions in
+your message.  Your Hyperbole version number can be found in the
+top-level Hyperbole menu.
+
+Please use your subject line to state the position that your message
+takes on the topic that it addresses, e.g@. send "Subject: Basic bug in
+top-level Hyperbole menu." rather than "Subject: Hyperbole bug".  This
+simple rule makes all e-mail communication much easier.
+
+If you have suggestions on how to improve Hyperbole, send them to the
+same address.  Here are some issues you might address:
+
+@itemize @bullet
+@item
+What did you like and dislike about the system?
+@item
+What kinds of tasks, if any, does it seem to help you with?
+@item
+What did you think of the Emacs-based user interface?
+@item
+How was the Hyperbole Manual and other documentation?
+@item
+Was the setup trivial, average or hard?
+@item
+What areas of Hyperbole would you like to see expanded/added?
+@item
+How does it compare to other hypertext tools you have used?
+@item
+Was it easy or difficult to create your own types?  Why?
+@item
+Did you get any use out of the external system encapsulations?
+@end itemize
+
+@node Questions and Answers, Future Work, Suggestion or Bug Reporting, Top
+@appendix Questions and Answers
+
+@table @emph
+@cindex Smart Key
+@cindex mouse key bindings
+@findex hmouse-setup
+@findex hmouse-get-bindings
+@vindex file, hmouse-sh.el
+@vindex file, hmouse-reg.el
+@item How can I change the Smart Mouse Key bindings?
+@findex hmouse-shift-buttons
+Since the Smart Mouse Keys are set up for use under five different Emacs
+configurations, there is no easy way to provide user level
+customization.  The command, @code{hmouse-shift-buttons}, can be used to
+select between shifted and unshifted Smart Mouse Keys.  Any other mouse
+key binding changes must be done by editing the @code{hmouse-setup} and
+@code{hmouse-get-bindings} functions in the @file{hmouse-sh.el} and
+@file{hmouse-reg.el} files.
+
+@vindex file, hmouse-key.el
+@vindex file, hui-window.el
+@vindex hkey-alist
+@vindex hmouse-alist
+The @var{hkey-alist} and @var{hmouse-alist} variable
+settings in @file{hui-mouse.el} and @file{hui-window.el} must be altered
+if you want to change what the Smart Keys do in particular contexts.
+You should then update the Smart Key summary documentation in the file,
+@file{hypb-mouse.txt}, and potentially the same summary in this manual.
+
+
+@item Missing Action Types
+
+What if someone sends a mail message with a button for which I do
+not have the action type?  Or a button whose link referent I can't access?
+
+You receive an error that an action type is not defined or a link
+referent is not accessible/readable if you try to use the button.  This
+is hardly different than trying to get through a locked door without a
+key; you try the doorknob, find that it is locked, and then realize that
+you need to take a different approach or else give up.
+
+Like all communication, people need to coordinate, which usually
+requires an iterative process.  If you get a mail message with a button
+for which you don't have the action type, you mail the sender and
+request it.
+
+@cindex global button, modify
+@item How can I modify a number of global buttons in succession?
+
+Rather than typing the name for each, it is quicker to jump to the
+global button file and edit the buttons there as you would any explicit
+buttons.  By default, the ButFile/PersonalFile menu item takes you to
+the file where global buttons are saved.
+
+@item Why is all the button data scattered across directories?
+
+When you think of a hyper-space that you depend on every day, you don't
+want to have a single point of failure make you incapable of doing work.
+With Hyperbole, if some directories become unavailable for a particular
+time (e.g@. the filesystems on which they reside are dismounted) you can
+still work elsewhere with minimal effect.  We believe this to be a
+compelling factor to leave the design with external button data storage.
+
+This design also permits the potential addition of buttons to read-only
+media.
+
+@item Why are action types defined separately from their implicit button types?
+
+Any category of button can make use of an action type.  Some action types
+are useful as behavior definitions for a variety of button categories,
+so all action types are defined separately to give them independence
+from those types which apply them.
+
+For implicit button types that require a lot of code, it is useful to
+add a module that includes the implicit button type definition, its
+action type definition and supporting code.
+
+@end table
+
+
+@node Future Work, References, Questions and Answers, Top
+@appendix Future Work
+
+@noindent
+This appendix is included for a number of reasons:
+
+@itemize @bullet
+@item
+to better allow you to assess whether to work with Hyperbole by
+providing sketches of possible additions:
+@item
+to direct further development effort towards known needs;
+@item
+and to acknowledge known weaknesses in the current system.
+@end itemize
+
+@table @asis
+
+Note that due to a lack of volunteers to further develop Hyperbole, much
+of this work may not be done.  So if you want to see these features,
+encourage qualified people to volunteer.
+
+@item Button Copying, Killing, and Yanking
+There is as yet no means of transferring explicit buttons among buffers.
+We realize this is a critical need.  Users should be able to manipulate
+text with embedded buttons in ordinary ways.  This will probably be
+implemented only for versions of Emacs 19 and higher.  It will store the
+button attributes as text attributes within the buffers so that if a
+button is copied, its attributes follow.  When a buffer is saved, the
+attributes also will be saved.
+
+@item Trails
+Trails are an extension to the basic history mechanism presently offered
+by Hyperbole.  Trails will allow a user to capture, edit and store a
+specific sequence and set of views of information for later replay by
+other users.  Conditional branching may also be supported.
+
+@item Outliner View Mode
+This will complement the outliner editing mode by using simple one
+character keys that normally insert characters to instead modify the
+view of an outline and to move around in it, for ease of study.
+Switching between view and edit modes will also be simple.
+
+@item Storage of button data within button source files
+The current design choice of storing buttons external to the source file
+was made under the assumption that people should be able to look at
+files that contain Hyperbole buttons with any standard editor or tool
+and not be bothered by the ugly button data (since they won't be able to
+utilize the buttons anyway, they don't need to see or have access to
+them).
+
+In many contexts, embedding the button data within the source files may
+be a better choice, so a provision which would allow selection of either
+configuration may be added.  Here are some of the PROs and CONs of both
+design choices:
+@sp 1
+
+@example
+@group
+           POSITIVE                        NEGATIVE
+
+Button data in source file
+           Documents can stand alone.      All edit operators have
+           Normal file operations apply.   to account for file
+                                           structure and hide
+           Simplifies creation and         internal components.
+           facility expansion for
+           structured and multi-media
+           files.
+
+Button data external to source file
+           Files can be displayed and      Currently, bdata for
+           printed exactly as they look.   whole directory is
+           No special display formatting   locked when any bdata
+           is necessary.                   entry is locked.
+
+           Button-based searches and
+           database-type lookup operations
+           need only search one file
+           per directory.
+@end group
+@end example
+@sp 2
+
+@item Forms-based Interfaces
+
+This will allow one to create buttons more flexibly.  For example, button
+attributes could be given in any order.  Entry of long code sequences,
+quick note taking and cross-referencing would also be made easier.
+
+@item Collaboration Support
+
+From the early stages of Hyperbole design, collaborative work
+environments have been considered.  A simple facility has demonstrated
+broadcast of button activations to a number of workstations on a local
+area network, so that one user can lead others around an information
+space, as during an online design review.  (This facility was never
+adapted to the current Hyperbole release, however.)  We shall do some
+work in specific collaborative mechanisms, but we also expect that
+others who concentrate in collaborative work will provide more extensive
+capabilities.
+
+@end table
+
+@node References, Key Binding Index, Future Work, Top
+@appendix References
+
+@table @b
+@item [AkMcYo88]
+Akscyn, R. M., D. L. McCracken and E. A. Yoder. KMS: A
+Distributed Hypermedia System for Managing Knowledge in Organizations.
+@emph{Communications of the ACM}, Vol. 31, No. 7, July 1988, pp. 820-835.
+
+@item [Bro87]
+Brown, P. J. Turning Ideas into Products: The Guide System.
+@emph{Proceedings of Hypertext '87}, November 13-15, 1987, Chapel Hill, NC.
+ACM: NY, NY, pp. 33-40.
+
+@item [Con87]
+Conklin, Jeff. Hypertext: An Introduction and Survey. @emph{IEEE
+Computer}, Vol. 20, No. 9, September 1987, pp. 17-41.
+
+@item [Eng68]
+Engelbart, D., and W. English.  A research center for augmenting
+human intellect. @emph{Proceedings of the Fall Joint Computer Conference},
+33, 1, AFIPS Press: Montvale, NJ, 1968, pp. 395-410.
+
+@item [Eng84a]
+Engelbart, D. C. Authorship Provisions in Augment.
+@emph{Proceedings of the 1984 COMPCON Conference (COMPCON '84 Digest)},
+February 27-March 1, 1984, San Francisco, CA. IEEE Computer Society Press,
+Spring, 1984.  465-472. (OAD,2250,)
+
+@item [Eng84b]
+Engelbart, D. C. Collaboration Support Provisions in Augment.
+@emph{Proceedings of the AFIPS Office Automation Conference (OAC '84 Digest)},
+February, 1984, Los Angeles, CA, 1984. 51-58. (OAD,2221,)
+
+@item [Fos88]
+Foss, C. L. Effective Browsing in Hypertext Systems.
+@emph{Proceedings of the Conference on User-Oriented Content-Based Text and
+Image Handling (RIAO 88)}, March 21-24, MIT, Cambridge MA. Centre de Hautes
+Etudes Internationales d'Informatique Documentaire, 1988, pp. 82-98.
+
+@item [GaSmMe86]
+Garrett, N., K. E. Smith and N. Meyrowitz. Intermedia: Issues,
+Strategies, and Tactics in the Design of a Hypermedia Document System.
+@emph{Computer-Supported Cooperative Work (CSCW '86) Proceedings}, December
+3-5, Austin, TX, 1986, pp. 163-174.
+
+@item [HaMoTr87]
+Halasz, F. G., T. P. Moran and R. H. Trigg. NoteCards in a
+Nutshell. @emph{Proceedings of the CHI and GI '87 Conference on Human Factors
+in Computing Systems}, Toronto, J. M. Carroll and P. P. Tanner, (editors),
+ACM: NY, NY, April 1987, pp. 45-52.
+
+@item [Har88]
+Harvey, G. @emph{Understanding HyperCard.} Alameda, CA: SYBEX, Inc.,
+1988.
+
+@item [KaCaLoLa92]
+Kaplan, S., A. M. Carroll, C. Love and D. M. LaLiberte.
+@emph{Epoch 4.0 Manual.} Department of Computer Science, University of
+Illinois, Urbana, March 1992.
+
+@item [KaKaBeLaDr90]
+Kaplan, S. J., M. D. Kapor, E. J. Belove, R. A.  Landsman, and
+T. R. Drake.  AGENDA: A personal Information Manager.  @emph{Communications
+of the ACM}, No. 33, July 1990, pp. 105-116.
+
+@item [Nel87a]
+Nelson, T. H.  @emph{Computer Lib/Dream Machines.} MicroSoft Press,
+Redmond, WA, 1987.
+
+@item [Nel87b]
+Nelson, T. H. @emph{Literary Machines, Edition 87.1}.  Available
+from the Distributors, 702 South Michigan, South Bend, IN 46618, 1987.
+
+@item [NoDr86]
+Norman, D. A. and S. W. Draper, editors.  @emph{User Centered System
+Design.} Lawrence Erlbaum Associates: Hillsdale, New Jersey, 1986.
+
+@item [Shn82]
+Shneiderman, B. The future of interactive systems and the emergence
+of direct manipulation.  @emph{Behavior and Information Technology}, Vol. 1,
+1982, pp. 237-256.
+
+@item [Sta87]
+Stallman, R.  @emph{GNU Emacs Manual.} Free Software Foundation,
+Cambridge: MA, March 1987.
+
+@item [Tri86]
+Trigg, R., L. Suchman, and F. Halasz.  Supporting collaboration in
+NoteCards.  @emph{Proceedings of the CSCW '86 Conference}, Austin, TX,
+December 1986, pp. 147-153.
+
+@item [TrMoHa87]
+Trigg, R. H., T. P. Moran and F. G. Halasz.  Adaptability and
+Tailorability in NoteCards. @emph{Proceedings of INTERACT '87}, Stuttgart,
+West Germany, September 1987.
+
+@item [Wei92]
+Weiner, B.  @emph{PIEmail: A Personalized Information Environment
+Mail Tool.}  Department of Computer Science Masters Project, Brown
+University: Providence, RI, May 10, 1992.
+
+@item [YaHaMeDr88]
+Yankelovich, N., B. J. Haan, N. Meyrowitz and S. M.  Drucker.
+Intermedia: The Concept and the Construction of a Seamless Information
+Environment. @emph{IEEE Computer}, Vol. 21, No. 1, January 1988, pp.  81-96.
+
+@item [YoAkMc89]
+Yoder, E. A., R. M. Akscyn and D. L. McCracken.  Collaboration in
+KMS, A Shared Hypermedia System. @emph{Proceedings of the 1989 ACM Conference
+on Human Factors in Computer Systems (CHI '89)}, April 30-May 4, 1989,
+Austin, TX, ACM: NY,NY, 1989, pp. 37-42.
+
+@end table
+
+
+@c ***************************
+@c Indices
+@c ***************************
+
+@node Key Binding Index, Code and File Index, References, Top
+@unnumbered Key Binding Index
+
+@printindex ky
+
+@node Code and File Index, Concept Index, Key Binding Index, Top
+@unnumbered Code and File Index
+
+@printindex fn
+
+@node Concept Index,  , Code and File Index, Top
+@unnumbered Concept Index
+
+@printindex cp
+
+@page
+@summarycontents
+@contents
+@bye