为Finder.app编写Snow Leopard服务

Bro*_*olf 7 cocoa objective-c application-design osx-snow-leopard

我目前正在寻找解决问题,因为无法在Finder中快速创建新文件.我将开源我写的东西因为我认为Mac社区需要解决这个问题.

在Windows上,您可以右键单击,创建新的文本文件.OS X,您应该可以使用这样的服务来执行此操作:

  • 右键单击>服务>创建新文本文件

在Snow Leopard中编写Finder 服务理论上是实现这一目标的方法,尽管我还没有找到任何示例代码.(我承认我只是简单地查看了文档).

我不确定如何开始,Apple是否在Xcode中提供服务模板.基本上我正在寻找帮助以使运行的工作服务项目.那么实现代码对于我在Obj-C中编写应该是相当微不足道的.那么我该怎么做才能创建一个新的工作服务项目呢?如果我对此有误,请告诉我正确的方法,请提供示例代码或一些步骤让我开始.

编辑:相信我们,我不是OS X菜鸟.尝试了很多应用程序来实现解决方案:PathFinder,Automator,终端等,我对它们都不满意.

我想创建一个可右键单击的菜单项来创建新文件,就像Windows一样.如果此API不允许我这样做,那么我将在必要时修改系统文件.但我宁愿这样做也不需要我攻击OS X.

可悲的事实是,当Snow Leopard发布并且开发者不满意时,Apple禁用了第三方上下文菜单项.您可以使用Automator在上下文菜单下创建服务,但它非常有限.

是的,Quicksilver是我此刻创建文件的方式,除非我在我touch ~/Desktop/file.txt或任何地方都在终端.

如果您无法通过提供Xcode项目的源代码来编写服务来回答我的问题,请保留您对我应该如何使用计算机的意见.无论如何,我想在我自己实施之后,我可能会回答我自己的问题.

Yuj*_*uji 13

阅读服务实施指南.如果你想要一个可用的示例代码,请参阅我编写的这个项目.如指南中所述,您需要做的是安装服务处理程序:

- (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...
    }
}
Run Code Online (Sandbox Code Playgroud)

并在你的广告中做广告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>
Run Code Online (Sandbox Code Playgroud)

它就这么简单!您可能需要手动打开System Preferences.app的"键盘快捷方式"部分中的服务条目.如果你想自动打开它,你可以写入pbs.plist内部Library/Preferences/,但这不是一种记录的做事方式.

问题是当您在Finder窗口中右键单击空白区域时,Finder不显示此服务项.除了注入代码之外,你无法用它做任何事情.这是Finder对服务系统的支持所固有的.如果要更改该行为,则需要在Finder.app中注入代码.那并不难.在Snow Leopard上,使用OSAX加载技巧是标准的,例如在本博文中描述.然后,您可以通过更改此Apple文档中描述的方法,使用Objective-C运行时函数来修补右键单击Finder的行为.(但我不知道Finder使用哪种方法来响应右键单击事件.)

相反,如果您可以单击Finder窗口工具栏上的按钮而不是右键单击,则可以添加一个按钮,就像在此实用程序cd-to中一样.这使用了将应用程序的图标放到Finder工具栏的功能.应用程序本身只是通过Apple事件读取最前面的Finder窗口的路径,并打开一个终端窗口.我想你可以调整这个应用程序的代码来做你想要的.

这里遵循主观的东西:

老实说,如果您只想创建一个新文件,则不必使用Objective-C编写Finder服务.Automator可以使用shell脚本和/或Applescript执行相同的操作.

如果你想在Mac上有效地管理文件,那么已经有了很好的实用工具:例如尝试使用ButlerlaunchbarQuicksilver.