Commit | Line | Data |
---|---|---|
f38ab8af | 1 | # perf bash and zsh completion |
98a4179c | 2 | |
c3fb6717 RR |
3 | # Taken from git.git's completion script. |
4 | __my_reassemble_comp_words_by_ref() | |
5 | { | |
6 | local exclude i j first | |
7 | # Which word separators to exclude? | |
8 | exclude="${1//[^$COMP_WORDBREAKS]}" | |
9 | cword_=$COMP_CWORD | |
10 | if [ -z "$exclude" ]; then | |
11 | words_=("${COMP_WORDS[@]}") | |
12 | return | |
13 | fi | |
14 | # List of word completion separators has shrunk; | |
15 | # re-assemble words to complete. | |
16 | for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do | |
17 | # Append each nonempty word consisting of just | |
18 | # word separator characters to the current word. | |
19 | first=t | |
20 | while | |
21 | [ $i -gt 0 ] && | |
22 | [ -n "${COMP_WORDS[$i]}" ] && | |
23 | # word consists of excluded word separators | |
24 | [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ] | |
25 | do | |
26 | # Attach to the previous token, | |
27 | # unless the previous token is the command name. | |
28 | if [ $j -ge 2 ] && [ -n "$first" ]; then | |
29 | ((j--)) | |
30 | fi | |
31 | first= | |
32 | words_[$j]=${words_[j]}${COMP_WORDS[i]} | |
33 | if [ $i = $COMP_CWORD ]; then | |
34 | cword_=$j | |
35 | fi | |
36 | if (($i < ${#COMP_WORDS[@]} - 1)); then | |
37 | ((i++)) | |
38 | else | |
39 | # Done. | |
40 | return | |
41 | fi | |
42 | done | |
43 | words_[$j]=${words_[j]}${COMP_WORDS[i]} | |
44 | if [ $i = $COMP_CWORD ]; then | |
45 | cword_=$j | |
46 | fi | |
47 | done | |
48 | } | |
49 | ||
50 | type _get_comp_words_by_ref &>/dev/null || | |
51 | _get_comp_words_by_ref() | |
52 | { | |
53 | local exclude cur_ words_ cword_ | |
54 | if [ "$1" = "-n" ]; then | |
55 | exclude=$2 | |
56 | shift 2 | |
57 | fi | |
58 | __my_reassemble_comp_words_by_ref "$exclude" | |
59 | cur_=${words_[cword_]} | |
60 | while [ $# -gt 0 ]; do | |
61 | case "$1" in | |
62 | cur) | |
63 | cur=$cur_ | |
64 | ;; | |
65 | prev) | |
66 | prev=${words_[$cword_-1]} | |
67 | ;; | |
68 | words) | |
69 | words=("${words_[@]}") | |
70 | ;; | |
71 | cword) | |
72 | cword=$cword_ | |
73 | ;; | |
74 | esac | |
75 | shift | |
76 | done | |
77 | } | |
78 | ||
4685a6cf | 79 | type __ltrim_colon_completions &>/dev/null || |
ae0c1f99 NK |
80 | __ltrim_colon_completions() |
81 | { | |
82 | if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then | |
83 | # Remove colon-word prefix from COMPREPLY items | |
30079d1d | 84 | local colon_word=${1%"${1##*:}"} |
ae0c1f99 NK |
85 | local i=${#COMPREPLY[*]} |
86 | while [[ $((--i)) -ge 0 ]]; do | |
87 | COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} | |
88 | done | |
89 | fi | |
90 | } | |
91 | ||
12f9dd50 RR |
92 | __perfcomp () |
93 | { | |
94 | COMPREPLY=( $( compgen -W "$1" -- "$2" ) ) | |
95 | } | |
96 | ||
37e72c31 RR |
97 | __perfcomp_colon () |
98 | { | |
99 | __perfcomp "$1" "$2" | |
100 | __ltrim_colon_completions $cur | |
101 | } | |
102 | ||
67afff48 YS |
103 | __perf_prev_skip_opts () |
104 | { | |
105 | local i cmd_ cmds_ | |
106 | ||
107 | let i=cword-1 | |
108 | cmds_=$($cmd --list-cmds) | |
109 | prev_skip_opts=() | |
110 | while [ $i -ge 0 ]; do | |
111 | for cmd_ in $cmds_; do | |
112 | if [[ ${words[i]} == $cmd_ ]]; then | |
113 | prev_skip_opts=${words[i]} | |
114 | return | |
115 | fi | |
116 | done | |
117 | ((i--)) | |
118 | done | |
119 | } | |
2cf025e6 | 120 | __perf_main () |
98a4179c | 121 | { |
2cf025e6 | 122 | local cmd |
98a4179c | 123 | |
6e0dc374 | 124 | cmd=${words[0]} |
2cf025e6 | 125 | COMPREPLY=() |
98a4179c | 126 | |
67afff48 YS |
127 | # Skip options backward and find the last perf command |
128 | __perf_prev_skip_opts | |
35c2fde1 | 129 | # List perf subcommands or long options |
6e0dc374 | 130 | if [ $cword -eq 1 ]; then |
35c2fde1 | 131 | if [[ $cur == --* ]]; then |
7335399a | 132 | cmds=$($cmd --list-opts) |
35c2fde1 NK |
133 | else |
134 | cmds=$($cmd --list-cmds) | |
35c2fde1 | 135 | fi |
7335399a | 136 | __perfcomp "$cmds" "$cur" |
a3277d2d | 137 | # List possible events for -e option |
6e0dc374 | 138 | elif [[ $prev == "-e" && "${words[1]}" == @(record|stat|top) ]]; then |
4d8061fa | 139 | evts=$($cmd list --raw-dump) |
37e72c31 | 140 | __perfcomp_colon "$evts" "$cur" |
02fde323 YS |
141 | else |
142 | # List subcommands for perf commands | |
67afff48 YS |
143 | if [[ $prev_skip_opts == @(kvm|kmem|mem|lock|sched) ]]; then |
144 | subcmds=$($cmd $prev_skip_opts --list-cmds) | |
02fde323 YS |
145 | __perfcomp_colon "$subcmds" "$cur" |
146 | fi | |
147 | # List long option names | |
148 | if [[ $cur == --* ]]; then | |
149 | subcmd=${words[1]} | |
150 | opts=$($cmd $subcmd --list-opts) | |
151 | __perfcomp "$opts" "$cur" | |
152 | fi | |
98a4179c | 153 | fi |
2cf025e6 RR |
154 | } |
155 | ||
f38ab8af RR |
156 | if [[ -n ${ZSH_VERSION-} ]]; then |
157 | autoload -U +X compinit && compinit | |
158 | ||
159 | __perfcomp () | |
160 | { | |
161 | emulate -L zsh | |
162 | ||
163 | local c IFS=$' \t\n' | |
164 | local -a array | |
165 | ||
166 | for c in ${=1}; do | |
167 | case $c in | |
168 | --*=*|*.) ;; | |
169 | *) c="$c " ;; | |
170 | esac | |
171 | array[${#array[@]}+1]="$c" | |
172 | done | |
173 | ||
174 | compset -P '*[=:]' | |
175 | compadd -Q -S '' -a -- array && _ret=0 | |
176 | } | |
177 | ||
178 | __perfcomp_colon () | |
179 | { | |
180 | emulate -L zsh | |
181 | ||
182 | local cur_="${2-$cur}" | |
183 | local c IFS=$' \t\n' | |
184 | local -a array | |
185 | ||
186 | if [[ "$cur_" == *:* ]]; then | |
187 | local colon_word=${cur_%"${cur_##*:}"} | |
188 | fi | |
189 | ||
190 | for c in ${=1}; do | |
191 | case $c in | |
192 | --*=*|*.) ;; | |
193 | *) c="$c " ;; | |
194 | esac | |
195 | array[$#array+1]=${c#"$colon_word"} | |
196 | done | |
197 | ||
198 | compset -P '*[=:]' | |
199 | compadd -Q -S '' -a -- array && _ret=0 | |
200 | } | |
201 | ||
202 | _perf () | |
203 | { | |
204 | local _ret=1 cur cword prev | |
205 | cur=${words[CURRENT]} | |
206 | prev=${words[CURRENT-1]} | |
207 | let cword=CURRENT-1 | |
208 | emulate ksh -c __perf_main | |
209 | let _ret && _default && _ret=0 | |
210 | return _ret | |
211 | } | |
212 | ||
213 | compdef _perf perf | |
214 | return | |
215 | fi | |
216 | ||
2cf025e6 RR |
217 | type perf &>/dev/null && |
218 | _perf() | |
219 | { | |
220 | local cur words cword prev | |
221 | _get_comp_words_by_ref -n =: cur words cword prev | |
222 | __perf_main | |
98a4179c | 223 | } && |
7b6c48e1 RR |
224 | |
225 | complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \ | |
226 | || complete -o default -o nospace -F _perf perf |