vimでgoogle電卓API改

追記 2013/11/27

※非公式でgoogle電卓APIを公開していたiGoogleが2013年11月1日をもって閉鎖したため、当記事で紹介しているスクリプトは現在使用できません。
https://support.google.com/websearch/answer/2664197


vimで電卓的なことをしたい場合には、VimでGoogleの電卓機能を使うプラグインGCalc.vim書いた ←ここを参考にさせて頂いてずっと使っていたんですが、ある時からwebapi-vimの仕様変更があったり、それこそgoogle電卓API自体が仕様変更してたりで、いつの間にか使えなくなってました。

数ヶ月前から発生していたんですが、.vimrcの整理ついでにようやく重い腰を上げて対応してみました。
結構やっつけですが。

command! -bang -nargs=+ GCalc call GCalc(<q-args>, <bang>0)
function! GCalc(expr, banged)
    let url = 'http://www.google.co.jp/ig/calculator?q=' .  webapi#http#encodeURI(a:expr)
    let response = webapi#http#get(url).content
    let response = substitute(response, '\([a-z]\+\)\ze:', '"\1"', 'g') " 識別子をクォート
    let response = substitute(response, '\d\zs&#160;\ze\d', '', 'g') " 数値の桁数が多いと「10 000」のように空白が入るので除去
    let response = substitute(response, '\\', '\\\\', 'g') " エラー文言に\が入る場合がある
    let decoded_response = webapi#json#decode(response)
    if decoded_response.error != ''
        echohl ErrorMsg | echo 'ERROR:' decoded_response.error |  echohl None
        return
    endif
    if !a:banged " bangがなければクリップボード用レジスタに保存
        let @* = decoded_response.rhs
    endif
    echo decoded_response.lhs . ' = ' . decoded_response.rhs
endfunction

手こずった部分はAPIのレスポンスがXMLからJSONに変更されていたのですが、識別子がダブルクォーテーションで囲まれていない中途半端なJSONという(こんな感じ)。
これをそのままwebapi#json#decode()に投げても通りませんでした。
同関数内では最終的にeval()をしているようでlhsなんて変数ねーよ、みたいな。
なので無理矢理クォートしてます。

あと追加機能として結果をクリップボードレジスタに保存するようにしました。

上記は.vimrcに書けば動きますが、当然webapi-vimは必要です。
そこんとこよろしく。

追記 2012/09/15

桁の多い数を計算すると「10 000 * 10 000 = 100 000 000」とレスポンスが返るので対応を追加