From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Andrey Kotlarski Newsgroups: gmane.emacs.bugs Subject: bug#19131: 25.0.50; [PATCH] eww.el: Create simple mode to manage eww buffers Date: Fri, 21 Nov 2014 01:05:46 +0200 Message-ID: <87vbm9iib9.fsf@gmail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1416524855 23335 80.91.229.3 (20 Nov 2014 23:07:35 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 20 Nov 2014 23:07:35 +0000 (UTC) To: 19131@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Nov 21 00:07:28 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Xraow-000831-Rn for geb-bug-gnu-emacs@m.gmane.org; Fri, 21 Nov 2014 00:07:27 +0100 Original-Received: from localhost ([::1]:37715 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xraou-00008n-46 for geb-bug-gnu-emacs@m.gmane.org; Thu, 20 Nov 2014 18:07:24 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:53507) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xraoh-00008R-Oy for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:07:20 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XraoY-0006uh-Ii for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:07:11 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:42746) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XraoY-0006ud-FH for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:07:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1XraoY-0003gS-5F for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:07:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Andrey Kotlarski Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 20 Nov 2014 23:07:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 19131 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.141652478814119 (code B ref -1); Thu, 20 Nov 2014 23:07:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 20 Nov 2014 23:06:28 +0000 Original-Received: from localhost ([127.0.0.1]:39959 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xranz-0003fe-Ky for submit@debbugs.gnu.org; Thu, 20 Nov 2014 18:06:28 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:51732) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xranw-0003fU-Cn for submit@debbugs.gnu.org; Thu, 20 Nov 2014 18:06:25 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xrann-0006pD-01 for submit@debbugs.gnu.org; Thu, 20 Nov 2014 18:06:24 -0500 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:55792) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xranm-0006p9-TL for submit@debbugs.gnu.org; Thu, 20 Nov 2014 18:06:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:53424) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xrand-0008Rx-Lt for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:06:14 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XranU-0006Zz-Cu for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:06:05 -0500 Original-Received: from mail-wi0-x22a.google.com ([2a00:1450:400c:c05::22a]:38205) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XranU-0006YZ-2g for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:05:56 -0500 Original-Received: by mail-wi0-f170.google.com with SMTP id bs8so1078986wib.3 for ; Thu, 20 Nov 2014 15:05:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:mime-version:content-type; bh=kP6oAWfq+xpl6P4pJtyVeSv+I2u/vCMGSjSri0p6w1A=; b=GeVzkHilSh92JI2jGggceGr2KQAeSBT4RGPaNQEjEvPLHk24Sg13HoPM+9KDbJGPEP x9VUacWlI/cBOzWuZK6stplTrM0de18bH55TqAlMMJK0SbTaTt9gYVl981XB4p4ohgNr 5AVjI1ml0XVkxBtnoZKjVK19bxtLabjWqtW4+pNLOpUS/Wbg7+z7COdSm7kR+TbCD9V1 BCfCV+IugqQzSLoZKxJYwzbFI1M6RfZca8MEmjgKT0rRIBDVrnG3S+yzmIo7Pmgibcxw 9Am6z9MpRqc7YnIC74jUZKqZmnlHQHkK4h1NOycJ44JxTuTd8q50iM7WwAriVRC6cZpH IHfw== X-Received: by 10.180.219.106 with SMTP id pn10mr20097652wic.63.1416524755513; Thu, 20 Nov 2014 15:05:55 -0800 (PST) Original-Received: from andrexhe ([79.100.238.136]) by mx.google.com with ESMTPSA id rx8sm5389223wjb.30.2014.11.20.15.05.52 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Nov 2014 15:05:54 -0800 (PST) X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:96346 Once opening new buffers becomes easier, there should be way to manage the ensuing chaos. Following patch adds simple interface that allows showing, switching to and killing eww buffers. (worry not about size, me papers has signed) --- lisp/ChangeLog | 7 +++ lisp/net/eww.el | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 473a1f8..2b28946 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2014-11-20 Andrey Kotlarski + + * 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. + 2014-11-20 Eric S. Raymond * vc/vc-bzr.el, vc/vc-cvs.el, vc/vc-dav.el, vc/vc-git.el, diff --git a/lisp/net/eww.el b/lisp/net/eww.el index 6746668..5f8ebae 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -567,6 +567,7 @@ the like." (define-key map "v" 'eww-view-source) (define-key map "R" 'eww-readable) (define-key map "H" 'eww-list-histories) + (define-key map "S" 'eww-list-buffers) (define-key map "b" 'eww-add-bookmark) (define-key map "B" 'eww-list-bookmarks) @@ -587,6 +588,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])) @@ -1560,6 +1562,134 @@ Differences in #targets are ignored." (setq buffer-read-only t truncate-lines t)) +;;; eww buffers list + +(defun eww-list-buffers () + "List the eww-histories." + (interactive) + (let (buffers-info + (current (current-buffer))) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (if (derived-mode-p 'eww-mode) + (push (vector buffer (plist-get eww-data :title) + (plist-get eww-data :url)) + buffers-info)))) + (or buffers-info + (error "No eww buffers")) + (setq buffers-info (nreverse buffers-info)) ;get 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) + (if (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))) + (or 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))) + (or 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) + (if (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) + (if (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)) + (or buffer + (user-error "No buffer on the current line")) + (kill-buffer buffer) + (forward-line 1) + (delete-region start (point))) + (if (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 -- 2.1.3