Quicksilverでプラグインをつくる方法をチュートリアルにしてまとめました。
このチュートリアルを読むことで、以下のものがつくれるようになります。
- 基本的なQuicksilverプラグイン
- プラグイン用の設定画面
- 設定画面からのデータ取得
目次
- ここでの環境
- 必要なもの
- 準備
- つくりはじめる
- PreferencePaneをつくる
- Actionのコードを書く
- おわりに
- 参照
ここでの環境
- Mac OS X Leopard 10.5.1
- Quicksilver B53 (3814)
- Xcode 3.0
必要なもの
準備
ビルドできるようになるまでの準備をします。
1. ダウンロードしたXcodeのテンプレートをインストール
Xcode 3.0 からは、カスタムテンプレートを置く場所が /Developer/Library/Xcode/Project Templates/ になっています。 (VIRTUOSO VIRTUOSOのところでは、 /Library/Application Support/Apple/Developer Tools/Project Templates/ に置くよう書かれている)
ここでは、 /Developer/Library/Xcode/Project Templates/Bundle/Quicksilver Plug-in というパスになるように、zipを展開したディレクトリを置きます。
2. Xcode プロジェクトをつくる
1がうまくいっていれば、このように Quicksilver Plug-in が選択できます。

すすめると、こんな画面に。

このチュートリアルでは、設定画面 (PreferencePane) もつくるので、 QSInterface.frameworkにもチェックして、リンクされるようにしておきましょう。

3. Source Trees
プラグインをビルドするには、Quicksilverのフレームワークが必要です。 ダウンロードしておいたQuicksilver Developer版の中に、フレームワークがあるのでそこをXcodeに指定します。
XcodeのPreferencesを開き、Source Treesタブに移動して、画面のように設定します (Pathのところは、Quicksilver Developer版を置いた場所に読み替えてください。 例:/Applications/QS-dev.app/Contents/Frameworks)

つくりはじめる
フレームワークにのっかってビルドできるところまでいってみましょう。
4. Info.plist
さて、ここまでで準備が完了しました。 ここからは実際にプラグインをつくっていくことになります。
プラグインの情報のほとんどは、Info.plistに書くことになります。 .plistなファイルはXMLなので、Property List Editorで開くと編集にラクができます。
デフォルトのInfo.plistをProperty List Editorで開くと、次のような感じ。

個々のキー/値については、 や Plist Specification が詳しいです。 ここでは、最小限の設定項目を埋めていきます。
5. QSPlugin
プラグインについてのメタ情報を書きます。
Before | After:


6. QSActions
実際にプラグインが何をするかについての情報を書きます。 まず、QSActionsTemplateからQSActionsに名前を変えておきます。
nameのところの値をタイプすることで、Quicksilverからこのプラグインが呼ばれるので、 それっぽい値を入れておくとよいでしょう。
directTypesのところで、受けつける入力の種類を判定するぽいです。 ここでは “*”を指定してなんでもこいにしてみました。
Before | After:


7. QSRegistration
いろいろ設定項目はありますが、ここではPreferencePaneについて。 まず、QSRegistrationTemplateからQSRegistrationに名前を変えておきます。
QSPreferencePanesの中に、classを指定できるところがあります。 ここには、後でつくるPreferencePane用のクラス名を指定します。
Before | After:


8. ビルド
そろそろこのページを見ながらちまちまと作業をするのにも飽きてきたことででしょう。 ここらでビルドして、実際に動いてるのを見ようではないですか。
Xcodeでふつうにビルドすると、*.qsplugin というファイルが生成されます。 これがQuicksilverのプラグインなのですね。

ダブルクリックすると、Quicksilverに “プラグインをインストールする? “みたいに聞かれるのでYesで進みましょう。
9. 動いてるのを見る
「.」でテキスト入力モードにして何かうちこみ、TABでActionに移りましょう。 6.で設定してある名前を入力すればほら、いまつくったプラグインが呼び出せるではないですか! (とはいえ、いまのところ何もActionを実装していないので、実行したところで何も起こりません)

次に、QuicksilverのPreferenceを開いてみます。 左のリストに、いまつくったプラグインがあると思います。やったね !

