2009/05/22

vimでついったーを読む

※修正版がこちらにあります


 なんか意外とサクサク進み、予定通り改稿が100%まで行けました。まあ、単に一回すべての改稿指示に目を通したってだけで、このあとまた1から読み返してさらに改稿しなきゃならないんですが。

 で、改稿のときひたすらついったーにつぶやいていたので、一旦脳を休ませる意味合いも兼ね、vimでついったーのタイムラインを表示するスクリプトを組んでみました。さすがに今日は余計なダウンロードなどせず、最初からif_pythonで書こうと決めて書きましたよ。
 たいして深く考えずに書いたものなので、探せばどっかに絶対これより優秀なスクリプトがあるでしょうが、まあ、頭の体操ということで。


" vimでついったーを読む。要if_python & twitter.py
" vimはSJISで使っていると仮定

function! ReadTwitter()
    bel 10new twitter
python << EOF
import vim, twitter, simplejson, re
# TODO: ここに自分のユーザー名とパスワードを入れるべし
api = twitter.Api('nekosuna', '*****')
timeline = api.GetFriendsTimeline()
for t in timeline:
    vim.current.buffer.append('【%s】' % re.sub('\n', '', t.user.screen_name.encode('shift-jis')))
    vim.current.buffer.append(re.sub('\n', '', t.text.encode('shift-jis')))
    vim.current.buffer.append('')
EOF
    set nomod
endfunction


 :call ReadTwitter()<CR>でついったー表示。自分やフォローしてる人たちのつぶやきが、ウィンドウ下部についっと出てきます。
 ああ、pythonかわいいよpython。


◇5/23追記
 さらに改造してみた。
 twitter.pyをいじって警告が出ないようにし、vimrcにはユーザー名とパスワードのみを記述。pythonコードはNekoTwitter.vimというファイルにまとめてpluginフォルダにぶち込んだ。
 シンタックスやら何やらも追加。qでバッファを閉じたりなんだり。
 ほんとは@の上でエンターすると投稿開始、みたくしたいけどもう面倒になってきた。


"
" NekoTwitter.vim
" 2009/05/23 Nekosuna Ippei ( http://twitter.com/nekosuna )
"
" python26などでmd5の警告が出る場合は、twitter.pyの「import md5」を
" 「import hashlib」に書き換え、
" _GetPathの「hashed_key = md5.new(key).hexdigest()」を
" 「hashed_key = hashlib.md5(key).hexdigest()」に書き換えてください。
"
" また、twitter.pyのPostUpdateに「data['sourse'] = 'vim'」を付け加えると
" vimからの投稿を明示できます。
"
" vimはwindows/cp932で使っているものとします
"

" vimrcに下の二行を書く
" let g:nekotw_user_name = 'user_name'
" let g:nekotw_user_pass = 'pass'

if !exists('g:nekotw_user_name')
    echoerr "NekoTwitterError: Please set g:nekotw_user_name in vimrc."
    finish
endif
if !exists('g:nekotw_user_pass')
    echoerr "NekoTwitterError: Please set g:nekotw_user_pass in vimrc."
    finish
endif

" ウィンドウ作成
function! s:NekoTwitter()
    if bufexists('ReadTwitter')
        bdelete NekoTwitter
    endif
    bel 15new NekoTwitter
    call s:SetSyn()
    call s:ReadTwitter()
    set nomod
    set ro
    exe ":normal gg"
    " qで終了、iで投稿
    noremap <buffer> q :q<CR>
    noremap <buffer> i :call <SID>PostTwitter()<CR>
endfunction

" 読み込み
function! s:ReadTwitter()
python << EOF
import vim, twitter, simplejson, re
u = vim.eval("g:nekotw_user_name")
p = vim.eval("g:nekotw_user_pass")
api = twitter.Api(u, p)
timeline = api.GetFriendsTimeline()
for t in timeline:
    vim.current.buffer.append('@%s' % re.sub('\n', '', t.user.screen_name.encode('CP932')))
    vim.current.buffer.append(' %s' % re.sub('\n', '', t.text.encode('CP932')))
    vim.current.buffer.append(' [%s]' % t.relative_created_at.encode('CP932'))
    vim.current.buffer.append('')
EOF
endfunction

" 色
function! s:SetSyn()
    syntax match name /^@[a-zA-Z_]*/
    syntax match follow /@[a-zA-Z_]*/ contains=name
    syntax match igno /^C:\\.*/
    syntax match come /^ \[[^\]]*]/
    highlight link name Label
    highlight link follow Underlined
    highlight link igno Ignore
    highlight link come Comment
    " 単語の区切りに@を追加
    setlocal iskeyword=@-90,97-122,48-57,_
endfunction

" 投稿
function! s:PostTwitter()
    let post = input("twitter: ")
    if strlen(post) > 140
        echoerr 140
    else
python << EOF
import vim, twitter
post = vim.eval("post")
u = vim.eval("g:nekotw_user_name")
p = vim.eval("g:nekotw_user_pass")
api = twitter.Api(u, p)
api.PostUpdate(unicode(post, 'CP932'))
EOF
    endif
endfunction

" :NekoTwitter<CR> すると機能が呼び出されます
command NekoTwitter :call <SID>NekoTwitter()