Way back in 2011, I wrote a blog post showing how to Run Tests from MacVim via Terminal.app or iTerm.app. I’ve been using that setup for years without a problem, but when iTerm2 Version 3 was released, it stopped working. I’ve updated the AppleScript and am posting it here for anyone who wants to run tests in iTerm2 (Version 3) while writing code in Vim.
The Release Notes for Version 3 specifically point out that while the AppleScript has been improved, it’s not backward-compatible. After reading through the Scripting Documentation, I was able to modify the original run_command.applescript
file so that it now works with iTerm2 Version 3 (but no longer works with older versions of iTerm2).
As I stated in my original post, I’m no AppleScript expert. I’ve only learned enough to get this working, and then to fix it when it broke. It works again, and that means I can get back to my preferred workflow of editing in Vim and running the tests in a terminal window.
Here’s the updated script:
on appIsRunning(appName) tell application "System Events" to (name of processes) contains appName end appIsRunning on execInModernItermTab(_window, _tab, _session, _command) tell application "iTerm" activate tell _tab select end tell _window select end tell tell current session of current window write text _command end tell end tell end execInModernItermTab on execInTerminalTab(_window, _tab, _command) tell application "Terminal" activate set frontmost of _window to true set selected of _tab to true do script _command in _tab end end execInTerminalTab on run argv set _command to item 1 of argv set _foundTab to false -- Second arguments shoul be the tty to look for if length of argv is 2 if appIsRunning("iTerm2") then tell application "iTerm" set _foundTab to false repeat with w in windows tell w repeat with t in tabs tell t repeat with s in sessions set _tty to (tty of s) if _tty = (item 2 of argv)then set _foundTab to true set _session to s set _tab to t set _window to w exit repeat end if end repeat end tell if _foundTab then exit repeat end if end repeat end tell if _foundTab then exit repeat end if end repeat end tell if _foundTab then execInModernItermTab(_window, _tab, _session, _command) end if end if if not _foundTab and appIsRunning("Terminal") then tell application "Terminal" repeat with w in windows tell w repeat with t in tabs set _tty to (tty of t) if _tty = (item 2 of argv) then set _foundTab to true set _window to w set _tab to t exit repeat end if end repeat end tell if _foundTab then exit repeat end if end repeat end tell if _foundTab then execInTerminalTab(_window, _tab, _command) end if end if end if end run |
Hope this is helpful for you.