2010/11/10


favstarを見にいくのにいちいちブラウザあげるのが面倒くさいので、なんとかならないかなと思ってた。
普段TwitVimを使ってるんだけど、同じようにvimから見れないかなーと思って勢いで書いた。
function! s:ShowFavStar(...)
  let user = a:0 > 0 ? a:1 : exists('g:favstar_user') ? g:favstar_user : ''
  if len(user) == 0
    echohl WarningMsg
    echo "Usage:"
    echo "  :FavStar [user]"
    echo "  you can set g:favstar_user to specify default user"
    echohl None
    return
  endif
  let yql = "select * from html where url = 'http://favstar.fm/users/".user."/recent' and xpath = '//div[@class=\"tweetContainer\"]'"
  let res = http#get("http://query.yahooapis.com/v1/public/yql", {'q': yql})
  let dom = xml#parse(res.content)
  for item in dom.childNode('results').childNodes('div')
    let tweet = item.find('div', {"class": "theTweet"})
    let text = substitute(tweet.childNode('p').value(), "\n", " ", "g")
    let text = substitute(text, "^ *", "", "")
    echohl Function
    echo text
    echohl None
    let actions = item.findAll('div', {"class": "avatarList"})
    for action in actions
      let line = ''
      if action.attr['id'] =~ "^faved_by_"
        let line .= "FAV:"
      elseif action.attr['id'] =~ "^rt_by_"
        let line .= "RT:"
      endif
      for a in action.findAll('img')
        let line .= " " . a.attr['alt']
      endfor
      echohl Statement
      echo line
      echohl None
    endfor
    echo "\n"
  endfor
endfunction

command! -nargs=? FavStar call <SID>ShowFavStar(<f-args>)
ソースはたったこれだけ。いちおうリポジトリのリンク
mattn's favstar-vim at master - GitHub

vimscript for favstar

http://github.com/mattn/favstar-vim
実行には webapi-vim が必要です。webapi-vim は更新が多いと思うので pathogen とかで使った方がよいです。
mattn's webapi-vim at master - GitHub

vim interface to Web API

http://github.com/mattn/webapi-vim
html(実際にはxml)をDOMでスクレイピングしてます。webapi-vimのxml.vimさまさまです。誰が書いたの?スゲーな。えっ俺ですか。俺スゲー?
で、YQLを使ってスクレイピングしているのはHTMLは正規化されていないのでYQLに正規化してもらっています。
実行は :FavStar otsune
とするかvimrcに let g:favstar_user = "otsune"
と書いておいて :FavStar
とする等して下さい。動かなかったとしても大丈夫だ。問題ない。

実行するとこんな画面になります。
favstar-vim
ご活用下さい。もうvimscriptなんでもアリな気がしてきた。
Posted at by



2010/10/31


古くからvimmerの人は知ってるかもしれませんが、昔excitetranslate.vimというスクリプトを書きました。 英語が書かれたバッファで :ExciteTranslate と実行すると分割ウィンドウに翻訳された文章が表示されるという物です。昨日githubにも入れておきました。
mattn's excitetranslate-vim at master - GitHub

Translate between English and Japanese using Excite

http://github.com/mattn/excitetranslate-vim
前は別のリポジトリに置いてあって、最初にリポジトリにcommitしたのが2006年でした。結構長く使っているスクリプトです。
これまでvimの環境を作る際には結構な頻度で入れてきたスクリプトですが、GoogleTranslateの方が場合によっては翻訳精度が高かったりするので、googletranslate.vimというのを書きました。

mattn's googletranslate-vim at master - GitHub

Translate between English and Japanese using Google

http://github.com/mattn/googletranslate-vim
使い方はexciteと同じく :GoogleTranslate で翻訳可能です。ちなみに文章が英語であれば日本語に、日本語であれば英語に翻訳されます。
Dan the Man with Too Many Home Appliances to Maintaitain

:GoogleTranslate
引用: http://blog.livedoor.jp/dankogai/archives/51541861.html
あまりにも多くの家電製品とダンマンはMaintaitainする
...

