diff options
Diffstat (limited to 'tools/perf/bash_completion')
-rw-r--r-- | tools/perf/bash_completion | 106 |
1 files changed, 85 insertions, 21 deletions
diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion index 56e6a12aab59..62e157db2e2b 100644 --- a/tools/perf/bash_completion +++ b/tools/perf/bash_completion | |||
@@ -1,17 +1,87 @@ | |||
1 | # perf completion | 1 | # perf completion |
2 | 2 | ||
3 | function_exists() | 3 | # Taken from git.git's completion script. |
4 | __my_reassemble_comp_words_by_ref() | ||
4 | { | 5 | { |
5 | declare -F $1 > /dev/null | 6 | local exclude i j first |
6 | return $? | 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 | ||
7 | } | 48 | } |
8 | 49 | ||
9 | function_exists __ltrim_colon_completions || | 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 | |||
79 | type __ltrim_colon_completions &>/dev/null || | ||
10 | __ltrim_colon_completions() | 80 | __ltrim_colon_completions() |
11 | { | 81 | { |
12 | if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then | 82 | if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then |
13 | # Remove colon-word prefix from COMPREPLY items | 83 | # Remove colon-word prefix from COMPREPLY items |
14 | local colon_word=${1%${1##*:}} | 84 | local colon_word=${1%"${1##*:}"} |
15 | local i=${#COMPREPLY[*]} | 85 | local i=${#COMPREPLY[*]} |
16 | while [[ $((--i)) -ge 0 ]]; do | 86 | while [[ $((--i)) -ge 0 ]]; do |
17 | COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} | 87 | COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} |
@@ -19,23 +89,18 @@ __ltrim_colon_completions() | |||
19 | fi | 89 | fi |
20 | } | 90 | } |
21 | 91 | ||
22 | have perf && | 92 | type perf &>/dev/null && |
23 | _perf() | 93 | _perf() |
24 | { | 94 | { |
25 | local cur prev cmd | 95 | local cur words cword prev cmd |
26 | 96 | ||
27 | COMPREPLY=() | 97 | COMPREPLY=() |
28 | if function_exists _get_comp_words_by_ref; then | 98 | _get_comp_words_by_ref -n =: cur words cword prev |
29 | _get_comp_words_by_ref -n : cur prev | ||
30 | else | ||
31 | cur=$(_get_cword :) | ||
32 | prev=${COMP_WORDS[COMP_CWORD-1]} | ||
33 | fi | ||
34 | 99 | ||
35 | cmd=${COMP_WORDS[0]} | 100 | cmd=${words[0]} |
36 | 101 | ||
37 | # List perf subcommands or long options | 102 | # List perf subcommands or long options |
38 | if [ $COMP_CWORD -eq 1 ]; then | 103 | if [ $cword -eq 1 ]; then |
39 | if [[ $cur == --* ]]; then | 104 | if [[ $cur == --* ]]; then |
40 | COMPREPLY=( $( compgen -W '--help --version \ | 105 | COMPREPLY=( $( compgen -W '--help --version \ |
41 | --exec-path --html-path --paginate --no-pager \ | 106 | --exec-path --html-path --paginate --no-pager \ |
@@ -45,18 +110,17 @@ _perf() | |||
45 | COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) | 110 | COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) |
46 | fi | 111 | fi |
47 | # List possible events for -e option | 112 | # List possible events for -e option |
48 | elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then | 113 | elif [[ $prev == "-e" && "${words[1]}" == @(record|stat|top) ]]; then |
49 | evts=$($cmd list --raw-dump) | 114 | evts=$($cmd list --raw-dump) |
50 | COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) ) | 115 | COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) ) |
51 | __ltrim_colon_completions $cur | 116 | __ltrim_colon_completions $cur |
52 | # List long option names | 117 | # List long option names |
53 | elif [[ $cur == --* ]]; then | 118 | elif [[ $cur == --* ]]; then |
54 | subcmd=${COMP_WORDS[1]} | 119 | subcmd=${words[1]} |
55 | opts=$($cmd $subcmd --list-opts) | 120 | opts=$($cmd $subcmd --list-opts) |
56 | COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) ) | 121 | COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) ) |
57 | # Fall down to list regular files | ||
58 | else | ||
59 | _filedir | ||
60 | fi | 122 | fi |
61 | } && | 123 | } && |
62 | complete -F _perf perf | 124 | |
125 | complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \ | ||
126 | || complete -o default -o nospace -F _perf perf | ||