__________________

                            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. Justify Text
.. 4. Big fat drawback
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. It  was a bit sluggish
  in the past but now it works  just fine. If you're using emacs there
  is no way around elpher. I love how I can browse gopher holes within
  my familiar  environment and without context-switching[2].  Surely a
  match made in heaven.


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 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.

2.4 Big fat drawback
~~~~~~~~~~~~~~~~~~~~

  After a while I realised that this way of publishing gopher articles
  is actually not that good. Here  I create *two* documents where only
  one should suffice. If I want to  make changes to an article I first
  have to change the org document and export it again. But what if the
  org  document is  not at  hand?  Even worse,  what if  I change  the
  exported file directly on the server? I now have two versions of the
  same  article with  slightly different  content. Of  course I  could
  store the  org file  on the  server and  abstain from  making direct
  changes.  But this  creates  an extra  barrier  for something  which
  should be just so easy: simple plain text files.

  I  think I'll  continue writing  articles in  org-mode but  once the
  first  draft is  finished I'll  forget about  the org-file  and edit
  upcoming changes  by hand. I  added this subsection manually  and as
  long as the changes to the  structure of the document are minimal it
  seems to work out just fine.

3 Gophermaps
============

  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] https://simpleprogrammer.com/context-switching/

[3] gopher://gopherpedia.com:70/0/Lynx%20(web%20browser)

[4] https://orgmode.org/

[5] https://orgmode.org/manual/Export-Settings.html

[6] https://www.gnu.org/software/emacs/manual/html_node/emacs/Fill-Commands.html