diff options
| author | Sebastián Monía | 2024-10-13 21:00:03 -0400 |
|---|---|---|
| committer | Jim Porter | 2024-10-20 10:36:16 -0700 |
| commit | d3975cc925a856c872016df734563ce0709f3efc (patch) | |
| tree | a818e10a52973cf536d538eb70dc00c482ac5007 | |
| parent | 53e84f8cfa85bb53c92936a3be73ab1445a89459 (diff) | |
| download | emacs-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.el | 93 |
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. | ||
| 2622 | Will remove all buffer contents first. The parameters IGNORE-AUTO and | ||
| 2623 | NOCONFIRM 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. | ||
| 2636 | The 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 | ||