概要
MATLABデスクトップのタブ補完機能は便利に作られています. たとえば,コマンドウィンドウに
>> load |
と入力した後にTABキーを押すと,現在見えるパス上のディレクトリやファイルをリスト表示してくれます. また,
>> matl |
まで入力してTABを押すと,matlab
までが確定して入力され,その後に続く関数や変数の候補が表示されます.
最近わたしはVimのPythonプラグインを書いていて,その上でMATLABエンジンを動かして遊んでいます. この補完機能をうまく利用してVim上でMATLABの賢い補完ができないだろうかと考え,やってみたのがこの記事の内容です.
ドキュメント化されていない機能なので,今後のバージョンアップ等で使用できなくなる可能性があることを注意しておきます.
方法
com.mathworks.jmi.tabcompletion.TabCompletionImpl
クラスのメソッドを呼びます.
引数には,補完対象のchar配列(もしくはstring)と,その文字列の何文字目から補完するかを指定しています.
実行すると,つぎのようなJSON形式のchar配列が得られます(長いので項目は省略しています).
中身の詳細は微妙にわからない部分もありますが,補完プラグインの実装に必要な情報は取れそうだということがわかりました.
JMI
MATLABデスクトップのGUIとエンジン部分はどうやらJavaで結合されているようです. MATLABマニア御用達のUndocumented Matlabに詳しいことが書かれています.
%matlabroot%/java/jar/jmi.jar
が該当するファイルのようです.
こちらのファイルのコンテンツを jar
コマンドで確認したところ,タブ補完の機能に相当するコンポーネントがあることがわかりました.
MATLABには標準でJavaのパッケージをインポートする機能があります.
また,メソッドをリスト表示する関数 methodview
も便利な機能です.
パッケージをインポートした状態で
>> methodview TabCompletionImpl |
を実行すると,TabCompletionImpl
に実装されているメソッドのリスト(と対応する引数の型)が表示されます.
タブ補完の豆知識
ご存知のとおり load
コマンドではTABキーによってパスが補完されますが,自分で作成した関数の引数としてファイル名を指定する際には,通常補完がかかりません.
実は functionSignatures.json
というファイルに設定を記述することで,自作の関数にも補完の仕方を指定することができます.
- User-defined tab completions – take 2 | Undocumented Matlab
- MATLAB Function Signatures in JSON - MATLAB & Simulink
まとめ
- JMIを触ってみると楽しいかもしれません
- これで,Vim上で動くPython上で動くMATLABエンジン上でJavaのメソッドを呼び出してJSONを取り出すことによって,Vim上でMATLABのコード補完が効くようになりそうです