To have TextMate not stall when you run a command you need to:

  1. Create a subprocess (fork).
  2. Close stdout and stderr from your process.

In bash this is as simply as adding &>/dev/null & to your command.

In ruby we provide a wrapper which will fork and close stdout/err. In addition it will catch exceptions from your code block and show via an error dialog (these would normally be suppressed when you run stuff in the background).

Here is an example:

#!/usr/bin/env ruby -KU
require "#{ENV['TM_SUPPORT_PATH']}/lib/tm/detach"
TextMate.detach do
  token = %x{"$DIALOG" nib --load RequestString}
  %x{"$DIALOG" nib --wait #{token}}
  %x{"$DIALOG" nib --dispose #{token}}
  raise "Done!"