rubyのS-Lang拡張モジュール ver 0.22 25-AUG-1999 菊谷 誠 John E. Davis氏の画面制御ライブラリ「S-Lang」のための拡張モジュールです。 「S-Lang」を使ったアプリとしては、エディタのjed、ニュースリーダのslrn などが有名です。これらについては http://home.sprintmail.com/~kikutani/slang.html を見てください。 S-Langライブラリのうち、主としてSLsmgと呼ばれるハイレベル・インターフェース を実装することを目論んでいます。なぜなら、jedやslrnでは、画面制御が もっぱらSLsmgの関数で行なわれているからです。 スタック言語風インタプリタのS-Langを呼ぶように書けないこともないですが、 rubyですべてできるので、あまり意味がないと思ってやってません。 現在のところ、次に挙げるSLsmg関数をサポートしています。 slsmg_set_char_set slsmg_suspend_smg slsmg_resume_smg slsmg_erase_eos slsmg_char_at slsmg_draw_object slsmg_set_screen_start slsmg_write_color_chars slsmg_read_raw slsmg_write_raw slsmg_set_color_in_region slsmg_normal_video slsmg_reverse_video slsmg_gotorc slsmg_printf slsmg_erase_eol slsmg_erase_eol2 slsmg_refresh slsmg_write_string slsmg_write_wrapped_string slsmg_set_color slsmg_forward slsmg_write_nchars slsmg_write_char slsmg_cls slsmg_draw_hline slsmg_draw_vline slsmg_draw_box slsmg_touch_lines slsmg_get_column slsmg_tab_width slsmg_reset_smg slsmg_init_smg slsmg_fill_region slsmg_get_row また一部ですが、SLtt, SLsig, と SLkp関数のいくつかをサポートしています。 sltt_screen_rows sltt_screen_cols sltt_get_screen_size sltt_set_color sltt_beep sltt_get_terminfo sltt_set_mouse_mode sltty_set_suspend_state slsig_block_signals slsig_unblock_signals slkp_getkey slkp_define_keysym slkp_init さらに、slang.rb では「Pager」というクラスを定義しました。 この使用例はサンプルのpager.rbにありますが、これを利用すれば kconvやbase64モジュールのそろっているrubyなので、メイラやニュースリーダを 作るのも容易です。実際、私は「cur」というメイラを書いています (http://home.sprintmail.com/~kikutani/cur.html)。 作り方: 1) まずS-Langのシェアドライブラリを作ります。上記URLのjedのページから slang1.3.?_j??.tar.gz を持ってきて展開し、 ./configure make elf rootになって make install-elf make install-links でライブラリがインストールされます。 シェアドライブラリが使えない環境では、make; make installで スタティックライブラリを作って行けると思います。 日本語を使わなければ、オリジナルの slang1.3.? でも良いのですが、 たとえば、pager.rb で使える水平スクロール機能は、この日本語 パッチをあてておかないと、日本語ファイルを見たとき、境界で化けます。 2) あとは普通にrubyをconfigureしてmakeします。 最近の版はruby-1.4系でしかテストしてません。 サンプル: pager.rb これはS-Langのソースのデモに入っているpager.cのruby版です。cursesの サンプルのview.cと同様のものですが、SLsmgの使い方の典型です。 Pager というクラスを使って書き直してみました。 smgtest.rb これもS-Langのソースのデモに入っているsmgtest.cのruby版です。 オリジナルに加えて、マウスのテストも入れました。 fm.rb Tree_Pagerクラスのデモ。ディレクトリの階層構造をツリー表示 するものです。ディレクトリ(頭に◇が付いてる)に行ってEnter押すか マウスでクリックすると、その下一階層が表示されます。 urlview.rb 唯一実用的なサンプルかも。標準入力からWebのURLと思われるものを 抽出してリストとして表示します。カーソル持ってってEnterするか マウスでクリックすると、指定したブラウザで開きます。 たとえばmuttから使い場合、.muttrcで macro pager \cb "|~/bin/urlview.rb\ -b\ lynx\ -m\n" などと定義しておき、CTL-Bで起動できます。 モジラのときは netscape -remote "openURL($@)" とかやりたいんだけど、どうやるんだろう? ドキュメント: 本拡張モジュールのマニュアルはまだありません(_o_)。サンプルの rubyソースや slmodule.c をながめてください。 S-Langの画面制御ライブラリの使い方に関してはS-Langのソースの doc/cslang.tex を参照してください(同じディレクトリの texconv で テキストへの変換が可能)。これの日本語版は http://master.debian.or.jp/~kikutani/jed.html からたどれると思います。 ただし、これは0.99のころのドキュメントなので少々古いです。 最新は ftp://space.mit.edu/pub/davis/slang から取ってこれます。 BUGレポート & 要望: まだ試作レベルです。作者が必要としている機能もずいぶん欠けているので、 今後増強していく予定です。バグレポートや要望がございましたら、 作者にメールするか、ruby-listにどうぞ。 著作権: GPL2(GNU GENERAL PUBLIC LICENSE Version 2)に従います。 免責: このモジュールによってあなたのコンピュータ等にいかなる被害が出ようと、 作者たる菊谷は一切の責任を負いません。 謝辞: rubyの生みの親、まつもとさんはじめ、ruby-list、ruby-extの皆様には いつもお世話になっております。