2009-09-18 7 views
8

J'ai vu cette discussion sur la façon d'exécuter des commandes de terminal à partir d'une application Cocoa. Mais je veux réellement lancer Terminal.app dans un répertoire spécifié.Ouverture d'une fenêtre de terminal vers un dossier spécifié à partir d'une application Cocoa

Je sais que ce qui suit ne fonctionne pas:

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

Terminal tente d'ouvrir réellement le dossier en tant que fichier.

Est-ce quelque chose que je dois utiliser pour AppleScript?

Des idées?

Répondre

14

Vous pouvez utiliser AppleScript de cacao comme ceci:

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

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

scénario AppleScript a été prise de cobbal. Merci mon pote!

+0

parfait, merci! –

+1

Bien que peut-être exagéré pour cette utilisation, le Scripting Bridge (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html) est une bonne solution pour communiquer avec des applications externes via AppleScript dans les applications Objective-C. –

+0

faites attention aux dossiers avec des guillemets ou des espaces en eux si – cobbal

2

Je ne sais pas s'il y a une façon de le faire dans le cacao ordinaire, mais en AppleScript il est assez trivial

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

merci, vous et woofy l'avez résolu! –

0

Je ne sais pas vraiment AppleScript, mais je parie que vous pouvez l'utiliser pour cela.

Si le répertoire du terminal est le même à chaque fois, vous pouvez simplement créer un fichier .sh exécutable avec une commande cd et en faire l'argument openFile.

0

Les réponses existantes suggérant l'utilisation de la commande cd sont excellentes. En outre, je recommande de vérifier la source de l'application cdto pour un bon exemple. Cdto est une mini application rapide qui ouvre une fenêtre Terminal.app cd'd dans la fenêtre de recherche la plus en avant. Cette application est conçue (y compris son icône) à placer dans la barre d'outils de la fenêtre de recherche.

0

Vous pouvez utiliser le (désormais obsolète) AppleEvent API Carbon pour envoyer un événement "Do Script" à 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; 
} 

forme prise here. Notez que Terminal.app doit être lancé avec -[NSWorkspace launchApplication:] s'il n'est pas en cours d'exécution. Si vous le souhaitez, il peut être mis au premier plan avec - [NSApplication activateWithOptions:]

Comme le suggère un commentaire, cela peut être facilement porté à la Scripting Bridge API plus moderne.

Questions connexes