xref: /openbmc/linux/tools/perf/perf-completion.sh (revision 67afff485b2ce742374edb2e17d21e2bc664eb1f)
1a8b4c701SRamkumar Ramachandra# perf bash and zsh completion
2a8b4c701SRamkumar Ramachandra
3a8b4c701SRamkumar Ramachandra# Taken from git.git's completion script.
4a8b4c701SRamkumar Ramachandra__my_reassemble_comp_words_by_ref()
5a8b4c701SRamkumar Ramachandra{
6a8b4c701SRamkumar Ramachandra	local exclude i j first
7a8b4c701SRamkumar Ramachandra	# Which word separators to exclude?
8a8b4c701SRamkumar Ramachandra	exclude="${1//[^$COMP_WORDBREAKS]}"
9a8b4c701SRamkumar Ramachandra	cword_=$COMP_CWORD
10a8b4c701SRamkumar Ramachandra	if [ -z "$exclude" ]; then
11a8b4c701SRamkumar Ramachandra		words_=("${COMP_WORDS[@]}")
12a8b4c701SRamkumar Ramachandra		return
13a8b4c701SRamkumar Ramachandra	fi
14a8b4c701SRamkumar Ramachandra	# List of word completion separators has shrunk;
15a8b4c701SRamkumar Ramachandra	# re-assemble words to complete.
16a8b4c701SRamkumar Ramachandra	for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
17a8b4c701SRamkumar Ramachandra		# Append each nonempty word consisting of just
18a8b4c701SRamkumar Ramachandra		# word separator characters to the current word.
19a8b4c701SRamkumar Ramachandra		first=t
20a8b4c701SRamkumar Ramachandra		while
21a8b4c701SRamkumar Ramachandra			[ $i -gt 0 ] &&
22a8b4c701SRamkumar Ramachandra			[ -n "${COMP_WORDS[$i]}" ] &&
23a8b4c701SRamkumar Ramachandra			# word consists of excluded word separators
24a8b4c701SRamkumar Ramachandra			[ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
25a8b4c701SRamkumar Ramachandra		do
26a8b4c701SRamkumar Ramachandra			# Attach to the previous token,
27a8b4c701SRamkumar Ramachandra			# unless the previous token is the command name.
28a8b4c701SRamkumar Ramachandra			if [ $j -ge 2 ] && [ -n "$first" ]; then
29a8b4c701SRamkumar Ramachandra				((j--))
30a8b4c701SRamkumar Ramachandra			fi
31a8b4c701SRamkumar Ramachandra			first=
32a8b4c701SRamkumar Ramachandra			words_[$j]=${words_[j]}${COMP_WORDS[i]}
33a8b4c701SRamkumar Ramachandra			if [ $i = $COMP_CWORD ]; then
34a8b4c701SRamkumar Ramachandra				cword_=$j
35a8b4c701SRamkumar Ramachandra			fi
36a8b4c701SRamkumar Ramachandra			if (($i < ${#COMP_WORDS[@]} - 1)); then
37a8b4c701SRamkumar Ramachandra				((i++))
38a8b4c701SRamkumar Ramachandra			else
39a8b4c701SRamkumar Ramachandra				# Done.
40a8b4c701SRamkumar Ramachandra				return
41a8b4c701SRamkumar Ramachandra			fi
42a8b4c701SRamkumar Ramachandra		done
43a8b4c701SRamkumar Ramachandra		words_[$j]=${words_[j]}${COMP_WORDS[i]}
44a8b4c701SRamkumar Ramachandra		if [ $i = $COMP_CWORD ]; then
45a8b4c701SRamkumar Ramachandra			cword_=$j
46a8b4c701SRamkumar Ramachandra		fi
47a8b4c701SRamkumar Ramachandra	done
48a8b4c701SRamkumar Ramachandra}
49a8b4c701SRamkumar Ramachandra
50a8b4c701SRamkumar Ramachandratype _get_comp_words_by_ref &>/dev/null ||
51a8b4c701SRamkumar Ramachandra_get_comp_words_by_ref()
52a8b4c701SRamkumar Ramachandra{
53a8b4c701SRamkumar Ramachandra	local exclude cur_ words_ cword_
54a8b4c701SRamkumar Ramachandra	if [ "$1" = "-n" ]; then
55a8b4c701SRamkumar Ramachandra		exclude=$2
56a8b4c701SRamkumar Ramachandra		shift 2
57a8b4c701SRamkumar Ramachandra	fi
58a8b4c701SRamkumar Ramachandra	__my_reassemble_comp_words_by_ref "$exclude"
59a8b4c701SRamkumar Ramachandra	cur_=${words_[cword_]}
60a8b4c701SRamkumar Ramachandra	while [ $# -gt 0 ]; do
61a8b4c701SRamkumar Ramachandra		case "$1" in
62a8b4c701SRamkumar Ramachandra		cur)
63a8b4c701SRamkumar Ramachandra			cur=$cur_
64a8b4c701SRamkumar Ramachandra			;;
65a8b4c701SRamkumar Ramachandra		prev)
66a8b4c701SRamkumar Ramachandra			prev=${words_[$cword_-1]}
67a8b4c701SRamkumar Ramachandra			;;
68a8b4c701SRamkumar Ramachandra		words)
69a8b4c701SRamkumar Ramachandra			words=("${words_[@]}")
70a8b4c701SRamkumar Ramachandra			;;
71a8b4c701SRamkumar Ramachandra		cword)
72a8b4c701SRamkumar Ramachandra			cword=$cword_
73a8b4c701SRamkumar Ramachandra			;;
74a8b4c701SRamkumar Ramachandra		esac
75a8b4c701SRamkumar Ramachandra		shift
76a8b4c701SRamkumar Ramachandra	done
77a8b4c701SRamkumar Ramachandra}
78a8b4c701SRamkumar Ramachandra
79a8b4c701SRamkumar Ramachandratype __ltrim_colon_completions &>/dev/null ||
80a8b4c701SRamkumar Ramachandra__ltrim_colon_completions()
81a8b4c701SRamkumar Ramachandra{
82a8b4c701SRamkumar Ramachandra	if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
83a8b4c701SRamkumar Ramachandra		# Remove colon-word prefix from COMPREPLY items
84a8b4c701SRamkumar Ramachandra		local colon_word=${1%"${1##*:}"}
85a8b4c701SRamkumar Ramachandra		local i=${#COMPREPLY[*]}
86a8b4c701SRamkumar Ramachandra		while [[ $((--i)) -ge 0 ]]; do
87a8b4c701SRamkumar Ramachandra			COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
88a8b4c701SRamkumar Ramachandra		done
89a8b4c701SRamkumar Ramachandra	fi
90a8b4c701SRamkumar Ramachandra}
91a8b4c701SRamkumar Ramachandra
92a8b4c701SRamkumar Ramachandra__perfcomp ()
93a8b4c701SRamkumar Ramachandra{
94a8b4c701SRamkumar Ramachandra	COMPREPLY=( $( compgen -W "$1" -- "$2" ) )
95a8b4c701SRamkumar Ramachandra}
96a8b4c701SRamkumar Ramachandra
97a8b4c701SRamkumar Ramachandra__perfcomp_colon ()
98a8b4c701SRamkumar Ramachandra{
99a8b4c701SRamkumar Ramachandra	__perfcomp "$1" "$2"
100a8b4c701SRamkumar Ramachandra	__ltrim_colon_completions $cur
101a8b4c701SRamkumar Ramachandra}
102a8b4c701SRamkumar Ramachandra
103*67afff48SYunlong Song__perf_prev_skip_opts ()
104*67afff48SYunlong Song{
105*67afff48SYunlong Song	local i cmd_ cmds_
106*67afff48SYunlong Song
107*67afff48SYunlong Song	let i=cword-1
108*67afff48SYunlong Song	cmds_=$($cmd --list-cmds)
109*67afff48SYunlong Song	prev_skip_opts=()
110*67afff48SYunlong Song	while [ $i -ge 0 ]; do
111*67afff48SYunlong Song		for cmd_ in $cmds_; do
112*67afff48SYunlong Song			if [[ ${words[i]} == $cmd_ ]]; then
113*67afff48SYunlong Song				prev_skip_opts=${words[i]}
114*67afff48SYunlong Song				return
115*67afff48SYunlong Song			fi
116*67afff48SYunlong Song		done
117*67afff48SYunlong Song		((i--))
118*67afff48SYunlong Song	done
119*67afff48SYunlong Song}
120a8b4c701SRamkumar Ramachandra__perf_main ()
121a8b4c701SRamkumar Ramachandra{
122a8b4c701SRamkumar Ramachandra	local cmd
123a8b4c701SRamkumar Ramachandra
124a8b4c701SRamkumar Ramachandra	cmd=${words[0]}
125a8b4c701SRamkumar Ramachandra	COMPREPLY=()
126a8b4c701SRamkumar Ramachandra
127*67afff48SYunlong Song	# Skip options backward and find the last perf command
128*67afff48SYunlong Song	__perf_prev_skip_opts
129a8b4c701SRamkumar Ramachandra	# List perf subcommands or long options
130a8b4c701SRamkumar Ramachandra	if [ $cword -eq 1 ]; then
131a8b4c701SRamkumar Ramachandra		if [[ $cur == --* ]]; then
1327335399aSYunlong Song			cmds=$($cmd --list-opts)
133a8b4c701SRamkumar Ramachandra		else
134a8b4c701SRamkumar Ramachandra			cmds=$($cmd --list-cmds)
135a8b4c701SRamkumar Ramachandra		fi
1367335399aSYunlong Song		__perfcomp "$cmds" "$cur"
137a8b4c701SRamkumar Ramachandra	# List possible events for -e option
138a8b4c701SRamkumar Ramachandra	elif [[ $prev == "-e" && "${words[1]}" == @(record|stat|top) ]]; then
139a8b4c701SRamkumar Ramachandra		evts=$($cmd list --raw-dump)
140a8b4c701SRamkumar Ramachandra		__perfcomp_colon "$evts" "$cur"
14102fde323SYunlong Song	else
1423bca2354SRamkumar Ramachandra		# List subcommands for perf commands
143*67afff48SYunlong Song		if [[ $prev_skip_opts == @(kvm|kmem|mem|lock|sched) ]]; then
144*67afff48SYunlong Song			subcmds=$($cmd $prev_skip_opts --list-cmds)
1458f2f5adaSRamkumar Ramachandra			__perfcomp_colon "$subcmds" "$cur"
14602fde323SYunlong Song		fi
147a8b4c701SRamkumar Ramachandra		# List long option names
14802fde323SYunlong Song		if [[ $cur == --* ]];  then
149a8b4c701SRamkumar Ramachandra			subcmd=${words[1]}
150a8b4c701SRamkumar Ramachandra			opts=$($cmd $subcmd --list-opts)
151a8b4c701SRamkumar Ramachandra			__perfcomp "$opts" "$cur"
152a8b4c701SRamkumar Ramachandra		fi
15302fde323SYunlong Song	fi
154a8b4c701SRamkumar Ramachandra}
155a8b4c701SRamkumar Ramachandra
156a8b4c701SRamkumar Ramachandraif [[ -n ${ZSH_VERSION-} ]]; then
157a8b4c701SRamkumar Ramachandra	autoload -U +X compinit && compinit
158a8b4c701SRamkumar Ramachandra
159a8b4c701SRamkumar Ramachandra	__perfcomp ()
160a8b4c701SRamkumar Ramachandra	{
161a8b4c701SRamkumar Ramachandra		emulate -L zsh
162a8b4c701SRamkumar Ramachandra
163a8b4c701SRamkumar Ramachandra		local c IFS=$' \t\n'
164a8b4c701SRamkumar Ramachandra		local -a array
165a8b4c701SRamkumar Ramachandra
166a8b4c701SRamkumar Ramachandra		for c in ${=1}; do
167a8b4c701SRamkumar Ramachandra			case $c in
168a8b4c701SRamkumar Ramachandra			--*=*|*.) ;;
169a8b4c701SRamkumar Ramachandra			*) c="$c " ;;
170a8b4c701SRamkumar Ramachandra			esac
171a8b4c701SRamkumar Ramachandra			array[${#array[@]}+1]="$c"
172a8b4c701SRamkumar Ramachandra		done
173a8b4c701SRamkumar Ramachandra
174a8b4c701SRamkumar Ramachandra		compset -P '*[=:]'
175a8b4c701SRamkumar Ramachandra		compadd -Q -S '' -a -- array && _ret=0
176a8b4c701SRamkumar Ramachandra	}
177a8b4c701SRamkumar Ramachandra
178a8b4c701SRamkumar Ramachandra	__perfcomp_colon ()
179a8b4c701SRamkumar Ramachandra	{
180a8b4c701SRamkumar Ramachandra		emulate -L zsh
181a8b4c701SRamkumar Ramachandra
182a8b4c701SRamkumar Ramachandra		local cur_="${2-$cur}"
183a8b4c701SRamkumar Ramachandra		local c IFS=$' \t\n'
184a8b4c701SRamkumar Ramachandra		local -a array
185a8b4c701SRamkumar Ramachandra
186a8b4c701SRamkumar Ramachandra		if [[ "$cur_" == *:* ]]; then
187a8b4c701SRamkumar Ramachandra			local colon_word=${cur_%"${cur_##*:}"}
188a8b4c701SRamkumar Ramachandra		fi
189a8b4c701SRamkumar Ramachandra
190a8b4c701SRamkumar Ramachandra		for c in ${=1}; do
191a8b4c701SRamkumar Ramachandra			case $c in
192a8b4c701SRamkumar Ramachandra			--*=*|*.) ;;
193a8b4c701SRamkumar Ramachandra			*) c="$c " ;;
194a8b4c701SRamkumar Ramachandra			esac
195a8b4c701SRamkumar Ramachandra			array[$#array+1]=${c#"$colon_word"}
196a8b4c701SRamkumar Ramachandra		done
197a8b4c701SRamkumar Ramachandra
198a8b4c701SRamkumar Ramachandra		compset -P '*[=:]'
199a8b4c701SRamkumar Ramachandra		compadd -Q -S '' -a -- array && _ret=0
200a8b4c701SRamkumar Ramachandra	}
201a8b4c701SRamkumar Ramachandra
202a8b4c701SRamkumar Ramachandra	_perf ()
203a8b4c701SRamkumar Ramachandra	{
204a8b4c701SRamkumar Ramachandra		local _ret=1 cur cword prev
205a8b4c701SRamkumar Ramachandra		cur=${words[CURRENT]}
206a8b4c701SRamkumar Ramachandra		prev=${words[CURRENT-1]}
207a8b4c701SRamkumar Ramachandra		let cword=CURRENT-1
208a8b4c701SRamkumar Ramachandra		emulate ksh -c __perf_main
209a8b4c701SRamkumar Ramachandra		let _ret && _default && _ret=0
210a8b4c701SRamkumar Ramachandra		return _ret
211a8b4c701SRamkumar Ramachandra	}
212a8b4c701SRamkumar Ramachandra
213a8b4c701SRamkumar Ramachandra	compdef _perf perf
214a8b4c701SRamkumar Ramachandra	return
215a8b4c701SRamkumar Ramachandrafi
216a8b4c701SRamkumar Ramachandra
217a8b4c701SRamkumar Ramachandratype perf &>/dev/null &&
218a8b4c701SRamkumar Ramachandra_perf()
219a8b4c701SRamkumar Ramachandra{
220a8b4c701SRamkumar Ramachandra	local cur words cword prev
221a8b4c701SRamkumar Ramachandra	_get_comp_words_by_ref -n =: cur words cword prev
222a8b4c701SRamkumar Ramachandra	__perf_main
223a8b4c701SRamkumar Ramachandra} &&
224a8b4c701SRamkumar Ramachandra
225a8b4c701SRamkumar Ramachandracomplete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \
226a8b4c701SRamkumar Ramachandra	|| complete -o default -o nospace -F _perf perf
227