1ヶ月ぐらい前からCommonLispを勉強してるけど、HyperSpecのドキュメントを見るとき
いちいちWebページを見ていたら時間かかるし、シームレスじゃないので目も疲れるし、
いいことなかったのでストレスなく快適て閲覧できるようEmacsのewwでHackした。

検索機能としては、インタラクティブ検索とカーソル検索が2つが用意されてて
とりあえず、こんな感じで見れるようになる

hyperspec

導入手順

1. 以下が前提となる

・ Emacs24以上
・ Slimeを導入済み

2. HyperSpecドキュメントをローカルにダウンロードして解凍して任意の場所へ配置する。
1
2
3
cd ~/.emacs.d/share
wget ftp://ftp.lispworks.com/pub/software_tools/reference/HyperSpec-7-0.tar.gz
tar xvfz HyperSpec-7-0.tar.gz
3. 設定ファイルへ追記

slimeのlibに置かれてるhyperspec.elをewwで動作するよう以下の関数を上書く。
・ common-lisp-hyperspec
・ common-lisp-hyperspec-lookup-reader-macro
・ common-lisp-hyperspec-format

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
;; HyperSpecをewwで見る設定
(setq common-lisp-hyperspec-root "~/.emacs.d/share/HyperSpec/")

(defun common-lisp-hyperspec (symbol-name)
(interactive (list (common-lisp-hyperspec-read-symbol-name)))
(let ((name (common-lisp-hyperspec--strip-cl-package
(downcase symbol-name))))
(cl-maplist (lambda (entry)
(eww-open-file (concat common-lisp-hyperspec-root "Body/"
(car entry)))
(when (cdr entry)
(sleep-for 1.5)))
(or (common-lisp-hyperspec--find name)
(error "The symbol `%s' is not defined in Common Lisp"
symbol-name)))))

(defun common-lisp-hyperspec-lookup-reader-macro (macro)
(interactive
(list
(let ((completion-ignore-case t))
(completing-read "Look up reader-macro: "
common-lisp-hyperspec--reader-macros nil t
(common-lisp-hyperspec-reader-macro-at-point)))))
(eww-open-file
(concat common-lisp-hyperspec-root "Body/"
(gethash macro common-lisp-hyperspec--reader-macros))))

(defun common-lisp-hyperspec-format (character-name)
(interactive (list (common-lisp-hyperspec--read-format-character)))
(cl-maplist (lambda (entry)
(eww-open-file (common-lisp-hyperspec-section (car entry))))
(or (gethash character-name
common-lisp-hyperspec--format-characters)
(error "The symbol `%s' is not defined in Common Lisp"
character-name))))

(defadvice common-lisp-hyperspec (around common-lisp-hyperspec-around activate)
(let ((buf (current-buffer)))
ad-do-it
(switch-to-buffer buf)
(pop-to-buffer "*eww*")))

(defadvice common-lisp-hyperspec-lookup-reader-macro (around common-lisp-hyperspec-lookup-reader-macro-around activate)
(let ((buf (current-buffer)))
ad-do-it
(switch-to-buffer buf)
(pop-to-buffer "*eww*")))

(defadvice common-lisp-hyperspec-format (around common-lisp-hyperspec-format activate)
(let ((buf (current-buffer)))
ad-do-it
(switch-to-buffer buf)
(pop-to-buffer "*eww*")))

defadviceは画面分割してポップアップでewwのwindowを開くようにしてる。
これでラクになれるはず。


X