(When I posted this to reddit, someone pointed out that I could have gotten the same information from c-show-syntactic-information by hitting C-c C-s. Awesome!)
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 Kruusamägi [CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons.)