2009-09-18 4 views
8

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

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

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

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

Для этого я должен использовать AppleScript?

Любые идеи?

ответ

14

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

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

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

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

+0

отлично, спасибо! –

+1

Несмотря на то, что для этого использования может быть излишним, скриптовый мост (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html) является хорошим решением для общения с внешними приложениями через AppleScript из приложений Objective-C. –

+0

будьте осторожны с папками с кавычками или пробелами в них, хотя – cobbal

2

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

tell application "Terminal" to do script "cd ~/Desktop" 
+0

спасибо, вы и woofy решили это! –

0

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

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

0

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

0

Вы можете использовать (теперь устаревшее) AppleEvent Carbon API для отправки "Do сценария" событие 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; 
} 

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

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