Updated link to gemini gopher page in README.
[elpher.git] / elpher.texi
index 725f927..0de237c 100644 (file)
@@ -1,8 +1,12 @@
 \input texinfo @c -*-texinfo-*-
-@c %**start of header
+
 @setfilename elpher.info
-@settitle Elpher Manual v1.0.0
-@c %**end of header
+@settitle Elpher Manual v2.0.0
+
+@dircategory Emacs
+@direntry
+* Elpher: (elpher).     A gopher client for Emacs.
+@end direntry
 
 @copying
 This manual documents Elpher, a gopher client for Emacs.
@@ -40,6 +44,11 @@ the file COPYING in the same directory as this file for more details.
 @insertcopying
 @end ifnottex
 
+@macro keycmd{key,cmd}
+@item \key\  (@code{\cmd\})
+@findex \cmd\
+@end macro
+
 @menu
 * Introduction::                Elpher Overview: what's this all about?
 * Installation::                Installing Elpher
@@ -47,8 +56,21 @@ the file COPYING in the same directory as this file for more details.
 * Navigation::                  Fundamentals of Elpher navigation
 * Bookmarks::                   How to record and visit bookmarks
 * Character encodings::         How Elpher handles different character encodings
+* Encrypted connections::       How and when TLS is enabled
+* Gemini support::              Support for the Gemini protocol
 * Customization::               How to customize various aspects of Elpher
-* Index::
+* Command Index::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Navigation
+
+* Within-page navigation::      Moving about within a page
+* Between-page navigation::     Commands for moving between pages
+* History and Caching::         Explanation of how Elpher represents history
+
+@end detailmenu
 @end menu
 
 @node Introduction, Installation, Top, Top
@@ -61,6 +83,9 @@ robust and behave in non-surprising ways at all times.  Additionally,
 Elpher provides the following bells and whistles:
 
 @itemize
+@item
+followable web and gopher links in plain text,
+
 @item
 an easily navigable history, sporting caching of visited pages (both
 content and cursor position),
@@ -69,20 +94,21 @@ content and cursor position),
 auto-completing menu item navigation,
 
 @item
-followable web and gopher links in plain text,
+direct visualization of image files where supported (no writing to
+disk),
 
 @item
-direct visualization of image files where supported (no writing to
-disk), and
+a bookmark management system,
 
 @item
-a simple bookmark management system.
+basic support for the new ``heavier than gopher, lighter than the web'' Gemini protocol.
+
 @end itemize
 
 Elpher is still under active development.  Although we try very hard to
 ensure that releases are bug-free, this cannot be guaranteed.  However,
 this also means that any usability features that you feel are missing
-can likely by incoroporated quickly, so please get in touch if you
+can likely by incorporated quickly, so please get in touch if you
 have some ideas.
 
 @node Installation, Quick Start, Introduction, Top
