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
}
2015-03-18 16:35:47 +03:00
__perf_prev_skip_opts ( )
{
local i cmd_ cmds_
let i = cword-1
cmds_ = $( $cmd --list-cmds)
prev_skip_opts = ( )
while [ $i -ge 0 ] ; do
for cmd_ in $cmds_ ; do
if [ [ ${ words [i] } = = $cmd_ ] ] ; then
prev_skip_opts = ${ words [i] }
return
fi
done
( ( i--) )
done
}
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
2015-03-18 16:35:47 +03:00
# Skip options backward and find the last perf command
__perf_prev_skip_opts
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
perf tools: Fix the bash completion problem of 'perf --*'
The perf-completion.sh uses a predefined string '--help --version
--exec-path --html-path --paginate --no-pager --perf-dir --work-tree
--debugfs-dir' for the bash completion of 'perf --*', which has two
problems:
Problem 1: If the options of perf are changed (see handle_options() in
perf.c), the perf-completion.sh has to be changed at the same time. If
not, the bash completion of 'perf --*' and the options which perf
really supports will be inconsistent.
Problem 2: When typing another single character after 'perf --', e.g.
'h', and hit TAB key to get the bash completion of 'perf --h', the
character 'h' disappears at once. This is not what we want, we wish the
bash completion can return '--help --html-path' and then we can
continue to choose one.
To solve this problem, we add '--list-opts' to perf, which now supports
'perf --list-opts' directly, and its result can be used in bash
completion now.
Example:
Before this patch:
$ perf --h <-- hit TAB key after character 'h'
$ perf -- <-- 'h' disappears and no required result
After this patch:
$ perf --h <-- hit TAB key after character 'h'
--help --html-path <-- the required result
Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1425032491-20224-8-git-send-email-yunlong.song@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-02-27 13:21:31 +03:00
cmds = $( $cmd --list-opts)
2012-10-02 19:21:33 +04:00
else
cmds = $( $cmd --list-cmds)
fi
perf tools: Fix the bash completion problem of 'perf --*'
The perf-completion.sh uses a predefined string '--help --version
--exec-path --html-path --paginate --no-pager --perf-dir --work-tree
--debugfs-dir' for the bash completion of 'perf --*', which has two
problems:
Problem 1: If the options of perf are changed (see handle_options() in
perf.c), the perf-completion.sh has to be changed at the same time. If
not, the bash completion of 'perf --*' and the options which perf
really supports will be inconsistent.
Problem 2: When typing another single character after 'perf --', e.g.
'h', and hit TAB key to get the bash completion of 'perf --h', the
character 'h' disappears at once. This is not what we want, we wish the
bash completion can return '--help --html-path' and then we can
continue to choose one.
To solve this problem, we add '--list-opts' to perf, which now supports
'perf --list-opts' directly, and its result can be used in bash
completion now.
Example:
Before this patch:
$ perf --h <-- hit TAB key after character 'h'
$ perf -- <-- 'h' disappears and no required result
After this patch:
$ perf --h <-- hit TAB key after character 'h'
--help --html-path <-- the required result
Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1425032491-20224-8-git-send-email-yunlong.song@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-02-27 13:21:31 +03:00
__perfcomp " $cmds " " $cur "
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 "
2015-03-18 16:35:46 +03:00
else
# List subcommands for perf commands
2015-03-18 16:35:47 +03:00
if [ [ $prev_skip_opts = = @( kvm| kmem| mem| lock| sched) ] ] ; then
subcmds = $( $cmd $prev_skip_opts --list-cmds)
2015-03-18 16:35:46 +03:00
__perfcomp_colon " $subcmds " " $cur "
fi
# List long option names
if [ [ $cur = = --* ] ] ; then
subcmd = ${ words [1] }
opts = $( $cmd $subcmd --list-opts)
__perfcomp " $opts " " $cur "
fi
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