rubyのS-Lang拡張モジュール
                       ver 0.22 25-AUG-1999 菊谷 誠 <kikutani@sprintmail.com>


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の皆様には
いつもお世話になっております。
