2008年3月19日水曜日

emacsでphpのインデントがずれる

ずれる。

<?php
function hoge () {

  }
?>

となる。

php-mode.el cc-*.el を読んだり debugでトレースしたりして わかったのは <?php の部分が原因のようであること。

<?php<? にすれば ずれない。

前へさかのぼってサーチしていって phpがワードで その前の?がデリミタになって バッファの先頭までいってサーチが終了し サーチが終了したひとつ前にポイントがどこだったか でインデントが決まり <?php の3文字目がそれにあたるので それまでの2文字分インデントされてしまう ということらしい。

つまり、 関数宣言部分が 本来はfunctionの頭から始まるわけだが php function となっていっていて phpとfunctionの間が改行されている と解釈されているよう。

cc-mode.el はC系の言語のことしか考えてくれてないみたいで php-mode-hook で外から変数いじっても <?php を無視するようにできそうになかった。

しかたがないので php-mode-hookで (setq indent-line-function 'my-php-indent-line) と indent-line-function を上書きして my-php-indent-lineでは

(defun my-php-indent-line ()
  (save-restriction
   (let ((here (point)))
     (if (not (search-backward "<?php" nil t))
         (funcall 'php-cautious-indent-line)
       (goto-char here)
       (narrow-to-region (match-end 0) (point-max))
       (funcall 'php-cautious-indent-line)
       ))))

と php-cautious-indent-lineする前に narrow-to-regionで <?php を 隠したら うまくインデントされるようになった。

php-cautious-indent-lineを2回書いているのが汚い。

コメント(0):