py-mode の py-indent-line

snippet 展開してなんか入力する度にインデントが謎なことになっていく。

# snippet 展開した状態
class ClassName (object):

    def __init__(self, arg):
        self.arg = arg
        pass

# "ClassName" を "blah" に、 "object" を "spam" に
class blah (spam):

                                        def __init__(self, arg): # こいつがどんどん右に飛んでく
        self.arg = arg
    pass #こいつは下がったり戻ってきたり

見てるとおもしろい。いや、そんな暢気な。

実装してくれた snippet の snippet-indent-expand って関数が一旦全体を indent-region (これしないと $0 だけの行がインデントされなかったりするみたい)した後で $INDENT のとこを mode-specific-indent-command してて、py-indent-line が独自なのは挙動見てりゃわかるんだが他のモードの hoge-indent-line とは随分違うようで、これを mode-specific-indent-command にした状態で indent-region すると似たようなことになる(微妙に違う)。
むぐー。

  • py-indent-line をどうにかする。
  • snippet-indent-expand をどうにかする。
  • あきらm

そういえば関係無いけどいやちょっとあるけど javascript-mode で

var comments_re = /\*\/[\w\W]*?\*\//;
                                    ! // エンターしたらここに来た

regexp のケツにある \// が悪さしてんだろーなーというのは容易に想像ついたんだが、javascript-indent-line は parse-point-syntax ってのでチェックして文字列かコメントの中以外だったら calc-c-indent で出てきただけインデントしてて、この calc-c-indent が \// あると \// の列を返してくる。
ググってみたらこいつは組み込みの関数でそんな簡単に触れ無さそう。
"/"(lisp 的には #\/ と書くべきか)を文字列の開始/終了文字にしてみようとしたけど、なんかできなかった。

むぐー。