4bfa0afade27905776f956369faff41135d6bf88
[elpher.git] / elpher.texi
1 \input texinfo @c -*-texinfo-*-
2
3 @setfilename elpher.info
4 @settitle Elpher Manual v2.0.0
5
6 @dircategory Emacs
7 @direntry
8 * Elpher: (elpher).     A gopher client for Emacs.
9 @end direntry
10
11 @copying
12 This manual documents Elpher, a gopher client for Emacs.
13
14 Copyright @copyright{} 2019 Tim Vaughan
15
16 @quotation
17 The source and documentation of Elpher is free software.  You can
18 redistribute it and/or modify it under the terms of the GNU General
19 Public License as published by the Free Software Foundation; either
20 version 3, or (at your option) any later version.
21
22 Elpher is distributed in the hope that it will be useful, but WITHOUT
23 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 FITNElpher FOR A PARTICULAR PURPOSE. See the GNU General Public License in
25 the file COPYING in the same directory as this file for more details.
26 @end quotation
27 @end copying
28
29 @titlepage
30 @title Elpher Gopher Client Manual
31 @author Tim Vaughan
32
33 @page
34 @vskip 0pt plus 1filll
35 @insertcopying
36 @end titlepage
37
38 @contents
39
40 @ifnottex
41 @node Top, Introduction, (dir), (dir)
42 @top Elpher
43
44 @insertcopying
45 @end ifnottex
46
47 @macro keycmd{key,cmd}
48 @item \key\  (@code{\cmd\})
49 @findex \cmd\
50 @end macro
51
52 @menu
53 * Introduction::                Elpher Overview: what's this all about?
54 * Installation::                Installing Elpher
55 * Quick Start::                 Get up and running quickly
56 * Navigation::                  Fundamentals of Elpher navigation
57 * Bookmarks::                   How to record and visit bookmarks
58 * Character encodings::         How Elpher handles different character encodings
59 * Encrypted connections::       How and when TLS is enabled
60 * Gemini support::              Support for the Gemini protocol
61 * Finger support::              Support for the Finger protocol
62 * Customization::               How to customize various aspects of Elpher
63 * Command Index::
64
65 @detailmenu
66  --- The Detailed Node Listing ---
67
68 Navigation
69
70 * Within-page navigation::      Moving about within a page
71 * Between-page navigation::     Commands for moving between pages
72 * History and Caching::         Explanation of how Elpher represents history
73
74 @end detailmenu
75 @end menu
76
77 @node Introduction, Installation, Top, Top
78 @chapter Introduction
79
80 Elpher aims to be a capable and practical gopher client for Emacs.  Its
81 focus is on easy keyboard-driven navigation based on sensible default
82 bindings (with out-of-the-box support for Evil).  It is intended to be
83 robust and behave in non-surprising ways at all times.  Additionally,
84 Elpher provides the following bells and whistles:
85
86 @itemize
87 @item
88 followable web and gopher links in plain text,
89
90 @item
91 an easily navigable history, sporting caching of visited pages (both
92 content and cursor position),
93
94 @item
95 auto-completing menu item navigation,
96
97 @item
98 direct visualization of image files where supported (no writing to
99 disk),
100
101 @item
102 a bookmark management system,
103
104 @item
105 basic support for the new ``heavier than gopher, lighter than the web'' Gemini protocol,
106
107 @item
108 support for the Finger protocol.
109
110 @end itemize
111
112 Elpher is still under active development.  Although we try very hard to
113 ensure that releases are bug-free, this cannot be guaranteed.  However,
114 this also means that any usability features that you feel are missing
115 can likely by incorporated quickly, so please get in touch if you
116 have some ideas.
117
118 @node Installation, Quick Start, Introduction, Top
119 @chapter Installation
120
121 Elpher is available from the MELPA package repository.  If you have
122 never installed packages from this repository before, you'll need
123 to follow the instructions at @url{https://melpa.org/#/getting-started}.
124
125 @noindent To install Elpher, enter the following:
126
127 @example
128 @kbd{M-x package-install @key{RET} elpher @key{RET}}
129 @end example
130
131 @noindent To uninstall, use
132
133 @example
134 @kbd{M-x package-delete @key{RET} elpher @key{RET}}.
135 @end example
136
137 While not recommended, it is also possible to install Elpher directly by
138 downloading the file @file{elpher.el} from
139 @url{gopher://thelambdalab.xyz/1/projects/elpher/}, adding it to a directory in
140 your @code{load-path}, and then adding
141
142 @example
143 (require 'elpher)
144 @end example
145
146 @noindent to your Emacs initialization file.
147
148 @node Quick Start, Navigation, Installation, Top
149 @chapter Quick Start
150
151 Before diving into the minutiae of the different commands available,
152 we will quickly describe how to get up and running with Elpher.
153
154 Once installed, you can launch Elpher using
155
156 @example
157 @kbd{M-x elpher @key{RET}}
158 @end example
159
160 @noindent This will switch to the *Elpher* buffer and display a start
161 page, with information on each of the default keyboard bindings.
162
163 From here you can move point between links (which may be menu items or
164 inline URLs in text files) by using @key{TAB} and @kbd{S-@key{TAB}},
165 as in Info.  You can also jump directly to a menu item using @key{m}, or
166 use the standard Emacs or Evil motion and search commands to find your
167 way around.  To open a link, press @key{RET}.  (Where a mouse is
168 available, Clicking on a link with the mouse cursor has the same
169 effect.)
170
171 To return to the page you just followed the link from, press @key{u}.
172
173 Elpher caches (for the duration of an Emacs session) both page contents
174 and the position of point on each of the pages (gopher menus, query
175 results, or text pages) you visit, restoring these when you next visit
176 the same page.  Thus, pressing @key{u} displays the previous page in
177 exactly the same state as when you left, meaning that you can quickly
178 and visually explore the different documents in a menu without having to
179 wait for anything to reload.
180
181 Of course, sometimes you'll @emph{want} to reload the current page
182 rather than stick with the cached version.  To do this use @key{R}.
183 (This is particularly useful for search query results, where this
184 allows you to perform a different search.)
185
186 That's more-or-less it. Elpher supports a number of other features, such
187 as bookmarking, support for different coding schemes and TLS encryption,
188 and a variety of customization options, all of which are explained in
189 the rest of this document.  However the emphasis is on keeping the basic
190 navigation experience as intuitive and responsive as possible.
191
192 @node Navigation, Bookmarks, Quick Start, Top
193 @chapter Navigation
194 by 
195 Throughout this manual, we use the word ``page'' to refer to any
196 visualization of a response from a gopher server, be it a
197 menu/directory, query result, text file or image.  We use
198
199 Elpher's navigation interface is inspired by the Emacs Info mode.
200 Movement within a page is essentially the same as moving
201 around any other text file in Emacs, but with special keys
202 for quickly jumping between menu items and URLs in text files.
203 Movement between pages is facilitated by a simple linear history
204 coupled with caching of pages and cursor position.
205
206 @menu
207 * Within-page navigation::      Moving about within a page
208 * Between-page navigation::     Commands for moving between pages
209 * History and Caching::         Explanation of how Elpher represents history
210 @end menu
211
212
213 @node Within-page navigation, Between-page navigation, Navigation, Navigation
214 @section Within-page navigation
215
216 To move about within a page, you should be able use the same keys you usually
217 use to browse files in Emacs.  This is even true when Evil mode is
218 enabled. Paragraph hopping, searching etc should work as usual.
219
220 In addition, the following commands are provided for quickly moving between
221 links and menu items.
222
223 @table @asis
224 @keycmd{@key{TAB}, elpher-next-link}
225 Move to the next link or menu item in the file.
226
227 @keycmd{@kbd{Shift-@key{TAB}}/@key{backtab}, @code{elpher-prev-link}}
228 Move to the previous link or menu item in the file.
229
230 @keycmd{@key{m}, elpher-jump}
231 Jump directly to a link within a file by specifying its display string
232 or link text.  (Unlike the previous two commands, this immediately opens
233 the selected link.
234 @end table
235
236 The following commands can be used to retrieve information about the
237 current page, or the address of the link at point:
238
239 @table @asis
240 @keycmd{@key{i}, elpher-info-link}
241 Display host, port and selector information for the link at point.
242
243 @keycmd{@key{I}, elpher-info-current}
244 Display host, port and selector information for the current page.
245
246 @keycmd{@key{c}, elpher-copy-link-url}
247 Add URL representing address of link at point to the kill-ring and the
248 system clipboard (if available).
249
250 @keycmd{@key{C}, elpher-copy-current-url}
251 Add URL representing address of the current page to the kill-ring and
252 the system clipboard (if available).
253
254 @keycmd{@key{d}, elpher-download}
255 Download link at point and save the result as a file.  The minibuffer
256 will prompt for the name of the file to write, with the default name being
257 the display string (if available) associated with the link.
258
259 @keycmd{@key{D}, elpher-download-current}
260 This is similar to @code{elpher-download}, but instead applies to the
261 current page rather than a link.
262
263 @keycmd{@key{.}, elpher-view-raw}
264 This displays the raw server response for the current page.  While not
265 useful for general browsing, it is useful for debugging incorrect rendering
266 or out-of-spec server responses.
267 @end table
268
269 @node Between-page navigation, History and Caching, Within-page navigation, Navigation
270 @section Between-page navigation
271
272 Moving to a different page can be accomplished in several ways,
273 described by the following command:
274
275 @table @asis
276 @keycmd{@key{RET}\, @kbd{mouse-1}, elpher-follow-link}
277 Follow the menu item or link at point (or selected with the mouse).
278
279 Exactly what is meant by ``follow'' depends on the kind of item selected:
280
281 @itemize
282 @item
283 For text or menu type items or links, the current page text is replaced
284 by the text of this item.  Unless the customization variable
285 @code{elpher-use-header} (@pxref{Customization}) is 
286 @code{nil}, the display string of the link is displayed in the buffer header.
287 Links to images behave similarly on Emacs systems supporting the display of
288 bitmap graphics, however their content is not cached in memory by default.
289
290 @item
291 When followed, links to search/query items (type 7) prompt for input in
292 the minibuffer then display the results in the same way as for text and menu
293 items.
294
295 @item
296 Following links to binary files (and image files on unsupported systems)
297 causes Elpher to prompt for a filename in which to save the content.
298
299 @item
300 Following links of type `h' with a selector having the `URL:' prefix, or
301 non-gopher URLs in text files, will result in Elpher using an external
302 programme to open the URL.  This will be either the default system browser
303 or, if the @code{elpher-open-urls-with-eww} customization variable is non-nil,
304 Emacs' own EWW browser. (See @pxref{Customization}.) 
305
306 @end itemize
307
308 Once a text, menu or query response page has been displayed, its contents are
309 cached for the duration of the Emacs session. 
310
311 @keycmd{@key{g}, elpher-go}
312 Open a particular page by specifying either its full URL or just entering
313 a gopher host name.
314
315 If a non-gopher protocol is used in the URL the result will be the same
316 as following a URL link of the same type from a gopher menu.
317
318 @keycmd{@key{o}, elpher-go-current}
319 Prompts for a URL similar to @code{elpher-go}, but initialized to the URL
320 of the current page.  This allows you to easily try other selectors for the
321 same server.
322
323 Remember however, that the Gopher RFC 1436 provides no guarantees about the
324 structure of selectors.
325
326 @keycmd{@key{O}, elpher-root-dir}
327 Open the root page (empty selector) on the current host.
328
329 @keycmd{@key{u}\, @kbd{mouse-3}, elpher-back}
330 Return to the previous page, where ``previous'' means the page where the
331 page which was displayed immediately before the current page.
332 @end table
333
334
335 @node History and Caching,  , Between-page navigation, Navigation
336 @section History and Caching 
337
338 The history and caching strategy in Elpher is extremely simple, but
339 may be confusing without a good mental model of how it works.  That
340 is what this section attempts to provide.
341
342 Essentially, @strong{every} time you navigate to a new page, either
343 by clicking or pressing @key{RET} on a link, using @key{g} to jump
344 to a new page by its address, or using @key{O} to open the root selector,
345 the following two things occur:
346
347 @enumerate
348 @item
349 the cursor position and content for the original page are recorded in an
350 in-memory cache, and
351
352 @item
353 the original page is set as the ``parent'' of the new page.
354 @end enumerate
355
356 The only way to return to pages in this history is by using @key{u},
357 which returns to the previous of the current page.
358 @footnote{The addition of the new page to the history happens even if
359 the new page is one that has been seen before. This is mostly the
360 desired behaviour.  However, opening an explicit ``back'' link provided
361 by a gopher menu will also add a new entry to the history.  Unless you
362 haven't yet visited that menu, it's therefore better to use @key{u} to
363 go back in this case.}
364
365 One aspect that may seem peculiar is that Elpher lacks a corresponding ``next'' or
366 ``forward'' command.  However, since Elpher caches the position of point,
367 this will be automatically positioned on the link that was most recently followed
368 from a given page.  This means that, at least for links followed from menus
369 and text files, the inverse of @key{u} is actually just @key{RET}.
370
371
372 @node Bookmarks, Character encodings, Navigation, Top
373 @chapter Bookmarks
374
375 Elpher has a very simple link bookmarking system involving the
376 following commands:
377
378 @table @asis
379 @keycmd{@key{a}, elpher-bookmark-link}
380 Add a bookmark for the link at point.  The minibuffer will prompt for
381 a name for the bookmark, which defaults to the display string.
382
383 @keycmd{@key{A}, elpher-bookmark-current}
384 Add a bookmark for the current page.  The minibuffer will prompt for
385 a name for the bookmark, defaulting to the display string associated
386 with the link that was followed to reach the current page.
387
388 @keycmd{@key{x}, elpher-unbookmark-link}
389 Immediately remove the bookmark (if one exists) to the link at point.
390
391 @keycmd{@key{X}, elpher-unbookmark-current}
392 Immediately remove the bookmark (if one exists) to the current page.
393
394 @keycmd{@key{B}, elpher-bookmarks}
395 Open a page displaying all current bookmarks.  Note that this bookmark
396 page is added to the history just as if you had opened it using a link.
397 Thus to return to the previous page, use @kbd{u}.  This also means
398 that you can peruse the various bookmarks by visiting them in turn, 
399 using @kbd{u} to return to the bookmark page (where the position of point
400 is cached), then moving to another bookmarked link and so on.
401 @end table
402
403 Bookmarks are stored as a s-exp in the file @file{elpher-bookmarks}
404 in the user emacs directory (usually @file{~/.emacs.d/}).
405 Any command which modifies the list of bookmarks immediately updates
406 this file.
407
408 @node Character encodings, Encrypted connections, Bookmarks, Top
409 @chapter Character encodings
410
411 Responses Elpher retrieves from servers are initially read as pure
412 binary data.  When the data is intended to be interpreted as textual (as
413 determined by the type parameter of the gopher menu item or the gopher
414 URL), this data needs to be @emph{decoded} into a sequence of
415 characters.  To do this properly requires knowledge of the encoding
416 system used by whoever authored the document.
417
418 Unfortunately gopher lacks a systematic way of acquiring this necessary
419 information. Thus, the details of the coding system must be either inferred from the binary data,
420 or must be specified by the user.
421
422 By default, Elpher applies Emacs' built-in character encoding detection
423 system to the full (undecoded) response data and uses this to attempt to
424 convert it into a character string.
425 (See @pxref{Recognize coding, Recognizing coding systems, ,emacs}.) While
426 this approach can be okay, it is important to realize that its inference
427 algorithm is extremely primitive and depends heavily on assumptions based
428 on the language settings of your emacs system.
429
430 The alternative is to explicitly set the coding system used for decoding
431 using the following command:
432
433 @table @asis
434 @keycmd{@key{S},elpher-set-coding-system}
435 Causes a elpher to prompt for a coding system to use for decoding
436 future text.  The @key{TAB} key can be used at this prompt to display a
437 list of alternatives (which is extensive) and to auto-complete.  An empty
438 response will cause Elpher to return to its default auto-detection
439 behaviour.
440 @end table
441
442 Note that changing the coding system only affects newly loaded text.
443 Thus, if text has already been decoded using an incorrect system, you
444 will need to select the correct coding and then reload the text using
445 @key{R}.
446
447
448 @node Encrypted connections, Gemini support, Character encodings, Top
449 @chapter Encrypted connections
450
451 While RFC 1436 does not broach the topic of encryption at all, several
452 modern gopher servers can serve content over encrypted connections,
453 and a common choice for this is TLS.
454
455 Elpher can retrieve selectors using Emacs' built-in TLS support which
456 uses the GnuTLS library. (It is possible to build emacs without
457 GnuTLS, in which case encryption is not supported.)
458
459 To retrieve documents using TLS, Elpher's TLS mode must be enabled.
460 This can be directly toggled using @key{T}, but note that just as with
461 the character encoding, changing this mode only affects subsequent
462 connections.
463
464 Alternatively, TLS mode is @emph{automatically} enabled whenever
465 gopher URLs starting with @code{gophers://} are followed.
466
467 The mode is sticky, so it remains active until switched off.
468 It can also be automatically switched off when a TLS connection fails.
469 In this case Elpher will prompt for your confirmation to ensure that
470 you can't accidentally make a non-TLS connection.
471
472 @node Gemini support, Finger support, Encrypted connections, Top
473 @chapter Gemini support
474
475 @uref{gopher://gemini.circumlunar.space, Gemini}
476 is a new protocol being devloped by several members of
477 gopherspace.  It aims to solve some of the long-standing technical
478 issues associated with gopher as a protocol, while keeping the major benifits.
479 For instance, it _requires_ encrypted connections, it does away with
480 the selector type, and allows servers to explicitly specify the
481 character coding scheme used for text documents.
482
483 The latest versions of Elpher aim to provide seemless navigation between
484 gemini and gopher documents.  Basically you should be able to open,
485 bookmark, download and otherwise interact with gemini pages in exactly
486 the same way as you do with other non-gemini pages.  The only major
487 difference from your perspective as a user is that you should no longer
488 have to worry about manually toggling TLS on or off (for gemini it's
489 always on), and you should never have to manually set a character coding
490 scheme.
491
492 I should emphasize however that, while it is definitely functional,
493 Elpher's gemini support is still experimental, and various aspects will
494 change as the protocol develops further.  Additionally, the use of
495 client TLS certicificates is not yet supported.
496
497 @node Finger support, Customization, Gemini support, Top
498 @chapter Finger support
499
500 Incidentally, Elpher has native support for querying finger servers.
501 Of course, one could argue that this functionality is more easily
502 provided by one's local telnet client.  However finger URLs do appear
503 on occasion in gopherspace, and it's nice to be able to open them
504 in place.
505
506 Elpher interprets @code{finger://} URLs as follows:
507
508 @itemize
509
510 @item
511 The host is determined by the host name portion of the URL.
512
513 @item
514 In the case that the @emph{file name} portion of the URL is non-empty (besides
515 the leading slash), this is interpreted as the user to finger.
516
517 @item
518 Otherwise, the @emph{user} portion of the URL is interpreted as the user to finger.
519
520 @item
521 If no user is provided, the root directory of the finger server is requested.
522
523 @end itemize
524
525 Thus @code{finger://user@@hostname} and @code{finger://hostname/user} are both equivalent.
526
527 (The precedence of the /user notation over the user@ notation reflects a
528 preference of the community.)
529
530 @node Customization, Command Index, Finger support, Top
531 @chapter Customization
532
533 Various parts of Elpher can be customized via the 
534 variables belonging to the elpher customization group, accessible
535 using
536
537 @example
538 @kbd{M-x customize-group elpher @key{RET}}
539 @end example
540
541 @noindent This group contains a number of faces that can be modified to change
542 the appearance of Elpher, including one face per menu item type.
543
544 The group also contains variables for customizing the behaviour of
545 Elpher.  This includes how to open arbitrary (non-gopher) URLs, whether
546 to display buffer headers, how to deal with ANSI escape sequences in
547 text, the timeout to impose on network connections, and whether to
548 prompt for confirmation when switching away from TLS.
549
550 See the customization group itself for details.
551
552 @node Command Index,  , Customization, Top
553 @unnumbered Command Index
554
555 @printindex fn
556
557 @bye