Merge branch 'master' into manual
authorTim Vaughan <tgvaughan@gmail.com>
Mon, 24 Jun 2019 21:21:07 +0000 (23:21 +0200)
committerTim Vaughan <tgvaughan@gmail.com>
Mon, 24 Jun 2019 21:21:07 +0000 (23:21 +0200)
NOTES.org
elpher.el
elpher.texi [new file with mode: 0644]

index a7454cd..afd3bfb 100644 (file)
--- a/NOTES.org
+++ b/NOTES.org
@@ -2,6 +2,29 @@
 
 * Planned improvements
 
+** TODO Allow multiple elpher buffers
+
+   Shouldn't be too hard, just need elpher-current-node to be
+buffer-local and allow various buffer-switching procedures to
+do something sensible.
+   
+** TODO Turn on lexical scoping
+
+   A branch exists for this, but there are some compilation kinks
+to iron out.
+
+** TODO Remove "redraw" command
+This is only necessary for returning from displaying the raw
+server response.  If I can provide a better way of doing that
+then we can get rid of redraw entirely.
+
+** TODO Replace support for user-specified starting pages
+This used to be available, but was removed during a refactor.
+
+* Current issues
+
+* Completed improvements
+  
 ** DONE Implement support for telnet entries
 
 Similar to http entries, telnet entries will be handled by code
@@ -33,18 +56,10 @@ functions.
   I always update node.parent unless parent is already an ancestor of
   node?)
 
-** TODO Allow multiple elpher buffers
+  
+** DONE Support character encoding diversity
 
-   Shouldn't be too hard, just need elpher-current-node to be
-buffer-local and allow various buffer-switching procedures to
-do something sensible.
-   
-** TODO Turn on lexical scoping
-
-   A branch exists for this, but there are some compilation kinks
-to iron out.
-
-* Current issues
+* Old issues
 
 ** DONE Org mode faces are not present in recent emacs versions
 Even 26.1 doesn't seem to have these.  This means that, for many
index 340f9df..5f0ef3a 100644 (file)
--- a/elpher.el
+++ b/elpher.el
 
 ;;; Commentary:
 
-;; Elpher aims to provide a practical gopher client for GNU Emacs.
-;; It supports:
+;; Elpher aims to provide a practical and friendly gopher client
+;; for GNU Emacs.  It supports:
 
-;; - intuitive keyboard and mouse-driven interface,
+;; - an intuitive keyboard and mouse-driven interface,
 ;; - caching of visited sites (both content and cursor position),
 ;; - pleasant and configurable colouring of Gopher directories,
 ;; - direct visualisation of image files,
@@ -45,6 +45,9 @@
 ;; Faces, caching and other options can be configured via
 ;; the Elpher customization group in Applications.
 
