Написание службы Snow Leopard для Finder.app - PullRequest
7 голосов
/ 17 сентября 2010

Я сейчас ищу решение проблемы с невозможностью быстрого создания новых файлов в 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 Ответ

13 голосов
/ 17 сентября 2010

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

- (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 . *

...