2013-11-17 20:13:26 +04:00
# perf bash and zsh completion
2012-08-09 18:31:51 +04:00
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-11-17 20:13:24 +04:00
__perfcomp ( )
{
COMPREPLY = ( $( compgen -W " $1 " -- " $2 " ) )
}
2013-11-17 20:13:25 +04:00
__perfcomp_colon ( )
{
__perfcomp " $1 " " $2 "
__ltrim_colon_completions $cur
}
2013-11-17 20:13:23 +04:00
__perf_main ( )
2012-08-09 18:31:51 +04:00
{
2013-11-17 20:13:23 +04:00
local cmd
2012-08-09 18:31:51 +04:00
2013-07-04 16:41:31 +04:00
cmd = ${ words [0] }
2013-11-17 20:13:23 +04:00
COMPREPLY = ( )
2012-08-09 18:31:51 +04:00
2012-10-02 19:21:33 +04:00
# List perf subcommands or long options
2013-07-04 16:41:31 +04:00
if [ $cword -eq 1 ] ; then
2012-10-02 19:21:33 +04:00
if [ [ $cur = = --* ] ] ; then
2013-11-17 20:13:24 +04:00
__perfcomp ' --help --version \
2012-10-02 19:21:33 +04:00
--exec-path --html-path --paginate --no-pager \
2013-11-17 20:13:24 +04:00
--perf-dir --work-tree --debugfs-dir' -- " $cur "
2012-10-02 19:21:33 +04:00
else
cmds = $( $cmd --list-cmds)
2013-11-17 20:13:24 +04:00
__perfcomp " $cmds " " $cur "
2012-10-02 19:21:33 +04:00
fi
2012-08-09 18:31:52 +04:00
# List possible events for -e option
2013-07-04 16:41:31 +04:00
elif [ [ $prev = = "-e" && " ${ words [1] } " = = @( record| stat| top) ] ] ; then
2012-10-02 19:21:34 +04:00
evts = $( $cmd list --raw-dump)
2013-11-17 20:13:25 +04:00
__perfcomp_colon " $evts " " $cur "
2014-03-15 07:17:51 +04:00
# List subcommands for perf commands
2014-03-15 07:17:54 +04:00
elif [ [ $prev = = @( kvm| kmem| mem| lock| sched) ] ] ; then
2014-03-04 05:26:36 +04:00
subcmds = $( $cmd $prev --list-cmds)
2013-12-11 14:34:15 +04:00
__perfcomp_colon " $subcmds " " $cur "
2012-10-02 19:21:34 +04:00
# List long option names
elif [ [ $cur = = --* ] ] ; then
2013-07-04 16:41:31 +04:00
subcmd = ${ words [1] }
2012-10-02 19:21:34 +04:00
opts = $( $cmd $subcmd --list-opts)
2013-11-17 20:13:24 +04:00
__perfcomp " $opts " " $cur "
2012-08-09 18:31:51 +04:00
fi
2013-11-17 20:13:23 +04:00
}
2013-11-17 20:13:26 +04:00
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 20:13:23 +04:00
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 18:31:51 +04:00
} &&
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