2010-10-09 33 views
12

J'utilise Eclipse combiné avec EPIC pour écrire mon code Perl. J'ai configuré EPIC pour utiliser Perltidy avec "-pbp" (perl best practices style) pour formater mon code. Cela ne fonctionne pas bien lorsque vous utilisez Method::Signatures 'named parameters. Par exemple, func (:$arg1, : $arg2) est au format func (: $arg1, : $arg2) qui génère une erreur.Comment puis-je faire perltidy travailler avec Method :: Signatures?

En outre, func mot-clé n'est pas reconnu comme sub donc l'indentation est erronée.

Relatif à this question sans réponse précédente et this poste croisé.

Répondre

2

Vous ne pouvez pas, sauf si vous faites PPI, qui est ce que Perltidy utilise pour la plupart de ses travaux, au courant des différents modules de signature tels que MooseX::Method::Signatures, Method::Signatures::Simple ou Method::Signatures.

Une solution raisonnable pourrait être de ne pas courir Perltidy sur l'ensemble de votre code, mais seulement sur les morceaux de ce que vous venez d'écrire et que vous voulez formaté d'une certaine façon. De cette façon, vous pouvez facilement ignorer l'exécution de n'importe quelle signature de méthode et ne faire traiter que les corps de méthode à la place.

+0

Je suis tellement habitué à 'Alt + Ctrl + f' (autoformat tous) et comme elle. Je serai vraiment triste d'abandonner ça. –

+1

Moi aussi Bien que, malheureusement, les seules alternatives que je peux voir sont 1) donnant sur le formatage automatique/all/de votre code sans considération, 2) donnant sur les pièces de signatures de méthode, ou 3) faire un travail sur PPI . Votre choix. – rafl

+3

perltidy ne PAS utiliser PPI - il a son propre analyseur –

3

Perl de Tidy/perltidy ne fait pas usage de l'IPP, elle est antérieure à l'IPP d'environ 9 ans ( http://sourceforge.net/projects/perltidy/ dit enregistré: 23/12/2000)

+2

http://search.cpan.org/dist/Perl-Tidy/META.yml prouve que la version actuelle n'a pas non plus migrer vers PPI. – daxim

4

Vous pouvez modifier le script perlcritic avec un pré et post-filtre Le changelog fournit l'exemple suivant

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 va maintenant traiter method comme sub à des fins de mise en forme. Nous pouvons faire la même chose avec func. Je modifié mon/usr/local/bin/perlcritic de travailler avec func comme suit:

#!/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

Ceci corrige le mot-clé de la méthode. Voir ce PerlTidy [sous-classe] (http://www.openswartz.com/2010/12/19/perltidy-and-method-happy-together/) pour résoudre le problème de signature de méthode que l'OP a mis en évidence. –

1

En attendant un nouveau module existe sur CPAN qui résout ce problème. Il est appelé Perl::Tidy::Sweetened et propose le script perltidier.

Il utilise également les crochets prefilter et postfilter de Perl::Tidy, mais vous n'avez pas besoin de faire attention à ce sujet par vous-même.