Eliminate unnecessary (and sometimes confounding) test for
[p5sagit/p5-mst-13.2.git] / lib / Term / Complete.pm
CommitLineData
a0d0e21e 1package Term::Complete;
2require 5.000;
3require Exporter;
4
5@ISA = qw(Exporter);
6@EXPORT = qw(Complete);
7
df4a00a5 8# @(#)complete.pl,v1.2 (me@anywhere.EBay.Sun.COM) 09/23/91
cb1a09d0 9
10=head1 NAME
11
12Term::Complete - Perl word completion module
13
14=head1 SYNOPSIS
15
2ab1b485 16 $input = Complete('prompt_string', \@completion_list);
17 $input = Complete('prompt_string', @completion_list);
cb1a09d0 18
19=head1 DESCRIPTION
20
21This routine provides word completion on the list of words in
22the array (or array ref).
23
24The tty driver is put into raw mode using the system command
25C<stty raw -echo> and restored using C<stty -raw echo>.
26
27The following command characters are defined:
28
29=over 4
30
1fef88e7 31=item E<lt>tabE<gt>
3fe9a6f1 32
cb1a09d0 33Attempts word completion.
34Cannot be changed.
35
36=item ^D
37
38Prints completion list.
39Defined by I<$Term::Complete::complete>.
40
41=item ^U
42
43Erases the current input.
44Defined by I<$Term::Complete::kill>.
45
1fef88e7 46=item E<lt>delE<gt>, E<lt>bsE<gt>
cb1a09d0 47
48Erases one character.
49Defined by I<$Term::Complete::erase1> and I<$Term::Complete::erase2>.
50
51=back
52
53=head1 DIAGNOSTICS
54
55Bell sounds when word completion fails.
56
57=head1 BUGS
58
8dcee03e 59The completion character E<lt>tabE<gt> cannot be changed.
cb1a09d0 60
61=head1 AUTHOR
62
63Wayne Thompson
64
65=cut
a0d0e21e 66
67CONFIG: {
68 $complete = "\004";
69 $kill = "\025";
70 $erase1 = "\177";
71 $erase2 = "\010";
72}
73
f06db76b 74sub Complete {
df4a00a5 75 my($prompt, @cmp_list, $cmp, $test, $l, @match);
76 my ($return, $r) = ("", 0);
55497cff 77
2ab1b485 78 $return = "";
79 $r = 0;
80
a0d0e21e 81 $prompt = shift;
82 if (ref $_[0] || $_[0] =~ /^\*/) {
83 @cmp_lst = sort @{$_[0]};
84 }
85 else {
86 @cmp_lst = sort(@_);
87 }
88
89 system('stty raw -echo');
90 LOOP: {
91 print($prompt, $return);
92 while (($_ = getc(STDIN)) ne "\r") {
93 CASE: {
94 # (TAB) attempt completion
95 $_ eq "\t" && do {
96 @match = grep(/^$return/, @cmp_lst);
a0d0e21e 97 unless ($#match < 0) {
df4a00a5 98 $l = length($test = shift(@match));
a0d0e21e 99 foreach $cmp (@match) {
100 until (substr($cmp, 0, $l) eq substr($test, 0, $l)) {
101 $l--;
102 }
103 }
104 print("\a");
df4a00a5 105 print($test = substr($test, $r, $l - $r));
106 $r = length($return .= $test);
a0d0e21e 107 }
a0d0e21e 108 last CASE;
109 };
110
111 # (^D) completion list
112 $_ eq $complete && do {
113 print(join("\r\n", '', grep(/^$return/, @cmp_lst)), "\r\n");
114 redo LOOP;
115 };
116
117 # (^U) kill
118 $_ eq $kill && do {
119 if ($r) {
2ab1b485 120 $r = 0;
121 $return = "";
a0d0e21e 122 print("\r\n");
123 redo LOOP;
124 }
125 last CASE;
126 };
127
128 # (DEL) || (BS) erase
129 ($_ eq $erase1 || $_ eq $erase2) && do {
130 if($r) {
131 print("\b \b");
132 chop($return);
133 $r--;
134 }
135 last CASE;
136 };
137
138 # printable char
139 ord >= 32 && do {
140 $return .= $_;
141 $r++;
142 print;
143 last CASE;
144 };
145 }
146 }
147 }
148 system('stty -raw echo');
149 print("\n");
150 $return;
151}
152
1531;
154