2012-08-09 18:31:51 +04:00
# perf completion
2013-07-04 16:41:30 +04:00
# 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 16:41:29 +04:00
type __ltrim_colon_completions & >/dev/null ||
2012-10-04 09:23:54 +04:00
__ltrim_colon_completions( )
{
if [ [ " $1 " = = *:* && " $COMP_WORDBREAKS " = = *:* ] ] ; then
# Remove colon-word prefix from COMPREPLY items
2013-07-04 16:41:26 +04:00
local colon_word = ${ 1 % " ${ 1 ##* : } " }
2012-10-04 09:23:54 +04:00
local i = ${# COMPREPLY [*] }
while [ [ $(( - - i)) -ge 0 ] ] ; do
COMPREPLY[ $i ] = ${ COMPREPLY [ $i ]# " $colon_word " }
done
fi
}
2013-07-04 16:41:25 +04:00
type perf & >/dev/null &&
2012-08-09 18:31:51 +04:00
_perf( )
{
2012-10-02 19:21:32 +04:00
local cur prev cmd
2012-08-09 18:31:51 +04:00
COMPREPLY = ( )
2013-07-04 16:41:30 +04:00
_get_comp_words_by_ref -n : cur prev
2012-08-09 18:31:51 +04:00
cmd = ${ COMP_WORDS [0] }
2012-10-02 19:21:33 +04:00
# List perf subcommands or long options
2012-08-09 18:31:51 +04:00
if [ $COMP_CWORD -eq 1 ] ; then
2012-10-02 19:21:33 +04:00
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
2012-08-09 18:31:52 +04:00
# List possible events for -e option
elif [ [ $prev = = "-e" && " ${ COMP_WORDS [1] } " = = @( record| stat| top) ] ] ; then
2012-10-02 19:21:34 +04:00
evts = $( $cmd list --raw-dump)
COMPREPLY = ( $( compgen -W '$evts' -- " $cur " ) )
2012-10-04 09:23:54 +04:00
__ltrim_colon_completions $cur
2012-10-02 19:21:34 +04:00
# List long option names
elif [ [ $cur = = --* ] ] ; then
subcmd = ${ COMP_WORDS [1] }
opts = $( $cmd $subcmd --list-opts)
COMPREPLY = ( $( compgen -W '$opts' -- " $cur " ) )
2012-08-09 18:31:51 +04:00
fi
} &&
2013-07-04 16:41:27 +04:00
complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \
|| complete -o default -o nospace -F _perf perf