summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Completion/Unix/Type/_signals17
-rw-r--r--Completion/Zsh/Command/_jobs_builtin2
-rw-r--r--Completion/Zsh/Command/_kill18
-rw-r--r--Doc/Zsh/builtins.yo6
-rw-r--r--Src/jobs.c39
6 files changed, 59 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index 45d244e7b..7b09a0325 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2001-11-06 Oliver Kiddle <opk@zsh.org>
+
+ * 16224: Src/jobs.c, Doc/Zsh/builtins.yo,
+ Completion/Unix/Type/_signals, Completion/Zsh/Command/_kill,
+ Completion/Zsh/Command/_jobs_builtin: add -n option to kill
+ builtin and use _arguments in _kill to complete options
+
2001-11-03 Bart Schaefer <schaefer@zsh.org>
* 16215: Src/subst.c: save and restore mult_isarr in singsub()
diff --git a/Completion/Unix/Type/_signals b/Completion/Unix/Type/_signals
index 447d9d16c..f882ca9ff 100644
--- a/Completion/Unix/Type/_signals
+++ b/Completion/Unix/Type/_signals
@@ -7,16 +7,15 @@
#
# A `-' or `--' as the first argument is ignored.
-local expl last=-3 minus
+local expl last minus
-while [[ "$1" = -[ap] ]]; do
- if [[ "$1" = -a ]]; then
- last=-1
- else
- minus=-
- fi
- shift
-done
+zparseopts -D -K -E 'p=minus' 'a=last'
+if [[ -z "$last" ]]; then
+ last=-1
+else
+ last=-3
+fi
+[[ -n "$minus" ]] && minus='-'
[[ "$1" = -(|-) ]] && shift
diff --git a/Completion/Zsh/Command/_jobs_builtin b/Completion/Zsh/Command/_jobs_builtin
index 39ddb8a45..70804cf0f 100644
--- a/Completion/Zsh/Command/_jobs_builtin
+++ b/Completion/Zsh/Command/_jobs_builtin
@@ -2,7 +2,7 @@
_arguments -C -s \
"(-d -l -p -r -s *)-Z[specify string to replace shell's argument and environment with]:string" \
- '(-Z)-d[show directory from which to job was started]' \
+ '(-Z)-d[show directory from which each job was started]' \
'(-Z)-l[list process IDs]' \
'(-Z)-p[list process groups]' \
'(-Z -s)-r[list only running jobs]' \
diff --git a/Completion/Zsh/Command/_kill b/Completion/Zsh/Command/_kill
index 5e3caed6a..8887be5fc 100644
--- a/Completion/Zsh/Command/_kill
+++ b/Completion/Zsh/Command/_kill
@@ -1,6 +1,18 @@
#compdef kill
-_alternative \
- 'signals:: _signals -p' \
+local curcontext="$curcontext" line state ret=1
+
+_arguments -C \
+ '(-s -l 1)-n[specify signal number]:signal number' \
+ '(-n -l 1)-s[specify signal name]:signal:_signals' \
+ '(-n -s)-l[list signal names or numbers of specified signals]:*:signal:_signals' \
+ '(-n -s -l)1::signal:_signals -p' \
+ '*:processes:->processes' && ret=0
+
+if [[ -n "$state" && -prefix [%0-9]# ]]; then
+ _alternative \
'processes:: _pids' \
- 'jobs:: _jobs -t'
+ 'jobs:: _jobs -t' && ret=0
+fi
+
+return ret
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index ef82f851e..c312842c2 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -534,8 +534,8 @@ used by daemons, to indicate their state.
findex(kill)
cindex(killing jobs)
cindex(jobs, killing)
-xitem(tt(kill) [ tt(-s) var(signal_name) ] var(job) ...)
-xitem(tt(kill) [ tt(-)var(sig) ] var(job) ...)
+xitem(tt(kill) [ tt(-s) var(signal_name) | tt(-n) var(signal_number) | \
+tt(-)var(sig) ] var(job) ...)
item(tt(kill) tt(-l) [ var(sig) ... ])(
Sends either tt(SIGTERM) or the specified signal to the given
jobs or processes.
@@ -544,7 +544,7 @@ If the signal being sent is not `tt(KILL)' or `tt(CONT)', then the job
will be sent a `tt(CONT)' signal if it is stopped.
The argument var(job) can be the process ID of a job
not in the job list.
-In the third form, tt(kill -l), if var(sig) is not
+In the second form, tt(kill -l), if var(sig) is not
specified the signal names are listed. Otherwise, for each
var(sig) that is a name, the corresponding signal number is
listed. For each var(sig) that is a signal number or a number
diff --git a/Src/jobs.c b/Src/jobs.c
index f462a0ae8..f3519ae2c 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1500,21 +1500,32 @@ bin_kill(char *nam, char **argv, char *ops, int func)
putchar('\n');
return 0;
}
- if ((*argv)[1] == 's' && (*argv)[2] == '\0')
- signame = *++argv;
- else
- signame = *argv + 1;
- /* check for signal matching specified name */
- for (sig = 1; sig <= SIGCOUNT; sig++)
- if (!cstrpcmp(sigs + sig, &signame))
- break;
- if (*signame == '0' && !signame[1])
- sig = 0;
- if (sig > SIGCOUNT) {
- zwarnnam(nam, "unknown signal: SIG%s", signame, 0);
- zwarnnam(nam, "type kill -l for a List of signals", NULL, 0);
- return 1;
+ if ((*argv)[1] == 'n' && (*argv)[2] == '\0') {
+ char *endp;
+
+ sig = zstrtol(*++argv, &endp, 10);
+ if (*endp) {
+ zwarnnam(nam, "invalid signal number", signame, 0);
+ return 1;
+ }
+ } else {
+ if ((*argv)[1] == 's' && (*argv)[2] == '\0')
+ signame = *++argv;
+ else
+ signame = *argv + 1;
+
+ /* check for signal matching specified name */
+ for (sig = 1; sig <= SIGCOUNT; sig++)
+ if (!cstrpcmp(sigs + sig, &signame))
+ break;
+ if (*signame == '0' && !signame[1])
+ sig = 0;
+ if (sig > SIGCOUNT) {
+ zwarnnam(nam, "unknown signal: SIG%s", signame, 0);
+ zwarnnam(nam, "type kill -l for a List of signals", NULL, 0);
+ return 1;
+ }
}
}
argv++;