basyura's blog

あしたになったらほんきだす。

TweetVim 1.0 をリリースします!!!

Vim Advent Calendar 2011 30 日目の @basyura です。
ujihisa.vim #2 で発表した TweetVim をリリースします。リリースといっても vim.org に登録したわけでも(ドキュメントの関係で・・・)、初めて公開するわけでもありません。一つの区切りとして広報します。

TweetVim とは?

https://github.com/basyura/TweetVim

pure Vim script で動作する twitter クライアントです。
vim 上で動作する twitter クライアントといえば TwitVim が既にありますが ruby、python、perl といった拡張機能を使用するため、特に Windows では環境構築に苦労します。TweetVim も正確には http リクエストを投げるための cURL が必要ですが、TwitVim に比べてはるかに簡単にインストール(exe を配置)できます。
TwitVim と名前が似ているのはわざとですが深い意味はありません。

動作に必要なもの

webapi-vim
http リクエスト、json、oauth に必要
open-browser.vim
ブラウザ起動に使用
twibill.vim
twitter api のラッパー
(unite.vim)
いろいろ便利ですよね
(unite-outline)
アウトライン表示に使用
(bitly.vim)
bitlyを利用したURL短縮に使用
cURL
http リクエストを投げるのに必要

カッコつきは必須ではありません。各 plugin を neobundle や pathogen を使用してランタイムパス上にインストールしてください。curl は実行パスが通っているディレクトリに配置してください。

twitter 認証

認証されていない場合は、コマンド実行時にブラウザが起動して PIN を表示します。

:TweetVimHomeTimeline

> now launched your browser to authenticate
> Enter Twitter OAuth PIN:

PIN を入力すると認証完了です。
認証時に発行された AccessToken と AccessTokenSecret は以下に保存されます。

~/.tweetvim/token

「~/.tweetvim」がファイルとして保存されている場合(初期の TweetVim を使っていた場合)は削除してから認証してください。

コマンド

ホームタイムラインを表示する。

:TweetVimHomeTimeline

Mention を表示する

:TweetVimMentions

リストを表示する

:TweetVimListStatuses vim

ユーザのタイムラインを表示する

:TweetVimUserTimeline basyura

ツイート用バッファを開く

:TweetVimSay

ツイート用のバッファ(tweetvim_say)が開きます。メッセージ入力後にノーマルモードで Enter を押下するとツイートします。

検索

:TweetVimSearch tweetvim

定義済みバッファキーマップ

タイムライン表示バッファ (&filetype == tweetvim)

nmap <silent> <buffer> <CR> <Plug>(tweetvim_action_enter)
nmap <silent> <buffer> r  <Plug>(tweetvim_action_reply)
nmap <silent> <buffer> i  <Plug>(tweetvim_action_in_reply_to)
nmap <silent> <buffer> u  <Plug>(tweetvim_action_user_timeline)
nmap <silent> <buffer> o  <Plug>(tweetvim_action_open_links)
nmap <silent> <buffer> <leader>f  <Plug>(tweetvim_action_favorite)
nmap <silent> <buffer> <leader>uf <Plug>(tweetvim_action_remove_favorite)
nmap <silent> <buffer> <leader>r  <Plug>(tweetvim_action_retweet)
nmap <silent> <buffer> <leader>q  <Plug>(tweetvim_action_qt)
nmap <silent> <buffer> <Leader><Leader>  <Plug>(tweetvim_action_reload)

nmap <silent> <buffer> ff  <Plug>(tweetvim_action_page_next)
nmap <silent> <buffer> bb  <Plug>(tweetvim_action_page_previous)

nmap <silent> <buffer> H  <Plug>(tweetvim_buffer_previous)
nmap <silent> <buffer> L  <Plug>(tweetvim_buffer_next)

nnoremap <silent> <buffer> a :call unite#sources#tweetvim_action#start()<CR>
nnoremap <silent> <buffer> t :call unite#sources#tweetvim_timeline#start()<CR>

デフォルトで「」は「\」が設定されています。

ツイート用バッファ (&filetype == tweetvim_say)

nnoremap <buffer> <silent> q :bd!<CR>
nnoremap <buffer> <silent> <C-s>      :call <SID>show_history()<CR>
inoremap <buffer> <silent> <C-s> <ESC>:call <SID>show_history()<CR>
nnoremap <buffer> <silent> <CR>       :call <SID>post_tweet()<CR>

inoremap <buffer> <silent> <C-i> <ESC>:call unite#sources#tweetvim_tweet_history#start()<CR>
nnoremap <buffer> <silent> <C-i> <ESC>:call unite#sources#tweetvim_tweet_history#start()<CR>

Unite インタフェース

TweetVim は unite.vim をインストールすることで劇的に使いやすくなります。

タイムライン選択

:Unite tweetvim

選択可能なタイムラインの一覧が表示されます。

- home_timeline
- mentions
- retweeted_by_me
- retweeted_to_me
- retweets_of_me
- favorites
- @basyura/登録してあるリスト
- @basyura/登録してあるリスト
- ・・・

api を使ってスクリーン名とリスト一覧を取得しているので、最初の一回はちょっと時間がかかります。

アクション選択

