かなりすごいブログ

Vimによる通知センター実装、ThingsPast.vimをリリースしました

Vim Advent Calendar 2013、5日目の記事になります。プラグインの完成が遅れ、遅刻力を発揮してしまいました…。

ThingsPast.vimをリリースしました

ThingsPast.vimというプラグインをリリースしました。 これは、Mac OS Xの通知センターのようなものをVim内で実装したものです。

https://github.com/supermomonga/thingspast.vim

Macをお持ちでない方のために簡単に説明すると、通知センターは各アプリケーションによるユーザーへの「通知」をハンドリングする機能です。Twitterの新着リプライや新着受信メールなどといった通知の一覧表示や、通知一覧からの選択によってアプリケーションを適切な状態で起動、たとえば通知された新着メールをクリックするとそのメールが選択された状態でメーラーを起動するなど、を行うことができます。

notifcenter

ThingsPast.vimは、これをVim内で再実装したものです。

ThingsPast.vimのメリット

Vimで動作するTwitterクライアントやメーラー、Lingrクライアントなど、Vimをプラットフォームとして動作するアプリケーションがあります。これらの新着通知をハンドリングする手段としては、今までGrowlなどのOSレベルの通知アプリケーションと連携して通知を行われるのが一般的でした。

ですが、この方法には欠点があります。それは、OSから見て、通知元のアプリケーションは単にVimでしかなく、Vimで動作しているどのアプリケーションからの通知であるのかといった情報のハンドリングが難しいことです。

たとえば、TweetVimというVimで動作するTwitterクライアントがありますが、TweetVimからの「新着リプライ」通知をMac OS Xの通知センターに表示すること自体は可能なものの、それを通知一覧から選択した際にVimを起動し、その中でTweetVimを起動し、該当のリプライや会話を表示する、といった動作を行わせることはかなり難しいのです。

ThingsPast.vimは、Vim内に独立した通知管理システムを構築することで、こういった問題を解決しました。

ThingsPast.vimの動作風景

Screen Shot 2013-12-06 at 01.05.07

ThingsPast.vimをインストールし、<Space>nを打鍵すると、Vimのウィンドウが縦に分割され、右側にプラグインごとの通知一覧が表示されます。j,kで通知を選択でき、選択した状態で<CR>(Enter)を打鍵すると、プラグインごとに最適な処理が実行され、その後通知一覧から通知は消えます。

ThingsPast.vimの想定利用シーン

ThingsPast.vimの想定している利用シーンとして、以下の様なものがあります。

  • TweetVim(Twitterクライアント)
    • 新着リプライ通知
    • 新着DM通知
  • J6uil.vim(Lingrクライアント)
    • 新着メッセージ通知
  • Gmail.vim(Gmailクライアント)
    • 新着メール通知
  • VimShell.vim(ターミナルエミュレータ)
    • 時間がかかった処理が終了した際、VimShellがアクティブバッファでない場合、通知をする

ThingsPast.vimで通知を受け取るには、それぞれのプラグインからThingsPast.vimが提供しているAPI関数をコールする必要があります。ですので、hookの仕組みが実装されているプラグインとの連携を、vimrcの設定で記述することができます。この辺りについて、詳しくはヘルプドキュメントの方をご覧ください。

実際には、上記のプラグインにはhook機能が不足しておりThingsPast.vimとの連携ができないものが多いのが現状です。

ThingsPast.vimが一応のリリースに漕ぎ着けましたので、それらプラグインにhook機能を実装しPull Requestを送りたいなと考えています。

今後の実装予定と課題

  • 設定例の充実化
    • そのためにはまず、Hook追加のPull Requestを送りまくることになりそうです
  • シンタックスハイライトの実装
    • もっと見栄えをかっこよくしたいです
  • アニメーションの自走
    • 選択中の通知は、省略されたメッセージが右から左に流れて全文を読めるようにしたいです
  • Hookの実装
    • これにより、通知が追加された際にShaberu.vimで音声通知を行う、といったことができるようになります
  • 新着通知が追加されたプラグインを上に表示する用に、並び順を改善
  • ステータスラインに通知数を表示することなどができるように、外部からの利用を想定した便利関数の実装
  • コードのリファクタリング
    • VimAdventCalendarに間に合わせるために、所々に妥協した面が見えます…
  • ユニットテストの充実化

12月7日に開催されるTokyoVimでは、ThingsPast.vimのリファクタリングや機能追加など、重点的に行いたいと思います。

謝辞

ThingsPast.vimは私にとって初めての独自バッファを作成するプラグインであり、Vim scriptプログラミングの経験が浅い私にとって、かなり手探りでの実装となりました。プラグインを作成するにあたってLingrのVim部屋にて多数の方から様々なアドバイスを頂戴し、なんとか完成に至ったという次第です。 アドバイスをくださった皆さまに、この場を借りてお礼申し上げます。

Vim Advent Calendar 2013 6日目は

明日、というか今日ですが、の担当は@kaoriyaさんです。よろしくお願いします!