8b5c65deaa7f95f81f4ffb79207e23f325d3870a
[elpher.git] / elpher.texi
1 \input texinfo @c -*-texinfo-*-
2
3 @setfilename elpher.info
4 @settitle Elpher Manual v3.5.0
5
6 @dircategory Emacs
7 @direntry
8 * Elpher: (elpher). A gopher and gemini client for Emacs.
9 @end direntry
10
11 @copying
12 This manual documents Elpher, a gopher and gemini client for Emacs.
13
14 Copyright @copyright{} 2019-2023  Tim Vaughan@*
15 Copyright @copyright{} 2021 Daniel Semyonov@*
16 Copyright @copyright{} 2021 Alex Schroeder
17
18 @quotation
19 The source and documentation of Elpher is free software.  You can
20 redistribute it and/or modify it under the terms of the GNU General
21 Public License as published by the Free Software Foundation; either
22 version 3, or (at your option) any later version.
23
24 Elpher is distributed in the hope that it will be useful, but WITHOUT
25 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
26 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License in
27 the file COPYING in the same directory as this file for more details.
28 @end quotation
29 @end copying
30
31 @titlepage
32 @title Elpher Gopher and Gemini Client Manual
33 @author Tim Vaughan
34
35 @page
36 @vskip 0pt plus 1filll
37 @insertcopying
38 @end titlepage
39
40 @contents
41
42 @ifnottex
43 @node Top, Introduction, (dir), (dir)
44 @top Elpher
45
46 @insertcopying
47
48 @menu
49 * Introduction::                Elpher Overview: what's this all about?
50 * Installation::                Installing Elpher
51 * Quick Start::                 Get up and running quickly
52 * Navigation::                  Fundamentals of Elpher navigation
53 * Bookmarks::                   How to record and visit bookmarks
54 * Gopher character encodings::  How Elpher selects encodings for gopher pages
55 * Encrypted gopher connections::  How and when TLS is enabled for gopher
56 * Gemini support::              Support for the Gemini protocol
57 * Finger support::              Support for the Finger protocol
58 * Local files::                 Opening local files in elpher
59 * About pages::                 Special pages and how to reference them
60 * ANSI support::                Notes in Elpher's ANSI support
61 * Customization::               How to customize various aspects of Elpher
62 * Command Index::
63 * News::                        Changes introduced by major releases
64 * Contributors::                Contributors to Elpher
65
66 @detailmenu
67  --- The Detailed Node Listing ---
68
69 Installation
70
71 * Installing from ELPA or MELPA::  Installing from a package repository
72 * Installing by hand::          Installing directly from the source
73
74 Navigation
75
76 * Within-page navigation::      Moving about within a page
77 * Between-page navigation::     Commands for moving between pages
78 * History and Caching::         Explanation of how Elpher represents history
79
80 Gemini support
81
82 * Client Certificates for Gemini::  Accessing secure gemini pages
83 * Hiding preformatted text in text/gemini documents::  An accessibility option
84
85 News
86
87 * v3.5.0::
88 * v3.4.0::
89 * v3.3.0::
90 * v3.2.0::
91 * v3.1.0::
92 * v3.0.0::
93
94 @end detailmenu
95 @end menu
96
97 @end ifnottex
98
99 @macro keycmd{key,cmd}
100 @item \key\  (@code{\cmd\})
101 @findex \cmd\
102 @end macro
103
104 @node Introduction, Installation, Top, Top
105 @chapter Introduction
106
107 Elpher aims to be a capable and practical gopher and gemini client for
108 Emacs.  Its focus is on easy keyboard-driven navigation based on
109 sensible default bindings (with out-of-the-box support for Evil).  It is
110 intended to be robust and behave in non-surprising ways at all times.
111 Additionally, Elpher provides the following bells and whistles:
112
113 @itemize
114 @item
115 followable web and gopher links in plain text,
116
117 @item
118 an easily navigable history, sporting caching of visited pages (both
119 content and cursor position),
120
121 @item
122 auto-completing menu item navigation,
123
124 @item
125 direct visualization of image files where supported (no writing to
126 disk),
127
128 @item
129 basic support for the new ``heavier than gopher, lighter than the web'' Gemini protocol,
130
131 @item
132 support for the Finger protocol.
133
134 @end itemize
135
136 Elpher is still under active development.  Although we try very hard to
137 ensure that releases are bug-free, this cannot be guaranteed.  However,
138 this also means that any usability features that you feel are missing
139 can likely by incorporated quickly, so please get in touch if you
140 have some ideas.
141
142 @node Installation, Quick Start, Introduction, Top
143 @chapter Installation
144
145 @menu
146 * Installing from ELPA or MELPA::  Installing from a package repository
147 * Installing by hand::          Installing directly from the source
148 @end menu
149
150 @node Installing from ELPA or MELPA, Installing by hand, Installation, Installation
151 @section Installing from ELPA or MELPA
152
153 Elpher is available on the non-GNU ELPA package archive.  If you are
154 using Emacs 28 or later, this archive should be available on your system
155 by default.  For Emacs 27, you'll need to follow the instructions at
156 @url{https://elpa.nongnu.org} to make the archive accessible.
157
158 Alternatively, Elpher is available from the MELPA package archive.  If you have
159 never installed packages from this repository before, you'll need
160 to follow the instructions at @url{https://melpa.org/#/getting-started}.
161
162 Once one of these package archives is installed, enter the following to
163 install Elpher:
164
165 @example
166 @kbd{M-x package-install @key{RET} elpher @key{RET}}
167 @end example
168
169 @noindent To uninstall, use
170
171 @example
172 @kbd{M-x package-delete @key{RET} elpher @key{RET}}.
173 @end example
174
175 @node Installing by hand,  , Installing from ELPA or MELPA, Installation
176 @section Installing by hand
177
178 It is also possible to install Elpher directly by downloading the file
179 @file{elpher.el} from @url{gopher://thelambdalab.xyz/1/projects/elpher}
180 (you'll need to download the ``source archive'' and extract it), adding
181 it to a directory in your @code{load-path}, and then adding
182
183 @example
184 (require 'elpher)
185 @end example
186
187 @noindent to your Emacs initialization file.
188
189 @node Quick Start, Navigation, Installation, Top
190 @chapter Quick Start
191
192 Before diving into the minutiae of the different commands available,
193 we will quickly describe how to get up and running with Elpher.
194
195 Once installed, you can launch Elpher using
196
197 @example
198 @kbd{M-x elpher @key{RET}}
199 @end example
200
201 @noindent This will switch to the *Elpher* buffer and display a start
202 page, with information on each of the default keyboard bindings.
203
204 From here you can move point between links (which may be menu items or
205 inline URLs in text files) by using @key{TAB} and @kbd{S-@key{TAB}},
206 as in Info.  You can also jump directly to a menu item using @key{m}, or
207 use the standard Emacs or Evil motion and search commands to find your
208 way around.  To open a link, press @key{RET}.  (Where a mouse is
209 available, Clicking on a link with the mouse cursor has the same
210 effect.)
211
212 To return to the page you just followed the link from, press @key{u}.
213
214 Elpher caches (for the duration of an Emacs session) both page contents
215 and the position of point on each of the pages (gopher menus, gemini
216 pages, query results, or text pages) you visit, restoring these when you
217 next visit the same page.  Thus, pressing @key{u} displays the previous
218 page in exactly the same state as when you left, meaning that you can
219 quickly and visually explore the different documents in a menu without
220 having to wait for anything to reload.
221
222 Of course, sometimes you'll @emph{want} to reload the current page
223 rather than stick with the cached version.  To do this use @key{R}.
224 (This is particularly useful for search query results, where this
225 allows you to perform a different search.)
226
227 That's more-or-less it. Elpher supports a number of other features,
228 such a support for different coding schemes and TLS encryption, and a
229 variety of customization options, all of which are explained in the
230 rest of this document. However the emphasis is on keeping the basic
231 navigation experience as intuitive and responsive as possible.
232
233 Note that you can launch multiple Elpher sessions in parallel by using
234 a prefix:
235
236 @example
237 @kbd{C-u M-x elpher @key{RET}}
238 @end example
239
240 @node Navigation, Bookmarks, Quick Start, Top
241 @chapter Navigation
242 Throughout this manual, we use the word ``page'' to refer to any
243 visualization of a response from a gopher or gemini server, be it a
244 menu/directory, query result, text file or image.
245
246 Elpher's navigation interface is inspired by the Emacs Info mode.
247 Movement within a page is essentially the same as moving
248 around any other text file in Emacs, but with special keys
249 for quickly jumping between menu items and URLs in text files.
250 Movement between pages is facilitated by a simple linear history
251 coupled with caching of pages and cursor position.
252
253 @menu
254 * Within-page navigation::      Moving about within a page
255 * Between-page navigation::     Commands for moving between pages
256 * History and Caching::         Explanation of how Elpher represents history
257 @end menu
258
259
260 @node Within-page navigation, Between-page navigation, Navigation, Navigation
261 @section Within-page navigation
262
263 To move about within a page, you should be able use the same keys you usually
264 use to browse files in Emacs.  This is even true when Evil mode is
265 enabled. Paragraph hopping, searching etc should work as usual.
266
267 In addition, the following commands are provided for quickly moving between
268 links and menu items.
269
270 @table @asis
271 @keycmd{@key{TAB}, elpher-next-link}
272 Move to the next link or menu item in the file.
273
274 @item @kbd{Shift-@key{TAB}} or @key{BACKTAB} (@code{elpher-prev-link})
275 @findex elpher-prev-link
276 Move to the previous link or menu item in the file.
277
278 @keycmd{@key{m}, elpher-jump}
279 Jump directly to a link within a file by specifying its display string
280 or link text.  (Unlike the previous two commands, this immediately opens
281 the selected link.
282 @end table
283
284
285 The following commands can be used to retrieve information about the
286 current page, or the address of the link at point:
287
288 @table @asis
289 @keycmd{@key{i}, elpher-info-link}
290 Display host, port and selector information for the link at point.
291
292 @keycmd{@key{I}, elpher-info-current}
293 Display host, port and selector information for the current page.
294
295 @keycmd{@key{c}, elpher-copy-link-url}
296 Add URL representing address of link at point to the kill-ring and the
297 system clipboard (if available).
298
299 @keycmd{@key{C}, elpher-copy-current-url}
300 Add URL representing address of the current page to the kill-ring and
301 the system clipboard (if available).
302
303 @keycmd{@key{d}, elpher-download}
304 Download link at point and save the result as a file.  The minibuffer
305 will prompt for the name of the file to write, with the default name being
306 the display string (if available) associated with the link.
307
308 @keycmd{@key{D}, elpher-download-current}
309 This is similar to @code{elpher-download}, but instead applies to the
310 current page rather than a link.
311
312 @keycmd{@key{.}, elpher-view-raw}
313 This displays the raw server response for the current page.  While not
314 useful for general browsing, it is useful for debugging incorrect rendering
315 or out-of-spec server responses.
316 @end table
317
318 @node Between-page navigation, History and Caching, Within-page navigation, Navigation
319 @section Between-page navigation
320
321 Moving to a different page can be accomplished in several ways,
322 described by the following command:
323
324 @table @asis
325 @keycmd{@key{RET}\, @key{mouse-1}, elpher-follow-link}
326 Follow the menu item or link at point (or selected with the mouse).
327
328 Exactly what is meant by ``follow'' depends on the kind of item selected:
329
330 @itemize
331 @item
332 For text or menu type items or links, the current page text is replaced
333 by the text of this item.  Unless the customization variable
334 @code{elpher-use-header} (@pxref{Customization}) is 
335 @code{nil}, the display string of the link is displayed in the buffer header.
336 Links to images behave similarly on Emacs systems supporting the display of
337 bitmap graphics, however their content is not cached in memory by default.
338
339 @item
340 When followed, links to search/query items (type 7) prompt for input in
341 the minibuffer then display the results in the same way as for text and menu
342 items.
343
344 @item
345 Following links to binary files (and image files on unsupported systems)
346 causes Elpher to prompt for a filename in which to save the content.
347
348 @item
349 Following links of type `h' with a selector having the `URL:' prefix, or
350 unsupported URLs in text files, will result in Elpher using an external
351 programme to open the URL.  This will be either the default system browser
352 or, if the @code{elpher-open-urls-with-eww} customization variable is non-nil,
353 Emacs' own EWW browser. (See @pxref{Customization}.) 
354
355 @end itemize
356
357 Once a text, menu or query response page has been displayed, its contents are
358 cached for the duration of the Emacs session. 
359
360 @keycmd{@key{g}, elpher-go}
361 Open a particular page by specifying either its full URL or just
362 entering a gopher host name. (The protocol defaults to gopher, so gemini
363 links must include the @code{gemini://} prefix.
364
365 If a unsupported protocol is used in the URL the result will be the same
366 as following a URL link of the same type from a link in a page.
367
368 @keycmd{@key{o}, elpher-go-current}
369 Prompts for a URL similar to @code{elpher-go}, but initialized to the URL
370 of the current page.  This allows you to easily try other selectors for the
371 same server.
372
373 Remember however, that the Gopher RFC 1436 provides @emph{no} guarantees about the
374 structure of selectors.
375
376 @keycmd{@key{O}, elpher-root-dir}
377 Open the root page (empty selector) on the current host.
378
379 @keycmd{@key{u}\, @key{-}\, @key{^}\, @key{mouse-3}, elpher-back}
380 Return to the previous page, where ``previous'' means the page where the
381 page which was displayed immediately before the current page.
382 @end table
383
384
385 @node History and Caching,  , Between-page navigation, Navigation
386 @section History and Caching 
387
388 The history and caching strategy in Elpher is extremely simple, but
389 may be confusing without a good mental model of how it works.  That
390 is what this section attempts to provide.
391
392 Essentially, @strong{every} time you navigate to a new page, either
393 by clicking or pressing @key{RET} on a link, using @key{g} to jump
394 to a new page by its address, or using @key{O} to open the root selector,
395 the following two things occur:
396
397 @enumerate
398 @item
399 the cursor position and content for the original page are recorded in an
400 in-memory cache, and
401
402 @item
403 the original page is set as the ``parent'' of the new page.
404 @end enumerate
405
406 The only way to return to pages in this history is by using @key{u},
407 which returns to the previous of the current page.  @footnote{The
408 addition of the new page to the history happens even if the new page is
409 one that has been seen before. This is mostly the desired behaviour.
410 However, opening an explicit ``back'' link provided by a gopher menu or
411 gemini page will also add a new entry to the history.  Unless you
412 haven't yet visited that menu, it's therefore better to use @key{u} to
413 go back in this case.}
414
415 One aspect that may seem peculiar is that Elpher lacks a corresponding ``next'' or
416 ``forward'' command.  However, since Elpher caches the position of point,
417 this will be automatically positioned on the link that was most recently followed
418 from a given page.  This means that, at least for links followed from menus
419 and text files, the inverse of @key{u} is actually just @key{RET}.
420
421 Elpher actually maintains two histories, and there are two different
422 commands to access them:
423
424 @table @asis
425 @keycmd{@key{s}, elpher-show-history}
426 This shows the history of the current buffer. This shows all the links
427 you would visit if you were to use @key{u} again and again.
428
429 @keycmd{@key{S}, elpher-show-visited-pages}
430 This shows the entire Elpher browsing history. It includes all the
431 pages you visited in your current Emacs session.
432
433 @end table
434
435 @node Bookmarks, Gopher character encodings, Navigation, Top
436 @chapter Bookmarks
437
438 Elpher makes use of standard Emacs bookmarks.
439 @xref{Bookmarks, , , emacs, The Emacs Editor}.
440 The following commands are used to add new bookmarks:
441
442 @table @asis
443 @keycmd{@key{a}, elpher-bookmark-link}
444 Add a bookmark for the link at point.  The minibuffer will prompt for
445 a name for the bookmark, which defaults to the display string.
446
447 @keycmd{@key{A}, elpher-bookmark-current}
448 Add a bookmark for the current page.  The minibuffer will prompt for
449 a name for the bookmark, defaulting to the display string associated
450 with the link that was followed to reach the current page.
451
452
453 @keycmd{@key{B}, elpher-open-bookmarks}
454 Visit a page displaying all elpher bookmarks. 
455 The behaviour of the this function depends on the customization variable
456 @code{elpher-use-emacs-bookmark-menu}.  If nil (the default), the
457 command will visit a special elpher page listing all elpher-specific
458 bookmarks.  If non-nil, the command will simply open the standard Emacs
459 bookmark list displaying all current bookmarks (including non-elpher
460 bookmarks).
461
462 @keycmd{@kbd{C-x r l}, bookmark-bmenu-list}
463 This command opens the standard Emacs bookmark menu, with which bookmarks
464 can be renamed, deleted or annotated.
465
466 @end table
467
468 On opening the bookmarks page, elpher will offer to import any legacy
469 (2.x) bookmarks files into the new system. Once the import is complete,
470 the original bookmarks file will have ``-legacy'' appended to it, so
471 so that elpher knows not to import it again.
472
473 If you have any other legacy bookmark files (besides the one in the
474 original location, or specified in the @code{elpher-bookmarks-file}
475 customization variable, which should be automatically detected), you can
476 can import these using
477
478 @example
479 @kbd{M-x elpher-bookmark-import @key{RET}}
480 @end example
481
482 Once this is done, you may delete these legacy bookmarks files.
483
484 @node Gopher character encodings, Encrypted gopher connections, Bookmarks, Top
485 @chapter Gopher character encodings
486
487 Responses Elpher retrieves from servers are initially read as pure
488 binary data.  When the data is intended to be interpreted as textual (as
489 determined by the type parameter of the gopher menu item or the gopher
490 URL), this data needs to be @emph{decoded} into a sequence of
491 characters.  To do this properly requires knowledge of the encoding
492 system used by whoever authored the document.
493
494 Unfortunately gopher lacks a systematic way of acquiring this necessary
495 information. Thus, the details of the coding system must be either
496 inferred from the binary data, or must be specified by the user.
497
498 By default, Elpher applies Emacs' built-in character encoding detection
499 system to the full (undecoded) response data and uses this to attempt to
500 convert it into a character string.
501 (See @pxref{Recognize coding, Recognizing coding systems, ,emacs}.) While
502 this approach can be okay, it is important to realize that its inference
503 algorithm is extremely primitive and depends heavily on assumptions based
504 on the language settings of your emacs system.
505
506 The alternative is to explicitly set the coding system used for decoding
507 using the following command:
508
509 @table @asis
510 @keycmd{@key{!},elpher-set-coding-system}
511 Causes a elpher to prompt for a coding system to use for decoding
512 future gopher text.  The @key{TAB} key can be used at this prompt to display a
513 list of alternatives (which is extensive) and to auto-complete.  An empty
514 response will cause Elpher to return to its default auto-detection
515 behaviour.
516 @end table
517
518 Note that changing the coding system only affects newly loaded text.
519 Thus, if text has already been decoded using an incorrect system, you
520 will need to select the correct coding and then reload the text using
521 @key{R}.
522
523
524 @node Encrypted gopher connections, Gemini support, Gopher character encodings, Top
525 @chapter Encrypted gopher connections
526
527 While RFC 1436 does not broach the topic of encryption at all, several
528 modern gopher servers can serve content over encrypted connections,
529 and a common choice for this is TLS.
530
531 Elpher can retrieve selectors using Emacs' built-in TLS support which
532 uses the GnuTLS library. (It is possible to build emacs without
533 GnuTLS, in which case encryption is not supported.)
534
535 To retrieve documents using TLS, Elpher's TLS mode must be enabled.
536 This can be directly toggled using @key{T}, but note that just as with
537 the character encoding, changing this mode only affects subsequent
538 connections.
539
540 Alternatively, TLS mode is @emph{automatically} enabled whenever
541 gopher URLs starting with @code{gophers://} are followed.
542
543 The mode is sticky, so it remains active until switched off.
544 It can also be automatically switched off when a TLS connection fails.
545 In this case Elpher will prompt for your confirmation to ensure that
546 you can't accidentally make a non-TLS connection.
547
548 @node Gemini support, Finger support, Encrypted gopher connections, Top
549 @chapter Gemini support
550
551 @uref{gopher://gemini.circumlunar.space, Gemini}
552 is a new protocol being developed by several members of
553 gopherspace.  It aims to solve some of the long-standing technical
554 issues associated with gopher as a protocol, while keeping the major benefits.
555 For instance, it _requires_ encrypted connections, it does away with
556 the selector type, and allows servers to explicitly specify the
557 character coding scheme used for text documents.
558
559 The latest versions of Elpher aim to provide seamless transitions between
560 gemini and gopher documents.  Basically you should be able to open,
561 bookmark, download and otherwise interact with gemini pages in exactly
562 the same way as you do with other non-gemini pages.  The only major
563 difference from your perspective as a user is that you should no longer
564 have to worry about manually toggling TLS on or off (for gemini it's
565 always on), and you should never have to manually set a character coding
566 scheme.
567
568 The gemini protocol specification recommends a Trust on First Use (TOFU)
569 behaviour when validating gemini server TLS certificates.  This is
570 because many gemini servers rely on self-signed certificates rather
571 than certificates signed by a CA. Sadly however, this TOFU behaviour is
572 far from straight-forward to configure using Emacs' existing Network
573 Security Manager.  For this reason, elpher defaults to performing no
574 certificate verification by default.  This behaviour can be easily
575 customized by setting the @code{elpher-gemini-TLS-cert-checks}
576 customization variable to non-nil.
577
578 The gemini specification concerns both the protocol and a simple text
579 document format (mimetype text/gemini) which is like a mixture between
580 gophermap files and markdown-formatted files but simpler than both.
581 Elpher renders gemini responses which are provided in this format in
582 line with the rules in the spec.  This includes wrapping long lines at
583 word boundaries.  The specific column at which this text is wrapped is
584 defined by the customization variable
585 @code{elpher-gemini-max-fill-width}, which is set to 80 columns by
586 default. (This is slightly wider than Emacs' default fill width of 70
587 columns due to the fact that there are a significant amount of older
588 gemini content which, against the advice of the current spec, hard wraps
589 at <80 columns.  The larger default allows this to still look okay,
590 while still keeping content without hard wraps looking pleasant.)
591
592 The text/gemini format also possesses a section header syntax similar to
593 markdown.  Elpher allows different header levels to be drawn with
594 different, customizable, faces.  By default, on graphically-capable
595 emacs systems, these faces are given different heights to distinguish
596 among levels.  On terminal systems, the level is indicated by the
597 number of preceding # symbols.
598
599 I should emphasize however that, while it is definitely functional,
600 Elpher's gemini support is still experimental, and various aspects will
601 change as the protocol develops further.
602
603 @menu
604 * Client Certificates for Gemini::  Accessing secure gemini pages
605 * Hiding preformatted text in text/gemini documents::  An accessibility option
606 @end menu
607
608 @node Client Certificates for Gemini, Hiding preformatted text in text/gemini documents, Gemini support, Gemini support
609 @section Client Certificates for Gemini
610
611 Gemini makes explicit use of the client certificate mechanism that TLS
612 provides for allowing clients to authenticate themselves with servers.
613 The Gemini specification suggests two distinct classes of client
614 certificates: short-lived certificates used to identify you for a single
615 session, and more permanent certificates used to identify you over a
616 longer time period.
617
618 When Elpher receives a request for a client certificate from a server,
619 it will present you with the option to create and use a single-use
620 ``throwaway'' certificate, or to use a ``persistent''
621 certificate (optionally creating it or installing pre-existing key and
622 certificate files).
623
624 Certificate creation in Elpher requires an installation of OpenSSL, and
625 ---in particular---that Elpher be able to run the @command{openssl} command-line
626 utility.  By default, Elpher assumes that the @command{openssl} is on the
627 system path, but the precise location can be set by customizing the
628 @code{elpher-openssl-command} variable.
629
630 Each generated certificate results in the creation of a .key file and
631 a .crt file.  In the case of a throwaway certificate, these files are
632 stored in the temporary directory indicated by the Emacs variable
633 @code{temporary-file-directory} and are deleted when ``forgotten''
634 (as described below).
635
636 In the case of persistent certificates, these files are stored in the
637 folder defined by the Elpher variable
638 @code{elpher-certificate-directory}, and are never deleted by Elpher.
639 (Of course you can delete them yourself whenever you like.)
640 The base name of the files (i.e. sans extension) is what Elpher uses
641 to identify the certificate.
642
643 Using throwaway certificates is as simple as pressing the @key{t} 
644 key at the prompt which appears following a certificate request from
645 a server.  There is nothing more to do.
646
647 Using a persistent certificate requires instead selecting @key{p} from the same
648 menu.  This will result in Elpher asking you for the name identifying
649 the certificate.  This entry autocompletes to the list of known certificate
650 names, so you can use @key{TAB} to display the list.
651
652 In the case that you choose a name that does not belong to the list of
653 known certificates, Elpher will offer to create one for you or to
654 ``install'' one from existing key and certificate files.
655 Pressing the @key{n} key will cause Elpher to begin the process of
656 creating a new persistent certificate, using some additional
657 details for which you will be prompted.
658 Alternatively, pressing the @key{i} key will cause Elpher to ask for the
659 locations of existing key and certificate files to add to
660 @code{elpher-certificate-directory} under the chosen name.
661
662 Once a certificate is selected, it will be used for all subsequent
663 gemini requests involving URLs begining with the URL for for which the
664 certificate was created.  It is immediately ``forgotten'' when a TLS
665 connection to a non-matching URL is attempted, or the following command
666 is issued:
667
668 @table @asis
669 @keycmd{@key{F},elpher-forget-certificate}
670 Causes Elpher to immediately forget any currently-loaded client certificate.
671 @end table
672
673 In either case, ``forgetting'' means that the details of the key and
674 certificate file pair are erased from memory.  Furthermore, in the case
675 of throw-away certificates, the corresponding files are deleted.
676
677 Persistant client certificates can be added to the alist contained in the
678 customization variable @code{elpher-certificate-map} so that they are
679 automatically activated whenever a gemini page with the matching URL
680 prefix is visited.
681
682 @node Hiding preformatted text in text/gemini documents,  , Client Certificates for Gemini, Gemini support
683 @section Hiding preformatted text in text/gemini documents
684
685 Preformatted text is often used to display ``ASCII art'' or other
686 similar text-based artwork.  While for many this is a fun way to
687 introduce personality into their gemini documents, such text can
688 pose difficulties for screen readers.
689
690 Setting the @code{elpher-gemini-hide-preformatted} customization option
691 to non-nil causes Elpher to hide all preformatted text blocks by
692 default.  In place of the preformatted text, Elpher instead displays the
693 ``alt text'' (if any is available), along with a button which can be
694 used to make specific blocks visible as required.
695
696 Other related customization options are
697 @code{elpher-gemini-preformatted-toggle-label}, which is the label used
698 for the toggle button, and
699 @code{elpher-gemini-preformatted-toggle-bullet}, which is the margin
700 string used to distinguish the line replacing the preformatted text.
701
702 @node Finger support, Local files, Gemini support, Top
703 @chapter Finger support
704
705 Incidentally, Elpher has native support for querying finger servers.
706 Of course, one could argue that this functionality is more easily
707 provided by one's local telnet client.  However finger URLs do appear
708 on occasion in gopherspace, and it's nice to be able to open them
709 in place.
710
711 Elpher interprets @code{finger://} URLs as follows:
712
713 @itemize
714
715 @item
716 The host is determined by the host name portion of the URL.
717
718 @item
719 In the case that the @emph{file name} portion of the URL is non-empty (besides
720 the leading slash), this is interpreted as the user to finger.
721
722 @item
723 Otherwise, the @emph{user} portion of the URL is interpreted as the user to finger.
724
725 @item
726 If no user is provided, the root directory of the finger server is requested.
727
728 @end itemize
729
730 Thus @code{finger://user@@hostname} and @code{finger://hostname/user} are both equivalent.
731
732 (The precedence of the /user notation over the user@ notation reflects a
733 preference of the community.)
734
735 @node Local files, About pages, Finger support, Top
736 @chapter Local files
737
738 Elpher supports opening local files via @samp{file:} URLs.
739
740 For instance, pressing @key{g} and entering @code{file:~/document.gmi}
741 will load the file named @samp{document.gmi} in your home directory,
742 provided this file exists.
743
744 Files opened in this way are rendered according to their name, and in
745 particular their extension.  The current mappings are as follows:
746
747 @table @asis
748
749 @item @samp{txt}
750
751 Plain text documents.  All local text files are assumed to be
752 UTF-8-encoded.
753
754 @item @samp{gophermap},@samp{gopher}
755
756 Gophermap files, i.e. files containing a valid directory list as specified
757 by RFC 1436.
758
759 @item @samp{gemini},@samp{gmi}
760
761 Gemini documents (i.e. documents of MIME type ``text/gemini'').  All
762 local gemini files are assumed to be UTF-8-encoded.
763
764 @item @samp{html},@samp{htm}
765
766 HTML documents.  All local HTML files are assumed to be UTF-8-encoded.
767
768 @item @samp{png},@samp{jpg},@samp{jpeg},@samp{gif},@samp{bmp},@samp{tif},@samp{tiff}
769
770 Image files.
771
772 @item Anything else
773 A binary document, which elpher will simply offer to save somewhere
774 else. (Obviously this is not useful in its own right, but there's not
775 much that elpher can sensibly do with unknown binary files.)
776
777 @end table
778
779
780 @node About pages, ANSI support, Local files, Top
781 @chapter About pages
782
783 Like other browsers, elpher makes certain internally-generated pages
784 such as the initial welcome page, the bookmarks page, the history
785 stack and the list of visited pages pages accessible as URLs with
786 the ``about:'' type.
787
788 This means that these pages can be bookmarked and, more usefully,
789 added to a local file to be rendered as a user-defined start page.
790
791 To see the address of a special page, simply visit the page and
792 press @key{I}.
793
794 @node ANSI support, Customization, About pages, Top
795 @chapter ANSI support
796
797 Depending on which parts of the gopher/gemini universe you frequent,
798 you may occasionally stumble on sites which use ANSI escape codes to
799 either produce specific characters or to colour text.
800
801 By default, elpher uses Emacs' built-in ANSI rendering library,
802 @samp{ansi-color}, to process ANSI codes.  This robustly interprets
803 the escape codes but only supports 8 colours.  Any colours unsupported
804 by the library are simply stripped, leaving uncoloured text in the
805 majority of cases.
806
807 To drastically improve the number of colours produced, install the
808 @samp{xterm-color} package from MELPA.  This package will be automatically
809 used by elpher if it is available, and supports 256 colours.
810 This should be sufficient to properly render many ANSI colour
811 gopher holes and gemini capsules quite nicely.
812
813 In case you prefer to completely strip out the ANSI escape codes entirely
814 by customizing the @code{elpher-filter-ansi-from-text} variable.
815
816
817 @node Customization, Command Index, ANSI support, Top
818 @chapter Customization
819
820 Various parts of Elpher can be customized via the 
821 variables belonging to the elpher customization group, accessible
822 using
823
824 @example
825 @kbd{M-x customize-group elpher @key{RET}}
826 @end example
827
828 @noindent This group contains a number of faces that can be modified to change
829 the appearance of Elpher, including one face per menu item type.
830
831 The group also contains variables for customizing the behaviour of
832 Elpher.  This includes how to open arbitrary (non-gopher) URLs, whether
833 to display buffer headers, how to deal with ANSI escape sequences in
834 text, the timeout to impose on network connections, and whether to
835 prompt for confirmation when switching away from TLS.
836
837 One particularly important customization is the @code{elpher-start-page-url}
838 variable, which holds the URL of the page displayed initially when
839 elpher starts, and when @key{U} is pressed.  By default this is set to
840 @samp{about:welcome}, but any URL can be substituted.  For example, you
841 might want to create a text/gemini file named
842 @samp{~/.emacs/start-page.gmi} containing useful links and set the value
843 of @code{elpher-start-page-url} to @samp{file:~/.emacs/start-page.gmi} to have
844 these links displayed at startup.  Alternatively, you might prefer
845 to set the value to @samp{about:bookmarks} so that the bookmarks page
846 is used as the start page instead.
847
848 See the customization group itself for details.
849
850 @node Command Index, News, Customization, Top
851 @unnumbered Command Index
852
853 @printindex fn
854
855 @node News, Contributors, Command Index, Top
856 @chapter News
857
858 This chapter documents the major changes introduced by Elpher releases.
859
860 @menu
861 * v3.5.0::
862 * v3.4.0::
863 * v3.3.0::
864 * v3.2.0::
865 * v3.1.0::
866 * v3.0.0::
867 @end menu
868
869 @node v3.5.0, v3.4.0, News, News
870 @section v3.5.0
871
872 @subsection Automatic activation of client certificates in gemini
873
874 This version introduces a new customization variable
875 @code{elpher-certificate-map} which allows you to pre-specify
876 a set of gemini URLs and the client certificates which should
877 be used when accessing them.
878
879 @xref{Client Certificates for Gemini} for more details.
880
881 @node v3.4.0, v3.3.0, v3.5.0, News
882 @section v3.4.0
883
884 @subsection Toggling preformatted text visibility
885
886 This version introduces the ability to hide preformatted text in
887 text/gemini documents by default.  To enable this, set the customization
888 variable @code{elpher-gemini-hide-preformatted} to non-nil.  This causes
889 all preformated text blocks to be replaced with their ``alt-text'' (if
890 any is available) and a button for toggling the visibility of the text
891 block.
892
893 This feature is intended to make it easier for people using screen
894 readers to read text/gemini documents.
895
896 @node v3.3.0, v3.2.0, v3.4.0, News
897 @section v3.3.0
898
899 This version includes lots of bug fixes, as well as a couple of new
900 features.
901
902 @subsection Local gophermaps
903
904 Local gophermaps can now be displayed using @samp{file:}. To render
905 correctly, they must have the suffix @samp{.gopher} or @samp{.gophermap}.
906
907 @subsection IRI support
908
909 Internationalized Resource Identifiers (IRI) are an extension of URLs
910 (or, more accurately, URIs) to support a larger set of characters beyond
911 those in the US-ASCII character set.  They map directly onto URIs for
912 backwards compatibility, but look like gibberish if not properly
913 decoded.  When displaying URLs, Elpher now automatically decodes any IRI
914 characters and displays the decoded IRI.  (For security reasons, the
915 @code{elpher-info-current} command (@kbd{I}) always displays both the
916 decoded IRI and the URI when they differ.)
917
918 @node v3.2.0, v3.1.0, v3.3.0, News
919 @section v3.2.0
920
921 This version introduces several minor changes which, together, make it
922 possible to set up alternative start pages configured to your liking.
923
924 @subsection About pages
925
926 Special elpher pages such as the welcome page (previously ``start''
927 page), the bookmarks page, the browsing history stack and list of
928 visited pages are now addressable via @samp{about:} URLs.  For instance,
929 the standard welcome page has the address @samp{about:welcome}.
930
931 @subsection Local files
932
933 Local files can now be opened in elpher using @samp{file:} URLs. For
934 example, @kbd{g @samp{file:~/my-start.gmi}} will open
935 @samp{~/my-start.gmi} as a text/gemini document. @pxref{Local files}
936 for details.
937
938 @subsection Customizable start pages
939
940 The new customization variable @code{elpher-start-page-url} contains the URL
941 of the document to be loaded as elpher's ``start page''.  By default
942 this is set to @samp{about:welcome}, but any elpher-accessible URL is
943 valid. @pxref{Customization} for suggestions.
944
945 @node v3.1.0, v3.0.0, v3.2.0, News
946 @section v3.1.0
947
948 @subsection Bookmarks system
949
950 While Elpher bookmarks are still handled by the Emacs bookmark
951 system, this release introduces the option to retain the
952 original elpher bookmark page for the purpose of visiting those
953 bookmarks.  In v3.1.0, @key{B} visits this page (and adds it to
954 the history stack, as in previous versions), which can be interacted
955 with using the standard elpher key bindings.
956
957 Of course you can still view the bookmarks in the Emacs bookmark
958 menu, which you can access from anywhere using the default
959 binding @kbd{C-x r l} (or by following the link from the Elpher bookmarks
960 page).  Indeed you will need to use this to rename, delete or otherwise
961 edit your bookmarks.
962
963 If you prefer to avoid using the Elpher bookmark page entirely, you
964 use the customization variable @code{elpher-use-emacs-bookmark-menu}
965 to have the @key{B} key open the Emacs bookmark menu directly, as in
966 the previous release.
967
968 @node v3.0.0,  , v3.1.0, News
969 @section v3.0.0
970
971 @subsection Bookmarks system
972
973 Bookmarks are now handled by Emacs' own bookmark management system,
974 instead of Elpher's own system.
975 (For details, @xref{Bookmarks, , , emacs, The Emacs Editor}.)
976 This means two things.  Firstly,
977 the bookmarks file (elpher-bookmarks by default) and format used by
978 previous versions are now deprecated.  If these are detected, Elpher
979 will offer to import your old bookmarks when you first accessing the
980 bookmark list with the new version.  A suffix will be added to your
981 old bookmarks file so that Elpher knows that the import is complete.
982
983 Secondly, the old Elpher bookmark menu has been removed in the new
984 version.  Instead, @key{B} brings up the menu provided by the Emacs
985 function @code{bookmark-bmenu-list}. This has different key and mouse
986 bindings to Elpher's old menu, but is much more functional.  Bookmarks
987 can be renamed, deleted in groups, and much more.  (Use @kbd{C-h m} with
988 the menu open to see the complete list.)
989
990 @subsection History
991
992 Browsing history can now be accessed via new bindings to @key{s} and @key{S}.
993 The former shows the current history ``stack'' (pages accessible with
994 the @key{u} key), while the latter shows a list of all pages which have
995 been visited in the current session.
996
997 @subsection Socks connections
998
999 Elpher can now use socks connections to browse via TOR.
1000
1001 @subsection browse-url, Org and mu4e integration
1002
1003 These integrations provide support for elpher-handling of gemini, gopher
1004 and finger URLs using @code{browse-url}, in Org documents, and the mu4e
1005 mail system.
1006
1007 @subsection imenu integration
1008
1009 Gemini document headers are now navigable via imenu.
1010 For details, @xref{Imenu, , , emacs, The Emacs Editor}.
1011
1012 @node Contributors,  , News, Top
1013 @chapter Contributors
1014
1015 Elpher was originally written and is currently maintained by Tim Vaughan
1016 @email{plugd@@thelambdalab.xyz}.  Significant improvements and
1017 maintenance have also been contributed by and with the help of Alex
1018 Schroeder @email{alex@@gnu.org}.  In addition, the following people have
1019 all generously provided assistance and/or patches:
1020
1021 @itemize
1022 @item Jens Östlund @email{jostlund@@gmail.com}
1023 @item F. Jason Park @email{jp@@neverwas.me}
1024 @item Christopher Brannon @email{chris@@the-brannons.com}
1025 @item Omar Polo @email{op@@omarpolo.com}
1026 @item Noodles! @email{nnoodle@@chiru.no}
1027 @item Abhiseck Paira @email{abhiseckpaira@@disroot.org}
1028 @item Zhiwei Chen @email{chenzhiwei03@@kuaishou.com}
1029 @item condy0919 @email{condy0919@@gmail.com}
1030 @item Alexis @email{flexibeast@@gmail.com}
1031 @item Étienne Deparis @email{etienne@@depar.is}
1032 @item Simon Nicolussi @email{sinic@@sinic.name}
1033 @item Michel Alexandre Salim @email{michel@@michel-slm.name}
1034 @item Koushk Roy @email{kroy@@twilio.com}
1035 @item Vee @email{vee@@vnsf.xyz}
1036 @item Simon South @email{simon@@simonsouth.net}
1037 @item Daniel Semyonov @email{daniel@@dsemy.com}
1038 @item Bradley Thornton @email{bradley@@northtech.us}
1039 @end itemize
1040
1041 @bye