39857: add support for darwin, with improvements on linux etc.

This commit is contained in:
Jun-ichi Takimoto 2016-11-08 21:49:33 +09:00
parent 1683371fa5
commit dfb2f3f3d2
2 changed files with 130 additions and 52 deletions

View file

@ -1,3 +1,8 @@
2016-11-08 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
* 39857: Completion/Unix/Command/_top: add support for darwin,
with improvements on linux etc.
2016-11-08 Peter Stephenson <p.stephenson@samsung.com>
* unposted: Src/utils.c: follow up to 39867: don't need test

View file

@ -1,12 +1,16 @@
#compdef top
local specs fields
local curcontext="$curcontext" state state_descr line ret=1
local -A opt_args
local -a specs fields order opts
opts=( -s -w -C )
case $OSTYPE in
*linux*)
fields=(
'%CPU:CPU usage' '%MEM:memory usage (res)' 'CGROUPS:control groups'
'CODE:code size' 'COMMAND:Commane name/line' 'DATA:data + stack size'
'CODE:code size' 'COMMAND:Command name/line' 'DATA:data + stack size'
'ENVIRON:environment variables' 'Flags:task flags' 'GID:group id'
'GROUP:group name' 'NI:nice value' 'P:last used CPU (SMP)'
'PGRP:process group id' 'PID:process id' 'PPID:parent pid' 'PR:priority'
@ -24,78 +28,147 @@ case $OSTYPE in
'nsUTS:UTS namespace' 'vMj:major page fault count delta'
'vMn:minor page fault count delta'
)
order=( '+:descending (default)' '-:ascending' )
specs=(
'(-v -h)-'{h,v}'[show version and usage]'
'(-)-'{h,v}'[show version and usage]'
'-b[batch mode]'
'-c[command line/program name toggle]'
'-d[delay time interval]:interval'
'-d+[delay time interval]:interval'
'-H[threads mode operation]'
'-i[idle process toggle]'
'-n[number of iterations]:number of iterations'
'-o[override sort field]:fieldname:(( $fields ))'
'-n+[number of iterations]:number of iterations'
'-o+[override sort field]:fieldname:->sortkey'
'-O[output field names]'
'*-p[monitor pids]: :_pids'
'*-p+[monitor pids]: :_sequence -s , _pids'
'-s[secure mode operation]'
'-S[cumulative time toggle]'
'(-U)-u[effective user filter mode]: :_users'
'(-u)-U[user filter mode]: :_users'
'-w[output width override]:number'
'(-U)-u+[effective user filter mode]: :_users'
'(-u)-U+[user filter mode]: :_users'
'-w+[output width override]::number'
);;
freebsd*)
freebsd*|openbsd*)
fields=( cpu size res time pri pid )
specs=(
'-C[CPU display mode]'
'-S[show system processes]'
'-a[display command names via argv]'
'-b[batch mode]'
'-d+[show only specified number of displays then exit]:count:'
'-H[display individual threads]'
'-i[interactive mode]'
'-I[do not display idle processes]'
'-i[interactive mode]'
'-n[non-interactive mode (identical to batch mode)]'
'-o+[sort process display by the specified field]:field:( $fields )'
'-q[renice top to -20]'
'-S[show system processes]'
'-s+[specify delay interval]:seconds:'
'-u[do not translate uid to name]'
'1: :_guard "^-*" "number of processes to display"'
);|
freebsd*)
fields+=( threads total read write fault vcsw ivcsw jid )
specs+=(
'-C[CPU display mode]'
'-a[display command names via argv]'
'-j[display the jail ID]'
'-t[do not display the top process]'
'-m+[statistic type]:type:(( cpu\:default io ))'
'-n[non-interactive mode]'
'-m+[specify statistic type]:type:(( cpu\:default io ))'
'-P[per-cpu CPU usage statistics]'
'-q[renice top to -20]'
'-u[do not translate uid to name]'
'-v[write version number]'
'-z[no not display system idle process]'
'-d+[number of iterations]:count:'
'-s+[set delay interval]:interval:'
'-o+[sort process display by field]:field:(
cpu size res time pri threads total read
write fault vcsw ivcsw jid pid
)'
'-J+[show processes owned by jail]:jail:_jails -0'
'-U+[show processes owned by username]: :_users'
'1: : _message "top number of processes"'
'(1 -)-v[write version number and exit]'
'-z[do not display system idle process]'
'-J+[show processes owned by the specified jail]:jail:_jails -0'
'-U+[show processes owned by the specified username]: :_users'
);;
openbsd*)
specs=(
fields+=( command )
specs+=(
'-1[combine CPU statistic into one line]'
'-b[batch mode]'
'-C[show command arguments as well and process name]'
'-d[number of iterations]:number of iterations'
'-g[filter processes by string]:string'
'-H[display process threads]'
'-I[do not display idle processes]'
'-i[interactive mode]'
'-n[non-interactive mode]'
'-o[sort display by field]:field:(
cpu size res time pri pid command
)'
'-p[filter by pid]: :_pids'
'-q[renice top to -20]'
'-S[show system processes]'
'-s[delay time interval]:interval'
'-U[filter processes by user]: :_users -M "L\:|-="'
'-u[do not map uid to usernames]'
'1: : _message "top number of processes"'
'-C[show command arguments as well as process name]'
'-g+[filter processes by the specified string]:string'
'-p+[filter by the specified pid]: :_pids'
'-U+[filter processes by the specified user]: :_users -M "L\:|-="'
);;
darwin*)
local -a modes
opts=( -C ) # no option stacking
modes=(
'a:count events cumulatively'
'd:count events relative to the previous sample'
'e:count events using absolute counters'
'n:non-event mode (default)'
)
fields=(
'pid:process id'
'command:command name'
'cpu:CPU usage'
'cpu_me:CPU time charged to me by other processes'
'cpu_others:CPU time charged to other processes by me'
'csw:number of context switches'
'time:execution time'
{threads,th}':number of threads'
{ports,prt}':number of Mach ports'
{mregion,mreg,reg}':number of memory regions'
'mem:internal memory size'
'rprvt:resident private address space size'
'purg:purgeable memory size'
'vsize:total memory size'
'vprvt:private address space size'
'kprvt:private kernel memory size'
'kshrd:shared kernel memory size'
'pgrp:process group id'
'ppid:parent process id'
{state,pstate}':process state'
'uid:user id'
{wq,'#wq',workqueue}':workqueue total/running'
{faults,fault}':number of page faults'
{cow,cow_faults}':copy-on-write faults'
{user,username}':username'
'msgsent:total number of Mach messages sent'
'msgrecv:total number of Mach messages received'
'sysbsd:total BSD syscalls'
'sysmach:total Mach syscalls'
'pageins:total pageins'
'boosts:number of boosts held by the process'
)
order=( '-:descending (default)' '+:ascending' )
specs=(
'-a[count events cumulatively]'
'-c[set event counting mode]:mode:(( $modes ))'
'-d[count events relative to the previous sample]'
'-e[count events using absolute counters]'
'-F[do not calculate statistics on shared libraries]'
'-f[calculate statistics on shared libraries]'
'(-)-h[print usage information and exit]'
'-i+[specify interval between samples for -f option]:interval'
'-l+[logging mode. output specified number of samples periodically]:number of samples'
'-ncols[output specified number of columns in logging mode]:number of columns'
'-n+[only display up to the specified number of processes]:number of processes:'
'-O+[specify the secondary sort key]:key:->sortkey'
'-o+[specify the primary sort key]:key:->sortkey'
'-R[do not traverse and report memory object map for each process]'
'-r[traverse and report memory object map for each process]'
'-S[display global statistics for swap and purgeable memory]'
'-s[set the delay between update]:number of seconds'
'-stats[only display the specified fields]:list of fields:->fieldlist'
'*-pid[only display the specified process]:pid:_pids'
{-user,-U+}'[only display processes owned by the specified user]:user:_users'
'-u[same as -o cpu -O time]'
);;
esac
if (( $#specs )); then
_arguments -s -w : "$specs[@]"
if (( $#specs == 0 )); then
_default
return
fi
_default
_arguments $opts : "$specs[@]" && ret=0
case $state in
(sortkey)
compset -P '(+|-)' && order=()
_alternative 'sort-orders:sort order:(( $order ))' \
'sort-keys:sort key:(( $fields ))' && ret=0
;;
(fieldlist)
_sequence -s , _describe -t fields 'field' fields && ret=0
;;
esac
return ret