ども、最近 eww にお熱な、るびきちです。

15年にもわたるw3m(端末)使いの僕ですが、
emacs-w3m の遅さには辟易としてきました。

Emacsでのブラウジングでemacs-w3mに代わるものとして
ewwに一目惚れしました。

とにかく速い!

ただ、今のところ機能はシンプルそのものなので、
欲しい機能があったら独自で追加する必要があります。

Emacsでのブラウジングでぜひとも欲しい機能は、
レンダリング後にすぐに欲しい情報が見られることです。

この機能さえあれば、取ってつけたような
Emacsインターフェースなんかなくても十分快適です。

多くのサイトは無駄な装飾に凝っているため、
ewwなどの テキストブラウザ で閲覧したときに、
本文がかなり下の方に表示されてしまいます。

そのため、欲しい情報を見つけるのに
わざわざスクロールする必要がります。

適切な位置まで自動で移動してくれれば、
とても快適になりますよね!

僕はオンライン国語辞典・類語辞典サイトとして
Weblio を愛用しています。

国語辞典や Wikipedia など様々な辞書を 串刺し検索 できるのが嬉しいです。

ただ、ewwで表示させると

Weblio 辞書 >

の行までスクロールさせないと意味が表示できません。

そこで、表示開始位置を設定し、簡単に検索できるように
M-x weblio を定義しました。

設定 141120042304.eww-weblio.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-set-start-at (url-regexp search-regexp)
  "URL-REGEXPにマッチするURLにて、SEARCH-REGEXPの行から表示させる"
  (when (string-match url-regexp (eww-current-url))
    (goto-char (point-min))
    (when (re-search-forward search-regexp nil t)
      (recenter 0))))

(defun region-or-read-string (prompt &optional initial history default inherit)
  "regionが指定されているときはその文字列を取得し、それ以外では`read-string'を呼ぶ。"
  (if (not (region-active-p))
      (read-string prompt initial history default inherit)
    (prog1
        (buffer-substring-no-properties (region-beginning) (region-end))
      (deactivate-mark)
      (message ""))))

(defun eww-render--after (&rest _)
  (eww-set-start-at "www.weblio.jp" "^ *Weblio 辞書")
  ;; 他のサイトの設定も同様に追加できる
  )
;;; [2017-01-14 Sat]バージョンごとに分岐
(if (boundp 'eww-after-render-hook)     ;25.1
    (add-hook 'eww-after-render-hook 'eww-render--after)
  (advice-add 'eww-render :after 'eww-render--after)) ;24.4

;;; weblio
(defun weblio (str)
  (interactive (list
                (region-or-read-string "Weblio: ")))
  (eww-browse-url (format "http://www.weblio.jp/content/%s"
                      (upcase (url-hexify-string str)))))
;;; wikipedia
(defun wikipedia (str)
  (interactive (list
                (region-or-read-string "Wikipedia: ")))
  (eww-browse-url (format "http://ja.wikipedia.org/wiki/%s"
                      (upcase (url-hexify-string str)))))

実行方法

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

region-or-read-string関数

region-or-read-string 関数は、

  • regionがあるときにはその文字列
  • それ以外では read-string によるミニバッファで文字列入力

する関数です。

他のサイトに対応させる

今回はWeblioを例にしましたが、
オンラインマニュアルやその他の辞書サイトにも簡単に対応できます。

やることは、

  1. M-x weblioの関数をパクる
  2. (必要あれば) eww-render--after
    eww-set-start-at でURLと行の正規表現を設定する

例として M-x wikipedia も定義しましたが、
スクロールする必要がないので、eww-set-start-at の設定は不要です。

ネット最強の 英和辞典 である 英辞郎 on the Web にも対応できますが、
利用規約によりスクレイピング等を禁止しているのでおすすめできません。

グレーゾーンゆえ自己責任でお願いします。

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