:ExciteTranslate Maintaitainへのあまりに多くの家電をもっているダン男性 えぇ......っと。。。。。(汗
Posted at by



2010/10/28


Vimの英単語の意味を考えると、「Vimでソープ」とかかなりイヤラシイですが、ぜんぜんちがうよ!
VimでSOAP通信を実現しました。
Gistの様なサービスでIdeoneというのがあるんですが、これまでPure VimscriptでGist、Codepadと制覇してきたので、よしIdeoneも...と思ってAPIドキュメントに目を通してみたら、なんとSOAP通信ではないですか!

でもくじけません!負けません!
頑張ってSOAP通信しました。
mattn's ideone-vim at master - GitHub

vimscript for ideone

http://github.com/mattn/ideone-vim/
:Ideone -r
でideone上で実行し :Ideone -p
でprivate投稿となります。Gistと同じ様に使えます。ソースコードのメイン部はこんな感じ。
前に作っていた「webapi-vim」というスクリプト群に含まれる「xml.vim」に少し手をいれましたが、かなり良い仕事をしてくれています。

ideone-vimについてはSOAPのXMLを自前で作ってますが、本来WSDLからインタフェースを作れるのがSOAPの魅力ですね。
なのでさらに戦ってみました!

soap.vimというのをwebapi-vimに追加しました。
これを使うと関数を定義しなくとも、以下の様にwsdlを読み込ませるだけでgetLanguagesという関数が呼び出せます。
let api = soap#proxy("http://ideone.com/api/1/service.wsdl")
let langs = api.getLanguages("username", "password")
for key in sort(keys(langs))
  echo key."=".langs[key]
endfor
ideoneのアカウントを取って実行すると(ideoneのパスワードはAPI専用のパスワードになります)
1=C++ (gcc-4.3.4)
10=Java (sun-jdk-1.6.0.17)
101=Visual Basic .NET (mono-2.4.2.3)
102=D (dmd) (dmd-2.042)
104=AWK (gawk) (gawk-3.1.6)
105=AWK (mawk) (mawk-1.3.3)
106=COBOL 85 (tinycobol-0.65.9)
107=Forth (gforth-0.7.0)
108=Prolog (gnu) (gprolog-1.3.1)
11=C (gcc-4.3.4)
110=bc (bc-1.06.95)
111=Clojure (clojure 1.1.0)
112=JavaScript (spidermonkey) (spidermonkey-1.7)
114=Go (gc-2010-07-14)
115=Unlambda (unlambda-2.0.0)
116=Python 3 (python-3.1.2)
117=R (R-2.11.1)
118=COBOL (open-cobol-1.0)
119=Oz (mozart-1.4.0)
12=Brainf**k (bff-1.0.3.1)
121=Groovy (groovy-1.7)
122=Nimrod (nimrod-0.8.8)
123=Factor (factor-0.93)
124=F# (fsharp-2.0.0)
125=Falcon (falcon-0.9.6.6)
13=Assembler (nasm-2.07)
14=CLIPS (clips 6.24)
15=Prolog (swi) (swipl 5.6.64)
16=Icon (iconc 9.4.3)
17=Ruby (ruby-1.9.2)
19=Pike (pike 7.6.86)
2=Pascal (gpc) (gpc 20070904)
21=Haskell (ghc-6.8.2)
22=Pascal (fpc) (fpc 2.2.0)
23=Smalltalk (gst 3.1)
25=Nice (nicec 0.9.6)
26=Lua (luac 5.1.4)
27=C# (mono-2.8)
28=Bash (bash 4.0.35)
29=PHP (php 5.2.11)
3=Perl (perl 5.12.1)
30=Nemerle (ncc 0.9.3)
32=Common Lisp (clisp) (clisp 2.47)
33=Scheme (guile) (guile 1.8.5)
34=C99 strict (gcc-4.3.4)
35=JavaScript (rhino) (rhino-1.6.5)
36=Erlang (erl-5.7.3)
38=Tcl (tclsh 8.5.7)
39=Scala (scala-2.8.0.final)
4=Python (python 2.6.4)
45=Assembler (gcc-4.3.4)
5=Fortran (gfortran-4.3.4)
54=Perl 6 (rakudo-2010.08)
6=Whitespace (wspace 0.3)
62=Text (text 6.10)
7=Ada (gnat-4.3.2)
8=Ocaml (ocamlopt 3.10.2)
9=Intercal (c-intercal 28.0-r1)
error=OK
languages=
おぉぉぉぉぉぉぉぉぉぉぉぉぉ...
いろいろ出来る気がしてきましたね!ただ今は戻り値は全てstringで扱ってたりするので実用的ではありません。この辺は今後、ideone意外のサービスで確認しながら改良していきます。

俺は一体何と戦っているんだ!
Posted at by