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

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

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

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

РЕДАКТИРОВАТЬ

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

Решение

Какую версию 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' strings) потребует некоторых нетривиальных изменений в движке отступов cperl-mode. Вы можете попробовать это, хотя.:-)

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

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

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

Другие вопросы по тегам