萌ディタ:遷移状態に合わせたショートカットの呼び出し方
萌ディタはファイルの種類毎に、色分けを切り替える機能がある。
これの機能のおかげでHTML編集のときはHTMLの色分け、JavaScriptの場合はJavaScriptの機能の呼び出しができたりする。
HTMLならHTMLのための拡張子クラスを使えばよいので、ショートカットも自由自在に作れる。
しかし、PHPやJavaScriptの場合は、作成したショートカットが有効に働かない。
なぜかというと、PHPやJavaScriptの場合は、HTMLの内部に埋め込むのでHTMLの拡張子クラスのショートカットを呼び出そうとするためである。
これを回避するためには、萌ディタで定義しているinvoke関数を使用します。
invoke(arg, classname, methodname)
となっており、例えば、jscriptのコンプリートリストを呼び出したいときは
invoke(arg, 'jscript', 'onCompleteRequest');
とやってやるとJavaScriptで自動補完を実行することが出来る。
しかし、htmlの場合、関連するモノがphpやjavascript以外にもvbscriptやsmartyのテンプレート、ASPのvb.netのコード。これにrubyのerb等幅広く存在する
これらのすべてに対応するためにコードを埋め込むのは現実的ではない
そのため、一度文法の遷移状態を調べてから、そこに飛ばしてやるのが適切である
具体的には次の様なコードが望ましいと考える。
var ls = App.Caret.LexState;
if( this.name!=ls.Name ) return invoke(arg, ls.State, methodname );
この様に記述することで、LexStateから現在キーがある範囲がjscriptなのかvbscriptなのかを判別できるので
ls.Stateで拡張子クラスの名前に従って処理を呼び出せる。
実際には、これをすべてのメソッドに対して埋め込んでいけば、対応可能なのであろうが、拡張子クラスの数が多いと、それも面倒くさい。
そのため、拡張子クラスの継承関係を利用する。
萌ディタの拡張子クラスは親に当たるクラスを指定することで継承関係を実現できる。具体的なイメージは萌ディタの「むずかしい設定」ダイアログを出すと良く分かる
そして、子供のクラスにメソッドが存在しない場合、継承関係を遡って親のクラスを呼び出そうとする。
こうすることで、エディターとしての基礎的な機能は親のクラスだけに記述して、子に当たるクラスで派生機能のみを書けば良い様にしている。
そのため、できるだけ簡単に遷移状態に適したショートカットを呼び出したいときには親元の
- core.javascript.txt
- std.javascript.txt
のどちらかに、次の様に記述する。
f.onKeyQuestion = function(arg, classname, methodname){var ls = App.Caret.LexState;
invoke(arg, ls.Name, methodname);
};
こうすることで、Ctrl+?のショートカットの機能をどの拡張子クラスでも便利に呼び出せる。
(本当は公式でこう記述しておくべきだと個人的に思います)
ただ、気を付けておかないといけないのは一度こう記述した以上は、そのメソッドでは親クラスをinvokeしないこと。
そうしないと、親クラスが子クラスを呼んで、その子クラスが親クラスを呼んで、という無限ループになって萌ディタが停止する。
使う側にも一定の責任を求めるエディタさんなのである。(だから弄りがいもあるのですが・・・
投稿者 baban 2009/06/07 at 21:41