シェル経由で Vim 上のスクリプトを実行する

tips : vim online 経由地:VimでRubyスクリプトの実行と結果のプレビュー表示 - ナレッジエース

  • 素敵なところ
    • シェルで Ruby を呼び出すのと実行結果が同じ*1
    • プレビュウウィンドウに結果を書き込んでくれるので、実行結果を眺めながらコードをいじれる。
  • 残念なところ
    • テンポラリファイルをもりもり作って、バッファ番号ももりもり増えていく。
    • 裏バッファがテンポラリファイルに置き換わり、したとき悲しい気持ちになる。

というわけで、テンポラリファイルを特定の1ファイルに固定して、そのファイルが裏バッファになるべく現れないようにした。

"編集中の .rb ファイルを実行。
"http://www.vim.org/tips/tip.php?tip_id=1244
function! s:Ruby_eval_split() range
	" プレビューウィンドウの高さ調整。不要なら後処理ともども削除。
	let save_pwh = &previewheight
	let &previewheight = 8

	"以下自分の環境に合わせて。
	let src = 'ここに任意のファイルのフルパスを書く。'
	let dst = "RubyOutput"

	let backBuffer = ""
	if bufexists(0)
		let backBuffer = bufname("#")
	endif

	" 裏バッファが無いときにこのスクリプトを実行すると、裏バッファが src にな
	" る。その状態で n_ctrl-^ すると、src が buffer list に現れてしまう
	" (unlisted-buffer ではなくなってしまう)。以下の処理で src を buffer list
	" から消している。
	if buflisted(src)
		let bufNum = bufnr(src)
		execute ":bd " . bufNum
	endif
	" put current buffer's content in a temp file
	silent execute ":" . a:firstline . "," . a:lastline . "w! " . src

	"↑の処理をした時点で src が裏バッファの内容となる。
	let tempFileName = bufname("#")

	" open the preview window
	silent execute ":pedit! " . dst

	" change to preview window
	wincmd P

	" set options
	setlocal buftype=nofile
	setlocal noswapfile
	setlocal nobuflisted
	setlocal syntax=none
	setlocal bufhidden=delete

	" replace current buffer with ruby's output
	silent execute ":%! ruby " . '"' . src . '"' . " 2>&1 "

	" change back to the source buffer
	wincmd p

	" 後処理

	" preview window の高さの値を以前のものに戻す。
	let &previewheight = save_pwh

	" 裏バッファを元々持っていたものに戻す。
	" 裏バッファを持っていなかった(または無名のバッファだった)時、裏バッファが
	" テンポラリファイルだった場合は何もしない。
	if (tempFileName != backBuffer) && strlen(backBuffer)
		let currentBuffer = bufname("%")
		execute ":b " . backBuffer
		execute ":b " . currentBuffer
	endif
endfunction

vmap <buffer><silent> <F7> :call <SID>Ruby_eval_split()<cr>
nmap <buffer><silent> <F7> mzggVG<F7>`z
imap <buffer><silent> <F7> <ESC><F7>a
map  <buffer><silent> <S-F7> :pc<CR>

使い方

$home\vimfiles\ftplugin\ruby.vim(Windows の場合)に上記コードを追加。
7行目にある

let src = 'ここに任意のファイルのフルパスを書く。'

シングルクウォートの中身を、テンポラリファイルにしたいファイルの名前(フルパス)に書き換える。(うちでは$home\vimfiles\ruby_tmp_file として、 $home を展開した形で書いている。)
操作の詳細はキーマップを眺めれば分かるかと。

*1:シェルで実行してるし。