jump to navigation

Vim+xmpfilterでirbいらずのRuby試行錯誤開発

2008-06-20 17:37 Posted by
nase
in : プログラミング
jelly.jpg

先日「まるごと Ruby! Vol.1」を読んでいて、xmpfilterとうい試行錯誤ツールがあることを知りました。

xmpfilterは、Rubyソースコード中の任意の行末に「# =>」という計算マーク(コメント)を入れておくことで、そこにその行の式の値を埋め込んで表示してくれるフィルターコマンドです。(irbでは一行ずつ表示される結果が、直接コードの行末に表示できるイメージ)

インストールもgemで一発。すぐに使えるうえ、標準でVimとEmacsから使うためのスクリプトまで用意されているスグレモノ。

超絶便利だと思うのですが、そのわりにあまり情報をみかけないので、ここではVimから便利に使うための方法について簡単に紹介します。

xmpfilterがやってくれること

xmpfilterについてははてなダイアリーのxmpfilterキーワードページにヘルプからの引用があるので、まずはそちらをご覧ください。

xmpfilterをインストールすると「xmpfiter」コマンドが使えるようになり、このコマンドに「# =>」の計算マークを付けたソースファイルを渡すことで、計算結果の書き込まれたコードが標準出力に表示されます。

xmpfilter_cl_s.jpg
xmpfilterコマンドをコマンドラインで実行

まるごと Ruby! Vol.1の記事によれば、xmpfilterが出力する結果には以下のものが含まれます。

  • 「# =>」の行を複数回通った場合は、カンマ区切りで表示される
  • 警告があった場合「# !>」で表示される
  • エラーがあった場合「# ~>」で表示される
  • 最後に「# >>」で標準出力が表示される

xmpfilterによって追加される情報はすべてコメントの形になっており、この出力結果をそのままソースコードとして使えるのがポイント。再度xmpfilterにかけた際には結果部分が上書き更新されます。

xmpfilterにはこのほかテストスクリプトの記述支援機能もあったりするので、興味のある方は調べてみてください。

xmpfilterのインストール

インストールは以下のgemコマンドを実行するだけです。(rcodetoolsパッケージにxmpfilterが含まれています)

gem install rcodetools

「ruby\lib\ruby\gems\1.8\gems\rcodetools-0.7.0.0」以下にインストールされるので「README.ja」を確認してください。

Vimからxmpfilterを使う

xmpfilterコマンドを毎回コマンドラインから実行するのは面倒なので、直接エディタから使えるようにしましょう。

rcodetoolsがインストールされたディレクトリの「README.vim」に、Vimから便利に使うための説明が書かれています。(ただし英語orz)

以下、「README.vim」を元に私が追加した設定。(ファンクションキーを全て他で使っていたため、とりあえずShift+F1~F4に変更しただけ)

" <S-F1>で現在行/選択行にxmpfilterを実行
map <silent> <S-F1> !xmpfilter -a<cr>
nmap <silent> <S-F1> V<S-F1>
imap <silent> <S-F1> <ESC><S-F1>a

" <S-F2>でバッファ全体にxmpfilterを実行 
nmap <silent> <S-F2> mzggVG!xmpfilter -a<cr>'z
imap <silent> <S-F2> <ESC><S-F2>

" <S-F3>で現在行/選択行に「# =>」マークを追加
vmap <silent> <S-F3> !xmpfilter -m<cr>
nmap <silent> <S-F3> V<S-F3>
imap <silent> <S-F3> <ESC><S-F3>a

" <S-F4>で現在行/選択行の「# =>」マークを削除
vmap <silent> <S-F4> ms:call RemoveRubyEval()<CR>
nmap <silent> <S-F4> V<S-F4>
imap <silent> <S-F4> <ESC><S-F4>a

function! RemoveRubyEval() range
  let begv = a:firstline
  let endv = a:lastline
  normal Hmt
  set lz
  execute ":" . begv . "," . endv . 's/\s*# \(=>\|!!\).*$//e'
  normal 'tzt`s
  set nolz
  redraw
endfunction

ファンクションキー一発で選択行やバッファ全体に対してxmpfilterが実行でき、実行した部分はその場で出力結果と置き換えられます

xmpfilter_vim_s.jpg
xmpfilterをVim内で実行

Vimの「:!」(フィルタ)コマンドで実行されるだけなので、普通にアンドゥも効きます。「# =>」のマークも自分で書く必要はなく、選択行に対して付けたり外したりが可能。すばらしい。

参考書籍

まるごと Ruby! Vol.1 まるごと Ruby! Vol.1

今回はこの中でるびきちさんが書かれていた「試行錯誤ツール、テスト/デバッグツールを使いこなす」の記事を参考にさせていただきました。xmpfilterの他にもRSpecやautotestなどのテストツールの使い方が詳しく・分かりやすく解説されています。超オススメ。


Comments»

1. kana - 2008-6-20

map !xmpfilter -a
vnoremap !xmpfilter -a

nmap mzggVG!xmpfilter -a’z
nnoremap m’:%!xmpfilter -a'’

vmap ms:call RemoveRubyEval()
vnoremap m’:s/\s# (=>|!!).$//e'’
” 完璧に復元したいのであればwinsaveview()/winrestview()を使うべきですが。

2. nase - 2008-6-20

kanaさん、設定のブラッシュアップありがとうござます!
参考にさせてもらいます。

3. ’(rubikitch wanna be (a . lisper)) - 2008-6-21

[ruby]xmpfilterの紹介御礼…

Vim+xmpfilterでirbいらずのRuby試行錯誤開発 - ナレッジエース 秀丸でxmpfilterを使う - 書き捨て御免 xmpfilterの紹介どうもあ (more…)

4. nase - 2008-6-21

るびきちさん、トラックバックありがとうございます!
そちらの記事にコメントできなかったので、ここのレスで失礼。
まるごとRubyの記事は大変勉強になりました(^^

5. sk4 » Blog Archive » 今日のメモ - 2008-11-25

[…] ここをみてなんかおもしろそうだったxmpfilterをいれてみた。 […]


*Comments and trackbacks will appear after it is approved by the administrator.