Vim上でRubyを動かしたい。

Vim上でirbみたいな事が出来たら素敵かなぁと思って、こんなスクリプト作ってみた。

概要

Vim上でのRuby開発を加速させます(たぶん)

  • 組込みRubyを使ってVim上でirbみたいな事ができます。
  • ノーマルモードで「ctrl + enter」すると、カーソル下の行実行
  • ビジュアルモードで「ctrl + enter」すると、選択範囲の実行
  • matchit.vimがあるとブロック実行出来て更に幸せです。

インストール

~/.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

undefined local variable or method `hoge' for main:Object

2007-08-29

  • funcrefを使って高階関数に書き直した。if文が消えたし、新しい関数を加えやすくなったと思う。
    • 参考: h eval.txt
      • 新機能満載なので色々試していきたいと思います。
  • todo: エラー処理の追加。これはムズいかも。

2007-08-28

  • evalを使ってたけど、()に変更した。ちょっと高速になったかな。
    • rubyでは、p( (class ~ end) )なんて事をしても全然平気。
    • 参考: 第10章 パーサ - 青木さんもびっくり。
  • matchit.vimを活用を強化。getline(".")[col(".")-1]をもっと短く書きたいんだけど。
  • todo:関数型っぽく書き直したい。