Откройте окно терминала для указанной папки из приложения Какао - PullRequest
8 голосов
/ 19 сентября 2009

Я видел этот поток о том, как выполнять команды терминала из приложения Какао. Но я хочу запустить Terminal.app в указанном каталоге.

Я знаю, что не работает следующее:

[[NSWorkspace sharedWorkspace] openFile:folderPath withApplication:@"Terminal"];

Терминал пытается фактически открыть папку как файл.

Это то, для чего мне нужно использовать AppleScript?

Есть идеи?

Ответы [ 5 ]

14 голосов
/ 19 сентября 2009

Вы можете использовать AppleScript из Какао так:

NSString *s = [NSString stringWithFormat:
     @"tell application \"Terminal\" to do script \"cd %@\"", folderPath];

NSAppleScript *as = [[NSAppleScript alloc] initWithSource: s];
[as executeAndReturnError:nil];

Сценарий AppleScript был взят из коббала. Спасибо друг!

2 голосов
/ 19 сентября 2009

Не уверен, есть ли способ сделать это в простом какао, но в appleScript это довольно тривиально

tell application "Terminal" to do script "cd ~/Desktop"
0 голосов
/ 20 августа 2015

Вы можете использовать (в настоящее время устаревший) AppleEvent Carbon API для отправки события «Сценарий» в Terminal.app:

OSStatus doTerminalScript (NSString* script) {
    AppleEvent evt;
    OSStatus err;
        // Build event
    err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript, 
                            typeApplicationBundleID, "com.apple.terminal", 18L,
                            kAutoGenerateReturnID, kAnyTransactionID, &evt, NULL,
                            "'----':utf8(@)", strlen([script UTF8String]), [script UTF8String]);
    if (err) return err;
    AppleEvent res;
        // Send event
    err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
    AEDisposeDesc(&evt);
    if (err) return err;
        // Check for any errors from Terminal.app
    AEDesc desc;
    err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
    AEDisposeDesc(&res);
    if (!err) {
        AEGetDescData(&desc, &err, sizeof(err));
        AEDisposeDesc(&desc);
    } else if (err == errAEDescNotFound)
        err = noErr;
    return err;
}

Принятая форма здесь . Обратите внимание, что Terminal.app должен запускаться с -[NSWorkspace launchApplication:], если он не запущен. При желании его можно поставить на передний план с помощью - [NSApplication activateWithOptions:]

Как следует из комментария, его можно легко перенести на более современный Scripting Bridge API .

0 голосов
/ 19 сентября 2009

Существующие ответы, предполагающие использование команды cd, великолепны. Кроме того, я рекомендую проверить исходный код приложения cdto для отличного примера. Cdto - это быстрое мини-приложение, которое открывает окно Terminal.app cd'd для самого переднего окна поиска. Это приложение предназначено (включая его значок) для размещения на панели инструментов окна поиска.

0 голосов
/ 19 сентября 2009

Я действительно не знаю AppleScript, но держу пари, что вы можете использовать его для этого.

Если каталог терминала каждый раз один и тот же, вы можете просто создать исполняемый файл .sh с командой cd и сделать это аргументом openFile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...