From: Sartak Date: Fri, 21 Sep 2007 06:16:58 +0000 (+0000) Subject: FancyPrompt plugin for user-defined prompts, and an irb-like default X-Git-Tag: v1.003015~147 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b21e755170420636ffad424d0634bc68e38956df;p=p5sagit%2FDevel-REPL.git FancyPrompt plugin for user-defined prompts, and an irb-like default git-svn-id: http://dev.catalyst.perl.org/repos/bast/trunk/Devel-REPL@3768 bd8105ee-0ff8-0310-8827-fb3f25b6796d --- diff --git a/lib/Devel/REPL/Plugin/FancyPrompt.pm b/lib/Devel/REPL/Plugin/FancyPrompt.pm new file mode 100644 index 0000000..557b274 --- /dev/null +++ b/lib/Devel/REPL/Plugin/FancyPrompt.pm @@ -0,0 +1,121 @@ +package Devel::REPL::Plugin::FancyPrompt; + +use Moose::Role; +use namespace::clean -except => [ 'meta' ]; + +has 'fancy_prompt' => ( + is => 'rw', lazy => 1, + + # yes, this needs to be a double sub + default => sub { + sub { + my $self = shift; + sprintf 're.pl(%s):%03d%s> ', + $self->can('current_package') ? $self->current_package : 'main', + $self->lines_read, + $self->can('line_depth') ? ':' . $self->line_depth : ''; + } + }, +); + +has 'fancy_continuation_prompt' => ( + is => 'rw', lazy => 1, + + # yes, this needs to be a double sub + default => sub { + sub { + my $self = shift; + sprintf 're.pl(%s):%03d:%d* ', + $self->can('current_package') ? $self->current_package : 'main', + $self->lines_read, + $self->line_depth, + } + }, +); + +has 'lines_read' => ( + is => 'rw', lazy => 1, default => 0, +); + +around 'prompt' => sub { + shift; + my $self = shift; + if ($self->can('line_depth') && $self->line_depth) { + return $self->fancy_continuation_prompt->($self); + } + else { + return $self->fancy_prompt->($self); + } +}; + +before 'read' => sub { + my $self = shift; + $self->lines_read($self->lines_read + 1); +}; + +1; + +__END__ + +=head1 NAME + +Devel::REPL::Plugin::FancyPrompt - facilitate user-defined prompts + +=head1 SYNOPSIS + + #!/usr/bin/perl + + use lib './lib'; + use Devel::REPL; + + my $repl = Devel::REPL->new; + $repl->load_plugin('MultiLine::PPI'); # for indent depth + $repl->load_plugin('Packages'); # for current package + $repl->load_plugin('FancyPrompt'); + $repl->run; + +=head1 DESCRIPTION + +FancyPrompt helps you write your own prompts. The default fancy prompt resembles +C's default prompt. The default C looks like this: + + re.pl(main):001:0> 2 + 2 + 4 + +C is a constant. C
is the current package. The first number is how +many lines have been read so far. The second number (only if you have a +C plugin) is how deep you are; intuitively, your indent level. This +default can be implemented with: + + $_REPL->fancy_prompt(sub { + my $self = shift; + sprintf 're.pl(%s):%03d%s> ', + $self->can('current_package') ? $self->current_package : 'main', + $self->lines_read, + $self->can('line_depth') ? ':' . $self->line_depth : ''; + }); + +C is provided by L (which +tracks the current package). C is provided by a C plugin +(probably C). + +You may also set a C. The default is very similar to +C's default (except C<*> instead of C<< > >>). + +=head1 SEE ALSO + +C + +=head1 AUTHOR + +Shawn M Moore, C<< >> + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2007 by Shawn M Moore + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + diff --git a/lib/Devel/REPL/Plugin/MultiLine/PPI.pm b/lib/Devel/REPL/Plugin/MultiLine/PPI.pm index f3ba897..d0040a5 100644 --- a/lib/Devel/REPL/Plugin/MultiLine/PPI.pm +++ b/lib/Devel/REPL/Plugin/MultiLine/PPI.pm @@ -9,6 +9,11 @@ has 'continuation_prompt' => ( default => sub { '> ' } ); +has 'line_depth' => ( + is => 'rw', required => 1, lazy => 1, + default => sub { 0 } +); + around 'read' => sub { my $orig = shift; my ($self, @args) = @_; @@ -19,7 +24,10 @@ around 'read' => sub { my $orig_prompt = $self->prompt; $self->prompt($self->continuation_prompt); + $self->line_depth($self->line_depth + 1); my $append = $self->read(@args); + $self->line_depth($self->line_depth - 1); + $line .= $append if defined($append); $self->prompt($orig_prompt);