Added elpher-go-current.
[elpher.git] / elpher.el
index 9de514b..2afe674 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -4,7 +4,7 @@
 
 ;; Author: Tim Vaughan <tgvaughan@gmail.com>
 ;; Created: 11 April 2019
-;; Version: 1.4.4
+;; Version: 1.4.5
 ;; Keywords: comm gopher
 ;; Homepage: https://github.com/tgvaughan/elpher
 ;; Package-Requires: ((emacs "25"))
@@ -42,7 +42,7 @@
 ;; page containing information on key bindings and suggested starting
 ;; points for your gopher exploration.
 
-;; Further instructions can be found in the Elpher info manual.
+;; Full instructions can be found in the Elpher info manual.
 
 ;; Elpher is under active development.  Any suggestions for
 ;; improvements are welcome!
 ;;; Global constants
 ;;
 
-(defconst elpher-version "1.4.4"
+(defconst elpher-version "1.4.5"
   "Current version of elpher.")
 
 (defconst elpher-margin-width 6
   "Width of left-hand margin used when rendering indicies.")
 
-(defconst elpher-start-index
-  (mapconcat
-   'identity
-   (list "i\tfake\tfake\t1"
-         "i     --------------------------------------------\tfake\tfake\t1"
-         "i                Elpher Gopher Client             \tfake\tfake\t1"
-         (format "i                   version %s\tfake\tfake\t1" elpher-version)
-         "i     --------------------------------------------\tfake\tfake\t1"
-         "i\tfake\tfake\t1"
-         "iUsage:\tfake\tfake\t1"
-         "i\tfake\tfake\t1"
-         "i - tab/shift-tab: next/prev item on current page\tfake\tfake\t1"
-         "i - RET/mouse-1: open item under cursor\tfake\tfake\t1"
-         "i - m: select an item on current page by name (autocompletes)\tfake\tfake\t1"
-         "i - u: return to parent\tfake\tfake\t1"
-         "i - O: visit the root menu of the current server\tfake\tfake\t1"
-         "i - g: go to a particular gopher address\tfake\tfake\t1"
-         "i - i/I: info on item under cursor or current page\tfake\tfake\t1"
-         "i - c/C: copy URL representation of item under cursor or current page\tfake\tfake\t1"
-         "i - a/A: bookmark the item under cursor or current page\tfake\tfake\t1"
-         "i - x/X: remove bookmark for item under cursor or current page\tfake\tfake\t1"
-         "i - B: visit the bookmarks page\tfake\tfake\t1"
-         "i - r: redraw current page (using cached contents if available)\tfake\tfake\t1"
-         "i - R: reload current page (regenerates cache)\tfake\tfake\t1"
-         "i - T: toggle TLS mode\tfake\tfake\t1"
-         "i - d/D: download item under cursor or current page\tfake\tfake\t1"
-         "i - w: display the raw server response for the current page\tfake\tfake\t1"
-         "i - S: set an explicit character coding system (default is to autodetect)\tfake\tfake\t1"
-         "i\tfake\tfake\t1"
-         "iWhere to start exploring Gopherspace:\tfake\tfake\t1"
-         "i\tfake\tfake\t1"
-         "1Floodgap Systems Gopher Server\t/\tgopher.floodgap.com\t70"
-         "i\tfake\tfake\t1"
-         "iAlternatively, select the following item and enter some\tfake\tfake\t1"
-         "isearch terms:\tfake\tfake\t1"
-         "i\tfake\tfake\t1"
-         "7Veronica-2 Gopher Search Engine\t/v2/vs\tgopher.floodgap.com\t70"
-         ".\r\n")
-   "\r\n")
-  "Source for elpher start page.")
 
 (defconst elpher-type-map
   '((?0 elpher-get-text-node "txt" elpher-text)
     (?p elpher-get-image-node "img" elpher-image)
     (?I elpher-get-image-node "img" elpher-image)
     (?d elpher-get-node-download "doc" elpher-binary)
-    (?h elpher-get-url-node "web" elpher-url)
+    (?h elpher-get-url-node "url" elpher-url)
     (bookmarks elpher-get-bookmarks-node "#" elpher-index)
     (start elpher-get-start-node "#" elpher-index))
   "Association list from types to getters, margin codes and index faces.")
