+(defcustom elopher-index-face '(foreground-color . "cyan")
+ "Face used for index records.")
+(defcustom elopher-text-face '(foreground-color . "white")
+ "Face used for text records.")
+(defcustom elopher-info-face '(foreground-color . "gray")
+ "Face used for info records.")
+(defcustom elopher-image-face '(foreground-color . "green")
+ "Face used for image records.")
+(defcustom elopher-unknown-face '(foreground-color . "red")
+ "Face used for unknown record types.")
+
+;;; Model
+;;
+
+(defun elopher-make-node (parent address &optional content)
+ (list parent address cache))
+
+(defun elopher-node-parent (node)
+ (car node))
+
+(defun elopher-node-address (node)
+ (cadr node))
+
+(defun elopher-node-content (node)
+ (caddr node))
+
+(defun elopher-reload-node (node after)
+ ())
+
+;;; Global constants
+;;
+
+(defconst elopher-version "1.0.0"
+ "Current version of elopher.")
+
+(defconst elopher-margin-width 6
+ "Width of left-hand margin used when rendering indicies.")
+
+(defconst elopher-start-page
+ (concat "i\tfake\tfake\t1\r\n"
+ "i--------------------------------------------\tfake\tfake\t1\r\n"
+ "i Elopher Gopher Client \tfake\tfake\t1\r\n"
+ (format "i version %s\tfake\tfake\t1\r\n" elopher-version)
+ "i--------------------------------------------\tfake\tfake\t1\r\n"
+ "i\tfake\tfake\t1\r\n"
+ "iBasic usage:\tfake\tfake\t1\r\n"
+ "i - tab/shift-tab: next/prev directory entry\tfake\tfake\t1\r\n"
+ "i - RET/mouse-1: open directory entry\tfake\tfake\t1\r\n"
+ "i - u: return to parent directory entry\tfake\tfake\t1\r\n"
+ "i - g: go to a particular site\tfake\tfake\t1\r\n"
+ "i\tfake\tfake\t1\r\n"
+ "iPlaces to start exploring Gopherspace:\tfake\tfake\t1\r\n"
+ "1Floodgap Systems Gopher Server\t\tgopher.floodgap.com\t70\r\n"
+ "1Super-Dimensional Fortress\t\tsdf.org\t70\r\n"
+ "i\tfake\tfake\t1\r\n"
+ "iTest entries:\tfake\tfake\t1\r\n"
+ "pXKCD comic image\t/fun/xkcd/comics/2130/2137/text_entry.png\tgopher.floodgap.com\t70\r\n"))
+
+;;; Mode and keymap
+;;
+
+(setq elopher-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map (kbd "<tab>") 'elopher-next-link)
+ (define-key map (kbd "<S-tab>") 'elopher-prev-link)
+ (define-key map (kbd "u") 'elopher-pop-history)
+ (define-key map (kbd "g") 'elopher-go)
+ (define-key map (kbd "r") 'elopher-reload)
+ (when (require 'evil nil t)
+ (evil-define-key 'normal map
+ (kbd "C-]") 'elopher-follow-closest-link
+ (kbd "C-t") 'elopher-pop-history
+ (kbd "u") 'elopher-pop-history
+ (kbd "g") 'elopher-go
+ (kbd "r") 'elopher-reload))
+ map))
+ ;; "Keymap for gopher client.")
+
+(define-derived-mode elopher-mode special-mode "elopher"
+ "Major mode for elopher, an elisp gopher client.")