diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | Completion/Unix/Type/_signals | 17 | ||||
-rw-r--r-- | Completion/Zsh/Command/_jobs_builtin | 2 | ||||
-rw-r--r-- | Completion/Zsh/Command/_kill | 18 | ||||
-rw-r--r-- | Doc/Zsh/builtins.yo | 6 | ||||
-rw-r--r-- | Src/jobs.c | 39 |
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++; |