Ville Skyttä c875723bef Include trailing equals sign in options that take arguments that way.
This way it's clearer to users that an argument is expected.  It's
likely that this commit does not catch all such cases, but it should
do it for most of the affected commands I have installed.
2011-05-02 11:45:55 +03:00

531 lines
14 KiB
Bash

# bash completion for java, javac and javadoc
# available path elements completion
have java || have javac || have javadoc &&
_java_path()
{
cur=${cur##*:}
_filedir '@(jar|zip)'
}
have java || have javadoc && {
# exact classpath determination
_java_find_classpath()
{
local i
# search first in current options
for (( i=1; i < cword; i++ )); do
if [[ "${words[i]}" == -@(cp|classpath) ]]; then
classpath=${words[i+1]}
break
fi
done
# default to environment
[ -z "$classpath" ] && classpath=$CLASSPATH
# default to current directory
[ -z "$classpath" ] && classpath=.
}
# exact sourcepath determination
_java_find_sourcepath()
{
local i
# search first in current options
for (( i=1; i < cword; i++ )); do
if [[ "${words[i]}" == -sourcepath ]]; then
sourcepath=${words[i+1]}
break
fi
done
# default to classpath
if [ -z "$sourcepath" ]; then
local classpath
_java_find_classpath
sourcepath=$classpath
fi
}
# available classes completion
_java_classes()
{
local classpath i
# find which classpath to use
_java_find_classpath
# convert package syntax to path syntax
cur=${cur//.//}
# parse each classpath element for classes
for i in ${classpath//:/ }; do
if [[ "$i" == *.@(jar|zip) && -r $i ]]; then
if type zipinfo &>/dev/null; then
COMPREPLY+=( $( zipinfo -1 "$i" "$cur*" 2>/dev/null | \
command grep '^[^$]*\.class$' ) )
else
COMPREPLY+=( $( jar tf "$i" "$cur" | \
command grep '^[^$]*\.class$' ) )
fi
elif [ -d $i ]; then
COMPREPLY+=(
$( compgen -d -- "$i/$cur" | sed -e "s|^$i/\(.*\)|\1.|" )
$( compgen -f -X '!*.class' -- "$i/$cur" | \
sed -e '/\$/d' -e "s|^$i/||" )
)
[[ $COMPREPLY == *.class ]] || compopt -o nospace
# FIXME: if we have foo.class and foo/, the completion
# returns "foo/"... how to give precedence to files
# over directories?
fi
done
# remove class extension
COMPREPLY=( ${COMPREPLY[@]%.class} )
# convert path syntax to package syntax
COMPREPLY=( ${COMPREPLY[@]//\//.} )
}
# available packages completion
_java_packages()
{
local sourcepath i
# find which sourcepath to use
_java_find_sourcepath
# convert package syntax to path syntax
cur=${cur//.//}
# parse each sourcepath element for packages
for i in ${sourcepath//:/ }; do
if [ -d $i ]; then
COMPREPLY+=( $( command ls -F -d $i/$cur* 2>/dev/null | \
sed -e 's|^'$i'/||' ) )
fi
done
# keep only packages
COMPREPLY=( $( tr " " "\n" <<<"${COMPREPLY[@]}" | command grep "/$" ) )
# remove packages extension
COMPREPLY=( ${COMPREPLY[@]%/} )
# convert path syntax to package syntax
cur=${COMPREPLY[@]//\//.}
}
}
# java completion
#
have java &&
_java()
{
local cur prev words cword
_init_completion -n : || return
local i
for ((i=1; i < $cword; i++)); do
case ${words[$i]} in
-cp|-classpath)
((i++)) # skip the classpath string.
;;
-*)
# this is an option, not a class/jarfile name.
;;
*)
# once we've seen a class, just do filename completion
_filedir
return 0
;;
esac
done
case $cur in
# standard option completions
-verbose:*)
COMPREPLY=( $( compgen -W 'class gc jni' -- "${cur#*:}" ) )
return 0
;;
-javaagent:*)
cur=${cur#*:}
_filedir '@(jar|zip)'
return 0
;;
-agentpath:*)
cur=${cur#*:}
_filedir so
return 0
;;
# various non-standard option completions
-splash:*)
cur=${cur#*:}
_filedir '@(gif|jp?(e)g|png)'
return 0
;;
-Xbootclasspath*:*)
_java_path
return 0
;;
-Xcheck:*)
COMPREPLY=( $( compgen -W 'jni' -- "${cur#*:}" ) )
return 0
;;
-Xgc:*)
COMPREPLY=( $( compgen -W 'singlecon gencon singlepar genpar' \
-- "${cur#*:}" ) )
return 0
;;
-Xgcprio:*)
COMPREPLY=( $( compgen -W 'throughput pausetime deterministic' \
-- "${cur#*:}" ) )
return 0
;;
-Xloggc:*|-Xverboselog:*)
cur=${cur#*:}
_filedir
return 0
;;
-Xshare:*)
COMPREPLY=( $( compgen -W 'auto off on' -- "${cur#*:}" ) )
return 0
;;
-Xverbose:*)
COMPREPLY=( $( compgen -W 'memory load jni cpuinfo codegen opt
gcpause gcreport' -- "${cur#*:}" ) )
return 0
;;
-Xverify:*)
COMPREPLY=( $( compgen -W 'all none remote' -- "${cur#*:}" ) )
return 0
;;
# the rest that we have no completions for
-D*|-*:*)
return 0
;;
esac
case $prev in
-cp|-classpath)
_java_path
return 0
;;
esac
if [[ "$cur" == -* ]]; then
COMPREPLY=( $( compgen -W '$( _parse_help "$1" -help )' -- "$cur" ) )
[[ $cur == -X* ]] && \
COMPREPLY+=( $( compgen -W '$( _parse_help "$1" -X )' -- "$cur" ) )
else
if [[ "$prev" == -jar ]]; then
# jar file completion
_filedir jar
else
# classes completion
_java_classes
fi
fi
[[ $COMPREPLY == -*[:=] ]] && compopt -o nospace
__ltrim_colon_completions "$cur"
} &&
complete -F _java java
have javadoc &&
_javadoc()
{
local cur prev words cword
_init_completion || return
case $prev in
-overview|-helpfile)
_filedir '?(x)htm?(l)'
return 0
;;
-stylesheetfile)
_filedir css
return 0
;;
-d|-link|-linkoffline)
# TODO: -linkoffline takes two arguments
_filedir -d
return 0
;;
-classpath|-bootclasspath|-docletpath|-sourcepath|-extdirs)
_java_path
return 0
;;
esac
if [[ "$cur" == -* ]]; then
COMPREPLY=( $( compgen -W '$( _parse_help "$1" -help )' -- "$cur" ) )
else
# source files completion
_filedir java
# packages completion
_java_packages
fi
} &&
complete -F _javadoc javadoc
have javac &&
_javac()
{
local cur prev words cword
_init_completion -n : || return
case $prev in
-d)
_filedir -d
return 0
;;
-classpath|-bootclasspath|-sourcepath|-extdirs)
_java_path
return 0
;;
esac
if [[ $cur == -+([a-zA-z0-9-_]):* ]]; then
# Parse required options from -foo:{bar,quux,baz}
local helpopt=-help
[[ $cur == -X* ]] && helpopt=-X
# For some reason there may be -g:none AND -g:{lines,source,vars};
# convert the none case to the curly brace format so it parses like
# the others.
local opts=$( "$1" $helpopt 2>&1 | sed -e 's/-g:none/-g:{none}/' -ne \
"s/^[[:space:]]*${cur%%:*}:{\([^}]\{1,\}\)}.*/\1/p" )
COMPREPLY=( $( compgen -W "${opts//,/ }" -- "${cur#*:}" ) )
return
fi
if [[ "$cur" == -* ]]; then
COMPREPLY=( $( compgen -W '$( _parse_help "$1" -help )' -- "$cur" ) )
[[ $cur == -X* ]] && \
COMPREPLY+=( $( compgen -W '$( _parse_help "$1" -X )' -- "$cur" ) )
else
# source files completion
_filedir java
fi
[[ $COMPREPLY == -*[:=] ]] && compopt -o nospace
__ltrim_colon_completions "$cur"
} &&
complete -F _javac javac
have pack200 &&
_pack200()
{
local cur prev words cword split
_init_completion -s || return
case $prev in
-S|--segment-limit|-P|--pass-file|-C|--class-attribute|\
-F|--field-attribute|-M|--method-attribute|-D|--code-attribute|\
'-?'|-h|--help|-V|--version|-J)
return 0
;;
-E|--effort)
COMPREPLY=( $( compgen -W '{0..9}' -- "$cur" ) )
return 0
;;
-H|--deflate-hint)
COMPREPLY=( $( compgen -W 'true false keep' -- "$cur" ) )
return 0
;;
-m|--modification-time)
COMPREPLY=( $( compgen -W 'latest keep' -- "$cur" ) )
return 0
;;
-U|--unknown-attribute)
COMPREPLY=( $( compgen -W 'error strip pass' -- "$cur" ) )
return 0
;;
-f|--config-file)
_filedir properties
return 0
;;
-l|--log-file)
COMPREPLY=( $( compgen -W '-' -- "$cur" ) )
_filedir log
return 0
;;
-r|--repack)
_filedir jar
return 0
;;
esac
$split && return
# Check if a pack or a jar was already given.
local i pack=false jar=false
for (( i=0; i < ${#words[@]}-1; i++ )) ; do
case ${words[i]} in
*.pack|*.pack.gz) pack=true ;;
*.jar) jar=true ;;
esac
done
if ! $pack ; then
if [[ "$cur" == -* ]] ; then
COMPREPLY=( $( compgen -W '--no-gzip --gzip --strip-debug \
--no-keep-file-order --segment-limit= --effort= \
--deflate-hint= --modification-time= --pass-file= \
--unknown-attribute= --class-attribute= --field-attribute= \
--method-attribute= --code-attribute= --config-file= \
--verbose --quiet --log-file= --help --version -J \
--repack' -- "$cur" ) )
[[ $COMPREPLY == *= ]] && compopt -o nospace
else
_filedir 'pack?(.gz)'
fi
elif ! $jar ; then
_filedir jar
fi
} &&
complete -F _pack200 pack200
have unpack200 &&
_unpack200()
{
local cur prev words cword split
_init_completion -s || return
case $prev in
'-?'|-h|--help|-V|--version|-J)
return 0
;;
-H|--deflate-hint)
COMPREPLY=( $( compgen -W 'true false keep' -- "$cur" ) )
return 0
;;
-l|--log-file)
COMPREPLY=( $( compgen -W '-' -- "$cur" ) )
_filedir log
return 0
;;
esac
$split && return
# Check if a pack or a jar was already given.
local i pack=false jar=false
for (( i=0; i < ${#words[@]}-1; i++ )) ; do
case ${words[i]} in
*.pack|*.pack.gz) pack=true ;;
*.jar) jar=true ;;
esac
done
if ! $pack ; then
if [[ "$cur" == -* ]] ; then
COMPREPLY=( $( compgen -W '--deflate-hint= --remove-pack-file \
--verbose --quiet --log-file= --help --version' -- "$cur" ) )
[[ $COMPREPLY == *= ]] && compopt -o nospace
else
_filedir 'pack?(.gz)'
fi
elif ! $jar ; then
_filedir jar
fi
} &&
complete -F _unpack200 unpack200
have jarsigner &&
_jarsigner()
{
local cur prev words cword
_init_completion || return
case $prev in
-keystore)
COMPREPLY=( $( compgen -W 'NONE' -- "$cur" ) )
_filedir '@(jks|ks|p12|pfx)'
return 0
;;
-storepass|-keypass|-sigfile|-digestalg|-sigalg|-tsacert|-altsigner|\
-altsignerpath|-providerName|-providerClass|-providerArg)
return 0
;;
-storetype)
COMPREPLY=( $( compgen -W 'JKS PKCS11 PKCS12' -- "$cur" ) )
return 0
;;
-signedjar)
_filedir jar
return 0
;;
-tsa)
_filedir
return 0
;;
esac
# Check if a jar was already given.
local i jar=false
for (( i=0; i < ${#words[@]}-1; i++ )) ; do
if [[ "${words[i]}" == *.jar && \
"${words[i-1]}" != -signedjar ]] ; then
jar=true
break
fi
done
if ! $jar ; then
if [[ "$cur" == -* ]] ; then
# Documented as "should not be used": -internalsf, -sectionsonly
COMPREPLY=( $( compgen -W '-keystore -storepass -storetype \
-keypass -sigfile -signedjar -digestalg -sigalg -verify \
-verbose -certs -tsa -tsacert -altsigner -altsignerpath \
-protected -providerName -providerClass -providerArg' \
-- "$cur" ) )
fi
_filedir jar
fi
} &&
complete -F _jarsigner jarsigner
have javaws &&
_javaws()
{
local cur prev words cword
_init_completion -n = || return
case $prev in
-help|-license|-about|-viewer|-arg|-param|-property|-update|-umask)
return 0
;;
-basedir|-codebase)
_filedir -d
return 0
;;
-uninstall|-import)
_filedir jnlp
return 0
;;
esac
if [[ $cur == *= ]]; then
return 0
elif [[ $cur == -* ]]; then
COMPREPLY=( $( compgen -W "$( _parse_help "$1" -help ) " -- "$cur" ) )
[[ $COMPREPLY == *= ]] && compopt -o nospace
return 0
fi
_filedir jnlp
} &&
complete -F _javaws javaws
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh