X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=814f0fb72cc1aa555e38ad22eefbd1aa2a48dd95;hp=565131abfa9d136ba974406e2350cf06650f5c05;hb=1fdaea981e6b423ec6edc05f1587907cf5b9c626;hpb=5f7b2a6ed52621ea1bd983428428d5d513b2405e diff --git a/elpher.el b/elpher.el index 565131a..814f0fb 100644 --- a/elpher.el +++ b/elpher.el @@ -15,7 +15,7 @@ ;; Copyright (C) 2020 Koushk Roy ;; Copyright (C) 2020 Vee ;; Copyright (C) 2020 Simon South -;; Copyright (C) 2019-2020 Tim Vaughan +;; Copyright (C) 2019-2021 Tim Vaughan ;; Author: Tim Vaughan ;; Created: 11 April 2019 @@ -126,7 +126,9 @@ (finger elpher-get-finger-page elpher-render-text "txt" elpher-text) (telnet elpher-get-telnet-page nil "tel" elpher-telnet) (other-url elpher-get-other-url-page nil "url" elpher-other-url) - ((special start) elpher-get-start-page nil)) + ((special start) elpher-get-start-page nil) + ((special history) elpher-get-history-page nil) + ((special history-all) elpher-get-history-all-page nil)) "Association list from types to getters, renderers, margin codes and index faces.") @@ -328,8 +330,6 @@ Links can be accessed by pressing `v' ('visit') followed by the link number." (let ((url (url-generic-parse-url url-string))) (unless (and (not (url-fullness url)) (url-type url)) (setf (url-fullness url) t) - (setf (url-filename url) - (url-unhex-string (url-filename url))) (unless (url-type url) (setf (url-type url) elpher-default-url-type)) (unless (url-host url) @@ -436,7 +436,7 @@ address refers to, via the table `elpher-type-map'." For gopher addresses this is a combination of the selector type and selector." (if (symbolp address) nil - (url-filename address))) + (url-unhex-string (url-filename address)))) (defun elpher-address-host (address) "Retrieve host from ADDRESS object." @@ -460,7 +460,7 @@ If no address is defined, returns 0. (This is for compatibility with the URL li (defun elpher-address-gopher-p (address) "Return non-nill if ADDRESS object is a gopher address." (and (not (elpher-address-special-p address)) - (member (elpher-address-protocol address) '("gopher gophers")))) + (member (elpher-address-protocol address) '("gopher" "gophers")))) (defun elpher-gopher-address-selector (address) "Retrieve gopher selector from ADDRESS object." @@ -509,8 +509,17 @@ If no address is defined, returns 0. (This is for compatibility with the URL li "Set the address corresponding to PAGE to NEW-ADDRESS." (setcar (cdr page) new-address)) -(defvar elpher-current-page nil) ; buffer local -(defvar elpher-history nil) ; buffer local +(defvar elpher-current-page nil + "The current page for this Elpher buffer.") + +(defvar elpher-history nil + "The local history for this Elpher buffer. +This variable is used by `elpher-back' and +`elpher-show-history'.") + +(defvar elpher-history-all nil + "The global history for all Elpher buffers. +This variable is used by `elpher-show-history-all'.") (defun elpher-visit-page (page &optional renderer no-history) "Visit PAGE using its own renderer or RENDERER, if non-nil. @@ -521,7 +530,8 @@ unless NO-HISTORY is non-nil." (unless (or no-history (equal (elpher-page-address elpher-current-page) (elpher-page-address page))) - (push elpher-current-page elpher-history)) + (push elpher-current-page elpher-history) + (push elpher-current-page elpher-history-all)) (setq-local elpher-current-page page) (let* ((address (elpher-page-address page)) (type (elpher-address-type address)) @@ -1631,6 +1641,7 @@ The result is rendered using RENDERER." " - c/C: copy URL representation of item under cursor or current page\n" " - a/A: bookmark the item under cursor or current page\n" " - B: list all bookmarks\n" + " - h/H: show history of current buffer or for all buffers\n" " - r: redraw current page (using cached contents if available)\n" " - R: reload current page (regenerates cache)\n" " - S: set character coding system for gopher (default is to autodetect)\n" @@ -1673,6 +1684,51 @@ The result is rendered using RENDERER." 'face 'shadow)) (elpher-restore-pos))) +;; History page retrieval + +(defun elpher-history () + "Show the history of pages leading to the current page in this buffer. +Use \\[elpher-history-all] to see the entire history. +This is rendered using `elpher-get-history-page' via `elpher-type-map'." + (interactive) + (elpher-visit-page + (elpher-make-page "Elpher History Page" + (elpher-make-special-address 'history)))) + +(defun elpher-history-all () + "Show the all the pages you've visited using Elpher. +Use \\[elpher-history] to see just the history for the current buffer. +This is rendered using `elpher-get-history-all-page' via `elpher-type-map'." + (interactive) + (elpher-visit-page + (elpher-make-page "Elpher History Of All Seen Pages" + (elpher-make-special-address 'history-all)))) + +(defun elpher-get-history-page (renderer) + "Getter which displays the history page (RENDERER must be nil)." + (when renderer + (elpher-visit-previous-page) + (error "Command not supported for history page")) + (elpher-show-history elpher-history)) + +(defun elpher-get-history-all-page (renderer) + "Getter which displays the history page (RENDERER must be nil)." + (when renderer + (elpher-visit-previous-page) + (error "Command not supported for history page")) + (elpher-show-history elpher-history-all)) + +(defun elpher-show-history (pages) + "Show all PAGES in the Elpher buffer." + (elpher-with-clean-buffer + (if pages + (dolist (page pages) + (when page + (let ((display-string (elpher-page-display-string page)) + (address (elpher-page-address page))) + (elpher-insert-index-record display-string address)))) + (insert "No history items found.\n")))) + ;;; Bookmarks ;; This code allows Elpher to use the standard Emacs bookmarks: `C-x r @@ -1689,7 +1745,7 @@ and \\[elpher-set-bookmark-no-overwrite] do the same thing.") (defun elpher-bookmark-make-record () "Return a bookmark record. If `elpher-bookmark-link' is non-nil and point is on a link button, -return a bookmark record for that link. Otherwise, return a bookmark +return a bookmark record for that link. Otherwise, return a bookmark record for the current elpher page." (let* ((button (and elpher-bookmark-link (button-at (point)))) (page (if button @@ -1721,7 +1777,7 @@ To bookmark the current page, use \\[bookmark-set-no-overwrite]." (bookmark-set-no-overwrite))) (defun elpher-bookmark-import (file) - "Import Elpher bookmarks into Emacs bookmarks." + "Import Elpher bookmarks file FILE into Emacs bookmarks." (interactive (list (if (and (boundp 'elpher-bookmarks-file) (file-readable-p elpher-bookmarks-file)) elpher-bookmarks-file @@ -2081,6 +2137,8 @@ When run interactively HOST-OR-URL is read from the minibuffer." (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 "h") 'elpher-history) + (define-key map (kbd "H") 'elpher-history-all) (define-key map (kbd "r") 'elpher-redraw) (define-key map (kbd "R") 'elpher-reload) (define-key map (kbd "T") 'elpher-toggle-tls)