LAMP ならぬ LIMP

FreeBSD 9 の環境を整備してた。まあ、よく使うパッケージを入れるだけだけど。いつもなら sysinstallを起動して必要なカテゴリーから選んでいくんだけど、これが結構面倒なんだよなー。

幾らカテゴリー分けしてあるって言っても、2万を超える物を数十に分けたって、一つのカテゴリーが 1000を超えちゃったりする。そこからピンポイントで選べってのは楽しい作業ではあるけど、苦行 なんだよな。

そんな訳で、今回は全パッケージのカタログを取り寄せておいて、そこからgrepで候補を絞る 事にした。Webから元データ(のhtml)を落としてきた。そこから発注品名だけを抜き出して あげる事にした。(こういう作業はスクライビングって言うのかな)

加工は久しぶりにrubyに任せました。すっかり錆びついていて、何回か指導を受けちゃいましたよ。 嗚呼、情けない。

f = open("all.html")
while l = f.readline
        if l =~ /(ftp:\/\/ftp3.jp.*tbz)"><img/
                puts $1
        end
end
[sakae@secd ~]$ grep vim CATALOG
ftp://ftp3.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.0-RELEASE/packages/All/ja-jvim-3.0.j2.1a_4.tbz
ftp://ftp3.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.0-RELEASE/packages/All/vim-7.3.121.tbz
ftp://ftp3.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.0-RELEASE/packages/All/vim-lite-7.3.121.tbz
ftp://ftp3.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.0-RELEASE/packages/All/vimpager-1.6.3.tbz
ftp://ftp3.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.0-RELEASE/packages/All/xpi-vimperator-3.3.tbz
[sakae@secd ~]$ sudo pkg_add ftp://ftp3.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.0-RELEASE/packages/All/vim-7.3.121.tbz

カタログから品物を選んで発注。(細かい商品説明はportsの中を覗けば置いてある)関連商品があると一緒に送られてくる。(vimの場合は、perl、 python、ruby、lua、tclが付いてきました)

後は、emacs、R、gnuplot、sbclとか、大きな枠で選ぶだけでいいので、楽だ。但し、gnuplotだけは pdflibが在庫切れとか言われて送ってこなかったんで、自前でソースから組み立てた。

Limp

今までずっとSlimv(とその周辺)を探ってきたんだけど、そろそろ飽きてきたので違う事を やってみる。vimと言う囲いの中だけど、探せばニッチなものが沢山あるからね。

去年目星を付けておいた、Limp: Lisp IDE がそれだ。LampならぬLimpってのがニッチそうでわくわくするぞ。 こやつ、Unix系でSBCL限定ってのもニッチさ加減を*よく*表しているな。

ああ、Lampの方は昔散々やりましたよ。Linux,Apache,MySQL,Perlが正統らしいけど、おいらは Linuxの代わりにFreeBSDを。Perlの代わりにRubyをって組み合わせだったけどね。 これらの組み合わせって、ソースが公開されてて改変自由ってのが受けたんだね。

で、早速Limpなんだけど、必要な物はvimとSBCL、SCREEN、rlwrapが必需品になるかな。後は お好みでHyperspecとHyperspecを加工する時に使うパール。

金取るOSであるWindowsにはSCREENが無いから動かんぞ。MACはどうなんかな? よう知らんわ。

インストール用のスクリプトが用意されているけど、今回はArchLinuxでやるので、マニュアル インストールした。

エラーだよ

doc内にある説明書に則り動かそうとしたんだけど、vimのステータスラインにエラーが出て 動かない。エラーがすぐに消えてしまって内容を把握出来ないんだ。困ったわい。 何とかエラーをじっと眺めたいぞ。エラーの表示時間を可変に出来ないものだろうか?

いろいろ調べてみたけど、どうもそんな好都合なセットは出来ないみたいだ。でも面白そうな 機能を見つけたよ。

'verbose' 'vbs'		数値	(既定では 0)
			グローバル
			{Vi にはないが、Viのヴァージョンによっては切替型のオプ
			ション verbose がある}
	値が 0 より大きいとき、Vimは実行中の動作に関するメッセージを表示する。
	現在のところ、以下のメッセージが表示される。
	1以上	ファイル viminfo が読み書きされたとき
	2以上	コマンド ":source" でファイルを読み込んだとき
	5以上	検索されたタグファイルとインクルードファイル全て
	8以上	autocommand のグループが実行されたファイル
	9以上	実行された autocommand 全て
	12以上	実行された関数全て
	13以上	例外が発生/捕捉/終了/破棄されたとき
	14以上	":finally"節において保留されている全て
	15以上	実行された Ex コマンド全て (200 文字から後は切り捨て)

	このオプションは、引数 "-V" でも設定できる。|-V| を参照。
	このオプションは、コマンド |:verbose| でも設定できる。

	'verbosefile'が設定されている場合、verboseのメッセージは表示されない。

'verbosefile' 'vfile'	文字列	(既定では "")
			グローバル
			{Vi にはない}
	このオプションが空でないとき、全てのメッセージはこの名前のファイルに書
	き出される。ファイルが既に存在するときは、そこに追加される。
	ファイルへの書き出しはVimが終了したときか、または'verbosefile'が空に設
	定されたとき終了する。書き込みはバッファされるので出力が欠けることがあ
	る。
	'verbosefile'を新しい値に設定すると、最初に空に設定したのと同じことに
	なる。|:redir|との違いは、'verbosefile'が設定されているとき冗長なメッ
	セージは画面に表示されないことである。

