summaryrefslogtreecommitdiffstats
path: root/tools/perf/bash_completion
blob: 62e157db2e2b01e9400f9348d671fd9ba7267104 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# perf completion

# Taken from git.git's completion script.
__my_reassemble_comp_words_by_ref()
{
	local exclude i j first
	# Which word separators to exclude?
	exclude="${1//[^$COMP_WORDBREAKS]}"
	cword_=$COMP_CWORD
	if [ -z "$exclude" ]; then
		words_=("${COMP_WORDS[@]}")
		return
	fi
	# List of word completion separators has shrunk;
	# re-assemble words to complete.
	for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
		# Append each nonempty word consisting of just
		# word separator characters to the current word.
		first=t
		while
			[ $i -gt 0 ] &&
			[ -n "${COMP_WORDS[$i]}" ] &&
			# word consists of excluded word separators
			[ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
		do
			# Attach to the previous token,
			# unless the previous token is the command name.
			if [ $j -ge 2 ] && [ -n "$first" ]; then
				((j--))
			fi
			first=
			words_[$j]=${words_[j]}${COMP_WORDS[i]}
			if [ $i = $COMP_CWORD ]; then
				cword_=$j
			fi
			if (($i < ${#COMP_WORDS[@]} - 1)); then
				((i++))
			else
				# Done.
				return
			fi
		done
		words_[$j]=${words_[j]}${COMP_WORDS[i]}
		if [ $i = $COMP_CWORD ]; then
			cword_=$j
		fi
	done
}

type _get_comp_words_by_ref &>/dev/null ||
_get_comp_words_by_ref()
{
	local exclude cur_ words_ cword_
	if [ "$1" = "-n" ]; then
		exclude=$2
		shift 2
	fi
	__my_reassemble_comp_words_by_ref "$exclude"
	cur_=${words_[cword_]}
	while [ $# -gt 0 ]; do
		case "$1" in
		cur)
			cur=$cur_
			;;
		prev)
			prev=${words_[$cword_-1]}
			;;
		words)
			words=("${words_[@]}")
			;;
		cword)
			cword=$cword_
			;;
		esac
		shift
	done
}

type __ltrim_colon_completions &>/dev/null ||
__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
}

type perf &>/dev/null &&
_perf()
{
	local cur words cword prev cmd

	COMPREPLY=()
	_get_comp_words_by_ref -n =: cur words cword prev

	cmd=${words[0]}

	# List perf subcommands or long options
	if [ $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" && "${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=${words[1]}
		opts=$($cmd $subcmd --list-opts)
		COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) )
	fi
} &&

complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \
	|| complete -o default -o nospace -F _perf perf