about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@users.sourceforge.net>2001-11-02 12:35:32 +0000
committerOliver Kiddle <opk@users.sourceforge.net>2001-11-02 12:35:32 +0000
commit19d2273cb7bdde0b13a8858ec8c4f264a2bb11b4 (patch)
tree3b66e84c8560e38fe7d13c2fb22b73decc43ded5
parentf3f81f0837e9c10ec9fd0808e8640ab8a23b7ba8 (diff)
downloadzsh-19d2273cb7bdde0b13a8858ec8c4f264a2bb11b4.tar.gz
zsh-19d2273cb7bdde0b13a8858ec8c4f264a2bb11b4.tar.xz
zsh-19d2273cb7bdde0b13a8858ec8c4f264a2bb11b4.zip
16198: add %j prompt expansion and j test character for no. of jobs in prompt
-rw-r--r--ChangeLog6
-rw-r--r--Doc/Zsh/prompt.yo4
-rw-r--r--Functions/Prompts/prompt_oliver_setup40
-rw-r--r--Src/prompt.c17
4 files changed, 49 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 41635f6ff..24d7a4db1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2001-11-02  Oliver Kiddle  <opk@zsh.org>
 
+	* unposted: Functions/Prompts/prompt_oliver_setup,
+	Doc/Zsh/prompt.yo: documentation and example for 16198
+
+	* 16198: Src/prompt.c: add %j prompt expansion and j test
+	character for putting the number of jobs in the prompt
+
 	* 16177: Completion/Unix/Type/_time_zone: also look in
 	/usr/lib/locale/TZ for time zones
 
diff --git a/Doc/Zsh/prompt.yo b/Doc/Zsh/prompt.yo
index a62418277..cb4609240 100644
--- a/Doc/Zsh/prompt.yo
+++ b/Doc/Zsh/prompt.yo
@@ -111,6 +111,9 @@ The line number currently being executed in the script, sourced file, or
 shell function given by tt(%N).  This is most useful for debugging as part
 of tt($PS4).
 )
+item(tt(%j))(
+The number of jobs.
+)
 item(tt(%L))(
 The current value of tt($SHLVL).
 )
@@ -222,6 +225,7 @@ least var(n) elements.)
 sitem(tt(D))(True if the month is equal to var(n) (January = 0).)
 sitem(tt(d))(True if the day of the month is equal to var(n).)
 sitem(tt(g))(True if the effective gid of the current process is var(n).)
+sitem(tt(j))(True if the number of jobs is at least var(n).)
 sitem(tt(L))(True if the tt(SHLVL) parameter is at least var(n).)
 sitem(tt(l))(True if at least var(n) characters have already been
 printed on the current line.)
diff --git a/Functions/Prompts/prompt_oliver_setup b/Functions/Prompts/prompt_oliver_setup
index 1f4e598fc..c4a28b705 100644
--- a/Functions/Prompts/prompt_oliver_setup
+++ b/Functions/Prompts/prompt_oliver_setup
@@ -1,35 +1,41 @@
 # oliver prompt theme
 
 prompt_oliver_help() {
-  cat - <<ENDHELP
+  cat <<'ENDHELP'
 With this prompt theme, the prompt contains the current directory,
-history number and the previous command\'s exit code (if non-zero)
-and a final character which depends on priviledges.
+history number, number of jobs (if non-zero) and the previous
+command's exit code (if non-zero) and a final character which
+depends on priviledges.
 
 The colour of the prompt depends on two associative arrays -
-\$pcolour and $\tcolour. Each array is indexed by the name of the
+$pcolour and $tcolour. Each array is indexed by the name of the
 local host. Alternatively, the colour can be set with parameters
-to prompt.
+to prompt. To specify colours, use English words like 'yellow',
+optionally preceded by 'bold'.
 
 The hostname and username are also included unless they are in the
-\$normal_hosts or \$normal_users array.
+$normal_hosts or $normal_users array.
 ENDHELP
 }
 
 prompt_oliver_setup() {
-  prompt_opts=( percent set )
+  prompt_opts=( cr subst percent )
+
+  [[ "${(t)pcolour}" != assoc* ]] && typeset -Ag pcolour
+  [[ "${(t)tcolour}" != assoc* ]] && typeset -Ag tcolour
+  local pcol=${1:-${pcolour[${HOST:=`hostname`}]:-yellow}}
+  local pcolr=$fg[${pcol#bold}]
+  [[ $pcol = bold* ]] && pcolr=$bold_color$pcolr
+  
+  local tcol=${2:-${tcolour[$HOST]:-white}}
+  local tcolr=$reset_color$fg[${tcol#bold}]
+  [[ $tcol = bold* ]] && tcolr=$tcolr$bold_color
   
-  local pcol=$'\e['${1:-${pcolour[${HOST:=`hostname`}]:-33}}m
-  local tcol=$'\e['${2:-${tcolour[$HOST]:-37}}m
-  local a host="%M:" user="%n "
-  for a in $normal_hosts; do
-    [[ $HOST == $a ]] && host=""
-  done
-  for a in root $normal_users; do
-    [[ ${USER:-`whoami`} == $a ]] && user=""
-  done
+  local a host="%m:" user="%n "
+  [[ $HOST == (${(j(|))~normal_hosts}) ]] && host=""
+  [[ ${USER:-`whoami`} == (root|${(j(|))~normal_users}) ]] && user=""
 
-  PS1="%{$pcol%}$user$host%~ [%h%0(?..:%?)]%# %{$tcol%}"
+  PS1="%{$pcolr%}$user$host%~%"'$((COLUMNS-12))'"(l.$prompt_newline. )[%h%1(j.%%%j.)%0(?..:%?)]%# %{$tcolr%}"
 }
 
 prompt_oliver_setup "$@"
diff --git a/Src/prompt.c b/Src/prompt.c
index d5df9d1ce..9b6edfcc6 100644
--- a/Src/prompt.c
+++ b/Src/prompt.c
@@ -202,7 +202,7 @@ static int
 putpromptchar(int doprint, int endchar)
 {
     char *ss, *tmbuf = NULL, *hostnam;
-    int t0, arg, test, sep;
+    int t0, arg, test, sep, j, numjobs;
     struct tm *tm;
     time_t timet;
     Nameddir nd;
@@ -286,6 +286,13 @@ putpromptchar(int doprint, int endchar)
 		    if (getegid() == arg)
 			test = 1;
 		    break;
+		case 'j':
+		    for (numjobs = 0, j = 1; j < MAXJOB; j++)
+			if (jobtab[j].stat && jobtab[j].procs &&
+		    	    !(jobtab[j].stat & STAT_NOPRINT)) numjobs++;
+		    if (numjobs >= arg)
+		    	test = 1;
+		    break;
 		case 'l':
 		    *bp = '\0';
 		    countprompt(bufline, &t0, 0, 0);
@@ -371,6 +378,14 @@ putpromptchar(int doprint, int endchar)
 		sprintf(bp, "%d", curhist);
 		bp += strlen(bp);
 		break;
+	    case 'j':
+		for (numjobs = 0, j = 1; j < MAXJOB; j++)
+		    if (jobtab[j].stat && jobtab[j].procs &&
+		    	!(jobtab[j].stat & STAT_NOPRINT)) numjobs++;
+		addbufspc(DIGBUFSIZE);
+		sprintf(bp, "%d", numjobs);
+		bp += strlen(bp);
+		break;
 	    case 'M':
 		queue_signals();
 		if ((hostnam = getsparam("HOST")))