Growl連携 その1 (xyttr Advent Calendar 6日目)

この記事はxyttr Advent Calendar 2011の記事です。

xyzzyにはEmacsのような画像のインライン表示機能がないのでxyttrではアイコン画像を描画できないのですが、アイコンちょっと確認したいなーけどxyzzyから離れたくないなーという時に便利なのがGrowl for Windowsです。
拙作のxl-growlを使うとxyzzyから簡単にGrowlへ通知を送る事ができるます。

(require "growl")
(in-package :xyttr)

;;; カーソル下のツイートをGrowlで表示
(defun growl-tweet ()
  (interactive)
  (w/entry (user.screen_name user.profile_image_url text)
    (growl:notify (concat "@" user.screen_name) text
                  :name "xyttr"
                  :icon user.profile_image_url)))

(define-key *xyttr-timeline-keymap* #\g 'growl-tweet)

こんな感じで通知が表示されます。
http://gyazo.com/d9846fd93c2920c3365bd59b93c759df.png

growl:notifyは単純な通知を送信しますが、growl:notify-with-url-callbackを使うとクリック時に指定URLをWEBブラウザで開くような通知を送信する事ができます。

(defun growl-tweet ()
  (interactive)
  (w/entry (id user.screen_name user.profile_image_url text)
    (let ((url (format nil "http://twitter.com/#!/~A/status/~A"
                       user.screen_name id)))
      (growl:notify-with-url-callback
       (concat "@" user.screen_name) text url
       :name "xyttr"
       :icon user.profile_image_url
       :sticky t))))

あまり意味のない例ですが、このコマンドで表示した通知をクリックするとWEBブラウザにツイートのpermalink URLが渡されて表示されます。

次はもうちょっと役に立つ例。
xyttrにはリプライ先ツイートをポップアップ表示する機能がありますが(リプライツイート上でpキー)、最近のTwitterクライアントによくある会話表示機能のようにリプライの応酬を遡って表示する機能はありません。
主に会話表示用のフォーマットというかバッファのモードを考えるのが面倒臭いからなのですが、Growl丸投げで良ければ割と簡単に実現できます。

;;; Growlで会話を表示
(defun growl-conversation ()
  (interactive)
  (labels
      ((rec (id d) ; id := status_id, d := 遡る件数
         ; ツイート1件取得
         (api-show-status-async
          :id id
          :onsuccess
          (lambda (st)
            (w/json (user.screen_name  user.profile_image_url
                     text #0=in_reply_to_status_id) st
              ; growlに送信
              (growl:notify (concat "@" user.screen_name) text
                            :name "xyttr" :sticky t
                            :icon user.profile_image_url)
              ; d>0かつ返信先ツイートがあればもう1回
              (when (and (> d 0) in_reply_to_status_id)
                (rec in_reply_to_status_id (1- d))))))))
    (case (timeline-mode buffer-timeline)
      ((:xyttr-search :xyttr-search-global)
       ; search-apiだと返信先ツイートのidが送られて来ないので詳細を取得しなおす
       (w/entry (id)
         (api-show-status-async
          :id id
          :onsuccess
          (lambda (st)
            (w/json #1=(#0# retweeted_status.in_reply_to_status_id) st
              ; 返信先ツイートのid(in_reply_to_status_id)があれば
              ; 最大5件まで遡って表示
              #2=(whenlet irtid (or . #1#)
                (rec irtid 5)))))))
      (t (w/entry #1# #2#)))))

(define-key *xyttr-timeline-keymap* #\p 'growl-conversation)

http://gyazo.com/b005b1d8a80d63b86b58951e67e691fd.png
実際に表示するとこんな感じ。



以上、xl-growlを使ったGrowlとの連携例その1でした。その2は来週くらいに。