ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/Term/Complete.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:15 2005 UTC (21 years, 4 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 package Term::Complete;
2     require 5.000;
3     require Exporter;
4    
5     use strict;
6     our @ISA = qw(Exporter);
7     our @EXPORT = qw(Complete);
8     our $VERSION = '1.402';
9    
10     # @(#)complete.pl,v1.2 (me@anywhere.EBay.Sun.COM) 09/23/91
11    
12     =head1 NAME
13    
14     Term::Complete - Perl word completion module
15    
16     =head1 SYNOPSIS
17    
18     $input = Complete('prompt_string', \@completion_list);
19     $input = Complete('prompt_string', @completion_list);
20    
21     =head1 DESCRIPTION
22    
23     This routine provides word completion on the list of words in
24     the array (or array ref).
25    
26     The tty driver is put into raw mode and restored using an operating
27     system specific command, in UNIX-like environments C<stty>.
28    
29     The following command characters are defined:
30    
31     =over 4
32    
33     =item E<lt>tabE<gt>
34    
35     Attempts word completion.
36     Cannot be changed.
37    
38     =item ^D
39    
40     Prints completion list.
41     Defined by I<$Term::Complete::complete>.
42    
43     =item ^U
44    
45     Erases the current input.
46     Defined by I<$Term::Complete::kill>.
47    
48     =item E<lt>delE<gt>, E<lt>bsE<gt>
49    
50     Erases one character.
51     Defined by I<$Term::Complete::erase1> and I<$Term::Complete::erase2>.
52    
53     =back
54    
55     =head1 DIAGNOSTICS
56    
57     Bell sounds when word completion fails.
58    
59     =head1 BUGS
60    
61     The completion character E<lt>tabE<gt> cannot be changed.
62    
63     =head1 AUTHOR
64    
65     Wayne Thompson
66    
67     =cut
68    
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;
83     }
84     }
85     }
86    
87     sub Complete {
88     my($prompt, @cmp_lst, $cmp, $test, $l, @match);
89     my ($return, $r) = ("", 0);
90    
91     $return = "";
92     $r = 0;
93    
94     $prompt = shift;
95     if (ref $_[0] || $_[0] =~ /^\*/) {
96     @cmp_lst = sort @{$_[0]};
97     }
98     else {
99     @cmp_lst = sort(@_);
100     }
101    
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;
108     }
109     else {
110     $tty_saved_state =~ s/\s+$//g;
111     $tty_restore = qq($stty "$tty_saved_state" 2>/dev/null);
112     }
113     }
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--;
128     }
129     }
130     print("\a");
131     print($test = substr($test, $r, $l - $r));
132     $r = length($return .= $test);
133     }
134     last CASE;
135     };
136    
137     # (^D) completion list
138     $_ eq $complete && do {
139     print(join("\r\n", '', grep(/^\Q$return/, @cmp_lst)), "\r\n");
140     redo LOOP;
141     };
142    
143     # (^U) kill
144     $_ eq $kill && do {
145     if ($r) {
146     $r = 0;
147     $return = "";
148     print("\r\n");
149     redo LOOP;
150     }
151     last CASE;
152     };
153    
154     # (DEL) || (BS) erase
155     ($_ eq $erase1 || $_ eq $erase2) && do {
156     if($r) {
157     print("\b \b");
158     chop($return);
159     $r--;
160     }
161     last CASE;
162     };
163    
164     # printable char
165     ord >= 32 && do {
166     $return .= $_;
167     $r++;
168     print;
169     last CASE;
170     };
171     }
172     }
173     }
174    
175     # system $tty_restore if defined $tty_restore;
176     if (defined $tty_saved_state && defined $tty_restore && defined $tty_safe_restore)
177     {
178     system $tty_restore;
179     if ($?) {
180     # tty_restore caused error
181     system $tty_safe_restore;
182     }
183     }
184     print("\n");
185     $return;
186     }
187    
188     1;