Gauche on Vim

GaucheVimから使うときのためにeval用スクリプト書いてた。EmacsのcmuschemeでC-c C-eしたときと大体同じ挙動を示す物体。
VimShellのInteractive Shellを使っています。それにしてもVimShellすごい・・・。

本体

http://gist.github.com/570570
~/.vim/ftplugin/scheme.vimとして保存すればOK。:Interactiveでgoshを起動しておいた状態でS式にカーソルを合わせてeすると、カーソルのあっていたS式が実行されます。当然ながらGaucheで無くても使えると思います。

原理

searchpairposでS式の範囲を区切って、VimShellSendStringで流し込む。以上。・・・というところまでかなり試行錯誤がありました。
ハマったのはVimのvisual-modeの仕様。VimShellSendStringは選択範囲をInteractive Shellに送るコマンドなので、最初は

function! s:eval_S_expression()
  normal! v%
  VimShellSendString
endfunction

nmap <silent> <Space>e :call <SID>eval_S_expression()<CR>

とかやったんだけど、これだと何故か最後の行しかVimShellに送られない。最初はVimShellがバグってるのかと思ったけど、色々試してたらどうもVimの仕様で、nmapの中ではnormal-modeで見えるようにしかコマンドが働かないっぽいことが判明。
コマンドを呼ばずに抜ければvisual-modeになって帰ってくるんだけど、コマンドを呼ぶとnormal-modeの文脈で呼び出されてしまい、最終的にカーソルのいる行だけが対象になってしまうみたい。
そこで、コマンド先頭にrangeを付ける記法を使うことにして、

execute printf("%d,%dVimShellSendString", startline, endline)

となりました。execute使うのがなんだかなあという感じ。