MATLABのタブ補完機能をコードから利用する

MATLABのタブ補完機能をコードから利用する

概要

MATLABデスクトップのタブ補完機能は便利に作られています. たとえば,コマンドウィンドウに

>> load

と入力した後にTABキーを押すと,現在見えるパス上のディレクトリやファイルをリスト表示してくれます. また,

>> matl

まで入力してTABを押すと,matlab までが確定して入力され,その後に続く関数や変数の候補が表示されます.

最近わたしはVimのPythonプラグインを書いていて,その上でMATLABエンジンを動かして遊んでいます. この補完機能をうまく利用してVim上でMATLABの賢い補完ができないだろうかと考え,やってみたのがこの記事の内容です.

ドキュメント化されていない機能なので,今後のバージョンアップ等で使用できなくなる可能性があることを注意しておきます.

方法

com.mathworks.jmi.tabcompletion.TabCompletionImpl クラスのメソッドを呼びます.

import com.mathworks.jmi.tabcompletion.*
tc = TabCompletionImpl();
future = tc.getJSONCompletions('matl', 4);

while ~future.isDone()
    pause(0.01);
end

result = future.get()

引数には,補完対象のchar配列(もしくはstring)と,その文字列の何文字目から補完するかを指定しています.

実行すると,つぎのようなJSON形式のchar配列が得られます(長いので項目は省略しています).

{
     "partialCompletion":
     {
         "completionString":"matlab",
         "offset": 4
     },
     "replacedString":"matl",
     "finalCompletions":
     [
         {
             "completion":
             {
                 "completionString":"matlab",
                 "offset": 6
             },
             "matchType":"package",
             "popupCompletion":"matlab"
         },
         {
             "completion":
             {
                 "completionString":"matlab2dataflow",
                 "offset": 6
             },
             "matchType":"package",
             "popupCompletion":"matlab2dataflow"
         }
     ]
}

中身の詳細は微妙にわからない部分もありますが,補完プラグインの実装に必要な情報は取れそうだということがわかりました.

JMI

MATLABデスクトップのGUIとエンジン部分はどうやらJavaで結合されているようです. MATLABマニア御用達のUndocumented Matlabに詳しいことが書かれています.

%matlabroot%/java/jar/jmi.jar が該当するファイルのようです. こちらのファイルのコンテンツを jar コマンドで確認したところ,タブ補完の機能に相当するコンポーネントがあることがわかりました.

MATLABには標準でJavaのパッケージをインポートする機能があります. また,メソッドをリスト表示する関数 methodview も便利な機能です.

パッケージをインポートした状態で

>> methodview TabCompletionImpl

を実行すると,TabCompletionImpl に実装されているメソッドのリスト(と対応する引数の型)が表示されます.

タブ補完の豆知識

ご存知のとおり load コマンドではTABキーによってパスが補完されますが,自分で作成した関数の引数としてファイル名を指定する際には,通常補完がかかりません. 実は functionSignatures.json というファイルに設定を記述することで,自作の関数にも補完の仕方を指定することができます.

まとめ

  • JMIを触ってみると楽しいかもしれません
  • これで,Vim上で動くPython上で動くMATLABエンジン上でJavaのメソッドを呼び出してJSONを取り出すことによって,Vim上でMATLABのコード補完が効くようになりそうです
ShareComments