__________________
EMACS AND GOPHER
__________________
Table of Contents
_________________
1. Browsing
.. 1. Gopher browser in Emacs
.. 2. Using Lynx in a terminal buffer
2. Creating gopher optimized documents
.. 1. Org-mode
.. 2. Org-mode header
.. 3. Germanic Umlauts
.. 4. Justify Text
3. Gophermaps
1 Browsing
==========
1.1 Gopher browser in Emacs
~~~~~~~~~~~~~~~~~~~~~~~~~~
To browse the gopher space I use a gopher client for emacs called
elpher[1]. It's very stable and easy to use but a bit on the slow
side presumably owed to its implementation in elisp. Loading the sdf
user directory [2] takes over 10 seconds (lynx takes ~2). Another
drawback is that is requires emacs version 26 which may not be in
your repository.
1.2 Using Lynx in a terminal buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Another option is to run the lynx browser[3] in a terminal window
inside emacs. Emacs offers four(?) terminals *shell*, *eshell*,
*term* and *ansi-term*. I prefer to use the last one (M-x
ansi-term). Now I can start lynx inside the terminal. If you want to
copy something from lynx to another buffer you have to activate
term-line-mode (C-c C-j). Now you can move the cursor around freely.
To switch back to term-char-mode press C-c C-k. This method is a bit
wonky but it works.
2 Creating gopher optimized documents
=====================================
2.1 Org-mode
~~~~~~~~~~~
I write all my articles in emacs org-mode[4]. If you don't know
org-mode already you seriosly should give it a try! It's basically a
way to structure documents in plain-text. Even if you don't use
emacs you can look at an org-file and read its content. A very
powerful feature of org-mode is the exporter. By default you can
export to text, html, LaTex and some other formats. When I create
documents for gopher I usually export to an ASCII file (C-c C-e t
a). You can also export to UTF8 which is prettier but some gopher
clients only support ASCII.
2.2 Org-mode header
~~~~~~~~~~~~~~~~~~
You can give org-mode some export options[5]. The head of the
org-document that was exported to this very file looks like this.
,----
| #+OPTIONS: author:nil toc:t
| #+LANGUAGE: en
| #+TITLE: Emacs and gopher
`----
2.3 Germanic Umlauts
~~~~~~~~~~~~~~~~~~~
Because Germanic umlauts are not part of ASCII I have to translate
them for my German texts. I wrote an elisp function to do this
automatically.
,----
| (defun translate-gopher-special ()
| (interactive)
| (let ((case-fold-search nil)
| (trans-list
| (list '("ä" . "ae")
| '("ö" . "oe")
| '("ü" . "ue")
| '("Ä" . "Ae")
| '("Ö" . "Oe")
| '("Ü" . "Ue")
| '("ß" . "ss")
| '("„" . "\"")
| '("“" . "\""))))
| (mapc (lambda (x)
| (goto-char (point-min))
| (while (search-forward (car x) nil t)
| (replace-match (cdr x) t)))
| trans-list)))
`----
In this file I did not run the code above so if it isn't display
correctly your client only supports the ASCII charset.
2.4 Justify Text
~~~~~~~~~~~~~~~
In emacs there is a neat function to fill and justify paragraphs
(C-0 M-q). From the emacs documentation:
The command M-q (fill-paragraph) fills the current paragraph.
It redistributes the line breaks within the paragraph, and
deletes any excess space and tab characters occurring within
the paragraph, in such a way that the lines end up fitting
within a certain maximum width. [...] A numeric argument to
M-q tells it to justify the text as well as filling it. This
means that extra spaces are inserted to make the right margin
line up exactly at the fill column.[6]
The problem is after exporting I have to justify the paragraphs
again because the exporter ignores superfluous blanks. The following
script justifies only indented paragraphs that start with an
alphanumerical symbol. Therefore this does not apply to headings,
lists, code blocks, etc.
,----
| (defun gopher-justify ()
| (interactive)
| (beginning-of-buffer)
| (forward-line 4) ;; skip title
| (while (not (eobp))
| (progn
| (when (re-search-forward "^[[:blank:]]+[[:alnum:]]" nil t nil)
| (fill-paragraph 1 nil))
| (forward-paragraph 1))))
|
`----
It's not fool proof but most of the time it works. In some places I
have to insert an extra blank line in my org-file so that the next
text block doesn't get justified.
This was the final step. Now the document is ready for publishing.
3 Gophermaps
============
As I have completly disabled the use of tabs in my init file I start
emacs without loading any user settings to edit gophermaps:
,----
| emacs -q /path/to/gopermap
`----
A very useful emacs feature regarding gophermaps is whitespace-mode
(M-x whitespace-mode) which makes whitespace characters visible.
Footnotes
_________
[1] gopher://thelambdalab.xyz/1/projects/elpher/
[2] gopher://sdf.org/1/maps
[3] gopher://gopherpedia.com:70/0/Lynx%20(web%20browser)
[4]
[5]
[6]