eww使っていますかー!?

高速動作するから、僕は emacs-w3m からあっさり乗り換えてしまいました。

この前、 helm-eww.el というのを速攻で作ってしまいました。

ewwは M-x rename-buffer しない限り、1つのバッファにすべての ブラウザ履歴 を保存するようになっています。

つまり、そのままでは他のページには簡単には切り替えられない欠点があります。

そこで、ewwの履歴を helmインターフェース ですぐにアクセスすれば
あたかも複数のバッファに分かれているかのように扱えます。

現時点でもとても快適に使えています。

eww元々の「H」、そしてw3m流の「s」に
M-x helm-eww-history を割り当てています。

情報源 helm-source-eww-history
helm-for-files-preferred-list に入れれば
M-x helm-for-files からでもアクセスできます。

;;; 設定例
(setq helm-for-files-preferred-list
      '(helm-source-buffers-list
        helm-source-recentf
        helm-source-bookmarks
        helm-source-file-cache
        helm-source-files-in-current-dir
        helm-source-eww-history
        helm-source-locate))

なお、 anything-c-source-eww-history も定義しているので、
anything.el を使っている方でも使用できます。

叩き台なので改良したい方、MELPAに上げたい方は大歓迎です。

設定 helm-eww.el(以下のコードと同一)

(require 'eww)
(defvar eww-data)
(defun eww-current-url ()
  (if (boundp 'eww-current-url)
      eww-current-url                   ;emacs24.4
    (plist-get eww-data :url)))         ;emacs25
(defun eww-current-title ()
  (if (boundp 'eww-current-title)
      eww-current-title                   ;emacs24.4
    (plist-get eww-data :title)))

(require 'helm)
(require 'cl-lib)

(defun helm-eww-history-candidates ()
  (cl-loop with hash = (make-hash-table :test 'equal)
           for b in (buffer-list)
           when (eq (buffer-local-value 'major-mode b) 'eww-mode)
           append (with-current-buffer b
                    (clrhash hash)
                    (puthash (eww-current-url) t hash)
                    (cons
                     (cons (format "%s (%s) <%s>" (eww-current-title) (eww-current-url) b) b)
                     (cl-loop for pl in eww-history
                              unless (gethash (plist-get pl :url) hash)
                              collect
                              (prog1 (cons (format "%s (%s) <%s>" (plist-get pl :title) (plist-get pl :url) b)
                                           (cons b pl))
                                (puthash (plist-get pl :url) t hash)))))))
(defun helm-eww-history-browse (buf-hist)
  (if (bufferp buf-hist)
      (switch-to-buffer buf-hist)
    (switch-to-buffer (car buf-hist))
    (eww-save-history)
    (eww-restore-history (cdr buf-hist))))
(defvar helm-source-eww-history
  '((name . "eww history")
    (candidates . helm-eww-history-candidates)
    (migemo)
    (action . helm-eww-history-browse)))
(defvaralias 'anything-c-source-eww-history 'helm-source-eww-history)
(defun helm-eww-history ()
  (interactive)
  (helm :sources 'helm-source-eww-history
        :buffer "*helm eww*"))

(define-key eww-mode-map (kbd "H") 'helm-eww-history)
(define-key eww-mode-map (kbd "s") 'helm-eww-history)

実行方法

$ wget http://rubikitch.com/f/helm-eww.el
$ emacs -Q -f package-initialize -l helm-eww.el

20141126091701.png
Fig1: helmで履歴!

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。