Могу ли я настроить отступ троичных операторов в режиме 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