SciTEのJavaScriptのインデントと戦う
SciTEを使ってJavaScriptを書いているとたまにオートインデントが動かないことがある。
例えばこんなケース。
m.Core = Backbone.Model.extend({ initialize: function () {/*ここでReturnキーを押したとき*/} });
そんなんスクリプト書いて直せばいい。ええ、もちろんそう思いましたよ。まずはインデント位置を求めて、それをもとにインデントし直す…。
-- 古典的なインデント幅の求め方 math.floor(editor.LineIndentation[editor:LineFromPosition(editor.CurrentPos - 1)] / editor.TabWidth)
しかし、この方法は全く上手くいかない。というのもこのスクリプト自体、オートインデントが動作していることを前提としているからだ。
実はこれ、先日のポスト、「キャレットのあるブロックの開始位置を取得する」手法を使うことで適当っぽいインデント幅を取得することができる。
prevFoldLine = scite.SendEditor(SCI_GETFOLDPARENT, editor:LineFromPosition(editor.CurrentPos)) if prevFoldLine < 0 then -- 一番外側の場合だけ固定で0 newIndent = 0 else -- それ以外の場合、手前のブロックを元にインデント位置を算出 newIndent = math.floor(editor.LineIndentation[prevFoldLine] / editor.TabWidth) + 1 end
新しいブロック→新しいインデントのハズですからね。あとはこれを元に適当にインデントを直してやればいい。
ただ、Douglas Clockford式に、一関数 一 var でコーディングしている時、二つ目以降の変数のインデントがズレる。これはまた別の問題。
(function () { var func1 = function () { //... }, func2 = function () {/*ここでReturnキーを押したとき*/}; }());