:QuickRun を codepad で実行する

この記事は Vim Advent Calendar 2012 353日目の記事になります。
Vim Advent Calendar 2013 の募集も開始しました。
興味のある方はぜひご参加下さい。


ブラウザからコードを実行する事ができる codepad というサービスがあります。
これを利用すればローカルに実行環境がなくてもブラウザからコードを実行する事ができます。
また mattn さんの作成された codepad-vim を使用すれば Vim から codepad を利用する事ができます。

" バッファのコードを codepad で実行し、結果を表示する
CodePadRun


で、これを利用して、 quickrun.vim から codepad で実行するようなモジュールを書いてみました。

[ソース]

" codepad で実行する quickrun-runner を定義
let s:runner = {}
let s:runner.name = "codepad"
let s:runner.kind = "runner"

function! s:runner.run(commands, input, session)
    let def_region = { 'first': [1, 1, 0], 'last': [line("$"), 1, 0] }
    let line1 = get(a:session.config, "region", def_region).first[0]
    let line2 = get(a:session.config, "region", def_region).last[0]
    redir => result
        call CodePadRun(line1, line2)
    redir END

    let error = 0
    let error_pattern = '<a href="#line-\(\d\+\)">Line \1</a>'
    if result =~ error_pattern
        let error = 1
        let filename = substitute(a:session.config.srcfile, '\\', '/', "g")
        let result = substitute(result, error_pattern, filename . ':\1', "g")
    endif

    call a:session.output(result)

    return error
endfunction

call quickrun#module#register(s:runner, 1)
silent! unlet s:runner

" runner に codepad を設定
" コマンドがないと quickrun.vim 側でエラーになるので
" ダミーを設定しておく
let g:quickrun_config = {
\   "_" : {
\       "runner" : "codepad",
\       "command" : "dummy",
\   }
\}


これで各実行環境がなくても codepad 経由でコードを :QuickRun する事ができます。
(本当は非同期で実行したかったんだけどコードがちょっと複雑になりそうなのでやめた