Commit | Line | Data |
---|---|---|
98a4179c FW |
1 | # perf completion |
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 | ||
2cf025e6 | 103 | __perf_main () |
98a4179c | 104 | { |
2cf025e6 | 105 | local cmd |
98a4179c | 106 | |
6e0dc374 | 107 | cmd=${words[0]} |
2cf025e6 | 108 | COMPREPLY=() |
98a4179c | 109 | |
35c2fde1 | 110 | # List perf subcommands or long options |
6e0dc374 | 111 | if [ $cword -eq 1 ]; then |
35c2fde1 | 112 | if [[ $cur == --* ]]; then |
12f9dd50 | 113 | __perfcomp '--help --version \ |
35c2fde1 | 114 | --exec-path --html-path --paginate --no-pager \ |
12f9dd50 | 115 | --perf-dir --work-tree --debugfs-dir' -- "$cur" |
35c2fde1 NK |
116 | else |
117 | cmds=$($cmd --list-cmds) | |
12f9dd50 | 118 | __perfcomp "$cmds" "$cur" |
35c2fde1 | 119 | fi |
a3277d2d | 120 | # List possible events for -e option |
6e0dc374 | 121 | elif [[ $prev == "-e" && "${words[1]}" == @(record|stat|top) ]]; then |
4d8061fa | 122 | evts=$($cmd list --raw-dump) |
37e72c31 | 123 | __perfcomp_colon "$evts" "$cur" |
4d8061fa NK |
124 | # List long option names |
125 | elif [[ $cur == --* ]]; then | |
6e0dc374 | 126 | subcmd=${words[1]} |
4d8061fa | 127 | opts=$($cmd $subcmd --list-opts) |
12f9dd50 | 128 | __perfcomp "$opts" "$cur" |
98a4179c | 129 | fi |
2cf025e6 RR |
130 | } |
131 | ||
132 | type perf &>/dev/null && | |
133 | _perf() | |
134 | { | |
135 | local cur words cword prev | |
136 | _get_comp_words_by_ref -n =: cur words cword prev | |
137 | __perf_main | |
98a4179c | 138 | } && |
7b6c48e1 RR |
139 | |
140 | complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \ | |
141 | || complete -o default -o nospace -F _perf perf |