From e16d3e45d30fbf981f503b4d078d84c71a070a1d Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Thu, 6 Nov 2014 10:34:26 -0800 Subject: [PATCH 1/7] Add bgnotify plugin, a cross-platform background notifier! --- plugins/bgnotify/README.md | 39 +++++++++++++++++ plugins/bgnotify/bgnotify.plugin.zsh | 65 ++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 plugins/bgnotify/README.md create mode 100755 plugins/bgnotify/bgnotify.plugin.zsh diff --git a/plugins/bgnotify/README.md b/plugins/bgnotify/README.md new file mode 100644 index 000000000..bf4b1fd09 --- /dev/null +++ b/plugins/bgnotify/README.md @@ -0,0 +1,39 @@ +# bgnotify zsh plugin + +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) + +---------------------------------- + +## How to use! + +Just add bgnotify to your plugins list in your `.zshrc` + +- 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! + + +## Configuration + +One can configure a few things: + +- `bgnotify_threshold` sets the notification threshold time (default 6 seconds) +- `function bgnotify_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 { + ## $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 +~~~ + diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh new file mode 100755 index 000000000..f204d9dc8 --- /dev/null +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -0,0 +1,65 @@ +#!/usr/bin/env zsh + + +## setup ## + +[[ -o interactive ]] || return #interactive only! +zmodload zsh/datetime || { print "can't load zsh/datetime"; return } # faster than date() +autoload -Uz add-zsh-hook || { print "can't add zsh hook!"; return } + +(( ${+bgnotify_threshold} )) || bgnotify_threshold=5 #default 10 seconds + + +## definitions ## + +if ! (type notify_formatted | grep -q 'function'); then + echo "using default notify_formatted" + function bgnotify_formatted { + ## exit_status, command, elapsed_time + [ $1 -eq 0 ] && title="#win (took $3 s)" || title="#fail (took $3 s)" + bgnotify "$title" "$2" + } +fi + +currentWindowId () { + if hash notify-send 2>/dev/null; then #ubuntu! + xprop -root | awk '/NET_ACTIVE_WINDOW/ { print $5; exit }' + elif 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 + fi +} + +bgnotify () { + if hash notify-send 2>/dev/null; then #ubuntu! + notify-send $1 $2 + elif hash terminal-notifier 2>/dev/null; then #osx + terminal-notifier -message $2 -title $1 + elif hash growlnotify 2>/dev/null; then #osx growl + growlnotify -m $1 $2 + fi +} + + +## Zsh hooks ## + +bgnotify_begin() { + bgnotify_timestamp=$EPOCHSECONDS + bgnotify_lastcmd=$1 + bgnotify_windowid=$(currentWindowId) +} + +bgnotify_end() { + didexit=$? + elapsed=$(( $EPOCHSECONDS - $bgnotify_timestamp )) + past_threshold=$(( $elapsed >= $bgnotify_threshold )) + if (( bgnotify_timestamp > 0 )) && (( past_threshold )); then + if [ $(currentWindowId) != "$bgnotify_windowid" ]; then + print -n "\a" + bgnotify_formatted "$didexit" "$bgnotify_lastcmd" "$elapsed" + fi + fi + bgnotify_timestamp=0 #reset it to 0! +} + +add-zsh-hook preexec bgnotify_begin +add-zsh-hook precmd bgnotify_end From 0b0cc2cdea1e3b3e4af78d8d4a9992be468031eb Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Thu, 6 Nov 2014 10:31:27 -0800 Subject: [PATCH 2/7] Fixed math on linux, removed debug echo. --- plugins/bgnotify/bgnotify.plugin.zsh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index f204d9dc8..b5fb76f7e 100755 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -13,7 +13,6 @@ autoload -Uz add-zsh-hook || { print "can't add zsh hook!"; return } ## definitions ## if ! (type notify_formatted | grep -q 'function'); then - echo "using default notify_formatted" function bgnotify_formatted { ## exit_status, command, elapsed_time [ $1 -eq 0 ] && title="#win (took $3 s)" || title="#fail (took $3 s)" @@ -50,8 +49,8 @@ bgnotify_begin() { bgnotify_end() { didexit=$? - elapsed=$(( $EPOCHSECONDS - $bgnotify_timestamp )) - past_threshold=$(( $elapsed >= $bgnotify_threshold )) + elapsed=$(( EPOCHSECONDS - bgnotify_timestamp )) + past_threshold=$(( elapsed >= bgnotify_threshold )) if (( bgnotify_timestamp > 0 )) && (( past_threshold )); then if [ $(currentWindowId) != "$bgnotify_windowid" ]; then print -n "\a" From adafe271f02ab767c29f80f5657f448d593cdaf6 Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Thu, 6 Nov 2014 10:32:29 -0800 Subject: [PATCH 3/7] add cygwin windows support with notifu, add to readme --- plugins/bgnotify/README.md | 2 +- plugins/bgnotify/bgnotify.plugin.zsh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/bgnotify/README.md b/plugins/bgnotify/README.md index bf4b1fd09..68fa7529e 100644 --- a/plugins/bgnotify/README.md +++ b/plugins/bgnotify/README.md @@ -13,6 +13,7 @@ Just add bgnotify to your plugins list in your `.zshrc` - 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 ## Configuration @@ -36,4 +37,3 @@ function bgnotify_formatted { plugins=(git bgnotify) ## add to plugins list source $ZSH/oh-my-zsh.sh ## existing source call ~~~ - diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index b5fb76f7e..42129bd06 100755 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -35,6 +35,8 @@ bgnotify () { terminal-notifier -message $2 -title $1 elif hash growlnotify 2>/dev/null; then #osx growl growlnotify -m $1 $2 + elif hash notifu 2>/dev/null; then #cygwyn support! + notifu /m "$2" /p "$1" fi } From 3d376bbd5b0a230e9e1a2d5497623d92ec94615e Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Fri, 7 Nov 2014 08:35:31 -0800 Subject: [PATCH 4/7] Fix renamed method issue. --- plugins/bgnotify/bgnotify.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index 42129bd06..722213734 100755 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -12,7 +12,7 @@ autoload -Uz add-zsh-hook || { print "can't add zsh hook!"; return } ## definitions ## -if ! (type notify_formatted | grep -q 'function'); then +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)" From cbec1d77b2b238eadcdad5d926339d4a034240e9 Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Fri, 7 Nov 2014 10:57:02 -0800 Subject: [PATCH 5/7] Add window ID fallback for windows. - maybe someday use GetForegroundWindow() from User32.lib ... --- plugins/bgnotify/bgnotify.plugin.zsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index 722213734..f3cf0e3b8 100755 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -25,6 +25,8 @@ currentWindowId () { xprop -root | awk '/NET_ACTIVE_WINDOW/ { print $5; exit }' elif 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 + else + echo $EPOCHSECONDS #fallback for windows fi } From 98fc8dd91adb5e8754b857127c4d121871d5fadb Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Sat, 8 Nov 2014 14:16:56 -0800 Subject: [PATCH 6/7] Fix for OS X when no window id is returned (like on the desktop) --- plugins/bgnotify/bgnotify.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index f3cf0e3b8..259d27424 100755 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -24,7 +24,7 @@ currentWindowId () { if hash notify-send 2>/dev/null; then #ubuntu! xprop -root | awk '/NET_ACTIVE_WINDOW/ { print $5; exit }' elif 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 + osascript -e 'tell application (path to frontmost application as text) to id of front window' 2&> /dev/null || echo "0" else echo $EPOCHSECONDS #fallback for windows fi From fd69c34e0ccb8b7754b05e6f0c797abddb00f920 Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Sat, 8 Nov 2014 14:20:37 -0800 Subject: [PATCH 7/7] Add screenshots to readme --- plugins/bgnotify/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/bgnotify/README.md b/plugins/bgnotify/README.md index 68fa7529e..b154916d6 100644 --- a/plugins/bgnotify/README.md +++ b/plugins/bgnotify/README.md @@ -16,6 +16,21 @@ Just add bgnotify to your plugins list in your `.zshrc` - On windows you can use [notifu](http://www.paralint.com/projects/notifu/) or the Cygwin Ports libnotify package +## Screenshots + +**Linux** + +![screenshot from 2014-11-07 15 58 36](https://cloud.githubusercontent.com/assets/326829/4962187/256b465c-66da-11e4-927d-cc2fc105e31f.png) + +**OS X** + +![screenshot 2014-11-08 14 15 12](https://cloud.githubusercontent.com/assets/326829/4965780/19fa3eac-6795-11e4-8ed6-0355711123a9.png) + +**Windows** + +![screenshot from 2014-11-07 15 55 00](https://cloud.githubusercontent.com/assets/326829/4962159/a2625ca0-66d9-11e4-9e91-c5834913190e.png) + + ## Configuration One can configure a few things: