Search code examples
macosterminalosx-mavericksosascript

Trying to automate tabs and shell commands in Terminal?


I have a custom vim setup running inside split (GNU) screen sessions running in several tabs inside Terminal. Naturally I want to automate all that. So Ive Googled a lot and most answers talk about using osascript -e to run a bunch of AppleScript commands. My situation is slightly different: first Im using TotalTerminal, a plugin for Terminal (dont think it matters but mention it just in case) and Im writing a hashbang script and not a bash script, i.e.

#!/usr/bin/osascript                                                            
tell application "System Events" to tell process "Terminal" to keystroke "t" using command down
tell application "Terminal" to activate                                         
tell application "Terminal" to do script with command "cd ~/Desktop/Projects && screen -d -U -R -A"

which Im running from the command-line. The tab opening works but the script/command runs in a new window instead of inside a newly-created tab.


Solution

  • This is how I might recommend setting things up:

    #!/usr/bin/osascript
    
    tell application "System Events"
        tell process "Terminal"
            set frontmost to true
        end tell
    end tell
    
    tell application "Terminal"
        activate
        tell application "System Events" to keystroke "t" using command down
        do script "cd ~/Desktop/Projects && screen -d -U -R -A" in window frontmost
        do script "clear; echo 'Hello, World!'" in tab 1 of window frontmost
    end tell
    

    Note: You also can select the tab you want the next command to go into by using tab x. If you switch back to the first tab you should notice the echo sent to it after creating the new tab.

    The example above is a few more lines of code perhaps, although it should get all the processes correctly in order. I think the key ingredient is having Terminal set frontmost to true which gets the current Terminal window to start interacting with the rest of the script.

    EDIT: The OP came back and needed to make a few changes and this was the end result:

    #!/usr/bin/osascript
    
    tell application "System Events"
        tell process "Terminal"
            set frontmost to true
        end tell
    end tell
    
    tell application "Terminal"
        activate
        do script "mosh user@someserver" in window frontmost
        tell application "System Events" to keystroke "t" using command down
        do script "cd ~/Desktop/Projects && screen -d -U -R -A" in tab 2 of window frontmost
    end tell