2010-10-09 10 views
12

Używam Eclipse w połączeniu z EPIC, aby napisać mój kod Perla. Skonfigurowałem EPIC tak, aby używał Perltidy z "-pbp" (styl perl best practices) do formatowania mojego kodu.Jak mogę dokonać perltidy pracy z Method :: Signatures?

To nie działa dobrze podczas korzystania z Method::Signatures 'named parameters. Np., func (:$arg1, : $arg2) jest sformatowany jako func (: $arg1, : $arg2), co powoduje błąd.

Również słowo kluczowe nie jest rozpoznawane jak func, więc wcięcie jest nieprawidłowe.

Powiązane z this poprzednie pytanie bez odpowiedzi i this przekreślenie.

Odpowiedz

2

Nie można, chyba że zrobić PPI, która jest co Perltidy używa dla większości jego prac, świadomi różnych modułów, takich jak podpis MooseX::Method::Signatures, Method::Signatures::Simple lub Method::Signatures.

Rozsądnym rozwiązaniem może być nie uruchamianie Perltidy na całym kodzie, ale tylko na fragmentach, które właśnie napisałeś i które chcesz sformatować w jakiś sposób. W ten sposób można łatwo pominąć uruchamianie go na dowolnych sygnaturach metod i sprawić, aby przetwarzał tylko ciała metod.

+0

Jestem bardzo przyzwyczajony do "Alt + Ctrl + F" (autoformatowanie wszystkich) i podoba mi się. Będę naprawdę smutny, że się na tym pogodzę. –

+1

Ja też. Chociaż, niestety, jedyne alternatywy jakie widzę to: 1) rezygnacja z automatycznego formatowania/całego/twojego kodu bez zastanowienia, 2) rezygnacja z części podpisów metodowych lub 3) wykonanie pewnych prac nad PPI . Twój wybór. – rafl

+3

perltidy NIE używa PPI - ma swój własny parser. –

3

Perl :: Tidy/perltidy nie skorzystać z PPI, to wyprzedza PPI przez około 9 lat ( http://sourceforge.net/projects/perltidy/ mówi rejestracji: 23.12.2000)

+2

http://search.cpan.org/dist/Perl-Tidy/META.yml udowadnia, że ​​obecne wydanie również nie zostało przeniesione do PPI. – daxim

4

Można zmodyfikować perlcritic skrypt pre i filtr po. changelog zapewnia poniższym przykładzie

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 będzie teraz leczyć method jako sub dla celów formatowania. Możemy zrobić to samo z func. I zmodyfikowane mój/usr/local/bin/perlcritic pracować func następująco:

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

Naprawia to słowo kluczowe metody. Zobacz tę PerlTidy [podklasę] (http://www.openswartz.com/2010/12/19/perltidy-and-method-happy-together/), aby naprawić problem z sygnaturą metody, który został podświetlony. –

1

W międzyczasie nowy moduł istnieje na CPAN, który rozwiązuje ten problem. Nazywa się Perl::Tidy::Sweetened i oferuje skrypt perltidier.

Używa również haków prefilter i postfilter z Perl::Tidy, ale nie musisz sam o to zadbać.

Powiązane problemy