X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=1e46dd989465c77cf3edd38a2a3d18b74dac18f7;hp=a4c88311c8906f9acd7f180af8d8be9ab29adca1;hb=8f9cc21451fd78358e2b7fd05123026d87b5722d;hpb=14cd726993f266d890dcef7b582d173a97926377 diff --git a/elpher.el b/elpher.el index a4c8831..1e46dd9 100644 --- a/elpher.el +++ b/elpher.el @@ -2010,12 +2010,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 @@ -2142,45 +2143,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 ;;