Vim上でRubyを動かしたい。
Vim上でirbみたいな事が出来たら素敵かなぁと思って、こんなスクリプト作ってみた。
概要
インストール
~/.vim/after/ftplugin/ruby.vim辺りに保存しておいて、再起動。
nmap <buffer> <C-CR> :call <SID>Eval(function("<SID>YankNormal"))<CR> vmap <buffer> <C-CR> :call <SID>EvalVisual()<CR> execute 'ruby vim_bind = binding' function! s:Eval(Yank) let s:saved_reg = @" call a:Yank() execute 'ruby begin; p eval(%q(' . @" . '), __vim_bind); rescue ScriptError, StandardError => e; puts e.message;end' let @" = s:saved_reg endfunc function! s:EvalVisual() range call <SID>Eval(function("<SID>YankVisual")) endfunc function! s:YankVisual() silent normal `<v`>y endfunc function! s:YankNormal() silent normal yy endfunc
使ってみる。
test.rbでも作って、
< ここにカーソル a = 1 b = 2 a + b
V}して選択。
a = 1 b = 2 a + b < ここにカーソル
ctrl + enterで実行〜。
3
最後の評価が表示されます。
もちろんクラスもOK。
vここにカーソル class Hoge def self.hello puts "hello" end end
matchit.vimがあればV%で選択。
ctrl + enterで実行。
1行なら選択いらず
Hoge.hello
^カーソル
すかさず、ctrl + enter。
hello nil
便利杉。もうirbなんて要らない。
matchit.vimの活用。
matchit.vimを活用するなら、こんな感じ。
nmap <buffer> <C-CR> :call <SID>Eval(function("<SID>YankMatchhit"))<CR> function! s:YankMatchhit() let line = line('.') let col = col('.') if expand("<cword>") =~ '\<\%(do\|end\|class\|module\|def\|while\|for\)\>' || getline(".")[col(".") - 1] =~ '{\|}\|(\|)' silent normal V%y elseif expand("<cword>") =~ '\<\%(if\|case\)\>' silent normal Vg%y else call <SID>YankNormal() endif call cursor(line, col) endfunc
選択要らずで超快適モード。キーワードはお好みで。
あ、本格的に使うなら、ruby-matchit - 'Matchit' for Ruby. : vim onlineを使った方がいいかも。しかし、matchitの精度があんまり良くないので思わぬトラブルに巻き込まれることもある。注意。
追記
2007-10-07
- YankMatchhit更新
- module追加。
- ()もマッチ対象に加えてみた。
ちょっとここだけ試したいって時に、()入れといて、
( # <- ここで「Ctrl + Enter」 puts "hello" puts "irbみたいな + matchit.vim + matchit拡張!!" )
出力。
hello irbみたいな + matchit.vim + matchit拡張!! nil
死ねる。
2007-09-01
- 説明文を追加。
- YankMatchhit更新
- if文使えるようにした。
- カーソル位置の保存を追加した。
2007-08-31
- bindingを追加。
- inoremapを削除した。
- 使わないよね。たぶん。
2007-08-30
- スクリプトのエラー処理を追加。
- eval復活。
undefined local variable or method `hoge' for main:Object
2007-08-29
- funcrefを使って高階関数に書き直した。if文が消えたし、新しい関数を加えやすくなったと思う。
- 参考: h eval.txt
- 新機能満載なので色々試していきたいと思います。
- 参考: h eval.txt
- todo: エラー処理の追加。これはムズいかも。