X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=13cd006844c4e6c4cb99ff07c2e7d07dfc126a57;hp=28f8075d2e86138498b12a6efcf3e7d454b51555;hb=30b3a679cd169253e3900c862631f33f002cd6e3;hpb=9c83b182ad7fe5e52d3ecabf0cb9df5d54357fef diff --git a/elpher.el b/elpher.el index 28f8075..13cd006 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." - (interactive) +(defun elpher-menu (&optional arg) + "Show a list of all your `elpher' buffers. +With an optional argument, add all the history items, too." + (interactive "P") (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 @@ -2126,7 +2127,7 @@ In Elpher Menu mode, the following commands are defined: \\[Buffer-menu-backup-unmark] Back up a line and remove marks. \\[revert-buffer] Update the list of buffers. \\[Buffer-menu-bury] Bury the buffer listed on this line." - (add-hook 'tabulated-list-revert-hook 'elpher-menu-refresh)) + (add-hook 'tabulated-list-revert-hook 'elpher-menu-refresh nil t)) (defvar elpher-title nil) @@ -2137,45 +2138,84 @@ 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)))) + (if arg + (setq entries (nconc (elpher-menu-refresh-history) entries)) + (push (elpher-menu-refresh-current) 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 (current-buffer) + (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 ;;