これを設定すれば、ひょっとしてエラーも含めて表示してくれないかな。ログに落として おけば、後でゆっくり見れそう。早速やってみんべ。えっと仕掛ける所は、limp.vim あたりでいいかな。

set vbs=30
set vfile="~/zVim.log"

でも、表示がvim画面に出てきて大変な事になっちゃったよ。何とか誤魔化して、commandを 叩けるようにして

set vfile?

したら

  verbosefile=
        Last set from ~/.vim/ftplugin/lisp/limp.vim

ファイル名がクリアされてた。何で何で??? 冷静になってよくよく考えてみたら、ファイル名を 囲ってるダブルクォートって、コメントの始まりじゃん。って事は、ファイル名を設定してる 積もりが、ファイル名をクリアしてる事になりませんかね。

これはもう、ダブルクォートの代替シングルクォートかなと思ってやってみると、しっかりエラー。 よくよくドキュメントを調べたら、文字列はそのまま書けだとさ。それに変数名とイコールとファイル名の 間に空白は駄目よとか変な決まりがある事が分かった。全く困ったちゃんであります。

vimの前身viの頃はvi用のスクリプトなんて概念が無い時代だったのね。だから、set系のパースは もうなるべく簡単にって方針だったんだろうな。所がvimの時代になって、スクリプトが導入された もんだから、数値とか文字列をちゃんと区別する必要が出てきた。そこで、letなんていう前置詞を 付けた時だけ、ちゃんとパースするよとなったんだな。

それにしても、ダブルクォートをコメントの開始記号するなんて素敵なセンスを持ってるなあ。 感心しますよ!! おいら的には、ハスクルのやつが好きだな。センスいいと思うよ。あれはSQL でも採用してるんだっけ? --- こういう記号ね。

後付けでどんどん訳わかめ道を邁進するPerlみたいに、vimは進化してくんでしょうな。

ともかくログが取れた。8000行を肥えるログになりましたよ。どんなログが出るかと言うと

line 58:
finished sourcing /home/sakae/.vim/ftplugin/lisp/limp.vim
continuing in function <SNR>8_LoadFTPlugin
Searching for "/usr/share/vim/vimfiles/ftplugin/lisp.vim"
Searching for "/usr/share/vim/vimfiles/ftplugin/lisp_*.vim"
Searching for "/usr/share/vim/vimfiles/ftplugin/lisp/*.vim"
Searching for "/usr/share/vim/vim73/ftplugin/lisp.vim"
chdir(/usr/share/vim/vim73/ftplugin)
fchdir() to previous dir
line 17: sourcing "/usr/share/vim/vim73/ftplugin/lisp.vim"
line 1: " Vim filetype plugin
line 2: " Language:      Lisp
line 3: " Maintainer:    Sergey Khorev <sergey.khorev@gmail.com>
  : 

こんな具合に、動きが手に取るように分かりました。おかげで、おいらの間抜け具合(設定不備) によるエラーがたちどころに判明しました。

後でよくよく調べたら、mes って、コマンドで、エラーの履歴を20個まで確認出来る事を 知った。とんでもない無駄をしちゃったな。まてまて、色々調べたおかげで後で役立ちそうな 経験を積めたじゃない。きっと、『災い転じて福となる』って事を実感出来る場面があるだろう。

やっぱり、エラーは友達だね。

Limpを動かす

ここまで、Limpが何たるかはちっとも書いてこなかったけど、簡単に言ってしまうとSBCL用に 特化したquickrunです。Hyperspecを引けたり、関数の補間をしてくれたりします。 (最近は、quickrun.elなんてのが あるので、emacs上で脱slime可能。)

ああ、前に入れたquickrunを使ってたらある時、画面が左右に割れてしまったよ。何でかなと 思ってマニュアルを調べてみたら、

  {split}
        デフォルト: '{winwidth(0) * 2 < winheight(0) * 5 ? "" : "vertical"}'
        出力専用バッファを開く際の補助コマンドを指定します。バッファを開く際に
        :split コマンドの前に挿入されます。

画面の縦横比でもって、上下に割るか左右に割るか自動判断してるのね。面白いな。

話を戻してLimpだけど、hoge.lispなんてファイルをvimで読み込んであげる。defunの所が 折りたたまれていたよ。これで長い関数も安心ってか。折りたみに関する資料は、:h fold すれば いいのね。

おもむろに、F12(ファンクションキー)を叩くと、sbclをbootするか、名前はどうするとか 聞いてくるんで答えてあげる。そうすると、突然画面は変わって、sbclのreplが出てくる。 元のvim画面に戻るには、F12キーを押せとな。

後は関数を定義してる所にカーソルを合せて、\ec すれば、sbclへ式が送られて評価される。 ちょいと実行画面をば。。

Welcome to Limp. May your journey be pleasant.

(defun fact (n)
(if (zerop n)
1
(* n (fact (- n 1)))))

FACT
* (fact 10)

3628800
*



Limp: F12 to hide.       /usr/lib/sbcl/sbcl.core (SBCL 1.0.54)       mine (2203)

最下行は、ステータスラインです。あああ、やっと動いたよ。後はマニュアルと首っぴき すればいいんだな。

それはそうと、どうやってvimとsbclがコラボしてるのかな。そんなのvimのスクリプトを嫁。 ごもっとも、それがOSSの醍醐味なんですから。。。