aceの折り返し(WrapMode)で字下げしない

Web上でテキストエディター(コードエディター)を実装するのに便利なAceの話です。WrapModeを使うと右端で余ったテキストを自動で折り返してくれてさらに便利です。

ただ、今回、日本語の文章を編集するためのエディターを検討していて、折り返したあとの字下げが邪魔になりました。おそらく折り返しであることが分かりやすいので自動的に字下げ(インデント)してくれていると思うのですが、今回はそれがかえって仇になった形です。

仕組み

指定した折り返し位置(wrapLimit)まで達すると、以降のテキストが次行に送られます。このとき、次行の先頭には tabSize 分のスペースが挿入されて字下げが実現されます。

tabSize を 0 にできれば解決なのですが、Ace のソースコードを読んでみると 0 は設定できないようになっていました。

tabSize: {
    set: function(tabSize) {
        tabSize = parseInt(tabSize);
        if (tabSize > 0 && this.$tabSize !== tabSize) {
            this.$modified = true;
            this.$rowLengthCache = [];
            this.$tabSize = tabSize;
            this._signal("changeTabSize");
        }
    },
    initialValue: 4,
    handlesSet: true
},

まあ、コードエディターとしては通常のインデントまでタブ幅 0 になると困るので当然といえば当然です。

解決方法

無理やりですが、EditSession の内部変数を直接書き換えることで対応できました。

sess.$tabSize = 0;
sess.$modified = true;
sess.$rowLengthCache = [];
sess._signal("changeTabSize");

かなり無理やりな方法なので動作保証はできませんが…とりあえず折り返し後の字下げをなくすことができました。

当然、この方法だと通常のインデントのタブ幅も 0 になってしまいます。