在emacs cperl模式中,三元运算符没有特殊处理。如果将它们分成多行,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的三进制运算符的缩进似乎有一个bug。以下面的示例为例,该示例使用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';
}注意,在任何花括号之外,我基本上得到了我想要的缩进。但是在大括号中,三元运算符的缩进很严重。有什么办法可以解决这个问题吗?
发布于 2010-05-06 06:00:16
您使用的是什么版本的cperl-mode和Emacs?在没有初始化文件的GNU Emacs23.1,cperl-version 5.23中,我得到:
$result = ($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
fail_result;如果我想让它们排在第一个下面,我会添加一组额外的括号:
$result = (($foo == $bar) ? 'result1' :
($foo == $baz) ? 'result2' :
($foo == $qux) ? 'result3' :
($foo == $quux) ? 'result4' :
fail_result);我敢肯定,要实现您所请求的缩进(使用fail_result和'result'字符串),需要对cperl-mode的缩进引擎进行一些重要的更改。不过,欢迎您尝试一下。:-)
发布于 2010-05-06 03:45:13
我不知道Cperl模式下的自动缩进,但是M-1 M-S-| perltidy (如果你安装了Perl::Tidy )会很好地整理一个标记的区域(包括三元语句)。默认情况下,它看起来并不完全像您的示例,但我相信您可以在其.perltidyrc中自定义它来做您想做的事情。
顺便说一句,我自己没有弄明白这一点-我在哪里读到的-我想是PBP,但我刚刚检查了一下&似乎不是这样的,但不管怎样,我一直在使用它,发现它非常有用。
编辑:它在cperl page in the emacs wiki上
https://stackoverflow.com/questions/2775981
复制相似问题