こんにちわ
ゴリラです
普段ブラウザでTwitterをしていますが、最近Vimとブラウザを切り替えるのが面倒だなと感じています。
そこで、Vimで作業しながらツイートをニコ動のコメント風に流したら便利なのでは?と思ったのでしました。
検証結果
画面が埋もれて仕事できそうにないことがわかりました。
残念…
検証で使用するもの
- twty
- Vim v8.1.1364 ~
検証方法
全体の流れは大まか次になります。
twty
で定期的にtimelineのJSONを取得- JSONからツイートテキストを抽出
- ウィンドウを生成して、右から左に移動させる
twty
で定期的にtimelineのJSONを取得
twty
にはtimelineを指定した間隔でpollingする機能があります。
次のコマンドを実行すると20s間隔でtimelineのjsonが返ってきます。
twty -S 20s -json
Vimには外部コマンドを非同期で実行するjob_start
関数があるので、
これを使ってコマンドを呼び出すことで、ツイートのJSONを得られます。
call job_start(["twty","-S","20s","-json"], #{ \ out_cb:function('s:tweet'), \ err_cb:function('s:onerr') \})
JSONからツイートテキストを抽出
out_cb
で指定した関数にJSONが入ってくるので、それをdecodeしてツイートテキストを取り出します。timer_start
でランダム遅延させて、ウィンドウを生成するタイミングをずらしています。
function!s:tweet(ch, msg) abort
let obj = json_decode(a:msg)if obj.text is# ""returnendiflet wait = rand(srand()) % 12call timer_start(wait*800,function('s:comment',[obj]))endfunction
ウィンドウを生成して、右から左に移動させる
popup_create
でウィンドウを作成します。
その際、ウィンドウの上下の位置をランダムで配置するため、line
オプションに乱数を使っています。
function!s:comment(obj, timer) abort
let winid = popup_create(a:obj.text, #{ \col:&columns -40, \ line: rand(srand()) % &lines, \ minwidth: strlen(a:obj.text), \ maxwidth:40, \ tabpage:-1, \ zindex:300, \})call timer_start(100,function("s:move",[winid]), #{ \ repeat:-1, \})endfunction
ウィンドウを作成したら、またtimer_start
で動かしていきます。
一番左まで移動したらtimerを止めてウィンドウを消します。
function!s:move(winid, timer) abort
letopt= popup_getpos(a:winid)ifopt.colis# 1call timer_stop(a:timer)call popup_close(a:winid)returnendifletopt.col-=1call popup_move(a:winid,opt)redrawendfunction
検証コード
ここに上げておきましたので、試してみたい方はどうぞ。
skanehira/tweet-comment.vim