7

現在、Finder で新しいファイルをすばやく作成できないという問題の解決を検討しています。Mac コミュニティはこれを解決する必要があると思うので、私が書いたものをオープンソースにします。

Windows では、右クリックして新しいテキスト ファイルを作成できます。OS X では、次のように機能するサービスでこれを実行できるはずです。

  • 右クリック > サービス > 新しいテキスト ファイルの作成

Snow Leopard でFinderサービスを作成することは、理論的にはこれを実現する方法ですが、サンプル コードを見つけることはできませんでした。(私はドキュメントを非常に簡単に見ただけであることを認めます)。

Apple が Xcode で Services テンプレートを提供しているかどうかにかかわらず、どのように開始すればよいかわかりません。基本的に、私は実用的なサービス プロジェクトを実行するための助けを探しています。実装コードは、私が Obj-C で書くのはかなり簡単なはずです。では、新しい実用的なサービス プロジェクトを作成するにはどうすればよいでしょうか? これについて私が間違っている場合は、これを行う正しい方法を教えてください。サンプルコードまたは開始するためのいくつかの手順を提供してください。

編集:私を信じてください、私はOS X初心者ではありません。PathFinder、Automator、Terminal など、回避策を実現するために多くのアプリを試しましたが、どれにも満足していません。

Windows と同じように、新しいファイルを作成するための右クリック可能なメニュー項目を作成したいと考えています。この API でこれができない場合は、必要に応じてシステム ファイルを変更します。しかし、OS X をハックする必要のない方法でそれを行いたいと思います。

悲しいことに、Snow Leopard がリリースされたとき、Apple はサードパーティのコンテキスト メニュー項目を無効にし、開発者は満足していませんでした。Automator のコンテキスト メニューでサービスを作成できましたが、非常に制限されていました。

touch ~/Desktop/file.txtはい、Quicksilver は、私がいつでもどこでも端末にいる場合を除いて、現時点でファイルを作成する方法です。

サービスを作成するための Xcode プロジェクトのソース コードを提供することで私の質問に答えることができない場合は、私が自分のコンピューターをどのように使用すべきかについての意見を独り占めしてください。いずれにせよ、これを自分で実装した後、おそらく自分の質問に答えることができると思います。

4

1 に答える 1

14

サービス実装ガイドをお読みください。動作するサンプル コードが必要な場合は、私が作成したこのプロジェクトを参照してください。ガイドで説明されているように、サービス ハンドラをインストールする必要があります。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [NSApp setServicesProvider:self];
    NSUpdateDynamicServices();
}

- (void)handleServices:(NSPasteboard *)pboard
          userData:(NSString *)userData 
         error:(NSString **)error {
    if([[pboard types] containsObject:NSFilenamesPboardType]){
        NSArray* fileArray=[pboard propertyListForType:NSFilenamesPboardType];
            // do something...
    }
}

そしてそれをあなたので宣伝しますInfo.plist

<key>NSServices</key>
<array>
    <dict>
        <key>NSMenuItem</key>
        <dict>
            <key>default</key>
            <string>Service Handling Demo</string>
        </dict>
        <key>NSMessage</key>
        <string>handleServices</string> <!-- This specifies the selector -->
        <key>NSPortName</key>
        <string>services</string>       <!-- This is the name of the app -->
        <key>NSSendTypes</key>
        <array>
            <string>NSFilenamesPboardType</string>
        </array>
    </dict>
</array>

このように簡単です!System Preferences.app の [キーボード ショートカット] セクションでサービス エントリを手動でオンにする必要がある場合があります。自動的にオンにしたい場合は、pbs.plistinsideLibrary/Preferences/に書き込むことができますが、それは文書化された方法ではありません。

問題は、Finder ウィンドウで空の領域を右クリックしたときに、Finder がこのサービス項目を表示しないことです。コードを挿入する以外には何もできません。これは、サービス システムの Finder のサポートに固有のものです。その動作を変更したい場合は、Finder.app 内にコードを挿入する必要があります。それはそれほど難しいことではありません。Snow Leopard では、このブログ投稿などで説明されている OSAX ロード トリックを使用するのが標準です。次に、Objective-C ランタイム関数を使用して、この Apple ドキュメント で説明されているメソッドを変更することにより、Finder の右クリックの動作にパッチを適用できます。(ただし、右クリック イベントに応答するために Finder が使用する方法はわかりません。)

代わりに、右クリックの代わりに Finder ウィンドウのツールバーのボタンをクリックしても問題ない場合は、このユーティリティcd-to のようにボタンを追加できます。これは、アプリのアイコンを Finder ツールバーに配置する機能を使用します。アプリ自体は、Apple イベントを介して最前面の Finder ウィンドウのパスを読み取り、そのためのターミナル ウィンドウを開きます。このアプリのコードを微調整して、やりたいことができると思います。

ここに主観的なものがあります:

正直なところ、新しいファイルを作成するだけであれば、Objective-C を使用して Finder サービスを作成する必要はありません。Automator は、シェル スクリプトや Applescript を使用して同じことを行うことができます。

Mac でファイルを効率的に管理したい場合は、すでに優れたユーティリティが存在します。たとえば、Butlerlaunchbar、またはQuicksilverを試してください。

于 2010-09-17T04:05:43.863 に答える