Spotlight対応のスティッキーズにしておく

前回はてブコメントをきっかけに、スティッキーズがSpotlightに対応していないことが発覚してしまった...。Spotlightの素晴らしさを知ったあとでは、残念でならない。Appleには、この後のバージョンアップでは是非とも対応してもらいたい。...なんて期待していると、大抵は裏切られることになる。
そうなのです、無いものは自分で作る or 創意工夫しか無いのである...。毎度のことながら。
早速、検索してみると、素晴らしいサンプルプロジェクトが見つかった。Spotlightプラグインを作成するためのサンプルなのだが、何と!スティッキーズをSpotlight対応させるまでの手順を詳細に解説してくれている。

これはそのまま利用させて頂くしかない!と思ったのも束の間、このチュートリアルの作成日は2005/7/15となっており、基本的にOSX 10.4 Tiger環境で作成されたもののようだ。このままでは10.5 Leopard環境では機能しなかった...。このあと、10.5 Leopard環境でスティッキーズをSpotlightに対応させるまでの試行錯誤が始まる...。

開発環境

大まかな手順

読めない英語を読んでみて、自分の中では以下の3つの手順に分けて考えてみた。

  1. 定期的にスティッキーズデータベースを必要な場所にコピーするために、cronを設定する。
  2. スティッキーズの内容を検索するSpotlightプラグイン - StickiesImporter.mdimporterを作成する。
  3. 検索にヒットしたスティッキーズの内容を表示するヘルパーアプリケーション - OpenStickies.appを作成する。


ビルド済みのプラグインとヘルパーはSpotlight plugin and helper for Stickiesからダウンロード可能です。余計な説明は不要で、素早く試してみたい方はどうぞ。それでも1. cronの設定はだけは読んでおいた方が良いかもです。

1. cronの設定

cronは、シェルスクリプトを指定した時間に定期的に実行してくれる。今まで利用したことはなかったが、cronによるプログラムの自動実行 を読んで理解できた。すごく便利なタイマーだ!

ところで、スティッキーズのすべての状態(メモ ウィンドウの位置、大きさ、折り畳みの状態、内容など)は、たった一つのファイル ~/Library/StickiesDatabase に保存されている。StickiesDatabase には拡張子は無く、このままではSpotlightで発見された時に関連づけて起動するアプリケーションを指定することが出来ないため、仮に、StickiesData.aaaというファイル名にコピーしておく必要がある。(任意のファイル名.拡張子でOK。ここではサンプルプロジェクトの通りにしてみた。)
スティッキーズの内容は随時更新されるため、その度に手作業でコピーするのは面倒だ。そんな時はcronを利用すれば、かなり幸せになれる。

  • ターミナルを起動して、以下のコマンドを実行した。
$ crontab -e
  • 自分の環境ではviが起動するので、「i」キーを押して -- INSET -- モードにして、以下の設定を追記した。
* * * * * cp ~/Library/StickiesDatabase ~/Documents/StickiesData.aaa
      • チュートリアルでは同じ~/Library/StickiesData.aaaへコピーしていたが、OSX 10.5 LeopardのSpotlightでは~/Libraryフォルダが検索対象から除外されているようなので、~/Documents/StickiesData.aaaに変更した。
  • 「esc」キーを押して -- INSET -- モードを終了してから、shiftキーを押しながら「z」キーを2回押して保存終了した。
  • crontabの設定を確認してみた。以下のように表示されれば、ちゃんと設定できている。
$ crontab -l
* * * * * cp ~/Library/StickiesDatabase ~/Documents/StickiesData.aaa


以上で、書類フォルダの中に定期的にコピーされるようになった。(1分毎?)少し時間を空けて書類フォルダを確認して、StickiesData.aaaが見つかればOK。

2. StickiesImporter.mdimporterの作成

基本的にチュートリアルで解説されている通りにやれば良いのだけど、以下のリンクからStickiesImporterプロジェクトをダウンロードできる。


