about summary refs log tree commit diff
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