PreferencePaneをつくる
ここからがお楽しみです。
10. PreferencePaneのクラスをつくる
File→Newから、Objective-C class をつくります。 ファイル名は、7で指定してたクラス名にするとよいでしょう。

を、QSPreferencePaneを継承するように書き換えます。
QSPluginTutorialPreferencePane.h:
import
QSPluginTutorialPreferencePane : QSPreferencePane {
}
に、mainNibNameというメソッドを加えます。 このメソッドは、次につくるnibファイルの名前 (から.nibを除いたもの) を返すようにします。
QSPluginTutorialPreferencePane.m:
import "QSPluginTutorialPreferencePane.h"
QSPluginTutorialPreferencePane
-(NSString *)mainNibName {
return @"QSPluginTutorialPreference";
}
ここまでのプロジェクトはこんな感じになるでしょう。

11. NIBをつくる
File→Newから、Window NIB をつくります。

12. File’s OwnerのクラスをPreferencePaneのクラスにする
このへんを 参考にして、File’s Ownerのクラスを、10でつくったクラスにします。
まず、QSPreferencePane.hと10でつくったクラスのヘッダファイルを、 NIBのウィンドウにドラッグ&ドロップします。

次に、File’s Ownerのオブジェクトを選択した状態でObject Identityの設定ウィンドウに行き、 Classを10でつくったクラス名にします。
13. File’s OwnerとWindowをつなげる
File’s OwnerのオブジェクトからCtrl+ドラッグしてWindowにドロップすると、 オブジェクトをつなげることができます。 Outlets _windowと出るので、_windowを選択しましょう。

14. コントロールを配置
好きなコントロールをWindowにつけましょう。 ここでは、シンプルなText Fieldコントロールをつけました。

15. 動かす
ふたたびXcodeでビルドし、.qspluginをつくり、インストールします。 QuicksilverのPreference→つくっているプラグインを選ぶと、ちゃんと右側にいまつくったText Fieldが 表示されることでしょう。やった !

16. バインドする
しかしこのままでは、設定画面で入力した値をどうやって使うのか分かりませんよね。 ここで、Cocoa Binding というテクニックをつかいます。
14で配置したコントロールを選択してBindngs設定ウィンドウに行き、次のように設定します。
- Bind to: Shared User Defaults
- Controller key: values
- Model Key Path: 好きな文字列 (他のところからこの値を参照するときに使うキー)
ここでは、Model Key Path を QSPluginTutorial.someKey という値にしました。

Actionのコードを書く
したいことを何でも書くところ。
17. 入力 + 設定から得た値 => 出力
Actionのクラスの実装を書きます。 ここでは、入力された文字列に、PreferencePaneから得た値を組合せて、出力にすることにしました。 コードは以下のようになります。
QSPluginTutorialAction.m:
QSPluginTutorialAction
-
(QSObject *)performActionOnObject:(QSObject *)dObject{ // get value from Preference Pane id values = [[NSUserDefaultsController sharedUserDefaultsController] values]; NSString *value = [values valueForKey:@"QSPluginTutorial.someKey"];
QSObject *ret = [QSObject objectWithString: [NSString stringWithFormat:@"%@ hello, %@",[dObject stringValue], value]];
return ret; }
18. 完成 !!!
長い道のりでしたが、ついにこれで終わりです。
ビルドし、インストールして、PreferencePaneから値を入れておきます。
テキストを入力し、Actionを選択して実行します。
もういちどQuicksilverを起動すると、入力のところに結果が入っています。やったね !
おわりに
Quicksilverでプラグインをつくる方法をチュートリアルにしてまとめました。
Quicksilver Twitter Plugin (日本語) で、Quicksilverのプラグインをつくっているとき、まとまった情報がない、情報が古い、日本語の情報が見当たらない、と何かと苦労してました。
このチュートリアルでQuicksilver野良プラグインを書く人が増えればいいなあと。
(そして素晴しいプラグインが増えて僕も幸せになれればいいなぁとw)
Catalogの扱い方とかまだ調べてみたいところがたくさんあるので、情報持ってる方いればぜひご連絡ください。
参照
Vacuous Virtuoso: ほぼ唯一のQuicksilverプラグインづくりの情報源。
基本はここを以下の順に読むとよいです。
docs.blacktree.com: 本家。でもドキュメントが散逸してます…