@@ -106,7 +132,7 @@ to follow the instructions at @url{https://melpa.org/#/getting-started}.
 
 While not recommended, it is also possible to install Elpher directly by
 downloading the file @file{elpher.el} from
-@url{https://github.com/tgvaughan/elpher}, adding it to a directory in
+@url{gopher://thelambdalab.xyz/1/projects/elpher/}, adding it to a directory in
 your @code{load-path}, and then adding
 
 @example
@@ -131,7 +157,7 @@ Once installed, you can launch Elpher using
 page, with information on each of the default keyboard bindings.
 
 From here you can move point between links (which may be menu items or
-inline URLs in text files) by using @key{TAB} and @kbd{Shift-TAB} keys,
+inline URLs in text files) by using @key{TAB} and @kbd{S-@key{TAB}},
 as in Info.  You can also jump directly to a menu item using @key{m}, or
 use the standard Emacs or Evil motion and search commands to find your
 way around.  To open a link, press @key{RET}.  (Where a mouse is
@@ -175,7 +201,8 @@ coupled with caching of pages and cursor position.
 
 @menu
 * Within-page navigation::      Moving about within a page
-* Between-page navigation::     Concepts and commands for moving between pages
+* Between-page navigation::     Commands for moving between pages
+* History and Caching::         Explanation of how Elpher represents history
 @end menu
 
 
@@ -190,13 +217,13 @@ In addition, the following commands are provided for quickly moving between
 links and menu items.
 
 @table @asis
-@item @kbd{tab}  (@code{elpher-next-link})
+@keycmd{@key{TAB}, elpher-next-link}
 Move to the next link or menu item in the file.
 
-@item @kbd{<S-tab>}/@kbd{<backtab>}  (@code{elpher-prev-link})
+@keycmd{@kbd{Shift-@key{TAB}}/@key{backtab}, @code{elpher-prev-link}}
 Move to the previous link or menu item in the file.
 
-@item @kbd{m}  (@code{elpher-jump})
+@keycmd{@key{m}, elpher-jump}
 Jump directly to a link within a file by specifying its display string
 or link text.  (Unlike the previous two commands, this immediately opens
 the selected link.
@@ -206,37 +233,50 @@ The following commands can be used to retrieve information about the
 current page, or the address of the link at point:
 
 @table @asis
-@item @kbd{i}  (@code{elpher-info-link})
+@keycmd{@key{i}, elpher-info-link}
 Display host, port and selector information for the link at point.
 
-@item @kbd{I}  (@code{elpher-info-current})
+@keycmd{@key{I}, elpher-info-current}
 Display host, port and selector information for the current page.
 
-@item @kbd{c}  (@code{elpher-copy-link-url})
+@keycmd{@key{c}, elpher-copy-link-url}
 Add URL representing address of link at point to the kill-ring and the
 system clipboard (if available).
 
-@item @kbd{C}  (@code{elpher-copy-current-url})
+@keycmd{@key{C}, elpher-copy-current-url}
 Add URL representing address of the current page to the kill-ring and
 the system clipboard (if available).
-@end table
 
+@keycmd{@key{d}, elpher-download}
+Download link at point and save the result as a file.  The minibuffer
+will prompt for the name of the file to write, with the default name being
+the display string (if available) associated with the link.
 
-@node Between-page navigation,  , Within-page navigation, Navigation
+@keycmd{@key{D}, elpher-download-current}
+This is similar to @code{elpher-download}, but instead applies to the
+current page rather than a link.
+
+@keycmd{@key{.}, elpher-view-raw}
+This displays the raw server response for the current page.  While not
+useful for general browsing, it is useful for debugging incorrect rendering
+or out-of-spec server responses.
+@end table
+
+@node Between-page navigation, History and Caching, Within-page navigation, Navigation
 @section Between-page navigation
 
 Moving to a different page can be accomplished in several ways,
 described by the following command:
 
 @table @asis
-@item @kbd{RET}, @kbd{mouse-1}  (@code{elpher-follow-link})
+@keycmd{@key{RET}\, @kbd{mouse-1}, elpher-follow-link}
 Follow the menu item or link at point (or selected with the mouse).
 
 Exactly what is meant by ``follow'' depends on the kind of item selected:
 
 @itemize
 @item
-For text or menu type items or links, the curent page text is replaced
+For text or menu type items or links, the current page text is replaced
 by the text of this item.  Unless the customization variable
 @code{elpher-use-header} (@pxref{Customization}) is 
 @code{nil}, the display string of the link is displayed in the buffer header.
@@ -251,34 +291,230 @@ items.
 @item
 Following links to binary files (and image files on unsupported systems)
 causes Elpher to prompt for a filename in which to save the content.
+
+@item
+Following links of type `h' with a selector having the `URL:' prefix, or
+non-gopher URLs in text files, will result in Elpher using an external
+programme to open the URL.  This will be either the default system browser
+or, if the @code{elpher-open-urls-with-eww} customization variable is non-nil,
+Emacs' own EWW browser. (See @pxref{Customization}.) 
+
 @end itemize
 
-Once a text, menu or query response page is retrieved, its contents are
+Once a text, menu or query response page has been displayed, its contents are
 cached for the duration of the Emacs session. 
 
-@item @kbd{d}  (@code{elpher-download})
+@keycmd{@key{g}, elpher-go}
+Open a particular page by specifying either its full URL or just entering
+a gopher host name.
+
+If a non-gopher protocol is used in the URL the result will be the same
+as following a URL link of the same type from a gopher menu.
+
+@keycmd{@key{o}, elpher-go-current}
+Prompts for a URL similar to @code{elpher-go}, but initialized to the URL
+of the current page.  This allows you to easily try other selectors for the
+same server.
 
-@item @kbd{g}  (@code{elpher-go})
+Remember however, that the Gopher RFC 1436 provides no guarantees about the
+structure of selectors.
 
-@item @kbd{O}  (@code{elpher-root-dir})
+@keycmd{@key{O}, elpher-root-dir}
+Open the root page (empty selector) on the current host.
 
-@item @kbd{u}  (@code{elpher-back})
+@keycmd{@key{u}\, @kbd{mouse-3}, elpher-back}
 Return to the previous page, where ``previous'' means the page where the
 page which was displayed immediately before the current page.
 @end table
 
+
+@node History and Caching,  , Between-page navigation, Navigation
+@section History and Caching 
+
+The history and caching strategy in Elpher is extremely simple, but
+may be confusing without a good mental model of how it works.  That
+is what this section attempts to provide.
+
+Essentially, @strong{every} time you navigate to a new page, either
+by clicking or pressing @key{RET} on a link, using @key{g} to jump
+to a new page by its address, or using @key{O} to open the root selector,
+the following two things occur:
+
+@enumerate
+@item
+the cursor position and content for the original page are recorded in an
+in-memory cache, and
+
+@item
+the original page is set as the ``parent'' of the new page.
+@end enumerate
+
+The only way to return to pages in this history is by using @key{u},
+which returns to the previous of the current page.
+@footnote{The addition of the new page to the history happens even if
+the new page is one that has been seen before. This is mostly the
+desired behaviour.  However, opening an explicit ``back'' link provided
+by a gopher menu will also add a new entry to the history.  Unless you
+haven't yet visited that menu, it's therefore better to use @key{u} to
+go back in this case.}
+
+One aspect that may seem peculiar is that Elpher lacks a corresponding ``next'' or
+``forward'' command.  However, since Elpher caches the position of point,
+this will be automatically positioned on the link that was most recently followed
+from a given page.  This means that, at least for links followed from menus
+and text files, the inverse of @key{u} is actually just @key{RET}.
+
+
 @node Bookmarks, Character encodings, Navigation, Top
 @chapter Bookmarks
 
-@node Character encodings, Customization, Bookmarks, Top
+Elpher has a very simple link bookmarking system involving the
+following commands:
+
+@table @asis
+@keycmd{@key{a}, elpher-bookmark-link}
+Add a bookmark for the link at point.  The minibuffer will prompt for
+a name for the bookmark, which defaults to the display string.
+
+@keycmd{@key{A}, elpher-bookmark-current}
+Add a bookmark for the current page.  The minibuffer will prompt for
+a name for the bookmark, defaulting to the display string associated
+with the link that was followed to reach the current page.
+
+@keycmd{@key{x}, elpher-unbookmark-link}
+Immediately remove the bookmark (if one exists) to the link at point.
+
+@keycmd{@key{X}, elpher-unbookmark-current}
+Immediately remove the bookmark (if one exists) to the current page.
+
+@keycmd{@key{B}, elpher-bookmarks}
+Open a page displaying all current bookmarks.  Note that this bookmark
+page is added to the history just as if you had opened it using a link.
+Thus to return to the previous page, use @kbd{u}.  This also means
+that you can peruse the various bookmarks by visiting them in turn, 
+using @kbd{u} to return to the bookmark page (where the position of point
+is cached), then moving to another bookmarked link and so on.
+@end table
+
+Bookmarks are stored as a s-exp in the file @file{elpher-bookmarks}
+in the user emacs directory (usually @file{~/.emacs.d/}).
+Any command which modifies the list of bookmarks immediately updates
+this file.
+
+@node Character encodings, Encrypted connections, Bookmarks, Top
 @chapter Character encodings
 
-@node Customization, Index, Character encodings, Top
+Responses Elpher retrieves from servers are initially read as pure
+binary data.  When the data is intended to be interpreted as textual (as
+determined by the type parameter of the gopher menu item or the gopher
+URL), this data needs to be @emph{decoded} into a sequence of
+characters.  To do this properly requires knowledge of the encoding
+system used by whoever authored the document.
+
+Unfortunately gopher lacks a systematic way of acquiring this necessary
+information. Thus, the details of the coding system must be either inferred from the binary data,
+or must be specified by the user.
+
+By default, Elpher applies Emacs' built-in character encoding detection
+system to the full (undecoded) response data and uses this to attempt to
+convert it into a character string.
+(See @pxref{Recognize coding, Recognizing coding systems, ,emacs}.) While
+this approach can be okay, it is important to realize that its inference
+algorithm is extremely primitive and depends heavily on assumptions based
+on the language settings of your emacs system.
+
+The alternative is to explicitly set the coding system used for decoding
+using the following command:
+
+@table @asis
+@keycmd{@key{S},elpher-set-coding-system}
+Causes a elpher to prompt for a coding system to use for decoding
+future text.  The @key{TAB} key can be used at this prompt to display a
+list of alternatives (which is extensive) and to auto-complete.  An empty
+response will cause Elpher to return to its default auto-detection
+behaviour.
+@end table
+
+Note that changing the coding system only affects newly loaded text.
+Thus, if text has already been decoded using an incorrect system, you
+will need to select the correct coding and then reload the text using
+@key{R}.
+
+
+@node Encrypted connections, Gemini support, Character encodings, Top
+@chapter Encrypted connections
+
+While RFC 1436 does not broach the topic of encryption at all, several
+modern gopher servers can serve content over encrypted connections,
+and a common choice for this is TLS.
+
+Elpher can retrieve selectors using Emacs' built-in TLS support which
+uses the GnuTLS library. (It is possible to build emacs without
+GnuTLS, in which case encryption is not supported.)
+
+To retrieve documents using TLS, Elpher's TLS mode must be enabled.
+This can be directly toggled using @key{T}, but note that just as with
+the character encoding, changing this mode only affects subsequent
+connections.
+
+Alternatively, TLS mode is @emph{automatically} enabled whenever
+gopher URLs starting with @code{gophers://} are followed.
+
+The mode is sticky, so it remains active until switched off.
+It can also be automatically switched off when a TLS connection fails.
+In this case Elpher will prompt for your confirmation to ensure that
+you can't accidentally make a non-TLS connection.
+
+@node Gemini support, Customization, Encrypted connections, Top
+@chapter Gemini support
+
+@uref{gopher://zaibatsu.circumlunar.space/1/~solderpunk/gemini, Gemini}
+is a new protocol being devloped by several members of
+gopherspace.  It aims to solve some of the long-standing technical
+issues associated with gopher as a protocol, while keeping the major benifits.
+For instance, it _requires_ encrypted connections, it does away with
+the selector type, and allows servers to explicitly specify the
+character coding scheme used for text documents.
+
+The latest versions of Elpher aim to provide seemless navigation between
+gemini and gopher documents.  Basically you should be able to open,
+bookmark, download and otherwise interact with gemini pages in exactly
+the same way as you do with other non-gemini pages.  The only major
+difference from your perspective as a user is that you should no longer
+have to worry about manually toggling TLS on or off (for gemini it's
+always on), and you should never have to manually set a character coding
+scheme.
+
+I should emphasize however that, while it is definitely functional,
+Elpher's gemini support is still experimental, and various aspects will
+change as the protocol develops further.  Additionally, the use of
+client TLS certicificates is not yet supported.
+
+@node Customization, Command Index, Gemini support, Top
 @chapter Customization
 
-@node Index,  , Customization, Top
-@unnumbered Index
+Various parts of Elpher can be customized via the 
+variables belonging to the elpher customization group, accessible
+using
+
+@example
+@kbd{M-x customize-group elpher @key{RET}}
+@end example
+
+@noindent This group contains a number of faces that can be modified to change
+the appearance of Elpher, including one face per menu item type.
+
+The group also contains variables for customizing the behaviour of
+Elpher.  This includes how to open arbitrary (non-gopher) URLs, whether
+to display buffer headers, how to deal with ANSI escape sequences in
+text, the timeout to impose on network connections, and whether to
+prompt for confirmation when switching away from TLS.
+
+See the customization group itself for details.
+
+@node Command Index,  , Customization, Top
+@unnumbered Command Index
 
-@printindex cp
+@printindex fn
 
 @bye