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: Acknowledgement (25.0.50; [PATCH] eww.el: Create simple mode to manage eww buffers) Date: Fri, 21 Nov 2014 01:23:18 +0200 Message-ID: <87fvddihi1.fsf@gmail.com> References: <87vbm9iib9.fsf@gmail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1416525872 6526 80.91.229.3 (20 Nov 2014 23:24:32 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 20 Nov 2014 23:24:32 +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:24:22 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 1Xrb5I-0005q8-7Q for geb-bug-gnu-emacs@m.gmane.org; Fri, 21 Nov 2014 00:24:20 +0100 Original-Received: from localhost ([::1]:37767 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xrb5H-0002Gv-Nc for geb-bug-gnu-emacs@m.gmane.org; Thu, 20 Nov 2014 18:24:19 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:56060) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xrb57-0002Gp-Od for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:24:17 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xrb50-0003gf-7w for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:24:09 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:42754) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xrb50-0003ga-4d for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:24:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1Xrb4z-00045j-N4 for bug-gnu-emacs@gnu.org; Thu, 20 Nov 2014 18:24:01 -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:24:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 19131 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 19131-submit@debbugs.gnu.org id=B19131.141652581415693 (code B ref 19131); Thu, 20 Nov 2014 23:24:01 +0000 Original-Received: (at 19131) by debbugs.gnu.org; 20 Nov 2014 23:23:34 +0000 Original-Received: from localhost ([127.0.0.1]:39967 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xrb4X-000452-IN for submit@debbugs.gnu.org; Thu, 20 Nov 2014 18:23:34 -0500 Original-Received: from mail-wg0-f43.google.com ([74.125.82.43]:39732) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xrb4U-00044s-KM for 19131@debbugs.gnu.org; Thu, 20 Nov 2014 18:23:31 -0500 Original-Received: by mail-wg0-f43.google.com with SMTP id l18so5141030wgh.2 for <19131@debbugs.gnu.org>; Thu, 20 Nov 2014 15:23:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:references:date:in-reply-to:message-id:user-agent :mime-version:content-type; bh=qPu2HEUnx/UN9NO3xhxNb7Ey94MJ/xQNn+MVKGuIop0=; b=NeN3jVE5up6tNsjOuPl62y1ViYZxqyRmEifwypmqeXp1PDvm5WR5jtKezVkerdgWUS r5rkDU617g3O3PyArsgjwrkCPAclJmxf4OuihGWfmiangFRYix5CC2U2MrSj3bV2Q/J1 C3RbeQ3v8uNbqM9hdrL9o+zCGPQQN4WYnLhf6pB2qxEX5q/ZsrKmqqx3yHFNSV+clsue VaxSeDWjwjr4UNm/lUcKsxK/KYgnrE9iInAQWiM+jsHrTBPgygZ+u18Xy1woeElkCS9/ RRGyldi6OGvX2x9aNcShcKnQAr0pzgwTsyQwThNeteQFPlPIPdXkfxQ0K32NdSLd8iri HjSQ== X-Received: by 10.194.59.36 with SMTP id w4mr1384780wjq.53.1416525809982; Thu, 20 Nov 2014 15:23:29 -0800 (PST) Original-Received: from andrexhe ([79.100.238.136]) by mx.google.com with ESMTPSA id w5sm6141704wif.18.2014.11.20.15.23.25 for <19131@debbugs.gnu.org> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Nov 2014 15:23:29 -0800 (PST) In-Reply-To: (GNU bug Tracking System's message of "Thu, 20 Nov 2014 23:07:02 +0000") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux) 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:96347 Excuse me, previous patch had copy-paste leftover in one of the docstrings. --- 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,7 +1562,134 @@ Differences in #targets are ignored." (setq buffer-read-only t truncate-lines t)) +;;; eww buffers list + +(defun eww-list-buffers () + "Enlist eww buffer." + (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