Windows上のvimshellでSMLインタプリタを動かす

Windows上のgvimで動いているvimshellから(主にSMLNJの)インタプリタを使いたいですが,
これはシェルスクリプトなので, 単にコマンド名を打つだけだとvimshellから実行出来ません.

vimshell> sml
!!!Error: File "sml" is not found. (以下略


cygwin用のrlwrap経由で呼び出せば, 勝手にコマンドを探して実行してくれるはずです. *1
ところがcygwinからインストール出来るrlwrapはバージョン0.24なので正常に動作しません.
本家から最新版(私が動かしたのは0.37)を取って来て自分でコンパイルしましょう.*2


ここまでで実行は出来ますが,
これだけだとインタプリタの出力がvimshell上に表示されないので以下のように(vimrcなどに)設定します.

function! s:set_rlwrap_to_no_echoback_cmd ()
	let g:vimshell_interactive_no_echoback_commands["rlwrap"] = 1
endfunction
autocmd FileType vimshell call s:set_rlwrap_to_no_echoback_cmd ()

vimshellが実行される時に g:vimshell_interactive_no_echoback_commands にrlwrapのエントリを追加します.
(なんか間違ってる感があるけど…)

vimshell> rlwrap sml

Standard ML of New Jersey v110.72 [built: Sun Oct 10 22:54:51 2010]
- print "Hello, SML!\n";
Hello, SML!
val it = () : unit
- 

やりました!


ちなみにcygwinからインストール出来る古いrlwrapを使うと

vimshell> rlwrap sml
stdin is not a tty

とかエラー出してrlwrapが落ちます. ハマッた.

他のインタプリタ

Curry (Muenster Curry 0.9.11) は
rlwrap fakecygpty cyi
で正常に動いてるようです.
fakecygptyを挟まないとプロンプトが出ませんでした.

まとめ

  • SMLインタプリタは rlwrap sml で実行できる
  • Curryインタプリタは rlwrap fakecygpty cyi で実行できる
  • cygwinのrlwrapは古い. 久々にバイナリパッケージなんて邪道だと思った

*1:普段のシェルからもそうやって呼び出してるから分かり易いというのもある

*2:最新のgcc(4.5.3)だとconfigureでエラー出たけど自前でビルドした4.5.2でコンパイル出来た