zshでjava補完速くする

わりといっちゃってるシェルとして有名なzsh先生、javaコマンド打ったりするときも便利です。
Java初学者の人が

% javac HelloWorld.java
% java HelloWorld.class
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class

とかやっちゃって困ってる場面はよく目にします。でもzshなら大丈夫。

% java H(TAB入力)

% java HelloWorld

と補完してくれます。さらには

% java -classpath /usr/java/apache-ant-1.7.0/lib/ant.jar (TAB入力)

とすることで

% java -classpath /usr/java/apache-ant-1.7.0/lib/ant.jar org.apache.tools.

まで補完、もう一度TABを押すと大量の候補リストを表示してくれたりします。なんだかやりすぎ感がして楽しいですね。

しかし俺の環境で、最近やたらとこの補完が遅くなってておかしいなあと思ってました。でzshjavaコマンドの補完定義ファイル_javaと、その中で呼ばれてる_java_class読んで気付いたんですけど、こいつら環境変数CLASSPATHの中全部探って補完してくれるんですね。だからCLASSPATHが多ければその分時間がかかります。CLASSPATHが少なければOKというわけでもない。CLASSPATHにディレクトリが追加されてると、再帰的に下のディレクトリまで読みにいきます。

それで俺は.zshrcの書き方とかものすごくいいかげんなもんで、CLASSPATHが同じパスをいくつも含んでたり、変な位置を追加してたりしたもんだから、補完にものすごく時間がかかっていたわけです。適当に削ったらとても速くなってなんとも快適に。ただまあ、例えばルートディレクトリで

% java (TAB入力)

とかするとしばらく固まったりするわけですけど。C-cで止めれます。

test