5

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

顺便说一下,这个问题的代码示例。

编辑

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

请注意,在任何大括号之外,我基本上得到了我想要的缩进。但是在大括号内,三元运算符缩进很糟糕。有解决办法吗?

4

2 回答 2

3

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

顺便说一句,我自己并没有弄清楚这一点-我在某处读过-我以为是PBP,但我刚刚检查过,似乎不是那样,但是无论如何我一直都在使用它,并且发现它非常有用。

编辑:它在 emacs wiki 的 cperl 页面上

于 2010-05-05T19:45:13.423 回答
3

您使用的是什么版本的 cperl-mode 和 Emacs?在没有初始化文件的 GNU Emacs 23.1、5.23 中cperl-version,我得到:

$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-05T22:00:16.010 回答