📄 cap.pm
字号:
# print STDERR "DEBUG: numeric $1 = $2\n"; } elsif (defined $field && $field =~ /^(\w\w)=(.*)/) { # print STDERR "DEBUG: string $1 = $2\n"; next if defined $self->{'_' . ($cap = $1)}; $_ = $2; s/\\E/\033/g; s/\\(\d\d\d)/pack('c',oct($1) & 0177)/eg; s/\\n/\n/g; s/\\r/\r/g; s/\\t/\t/g; s/\\b/\b/g; s/\\f/\f/g; s/\\\^/\377/g; s/\^\?/\177/g; s/\^(.)/pack('c',ord($1) & 31)/eg; s/\\(.)/$1/g; s/\377/^/g; $self->{'_' . $cap} = $_; } # else { carp "junk in $term ignored: $field"; } } $self->{'_pc'} = "\0" unless defined $self->{'_pc'}; $self->{'_bc'} = "\b" unless defined $self->{'_bc'}; $self;}# $terminal->Tpad($string, $cnt, $FH);=item B<Tpad>Outputs a literal string with appropriate padding for the current terminal.It takes three arguments:=over 2=item B<$string>The literal string to be output. If it starts with a number and an optional'*' then the padding will be increased by an amount relative to this number,if the '*' is present then this amount will me multiplied by $cnt. This partof $string is removed before output/=item B<$cnt>Will be used to modify the padding applied to string as described above.=item B<$FH>An optional filehandle (or IO::Handle ) that output will be printed to.=backThe padded $string is returned.=cutsub Tpad { ## public my $self = shift; my($string, $cnt, $FH) = @_; my($decr, $ms); if (defined $string && $string =~ /(^[\d.]+)(\*?)(.*)$/) { $ms = $1; $ms *= $cnt if $2; $string = $3; $decr = $self->{PADDING}; if ($decr > .1) { $ms += $decr / 2; $string .= $self->{'_pc'} x ($ms / $decr); } } print $FH $string if $FH; $string;}# $terminal->Tputs($cap, $cnt, $FH);=item B<Tputs>Output the string for the given capability padded as appropriate withoutany parameter substitution.It takes three arguments:=over 2=item B<$cap>The capability whose string is to be output.=item B<$cnt>A count passed to Tpad to modify the padding applied to the output string.If $cnt is zero or one then the resulting string will be cached.=item B<$FH>An optional filehandle (or IO::Handle ) that output will be printed to.=backThe appropriate string for the capability will be returned.=cutsub Tputs { ## public my $self = shift; my($cap, $cnt, $FH) = @_; my $string; $cnt = 0 unless $cnt; if ($cnt > 1) { $string = Tpad($self, $self->{'_' . $cap}, $cnt); } else { # cache result because Tpad can be slow unless (exists $self->{$cap}) { $self->{$cap} = exists $self->{"_$cap"} ? Tpad($self, $self->{"_$cap"}, 1) : undef; } $string = $self->{$cap}; } print $FH $string if $FH; $string;}# $terminal->Tgoto($cap, $col, $row, $FH);=item B<Tgoto>B<Tgoto> decodes a cursor addressing string with the given parameters.There are four arguments:=over 2=item B<$cap>The name of the capability to be output.=item B<$col>The first value to be substituted in the output string ( usually the columnin a cursor addressing capability )=item B<$row>The second value to be substituted in the output string (usually the rowin cursor addressing capabilities)=item B<$FH>An optional filehandle (or IO::Handle ) to which the output string will beprinted.=backSubstitutions are made with $col and $row in the output string with thefollowing sprintf() line formats: %% output `%' %d output value as in printf %d %2 output value as in printf %2d %3 output value as in printf %3d %. output value as in printf %c %+x add x to value, then do %. %>xy if value > x then add y, no output %r reverse order of two parameters, no output %i increment by one, no output %B BCD (16*(value/10)) + (value%10), no output %n exclusive-or all parameters with 0140 (Datamedia 2500) %D Reverse coding (value - 2*(value%16)), no output (Delta Data)The output string will be returned.=cutsub Tgoto { ## public my $self = shift; my($cap, $code, $tmp, $FH) = @_; my $string = $self->{'_' . $cap}; my $result = ''; my $after = ''; my $online = 0; my @tmp = ($tmp,$code); my $cnt = $code; while ($string =~ /^([^%]*)%(.)(.*)/) { $result .= $1; $code = $2; $string = $3; if ($code eq 'd') { $result .= sprintf("%d",shift(@tmp)); } elsif ($code eq '.') { $tmp = shift(@tmp); if ($tmp == 0 || $tmp == 4 || $tmp == 10) { if ($online) { ++$tmp, $after .= $self->{'_up'} if $self->{'_up'}; } else { ++$tmp, $after .= $self->{'_bc'}; } } $result .= sprintf("%c",$tmp); $online = !$online; } elsif ($code eq '+') { $result .= sprintf("%c",shift(@tmp)+ord($string)); $string = substr($string,1,99); $online = !$online; } elsif ($code eq 'r') { ($code,$tmp) = @tmp; @tmp = ($tmp,$code); $online = !$online; } elsif ($code eq '>') { ($code,$tmp,$string) = unpack("CCa99",$string); if ($tmp[$[] > $code) { $tmp[$[] += $tmp; } } elsif ($code eq '2') { $result .= sprintf("%02d",shift(@tmp)); $online = !$online; } elsif ($code eq '3') { $result .= sprintf("%03d",shift(@tmp)); $online = !$online; } elsif ($code eq 'i') { ($code,$tmp) = @tmp; @tmp = ($code+1,$tmp+1); } else { return "OOPS"; } } $string = Tpad($self, $result . $string . $after, $cnt); print $FH $string if $FH; $string;}# $terminal->Trequire(qw/ce ku kd/);=item B<Trequire>Takes a list of capabilities as an argument and will croak if one is notfound.=cutsub Trequire { ## public my $self = shift; my($cap,@undefined); foreach $cap (@_) { push(@undefined, $cap) unless defined $self->{'_' . $cap} && $self->{'_' . $cap}; } croak "Terminal does not support: (@undefined)" if @undefined;}=back=head1 EXAMPLES use Term::Cap; # Get terminal output speed require POSIX; my $termios = new POSIX::Termios; $termios->getattr; my $ospeed = $termios->getospeed; # Old-style ioctl code to get ospeed: # require 'ioctl.pl'; # ioctl(TTY,$TIOCGETP,$sgtty); # ($ispeed,$ospeed) = unpack('cc',$sgtty); # allocate and initialize a terminal structure $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed }; # require certain capabilities to be available $terminal->Trequire(qw/ce ku kd/); # Output Routines, if $FH is undefined these just return the string # Tgoto does the % expansion stuff with the given args $terminal->Tgoto('cm', $col, $row, $FH); # Tputs doesn't do any % expansion. $terminal->Tputs('dl', $count = 1, $FH);=head1 COPYRIGHT AND LICENSEPlease see the README file in distribution.=head1 AUTHORThis module is part of the core Perl distribution and is also maintainedfor CPAN by Jonathan Stowe <jns@gellyfish.com>.=head1 SEE ALSOtermcap(5)=cut# Below is a default entry for systems where there are terminals but no# termcap1;__DATA__vt220|vt200|DEC VT220 in vt100 emulation mode:am:mi:xn:xo:co#80:li#24:RA=\E[?7l:SA=\E[?7h:ac=kkllmmjjnnwwqquuttvvxx:ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[1;24r\E[24;1H:nd=\E[C:kd=\E[B::kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:kb=\0177:r2=\E>\E[24;1H\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E=:rc=\E8:sc=\E7:se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -