八発白中

はてなブログに引越しました。

コマンドラインからHyperSpecを開くRoswellスクリプト

コマンドラインからHyperSpecを簡単に開けるRoswellスクリプトを作ったので紹介します。

Roswellが何か知らない人はまずこちらの記事をお読みください。

blog.8arrow.org

昔はEmacsからemacs-w3mで開くことでEmacsから出ずに見られるように設定していたのですが、慣習として定着しなかったので最近はこのスクリプトでターミナルから開いています。

これならGUIのデフォルトブラウザで開けるので、Slackで質問されたときとかに「HyperSpec見ろ」と言ってURLを投げつけたりできて便利です。

インストール方法

Roswellをインストールしてください。

その後、上述のgistページからダウンロードして実行属性をつけ、PATHの通ったところに置くだけです。

$ wget https://gist.githubusercontent.com/fukamachi/3510ea1609c1b52830c2/raw/clhs.ros -O clhs
$ chmod u+x clhs
$ mv clhs /usr/local/bin

起動時間が気になるようなら、ros buildでexecutableを生成してしまえば待ち時間がほとんどなくなるのでおすすめです。

$ ros build clhs.ros
$ mv clhs /usr/local/bin

Roswellスクリプトにすると、こうして簡単に実行ファイルを吐けるので便利です。

使い方

clhsコマンドにシンボル名を与えるだけです。シンボルが見つかればデフォルトのブラウザでページを開きます。

$ clhs handler-bind
Opening "http://www.lispworks.com/documentation/HyperSpec/Body/m_handle.htm"

仕組み

初回にHyperSpecのシンボルリストのページを取ってきてパースしています。パースしたものは~/.cache以下に保存しており、次回以降はそのキャッシュを参照します。

キャッシュを作るために依存ライブラリとしてDrakma、Plump、CLSSが必要なのですが、一度キャッシュを作ってしまえば毎回ロードするのは無駄なので、キャッシュがないときだけこれら依存ライブラリがロードされます。この仕組みのためにQlotで使っているマクロwith-package-functionsをコピってきていて、その部分だけ少し技巧的です *1

Drakmaのリクエストが200以外を返したときは地味にデバッガからリトライができる、とかも対応しています。Common Lispのrestartの簡単な使い方として参考になるかもしれません。

真似して欲しくないところとしては、terminateにチルダを含むメッセージを渡すことが考えられてないことですが、スクリプト内で使うだけなのでわざわざエスケープ処理はしていません。

ソースコードは以下に貼り付けておきます。ライセンスはMITです。どうぞご利用ください。

*1:このマクロが必要な理由は、Common Lispのリード時エラーを防ぐためです。たとえばDrakmaがロードされていない環境で、シンボル drakma:http-request を含む式をリードしようとすると、Common Lispのリーダがパッケージを探しにいってエラーを吐きます。