In emacs cperl-mode, ternary operators are not treated specially. If you break them over multiple lines, cperl-mode simply indents each line the same way it indents any continued statement, like this:
$result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
'fail_result';
This is not very readable. Is there some way that I can convince cperl-mode indent like this?
$result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
'fail_result';
By the way, code example from this question.
There seems to be a bug in cperl-mode's indentation of ternary operators. Take the following example, which was indented using Emacs 23.1.1, cperl-mode version 5.23:
my $result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
'fail_result';
{
my $result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
'fail_result';
}
Notice that outside any braces, I basically get the indentation I want. But inside braces, the ternary operator is indented badly. Is there a fix for this?
What version of cperl-mode and Emacs are you using? In GNU Emacs 23.1, cperl-version
5.23, with no init file, I get:
$result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
fail_result;
If I want them to line up under the first, I'd add an extra set of parens:
$result = (($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
fail_result);
I'm pretty sure that achieving your requested indentation (with fail_result
lining up with the 'result'
strings) would require some non-trivial changes to cperl-mode's indentation engine. You're welcome to try it, though. :-)
I don't know about auto-indentation in Cperl-mode but M-1 M-S-| perltidy
(if you have Perl::Tidy installed) will tidy a marked region (including ternary statements) nicely. By default it won't look precisely like your example but I believe you can customise it to do what you want in its .perltidyrc.
I didn't figure this out myself btw - I read it somewhere - I thought PBP but I've just checked & it doesn't seem to be that, but anyway I use it all the time & find it very useful.
Edit: It was on the cperl page in the emacs wiki
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With