ダウンロード後に解凍して、Xcodeで開いて(3.0プロジェクトに変換された)、Deploymentでビルドして、生成されたStickiesImporter.mdimporterを/Library/Spotlightフォルダに移動した。(StickiesImporter.mdimporterをダブルクリックでインストールするのがベスト)
この状態でスティッキーズにユニークなテキスト(例:test_zarigani)を書いて、それをSpotlightで検索してみると...

Spotlight検索成功!しかし、まだ検索結果の「StickiesData.aaa」を開くことが出来ない...。

3. OpenStickies.appの作成

以下のリンクからOpenStickiesプロジェクトをダウンロードできる。


StickiesData.aaa == StickiesDatabaseなので、StickiesData.aaaを開くためにはスティッキーズを起動するのが一番手っ取り早い。つまり、StickiesData.aaaをクリックした時スティッキーズが起動するように関連付けておけば良いことになる。

  • チュートリアルでは、スティッキーズを直接修正せずに*1、OpenStickies.appというスティッキーズを起動するヘルパーアプリケーションを作成している。
  • OpenStickies.appとStickiesData.aaaを関連付けることで、スティッキーズが起動する仕組みだ。
  • OpenStickies.appの中身はとってもシンプルで、起動すると以下のAppleScriptが実行されるようになっている。
tell application "Stickies" to activate

これでSpotlightの検索結果「StickiesData.aaa」をダブルクリックすると、スティッキーズが起動するようになったのだが、一つ不満が残った。
「StickiesData.aaa」がヒットすれば、検索ワードがスティッキーズの中に存在することは確認できるのだが、スティッキーズが起動しただけでは、その検索ワードが複数あるメモウィンドウのどこに存在するのか確認できないのだ...。仕方なく、スティッキーズ内の検索でもう一度検索することになる。でも、これじゃ二度手間だ。
幸いにも、Spotlightの検索ワードは、スティッキーズ内の検索に引き継がれることに気付いた。(「StickiesData.aaa」を選択して、スティッキーズが起動したあと、command + fでSpotlightの検索ワードが入力された状態でスティッキーズの検索ウィンドウが開く。)そこで、AppleScriptを以下のように修正して、ビルドし直してみた。

tell application "Stickies"
    activate
end tell

tell application "System Events"
    if UI elements enabled then
        tell process "Stickies"
            set frontmost to true
        end tell
	
        delay 1
        keystroke "f" using command down
        delay 1
        keystroke return
    end if
end tell
      • ここでまたしてもスティッキーズの機能不足を実感...。AppleScriptにも対応していないとは...。仕方なくGUIスクリプトで対応。よって、システム環境設定 >> ユニバーサルアクセス「補助装置にアクセスできるようにする」をチェックありの状態にしておく必要がある。


チュートリアルには書いてないが、ついでに「書類のタイプ」も設定もしておいた。

  • プロジェクトウィンドウのグループとファイルで、ターゲット >> OpenStickiesを選択して、command + i



  • スティッキーズのアイコンを取り込み
    • /Applications/Stickies.app/Contents/Resources/Stickies.icnsをそのまま利用させてもらった。(Finderから左記ファイルを、OpenStickiesプロジェクトへドラッグ&ドロップで取り込めた。)
  • アプリケーションアイコンと書類のアイコンで利用


動作確認

ビルドして生成されたOpenStickies.appをアプリケーションフォルダに移動して、もう一度Spotlightで検索してみると...


自動的にスティッキーズ内の検索ウィンドウが表示されて、その検索結果「test_zarigani」が選択された状態になった!(ちょっと反応は鈍いが...)折り畳まれたメモ ウィンドウも、自動的に広がった状態になる!ひとまず満足。

解決できない問題


どうもスティッキーズの内容をうまく検索できない状況に気付き、この後の日記に続くのであった...。

*1:そもそもスティッキーズのソースコードが無いので修正できない?