py-mode で右に飛んでくの直った

結果だけ先に書くと py-mode.l の py-compute-indentation てのを、1つ上の行見るようにしたら直ったっぽいです。お騒がせしました。

以下日記。

$xyzzzy/siteinit.l と ~/.xyzzy を退避してまっさらな ~/.xyzzy で snippet と py-mode 動かす設定だけ書いた状態でも飛んでったんでどっか変な設定してるってわけではないということにした。

どんどん右に飛んでっちゃうのは

  • カーソル位置は関係ない
  • 行末に ":" がある(ブロックの始まり
  • 行頭に空白がある
  • 直前に実行したのが py-indent-line ではない

(とこで|ときに) py-indent-line

!       def __init__(self, arg):
# ESC x py-indent-line
# ↓
           !def __init__(self, arg):

mode-specific-indent-command を py-indent-line にしといて indent-region を繰り返しただけで飛んでく。
ブロックの始まりじゃない && 行頭に空白なとこで py-indent-line すると、逆にインデントが1段下がる。


javascript-mode とか html+-mode の mode-specific-indent-command はどうなってようが本来のとこまでインデントして、それ以上何かしたりはしない。

snippet-expand-indent は

  1. indent-region して
  2. "$INDENT" があったら消して
  3. mode-specific-indent-command する

みたいな感じっぽいんで、たぶん snippet はちゃんと動いてる=右に飛んでく。


py-indent-line の挙動を他の mode-specific-indent-command と同じにできれば、そうするのがすっきりしそう。おかしな挙動する mode-specific-indent-command もったモードが他にもあるなら snippet の方でどうにかしといた方がいいような気もするけど、どんな挙動するのかわからんのじゃどうやってどうにかしろと。


で、とりあえず py-indent-line 見て、どんだけインデントすりゃいいかをはじき出すと思しき py-compute-indentation てのを見てみた。
いっぱい書いてあるけどどうもほとんど複数行の文字列だったらとかみたいで、最後んとこに今のインデント量にブロックの始まりだったら1段増やして、ブロックの終わりだったら一段減らすというような処理を発見。それは今の行じゃなくて前の行見ないとまずくね?とか思って py-compute-indentation の頭で (forward-line -1) とかしてみたらふつーになったっぽい。いや、これがふつーなのかどうかよくわからんのだが、 def __init__(self, arg): の行で py-indent-line しても余計にインデントしたりはしない。indent-region しても前みたいなおかしさはない。pass とかないとブロックが終了してないと見てしまうっぽいが、右に飛んでくよりは理解できる。snippet も class とかはだいじょぶ。たぶんブロックまたがなきゃだいじょぶ。
文字列があったときとかに何やら色々やってるようなのだがその辺よくわからずに見るとこ変えたんで悪影響があるやも。明日もうちょい見てみよう。

ひょっとして入ってる py-mode.l が古いとか、まさかそんな。