+
+;;; History management
+;;
+
+(defvar elopher-history nil
+ "List of pages in elopher history.")
+
+(defun elopher-push-history ()
+ "Add current contents of buffer, including point, to history."
+ (unless (string-empty-p (buffer-string))
+ (push
+ (list (buffer-string)
+ (point))
+ elopher-history)))
+
+(defun elopher-pop-history ()
+ "Restore most recent page from history."
+ (interactive)
+ (if (get-buffer "*elopher*")
+ (if elopher-history
+ (let* ((inhibit-read-only t)
+ (prev-page (pop elopher-history))
+ (page-string (car prev-page))
+ (page-point (cadr prev-page)))
+ (switch-to-buffer "*elopher*")
+ (erase-buffer)
+ (insert page-string)
+ (goto-char page-point))
+ (message "Already at start of history."))
+ (message "No elopher buffer found.")))
+
+
+;;; Selector retrieval (all kinds)