diff --git a/plugins/bgnotify/README.md b/plugins/bgnotify/README.md index b154916d6..83e5c1ddf 100644 --- a/plugins/bgnotify/README.md +++ b/plugins/bgnotify/README.md @@ -1,20 +1,32 @@ -# bgnotify zsh plugin +# zsh-background-notify cross-platform background notifications for long running commands! Supports OSX and Ubuntu linux. -Standalone homepage: [t413/zsh-background-notify](https://github.com/t413/zsh-background-notify) - +![screenshot 2014-11-08 14 15 12](https://cloud.githubusercontent.com/assets/326829/4965780/19fa3eac-6795-11e4-8ed6-0355711123a9.png) ---------------------------------- +## Do you use `oh-my-zsh`? + +RobbyRussel [merged](https://github.com/robbyrussell/oh-my-zsh/pull/3301) (and [tweeted](https://twitter.com/ohmyzsh/status/569566134984265729) about it) this plugin to the main-line oh-my-zsh. If that's what you're running then just add 'bgnotify' to your `.zshrc` plugins list and you're all set! + +## Do you use `Prezto`? + +I do too! [Prezto](https://github.com/sorin-ionescu/prezto) rocks-- and works great with bg-notify! (although there's no included plugin (yet?)). + ## How to use! -Just add bgnotify to your plugins list in your `.zshrc` +1. Clone the repository: + * `git clone https://github.com/t413/zsh-background-notify.git ~/.zsh-background-notify` +2. And add one line your `.zshrc`: + * `source $HOME/.zsh-background-notify/bgnotify.plugin.zsh` +3. Done! + +## Requirements: - On OS X you'll need [terminal-notifer](https://github.com/alloy/terminal-notifier) * `brew install terminal-notifier` (or `gem install terminal-notifier`) - On ubuntu you're already all set! -- On windows you can use [notifu](http://www.paralint.com/projects/notifu/) or the Cygwin Ports libnotify package - +- On windows you can use [notifu](http://www.paralint.com/projects/notifu/) or the Cygwin Ports `libnotify` package ## Screenshots @@ -36,19 +48,35 @@ Just add bgnotify to your plugins list in your `.zshrc` One can configure a few things: - `bgnotify_threshold` sets the notification threshold time (default 6 seconds) -- `function bgnotify_formatted` lets you change the notification +- `function notify_formatted` lets you change the notification Use these by adding a function definition before the your call to source. Example: ~~~ sh bgnotify_threshold=4 ## set your own notification threshold -function bgnotify_formatted { +function notify_formatted { ## $1=exit_status, $2=command, $3=elapsed_time [ $1 -eq 0 ] && title="Holy Smokes Batman!" || title="Holy Graf Zeppelin!" bgnotify "$title -- after $3 s" "$2"; } -plugins=(git bgnotify) ## add to plugins list -source $ZSH/oh-my-zsh.sh ## existing source call +source $HOME/.zsh/zsh-background-notify/bgnotify.plugin.zsh ~~~ + + +## How it works + +In zsh you can add a user-hook `preexec` that runs before executing a command and `precmd` that runs just before re-prompting. Timing the difference between them gives you execution time! + +To check if you're in the background we can use xprop to find the NET_ACTIVE_WINDOW in ubuntu and osascript to run a simple apple script to get the same thing (although slower). + + +## Alternatives: + +I like linking.. So here are a few similar alternatives to this script. Most are platform-specific and buggy in some way. (Sure is great to use one script on all of your systems!) + +- This [reddit post](http://www.reddit.com/r/linux/comments/1pooe6/zsh_tip_notify_after_long_processes/) +- [zsh-notify](https://github.com/marzocchi/zsh-notify) plugin for Mac OS X +- [dotzsh notify](https://github.com/dotphiles/dotzsh/tree/master/modules/notify) +- [zbell](https://gist.github.com/jpouellet/5278239) diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index b70b42f98..f6dd3886c 100755 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -11,31 +11,38 @@ autoload -Uz add-zsh-hook || { print "can't add zsh hook!"; return } ## definitions ## -if ! (type bgnotify_formatted | grep -q 'function'); then - function bgnotify_formatted { - ## exit_status, command, elapsed_time - [ $1 -eq 0 ] && title="#win (took $3 s)" || title="#fail (took $3 s)" - bgnotify "$title" "$2" +if ! (type bgnotify_formatted | grep -q 'function'); then ## allow custom function override + function bgnotify_formatted { ## args: (exit_status, command, elapsed_seconds) + elapsed="$(( $3 % 60 ))s" + (( $3 >= 60 )) && elapsed="$((( $3 % 3600) / 60 ))m $elapsed" + (( $3 >= 3600 )) && elapsed="$(( $3 / 3600 ))h $elapsed" + [ $1 -eq 0 ] && bgnotify "#win (took $elapsed)" "$2" || bgnotify "#fail (took $elapsed)" "$2" } fi currentWindowId () { if hash osascript 2>/dev/null; then #osx osascript -e 'tell application (path to frontmost application as text) to id of front window' 2&> /dev/null || echo "0" - elif hash notify-send 2>/dev/null; then #ubuntu! - xprop -root | awk '/NET_ACTIVE_WINDOW/ { print $5; exit }' + elif (hash notify-send 2>/dev/null || hash kdialog 2>/dev/null); then #ubuntu! + xprop -root 2> /dev/null | awk '/NET_ACTIVE_WINDOW/{print $5;exit} END{exit !$5}' || echo "0" else echo $EPOCHSECONDS #fallback for windows fi } -bgnotify () { +bgnotify () { ## args: (title, subtitle) if hash terminal-notifier 2>/dev/null; then #osx - terminal-notifier -message "$2" -title "$1" + [[ "$TERM_PROGRAM" == 'iTerm.app' ]] && term_id='com.googlecode.iterm2' || + [[ "$TERM_PROGRAM" == 'Apple_Terminal' ]] && term_id='com.apple.terminal'; + ## now call terminal-notifier, (hopefully with $term_id!) + [ -z "$term_id" ] && terminal-notifier -message "$2" -title "$1" >/dev/null || + terminal-notifier -message "$2" -title "$1" -activate "$term_id" -sender "$term_id" >/dev/null elif hash growlnotify 2>/dev/null; then #osx growl growlnotify -m "$1" "$2" - elif hash notify-send 2>/dev/null; then #ubuntu! + elif hash notify-send 2>/dev/null; then #ubuntu gnome! notify-send "$1" "$2" + elif hash kdialog 2>/dev/null; then #ubuntu kde! + kdialog -title "$1" --passivepopup "$2" 5 elif hash notifu 2>/dev/null; then #cygwyn support! notifu /m "$2" /p "$1" fi @@ -46,7 +53,7 @@ bgnotify () { bgnotify_begin() { bgnotify_timestamp=$EPOCHSECONDS - bgnotify_lastcmd=$1 + bgnotify_lastcmd="$1" bgnotify_windowid=$(currentWindowId) } @@ -63,5 +70,8 @@ bgnotify_end() { bgnotify_timestamp=0 #reset it to 0! } -add-zsh-hook preexec bgnotify_begin -add-zsh-hook precmd bgnotify_end +## only enable if a local (non-ssh) connection +if [ -z "$SSH_CLIENT" ] && [ -z "$SSH_TTY" ]; then + add-zsh-hook preexec bgnotify_begin + add-zsh-hook precmd bgnotify_end +fi