2010-09-17 70 views
7

我目前正在研究解決無法在Finder中快速創建新文件的問題。我將開放源代碼,因爲我認爲Mac社區需要解決這個問題。爲Finder.app編寫雪豹服務

在Windows上,您可以右鍵單擊,創建新的文本文件。 OS X,你應該能夠與將工作像這樣的服務要做到這一點:

  • 右鍵 - >服務> Snow Leopard中創建新的文本文件

寫一個Finder Service是理論上是完成這個任務的方法,儘管我還沒有找到任何示例代碼。 (我承認我只是簡單地看過文檔)。

我不確定如何開始,Apple是否在Xcode中提供了一個Services模板。基本上我正在尋找幫助獲得正在運行的服務項目。那麼對於我在Obj-C中編寫實現代碼應該是相當微不足道的。那麼我能做些什麼來創建一個新的工作服務項目?如果我對此有誤,請告訴我這樣做的正確方法,並請提供示例代碼或一些步驟讓我開始。

編輯:相信我,我不是OS X noob。已經嘗試了很多應用程序來實現解決方法:路徑查找器,Automator,終端等,我很高興與他們沒有一個。

我想創建一個可以右鍵單擊的菜單項來創建新文件,就像Windows一樣。如果這個API不讓我這樣做,那麼我會在必要時修改系統文件。但我寧願這樣做,並不需要我破解OS X.

令人遺憾的事實是,當Snow Leopard發佈並且開發人員不開心時,Apple禁用第三方上下文菜單項。您可以使用Automator在上下文菜單下創建服務,但它非常有限。

是的,Quicksilver是我現在創建文件的方式,除非我在終端上時,我可以在任何地方使用touch ~/Desktop/file.txt

如果您無法通過提供用於編寫​​服務的Xcode項目的源代碼來回答我的問題,請將您的意見告訴我如何將自己的計算機用於自己。無論如何,我想我可能會在我自己去實施這個之後回答我自己的問題。

回答

13

閱讀Services Implementation Guide。如果你想要一個工作示例代碼,請參閱this project我熟了。由於手冊的說明,你需要做的是安裝服務處理器:

- (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的「鍵盤快捷鍵」部分中的服務條目。如果你想自動打開它,你可以在Library/Preferences/的內部寫入pbs.plist,但這不是記錄的做事方式。

問題是,當您在Finder窗口中右鍵單擊空白區域時,Finder不顯示此服務項目。除了注入代碼之外,你無法對它做任何事情。這是Finder對服務系統的支持所固有的。如果你想改變這種行爲,你需要在Finder.app中注入代碼。這並不難。在Snow Leopard上,使用OSAX加載技巧是標準的,在例如in this blog post。然後,您可以使用Objective-C運行時函數修改Finder的右鍵單擊行爲,方法是更改​​in this Apple document所述的方法。 (我不知道該方法查找的使用向右鍵單擊事件做出響應,雖然)。

相反,如果你用點擊的右Finder窗口的工具欄上的按鈕而不是OK點擊,您可以添加一個按鈕,如在此實用程序cd-to中。這使用將應用程序的圖標放到Finder工具欄的功能。該應用程序本身只是通過Apple事件讀取最前面的Finder窗口的路徑,併爲此打開一個終端窗口。我認爲你可以調整這個應用程序的代碼來做你想做的事情。

下面就跟隨主觀的東西:

老實說,你不必使用的Objective-C編寫一個搜索服務,如果你只想做一個新的文件。 Automator可以使用shell腳本和/或Applescript來做同樣的事情。

如果您想要在Mac上高效地管理文件,那麼已有很多實用程序:例如,嘗試ButlerlaunchbarQuicksilver

+0

的Automator是有限的。它不會讓您創建用於創建新文本文件的操作。我完全忘記了細節,但是我前一段時間嘗試過,無法實現這一點。無論如何,我不想使用Automator。我想在代碼中這樣做。 – 2010-09-17 04:17:40

+0

@Yuji:「從Dock或Spotlight打開應用程序。」這不是一步。 (1)打開應用程序,(2)Command + S(3)將查找器窗口的代理拖到App保存對話框中。有時我必須根據窗口大小和應用程序的打開情況來選擇Alt-Tab(4)按回車鍵保存文件。 ----至少4個步驟。 – 2010-09-17 04:22:13

+0

您是否在Automator中嘗試了「運行shell腳本」操作?你可以隨心所欲地做任何事情。 Automator將文件夾名稱傳遞給shell腳本。 shell腳本是一個代碼,對吧?不幸的是,您不能右鍵單擊Finder窗口的空白部分來調用該服務;相反,您需要右鍵單擊要在其中創建文件的文件夾。我認爲這種限制不是Automator的限制,而是服務系統本身的限制。 – Yuji 2010-09-17 04:34:55