代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

我可以在emacs的cperl模式下自定义三元运算符的缩进吗?

  •  5
  • Ryan C. Thompson  · 技术社区  · 15 年前

    在EmacsCPerl模式下,三元运算符不需要特殊处理。如果您在多行上打断它们,cperl模式只需按照与缩进任何连续语句相同的方式缩进每行,如下所示:

    $result = ($foo == $bar)  ? 'result1' :
        ($foo == $baz)  ? 'result2' :
            ($foo == $qux)  ? 'result3' :
                ($foo == $quux) ? 'result4' : 
                    'fail_result';
    

    这不太可读。有什么方法可以让我这样说服CPerl模式缩进吗?

    $result = ($foo == $bar)  ? 'result1' :
              ($foo == $baz)  ? 'result2' :
              ($foo == $qux)  ? 'result3' :
              ($foo == $quux) ? 'result4' : 
                                'fail_result';
    

    顺便说一下,代码示例来自 this question .

    编辑

    CPerl模式对三元运算符的缩进似乎有缺陷。以下面的示例为例,该示例使用Emacs23.1.1、CPerl模式版本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 回复  |  直到 15 年前
        1
  •  3
  •   cjm    15 年前

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

    $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模式的缩进引擎进行一些非常重要的更改。不过,欢迎您尝试一下。-)

        2
  •  3
  •   fod    15 年前

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

    我自己也没想出来,顺便说一句-我在某个地方读过-我以为是PBP,但我刚检查过它似乎不是那样,但不管怎样,我一直在使用它,发现它非常有用。

    编辑:在 cperl page in the emacs wiki