I was getting irritated by emacs refusing to indent php code properly when I was working on a MediaWiki extension. I’ve run into this before, but, today, in order to procrastinate a little, I ran into it again with the following code:
try {$object->method( ARG );
}
It kept trying to put $object the same level as try , so it would end up with:
try {$object->method( ARG );
}
So I chased it down. I used C-h k to find the function being called. After a bit of edebug , I found that the code in the function c-indent-line being called was essentially:
(c-get-syntactic-indentation (c-guess-basic-syntax))In fact, doing M-; (c-get-syntactic-indentation (c-guess-basic-syntax)) RET when point was sitting on $ gave the result 4 when it tried to indent and 0 when it didn’t.
(Ok, the code had two more levels of indention than the above, so it was giving 12 and 8 , but let’s not get carried away with details.)
Now, running M-x php-mode RET (i.e. none of the added configuration in .dir-locals.el ) gave the proper indention. In my .dir-locals.el , though, I had set up a c-offsets-alist that mostly worked with bits and pieces copied from all over.
Running just M-; (c-guess-basic-syntax) RET returned ((statement-block-intro 1379)) so I figured I needed to add (statement-block-intro . +) to my c-offsets-list .
I added that, and it worked. And now I know how to chase down indention bugs.
(Header image by Ivo Kruusamgi [CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons .)