>From 9b1c46c18c113952f2274fab9c334140d5c071e3 Mon Sep 17 00:00:00 2001 Message-Id: <9b1c46c18c113952f2274fab9c334140d5c071e3.1634295931.git.info@protesilaos.com> From: Protesilaos Stavrou Date: Fri, 15 Oct 2021 14:05:01 +0300 Subject: [PATCH] Implement auto-renaming scheme for EWW buffers * etc/NEWS: Document the new user options. * lisp/net/eww.el (eww-auto-rename-buffer, eww-buffer-name-length): Add new user options. (eww--rename-buffer): Introduce new function that performs the renaming of buffers. (eww--after-page-change): Add new wrapper function which calls 'eww-update-header-line-format' and 'eww--rename-buffer'. (eww, eww-render, eww-tag-title, eww-readable, eww-restore-history): Include eww--after-page-change. Fix bug#51176. Co-authored-by: Abhiseck Paira Co-authored-by: Protesilaos Stavrou --- etc/NEWS | 11 +++++++++ lisp/net/eww.el | 65 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 7dd4d14274..3300ac157d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -89,6 +89,17 @@ Customize this option to limit the amount of entries in the menu * Changes in Specialized Modes and Packages in Emacs 29.1 +** eww + +--- +*** New user option to automatically rename EWW buffers +The 'eww-auto-rename-buffer' can be configured to rename rendered web +pages by using their title, URL, or a user-defined function which +returns a string. For the first two cases, the length of the +resulting name is controlled by 'eww-buffer-name-length'. By default, +no automatic renaming is performed. + + ** image-dired --- diff --git a/lisp/net/eww.el b/lisp/net/eww.el index 24c6335210..dc20c1745c 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -178,6 +178,33 @@ (defcustom eww-after-render-hook nil :group 'eww :type 'hook) +(defcustom eww-auto-rename-buffer nil + "Automatically rename EWW buffers once the page is rendered. + +When nil, do not rename the buffer. With a non-nil value +determine the renaming scheme, as follows: + +- `title': Use the web page's title. +- `url': Use the web page's URL. +- a function's symbol: Run a user-defined function that returns a + string with which to rename the buffer. + +The string of `title' and `url' is always truncated to the value +of `eww-buffer-name-length'." + :version "29.1" + :type '(choice + (const :tag "Do not rename buffers (default)" nil) + (const :tag "Rename buffer to web page title" title) + (const :tag "Rename buffer to web page URL" url) + (function :tag "A user-defined function to rename the buffer")) + :group 'eww) + +(defcustom eww-buffer-name-length 40 + "Length of renamed buffer name, per `eww-auto-rename-buffer'." + :type 'natnum + :version "29.1" + :group 'eww) + (defcustom eww-form-checkbox-selected-symbol "[X]" "Symbol used to represent a selected checkbox. See also `eww-form-checkbox-symbol'." @@ -353,7 +380,7 @@ (defun eww (url &optional arg buffer) (setq url (url-recreate-url parsed))) (plist-put eww-data :url url) (plist-put eww-data :title "") - (eww-update-header-line-format) + (eww--after-page-change) (let ((inhibit-read-only t)) (insert (format "Loading %s..." url)) (goto-char (point-min))) @@ -502,6 +529,30 @@ (defun eww-html-p (content-type) (member content-type '("text/html" "application/xhtml+xml"))) +(defun eww--rename-buffer () + "Rename the current EWW buffer. +The renaming scheme is performed in accordance with +`eww-auto-rename-buffer'." + (let ((rename-string) + (formater + (lambda (string) + (format "*%s # eww*" (truncate-string-to-width + string eww-buffer-name-length)))) + (site-title (plist-get eww-data :title)) + (site-url (plist-get eww-data :url))) + (cond ((null eww-auto-rename-buffer)) + ((eq eww-auto-rename-buffer 'url) + (setq rename-string (funcall formater site-url))) + ((functionp eww-auto-rename-buffer) + (setq rename-string (funcall eww-auto-rename-buffer))) + (t (setq rename-string + (funcall formater (if (or (equal site-title "") + (null site-title)) + "Untitled" + site-title))))) + (when rename-string + (rename-buffer rename-string t)))) + (defun eww-render (status url &optional point buffer encode) (let* ((headers (eww-parse-headers)) (content-type @@ -552,7 +603,7 @@ (defun eww-render (status url &optional point buffer encode) (eww-display-raw buffer (or encode charset 'utf-8)))) (with-current-buffer buffer (plist-put eww-data :url url) - (eww-update-header-line-format) + (eww--after-page-change) (setq eww-history-position 0) (and last-coding-system-used (set-buffer-file-coding-system last-coding-system-used)) @@ -796,12 +847,16 @@ (defun eww-update-header-line-format () `((?u . ,(or url "")) (?t . ,title)))))))) +(defun eww--after-page-change () + (eww-update-header-line-format) + (eww--rename-buffer)) + (defun eww-tag-title (dom) (plist-put eww-data :title (replace-regexp-in-string "^ \\| $" "" (replace-regexp-in-string "[ \t\r\n]+" " " (dom-text dom)))) - (eww-update-header-line-format)) + (eww--after-page-change)) (defun eww-display-raw (buffer &optional encode) (let ((data (buffer-substring (point) (point-max)))) @@ -929,7 +984,7 @@ (defun eww-readable () nil (current-buffer)) (dolist (elem '(:source :url :title :next :previous :up)) (plist-put eww-data elem (plist-get old-data elem))) - (eww-update-header-line-format))) + (eww--after-page-change))) (defun eww-score-readability (node) (let ((score -1)) @@ -1161,7 +1216,7 @@ (defun eww-restore-history (elem) (goto-char (plist-get elem :point)) ;; Make buffer listings more informative. (setq list-buffers-directory (plist-get elem :url)) - (eww-update-header-line-format)))) + (eww--after-page-change)))) (defun eww-next-url () "Go to the page marked `next'. -- 2.33.0