Upgrade to Perl 5.8.8
[msysgit/kusma.git] / lib / perl5 / 5.8.8 / Term / Complete.pm
blob601e4956430877551521be9a9319ad46530852d9
1 package Term::Complete;
2 require 5.000;
3 require Exporter;
5 use strict;
6 our @ISA = qw(Exporter);
7 our @EXPORT = qw(Complete);
8 our $VERSION = '1.402';
10 # @(#)complete.pl,v1.2 (me@anywhere.EBay.Sun.COM) 09/23/91
12 =head1 NAME
14 Term::Complete - Perl word completion module
16 =head1 SYNOPSIS
18 $input = Complete('prompt_string', \@completion_list);
19 $input = Complete('prompt_string', @completion_list);
21 =head1 DESCRIPTION
23 This routine provides word completion on the list of words in
24 the array (or array ref).
26 The tty driver is put into raw mode and restored using an operating
27 system specific command, in UNIX-like environments C<stty>.
29 The following command characters are defined:
31 =over 4
33 =item E<lt>tabE<gt>
35 Attempts word completion.
36 Cannot be changed.
38 =item ^D
40 Prints completion list.
41 Defined by I<$Term::Complete::complete>.
43 =item ^U
45 Erases the current input.
46 Defined by I<$Term::Complete::kill>.
48 =item E<lt>delE<gt>, E<lt>bsE<gt>
50 Erases one character.
51 Defined by I<$Term::Complete::erase1> and I<$Term::Complete::erase2>.
53 =back
55 =head1 DIAGNOSTICS
57 Bell sounds when word completion fails.
59 =head1 BUGS
61 The completion character E<lt>tabE<gt> cannot be changed.
63 =head1 AUTHOR
65 Wayne Thompson
67 =cut
69 our($complete, $kill, $erase1, $erase2, $tty_raw_noecho, $tty_restore, $stty, $tty_safe_restore);
70 our($tty_saved_state) = '';
71 CONFIG: {
72 $complete = "\004";
73 $kill = "\025";
74 $erase1 = "\177";
75 $erase2 = "\010";
76 foreach my $s (qw(/bin/stty /usr/bin/stty)) {
77 if (-x $s) {
78 $tty_raw_noecho = "$s raw -echo";
79 $tty_restore = "$s -raw echo";
80 $tty_safe_restore = $tty_restore;
81 $stty = $s;
82 last;
87 sub Complete {
88 my($prompt, @cmp_lst, $cmp, $test, $l, @match);
89 my ($return, $r) = ("", 0);
91 $return = "";
92 $r = 0;
94 $prompt = shift;
95 if (ref $_[0] || $_[0] =~ /^\*/) {
96 @cmp_lst = sort @{$_[0]};
98 else {
99 @cmp_lst = sort(@_);
102 # Attempt to save the current stty state, to be restored later
103 if (defined $stty && defined $tty_saved_state && $tty_saved_state eq '') {
104 $tty_saved_state = qx($stty -g 2>/dev/null);
105 if ($?) {
106 # stty -g not supported
107 $tty_saved_state = undef;
109 else {
110 $tty_saved_state =~ s/\s+$//g;
111 $tty_restore = qq($stty "$tty_saved_state" 2>/dev/null);
114 system $tty_raw_noecho if defined $tty_raw_noecho;
115 LOOP: {
116 local $_;
117 print($prompt, $return);
118 while (($_ = getc(STDIN)) ne "\r") {
119 CASE: {
120 # (TAB) attempt completion
121 $_ eq "\t" && do {
122 @match = grep(/^\Q$return/, @cmp_lst);
123 unless ($#match < 0) {
124 $l = length($test = shift(@match));
125 foreach $cmp (@match) {
126 until (substr($cmp, 0, $l) eq substr($test, 0, $l)) {
127 $l--;
130 print("\a");
131 print($test = substr($test, $r, $l - $r));
132 $r = length($return .= $test);
134 last CASE;
137 # (^D) completion list
138 $_ eq $complete && do {
139 print(join("\r\n", '', grep(/^\Q$return/, @cmp_lst)), "\r\n");
140 redo LOOP;
143 # (^U) kill
144 $_ eq $kill && do {
145 if ($r) {
146 $r = 0;
147 $return = "";
148 print("\r\n");
149 redo LOOP;
151 last CASE;
154 # (DEL) || (BS) erase
155 ($_ eq $erase1 || $_ eq $erase2) && do {
156 if($r) {
157 print("\b \b");
158 chop($return);
159 $r--;
161 last CASE;
164 # printable char
165 ord >= 32 && do {
166 $return .= $_;
167 $r++;
168 print;
169 last CASE;
175 # system $tty_restore if defined $tty_restore;
176 if (defined $tty_saved_state && defined $tty_restore && defined $tty_safe_restore)
178 system $tty_restore;
179 if ($?) {
180 # tty_restore caused error
181 system $tty_safe_restore;
184 print("\n");
185 $return;