[Bast-commits] r3768 - in trunk/Devel-REPL/lib/Devel/REPL/Plugin: .
MultiLine
Sartak at dev.catalyst.perl.org
Sartak at dev.catalyst.perl.org
Fri Sep 21 07:16:59 GMT 2007
Author: Sartak
Date: 2007-09-21 07:16:58 +0100 (Fri, 21 Sep 2007)
New Revision: 3768
Added:
trunk/Devel-REPL/lib/Devel/REPL/Plugin/FancyPrompt.pm
Modified:
trunk/Devel-REPL/lib/Devel/REPL/Plugin/MultiLine/PPI.pm
Log:
FancyPrompt plugin for user-defined prompts, and an irb-like default
Added: trunk/Devel-REPL/lib/Devel/REPL/Plugin/FancyPrompt.pm
===================================================================
--- trunk/Devel-REPL/lib/Devel/REPL/Plugin/FancyPrompt.pm (rev 0)
+++ trunk/Devel-REPL/lib/Devel/REPL/Plugin/FancyPrompt.pm 2007-09-21 06:16:58 UTC (rev 3768)
@@ -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<irb>'s default prompt. The default C<fancy_prompt> looks like this:
+
+ re.pl(main):001:0> 2 + 2
+ 4
+
+C<re.pl> is a constant. C<main> 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<MultiLine> 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<current_package> is provided by L<Devel::REPL::Plugin::Packages> (which
+tracks the current package). C<line_depth> is provided by a C<MultiLine> plugin
+(probably C<MultiLine::PPI>).
+
+You may also set a C<fancy_continuation_prompt>. The default is very similar to
+C<fancy_prompt>'s default (except C<*> instead of C<< > >>).
+
+=head1 SEE ALSO
+
+C<Devel::REPL>
+
+=head1 AUTHOR
+
+Shawn M Moore, C<< <sartak at gmail dot com> >>
+
+=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
+
Modified: trunk/Devel-REPL/lib/Devel/REPL/Plugin/MultiLine/PPI.pm
===================================================================
--- trunk/Devel-REPL/lib/Devel/REPL/Plugin/MultiLine/PPI.pm 2007-09-21 05:44:01 UTC (rev 3767)
+++ trunk/Devel-REPL/lib/Devel/REPL/Plugin/MultiLine/PPI.pm 2007-09-21 06:16:58 UTC (rev 3768)
@@ -9,6 +9,11 @@
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 @@
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);
More information about the Bast-commits
mailing list