title: Save and restore applications and layout
body: <p>I'm looking for ways to reduce the wasted time spent to open all the applications needed, position windows, open urls/files/change directories/etc. before actual coding starts.</p>
  
  <p>In the perfect world there would be 2 buttons marked 'SAVE STATE' and 'RESTORE STATE' per 'project'. The kind of feature you find in some games.</p>
  
  <p>I'm on a mac and just spent afew hours banging my head with 'Automator' (which for some reason has problems to even open firefox from the dock) and then applescript (which gives me the feeling i'm in for a long ride).</p>
  
  <p>Searching on the net led me to this script:</p>
  
  <p><a href="http://snipt.net/Fotinakis/applescript-to-save-and-restore-window-positions/" rel="noreferrer">http://snipt.net/Fotinakis/applescript-to-save-and-restore-window-positions/</a></p>
  
  <pre><code>#!/usr/bin/osascript
  
  -- Usage:
  -- $ osacompile -o windowPositions.compiled.scpt windowPositions.scpt
  -- $ osascript windowPositions.compiled.scpt --save
  -- $ osascript windowPositions.compiled.scpt --restore
  
  -- Change this to be the list of windows you want to save/restore
  property affectedProcesses : {"Chrome", "Adium", "Eclipse", "Terminal"}
  property windowRecord : {}
  
  on run argv
   if (count of argv) is equal to 0 then
    log "Please specify one of --save or --restore."
    return
   end if
  
   tell application "System Events"
    if (item 1 of argv is equal to "--save") then
     set windowRecord to {}
     repeat with i from 1 to count affectedProcesses
      set end of windowRecord to {0, {}, {}}
     end repeat
     repeat with p from 1 to count affectedProcesses
      set processName to (item p of affectedProcesses)
      if exists process processName then
       log "Process '" &amp; processName &amp; "' exists"
       tell process processName
        set numWindows to count windows
        set item 1 of item p of windowRecord to numWindows
        repeat with i from 1 to numWindows
         set end of item 2 of item p of windowRecord to position of window i
         set end of item 3 of item p of windowRecord to size of window i
        end repeat
       end tell
      end if
     end repeat
    else
     repeat with p from 1 to count affectedProcesses
      set processName to (item p of affectedProcesses)
      if exists process processName then
       log "Process '" &amp; processName &amp; "' exists"
       tell process processName
        set numWindows to item 1 of item p of windowRecord
        repeat with i from 1 to numWindows
         set position of window i to (item i of item 2 of item p of windowRecord)
         set size of window i to (item i of item 3 of item p of windowRecord)
        end repeat
       end tell
      end if
     end repeat
    end if
   end tell
  end run
  </code></pre>
  
  <p>It does half the job (resize and position current windows) but falls apart on a multi-monitor multi-desktops setup. There is no contact info for the original author to ask for help or feedback.</p>
  
  <p>Can anyone shed some light on saving and restoring applications and layout? It feels like such a common task that ought to have some helper utilities. The best I have is the 'sleep mode' but it seems I have to to do a full restart every other day and I have different applications and layout for different projects.</p>