summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Functions/Misc/getjobs29
1 files changed, 29 insertions, 0 deletions
diff --git a/Functions/Misc/getjobs b/Functions/Misc/getjobs
new file mode 100644
index 000000000..0ac2972ff
--- /dev/null
+++ b/Functions/Misc/getjobs
@@ -0,0 +1,29 @@
+# Call this from the preexec function like so:
+# preexec() {
+# getjobs "${(z)1}"
+# }
+setopt localoptions noshwordsplit noksharrays
+local texts
+case $1 in
+ fg|bg) shift; [[ -n $1 ]] || set -- %% ;;
+ %*) ;;
+ *) return 0 ;;
+esac
+repeat $#
+do
+ # This case statement emulates jobs.c:getjob()
+ case $1 in
+ [\;\&\|]|\|\||\&\&) break ;;
+ %(|[%+])) 1=${(k)jobstates[(r)*:+:*]} ;;
+ %-) 1=${(k)jobstates[(r)*:-:*]} ;;
+ %<->) 1=${1#%} ;;
+ %[?]*) 1=${${(Ok)jobtexts[(R)*${1#%[?]}*]}[1]} ;;
+ *) 1=${${(Ok)jobtexts[(R)$1*]}[1]} ;;
+ esac
+ [[ -n $1 ]] && texts=($texts ${jobtexts[$1]})
+ shift
+done
+# Remove the "-s" below if you'd prefer that this just report
+# what jobs are being affected rather than modify the history
+(( $#texts )) && print -s ${(j:; :)texts} "$*"
+return 0