Vim上でGaucheのREPLを動かす

※2012/5/4 追記 neocomplcache用のキーワードパターン記述を追加


タイトル通り、画像の通りのものを作りました。
Vim上からgoshREPLを扱うためのVimscriptです。
ソースコードGithubにあります。こちら


インストール方法は標準の方法と変わりないので割愛。
ただ、動かすためにはvimprocとGauche本体が必要なのでそちらも一緒にインストールしてください。


操作方法は基本的には標準のgoshと同じです。
ただ、Vim上で扱うということで様々な恩恵を受けることができます。

  • RedoとUndoが使える
  • シンタックスハイライト、オートインデントが可能
  • neocomplcache等による補完機能が使える
  • (readline風に)入力履歴をさかのぼることができる
  • 以前に入力したテキストを範囲選択して(テキストを少し修正して)再び実行することができる


※追記
neocomplcacheが入っている方は、vimrcに以下のようなパターンを書いておくとgoshREPL内でシンタックス補完などがきくようになると思います。

let g:neocomplcache_keyword_patterns['gosh-repl'] = "[[:alpha:]+*/@$_=.!?-][[:alnum:]+*/@$_:=.!?-]*"


最後の一つは追加の説明が必要だと思うので少し解説します。
goshREPLバッファに表示されている文字列は全て単なるテキストなので、カーソルを動かして以前に入力した行に戻ることができます。

で、式を修正してその行で再びエンターを押すと、修正された内容で評価できます。


さらに、範囲選択してからエンターを押すと、選択した範囲の内容をもう一度実行することができます。
選択モードはノーマル選択・行選択・矩形選択が可能なので、式全体の中で一部分だけを実行ということも可能です。

この範囲選択して実行という動作は基本的にはgoshREPLのバッファ内のみで有効になっていますが、
ほかのバッファでも同じことができれば便利なときがあります。
プログラムを書いているときに一部分だけを実行させて動作を確かめたいということってありますよね?
そんな時は

vmap <CR> <Plug>(gosh_repl_send_block)

というようなキーマップをvimrcに書けば実現できます。


それでは最後に、このプラグインで定義されているコマンドやバッファ内で使えるキーマップを紹介します。
コマンド

コマンド名 説明
GoshREPL gosh REPLを起動する
GoshREPLWithBuffer 現在バッファのテキストを全て評価済みの状態でgosh REPLを起動する
GoshREPLClear gosh REPLの内容をすべてクリアする
GoshREPLSend hoge 引数のhogeGaucheの式としてgosh REPL内で評価する
まだgosh REPLが起動していない場合は自動的に新しいREPLが起動する
GoshREPLLines GoshREPL内で実行したすべての式をリスト表示する


goshREPLバッファ内で有効なキーマップ

モード キー 説明
Visual <CR> 選択されているテキストを実行
Normal, Insert <C-p> 入力履歴を以前にさかのぼる
Normal, Insert <C-n> 入力履歴を次に進む


割り当て可能なキーマップ

キーマップ名 説明
<Plug>(gosh_repl_send_block) vmapで任意のキーに割り当てることで、選択した範囲のテキストをGoshREPLSendコマンドと同じように実行することができる


変更可能な変数

変数名 デフォルト値 説明
g:gosh_enable_ring_history 1 0にすることで、入力履歴の始端と終端をつなげないようにする
g:gosh_enable_auto_use 0 1にすることで、REPL内で自動use機能が働くようになる

詳しい機能説明はコチラ
g:gosh_updatetime 1000 REPL内で出力確認を行う時間間隔(ミリ秒単位)
g:gosh_buffer_direction 'h' 'h'の場合はREPLバッファが水平に分割されて開く

'v'を指定すれば垂直に分割されて開く
g:gosh_buffer_width 30 REPLバッファを垂直方向に開いた時の横幅
g:gosh_buffer_height 15 REPLバッファを水平方向に開いた時の縦幅


基本的な機能は以上です。
このVimscriptはただ自分がほしかったという動機で作ったので、
カスタマイズ性が低かったり、足りない機能があると思います。
使ってみて何か思うようなことがあればぜひフィードバックしてください。
できるだけ対応したいと思います。