在emacs cperl-mode中,三元运算符不受特殊处理。如果你将它们分成多行,cperl-mode只是缩进每一行,就像它缩进任何连续语句一样,如下所示:
$result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
'fail_result';
这不是很易读。有没有什么方法可以说服这样的cperl-mode缩进?
$result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
'fail_result';
顺便说一下,来自this question的代码示例。
cperl-mode对三元运算符的缩进似乎存在错误。采用以下示例,该示例使用Emacs 23.1.1缩进,cperl-mode版本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';
}
请注意,在任何支撑之外,我基本上都得到了我想要的缩进。但在内部支撑中,三元运算符的表现非常糟糕。有没有解决这个问题?
答案 0 :(得分:3)
我不知道Cperl模式下的自动缩进,但M-1 M-S-| perltidy
(如果你安装了Perl::Tidy)将很好地整理一个标记区域(包括三元语句)。默认情况下,它看起来不像您的示例,但我相信您可以自定义它以在.perltidyrc中执行您想要的操作。
我自己没有想到这一点 - 我在某处读到了 - 我认为PBP但我刚检查过&它似乎不是那样,但无论如何我一直都在使用它&发现它非常有用。
答案 1 :(得分:3)
您使用的是什么版本的cperl-mode和Emacs?在GNU Emacs 23.1中,cperl-version
5.23,没有init文件,我得到:
$result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
fail_result;
如果我希望他们排在第一位,我会添加一组额外的parens:
$result = (($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
fail_result);
我很确定实现您请求的缩进(fail_result
与'result'
字符串对齐)将需要对cperl-mode的缩进引擎进行一些非平凡的更改。不过,欢迎你试试。 : - )