Как я могу заставить perltidy работать с Method::Signatures?

Я использую Eclipse в сочетании с EPIC для написания своего Perl-кода. Я настроил EPIC для использования Perltidy с "-pbp" (стиль лучших практик perl) для форматирования моего кода.

Это не работает при использовании именованных параметров Method::Signatures. Например, func (:$arg1, : $arg2) отформатирован как func (: $arg1, : $arg2) что приводит к ошибке.

Также, func ключевое слово не распознается как sub поэтому отступы неверны.

Связанный с этим предыдущим оставшимся без ответа вопросом и этим взаимным сообщением.

4 ответа

Вы можете изменить скрипт perlcritic с помощью предварительного и постфильтра. Список изменений содержит следующий пример

Perl::Tidy::perltidy(
  prefilter => sub { $_ = $_[0]; s/^method (.*)/sub $1 \#__METHOD/gm; return $_ },
  postfilter => sub { $_ = $_[0]; s/^sub (.*?)\s* \#__METHOD/method $1/gm; return $_ }
);

Perlcritic теперь будет лечить method как sub в целях форматирования. Мы можем сделать то же самое с func, Я изменил мой /usr/local/bin/perlcritic для работы с func следующее:

#!/usr/bin/perl

eval 'exec /usr/bin/perl  -S $0 ${1+"$@"}'
    if 0; # not running under some shell
package main;

use Perl::Tidy;

my $arg_string = undef;

# give Macs a chance to provide command line parameters
if ($^O =~ /Mac/) {
    $arg_string =
      MacPerl::Ask( 'Please enter @ARGV (-h for help)',
        defined $ARGV[0] ? "\"$ARGV[0]\"" : "" );
}

Perl::Tidy::perltidy(
    argv => $arg_string,
    prefilter => sub { $_ = $_[0]; s/\W\Kfunc\((.*)/sub($1 \#__FUNC/gm; return $_ },
    postfilter => sub { $_ = $_[0]; s/\W\Ksub\((.*?)\s* \#__FUNC/func($1/gm; return $_ }
);

Perl::Tidy/perltidy не использует PPI, он предшествует PPI ​​примерно на 9 лет ( http://sourceforge.net/projects/perltidy/ говорит Registered: 2000-12-23)

Вы не можете, если вы не делаете PPIЭто то, что Perltidy использует для большей части своей работы, зная о различных сигнатурных модулях, таких как MooseX::Method::Signatures, Method::Signatures::Simple, или же Method::Signatures,

Разумный обходной путь может заключаться в том, чтобы не запускать Perltidy для всего вашего кода, а только для фрагментов, которые вы только что написали и хотите каким-то образом отформатировать. Таким образом, вы можете легко пропустить запуск его для любых сигнатур методов и заставить его обрабатывать только тела методов.

Тем временем на CPAN существует новый модуль, который решает эту проблему. Это называется Perl::Tidy::Sweetened и предлагает сценарий perltidier,

Он также использует prefilter а также postfilter крючки Perl::Tidy, но вам не нужно заботиться об этом самостоятельно.

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