【问题标题】:Writing a Snow Leopard Service for Finder.app为 Finder.app 编写雪豹服务
【发布时间】:2011-04-13 12:38:52
【问题描述】:

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

在 Windows 上,您可以右键单击,创建新的文本文件。 OS X,您应该能够使用这样的服务来做到这一点:

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

在 Snow Leopard 中编写 Finder Service 理论上是实现此目的的方法,尽管我还没有找到任何示例代码。 (我承认我只是非常简短地查看了文档)。

我不确定如何开始,Apple 是否在 Xcode 中提供了服务模板。基本上,我正在寻求帮助以使工作服务项目运行。实现代码对我来说用 Obj-C 编写应该是相当简单的。那么我可以做些什么来创建一个新的工作服务项目呢?如果我对此有误,请告诉我正确的方法,并请提供示例代码或一些步骤让我开始。

编辑:相信我,伙计们,我不是 OS X 菜鸟。尝试了许多应用程序来解决问题:PathFinder、Automator、Terminal 等,但我对它们都不满意。

我想创建一个可右键单击的菜单项来创建新文件,就像 Windows 一样。如果这个 API 不允许我这样做,那么我会在必要时修改系统文件。但我宁愿以不需要我破解 OS X 的方式来做。

可悲的事实是,Apple 在 Snow Leopard 发布时禁用了第 3 方上下文菜单项,而开发人员对此并不满意。您可以使用 Automator 在上下文菜单下创建服务,但非常有限。

是的,Quicksilver 是我目前创建文件的方式,除非我在 touch ~/Desktop/file.txt 或其他任何地方时在终端中。

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

【问题讨论】:

    标签: objective-c cocoa osx-snow-leopard application-design


    【解决方案1】:

    阅读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 使用哪种方法来响应右键单击事件。)

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

    这里是主观的东西:

    老实说,如果您只想创建一个新文件,则不必使用 Objective-C 编写 Finder 服务。 Automator 可以用 shell 脚本和/或 Applescript 做同样的事情。

    如果您想在 Mac 上有效地管理文件,周围已经有很多很棒的实用程序:例如,试试 ButlerlaunchbarQuicksilver

    【讨论】:

    • Automator 是有限的。它不允许您创建用于创建新文本文件的操作。我完全忘记了细节,但我前段时间尝试过,但无法实现。无论如何,我不想使用 Automator。我想在代码中做到这一点。
    • @Yuji:“从 Dock 或 Spotlight 打开应用程序。”这不是一步。 (1) 打开应用程序,(2) Command+S (3) 将finder窗口的代理拖到App保存对话框中。有时我必须根据窗口大小和打开的应用程序来 Alt-Tab (4) 按 Enter 键保存文件。 ---- 至少 4 个步骤。
    • 您是否尝试过 Automator 中的“运行 shell 脚本”操作?你可以用它做任何你想做的事。 Automator 将文件夹名称传递给 shell 脚本。一个shell脚本就是一个代码,对吧?不幸的是,您不能右键单击 Finder 窗口的空白部分来调用该服务;相反,您需要右键单击要在其中创建文件的文件夹。我认为这个限制不是 Automator 的限制,而是服务系统本身的限制。
    • 至于您的第二条评论,您首先确定在哪个目录中创建文件和名称?你为什么不处理一段时间的无标题文件?当你打开一个应用程序时,你会立即执行(2)、(3)和(4)吗?好吧,每个人都有他/她的方式......
    • 右键?用鼠标?多么复古!我想我会坚持使用 Quicksilver 或 LaunchBar 中的一两个键。
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2010-11-25
    相关资源
    最近更新 更多