c875723bef
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.
531 lines
14 KiB
Bash
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
|