InteractiveHelpは、scalaインタプリタ上でscaladocを検索できるように するツールです。
インタプリタ上でコマンドを入力することで、クラスやメソッドや パッケージのドキュメントを参照することができます。
InteractiveHelpは、Java6以上と、scala2.7.5finalで動作します。
インストールの手順は、以下のとおりです。
gitが利用できる環境であれば、任意のディレクトリで以下のコマンドを 入力することでソースコードを取得することができます。
$ git clone git://github.com/yuroyoro/interactivehelp.git
gitが利用できない場合はこのページの上にある"download"ボタンを クリックして圧縮ファイルを取得し、任意のディレクトリに解凍します。
ソースコードに含まれているscala-2.7.5-apidocs-fixed.zipを解凍します。
InteractiveHelpでは、scaladocをXHTMLとして読み込み検索するようになっていますが、標準のscala api documentの一部はXHTMLとして読み込むとエラーになるので、修正したものを利用します。
解凍して出来たディレクトリを、環境変数SCALA_DOC_HOMEに設定します。
以上で設定は完了です。
scalaインタプリタを起動する際に、interactive-help-1.0.jarをクラスパスに入れて起動します
$ scala -cp ./interactive-help-1.0.jar
次に、Helpオブジェクトをインポートします。
scala> import com.yuroyoro.interactivehelp.Export._
これでヘルプが利用できるようになりました。以下のように入力してみましょう。
scala> h("List") 0:Class scala.List 1:Object scala.List res0: com.yuroyoro.interactivehelp.Document = Seq
"List"に一致するクラス/オブジェクトの一覧が表示されました。
Listクラスの詳細を調べたい場合は以下のように入力します。
scala> h("List")(0) === scala.List ================================================== sealed abstract class List[+A] extends Seq[A] with Product A class representing an ordered collection of elements of type a. This class comes with two implementing case classes scala.Nil and scala.:: that implement the abstract members isEmpty, head and tail. ================================================================
このように、Listクラスの詳細が出力されます。
Listクラスのもつメソッドを調べたい場合は、続けてmと入力します。
scala> h("List")(0).m 0:def + [ B > : A ]( x : B ) : List [ B ] 1:override def ++ [ B > : A ]( that : Iterable [ B ]) : List [ B ] Appends two list objects. ...
メソッドの一覧が出力されました。
さらに、個々のメソッドの詳細をみたい場合は、対応する番号を続けて指定すればOKです。
scala> h("List")(0).m(1) override def ++[B >: A](that : Iterable[B]) : List[B] Appends two list objects. Overrides Seq.++
このように、コマンドを入力することでscaladocを検索することが可能です。
さらに、つづけて.oと入力すると、ブラウザが起動して対応するscaladocを見ることが可能です。
scala> h("List")(0).m(1).o
もっと詳しい使い方は、インタプリタでh()と入力するか、
下記のコマンド一覧を参照してください。
毎回scalaインタプリタを起動するたびに、クラスパスを指定して、importを入力するのは面倒ですよね。
scalaコマンドのエイリアスをこのように指定しておくと、常にヘルプが利用可能な状態でインタプリタが起動します。
alias -i <InteraciveHelpのパス>/import.scala -cp <InteraciveHelpのパス>/interactive-help-1.0.jar
もっと乱暴な方法は、SCALA_HOME/libにinteractive-help-1.0.jarをコピーしてしまうことです。
これで常にクラスパスを指定しなくともinteractive-help-1.0.jarが読み込まれるようになります。
注意点として、このようにすると他のアプリケーションを実行するときにもこのjarファイルが読み込まれてしまうことです。
InteractiveHelpがサポートするコマンドは以下の通りです。
コマンドが引数を取る場合は、Int、String, Symbolのいづれかを指定することが可能です。
Intの場合はN番目の要素を表示します。
Stringの場合はクラス名やメソッド名などが完全一致するものを返します。
Symbolの場合は、クラス名などが前方一致するものを返します。
コマンド | 引数 | 説明 |
---|---|---|
h | なし | コマンドの説明を表示します。 |
h | Int/String/Symbol | クラス、オブジェクト、パッケージを検索します。 |
ch | Int/String/Symbol | クラスを検索します。 |
oh | Int/String/Symbol | オブジェクトを検索します。 |
ph | Int/String/Symbol | パッケージを検索します。 |
検索結果が複数ある場合は、さらにInt、String, Symbolのいづれかを指定して絞り込むことが可能です。
また、List(“scala”).lとすると、改行せずに一覧を出力します。
検索結果はすべてSeq[Document]型ですので、mapやfilterなどが利用できます。
検索結果が1件になると、そのクラスやオブジェクトの詳細が表示されます。
この状態では、さらに以下のコマンドを指定することができます。
コマンド | 引数 | 説明 |
---|---|---|
o | なし | 対応するscaladocをブラウザで表示します。 |
e | なし | スーパークラスを返します。 |
et | なし | スーパークラスの一覧を返します。 |
et | Int/String/Symbol | スーパークラスの一覧を検索します。 |
s | なし | サブクラスの一覧を返します。 |
s | Int/String/Symbol | サブクラスの一覧を検索します。 |
t | なし | traitの一覧を返します。 |
t | Int/String/Symbol | traitの一覧を検索します。 |
m | なし | メソッドの一覧を返します。 |
m | Int/String/Symbol | メソッドの一覧を検索します。 |
v | なし | valueの一覧を返します。 |
v | Int/String/Symbol | valueの一覧を検索します。 |
Value, メソッドに対してはさらに以下のコマンドを利用できます。
コマンド | 引数 | 説明 |
---|---|---|
r | なし | 戻り値またはvalueの型を返します。 |
p | なし | メソッドのみ。引数の型の一覧を返します。 |
p | Int/String/Symbol | メソッドのみ。引数の型の一覧を検索します。 |
他のscaladocを検索できるようにするには、以下のようにaddFilesメソッドでscaladocのあるディレクトリを指定します。
scala> addFiles( "/your_scaladoc_path/", "/your_scaladoc_path2"...)
addUrlsでは、URLを追加することでhttpでドキュメントを取得出来ます。
scala> addUrls("http://somedoc.url", ...)
注意しなければならないのは、追加するHTMLファイルはXHTMLとして解釈できるものでなければならないと言うことです。
タグの閉じ忘れなどがあると、エラーが発生します。
interactivehelpをビルドするためには、java6とmaven2が必要です。
また、ソースコードを取得するためにgitが利用できることが望ましいです
ソースコードからinteractivehelpをビルドするには、単純に以下のようなmavenコマンドを入力するだけです。
$ mvn package
ビルドが終わると、targetディレクトリにjarファイルが生成されているハズです。
ゆろよろ Tomohito Ozaki
- blog : http://d.hatena.ne.jp/yuroyoro/
- twitter: http://twitter.com/yuroyoro/