2009-11-25 8 views
6

J'ai deux fenêtres/onglets configurés pour s'exécuter dans Terminal.app, "syd" et "mel". c'est-à-dire dans Shell | Nouvelle fenêtre, "syd" et "mel" sont listés. Comment puis-je ouvrir ces configurations de terminal avec AppleScript?AppleScript pour ouvrir la fenêtre du terminal nommé

Répondre

22

Il y a quelques semaines, je migrés une nouvelle machine de Snow Leopard (10.6) d'une machine Tiger (10.4). Le terminal de Tiger stockait ses paramètres dans des fichiers ".term" (généralement en ~/Library/Application Support/Terminal/, mais ils pouvaient être enregistrés/déplacés n'importe où); Le terminal de Snow Leopard a centralisé ses paramètres dans son fichier de préférences.

Avant de migrer vers Snow Leopard une partie d'un de mes flux de travail normaux utilisait Finder double-cliquer sur un fichier enregistré « .term » pour ouvrir une fenêtre Terminal avec une taille prédéfinie et commande initiale. Aujourd'hui, j'ai remarqué que chaque fois que je l'ai fait Terminal était en train de créer un "ensemble de paramètres" en double. Donc, j'ai commencé à chercher un moyen de démarrer un paramètre sauvegardé qui n'impliquait pas l'ouverture d'un fichier ".term" (de sorte que les paramètres en double ne s'accumulent pas); AppleScript a été mon premier arrêt depuis que j'en ai déjà fait l'expérience. En résumé, il semble qu'il n'y ait pas de moyen direct de démarrer une nouvelle fenêtre/onglet avec un "ensemble de paramètres" particulier via les commandes AppleScript du Terminal. L'approche habituelle serait de faire quelque chose impliquant make new window (ou make new tab), mais je ne pouvais pas trouver une variation que Terminal accepterait. J'ai trouvé trois solutions alternatives (la dernière est la meilleure, à mon avis).

Créer une fenêtre, puis sur Modifier les paramètres

Si vos paramètres ne comportent pas une commande initiale ou une taille différente de vos paramètres par défaut (par exemple uniquement couleur/clavier/paramètres de comportement sont différents de la valeur par défaut), vous pourriez utilisez la commande du terminaldo script (sans paramètre "texte") pour créer une nouvelle fenêtre et changez ensuite settings set en celle que vous vouliez. Cela peut fonctionner pour vous, mais ce n'était pas approprié pour mes besoins, j'ai donc continué ma recherche.

de terminaldefault settings

Ensuite, je regardai à la propriété default settings. Je pensais qu'il serait possible de changer temporairement le réglage par défaut, créer une nouvelle fenêtre, puis réinitialiser le paramètre par défaut. Cette approche a finalement été couronnée de succès, mais elle s'est révélée plutôt moche (outre la laideur du changement temporaire des valeurs par défaut).

I utilisé System Events » commande keystroke envoyer un ⌘N à Terminal pour créer la nouvelle fenêtre. Il s'avère que Terminal est parfois un peu lent pour créer la nouvelle fenêtre et mon script finirait par réinitialiser la valeur par défaut avant que Terminal avait une chance d'utiliser la valeur temporaire de la partie précédente du script avait arrangé.do script aurait été synchrone, mais cela annulerait également toute commande initiale enregistrée dans le cadre des paramètres. J'ai fini par devoir compter le nombre de fenêtres avant le ⌘N et attendre que le nombre de fenêtres augmente. Si la commande lancée entraîne une ouverture et une fermeture très rapide d'une fenêtre, il y a une chance que cette boucle soit bloquée. Je pourrais limiter les itérations, mais à ce stade, j'ai été assez déçu par la saveur générale du code (bien que je sois allé de l'avant et l'ai étendu pour permettre de nouveaux onglets au lieu de simplement les fenêtres).

to newTerminal(settingSetName, asTab) 
    tell application "Terminal" 
     if asTab is true then 
      set countRef to a reference to tabs of first window 
      set newKey to "t" 
     else 
      set countRef to a reference to windows 
      set newKey to "n" 
     end if 
     set originalDefault to name of default settings 
     set default settings to settings set settingSetName 
    end tell 
    try 
     set initialCount to count of countRef 
     tell application "System Events" 
      -- keystrokes always go to the frontmost application 
      set frontmost of application process "Terminal" to true 
      keystroke newKey using command down 
     end tell 
     repeat until (count of countRef) > initialCount 
      beep 
      delay 0.1 
     end repeat 

     tell application "Terminal" to set default settings to settings set originalDefault 
    on error m number n 
     try 
      tell application "Terminal" to set default settings to settings set originalDefault 
     end try 
     error m number n 
    end try 
end newTerminal 

newTerminal("Grass", false) 

Cliquez sur un élément de menu via System Events

Avec System Events, il existe un moyen d'activer directement les éléments du menu Shell>Nouvel onglet et Shell>Nouvelle fenêtre. Cela nécessite que «l'accès pour les appareils fonctionnels» soit activé (près du bas du panneau de préférences Universal Access), je l'ai généralement activé parce que le script GUI qui peut ensuite être effectué via System Events est souvent le seul (bon) moyen de accomplir certaines tâches d'automatisation). Bien que la variation antérieure utilise également Événements système, son utilisation très limitée ne nécessite pas «l'accès pour les appareils fonctionnels».

(* makeNewTerminal(settingsSetName, asTab) 

    Bring Terminal.app to the front and 
     click the menu item named <settingsSetName>. 
     If <asTab> is true, then use the menu item under Shell > New Tab, 
      otherwise use the menu item under Shell > New Window 
*) 
to makeNewTerminal(settingsSetName, asTab) 
    tell application "Terminal" to launch 
    if asTab is true then 
     set submenuName to "New Tab" 
    else 
     set submenuName to "New Window" 
    end if 
    tell application "System Events" 
     set terminal to application process "Terminal" 
     set frontmost of terminal to true 
     click menu item settingsSetName of ¬ 
      first menu of menu item submenuName of ¬ 
      first menu of menu bar item "Shell" of ¬ 
      first menu bar of terminal 
    end tell 
end makeNewTerminal 

makeNewTerminal("Grass", true) 

Cette approche permet d'automatiser littéralement la sélection et l'activation de l'un des éléments du menu de l'Menu Shell. Cela nécessite un «accès pour les appareils fonctionnels», mais le code est beaucoup plus simple et comporte moins de zones problématiques (le problème majeur avec ce code est la localisation).

+5

REMARQUE: 'do script' renvoie un spécificateur d'objet pour le nouvel onglet/la nouvelle fenêtre. Utilisez simplement le résultat de cela pour envoyer des commandes supplémentaires à ce terminal. Ne pas coder en dur le premier onglet de la première fenêtre. Par exemple: 'set theTerminal to do script',' définir les paramètres actuels deTerminal sur les paramètres définis "Grass" ' –

0

devrait être quelque chose comme ceci:

tell application "Finder" 
    open file "MyDisk:Users:myhome:Library:Application Support:Terminal:myconfig.terminal" 
end tell 
+0

Je suis sur Snow Leopard (10.6) et je n'ai pas de répertoire '~/Library/Application Support/Terminal' - cela a-t-il changé? La config semble être dans '~/Library/Preferences/com.apple.Terminal.plist' maintenant. – mjs

+0

Doit avoir; Je n'ai pas de machine SL à voir. Il y a http://iterm.sourceforge.net/ comme un remplacement de terminal qui prend en charge applescript, onglets, signets. – markratledge

Questions connexes