Я могу настроить добавление отступа тернарных операторов в cperl-режиме emac?

В emacs cperl-режиме тернарные операторы не рассматривают особенно. При повреждении их по нескольким строкам 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';

Между прочим, пример кода от этого вопроса.

Править

Кажется, существует ошибка в добавлении отступа cperl-режима тернарных операторов. Возьмите следующий пример, который был расположен с отступом с помощью Emacs 23.1.1, версии 5.23 cperl-режима:

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

Заметьте, что вне любых фигурных скобок, я в основном получаю добавление отступа, которое я хочу. Но в фигурных скобках, тернарный оператор располагается с отступом плохо. Есть ли фиксация для этого?

5
задан Community 23 May 2017 в 12:03
поделиться

2 ответа

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

$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
ответ дан 14 December 2019 в 13:29
поделиться

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

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

Edit: It was on the cperl page in the emacs wiki

3
ответ дан 14 December 2019 в 13:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: