summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorLars Magne Ingebrigtsen <larsi@gnus.org>2013-06-26 18:54:48 +0200
committerLars Magne Ingebrigtsen <larsi@gnus.org>2013-06-26 18:54:48 +0200
commit2b4f050643e66bbbe681a7e7e82dbdc5bf80fc7e (patch)
tree227f432ee9277902d7f2bf465515e3e5b96ed05f /lisp
parentbace80138586ec3d166baaa511eced3fb54d040b (diff)
downloademacs-2b4f050643e66bbbe681a7e7e82dbdc5bf80fc7e.tar.gz
emacs-2b4f050643e66bbbe681a7e7e82dbdc5bf80fc7e.tar.bz2
emacs-2b4f050643e66bbbe681a7e7e82dbdc5bf80fc7e.zip
Add bookmark support to eww
* net/eww.el (eww-mode): Undo isn't necessary in eww buffers, probably. (eww-mode-map): Add a menu bar. (eww-add-bookmark): New command. (eww-bookmark-mode): New mode and commands.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog2
-rw-r--r--lisp/net/eww.el174
-rw-r--r--lisp/url/ChangeLog1
-rw-r--r--lisp/url/url-cookie.el3
4 files changed, 178 insertions, 2 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 11c7b2de534..ea99e5c126a 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -3,6 +3,8 @@
* net/eww.el (eww-mode): Undo isn't necessary in eww buffers,
probably.
(eww-mode-map): Add a menu bar.
+ (eww-add-bookmark): New command.
+ (eww-bookmark-mode): New mode and commands.
2013-06-26 Glenn Morris <rgm@gnu.org>
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index d56031a6f34..0fd6591e053 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -337,6 +337,11 @@ word(s) will be searched for via `eww-search-prefix'."
(define-key map "w" 'eww-copy-page-url)
(define-key map "C" 'url-cookie-list)
+ (define-key map "b" 'eww-add-bookmark)
+ (define-key map "B" 'eww-list-bookmarks)
+ (define-key map [(meta n)] 'eww-next-bookmark)
+ (define-key map [(meta p)] 'eww-previous-bookmark)
+
(easy-menu-define nil map ""
'("eww"
["Quit" eww-quit t]
@@ -348,6 +353,8 @@ word(s) will be searched for via `eww-search-prefix'."
["Browse with external browser" eww-browse-with-external-browser t]
["Download" eww-download t]
["Copy page URL" eww-copy-page-url t]
+ ["Add bookmark" eww-add-bookmark t]
+ ["List bookmarks" eww-copy-page-url t]
["List cookies" url-cookie-list t]))
map))
@@ -366,6 +373,7 @@ word(s) will be searched for via `eww-search-prefix'."
(defun eww-save-history ()
(push (list :url eww-current-url
+ :title eww-current-title
:point (point)
:text (buffer-string))
eww-history))
@@ -404,7 +412,8 @@ word(s) will be searched for via `eww-search-prefix'."
(erase-buffer)
(insert (plist-get elem :text))
(goto-char (plist-get elem :point))
- (setq eww-current-url (plist-get elem :url))))
+ (setq eww-current-url (plist-get elem :url)
+ eww-current-title (plist-get elem :title))))
(defun eww-next-url ()
"Go to the page marked `next'.
@@ -929,6 +938,169 @@ The browser to used is specified by the `shr-external-browser' variable."
(setq count (1+ count)))
(expand-file-name file directory)))
+;;; Bookmarks code
+
+(defvar eww-bookmarks nil)
+
+(defun eww-add-bookmark ()
+ "Add the current page to the bookmarks."
+ (interactive)
+ (eww-read-bookmarks)
+ (dolist (bookmark eww-bookmarks)
+ (when (equal eww-current-url
+ (plist-get bookmark :url))
+ (error "Already bookmarked")))
+ (push (list :url eww-current-url
+ :title eww-current-title
+ :time (current-time-string))
+ eww-bookmarks)
+ (eww-write-bookmarks)
+ (message "Bookmarked %s (%s)" eww-current-url eww-current-title))
+
+(defun eww-write-bookmarks ()
+ (with-temp-file (expand-file-name "eww-bookmarks" user-emacs-directory)
+ (insert ";; Auto-generated file; don't edit\n")
+ (pp eww-bookmarks (current-buffer))))
+
+(defun eww-read-bookmarks ()
+ (with-temp-buffer
+ (insert-file-contents
+ (expand-file-name "eww-bookmarks" user-emacs-directory))
+ (setq eww-bookmarks (read (current-buffer)))))
+
+(defun eww-list-bookmarks ()
+ "Display the bookmarks."
+ (interactive)
+ (eww-bookmark-prepare)
+ (pop-to-buffer "*eww bookmarks*"))
+
+(defun eww-bookmark-prepare ()
+ (eww-read-bookmarks)
+ (when (null eww-bookmarks)
+ (error "No bookmarks are defined"))
+ (set-buffer (get-buffer-create "*eww bookmarks*"))
+ (eww-bookmark-mode)
+ (let ((format "%-40s %s")
+ (inhibit-read-only t)
+ start url)
+ (erase-buffer)
+ (setq header-line-format (concat " " (format format "URL" "Title")))
+ (dolist (bookmark eww-bookmarks)
+ (setq start (point))
+ (setq url (plist-get bookmark :url))
+ (when (> (length url) 40)
+ (setq url (substring url 0 40)))
+ (insert (format format url
+ (plist-get bookmark :title))
+ "\n")
+ (put-text-property start (1+ start) 'eww-bookmark bookmark))
+ (goto-char (point-min))))
+
+(defvar eww-bookmark-kill-ring nil)
+
+(defun eww-bookmark-kill ()
+ "Kill the current bookmark."
+ (interactive)
+ (let* ((start (line-beginning-position))
+ (bookmark (get-text-property start 'eww-bookmark))
+ (inhibit-read-only t))
+ (unless bookmark
+ (error "No bookmark on the current line"))
+ (forward-line 1)
+ (push (buffer-substring start (point)) eww-bookmark-kill-ring)
+ (delete-region start (point))
+ (setq eww-bookmarks (delq bookmark eww-bookmarks))
+ (eww-write-bookmarks)))
+
+(defun eww-bookmark-yank ()
+ "Yank a previously killed bookmark to the current line."
+ (interactive)
+ (unless eww-bookmark-kill-ring
+ (error "No previously killed bookmark"))
+ (beginning-of-line)
+ (let ((inhibit-read-only t)
+ (start (point))
+ bookmark)
+ (insert (pop eww-bookmark-kill-ring))
+ (setq bookmark (get-text-property start 'eww-bookmark))
+ (if (= start (point-min))
+ (push bookmark eww-bookmarks)
+ (let ((line (count-lines start (point))))
+ (setcdr (nthcdr (1- line) eww-bookmarks)
+ (cons bookmark (nthcdr line eww-bookmarks)))))
+ (eww-write-bookmarks)))
+
+(defun eww-bookmark-quit ()
+ "Kill the current buffer."
+ (interactive)
+ (kill-buffer (current-buffer)))
+
+(defun eww-bookmark-browse ()
+ "Browse the bookmark under point in eww."
+ (interactive)
+ (let ((bookmark (get-text-property (line-beginning-position) 'eww-bookmark)))
+ (unless bookmark
+ (error "No bookmark on the current line"))
+ (delete-window)
+ (eww (plist-get bookmark :url))))
+
+(defun eww-next-bookmark ()
+ "Go to the next bookmark in the list."
+ (interactive)
+ (let ((first nil)
+ bookmark)
+ (unless (get-buffer "*eww bookmarks*")
+ (setq first t)
+ (eww-bookmark-prepare))
+ (with-current-buffer (get-buffer "*eww bookmarks*")
+ (when (and (not first)
+ (not (eobp)))
+ (forward-line 1))
+ (setq bookmark (get-text-property (line-beginning-position)
+ 'eww-bookmark))
+ (unless bookmark
+ (error "No next bookmark")))
+ (eww-browse-url (plist-get bookmark :url))))
+
+(defun eww-previous-bookmark ()
+ "Go to the previous bookmark in the list."
+ (interactive)
+ (let ((first nil)
+ bookmark)
+ (unless (get-buffer "*eww bookmarks*")
+ (setq first t)
+ (eww-bookmark-prepare))
+ (with-current-buffer (get-buffer "*eww bookmarks*")
+ (if first
+ (goto-char (point-max))
+ (beginning-of-line))
+ ;; On the final line.
+ (when (eolp)
+ (forward-line -1))
+ (if (bobp)
+ (error "No previous bookmark")
+ (forward-line -1))
+ (setq bookmark (get-text-property (line-beginning-position)
+ 'eww-bookmark)))
+ (eww-browse-url (plist-get bookmark :url))))
+
+(defvar eww-bookmark-mode-map
+ (let ((map (make-sparse-keymap)))
+ (suppress-keymap map)
+ (define-key map "q" 'eww-bookmark-quit)
+ (define-key map [(control k)] 'eww-bookmark-kill)
+ (define-key map [(control y)] 'eww-bookmark-yank)
+ (define-key map "\r" 'eww-bookmark-browse)
+ map))
+
+(define-derived-mode eww-bookmark-mode nil "eww bookmarks"
+ "Mode for listing bookmarks.
+
+\\{eww-bookmark-mode-map}"
+ (buffer-disable-undo)
+ (setq buffer-read-only t
+ truncate-lines t))
+
(provide 'eww)
;;; eww.el ends here
diff --git a/lisp/url/ChangeLog b/lisp/url/ChangeLog
index 7b64b4cb3eb..43a14985ae2 100644
--- a/lisp/url/ChangeLog
+++ b/lisp/url/ChangeLog
@@ -2,6 +2,7 @@
* url-cookie.el: Implement a command and mode for displaying and
editing cookies.
+ (url-cookie-mode): Fix mode name.
2013-06-21 Glenn Morris <rgm@gnu.org>
diff --git a/lisp/url/url-cookie.el b/lisp/url/url-cookie.el
index 3e543300b30..008203c90df 100644
--- a/lisp/url/url-cookie.el
+++ b/lisp/url/url-cookie.el
@@ -427,9 +427,10 @@ to run the `url-cookie-setup-save-timer' function manually."
(suppress-keymap map)
(define-key map "q" 'url-cookie-quit)
(define-key map [delete] 'url-cookie-delete)
+ (define-key map [(control k)] 'url-cookie-delete)
map))
-(define-derived-mode url-cookie-mode nil "eww"
+(define-derived-mode url-cookie-mode nil "URL Cookie"
"Mode for listing cookies.
\\{url-cookie-mode-map}"