;; Author: Tim Vaughan <plugd@thelambdalab.xyz>
;; Created: 11 April 2019
-;; Version: 2.7.8
+;; Version: 2.7.9
;; Keywords: comm gopher
;; Homepage: http://thelambdalab.xyz/elpher
;; Package-Requires: ((emacs "26"))
;;; Global constants
;;
-(defconst elpher-version "2.7.8"
+(defconst elpher-version "2.7.9"
"Current version of elpher.")
(defconst elpher-margin-width 6
"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
(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)
(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))))))
(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.
'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)
'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)))
(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))))))
(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
'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"))))
;; 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))
(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)
" - 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"
(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)
(define-key map (kbd "<backtab>") '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)
(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