В 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';
}
Заметьте, что вне любых фигурных скобок, я в основном получаю добавление отступа, которое я хочу. Но в фигурных скобках, тернарный оператор располагается с отступом плохо. Есть ли фиксация для этого?
Какую версию 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. Впрочем, можете попробовать :-)
Я не знаю об автоиндентировании в Cperl-режиме, но M-1 M-S-| perltidy
(если у вас установлен Perl::Tidy) отлично приведет в порядок помеченную область (включая троичные утверждения). По умолчанию он не будет выглядеть точно так, как в вашем примере, но я полагаю, что вы можете настроить его так, как вам нужно, в его .perltidyrc.
Я не сам это придумал - я прочитал это где-то - я думал PBP, но я только что проверил и это не так, но в любом случае я использую это все время и нахожу это очень полезным.
Edit: It was on the cperl page in the emacs wiki