@@ -789,7 +749,53 @@ calls, as is necessary if the match is performed by `string-match'."
 (defun elpher-get-start-node ()
   "Getter which displays the start page."
   (elpher-with-clean-buffer
-   (elpher-insert-index elpher-start-index)
+   (insert "     --------------------------------------------\n"
+           "                Elpher Gopher Client             \n"
+           "                   version " elpher-version "\n"
+           "     --------------------------------------------\n"
+           "\n"
+           "Default bindings:\n"
+           "\n"
+           " - TAB/Shift-TAB: next/prev item on current page\n"
+           " - RET/mouse-1: open item under cursor\n"
+           " - m: select an item on current page by name (autocompletes)\n"
+           " - u: return to previous page\n"
+           " - o/O: visit different selector or the root menu of the current server\n"
+           " - g: go to a particular gopher address\n"
+           " - i/I: info on item under cursor or current page\n"
+           " - c/C: copy URL representation of item under cursor or current page\n"
+           " - a/A: bookmark the item under cursor or current page\n"
+           " - x/X: remove bookmark for item under cursor or current page\n"
+           " - B: visit the bookmarks page\n"
+           " - r: redraw current page (using cached contents if available)\n"
+           " - R: reload current page (regenerates cache)\n"
+           " - T: toggle TLS mode\n"
+           " - d/D: download item under cursor or current page\n"
+           " - w: display the raw server response for the current page\n"
+           " - S: set an explicit character coding system (default is to autodetect)\n"
+           "\n"
+           "Start your exploration of gopher space:\n")
+   (elpher-insert-index-record "Floodgap Systems Gopher Server"
+                               (elpher-make-address ?1 "" "gopher.floodgap.com" 70))
+   (insert "\n"
+           "Alternatively, select the following item and enter some search terms:\n")
+   (elpher-insert-index-record "Veronica-2 Gopher Search Engine"
+                               (elpher-make-address ?7 "/v2/vs" "gopher.floodgap.com" 70))
+   (insert "\n"
+           "** Refer to the ")
+   (let ((help-string "RET,mouse-1: Open Elpher info manual (if available)"))
+     (insert-text-button "Elpher info manual"
+                         'face 'link
+                         'action (lambda (button)
+                                   (interactive)
+                                   (info "(elpher)"))
+                         'follow-link t
+                         'help-echo help-string))
+   (insert " for the full documentation. **\n")
+   (insert (propertize
+            (concat "  (This should be available if you have installed Elpher using\n"
+                    "   MELPA. Otherwise you will have to install the manual yourself.)")
+            'face 'shadow))
    (elpher-restore-pos)))
 
 ;; Bookmarks page node retrieval
@@ -908,6 +914,19 @@ host, selector and port."
     (switch-to-buffer "*elpher*")
     (elpher-visit-node node)))
 
+(defun elpher-go-current ()
+  "Go to a particular site read from the minibuffer, initialized with the current URL."
+  (interactive)
+  (let ((address (elpher-node-address elpher-current-node)))
+    (if (elpher-address-special-p address)
+        (error "Command not valid for this page")
+      (let ((url (read-string "URL: " (elpher-get-address-url address))))
+        (if (string-match elpher-url-regex url)
+            (let ((new-node (elpher-make-node-from-matched-url url)))
+              (unless (equal (elpher-node-address new-node) address)
+                (elpher-visit-node new-node)))
+          (error "Could not parse URL %s" url))))))
+
 (defun elpher-redraw ()
   "Redraw current page."
   (interactive)
@@ -1163,6 +1182,7 @@ host, selector and port."
     (define-key map (kbd "u") 'elpher-back)
     (define-key map (kbd "O") 'elpher-root-dir)
     (define-key map (kbd "g") 'elpher-go)
+    (define-key map (kbd "o") 'elpher-go-current)
     (define-key map (kbd "r") 'elpher-redraw)
     (define-key map (kbd "R") 'elpher-reload)
     (define-key map (kbd "T") 'elpher-toggle-tls)
@@ -1188,6 +1208,7 @@ host, selector and port."
         (kbd "u") 'elpher-back
         (kbd "O") 'elpher-root-dir
         (kbd "g") 'elpher-go
+        (kbd "o") 'elpher-go-current
         (kbd "r") 'elpher-redraw
         (kbd "R") 'elpher-reload
         (kbd "T") 'elpher-toggle-tls