5

emacs cperl-mode では、三項演算子は特別に扱われません。それらを複数の行に分割すると、cperl-mode は次のように、継続するステートメントをインデントするのと同じ方法で各行を単にインデントします。

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

ところで、この質問のコード例。

編集

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-modeとEmacsを使用していますか?GNU Emacs 23.1、5.23では、cperl-versioninitファイルがない場合、次のようになります。

$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 に答える
3

Cperl モードでの自動インデントについては知りませんが、M-1 M-S-| perltidy( Perl::Tidyがインストールされている場合) マークされた領域 (三項ステートメントを含む) をきれいに整理します。デフォルトでは、あなたの例とまったく同じようには見えませんが、.perltidyrc で必要なことを行うようにカスタマイズできると思います。

私はこれを自分で理解していませんでした-どこかで読んだ-PBPだと思ったのですが、チェックしたところ、そうではないようですが、とにかく私はそれを常に使用していて、非常に便利です.

編集:emacs wikiのcperlページにありました

于 2010-05-05T19:45:13.423 に答える