Subject: [PATCH] New command eww-switch-to-buffer

From: Mark Oteiza <[email-masked]>
Date: Thu, 4 Feb 2016 01:31:43 -0500

* doc/misc/eww.texi: Document eww-switch-to-buffer and its keybinding
* etc/NEWS: Mention new command
* lisp/net/eww.el (eww-mode-map): Bind eww-switch-to-buffer to "s"
(eww-mode-map): Add menu item
(eww-switch-to-buffer): New command
---
On 04/02/16 at 01:18pm, Lars Ingebrigtsen wrote:
> Mark Oteiza <[email-masked]> writes:
> 
> > I don't, but I was thinking more like "S but in the minibuffer". Where the
> > buffer names in erc are meaningful, in eww they are not so much (at
> > least in my case where I'm usually using clone-buffer to make more eww
> > buffers). So the completion candidates might be the buffer urls, titles, or
> > instead just showing annotations like so:
> 
> That sounds pretty cool...  Alternatively we could give the eww buffers
> better names (based on URLs or titles).  That may be a handful, though.
> 
> Could you send a patch for this new command against the trunk (including
> documentation)?

Hopefully covered everything. "s" seemed a sensible bind.

 doc/misc/eww.texi |  6 +++++-
 etc/NEWS          |  5 +++++
 lisp/net/eww.el   | 20 ++++++++++++++++++++
 3 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi
index 0e9bedb..afb1caf 100644
--- a/doc/misc/eww.texi
+++ b/doc/misc/eww.texi
@@ -164,12 +164,16 @@ You can view stored bookmarks with @kbd{B}
 (@code{eww-list-bookmarks}).  This will open the bookmark buffer
 @file{*eww bookmarks*}.
 
+@findex eww-switch-to-buffer
 @findex eww-list-buffers
+@kindex s
 @kindex S
 @cindex Multiple Buffers
   To get summary of currently opened EWW buffers, press @kbd{S}
 (@code{eww-list-buffers}).  The @file{*eww buffers*} buffer allows you
-to quickly kill, flip through and switch to specific EWW buffer.
+to quickly kill, flip through and switch to specific EWW buffer.  To
+switch EWW buffers through a minibuffer prompt, press @kbd{s}
+(@code{eww-switch-to-buffer}).
 
 @findex eww-browse-with-external-browser
 @vindex shr-external-browser
diff --git a/etc/NEWS b/etc/NEWS
index 3150432..faf49b0 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -52,6 +52,11 @@ in these situations.
 
 * Changes in Specialized Modes and Packages in Emacs 25.2
 
+** eww
+
++++
+*** A new `s' command for switching to another eww buffer via the minibuffer.
+
 +++
 ** The commands that add ChangeLog entries now prefer a VCS root directory
 for the ChangeLog file, if none already exists.  Customize
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index cb23127..5a50877 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -689,6 +689,7 @@ the like."
     (define-key map "R" 'eww-readable)
     (define-key map "H" 'eww-list-histories)
     (define-key map "E" 'eww-set-character-encoding)
+    (define-key map "s" 'eww-switch-to-buffer)
     (define-key map "S" 'eww-list-buffers)
     (define-key map "F" 'eww-toggle-fonts)
     (define-key map [(meta C)] 'eww-toggle-colors)
@@ -712,6 +713,7 @@ the like."
 	["View page source" eww-view-source]
 	["Copy page URL" eww-copy-page-url t]
 	["List histories" eww-list-histories t]
+	["Switch to buffer" eww-switch-to-buffer t]
 	["List buffers" eww-list-buffers t]
 	["Add bookmark" eww-add-bookmark t]
 	["List bookmarks" eww-list-bookmarks t]
@@ -1498,6 +1500,24 @@ If CHARSET is nil then use UTF-8."
       (eww-reload nil 'utf-8)
     (eww-reload nil charset)))
 
+(defun eww-switch-to-buffer ()
+  "Prompt for an EWW buffer to display in the selected window."
+  (interactive)
+  (let ((completion-extra-properties
+         '(:annotation-function (lambda (buf)
+                                  (with-current-buffer buf
+                                    (format " %s" (eww-current-url)))))))
+    (switch-to-buffer
+     (read-buffer "Switch to EWW buffer: "
+                  (cl-loop for buf in (nreverse (buffer-list))
+                           if (with-current-buffer buf (derived-mode-p 'eww-mode))
+                           return buf)
+                  t
+                  (lambda (bufn)
+                    (with-current-buffer
+                        (if (consp bufn) (cdr bufn) (get-buffer bufn))
+                      (derived-mode-p 'eww-mode)))))))
+
 (defun eww-toggle-fonts ()
   "Toggle whether to use monospaced or font-enabled layouts."
   (interactive)
-- 
2.7.0