]> git.eshelyaron.com Git - emacs.git/commitdiff
Commands and mode for managing multiple eww buffers
authorAndrey Kotlarski <m00naticus@gmail.com>
Mon, 8 Dec 2014 18:29:06 +0000 (19:29 +0100)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 8 Dec 2014 18:29:06 +0000 (19:29 +0100)
Fixes: debbugs:19131
* doc/misc/eww.texi (Basics): Document managing multiple eww buffers.

* lisp/net/eww.el (eww-buffers-mode): New major mode.
(eww-list-buffers, eww-buffer-select, eww-buffer-show-next)
(eww-buffer-show-previous, eww-buffer-kill, eww-buffer-show): New
commands/functions.

doc/misc/ChangeLog
doc/misc/eww.texi
lisp/ChangeLog
lisp/net/eww.el

index 4d8f69010308164addfb8ac500c6518f4499a228..45ab7923b4b8113131e8138187b897b36b49bb09 100644 (file)
@@ -1,3 +1,7 @@
+2014-12-08  Andrey Kotlarski  <m00naticus@gmail.com>
+
+       * eww.texi (Basics): Document managing multiple eww buffers.
+
 2014-12-05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * eww.texi (Basics): Document eww PDF viewing.
index dd460cc4ecf7ed153a51ed8264b327b2e8c012d8..e6221ceb7550a18b0293ccd58eae70a0541a49b3 100644 (file)
@@ -152,6 +152,13 @@ You can view stored bookmarks with @kbd{B}
 (@code{eww-list-bookmarks}).  This will open the bookmark buffer
 @file{*eww bookmarks*}.
 
+@findex eww-list-buffers
+@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 to
+quickly kill, flip through and switch to specific EWW buffer.
+
 @findex eww-browse-with-external-browser
 @vindex shr-external-browser
 @vindex eww-use-external-browser-for-content-type
