X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=12ef1c850d28a9cdb32d6a925948e6d1d4787b9e;hb=1892efc93a3ba9b4381f24adf9ae994949e3250b;hp=d744f23b32ff4651afb8611117a88f081b1ad746;hpb=12ae138fed4d577d9c5202e73b2fec5e7670dd60;p=elpher.git diff --git a/elpher.el b/elpher.el index d744f23..12ef1c8 100644 --- a/elpher.el +++ b/elpher.el @@ -26,7 +26,26 @@ ;;; Commentary: -;; Elpher is a tool for exploring "gopherspace" using GNU Emacs. +;; Elpher aims to provide a full-featured gopher client for GNU Emacs. +;; It supports: + +;; - intuitive keyboard and mouse-driven browsing, +;; - caching of visited sites (both content and cursor position), +;; - pleasant and configurable colouring of Gopher directories, +;; - direct visualisation of image files, +;; - (m)enu key support, similar to Emacs' info browser, +;; - clickable web and gopher links in plain text. + +;; The caching mechanism works by maintaining a hierarchy of visited +;; pages rather than a linear history, meaning that it is quick and +;; easy to navigate this history. + +;; To launch Elpher, simply use 'M-x elpher'. This will open a start +;; page containing information on key bindings and suggested starting +;; points for your gopher exploration. + +;; Faces, caching options and start page can be configured via +;; the Elpher customization group in Applications. ;;; Code: @@ -54,6 +73,7 @@ "i\tfake\tfake\t1" "i - tab/shift-tab: next/prev directory entry on current page\tfake\tfake\t1" "i - RET/mouse-1: open directory entry under cursor\tfake\tfake\t1" + "i - m: select a directory entry by name (autocompletes)\tfake\tfake\t1" "i - u: return to parent directory entry\tfake\tfake\t1" "i - g: go to a particular page\tfake\tfake\t1" "i - r: redraw current page (using cached contents if available)\tfake\tfake\t1" @@ -93,6 +113,8 @@ "A gopher client." :group 'applications) +;; Face customizations + (defface elpher-index '((((background dark)) :foreground "deep sky blue") (((background light)) :foreground "blue")) @@ -137,6 +159,8 @@ '((t :foreground "blue")) "Face used for brackets around margin key.") +;; Other customizations + (defcustom elpher-open-urls-with-eww nil "If non-nil, open URL selectors using eww. Otherwise, use the system browser via the BROWSE-URL function." @@ -146,6 +170,13 @@ Otherwise, use the system browser via the BROWSE-URL function." "If non-nil, cache images in memory in the same way as other content." :type '(boolean)) +(defcustom elpher-start-address nil + "If nil, the default start directory is shown when Elpher is started. +Otherwise, a list containing the selector, host and port of a directory to +use as the start page." + :type '(list string string integer)) + + ;;; Model ;; @@ -634,6 +665,27 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (message "Can only download gopher links, not general URLs."))) (message "No link selected.")))) +(defun elpher-build-link-map () + "Build alist mapping link names to destination nodes in current buffer." + (let ((link-map nil) + (b (next-button (point-min) t))) + (while b + (add-to-list 'link-map (cons (button-label b) b)) + (setq b (next-button (button-start b)))) + link-map)) + +(defun elpher-menu () + "Select a directory entry by name. Similar to the info browser (m)enu command." + (interactive) + (let* ((link-map (elpher-build-link-map))) + (if link-map + (let ((key (let ((completion-ignore-case t)) + (completing-read "Menu item: " link-map nil t)))) + (if (and key (> (length key) 0)) + (let ((b (cdr (assoc key link-map)))) + (goto-char (button-start b)) + (button-activate b))))))) + ;;; Mode and keymap ;; @@ -647,6 +699,7 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (define-key map (kbd "R") 'elpher-reload) (define-key map (kbd "w") 'elpher-view-raw) (define-key map (kbd "d") 'elpher-download) + (define-key map (kbd "m") 'elpher-menu) (when (fboundp 'evil-define-key) (evil-define-key 'normal map (kbd "TAB") 'elpher-next-link @@ -657,7 +710,8 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (kbd "r") 'elpher-redraw (kbd "R") 'elpher-reload (kbd "w") 'elpher-view-raw - (kbd "d") 'elpher-download)) + (kbd "d") 'elpher-download + (kbd "m") 'elpher-menu)) map) "Keymap for gopher client.") @@ -673,7 +727,9 @@ The result is stored as a string in the variable ‘elpher-selector-string’." "Start elpher with default landing page." (interactive) (setq elpher-current-node nil) - (let ((start-node (elpher-make-node nil nil #'elpher-get-index-node))) + (let ((start-node (elpher-make-node nil + elpher-start-address + #'elpher-get-index-node))) (elpher-visit-node start-node)) "Started Elpher.") ; Otherwise (elpher) evaluates to start page string.