534 lines
14 KiB
Plaintext
534 lines
14 KiB
Plaintext
|
# 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 < COMP_CWORD; i++ )); do
|
||
|
if [[ "${COMP_WORDS[i]}" == -@(cp|classpath) ]]; then
|
||
|
classpath=${COMP_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 < COMP_CWORD; i++ )); do
|
||
|
if [[ "${COMP_WORDS[i]}" == -sourcepath ]]; then
|
||
|
sourcepath=${COMP_WORDS[i+1]}
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# default to classpath
|
||
|
if [ -z "$sourcepath" ]; then
|
||
|
_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=( "${COMPREPLY[@]}" $( zipinfo -1 \
|
||
|
"$i" "$cur*" 2>/dev/null | \
|
||
|
command grep '^[^$]*\.class$' ) )
|
||
|
else
|
||
|
COMPREPLY=( "${COMPREPLY[@]}" $( jar tf "$i" \
|
||
|
"$cur" | command grep '^[^$]*\.class$' ) )
|
||
|
fi
|
||
|
|
||
|
elif [ -d $i ]; then
|
||
|
# Intentionally looking for *.class only in $i (not subdirs),
|
||
|
# see Debian bug #496828.
|
||
|
COMPREPLY=( "${COMPREPLY[@]}"
|
||
|
$( command ls $i/$cur*.class 2>/dev/null | \
|
||
|
sed -ne '/\$/d' -e "s|^$i//*||p" ) )
|
||
|
|
||
|
# 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=( "${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 i
|
||
|
|
||
|
COMPREPLY=()
|
||
|
_get_comp_words_by_ref -n : cur prev words cword
|
||
|
|
||
|
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
|
||
|
# standard options
|
||
|
COMPREPLY=( $( compgen -W '-client -server -agentlib: -agentpath:
|
||
|
-classpath -D -d32 -d64 -enableassertions -disableassertions
|
||
|
-enablesystemassertions -disablesystemassertions -jar -javaagent:
|
||
|
-verbose -verbose -version -showversion -help -X' -- "$cur" ) )
|
||
|
else
|
||
|
if [[ "$prev" == -jar ]]; then
|
||
|
# jar file completion
|
||
|
_filedir jar
|
||
|
else
|
||
|
# classes completion
|
||
|
_java_classes
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
[[ ${#COMPREPLY[@]} -eq 1 && ${COMPREPLY[0]} == -*[:=] ]] && \
|
||
|
type compopt &>/dev/null && compopt -o nospace
|
||
|
|
||
|
__ltrim_colon_completions "$cur"
|
||
|
} &&
|
||
|
complete -F _java java
|
||
|
|
||
|
have javadoc &&
|
||
|
_javadoc()
|
||
|
{
|
||
|
COMPREPLY=()
|
||
|
local cur prev classpath
|
||
|
|
||
|
_get_comp_words_by_ref cur prev
|
||
|
|
||
|
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
|
||
|
# relevant options completion
|
||
|
COMPREPLY=( $( compgen -W '-overview -public -protected \
|
||
|
-package -private -help -doclet -docletpath \
|
||
|
-sourcepath -classpath -exclude -subpackages \
|
||
|
-breakiterator -bootclasspath -source -extdirs \
|
||
|
-verbose -locale -encoding -J -d -use -version \
|
||
|
-author -docfilessubdirs -splitindex \
|
||
|
-windowtitle -doctitle -header -footer -bottom \
|
||
|
-link -linkoffline -excludedocfilessubdir \
|
||
|
-group -nocomment -nodeprecated -noqualifier \
|
||
|
-nosince -nodeprecatedlist -notree -noindex \
|
||
|
-nohelp -nonavbar -quiet -serialwarn -tag \
|
||
|
-taglet -tagletpath -charset -helpfile \
|
||
|
-linksource -stylesheetfile -docencoding' -- "$cur" ) )
|
||
|
else
|
||
|
# source files completion
|
||
|
_filedir java
|
||
|
# packages completion
|
||
|
_java_packages
|
||
|
fi
|
||
|
} &&
|
||
|
complete -F _javadoc javadoc
|
||
|
|
||
|
have javac &&
|
||
|
_javac()
|
||
|
{
|
||
|
COMPREPLY=()
|
||
|
local cur prev
|
||
|
|
||
|
_get_comp_words_by_ref cur prev
|
||
|
|
||
|
case $prev in
|
||
|
-d)
|
||
|
_filedir -d
|
||
|
return 0
|
||
|
;;
|
||
|
-classpath|-bootclasspath|-sourcepath|-extdirs)
|
||
|
_java_path
|
||
|
return 0
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
if [[ "$cur" == -* ]]; then
|
||
|
# relevant options completion
|
||
|
COMPREPLY=( $( compgen -W '-g -g:none -g:lines -g:vars \
|
||
|
-g:source -O -nowarn -verbose -deprecation -classpath \
|
||
|
-sourcepath -bootclasspath -extdirs -d -encoding -source \
|
||
|
-target -help' -- "$cur" ) )
|
||
|
else
|
||
|
# source files completion
|
||
|
_filedir java
|
||
|
fi
|
||
|
} &&
|
||
|
complete -F _javac javac
|
||
|
|
||
|
have pack200 &&
|
||
|
_pack200()
|
||
|
{
|
||
|
COMPREPLY=()
|
||
|
local cur prev
|
||
|
_get_comp_words_by_ref cur prev
|
||
|
|
||
|
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 1 2 3 4 5 6 7 8 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
|
||
|
|
||
|
# Check if a pack or a jar was already given.
|
||
|
local i pack=false jar=false
|
||
|
for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )) ; do
|
||
|
case ${COMP_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[@]} -eq 1 && ${COMPREPLY[0]} == *= ]] && \
|
||
|
type compopt &>/dev/null && compopt -o nospace
|
||
|
else
|
||
|
_filedir 'pack?(.gz)'
|
||
|
fi
|
||
|
elif ! $jar ; then
|
||
|
_filedir jar
|
||
|
fi
|
||
|
} &&
|
||
|
complete -F _pack200 pack200
|
||
|
|
||
|
have unpack200 &&
|
||
|
_unpack200()
|
||
|
{
|
||
|
COMPREPLY=()
|
||
|
local cur prev
|
||
|
_get_comp_words_by_ref cur prev
|
||
|
|
||
|
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
|
||
|
|
||
|
# Check if a pack or a jar was already given.
|
||
|
local i pack=false jar=false
|
||
|
for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )) ; do
|
||
|
case ${COMP_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[@]} -eq 1 && ${COMPREPLY[0]} == *= ]] && \
|
||
|
type compopt &>/dev/null && compopt -o nospace
|
||
|
else
|
||
|
_filedir 'pack?(.gz)'
|
||
|
fi
|
||
|
elif ! $jar ; then
|
||
|
_filedir jar
|
||
|
fi
|
||
|
} &&
|
||
|
complete -F _unpack200 unpack200
|
||
|
|
||
|
have jarsigner &&
|
||
|
_jarsigner()
|
||
|
{
|
||
|
COMPREPLY=()
|
||
|
local cur prev
|
||
|
_get_comp_words_by_ref cur prev
|
||
|
|
||
|
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 < ${#COMP_WORDS[@]}-1; i++ )) ; do
|
||
|
if [[ "${COMP_WORDS[i]}" == *.jar && \
|
||
|
"${COMP_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()
|
||
|
{
|
||
|
COMPREPLY=()
|
||
|
local cur prev
|
||
|
_get_comp_words_by_ref cur prev
|
||
|
|
||
|
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
|
||
|
COMPREPLY=( $( compgen -W "$( _parse_help "$1" -help ) " -- "$cur" ) )
|
||
|
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
|