Experimental: C-u M-x elpher-menu with history
[elpher.git] / elpher.el
index 4a141b7..943b569 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -2005,12 +2005,13 @@ functions which initialize the gopher client, namely
 ;;; Menu
 ;;
 
-(defun elpher-menu ()
-  "Show a list of all your `elpher' buffers."
+(defun elpher-menu (&optional arg)
+  "Show a list of all your `elpher' buffers.
+With an optional argument, add all the history items, too."
   (interactive)
   (switch-to-buffer (get-buffer-create "*Elpher Menu*"))
   (elpher-menu-mode)
-  (elpher-menu-refresh)
+  (elpher-menu-refresh arg)
   (tabulated-list-print))
 
 (defvar elpher-menu-mode-map
@@ -2137,45 +2138,86 @@ In Elpher Menu mode, the following commands are defined:
     (let ((start (text-property-any
                  (point-min) (point-max)
                  'face 'elpher-gemini-heading1)))
-      (if start
-         (save-excursion
-           (goto-char start)
-           (setq-local elpher-title
-                       (buffer-substring-no-properties
-                        start (line-end-position))))
-       "none"))))
-
-(defun elpher-menu-refresh ()
-  "Refresh the list of buffers."
+      (when start
+       (save-excursion
+         (goto-char start)
+         (setq-local elpher-title
+                     (buffer-substring-no-properties
+                      start (line-end-position))))))))
+
+(defun elpher-menu-refresh (&optional arg)
+  "Refresh the list of buffers.
+With an optional argument, add all the history items, too."
     ;; Set up `tabulated-list-format'.
     (setq tabulated-list-format
          (vector '("T" 1 t)
                  '("URL" 35 t)
                  '("Name" 35 t))
-         tabulated-list-sort-key '("Name"))
+         tabulated-list-sort-key nil)
     ;; Collect info for each buffer we're interested in.
     (let (entries)
       (dolist (buf (buffer-list))
        (with-current-buffer buf
          (when (memq major-mode '(elpher-mode eww-mode))
-           (push (list buf
-                       (vector
-                        (cond ((eq major-mode 'elpher-mode) "E")
-                              ((eq major-mode 'eww-mode) "W"))
-                        (cond ((eq major-mode 'elpher-mode)
-                               (or (elpher-address-to-url
-                                    (elpher-page-address elpher-current-page))
-                                   "none"))
-                              ((eq major-mode 'eww-mode)
-                               (eww-current-url)))
-                        (cond ((eq major-mode 'elpher-mode)
-                               (elpher-find-title))
-                              ((eq major-mode 'eww-mode)
-                               (plist-get eww-data :title)))))
-                 entries))))
+           (setq entries
+                 (nconc (if arg
+                            (elpher-menu-refresh-current)
+                          (elpher-menu-refresh-history))
+                        entries)))))
       (setq tabulated-list-entries (nreverse entries)))
     (tabulated-list-init-header))
 
+(defun elpher-menu-refresh-current ()
+  "Return current entries for `elpher-menu-refresh'.
+If we're only interested in the current entries, then this
+function can only return a list of a single item per buffer."
+  (list buf
+       (vector
+        (cond ((eq major-mode 'elpher-mode) "E")
+              ((eq major-mode 'eww-mode) "W"))
+        (cond ((eq major-mode 'elpher-mode)
+               (or (elpher-address-to-url
+                    (elpher-page-address elpher-current-page))
+                   "none"))
+              ((eq major-mode 'eww-mode)
+               (eww-current-url)))
+        (cond ((eq major-mode 'elpher-mode)
+               (or (elpher-find-title)
+                   (elpher-page-display-string elpher-current-page)))
+              ((eq major-mode 'eww-mode)
+               (plist-get eww-data :title))))))
+
+(defun elpher-menu-refresh-history ()
+  "Return current entries for `elpher-menu-refresh'.
+If we're only interested in the current entries, then this
+function can only return a list of a single item per buffer."
+  (let ((separator (list (current-buffer)
+                        (vector
+                         "E"
+                         (make-string 25 ?-)
+                         (make-string 25 ?-)))))
+    (if (eq major-mode 'elpher-mode)
+       ;; every section starts with the current page and ends with
+       ;; the separator
+       (mapcar (lambda (page)
+                 (if page
+                     (list (current-buffer)
+                           (vector
+                            "E"
+                            (or (elpher-address-to-url
+                                 (elpher-page-address page)) "none")
+                            (or (elpher-page-display-string page) "?")))
+                   separator))
+               (cons elpher-current-page elpher-history))
+      (nconc (mapcar (lambda (data)
+                      (list (current-buffer)
+                            (vector
+                             "W"
+                             (plist-get data :url)
+                             (plist-get data :title))))
+                    (cons eww-data eww-history))
+            (list separator)))))
+
 ;;; Main start procedure
 ;;