シェル経由で Vim 上のスクリプトを実行する
tips : vim online 経由地:VimでRubyスクリプトの実行と結果のプレビュー表示 - ナレッジエース
- 素敵なところ
- 残念なところ
- テンポラリファイルをもりもり作って、バッファ番号ももりもり増えていく。
- 裏バッファがテンポラリファイルに置き換わり、
したとき悲しい気持ちになる。
というわけで、テンポラリファイルを特定の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:シェルで実行してるし。