X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=6e885e4fd6cee567b2de65d9d371af64a063f8a6;hp=4e8d3a27ce889898d9063073964ed587f7639da1;hb=5673f22d815514387a029844954c8ec4793f61e0;hpb=15382d508e2f519654b67db506257582a89ca82c diff --git a/elpher.el b/elpher.el index 4e8d3a2..6e885e4 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.7.8 +;; Version: 2.7.9 ;; Keywords: comm gopher ;; Homepage: http://thelambdalab.xyz/elpher ;; Package-Requires: ((emacs "26")) @@ -70,7 +70,7 @@ ;;; Global constants ;; -(defconst elpher-version "2.7.8" +(defconst elpher-version "2.7.9" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -161,6 +161,11 @@ May be empty." "Specify the name of the file where elpher bookmarks will be saved." :type '(file)) +(defcustom elpher-force-ipv4 nil + "If non-nil, force elpher to use ipv4 instead of trying an ipv6 address +and falling back to an ipv4 address" + :type '(boolean)) + ;; Face customizations (defgroup elpher-faces nil @@ -585,7 +590,7 @@ to ADDRESS." (progn (message "Disabling TLS mode.") (setq elpher-use-tls nil) - (elpher-get-selector address renderer)) + (elpher-get-selector address renderer elpher-force-ipv4)) (elpher-network-error address "Could not establish encrypted connection"))) ('connect (elpher-process-cleanup) @@ -649,7 +654,7 @@ once they are retrieved from the gopher server." (elpher-with-clean-buffer (insert "LOADING... (use 'u' to cancel)\n")) (condition-case the-error - (elpher-get-selector address renderer) + (elpher-get-selector address renderer elpher-force-ipv4) (error (elpher-network-error address the-error)))))) @@ -686,12 +691,19 @@ once they are retrieved from the gopher server." (insert " ")) (insert (make-string elpher-margin-width ?\s)))) -(defun elpher-page-button-help (page) - "Return a string containing the help text for a button corresponding to PAGE." - (let ((address (elpher-page-address page))) - (format "mouse-1, RET: open '%s'" (if (elpher-address-special-p address) - address - (elpher-address-to-url address))))) +(defun elpher--page-button-help (_window buffer pos) + "Function called by Emacs to generate mouse-over text. +The arguments specify the BUFFER and the POS within the buffer of the item +for which help is required. The function returns the help to be +displayed. The _WINDOW argument is currently unused." + (with-current-buffer buffer + (let ((button (button-at pos))) + (when button + (let* ((page (button-get button 'elpher-page)) + (address (elpher-page-address page))) + (format "mouse-1, RET: open '%s'" (if (elpher-address-special-p address) + address + (url-recreate-url address)))))))) (defun elpher-insert-index-record (display-string &optional address) "Function to insert an index record into the current buffer. @@ -711,7 +723,7 @@ If ADDRESS is not supplied or nil the record is rendered as an 'elpher-page page 'action #'elpher-click-link 'follow-link t - 'help-echo (elpher-page-button-help page))) + 'help-echo #'elpher--page-button-help)) (pcase type ('nil ;; Information (elpher-insert-margin) @@ -757,7 +769,7 @@ If ADDRESS is not supplied or nil the record is rendered as an 'elpher-page page 'action #'elpher-click-link 'follow-link t - 'help-echo (elpher-page-button-help page) + 'help-echo #'elpher--page-button-help 'face 'button))) (buffer-string))) @@ -822,7 +834,7 @@ The response is rendered using the rendering function RENDERER." (elpher-with-clean-buffer (insert "LOADING RESULTS... (use 'u' to cancel)")) - (elpher-get-selector search-address renderer)) + (elpher-get-selector search-address renderer elpher-force-ipv4)) (if aborted (elpher-visit-previous-page)))))) @@ -887,6 +899,7 @@ to ADDRESS." (error "Cannot establish gemini connection: GnuTLS not available") (unless (< (elpher-address-port address) 65536) (error "Cannot establish gemini connection: port number > 65536")) + (defvar gnutls-verify-error) (condition-case nil (let* ((kill-buffer-query-functions nil) (gnutls-verify-error nil) ; We use the NSM for verification @@ -1134,7 +1147,7 @@ For instance, the filename /a/b/../c/./d will reduce to /a/c/d" 'elpher-page page 'action #'elpher-click-link 'follow-link t - 'help-echo (elpher-page-button-help page))) + 'help-echo #'elpher--page-button-help)) (insert (propertize display-string 'face 'elpher-unknown))) (insert "\n")))) @@ -1203,7 +1216,10 @@ width defined by elpher-gemini-max-fill-width." ;; Finger page connection (defun elpher-get-finger-page (renderer &optional force-ipv4) - "Opens a finger connection to the current page address and renders it using RENDERER." + "Opens a finger connection to the current page address. +The result is rendered using RENDERER. When the optional argument +FORCE-IPV4 is non-nil, the IPv4 address returned by a DNS lookup will +be used explicitly in making the connection." (let* ((address (elpher-page-address elpher-current-page)) (content (elpher-get-cached-content address))) (if (and content (funcall renderer nil)) @@ -1248,7 +1264,7 @@ width defined by elpher-gemini-max-fill-width." (cons string selector-string-parts)))) (set-process-sentinel proc (lambda (_proc event) - (condition-case the-error + (condition-case _the-error (cond ((string-prefix-p "deleted" event)) ((string-prefix-p "open" event) @@ -1316,7 +1332,7 @@ width defined by elpher-gemini-max-fill-width." " - 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/mouse-3: return to previous page\n" + " - u/mouse-3/U: return to previous page or to the start page\n" " - o/O: visit different selector or the root menu of the current server\n" " - g: go to a particular address (gopher, gemini, finger)\n" " - d/D: download item under cursor or current page\n" @@ -1545,6 +1561,15 @@ When run interactively HOST-OR-URL is read from the minibuffer." (interactive) (elpher-visit-previous-page)) +(defun elpher-back-to-start () + "Go all the way back to the start page." + (interactive) + (setq elpher-current-page nil) + (setq elpher-history nil) + (let ((start-page (elpher-make-page "Elpher Start Page" + (elpher-make-special-address 'start)))) + (elpher-visit-page start-page))) + (defun elpher-download () "Download the link at point." (interactive) @@ -1734,6 +1759,7 @@ When run interactively HOST-OR-URL is read from the minibuffer." (define-key map (kbd "") 'elpher-prev-link) (define-key map (kbd "C-M-i") 'elpher-prev-link) (define-key map (kbd "u") 'elpher-back) + (define-key map (kbd "U") 'elpher-back-to-start) (define-key map [mouse-3] 'elpher-back) (define-key map (kbd "O") 'elpher-root-dir) (define-key map (kbd "g") 'elpher-go) @@ -1761,6 +1787,7 @@ When run interactively HOST-OR-URL is read from the minibuffer." (kbd "C-") 'elpher-follow-current-link (kbd "C-t") 'elpher-back (kbd "u") 'elpher-back + (kbd "U") 'elpher-back-to-start [mouse-3] 'elpher-back (kbd "g") 'elpher-go (kbd "o") 'elpher-go-current