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