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 | ||
1ba6e017 | 92 | type perf &>/dev/null && |
98a4179c FW |
93 | _perf() |
94 | { | |
6e0dc374 | 95 | local cur words cword prev cmd |
98a4179c FW |
96 | |
97 | COMPREPLY=() | |
6e0dc374 | 98 | _get_comp_words_by_ref -n =: cur words cword prev |
98a4179c | 99 | |
6e0dc374 | 100 | cmd=${words[0]} |
98a4179c | 101 | |
35c2fde1 | 102 | # List perf subcommands or long options |
6e0dc374 | 103 | if [ $cword -eq 1 ]; then |
35c2fde1 NK |
104 | if [[ $cur == --* ]]; then |
105 | COMPREPLY=( $( compgen -W '--help --version \ | |
106 | --exec-path --html-path --paginate --no-pager \ | |
107 | --perf-dir --work-tree --debugfs-dir' -- "$cur" ) ) | |
108 | else | |
109 | cmds=$($cmd --list-cmds) | |
110 | COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) | |
111 | fi | |
a3277d2d | 112 | # List possible events for -e option |
6e0dc374 | 113 | elif [[ $prev == "-e" && "${words[1]}" == @(record|stat|top) ]]; then |
4d8061fa NK |
114 | evts=$($cmd list --raw-dump) |
115 | COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) ) | |
ae0c1f99 | 116 | __ltrim_colon_completions $cur |
4d8061fa NK |
117 | # List long option names |
118 | elif [[ $cur == --* ]]; then | |
6e0dc374 | 119 | subcmd=${words[1]} |
4d8061fa NK |
120 | opts=$($cmd $subcmd --list-opts) |
121 | COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) ) | |
98a4179c FW |
122 | fi |
123 | } && | |
7b6c48e1 RR |
124 | |
125 | complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \ | |
126 | || complete -o default -o nospace -F _perf perf |