| 
									
										
										
										
											2013-11-17 21:43:26 +05:30
										 |  |  | # perf bash and zsh completion | 
					
						
							| 
									
										
										
										
											2012-08-09 16:31:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:30 +05:30
										 |  |  | # 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 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:29 +05:30
										 |  |  | type __ltrim_colon_completions &>/dev/null || | 
					
						
							| 
									
										
										
										
											2012-10-04 14:23:54 +09:00
										 |  |  | __ltrim_colon_completions() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then | 
					
						
							|  |  |  | 		# Remove colon-word prefix from COMPREPLY items | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:26 +05:30
										 |  |  | 		local colon_word=${1%"${1##*:}"} | 
					
						
							| 
									
										
										
										
											2012-10-04 14:23:54 +09:00
										 |  |  | 		local i=${#COMPREPLY[*]} | 
					
						
							|  |  |  | 		while [[ $((--i)) -ge 0 ]]; do | 
					
						
							|  |  |  | 			COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:24 +05:30
										 |  |  | __perfcomp () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	COMPREPLY=( $( compgen -W "$1" -- "$2" ) ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:25 +05:30
										 |  |  | __perfcomp_colon () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__perfcomp "$1" "$2" | 
					
						
							|  |  |  | 	__ltrim_colon_completions $cur | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:23 +05:30
										 |  |  | __perf_main () | 
					
						
							| 
									
										
										
										
											2012-08-09 16:31:51 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:23 +05:30
										 |  |  | 	local cmd | 
					
						
							| 
									
										
										
										
											2012-08-09 16:31:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:31 +05:30
										 |  |  | 	cmd=${words[0]} | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:23 +05:30
										 |  |  | 	COMPREPLY=() | 
					
						
							| 
									
										
										
										
											2012-08-09 16:31:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:33 +09:00
										 |  |  | 	# List perf subcommands or long options | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:31 +05:30
										 |  |  | 	if [ $cword -eq 1 ]; then | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:33 +09:00
										 |  |  | 		if [[ $cur == --* ]]; then | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:24 +05:30
										 |  |  | 			__perfcomp '--help --version \
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:33 +09:00
										 |  |  | 			--exec-path --html-path --paginate --no-pager \
 | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:24 +05:30
										 |  |  | 			--perf-dir --work-tree --debugfs-dir' -- "$cur" | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:33 +09:00
										 |  |  | 		else | 
					
						
							|  |  |  | 			cmds=$($cmd --list-cmds) | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:24 +05:30
										 |  |  | 			__perfcomp "$cmds" "$cur" | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:33 +09:00
										 |  |  | 		fi | 
					
						
							| 
									
										
										
										
											2012-08-09 16:31:52 +02:00
										 |  |  | 	# List possible events for -e option | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:31 +05:30
										 |  |  | 	elif [[ $prev == "-e" && "${words[1]}" == @(record|stat|top) ]]; then | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:34 +09:00
										 |  |  | 		evts=$($cmd list --raw-dump) | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:25 +05:30
										 |  |  | 		__perfcomp_colon "$evts" "$cur" | 
					
						
							| 
									
										
										
										
											2014-03-14 23:17:51 -04:00
										 |  |  | 	# List subcommands for perf commands | 
					
						
							| 
									
										
										
										
											2014-03-14 23:17:54 -04:00
										 |  |  | 	elif [[ $prev == @(kvm|kmem|mem|lock|sched) ]]; then | 
					
						
							| 
									
										
										
										
											2014-03-03 20:26:36 -05:00
										 |  |  | 		subcmds=$($cmd $prev --list-cmds) | 
					
						
							| 
									
										
										
										
											2013-12-11 16:04:15 +05:30
										 |  |  | 		__perfcomp_colon "$subcmds" "$cur" | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:34 +09:00
										 |  |  | 	# List long option names | 
					
						
							|  |  |  | 	elif [[ $cur == --* ]];  then | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:31 +05:30
										 |  |  | 		subcmd=${words[1]} | 
					
						
							| 
									
										
										
										
											2012-10-03 00:21:34 +09:00
										 |  |  | 		opts=$($cmd $subcmd --list-opts) | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:24 +05:30
										 |  |  | 		__perfcomp "$opts" "$cur" | 
					
						
							| 
									
										
										
										
											2012-08-09 16:31:51 +02:00
										 |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:23 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:26 +05:30
										 |  |  | if [[ -n ${ZSH_VERSION-} ]]; then | 
					
						
							|  |  |  | 	autoload -U +X compinit && compinit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	__perfcomp () | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		emulate -L zsh | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		local c IFS=$' \t\n' | 
					
						
							|  |  |  | 		local -a array | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for c in ${=1}; do | 
					
						
							|  |  |  | 			case $c in | 
					
						
							|  |  |  | 			--*=*|*.) ;; | 
					
						
							|  |  |  | 			*) c="$c " ;; | 
					
						
							|  |  |  | 			esac | 
					
						
							|  |  |  | 			array[${#array[@]}+1]="$c" | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		compset -P '*[=:]' | 
					
						
							|  |  |  | 		compadd -Q -S '' -a -- array && _ret=0 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	__perfcomp_colon () | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		emulate -L zsh | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		local cur_="${2-$cur}" | 
					
						
							|  |  |  | 		local c IFS=$' \t\n' | 
					
						
							|  |  |  | 		local -a array | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if [[ "$cur_" == *:* ]]; then | 
					
						
							|  |  |  | 			local colon_word=${cur_%"${cur_##*:}"} | 
					
						
							|  |  |  | 		fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for c in ${=1}; do | 
					
						
							|  |  |  | 			case $c in | 
					
						
							|  |  |  | 			--*=*|*.) ;; | 
					
						
							|  |  |  | 			*) c="$c " ;; | 
					
						
							|  |  |  | 			esac | 
					
						
							|  |  |  | 			array[$#array+1]=${c#"$colon_word"} | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		compset -P '*[=:]' | 
					
						
							|  |  |  | 		compadd -Q -S '' -a -- array && _ret=0 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_perf () | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		local _ret=1 cur cword prev | 
					
						
							|  |  |  | 		cur=${words[CURRENT]} | 
					
						
							|  |  |  | 		prev=${words[CURRENT-1]} | 
					
						
							|  |  |  | 		let cword=CURRENT-1 | 
					
						
							|  |  |  | 		emulate ksh -c __perf_main | 
					
						
							|  |  |  | 		let _ret && _default && _ret=0 | 
					
						
							|  |  |  | 		return _ret | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	compdef _perf perf | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-17 21:43:23 +05:30
										 |  |  | type perf &>/dev/null && | 
					
						
							|  |  |  | _perf() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	local cur words cword prev | 
					
						
							|  |  |  | 	_get_comp_words_by_ref -n =: cur words cword prev | 
					
						
							|  |  |  | 	__perf_main | 
					
						
							| 
									
										
										
										
											2012-08-09 16:31:51 +02:00
										 |  |  | } && | 
					
						
							| 
									
										
										
										
											2013-07-04 18:11:27 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \
 | 
					
						
							|  |  |  | 	|| complete -o default -o nospace -F _perf perf |