A Hacky Way to Send Notifications From a Development Machine on iTerm2
When hacking on something in a language that’s compiled, some compiles take a long time. So long that it doesn’t make sense to wait and watch it. You can do some lightweight tasks in the meantime - respond to emails, review diffs… The problem is, unless you leave your terminal visible, you won’t know it’s done the moment it is done.
The solution is to send a notification once it’s compiled.
This is not a new idea, iTerm2 has support for notifications from within a
terminal via a special escape code. Problem solved? Kind of. If you only use
iTerm2, then it works like a charm. But if you use a combination of iTerm2
+ mosh + tmux the escape code gets lost somewhere and iTerm2 never sees
it.
So I came up with a hack. The idea is to use iTerm2’s built-in trigger system.
iTerm2 lets you set up a trigger, so that when a certain text appears it runs
a command. Let’s use it!
First we need to set up the trigger. In the Session preferences on the
Advanced tab there’s a Triggers section. The trigger you want to add is:
| Regular Expression | Action | Parameters |
|---|---|---|
iTermNotify (.*) |
Run Command… | osascript -e 'display notification "\1" with title "iTerm2"' |
Then on your devserver you want to add this function to your .bashrc:
function iterm_notify() {
echo && echo -en iTerm""Notify "$@\r" && sleep 1 && echo " "
}
And then when want to you get notified after the build finishes you do:
$ make; iterm_notify "build finished!"
iterm_notify deserves a bit of explanation. Why not just
echo -en iTermNotify "$@"? The problem is, if you open vim right after the
notification was shown and close it, the notification will happen again.
To solve this, I first write the desired string without a newline
(-n option for echo) and then use the carriage return character ("\r") to
go to the beginning of the line and overwrite the first few characters with the
second echo. This didn’t work reliably before I added sleep 1 in between
and a newline before (first echo). Now for the last part. Why iTerm""Notify
instead of iTermNotify? This is because I don’t want a notification to pop-up
every time I edit my .bashrc.
Hopefully this is useful to someone, enjoy!