3

I am new to AppleScript and am attempting to use it.

If I am using Terminal and if I have not pressed a key for x minutes I want my Mac to press the return key. It is to repeat this process every y minutes. I would like this process to continue until I close Terminal or stop the AppleScript.

My programming attempt is below:

repeat 52 times
delay 840
tell application "Terminal"
set currentTab to do script ("Return") in front window
end tell
delay 840
end repeat
grg
  • 201,078
Sean
  • 31
  • 1
  • 2

4 Answers4

2

Why not fix it in the terminal?

I would suggest something like

while true;
  do <whatever your terminal actions is>;
  sleep 60; #sleep 60 seconds
done;

This will go in a continuos loop. When the program exits, it jumps to sleep 60. Which will cause it to sleep for 60 seconds and then jump back to the execution part.

Although this is not specifically what you asked for, this might be an easier way to deal with it.

A bit closer to what you are suggesting:

 for i in {1..52};
   do <your action>;
   sleep 840;
 done
Volsk
  • 3,040
  • This doesn't answer the OP's question. – adayzdone Mar 07 '14 at 14:22
  • 3
    Fair point. I merely put this in as an alternative approach. Sometimes having more tools/approaches, gives you new insights on how to address your problem. – Volsk Mar 07 '14 at 14:38
  • Another fair point. – adayzdone Mar 07 '14 at 14:48
  • 1
    This is an answer to the problem a reasonable person would assume exists upon reading the question - no need to delete even totally wrong answers if they move the discussion forward and could be helpful to others with a similar question. – bmike Mar 07 '14 at 19:37
  • @bmike The OP asked to "press the return key". Although Koen van Rhee answer adds a delay, it does not answer the question. – adayzdone Mar 08 '14 at 18:39
  • @adayzdone If is echo ^J it might well be a correct answer as well as any answer. – bmike Mar 09 '14 at 00:12
1

Save this as a stay open application:

on idle
    if application "Terminal" is running then
        tell application "Terminal" to set currentTab to do script "" in front window
    end if
    return (14 * minutes)
end idle
adayzdone
  • 1,898
  • 11
  • 11
1

What problem are you trying to solve?

For instance, that's a common behavior of an SSH client, and is more easily, and better, solved by adding ServerAliveInterval 60 to your ssh config.

wgj
  • 111
0

There are two key parts to your AppleScript, pressing a key and performing a task after inactivity.

Pressing a key

Automating a key press in AppleScript is well covered; the accepted answer to the linked question suggests:

tell application "System Events" to key code 36

Performing when inactive

The second part, performing a task when your Mac has been idle is more tricky. You can use third party software to schedule your AppleScript after inactivity, or you can use a scripted approach to extract the idle time information from the system:

ioreg -c IOHIDSystem | perl -ane 'if(/Idle/) {$idle=(pop @F)/1000000000; print $idle, "\n"; last;}'

Wrapping this up in AppleScript becomes:

set inactive_seconds to do shell script "ioreg -c IOHIDSystem | perl -ane 'if(/Idle/) {$idle=(pop @F)/1000000000; print $idle, \"
\"; last;}'"

Where inactive_seconds contains the number of inactive seconds.

Putting it together

Putting it together depends on your looping approach. Consider a while loop that checks if the Terminal.app is running. John Gruber's article will be helpful for this, How to Determine if a Certain App Is Running Using AppleScript and Perl:

tell application "System Events"
    count (every process whose name is "Terminal")
end tell

The greater while loop could be:

tell application "System Events"
    repeat while ((count (every process whose name is "Terminal")) > 0)

        -- check idle time and conditionally perform key press
        -- wait n minutes to avoid excessive polling

    end repeat
end tell
Graham Miln
  • 43,776