summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Completion/Unix/Type/.distfiles1
-rw-r--r--Completion/Unix/Type/_java_class15
2 files changed, 16 insertions, 0 deletions
diff --git a/Completion/Unix/Type/.distfiles b/Completion/Unix/Type/.distfiles
index 52d55f0ca..b57c067a6 100644
--- a/Completion/Unix/Type/.distfiles
+++ b/Completion/Unix/Type/.distfiles
@@ -9,4 +9,5 @@ _files _pdf _pspdf _users
_groups _perl_basepods _signals _users_on
_hosts _perl_builtin_funcs _tar_archive _time_zone
_file_systems _net_interfaces _terminals _locales
+_java_class
'
diff --git a/Completion/Unix/Type/_java_class b/Completion/Unix/Type/_java_class
new file mode 100644
index 000000000..ffbcfe735
--- /dev/null
+++ b/Completion/Unix/Type/_java_class
@@ -0,0 +1,15 @@
+local classpath
+#Should probably add some sort of cache.
+#First use -classpath/-cp, then CLASSPATH, then assume .
+classpath=${opt_args[-classpath]:-${opt_args[-cp]:-${CLASSPATH:-.}}}
+local c i
+#Should we call _multipart insteads of compadd
+for i in ${(z)classpath//:/ }; do
+ if [ -f $i ] && [[ "$i" == *.(jar|zip|war|ear) ]]; then
+ c=(${${${(M)$(_call_program jar_classes jar -tf $i)##*.class}%%.class}:gs#/#.#})
+ compadd -M 'r:|.=* r:|=*' -- $c
+ elif [ -d $i ]; then
+ c=(**/*.class(.:r:s/.class//:gs#/#.#))
+ compadd -M 'r:|.=* r:|=*' -- $c
+ fi
+done