Написание службы Snow Leopard для Finder.app

В настоящее время я пытаюсь решить проблему с невозможностью быстро создавать новые файлы в Finder. Я открою исходный текст того, что я пишу, потому что я думаю, что сообщество Mac нуждается в этом решении.

В Windows вы можете щелкнуть правой кнопкой мыши, создать новый текстовый файл. OS X, вы должны быть в состоянии сделать это с помощью службы, которая будет работать так:

  • Щелкните правой кнопкой мыши> Службы> Создать новый текстовый файл

Написание сервиса Finder в Snow Leopard - теоретически способ сделать это, хотя я не смог найти ни одного примера кода. (Я признаю, что я только кратко рассмотрел документацию).

Я не уверен, с чего начать, предоставит ли Apple шаблон служб в Xcode. В основном я ищу помощь в запуске работающего сервиса. Код реализации должен быть довольно тривиальным для меня, чтобы писать в Obj-C. Итак, что я могу сделать, чтобы создать новый работающий сервисный проект? Если я ошибаюсь по этому поводу, то скажите мне правильный способ сделать это и предоставьте пример кода или некоторые шаги, чтобы начать работу.

Изменить: Поверьте мне, ребята, я не OS X нуб. Перепробовал множество приложений, чтобы обойти это: PathFinder, Automator, Terminal и т. Д., И я доволен ни одним из них.

Я хочу создать щелкающий правой кнопкой мыши пункт меню для создания новых файлов, такой же, как в Windows. Если этот API не позволяет мне сделать это, тогда я буду изменять системные файлы, если это необходимо. Но я бы предпочел сделать это таким образом, чтобы не требовать взлома OS X.

Печальный факт заключается в том, что Apple отключила сторонние пункты контекстного меню, когда Snow Leopard был выпущен, и разработчики не были довольны. Вы можете создавать сервисы в контекстном меню с помощью Automator, но оно было очень ограничено.

Да, Quicksilver - это способ создания файлов на данный момент, если только я не нахожусь в терминале, когда touch ~/Desktop/file.txt или где угодно.

Если вы не можете ответить на мой вопрос, предоставив исходный код для проекта XCode для написания Сервиса, пожалуйста, оставьте свое мнение о том, как я должен использовать свой компьютер при себе. Во всяком случае, я думаю, что, вероятно, я отвечу на свой вопрос после того, как пойду и сам осуществлю это.

1 ответ

Решение

Прочитайте Руководство по внедрению услуг. Если вам нужен рабочий пример кода, посмотрите этот проект, который я подготовил. Как объяснено в руководстве, вам нужно установить обработчик службы:

- (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.plist внутри Library/Preferences/, но это не документированный способ делать вещи.

Проблема в том, что Finder не показывает этот элемент службы, когда вы щелкаете правой кнопкой мыши пустой регион в окне Finder. Вы ничего не можете сделать с этим, кроме введения кода. Это присуще Finder поддержке сервисной системы. Если вы хотите изменить это поведение, вам нужно внедрить код в Finder.app. Это не так сложно. На Snow Leopard стандартно используется прием загрузки OSAX, описанный, например, в этом сообщении в блоге. Затем вы можете использовать функции времени выполнения Objective C для исправления поведения щелчка правой кнопкой мыши в Finder, изменив методы, описанные в этом документе Apple. (Хотя я не знаю, какой из методов Finder использует для ответа на событие щелчка правой кнопкой мыши.)

Вместо этого, если вы в порядке, нажимая кнопку на панели инструментов окна Finder вместо щелчка правой кнопкой мыши, вы можете добавить кнопку, как в этой утилите cd-to. При этом используется возможность поместить значок приложения на панель инструментов Finder. Само приложение просто читает путь переднего окна Finder через события Apple и открывает для этого окно терминала. Я думаю, что вы можете настроить код этого приложения, чтобы делать то, что вы хотите.

Здесь следуют субъективные вещи:

Честно говоря, вам не нужно использовать Objective-C для написания сервиса Finder, если вы просто хотите создать новый файл. Automator может сделать то же самое с помощью сценария оболочки и / или Applescript.

Если вы хотите эффективно управлять файлами на Mac, у вас уже есть отличные утилиты: например, попробуйте Butler, или launchbar, или Quicksilver.

Другие вопросы по тегам