mikutterの最新の情報は、mikutter blogに引っ越しました。

2011年5月27日金曜日

mikutterコマンド

プラグイン開発のおはなし。

プラグインは、結構簡単に自分のタブをつくることができるようになってる。その方法は既存のcore/addon/friend_timeline.rbとかを見ればすべてわかるので省略するけれど、これだけじゃあプラグインには不十分なことがある。

例えば、指定された特定のつぶやきに対して動作するものは、タイムライン上でつぶやきを右クリックしてメニューで選べると良い(コンテキストメニュー)。
例えば、プロフィール表示はただのプラグインだけど、コンテキストメニューに「〇〇のプロフィール」という項目が出てくる。これは、今まで「コンテキストメニューフィルタ」というのを使ってて、イベントフィルタで右クリックメニューをガシガシ追加できるというものだった。

0.0.3.5からはキーコンフィグで右クリックメニューで出てくるものにキーを割り当てることができるようになったので、ユーザは前より柔軟にカスタマイズができるようになった。
そんなふうに、コンテキストメニューやショートカットキーにプラグインが追加できる機能、mikutterコマンドを新しく追加しました。
今回はその話。

    plugin.add_event_filter(:command){ |menu|
      menu[:smartthread] = {
        :slug => :smartthread,
        :name => '会話スレッドを表示',
        :icon => MUI::Skin.get("list.png"),
        :condition => lambda{ |m| m.message.repliable? },
        :exec => lambda{ |m| tabclass.new("Thread #{counter.call}", service,
                                          :message => m.message,
                                          :icon => MUI::Skin.get("list.png")) },
        :visible => true,
        :role => :message }
      [menu]
    }

これは会話スレッドプラグインの、登録している箇所。(core/addon/smartthread.rb)。だいたいこれをテンプレに使って頂けたらとおもうんだけど、menuという連想配列に入れる内容がポイント。

:slug
一意なコマンド名。かぶっちゃいけないので、プラグイン開発者の独創性が試される。Symbolで何か。まあおまえら初心者は、:プラグイン名_機能名 にでもしておけってこった
:name
表示名。コンテキストメニューに表示される内容。String
:description
この機能の説明など。省略可能。 
:icon
アイコンがあれば。今のところ使われない。Gdk::PixbufとかString(ファイル名)を指定しましょう。 
:condition
実行条件。これの値と===で引数(後述)が比較される。1.9では、Proc#===は、Proc#callのことなので、無名関数を渡すとなんでもできる。1.8でも、utils.rbで同じ機能が実装してあるので使ってください。
:exec
実行される本体。:conditionと同じ引数を受け取るが、:conditionがfalseになった場合はそもそもこれは呼ばれない。
:visible
コンテキストメニューに表示するかどうかのフラグ。falseなら表示されない。これは例えば、「ひとつ上のつぶやきを選択」のように、コンテキストメニューに表示する意味がないもののためにある。
:role
コマンドを実行できる環境。たとえば、つぶやきを右クリックすると、ここに:messageが指定されたもののうち、:conditionがtrueなものだけが実行又はコンテキストメニューに表示される。指定できるもののバリエーションは後述。
:conditionの「引数」というのは、:roleに何を設定したかによって変わる。

  • :message
    つぶやきにフォーカスがあるとき。以下のような構造体が引数になる。
    Struct.new(:event (Gdk::Event or nil), :message (Message), :timeline (Gtk::TimeLine), :miraclepainter (Gdk::MiraclePainter))
  • :message_select
    :messageの時で、なおかつテキストが選択されているとき。引数も同じ。
  • :timeline
    タイムラインで右クリックされたとき。基本的に:messageと同じタイミングだけど、引数はGtk::TimeLineしか受け取らないという点がちがう。
  • :postbox
    つぶやき入力欄。今のところ、ショートカットキーにしか対応していない。引数としてGtk::PostBoxを受け取る。
こういうふうに、わりと簡単にmikutterコマンドを新しく追加できる。プラグインに依存しない機能(リプライとか)は、core/addon/contextmenu.rbに実装してあるので、例が見たければこれをどうぞ。

これで随分プラグインの幅が広がるような気がします。おもしろいものをつくってね!!!