X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;fp=elpher.el;h=943b56917abadc4eaaf3c91937b0ecc14f98d44e;hp=4a141b761239979e59af3c2a90ce3af59699f9a7;hb=86432509f92b6169e3ab92dc84c296931e63be0f;hpb=f9d15bdf681fdd418bd51c4325704d127b7814bc diff --git a/elpher.el b/elpher.el index 4a141b7..943b569 100644 --- 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 ;;