+;; Elpher is under active development, and any suggestions for
+;; improvements are welcome!
+
 ;;; Code:
 
 (provide 'elpher)
@@ -1071,7 +1074,7 @@ host, selector and port."
       (error "No link selected"))))
 
 (defun elpher-bookmarks ()
-  "Visit bookmarks."
+  "Visit bookmarks page."
   (interactive)
   (switch-to-buffer "*elpher*")
   (elpher-visit-node
@@ -1207,7 +1210,11 @@ host, selector and port."
   "Keymap for gopher client.")
 
 (define-derived-mode elpher-mode special-mode "elpher"
-  "Major mode for elpher, an elisp gopher client.")
+  "Major mode for elpher, an elisp gopher client.
+
+This mode is automatically enabled by the interactive
+functions which initialize the gopher client, namely
+`elpher', `elpher-go' and `elpher-bookmarks'.")
 
 (when (fboundp 'evil-set-initial-state)
   (evil-set-initial-state 'elpher-mode 'motion))
diff --git a/elpher.texi b/elpher.texi
new file mode 100644 (file)
index 0000000..570c9fa
--- /dev/null
@@ -0,0 +1,458 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename elpher.info
+@settitle Elpher Manual v1.0.0
+@c %**end of header
+
+@copying
+This manual documents Elpher, a gopher client for Emacs.
+
+Copyright @copyright{} 2019 Tim Vaughan
+
+@quotation
+The source and documentation of Elpher is free software.  You can
+redistribute it and/or modify it under the terms of the GNU General
+Public License as published by the Free Software Foundation; either
+version 3, or (at your option) any later version.
+
+Elpher is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNElpher FOR A PARTICULAR PURPOSE. See the GNU General Public License in
+the file COPYING in the same directory as this file for more details.
+@end quotation
+@end copying
+
+@titlepage
+@title Elpher Gopher Client Manual
+@author Tim Vaughan
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top Elpher
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Introduction::                Elpher Overview: what's this all about?
+* Installation::                Installing Elpher
+* Quick Start::                 Get up and running quickly
+* 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
+* Customization::               How to customize various aspects of Elpher
+* Index::
+@end menu
+
+@node Introduction, Installation, Top, Top
+@chapter Introduction
+
+Elpher aims to be a capable and practical gopher client for Emacs.  Its
+focus is on easy keyboard-driven navigation based on sensible default
+bindings (with out-of-the-box support for Evil).  It is intended to be
+robust and behave in non-surprising ways at all times.  Additionally,
+Elpher provides the following bells and whistles:
+
+@itemize
+@item
+an easily navigable history, sporting caching of visited pages (both
+content and cursor position),
+
+@item
+auto-completing menu item navigation,
+
+@item
+followable web and gopher links in plain text,
+
+@item
+direct visualization of image files where supported (no writing to
+disk), and
+
+@item
+a simple bookmark management system.
+@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
+have some ideas.
+
+@node Installation, Quick Start, Introduction, Top
+@chapter Installation
+
+Elpher is available from the MELPA package repository.  If you have
+never installed packages from this repository before, you'll need
+to follow the instructions at @url{https://melpa.org/#/getting-started}.
+
+@noindent To install Elpher, enter the following:
+
+@example
+@kbd{M-x package-install @key{RET} elpher @key{RET}}
+@end example
+
+@noindent To uninstall, use
+
+@example
+@kbd{M-x package-delete @key{RET} elpher @key{RET}}.
+@end example
+
+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
+your @code{load-path}, and then adding
+
+@example
+(require 'elpher)
+@end example
+
+@noindent to your Emacs initialization file.
+
+@node Quick Start, Navigation, Installation, Top
+@chapter Quick Start
+
+Before diving into the minutiae of the different commands available,
+we will quickly describe how to get up and running with Elpher.
+
+Once installed, you can launch Elpher using
+
+@example
+@kbd{M-x elpher @key{RET}}
+@end example
+
+@noindent This will switch to the *Elpher* buffer and display a start
+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{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
+available, Clicking on a link with the mouse cursor has the same
+effect.)
+
+To return to the page you just followed the link from, press @key{u}.
+
+Elpher caches (for the duration of an Emacs session) both page contents
+and the position of point on each of the pages (gopher menus, query
+results, or text pages) you visit, restoring these when you next visit
+the same page.  Thus, pressing @key{u} displays the previous page in
+exactly the same state as when you left, meaning that you can quickly
+and visually explore the different documents in a menu without having to
+wait for anything to reload.
+
+Of course, sometimes you'll @emph{want} to reload the current page
+rather than stick with the cached version.  To do this use @key{R}.
+(This is particularly useful for search query results, where this
+allows you to perform a different search.)
+
+That's more-or-less it. Elpher supports a number of other features, such
+as bookmarking, support for different coding schemes and TLS encryption,
+and a variety of customization options, all of which are explained in
+the rest of this document.  However the emphasis is on keeping the basic
+navigation experience as intuitive and responsive as possible.
+
+@node Navigation, Bookmarks, Quick Start, Top
+@chapter Navigation
+by 
+Throughout this manual, we use the word ``page'' to refer to any
+visualization of a response from a gopher server, be it a
+menu/directory, query result, text file or image.  We use
+
+Elpher's navigation interface is inspired by the Emacs Info mode.
+Movement within a page is essentially the same as moving
+around any other text file in Emacs, but with special keys
+for quickly jumping between menu items and URLs in text files.
+Movement between pages is facilitated by a simple linear history
+coupled with caching of pages and cursor position.
+
+@menu
+* 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 menu
+
+
+@node Within-page navigation, Between-page navigation, Navigation, Navigation
+@section Within-page navigation
+
+To move about within a page, you should be able use the same keys you usually
+use to browse files in Emacs.  This is even true when Evil mode is
+enabled. Paragraph hopping, searching etc should work as usual.
+
+In addition, the following commands are provided for quickly moving between
+links and menu items.
+
+@table @asis
+@item @key{TAB}  (@code{elpher-next-link})
+Move to the next link or menu item in the file.
+
+@item @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})
+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.
+@end table
+
+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})
+Display host, port and selector information for the link at point.
+
+@item @kbd{I}  (@code{elpher-info-current})
+Display host, port and selector information for the current page.
+
+@item @kbd{c}  (@code{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})
+Add URL representing address of the current page to the kill-ring and
+the system clipboard (if available).
+
+@item @kbd{d}  (@code{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.
+
+@item @kbd{D}  (@code{elpher-download-current})
+This is similar to @code{elpher-downlowd}, but instead applies to the
+current page rather than a link.
+
+@item @kbd{w} (@code{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})
+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
+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.
+Links to images behave similarly on Emacs systems supporting the display of
+bitmap graphics, however their content is not cached in memory by default.
+
+@item
+When followed, links to search/query items (type 7) prompt for input in
+the minibuffer then display the results in the same way as for text and menu
+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 has been displayed, its contents are
+cached for the duration of the Emacs session. 
+
+@item @kbd{g}  (@code{elpher-go})
+Open a particular page by specifying either its URL or directly entering
+a host, port and selector.
+
+Note that 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.
+
+@item @kbd{O}  (@code{elpher-root-dir})
+Open the root page (empty selector) on the current host.
+
+@item @kbd{u}  (@code{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
+
+Elpher has a very simple link bookmarking system involving the
+following commands:
+
+@table @asis
+@item @key{a}  (@code{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.
+
+@item @key{A}  (@code{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.
+
+@item @key{x}  (@code{elpher-unbookmark-link})
+Immediately remove the bookmark (if one exists) to the link at point.
+
+@item @key{X}  (@code{elpher-unbookmark-current})
+Immediately remove the bookmark (if one exists) to the current page.
+
+@item @key{B}  (@code{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
+
+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 realise 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
+@item @key{S}  (@code{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 autocomplete.  An empty
+response will cause Elpher to return to its default autodetection
+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, Customization, 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 Customization, Index, Encrypted connections, Top
+@chapter Customization
+
+
+
+
+@menu
+* Faces::
+* Other cutomizations::
+@end menu
+
+@node Faces, Other cutomizations, Customization, Customization
+@section Faces
+
+@node Other cutomizations,  , Faces, Customization
+@section Other customizations
+
+@node Index,  , Customization, Top
+@unnumbered Index
+
+@printindex cp
+
+@bye