summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@gmail.com>2011-09-16 12:18:40 +0000
committerMikael Magnusson <mikachu@gmail.com>2011-09-16 12:18:40 +0000
commit1c2ff6852911c47b1386d72e781b465f140e77eb (patch)
treefedac1ad9893eb734ce01dfc2cceb94e65267118
parent3dba9a8614e15292ef27cf81c202a39a37e4fff7 (diff)
downloadzsh-1c2ff6852911c47b1386d72e781b465f140e77eb.tar.gz
zsh-1c2ff6852911c47b1386d72e781b465f140e77eb.zip
29764, 29765: fix various problems with _pgrep.
-rw-r--r--ChangeLog9
-rw-r--r--Completion/Unix/Command/_pgrep169
2 files changed, 81 insertions, 97 deletions
diff --git a/ChangeLog b/ChangeLog
index b52361aa6..c3b589bf7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-09-16 Mikael Magnusson <mikachu@gmail.com>
+
+ * 29764, 29765: Completion/Unix/Command/_pgrep: use _users and
+ _groups rather than reimplementing them, use _wanted instead
+ of plain compadd to get descriptions, return 0 on success,
+ fix conditions on -f and -x, complete pts/* for -t too.
+
2011-09-15 Peter Stephenson <pws@csr.com>
* 29776 (modified as noted): Src/lex.c, Test/D08cmdsubst.ztst:
@@ -15417,5 +15424,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5467 $
+* $Revision: 1.5468 $
*****************************************************
diff --git a/Completion/Unix/Command/_pgrep b/Completion/Unix/Command/_pgrep
index f65324a81..e460202a1 100644
--- a/Completion/Unix/Command/_pgrep
+++ b/Completion/Unix/Command/_pgrep
@@ -1,112 +1,89 @@
#compdef pgrep pkill
-local context state line
+local context state line ret=1 expl
typeset -A opt_args
typeset -a arguments
arguments=('-P[parent process id]:parent process id:->ppid'
- '-g[match only in process group ids]:group:->pgid'
- '-G[match only real group id]:group:->group'
- '-s[match only session id]:session id:->sid'
- '-t[match only controlled by terminal]:terminal device:->tty'
- '-u[match only effective user id]:user:->user'
- '-U[match only real user id]:user:->user'
+ '-g[match only in process group ids]:group:->pgid'
+ '-G[match only real group id]:group:_groups'
+ '-s[match only session id]:session id:->sid'
+ '-t[match only controlled by terminal]:terminal device:->tty'
+ '-u[match only effective user id]:user:_users'
+ '-U[match only real user id]:user:_users'
'(-n)-o[oldest process]'
- '(-o)-n[newest process]'
- '-f[match against full command line]'
- '-v[negate matching]'
- '-x[match exactly]'
- '*:process name:->pname')
+ '(-o)-n[newest process]'
+ '-f[match against full command line]'
+ '-v[negate matching]'
+ '-x[match exactly]'
+ '*:process name:->pname')
if [[ $service == 'pkill' ]]
then
- arguments+=('-'${^signals}'[signal]')
+ arguments+=('-'${^signals}'[signal]')
elif [[ $service == 'pgrep' ]]
then
- arguments+=('-d[output delimiter]:delimiter:compadd ${(s\:\:)IFS}'
- '-l[list name in addition to id]')
+ arguments+=('-d[output delimiter]:delimiter:compadd ${(s\:\:)IFS}'
+ '-l[list name in addition to id]')
fi
-_arguments -s -w $arguments
+_arguments -s -w $arguments && ret=0
case $state in
- (tty)
- compset -P '*,'
-
- local -a used
- used=(${(s:,:)IPREFIX})
-
- compadd -S ',' -q -F used /dev/tty*(:t)
- ;;
-
- (sid)
- compset -P '*,'
-
- local -a used sid
- used=(${(s:,:)IPREFIX})
- sid=(${(uon)$(ps -A o sid=)})
-
- compadd -S ',' -q -F used $sid
- ;;
-
- (ppid)
- compset -P '*,'
-
- local -a used ppid
- used=(${(s:,:)IPREFIX})
- ppid=(${(uon)$(ps -A o ppid=)})
-
- compadd -S ',' -q -F used $ppid
- ;;
-
- (pgid)
- compset -P '*,'
-
- local -a used pgid
- used=(${(s:,:)IPREFIX})
- pgid=(${(uon)$(ps -A o pgid=)})
-
- compadd -S ',' -q -F used $pgid
- ;;
-
- (pname)
- if (( ${+opt_args[-x]} )) && (( ${+opt_args[-f]} ))
- then
- compadd ${(u)${(f)"$(ps -A o cmd=)"}}
- else
- compadd ${(u)${(f)"$(ps -A co cmd=)"}}
- fi
- ;;
-
- (group)
- compset -P '*,'
-
- local group
- group=$(getent group)
-
- local -a groups ids
- groups=(${${(f)group}%%:*})
- ids=(${${${(f)group}#*:*:}%%:*})
-
- local -a used
- used=(${(s:,:)IPREFIX})
-
- compadd -S ',' -q -F used -d ids $groups $groups
- ;;
-
- (user)
- compset -P '*,'
-
- local passwd
- passwd=$(getent passwd)
-
- local -a users ids
- users=(${${(f)passwd}%%:*})
- ids=(${${${(f)passwd}#*:*:}%%:*})
-
- local -a used
- used=(${(s:,:)IPREFIX})
-
- compadd -S ',' -q -F used -d ids $users $users
- ;;
-esac
+ (tty)
+ compset -P '*,'
+
+ local -a used ttys
+ used=(${(s:,:)IPREFIX})
+
+ ttys=( /dev/tty*(N) /dev/pts/*(N) )
+ _wanted tty expl 'terminal device' compadd -S ',' -q -F used ${ttys#/dev/}
+ ;;
+
+ (sid)
+ compset -P '*,'
+
+ local -a used sid
+ used=(${(s:,:)IPREFIX})
+ sid=(${(uon)$(ps -A o sid=)})
+
+ _wanted sid expl 'session id' compadd -S ',' -q -F used $sid
+ ;;
+
+ (ppid)
+ compset -P '*,'
+
+ local -a used ppid
+ used=(${(s:,:)IPREFIX})
+ ppid=(${(uon)$(ps -A o ppid=)})
+
+ _wanted ppid expl 'parent process id' compadd -S ',' -q -F used $ppid
+ ;;
+
+ (pgid)
+ compset -P '*,'
+
+ local -a used pgid
+ used=(${(s:,:)IPREFIX})
+ pgid=(${(uon)$(ps -A o pgid=)})
+
+ _wanted pgid expl 'process group id' compadd -S ',' -q -F used $pgid
+ ;;
+
+ (pname)
+ local ispat="pattern matching "
+ if (( ${+opt_args[-x]} ))
+ then
+ ispat=""
+ fi
+ if (( ${+opt_args[-f]} ))
+ then
+ _wanted pname expl $ispat'process command line' compadd ${(u)${(f)"$(ps -A o cmd=)"}}
+ else
+ _wanted pname expl $ispat'process name' compadd ${(u)${(f)"$(ps -A co cmd=)"}}
+ fi
+ ;;
+
+esac && ret=0
+
+return ret