tweetvim バッファのみ。デフォルトではタイムライン上で a を押すと Unite が起動し、選択可能なアクションの一覧を表示します。

- browser         - open tweet with browser
- favorite        - favorite tweet
- follow          - follow user
- in_reply_to     - show conversation
- list            - add user to list
- open_links      - open links in tweet
- qt              - quote tweet
- remove_favorite - remove favorite
- reply           - reply
- retweet         - retweet
- unfollow        - unfollow user
- user_timeline   - show user timeline

ツイート歴表示、選択

tweetvim_say バッファのみ。デフォルトでは「」で歴選択用の Unite が起動します。
歴は tweetvim_say バッファが閉じられるタイミングでキャッシュしていますが、Vim 再起動時にはクリアされます。
」 で歴を遡って tweetvim_say バッファに表示させることもできます。

アウトライン

unite-outline を使用してタイムラインを絞り込むことができます。

:Unite outline

URL 短縮

bitly.vimをインストールしておくと、ツイート用バッファで URL 短縮とタイトルの取得ができます。
デフォルトのキーマッピング。

inoremap <buffer> <C-x><C-d> <ESC>:TweetVimBitly<CR>

実行後に url を入力すると以下のような内容がツイート用バッファに展開されます。

> basyura/TweetVim - GitHub http://bit.ly/t0RQhx

その他

タイムラインに表示したスクリーン名をファイルに出力しています。スクリーン名の補完等に使えます。:TweetVimUserTimeline でのユーザ名補完にも使用しています。

~/.tweetvim/screen_name

使い方

自分の設定と実際にどういう使い方をしているかを以下に。

設定例
" タイムライン選択用の Unite を起動する
nnoremap <silent> t :Unite tweetvim<CR>
" 発言用バッファを表示する
nnoremap <silent> s :TweetVimSay<CR>

" スクリーン名のキャッシュを利用して、neocomplcache で補完する
if !exists('g:neocomplcache_dictionary_filetype_lists')
  let g:neocomplcache_dictionary_filetype_lists = {}
endif
let neco_dic = g:neocomplcache_dictionary_filetype_lists
let neco_dic.tweetvim_say = $HOME . '/.tweetvim/screen_name'
使用例
  • Unite を起動してタイムラインの一覧を表示する => 「t」
  • タイムラインを選択して表示する
  • 最新の内容に更新する => 「
  • url をブラウザで表示 => url 上で「enter」
  • ツイートにあるリンクを全部開きたい => 「o」
  • リプライする => 「r」
  • リプライの内容を書きこんで送信する => normal モードで 「enter」
  • タイムラインの次ページを表示する => 「ff」
  • タイムラインの前ページを表示する => 「bb」
  • さっき表示したバッファに戻る => 「H」
  • やっぱり元のバッファに戻る(進む) => 「L」
  • 新しく発言する => 「s」
  • 過去に発言した内容をたどる => 「C-s」
  • Unite で過去に発言した内容の一覧を表示する => 「C-i」
  • 発言する => normal モードで 「enter」
  • 検索してー => 「:TweetVimSearch vim」
  • このユーザの発言だけ見たい => 「u」
  • ツイートのやり取りを見たい => 「i」
  • ふぁぼりたい => 「f」
  • ふぁぼ消したい => 「uf」
  • リツイートしたい => 「r」
  • qt したい => 「q」
  • Unite で rt とか fav とかしたい => 「a」
  • ツイートを特定のキーワードで絞り込みたい => 「:Unite outline」

タイムラインの表示が遅いと感じる場合

webapi-vim を fork して hmac#sha1 の ruby, perl, python 実装を追加した資源が webapi-vim にあります(pull request 中)。この資源を clone するか各自のリポジトリに差分を当てるといい感じになるかもしれません。

設定

1 ページあたりのツイート取得件数

let g:tweetvim_tweet_per_page = 50

表示内容をキャッシュしておく数(バッファを戻る、進むに使用)

let g:tweetvim_cache_size     = 10

設定情報を保存するディレクトリ

let g:tweetvim_config_dir     = expand('~/.tweetvim')

タイムラインにリツイートを含める

let g:tweetvim_include_rts    = 1

colorscheme

wombat を常用しているので、これにあわせて hilight を設定しています。必要に応じて「syntax/tweetvim.vim」の定義を上書きしてください。

TODO

  • 日付(created_at)の変換どうしよう・・・
  • バッファの使い回しがおかしい。増える。
  • 新規ツイートが分かるように
  • 自分宛のツイートが分かるように
  • バッファを戻った時にカーソル位置を保持する
  • 同じ内容のバッファはキャッシュしない
  • filter
  • user 情報の表示
  • list への削除
  • list の作成
  • 追加済みリストが分かるように
  • 検索時の次ページ、前ページ
  • ストリーミング API に対応できないかな。

まとめ

前々から作りたいと思っていたものがようやく形になりました。ここに至る試作品に unite-twitterrubytter.vim がありました。いろいろ部品を作ってみて可能かどうか試していったんですが、webapi-vim、unite.vim、open-browser.vim、unite-outline といった便利な plugin があったからできたようなものだと思っています。ありがとうございます。
今年一年いろいろな方にお世話になりましたが、2012 年もよろ vim おねがいします!