Gauche on Vim
GaucheをVimから使うときのためにeval用スクリプト書いてた。EmacsのcmuschemeでC-c C-eしたときと大体同じ挙動を示す物体。
VimShellのInteractive Shellを使っています。それにしてもVimShellすごい・・・。
本体
http://gist.github.com/570570
~/.vim/ftplugin/scheme.vimとして保存すればOK。:Interactiveでgoshを起動しておいた状態でS式にカーソルを合わせて
原理
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使うのがなんだかなあという感じ。