about summary refs log tree commit diff
path: root/Completion/Unix/Command/_pgrep
blob: e4bd2e286781eb4ca950def422a5b4cf9a284a16 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#compdef pgrep pkill 

local context state line ret=1 expl
typeset -A opt_args
typeset -a arguments

arguments=('-P[parent process id]:parent process id:->ppid' 
     '-F[match only in process in pidfile]:files:_files'
     '-g[match only in process group ids]:group:->pgid' 
     '-G[match only real group id]:group:_groups' 
     '-j[match only in processes inside jails]'
     '-M[extract the name list from the specified core]:files:_files'
     '-N[extract the name list from the specified system]:files:_files'
     '-s[match only session id]:session id:->sid' 
     '-t[match only controlled by terminal]:terminal device:->tty'
     '-T[match only in processes specified routing table in rtable]'
     '-u[match only effective user id]:user:_users' 
     '-U[match only real user id]:user:_users' 
           '(-n)-o[oldest process]' 
     '(-o)-n[newest process]' 
     '-a[include process ancestors in the match list]'
     '-c[print a count of matching processes]'
     '-f[match against full command line]' 
     '-i[ignore case distinctions]'
     '-I[confirmation before attempting to single each process]'
     '-L[given pidfile must be locked]'
     '-q[do not write anything to standard output]'
     '-S[search also in system processes]'
     '-v[negate matching]' 
     '-x[match exactly]')

if [[ $service == 'pkill' ]]
then
  arguments+=('-'${^signals}'[signal]')
elif [[ $service == 'pgrep' ]]
then
  arguments+=('-d[output delimiter]:delimiter:compadd ${(s\:\:)IFS}'
        '-l[list name in addition to id]')
fi

local optchars
case "$OSTYPE" in
  linux*)
    optchars="cflvxdnoPgsuUGt"
    ;;
  freebsd*)
    optchars="LSafilnoqvxFGMNPUdgjstu"
    ;;
  openbsd*)
    optchars="flnoqvxdGgPsTtUu"
    ;;
  darwin*)
    optchars="LafilnoqvxFGPUdgtu"
    ;;
  *)
    optchars="flvxdnoPgsuUGt"
    ;;
esac
arguments=( ${(M)arguments:#(|\*)(|\(*\))-[$optchars]*}
     '*:process name:->pname')

_arguments -s -w $arguments && ret=0

case $state in
  (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