mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-03-27 03:14:56 +01:00
Merge 1f79e96cab into 192de6bcff
This commit is contained in:
commit
2cb96a1f23
2 changed files with 61 additions and 23 deletions
|
|
@ -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)
|
||||
|
||||

|
||||
----------------------------------
|
||||
|
||||
## 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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue