|  | # perf completion | 
|  |  | 
|  | function_exists() | 
|  | { | 
|  | declare -F $1 > /dev/null | 
|  | return $? | 
|  | } | 
|  |  | 
|  | function_exists __ltrim_colon_completions || | 
|  | __ltrim_colon_completions() | 
|  | { | 
|  | if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then | 
|  | # Remove colon-word prefix from COMPREPLY items | 
|  | local colon_word=${1%${1##*:}} | 
|  | local i=${#COMPREPLY[*]} | 
|  | while [[ $((--i)) -ge 0 ]]; do | 
|  | COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} | 
|  | done | 
|  | fi | 
|  | } | 
|  |  | 
|  | have perf && | 
|  | _perf() | 
|  | { | 
|  | local cur prev cmd | 
|  |  | 
|  | COMPREPLY=() | 
|  | if function_exists _get_comp_words_by_ref; then | 
|  | _get_comp_words_by_ref -n : cur prev | 
|  | else | 
|  | cur=$(_get_cword :) | 
|  | prev=${COMP_WORDS[COMP_CWORD-1]} | 
|  | fi | 
|  |  | 
|  | cmd=${COMP_WORDS[0]} | 
|  |  | 
|  | # List perf subcommands or long options | 
|  | if [ $COMP_CWORD -eq 1 ]; then | 
|  | if [[ $cur == --* ]]; then | 
|  | COMPREPLY=( $( compgen -W '--help --version \ | 
|  | --exec-path --html-path --paginate --no-pager \ | 
|  | --perf-dir --work-tree --debugfs-dir' -- "$cur" ) ) | 
|  | else | 
|  | cmds=$($cmd --list-cmds) | 
|  | COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) | 
|  | fi | 
|  | # List possible events for -e option | 
|  | elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then | 
|  | evts=$($cmd list --raw-dump) | 
|  | COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) ) | 
|  | __ltrim_colon_completions $cur | 
|  | # List long option names | 
|  | elif [[ $cur == --* ]];  then | 
|  | subcmd=${COMP_WORDS[1]} | 
|  | opts=$($cmd $subcmd --list-opts) | 
|  | COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) ) | 
|  | # Fall down to list regular files | 
|  | else | 
|  | _filedir | 
|  | fi | 
|  | } && | 
|  | complete -F _perf perf |