aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastián Monía2024-10-13 21:00:03 -0400
committerJim Porter2024-10-20 10:36:16 -0700
commitd3975cc925a856c872016df734563ce0709f3efc (patch)
treea818e10a52973cf536d538eb70dc00c482ac5007
parent53e84f8cfa85bb53c92936a3be73ab1445a89459 (diff)
downloademacs-d3975cc925a856c872016df734563ce0709f3efc.tar.gz
emacs-d3975cc925a856c872016df734563ce0709f3efc.zip
Use vtable in eww-list-buffers and add function eww-buffer-list
* lisp/net/eww.el (eww-buffer-list): New function. (eww-list-buffers): Move logic to... (eww--list-buffers-display-table, eww--list-buffers-get-data): ... these, and use 'vtable'. (eww-buffer-select, eww-buffer-show, eww-buffer-kill) (eww-buffers-mode-map): Use 'vtable-current-object'. (eww-buffers-mode): Set 'revert-buffer-function'
-rw-r--r--lisp/net/eww.el93
1 files changed, 42 insertions, 51 deletions
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index b5d2f20781a..17ebccc9453 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -33,6 +33,7 @@
33(require 'url) 33(require 'url)
34(require 'url-queue) 34(require 'url-queue)
35(require 'url-file) 35(require 'url-file)
36(require 'vtable)
36(require 'xdg) 37(require 'xdg)
37(eval-when-compile (require 'subr-x)) 38(eval-when-compile (require 'subr-x))
38 39
@@ -2604,58 +2605,47 @@ see)."
2604 2605
2605;;; eww buffers list 2606;;; eww buffers list
2606 2607
2608(defun eww-buffer-list ()
2609 "Return a list of all live eww buffers."
2610 (match-buffers '(derived-mode . eww-mode)))
2611
2607(defun eww-list-buffers () 2612(defun eww-list-buffers ()
2608 "Enlist eww buffers." 2613 "Pop a buffer with a list of eww buffers."
2609 (interactive) 2614 (interactive)
2610 (let (buffers-info 2615 (with-current-buffer (get-buffer-create "*eww buffers*")
2611 (current (current-buffer)))
2612 (dolist (buffer (buffer-list))
2613 (with-current-buffer buffer
2614 (when (derived-mode-p 'eww-mode)
2615 (push (vector buffer (plist-get eww-data :title)
2616 (plist-get eww-data :url))
2617 buffers-info))))
2618 (unless buffers-info
2619 (error "No eww buffers"))
2620 (setq buffers-info (nreverse buffers-info)) ;more recent on top
2621 (set-buffer (get-buffer-create "*eww buffers*"))
2622 (eww-buffers-mode) 2616 (eww-buffers-mode)
2623 (let ((inhibit-read-only t) 2617 (eww--list-buffers-display-table))
2624 (domain-length 0)
2625 (title-length 0)
2626 url title format start)
2627 (erase-buffer)
2628 (dolist (buffer-info buffers-info)
2629 (setq title-length (max title-length
2630 (length (elt buffer-info 1)))
2631 domain-length (max domain-length
2632 (length (elt buffer-info 2)))))
2633 (setq format (format "%%-%ds %%-%ds" title-length domain-length)
2634 header-line-format
2635 (concat " " (format format "Title" "URL")))
2636 (let ((line 0)
2637 (current-buffer-line 1))
2638 (dolist (buffer-info buffers-info)
2639 (setq start (point)
2640 title (elt buffer-info 1)
2641 url (elt buffer-info 2)
2642 line (1+ line))
2643 (insert (format format title url))
2644 (insert "\n")
2645 (let ((buffer (elt buffer-info 0)))
2646 (put-text-property start (1+ start) 'eww-buffer
2647 buffer)
2648 (when (eq current buffer)
2649 (setq current-buffer-line line))))
2650 (goto-char (point-min))
2651 (forward-line (1- current-buffer-line)))))
2652 (pop-to-buffer "*eww buffers*")) 2618 (pop-to-buffer "*eww buffers*"))
2653 2619
2620(defun eww--list-buffers-display-table (&optional ignore-auto noconfirm)
2621 "Display a table with the list of eww buffers.
2622Will remove all buffer contents first. The parameters IGNORE-AUTO and
2623NOCONFIRM are ignored, they are for compatibility with
2624`revert-buffer-function'."
2625 (let ((inhibit-read-only t))
2626 (erase-buffer)
2627 (make-vtable
2628 :columns '((:name "Title" :min-width "25%" :max-width "50%")
2629 (:name "URL"))
2630 :objects-function #'eww--list-buffers-get-data
2631 ;; use fixed-font face
2632 :face 'default)))
2633
2634(defun eww--list-buffers-get-data ()
2635 "Return the eww-data of BUF, assumed to be a eww buffer.
2636The format of the data is (title url buffer), for use in of
2637`eww-buffers-mode'."
2638 (mapcar (lambda (buf)
2639 (let ((buf-eww-data (buffer-local-value 'eww-data buf)))
2640 (list (plist-get buf-eww-data :title)
2641 (plist-get buf-eww-data :url)
2642 buf)))
2643 (eww-buffer-list)))
2644
2654(defun eww-buffer-select () 2645(defun eww-buffer-select ()
2655 "Switch to eww buffer." 2646 "Switch to eww buffer."
2656 (interactive nil eww-buffers-mode) 2647 (interactive nil eww-buffers-mode)
2657 (let ((buffer (get-text-property (line-beginning-position) 2648 (let ((buffer (nth 2 (vtable-current-object))))
2658 'eww-buffer)))
2659 (unless buffer 2649 (unless buffer
2660 (error "No buffer on current line")) 2650 (error "No buffer on current line"))
2661 (quit-window) 2651 (quit-window)
@@ -2663,8 +2653,7 @@ see)."
2663 2653
2664(defun eww-buffer-show () 2654(defun eww-buffer-show ()
2665 "Display buffer under point in eww buffer list." 2655 "Display buffer under point in eww buffer list."
2666 (let ((buffer (get-text-property (line-beginning-position) 2656 (let ((buffer (nth 2 (vtable-current-object))))
2667 'eww-buffer)))
2668 (unless buffer 2657 (unless buffer
2669 (error "No buffer on current line")) 2658 (error "No buffer on current line"))
2670 (other-window -1) 2659 (other-window -1)
@@ -2692,7 +2681,7 @@ see)."
2692 "Kill buffer from eww list." 2681 "Kill buffer from eww list."
2693 (interactive nil eww-buffers-mode) 2682 (interactive nil eww-buffers-mode)
2694 (let* ((start (line-beginning-position)) 2683 (let* ((start (line-beginning-position))
2695 (buffer (get-text-property start 'eww-buffer)) 2684 (buffer (nth 2 (vtable-current-object)))
2696 (inhibit-read-only t)) 2685 (inhibit-read-only t))
2697 (unless buffer 2686 (unless buffer
2698 (user-error "No buffer on the current line")) 2687 (user-error "No buffer on the current line"))
@@ -2711,10 +2700,9 @@ see)."
2711 :menu '("Eww Buffers" 2700 :menu '("Eww Buffers"
2712 ["Exit" quit-window t] 2701 ["Exit" quit-window t]
2713 ["Select" eww-buffer-select 2702 ["Select" eww-buffer-select
2714 :active (get-text-property (line-beginning-position) 'eww-buffer)] 2703 :active (nth 2 (vtable-current-object))]
2715 ["Kill" eww-buffer-kill 2704 ["Kill" eww-buffer-kill
2716 :active (get-text-property (line-beginning-position) 2705 :active (nth 2 (vtable-current-object))]))
2717 'eww-buffer)]))
2718 2706
2719(define-derived-mode eww-buffers-mode special-mode "eww buffers" 2707(define-derived-mode eww-buffers-mode special-mode "eww buffers"
2720 "Mode for listing buffers. 2708 "Mode for listing buffers.
@@ -2722,7 +2710,10 @@ see)."
2722\\{eww-buffers-mode-map}" 2710\\{eww-buffers-mode-map}"
2723 :interactive nil 2711 :interactive nil
2724 (buffer-disable-undo) 2712 (buffer-disable-undo)
2725 (setq truncate-lines t)) 2713 (setq truncate-lines t
2714 ;; this is set so that pressing "g" with point just below the
2715 ;; table will still update the listing
2716 revert-buffer-function #'eww--list-buffers-display-table))
2726 2717
2727;;; Desktop support 2718;;; Desktop support
2728 2719