我可以在emacs的cperl-mode中自定义三元运算符的缩进吗?

时间:2010-05-05 18:56:28

标签: perl emacs indentation ternary-operator cperl-mode

在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';
}

请注意,在任何支撑之外,我基本上都得到了我想要的缩进。但在内部支撑中,三元运算符的表现非常糟糕。有没有解决这个问题?

2 个答案:

答案 0 :(得分:3)

我不知道Cperl模式下的自动缩进,但M-1 M-S-| perltidy(如果你安装了Perl::Tidy)将很好地整理一个标记区域(包括三元语句)。默认情况下,它看起来不像您的示例,但我相信您可以自定义它以在.perltidyrc中执行您想要的操作。

我自己没有想到这一点 - 我在某处读到了 - 我认为PBP但我刚检查过&它似乎不是那样,但无论如何我一直都在使用它&发现它非常有用。

编辑:它位于cperl page in the emacs wiki

答案 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的缩进引擎进行一些非平凡的更改。不过,欢迎你试试。 : - )