index 91d2bba2b52481792c0b4caaaa34ff79e216e9f5..1ca7c87ad9442f0031f67ad7335ef83bad1fdb74 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-06  Andrey Kotlarski  <m00naticus@gmail.com>
+
+       * net/eww.el (eww-buffers-mode): New major mode.
+       (eww-list-buffers, eww-buffer-select, eww-buffer-show-next)
+       (eww-buffer-show-previous, eww-buffer-kill, eww-buffer-show): New
+       commands/functions (bug#19131).
+
 2014-12-08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * net/gnutls.el (gnutls-negotiate): Ignore files found via
index 58e0ff36f6af1be2e2c45a3548044add5e977ba2..ed88c00af7c292eecbf5725a55d854a91237ea2d 100644 (file)
@@ -623,6 +623,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-list-buffers)
 
     (define-key map "b" 'eww-add-bookmark)
     (define-key map "B" 'eww-list-bookmarks)
@@ -643,6 +644,7 @@ the like."
        ["View page source" eww-view-source]
        ["Copy page URL" eww-copy-page-url t]
        ["List histories" eww-list-histories t]
+       ["List buffers" eww-list-buffers t]
        ["Add bookmark" eww-add-bookmark t]
        ["List bookmarks" eww-list-bookmarks t]
        ["List cookies" url-cookie-list t]
@@ -1652,6 +1654,134 @@ Differences in #targets are ignored."
   (setq buffer-read-only t
        truncate-lines t))
 
+;;; eww buffers list
+
+(defun eww-list-buffers ()
+  "Enlist eww buffers."
+  (interactive)
+  (let (buffers-info
+        (current (current-buffer)))
+    (dolist (buffer (buffer-list))
+      (with-current-buffer buffer
+        (when (derived-mode-p 'eww-mode)
+          (push (vector buffer (plist-get eww-data :title)
+                        (plist-get eww-data :url))
+                buffers-info))))
+    (unless buffers-info
+      (error "No eww buffers"))
+    (setq buffers-info (nreverse buffers-info)) ;more recent on top
+    (set-buffer (get-buffer-create "*eww buffers*"))
+    (eww-buffers-mode)
+    (let ((inhibit-read-only t)
+          (domain-length 0)
+          (title-length 0)
+          url title format start)
+      (erase-buffer)
+      (dolist (buffer-info buffers-info)
+        (setq title-length (max title-length
+                                (length (elt buffer-info 1)))
+              domain-length (max domain-length
+                                 (length (elt buffer-info 2)))))
+      (setq format (format "%%-%ds %%-%ds" title-length domain-length)
+            header-line-format
+            (concat " " (format format "Title" "URL")))
+      (let ((line 0)
+            (current-buffer-line 1))
+        (dolist (buffer-info buffers-info)
+          (setq start (point)
+                title (elt buffer-info 1)
+                url (elt buffer-info 2)
+                line (1+ line))
+          (insert (format format title url))
+          (insert "\n")
+          (let ((buffer (elt buffer-info 0)))
+            (put-text-property start (1+ start) 'eww-buffer
+                               buffer)
+            (when (eq current buffer)
+              (setq current-buffer-line line))))
+        (goto-char (point-min))
+        (forward-line (1- current-buffer-line)))))
+  (pop-to-buffer "*eww buffers*"))
+
+(defun eww-buffer-select ()
+  "Switch to eww buffer."
+  (interactive)
+  (let ((buffer (get-text-property (line-beginning-position)
+                                   'eww-buffer)))
+    (unless buffer
+      (error "No buffer on current line"))
+    (quit-window)
+    (switch-to-buffer buffer)))
+
+(defun eww-buffer-show ()
+  "Display buffer under point in eww buffer list."
+  (let ((buffer (get-text-property (line-beginning-position)
+                                   'eww-buffer)))
+    (unless buffer
+      (error "No buffer on current line"))
+    (other-window -1)
+    (switch-to-buffer buffer)
+    (other-window 1)))
+
+(defun eww-buffer-show-next ()
+  "Move to next eww buffer in the list and display it."
+  (interactive)
+  (forward-line)
+  (when (eobp)
+    (goto-char (point-min)))
+  (eww-buffer-show))
+
+(defun eww-buffer-show-previous ()
+  "Move to previous eww buffer in the list and display it."
+  (interactive)
+  (beginning-of-line)
+  (when (bobp)
+    (goto-char (point-max)))
+  (forward-line -1)
+  (eww-buffer-show))
+
+(defun eww-buffer-kill ()
+  "Kill buffer from eww list."
+  (interactive)
+  (let* ((start (line-beginning-position))
+        (buffer (get-text-property start 'eww-buffer))
+        (inhibit-read-only t))
+    (unless buffer
+      (user-error "No buffer on the current line"))
+    (kill-buffer buffer)
+    (forward-line 1)
+    (delete-region start (point)))
+  (when (eobp)
+    (forward-line -1))
+  (eww-buffer-show))
+
+(defvar eww-buffers-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "q" 'quit-window)
+    (define-key map [(control k)] 'eww-buffer-kill)
+    (define-key map "\r" 'eww-buffer-select)
+    (define-key map "n" 'eww-buffer-show-next)
+    (define-key map "p" 'eww-buffer-show-previous)
+
+    (easy-menu-define nil map
+      "Menu for `eww-buffers-mode-map'."
+      '("Eww Buffers"
+        ["Exit" quit-window t]
+        ["Select" eww-buffer-select
+         :active (get-text-property (line-beginning-position) 'eww-buffer)]
+        ["Kill" eww-buffer-kill
+         :active (get-text-property (line-beginning-position) 'eww-buffer)]))
+    map))
+
+(define-derived-mode eww-buffers-mode nil "eww buffers"
+  "Mode for listing buffers.
+
+\\{eww-buffers-mode-map}"
+  (buffer-disable-undo)
+  (setq buffer-read-only t
+       truncate-lines t))
+
 ;;; Desktop support
 
 (defvar eww-desktop-data-save