Common LispのHyperspecをewwで見る(の微修正)

Posted on May 2, 2021

いままで調べるときはWebブラウザに移動して検索していたが、ふと気になったのでEmacsのewwでCommonLispのHyperSpecをHack!(2015年)を参考に設定を変更したときのメモ。

ちょっと検索してみるとどうやらこのページの記述は若干古いらしく、新しい方の書き方と思われるコードに変更(古いだけで問題なく動きはする。)。 基本的には上記のページの内容に沿っているので違うところのみを以下メモ。 また、ここのコードは動きはしますが実際のところ正しいのかはよくわかっておりません。

修正する設置ファイルの位置

使っているslimeのHyperspecに関わる設定ファイルhyperspec.elを編集する。 roswellを使っているときは~/.roswell/lisp/slime/2020.07.15/lib/にあるhyperspec.elが読み込まれる(バージョンによってはslime直下のディレクトリ名は違うと思われる。)。 roswellを使っていないときは~/.emacs.d/elpa/以下に同じようなディレクトリがあるはずなので、そこを修正すれば反映されると思われる。

ここではその設定ファイルを直接編集するので、念の為ファイル内で既存のコードはコメントアウトして編集するか、別途バックアップファイルを作っておくかしておく。

defadviceからdefun+advice-add

どうやら参考にしたページにあるdefadviceを使うコードは古いらしく、以下のようにdefunadvice-addとのコードに変更した。

(defun common-lisp-hyperspec-around (orig-func &rest args)
  (let ((buf (current-buffer)))
    (apply orig-func args)
    (switch-to-buffer buf)
    (pop-to-buffer "*eww*")))

(advice-add 'common-lisp-hyperspec :around 'common-lisp-hyperspec-around)
(defun common-lisp-hyperspec-lookup-reader-macro-around (oring-func &rest args)
  (let ((buf (current-buffer)))
    (apply oring-func args)
    (switch-to-buffer buf)
    (pop-to-buffer "*eww*")))

(advice-add 'common-lisp-hyperspec-lookup-reader-macro :around 'common-lisp-hyperspec-lookup-reader-macro-around)
(defun common-lisp-hyperspec-format-around (orig-func &rest args)
  (let ((buf (current-buffer)))
    (apply orig-func args)
    (switch-to-buffer buf)
    (pop-to-buffer "*eww*")))

(advice-add 'common-lisp-hyperspec-format :around 'common-lisp-hyperspec-format-around)

:aroundの場合だけなので、defadviceを元の函数とその引数とを引数に持つdefunに書き換え、ad-do-itの部分を(apply orig-func args)に書き換えた。

これでCommon LispのHyperspecを見るときは外部のWebブラウザを立ち上げずにemacsのewwが呼びだされるようになった。

参考にしたページ: