X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=c0734ca1626efa8939737c345772cdb11d0722c0;hb=c9ef766d6797cc27c6375011cab84ffd6e502ae8;hp=b297189a5f6c740d9e076a555e780178bd17c65c;hpb=bb944d286e87815fbd795cfeeb7dd3bd9b009a97;p=elpher.git diff --git a/elpher.el b/elpher.el index b297189..c0734ca 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 1.3.0 +;; Version: 1.4.2 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "25")) @@ -26,19 +26,17 @@ ;;; Commentary: -;; Elpher aims to provide a practical gopher client for GNU Emacs. -;; It supports: +;; Elpher aims to provide a practical and friendly gopher client +;; for GNU Emacs. It supports: -;; - intuitive keyboard and mouse-driven interface, +;; - an intuitive keyboard and mouse-driven interface, ;; - 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, -;; - a simple bookmark management system. - -;; Visited pages are stored as a hierarchy rather than a linear history, -;; meaning that navigation between these pages is quick and easy. +;; - a simple bookmark management system, +;; - support for TLS gopherholes. ;; To launch Elpher, simply use 'M-x elpher'. This will open a start ;; page containing information on key bindings and suggested starting @@ -47,6 +45,9 @@ ;; Faces, caching and other options can be configured via ;; the Elpher customization group in Applications. +;; Elpher is under active development, and any suggestions for +;; improvements are welcome! + ;;; Code: (provide 'elpher) @@ -57,7 +58,7 @@ ;;; Global constants ;; -(defconst elpher-version "1.3.0" +(defconst elpher-version "1.4.2" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -87,7 +88,8 @@ "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 - d: download directory entry under cursor\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" @@ -226,7 +228,7 @@ before attempting to connect to the server." (elt address 3)) (defun elpher-address-use-tls-p (address) - "Returns non-nil if ADDRESS is marked as needing TLS." + "Return non-nil if ADDRESS is marked as needing TLS." (elt address 4)) (defun elpher-address-special-p (address) @@ -418,8 +420,8 @@ away CRs and any terminating period." (defun elpher-insert-index-record (display-string address) "Function to insert an index record into the current buffer. The contents of the record are dictated by DISPLAY-STRING and ADDRESS." - (let ((type-map-entry (alist-get (elpher-address-type address) - elpher-type-map))) + (let* ((type (elpher-address-type address)) + (type-map-entry (alist-get type elpher-type-map))) (if type-map-entry (let* ((margin-code (elt type-map-entry 1)) (face (elt type-map-entry 2)) @@ -468,11 +470,12 @@ The contents of the record are dictated by DISPLAY-STRING and ADDRESS." "Retrieve selector specified by ADDRESS, then execute AFTER. The result is stored as a string in the variable ‘elpher-selector-string’." (setq elpher-selector-string "") - (when (and (elpher-address-use-tls-p address) - (not elpher-use-tls) - (gnutls-available-p)) - (setq elpher-use-tls t) - (message "Engaging TLS mode.")) + (when (elpher-address-use-tls-p address) + (if (gnutls-available-p) + (when (not elpher-use-tls) + (setq elpher-use-tls t) + (message "Engaging TLS mode.")) + (error "Cannot retrieve TLS selector: GnuTLS not available"))) (condition-case the-error (let* ((kill-buffer-query-functions nil) (proc (open-network-stream "elpher-process" @@ -492,7 +495,7 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (eq (car the-error) 'gnutls-error) (not (elpher-address-use-tls-p address))) (progn - (message "Disengaging TLS mode.") + (message "Could not establish TLS connection. Disengaging TLS mode.") (setq elpher-use-tls nil) (elpher-get-selector address after)) (elpher-process-cleanup) @@ -885,20 +888,31 @@ host, selector and port." (switch-to-buffer "*elpher*") (elpher-visit-node node))) -(defun elpher-redraw () +(defun elpher-redraw () "Redraw current page." (interactive) (if elpher-current-node (elpher-visit-node elpher-current-node) (message "No current site."))) -(defun elpher-reload () +(defun elpher-reload () "Reload current page." (interactive) (if elpher-current-node (elpher-reload-current-node) (message "No current site."))) +(defun elpher-toggle-tls () + "Toggle TLS encryption mode." + (interactive) + (setq elpher-use-tls (not elpher-use-tls)) + (if elpher-use-tls + (if (gnutls-available-p) + (message "TLS mode enabled. (Will not affect current page until reload.)") + (setq elpher-use-tls nil) + (error "Cannot enable TLS mode: GnuTLS not available")) + (message "TLS mode disabled. (Will not affect current page until reload.)"))) + (defun elpher-view-raw () "View raw server response for current page." (interactive) @@ -928,6 +942,18 @@ host, selector and port." #'elpher-get-node-download))) (error "No link selected")))) +(defun elpher-download-current () + "Download the current page." + (interactive) + (if (elpher-address-special-p (elpher-node-address elpher-current-node)) + (error "Cannot download this page") + (elpher-visit-node (elpher-make-node + (elpher-node-display-string elpher-current-node) + (elpher-node-address elpher-current-node) + elpher-current-node) + #'elpher-get-node-download + t))) + (defun elpher-build-link-map () "Build alist mapping link names to destination nodes in current buffer." (let ((link-map nil) @@ -1027,7 +1053,7 @@ host, selector and port." (error "No link selected")))) (defun elpher-bookmarks () - "Visit bookmarks." + "Visit bookmarks page." (interactive) (switch-to-buffer "*elpher*") (elpher-visit-node @@ -1066,7 +1092,9 @@ host, selector and port." (if (and (equal type ?h) (string-prefix-p "URL:" selector)) (elt (split-string selector "URL:") 1) - (concat "gopher://" + (concat "gopher" + (if (elpher-address-use-tls-p address) "s" "") + "://" host (if (equal port 70) "" @@ -1117,8 +1145,10 @@ host, selector and port." (define-key map (kbd "g") 'elpher-go) (define-key map (kbd "r") 'elpher-redraw) (define-key map (kbd "R") 'elpher-reload) + (define-key map (kbd "T") 'elpher-toggle-tls) (define-key map (kbd "w") 'elpher-view-raw) (define-key map (kbd "d") 'elpher-download) + (define-key map (kbd "D") 'elpher-download-current) (define-key map (kbd "m") 'elpher-jump) (define-key map (kbd "i") 'elpher-info-link) (define-key map (kbd "I") 'elpher-info-current) @@ -1140,8 +1170,10 @@ host, selector and port." (kbd "g") 'elpher-go (kbd "r") 'elpher-redraw (kbd "R") 'elpher-reload + (kbd "T") 'elpher-toggle-tls (kbd "w") 'elpher-view-raw (kbd "d") 'elpher-download + (kbd "D") 'elpher-download-current (kbd "m") 'elpher-jump (kbd "i") 'elpher-info-link (kbd "I") 'elpher-info-current @@ -1157,7 +1189,11 @@ host, selector and port." "Keymap for gopher client.") (define-derived-mode elpher-mode special-mode "elpher" - "Major mode for elpher, an elisp gopher client.") + "Major mode for elpher, an elisp gopher client. + +This mode is automatically enabled by the interactive +functions which initialize the gopher client, namely +`elpher', `elpher-go' and `elpher-bookmarks'.") (when (fboundp 'evil-set-initial-state) (evil-set-initial-state 'elpher-mode 'motion))