2010-10-09 11 views
12

Estoy usando Eclipse combinado con EPIC para escribir mi código de Perl. Configuré EPIC para usar Perltidy con "-pbp" (estilo perl best practices) para formatear mi código.¿Cómo puedo hacer que perltidy funcione con Method :: Signatures?

Esto no funciona bien al usar Method::Signatures 'named parameters. Por ejemplo, func (:$arg1, : $arg2) tiene el formato func (: $arg1, : $arg2), lo que produce un error.

Además, la palabra clave func no se reconoce como sub por lo que la sangría es incorrecta.

Relacionados con this pregunta sin responder anterior y this mensaje cruzado.

Respuesta

2

No se puede, a menos que haga PPI, que es la que utiliza perltidy durante la mayor parte de su trabajo, consciente de los diversos módulos exclusivos como MooseX::Method::Signatures, Method::Signatures::Simple o Method::Signatures.

Una solución razonable podría ser no ejecutar Perltidy en todo su código, sino solo en los fragmentos que acaba de escribir y desea formatear de alguna manera. De esta forma, puede omitir ejecutarlo en cualquier firma de método y, en su lugar, procesar los cuerpos de método.

+0

Estoy tan acostumbrado a 'Alt + Ctrl + F' (autoformato de todos) y me gusta. Estaré muy triste de renunciar a eso. –

+1

Yo también. Aunque, lamentablemente, las únicas alternativas que puedo ver son 1) renunciar automáticamente al formato/todo/de su código sin consideración, 2) renunciar a partes de las firmas de métodos, o 3) hacer algún trabajo en PPI . Tu elección. – rafl

+3

perltidy NO usa PPI - tiene su propio analizador –

3

Perl :: Tidy/perltidy no hace uso de IBP, que es anterior PPI por unos 9 años ( http://sourceforge.net/projects/perltidy/ dice Registrada: 12/23/2000)

+2

http://search.cpan.org/dist/Perl-Tidy/META.yml demuestra que la versión actual tampoco migró a PPI. – daxim

4

Usted puede modificar la secuencia de comandos perlcritic con un pre y filtro de publicación El changelog proporciona el siguiente ejemplo

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 ahora tratar method como sub para los propósitos de formato. Podemos hacer lo mismo con func. He modificado mi/usr/local/bin/perlcritic trabajar con func de la siguiente manera:

#!/usr/bin/perl 

eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}' 
    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 $_ } 
); 
+0

Esto corrige la palabra clave del método. Consulte esta PerlTidy [subclase] (http://www.openswartz.com/2010/12/19/perltidy-and-method-happy-together/) para solucionar el problema de firma del método que destacó el OP. –

1

Mientras tanto existe un nuevo módulo en CPAN que resuelve estos problemas. Se llama Perl::Tidy::Sweetened y ofrece el script perltidier.

También utiliza los ganchos prefilter y postfilter de Perl::Tidy, pero no tiene que preocuparse por eso solo.

Cuestiones relacionadas