Commit | Line | Data |
1716b200 |
1 | use strict; |
2 | use warnings; |
b21e7551 |
3 | package Devel::REPL::Plugin::FancyPrompt; |
4 | |
6a5409bc |
5 | use Devel::REPL::Plugin; |
aa8b7647 |
6 | use namespace::autoclean; |
b21e7551 |
7 | |
8 | has 'fancy_prompt' => ( |
9 | is => 'rw', lazy => 1, |
10 | |
11 | # yes, this needs to be a double sub |
12 | default => sub { |
13 | sub { |
14 | my $self = shift; |
15 | sprintf 're.pl(%s):%03d%s> ', |
16 | $self->can('current_package') ? $self->current_package : 'main', |
17 | $self->lines_read, |
18 | $self->can('line_depth') ? ':' . $self->line_depth : ''; |
19 | } |
20 | }, |
21 | ); |
22 | |
23 | has 'fancy_continuation_prompt' => ( |
24 | is => 'rw', lazy => 1, |
25 | |
26 | # yes, this needs to be a double sub |
27 | default => sub { |
28 | sub { |
29 | my $self = shift; |
30 | sprintf 're.pl(%s):%03d:%d* ', |
31 | $self->can('current_package') ? $self->current_package : 'main', |
32 | $self->lines_read, |
33 | $self->line_depth, |
34 | } |
35 | }, |
36 | ); |
37 | |
38 | has 'lines_read' => ( |
39 | is => 'rw', lazy => 1, default => 0, |
40 | ); |
41 | |
42 | around 'prompt' => sub { |
43 | shift; |
44 | my $self = shift; |
45 | if ($self->can('line_depth') && $self->line_depth) { |
46 | return $self->fancy_continuation_prompt->($self); |
47 | } |
48 | else { |
49 | return $self->fancy_prompt->($self); |
50 | } |
51 | }; |
52 | |
53 | before 'read' => sub { |
54 | my $self = shift; |
55 | $self->lines_read($self->lines_read + 1); |
56 | }; |
57 | |
58 | 1; |
59 | |
60 | __END__ |
61 | |
62 | =head1 NAME |
63 | |
64 | Devel::REPL::Plugin::FancyPrompt - facilitate user-defined prompts |
65 | |
66 | =head1 SYNOPSIS |
67 | |
b21e7551 |
68 | use Devel::REPL; |
69 | |
70 | my $repl = Devel::REPL->new; |
71 | $repl->load_plugin('MultiLine::PPI'); # for indent depth |
72 | $repl->load_plugin('Packages'); # for current package |
73 | $repl->load_plugin('FancyPrompt'); |
74 | $repl->run; |
75 | |
76 | =head1 DESCRIPTION |
77 | |
78 | FancyPrompt helps you write your own prompts. The default fancy prompt resembles |
79 | C<irb>'s default prompt. The default C<fancy_prompt> looks like this: |
80 | |
81 | re.pl(main):001:0> 2 + 2 |
82 | 4 |
83 | |
84 | C<re.pl> is a constant. C<main> is the current package. The first number is how |
85 | many lines have been read so far. The second number (only if you have a |
86 | C<MultiLine> plugin) is how deep you are; intuitively, your indent level. This |
87 | default can be implemented with: |
88 | |
89 | $_REPL->fancy_prompt(sub { |
90 | my $self = shift; |
91 | sprintf 're.pl(%s):%03d%s> ', |
92 | $self->can('current_package') ? $self->current_package : 'main', |
93 | $self->lines_read, |
94 | $self->can('line_depth') ? ':' . $self->line_depth : ''; |
95 | }); |
96 | |
97 | C<current_package> is provided by L<Devel::REPL::Plugin::Packages> (which |
98 | tracks the current package). C<line_depth> is provided by a C<MultiLine> plugin |
99 | (probably C<MultiLine::PPI>). |
100 | |
101 | You may also set a C<fancy_continuation_prompt>. The default is very similar to |
102 | C<fancy_prompt>'s default (except C<*> instead of C<< > >>). |
103 | |
104 | =head1 SEE ALSO |
105 | |
106 | C<Devel::REPL> |
107 | |
108 | =head1 AUTHOR |
109 | |
110 | Shawn M Moore, C<< <sartak at gmail dot com> >> |
111 | |
112 | =head1 COPYRIGHT AND LICENSE |
113 | |
114 | Copyright (C) 2007 by Shawn M Moore |
115 | |
116 | This library is free software; you can redistribute it and/or modify |
117 | it under the same terms as Perl itself. |
118 | |
119 | =cut |
120 | |