2011年 09月 07日

ACE の使いかたのメモ

ACE という JS でできたブラウザ上で動くエディタがあり、すごく良くできてるし拡張性もあって使いやすいのですが、ところどころ気に入らないのをなんとかする必要があるのでメモしておきます。

デフォルトのキーバインドが糞

Cmd-L を奪って gotoline とかいう機能が動いてアホかと思うので (ロケーションバーにフォーカスできない)、以下のようにして機能を殺している… あと TAB を奪うのも場合によっては非常にうざいので機能ごと殺している。キーバインドだけ殺したいけどよくわからなかった。

editor.commands.removeCommand('gotoline'); // fucking default keybinding of ace
editor.commands.removeCommand('indent');
editor.commands.removeCommand('outdent');

JS モードなどで括弧を勝手に挿入する

基本的にはうざくない ( 連続して入力した場合は余計に入力しないので賢い) のだけれど、{ RET } と入力したりすると括弧が余計についてしまってストレスフルなので、この機能を以下のようにして殺した。

        var mode = new JavaScriptMode();
        mode.$behaviour.remove('braces');
        mode.$behaviour.remove('parens');
        mode.$behaviour.remove('string_dquotes');

HtmlMode でも script の内部は JavaScriptMode になるので、この場合以下のようにしたら殺せるっぽい。

        var mode = new HtmlMode();
        mode.$modes['js-'].$behaviour.remove('braces');
        mode.$modes['js-'].$behaviour.remove('parens');
        mode.$modes['js-'].$behaviour.remove('string_dquotes');

ついで

典型的に

        var editor = ace.edit(container);

        editor.renderer.setShowGutter(false);
        editor.renderer.setHScrollBarAlwaysVisible(false);
        editor.renderer.setPadding(5);
        editor.renderer.setShowPrintMargin(false);

        editor.setHighlightActiveLine(false);
        editor.setKeyboardHandler(MyKeyBinding);

        var session = editor.getSession();
        session.setMode(new MyMode());
        session.setUseWrapMode(true);
        session.on('change', function () {
             textarea.value = session.getValue();
        });
        session.setValue(textarea.value);

みたいのをコピペしてる


あと、StateHandler や HashHandler を使いたいとき、どうやって使っていいかわからなくて (lib/ace/keyboard/state_handler.js をそのまま読みこもうとしても define() でエラーがでる)、build/demo/kitchen-sink-uncompressed.js からコピペしてファイルを作るという、すごく頭が悪いことをやっていて困っている… lib/ace/keyboard/keybinding/emacs.js とかが state_handler に依存してるのに、build 以下には state_handler のファイルがないので、よくわからない……