STOT形式でコピー

STOT(ShareTwitterOnTumblr)は、ツイートをTumblrに投稿するためのフォー マットの一つです。様々なアプリケーションで使われていることもあり、こ の形式でツイートをコピーできると何かと便利です。 このセクションでは、

  • ユーザが選択して呼び出せる任意の機能(mikutterコマンド)の追加方法
  • ツイートの情報(Message)とユーザ情報(User)のオブジェクトの取扱方

について解説します。

コード

# -*- coding: utf-8 -*-

Plugin.create(:copy_as_stot) do

  command(:copy_as_stot,
    name: 'STOT形式でコピー',
    condition: Plugin::Command[:HasOneMessage],
    visible: true,
    role: :timeline) do |opt|
      message = opt.messages.first
      screen_name = message.user[:idname]
      Gtk::Clipboard.copy("#{screen_name}: #{message.to_s} [https://twitter.com/#{screen_name}/status/#{message.id}]")
  end

end

解説

STOTについて

まずはじめに、STOTの一例を示します。

toshi_a: 会社でふぁぼるのたのしい [http://twitter.com/#!/toshi_a/status/151947400691449856]

こんなふうに、ユーザのscreen_nameと本文、URL(ツイートのID)の3つの 要素が含まれています。要は、この3つの要素だけ取得して、クリップボー ドに合成したテキストを送れば終わりです。

mikutterコマンド

この機能の呼び出し方法ですが、

  • ツイートを右クリックしたときに出るメニュー
  • ツイートを選択した状態で設定されたショートカットキーを押したとき に実行される

の2つ方法で呼び出せるようにします。mikutterを使っていれば気づくか と思いますが、右クリックメニューで選択できる項目はすべてショートカッ トキーに割り当てることができます。これは、どちらも登録された 「mikutterコマンド」を参照しているからで、ここに一つ機能を追加する ようにしておけば、ユーザは右クリックメニューから使ったり、ショート カットキーに割り当てたり、好きに使うことができます。

  1. commandメソッド

    1. commandメソッドの引数

      commandの第一引数には、コマンドの識別名(slug)を渡します。今回のプラグインのような、 コマンドを一つだけ提供するのが目的である場合は、プラグインスラッグと同じにする人が多いようです。 しかし、ある程度の規模のプラグインで、複数のmikutterコマンドを提供する場合は、 分かりやすいスラッグにしておきましょう。

      第二匹数は Hash を渡します。以下の様なキーがあります。

      1. name 表示名。コンテキストメニューに表示される内容。String。

      2. description この機能の説明など。省略可能。

      3. icon アイコンがあれば。Gdk::PixbufとかString(ファイル名)を指定しましょう。 アイコンを指定しておくと、設定画面や右クリックメニューでそのアイコンが表示されます。 また、ツールバーには、アイコンがないと表示されません。

      4. condition 実行条件。これの値と===で引数(後述)が比較されます。引数にもよりますが、Proc、Regexp、Stringなどを指定できます。

      5. visible コンテキストメニューに表示するかどうかのフラグ。falseなら表示されない。 これは例えば、「ひとつ上のつぶやきを選択」のように、右クリックメニューに表示する必要のないものに使う。

      6. role コマンドを実行できる環境。たとえば、タイムラインが右クリックすると、ここに :timeline が指定されていて、 かつ :condition がtrueなものだけが実行又はコンテキストメニューに表示される。指定できるもののバリエーションは後述。

      rolecondition が条件を満たして、ユーザに入力によって実行されることになったら、 commandメソッドに渡したブロックが実行されます。ブロックは、 condition と同じ引数を受け取ります。

    2. コマンドロール

      あるmikutterコマンドが実行できるウィジェットのことをロール(role)といいます。 タイムラインや、投稿ウィジェットなど、どこで呼び出されたら実行できるかを設定しておく必要があります。

      1. timeline
        • 右クリック: タイムラインを右クリックした時
        • キーボード: タイムラインにフォーカスがあっている時

        ツイートが表示されているタイムラインです。 condition の引数の :messages キーに、 選択されているすべてのツイートが配列で入ります。 TABキーなどでフォーカスインした時にショートカットキーを押す等、 ツイートが選択されずにコマンドが実行された場合は空の配列になります。

        ツイートによって動作を変更するコマンドはこのロールです。ほとんどのコマンドは、 これを使うことになるでしょう。

      2. tab
        • 右クリック: タブバーのアイコンを右クリックした時
        • キーボード: タイムラインなど、タブの子ウィジェットにフォーカスがあるとき
        • ツールバー: タブの内部の一番上

        タブです。timelineはツイートに対するコマンドという感じですが、tabはタブ全体に影響をおよぼすようなコマンドに使用します。

        標準では、「タブを閉じる」や、「新規ペインへ移動」などがこのロールを使用しています。

      3. pane
        • 右クリック: なし
        • キーボード: ペインに所属するウィジェット(具体的にはタブ)にフォーカスがあるとき

        ペインです。ペインはいくつかのタブの集合体で、ウィンドウ内に横に並べられています。 アクティブなペインを操作するような、UI関連のコマンドでしか使わないでしょう。 最も使用頻度は低いと思われます。

        標準では、「左(右)のペインを選択」で使われています。

      4. postbox
        • 右クリック: 投稿するテキストを入力するテキストボック
        • キーボード: Postbox上でキーボード入力をした時

        Postbox(ツイート投稿ウィジェット)です。ユーザがキーをタイプするたびにコマンドを実行します。 一つ注意することは、実行するコマンドがあれば、タイプされた文字は入力されないということです。 例えば、fに「カーソルを右へ移動」のような機能を割り当てると、fを入力できなくなります。 このことによって、Enterに投稿を割り当てることもできます。

        標準では、「投稿する」で使われています。

      5. window
        • 右クリック: なし
        • キーボード: mikutterのウィンドウがアクティブなとき
        • ツールバー: ステータスバーの右下

        ウィンドウです。どこでも実行できるようなコマンドに設定します。

        今後、「設定」や「コンソールを開く」などが、このロールを使う予定です。

      実は、この他にもプロフィール関連のロールがあるのですが、それはプロフィール拡張プラグインを書くときに説明したいと思います。

    3. コールバックの引数

      condition に指定された無名関数や実行ブロックには、以下の様な構造体が渡されます。

      Plugin::GUI::Event = Struct.new(:event, :widget, :messages)
      
      • :event: イベント呼び出し元。標準では、 :keyboard か :contextmenu か :toolbar
      • :widget: 入力を受け取ったウィジェット。例えばtimelineロールなら必ずタイムラインのインスタンス。
      • :messages: タイムラインに入力があった場合、イベントが発生した時選択されていたツイート。 複数選択されていることがあるので、1つしか選択されてなくても配列。 何も選択されてなければ空の配列。