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

Rya*_*son 5 emacs perl 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';
Run Code Online (Sandbox Code Playgroud)

这不是很易读.有什么方法可以说服像这样的cperl模式缩进吗?

$result = ($foo == $bar)  ? 'result1' :
          ($foo == $baz)  ? 'result2' :
          ($foo == $qux)  ? 'result3' :
          ($foo == $quux) ? 'result4' : 
                            'fail_result';
Run Code Online (Sandbox Code Playgroud)

顺便说一下,来自这个问题的代码示例.

编辑

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';
}
Run Code Online (Sandbox Code Playgroud)

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

cjm*_*cjm 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;
Run Code Online (Sandbox Code Playgroud)

如果我希望它们在第一个下对齐,我会添加一组额外的括号:

$result = (($foo == $bar)  ? 'result1' :
           ($foo == $baz)  ? 'result2' :
           ($foo == $qux)  ? 'result3' :
           ($foo == $quux) ? 'result4' :
           fail_result);
Run Code Online (Sandbox Code Playgroud)

我非常确定要实现您请求的缩进(与字符串fail_result对齐'result')需要对 cperl 模式的缩进引擎进行一些重要的更改。不过,欢迎您尝试一下。:-)