Могу ли я настроить отступ троичных операторов в режиме emacs cperl? - PullRequest
5 голосов
/ 05 мая 2010

В emacs cperl-mode троичные операторы специально не обрабатываются. Если вы разбиваете их на несколько строк, режим cperl просто вставляет каждую строку так же, как отступает любое дальнейшее утверждение, например:

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

Кстати, пример кода из этого вопроса .

EDIT

Кажется, есть ошибка в отступе 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 ]

3 голосов
/ 06 мая 2010

Какую версию cperl-mode и Emacs вы используете? В GNU Emacs 23.1, cperl-version 5.23, без файла инициализации, я получаю:

$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 Вы можете попробовать это, хотя. : -)

3 голосов
/ 05 мая 2010

Я не знаю об автоиндентировании в режиме Cperl, но M-1 M-S-| perltidy (если у вас установлено Perl :: Tidy ) будет аккуратно приводить в порядок отмеченную область (включая троичные операторы). По умолчанию он не будет выглядеть точно так же, как ваш пример, но я считаю, что вы можете настроить его так, чтобы он делал то, что вы хотите, в его .perltidyrc.

Кстати, я сам этого не понял - где-то читал - я думал, что PBP, но я только что проверил, и это не так, но в любом случае я все время использую его и считаю его очень полезным .

Редактировать: это было на странице cperl в вики emacs

...