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の醍醐味なんですから。。。