Antsy
view release on metacpan or search on metacpan
lib/Antsy.pm view on Meta::CPAN
use v5.26;
package Antsy;
use strict;
use warnings;
use utf8;
use experimental qw(signatures);
use Carp qw(carp);
use Exporter qw(import);
our( @EXPORT, @EXPORT_OK, %EXPORT_TAGS );
our $VERSION = '0.907';
=encoding utf8
=head1 NAME
Antsy - Streaming ANSI escape sequences
=head1 SYNOPSIS
use Antsy qw(:all);
print bold, underline, text_red, "Hello", reset;
=head1 DESCRIPTION
Subroutines to deal with ANSI terminal sequences. You can emit these
without knowing what's coming up.
=head2 Yet another module?
There are several modules that come close to this, but so far
everything is incomplete or requires you to know all of the upcoming
text ahead of time so you can use of it as an argument to a function.
I want to emit the sequence in a stream without knowing what's coming
up.
=over 4
=item * L<Term::ANSIColor>
Wraps ANSI color stuff around text. This comes with Perl v5.10 and
later.
=item * L<Text::ANSI::Util>
Routines for dealing with text that contains ANSI code. For example,
ignore the ANSI sequences in computing length.
=item * L<Text::ANSI::Printf>
I don't really know what this does.
=item * L<Term::ANSIScreen>
=back
=head2 Methods
=over 4
=item * bg_256( N )
=item * bg_rgb
=item * bg_black
=item * bg_blue
=item * bg_cyan
=item * bg_green
=item * bg_magenta
=item * bg_orange
=item * bg_red
=item * bg_white
=item * bg_yellow
Make the background the named color
=item * bg_bright_black
=item * bg_bright_blue
=item * bg_bright_cyan
=item * bg_bright_green
=item * bg_bright_magenta
=item * bg_bright_red
=item * bg_bright_white
=item * bg_bright_yellow
Make the background the named color and bright (however your terminal
does that).
=item * blink
Make the text blink (however your terminal does that).
=item * bold
Turn on bold
=item * clear_line
=item * clear_screen
=item * clear_to_line_end
=item * clear_to_line_start
=item * clear_to_screen_end
=item * clear_to_screen_start
Clear the part of the screen as indicated. Each of these start at the
current cursor position.
=item * conceal
Make the text invisible (if your terminal handles that).
=item * cursor_back( N )
Move the cursor back N positions.
=item * cursor_column( N )
Move the cursor to column N.
=item * cursor_down( N )
Move the cursor down N positions.
=item * cursor_forward( N )
Move the cursor forward N positions.
=item * cursor_next_line( N )
Move the cursor down N lines, to the start of the line
=item * cursor_previous_line( N )
Move the cursor up N lines, to the start of the line
=item * cursor_row_column( N, M )
Move the cursor to row N and column M.
=item * cursor_up
TK: Fill in details
=item * dark
Make the text dark (however your terminal does that).
=item * erase_in_display( [ 0, 1, 2, 3 ] )
TK: Fill in details
lib/Antsy.pm view on Meta::CPAN
push @EXPORT_OK, @subs;
push $EXPORT_TAGS{all }->@*, @subs;
push $EXPORT_TAGS{bg }->@*, grep { /\Abg_/ } @subs;
push $EXPORT_TAGS{text }->@*, grep { /\Atext_/ } @subs;
push $EXPORT_TAGS{erase }->@*, grep { /\Aerase_/ } @subs;
push $EXPORT_TAGS{cursor}->@*, grep { /\Acursor_/ } @subs;
}
BEGIN {
my @groups = (
[ qw( J screen) ],
[ qw( K line ) ],
);
my @templates = ( 'clear_to_%s_end', 'clear_to_%s_start', 'clear_%s' );
foreach my $group ( @groups ) {
no strict 'refs';
foreach my $i ( 0 .. 2 ) {
my $name = sprintf $templates[$i], $group->[1];
my $value = _seq( $group->[0], $i );
*{$name} = sub () { $value };
_export( $name, 'clear' );
}
}
}
BEGIN {
my @groups = (
[ qw( cursor back D ) ],
[ qw( cursor column G ) ],
[ qw( cursor down B ) ],
[ qw( cursor forward C ) ],
[ qw( cursor next_line E ) ],
[ qw( cursor previous_line F ) ],
[ qw( cursor up A ) ],
[ qw( scroll down T ) ],
[ qw( scroll up S ) ],
);
foreach my $group ( @groups ) {
no strict 'refs';
my( $export_tag, $fragment, $command ) = @$group;
my $name = join '_', $export_tag, $fragment;
*{$name} = sub ( $n ) {
$n = $n =~ /\A([0-9]+)\z/ ? $1 : 0;
_seq( $command, $n );
};
_export( $name, $export_tag );
}
}
BEGIN {
my @groups = (
# EXPORT_TAG SUB_NAME COMMAND ARGS
[ qw( control reset m 0 ) ],
[ qw( text bold m 1 ) ],
[ qw( text dark m 2 ) ],
[ qw( text italic m 3 ) ],
[ qw( text underline m 4 ) ],
[ qw( text blink m 5 ) ],
[ qw( text reverse m 7 ) ],
[ qw( text conceal m 8 ) ],
[ qw( cursor save_cursor s ) ],
[ qw( cursor restore_cursor u ) ],
[ qw( cursor hide_cursor h ?25 ) ],
[ qw( cursor show_cursor l ?25 ) ],
);
foreach my $group ( @groups ) {
no strict 'refs';
my( $export_tag, $name, $command, $n ) = @$group;
$n //= '';
my $value = _seq( $command, $n );
*{$name} = sub () { $value };
_export( $name, $export_tag );
}
}
BEGIN {
my @colors = qw( black red green yellow blue magenta cyan white );
my %colors = map { state $n = 0; $_ => $n++ } @colors;
my @groups = (
[ ( 0, '', '%s' ) ],
[ qw( 30 text %s ) ],
[ qw( 90 text bright %s ) ],
[ qw( 40 bg %s ) ],
[ qw( 100 bg bright %s ) ],
);
foreach my $group ( @groups ) {
my $offset = shift @$group;
my $template = join "_", @$group;
foreach my $i ( 0 .. $#colors ) {
no strict 'refs';
my $name = sprintf $template, $colors[$i];
my $value = _seq( 'm', $offset + $i );
*{$name} = sub () { $value };
_export( $name, $group->[1] );
}
}
my @secondary_colors = (
[ 'orange', [ 0xFF, 0x8C, 0x00 ] ],
);
foreach my $tuple ( @secondary_colors ) {
no strict 'refs';
my( $color, $rgb ) = $tuple->@*;
my $name = "text_$color";
my $value = text_rgb( $rgb->@* );
*{$name} = sub () { $value };
lib/Antsy.pm view on Meta::CPAN
sub iterm_set_bar_cursor () { state $s = _iterm_set_cursor(1); $s }
sub iterm_set_underline_cursor () { state $s = _iterm_set_cursor(2); $s }
=item * set_mark
Same as Command-Shift-M. Mark the current location and jump back to it
with Command-Shift-J.
=cut
# OSC 1337 ; SetMark ST
sub set_mark () { state $s = _osc_1337( 'SetMark' ); $s }
=item * steal_focus
Bring the window to the foreground.
=cut
# OSC 1337 ; StealFocus ST
sub steal_focus () { state $s = _osc_1337( 'StealFocus' ); $s }
=item * clear_scrollback_history
Erase the scrollback history.
=cut
# OSC 1337 ; ClearScrollback ST
sub clear_scrollback_history () { state $s = _osc_1337( 'ClearScrollback' ); $s }
=item * post_notification
=cut
# OSC 9 ; [Message content goes here] ST
=item * set_current_directory
=cut
# OSC 1337 ; CurrentDir=[current directory] ST
=item * change_profile
=cut
# OSC 1337 SetProfile=[new profile name] ST
=item * start_copy_to_clipboard
=item * end_copy_to_clipboard
=cut
# OSC 1337 ; CopyToClipboard=[clipboard name] ST
# OSC 1337 ; EndCopy ST
=item * change_color_palette
[key] gives the color to change. The accepted values are: fg bg bold link selbg selfg curbg curfg underline tab" black red green yellow blue magenta cyan white br_black br_red br_green br_yellow br_blue br_magenta br_cyan br_white
[value] gives the new color. The following formats are accepted:
RGB (three hex digits, like fff)
RRGGBB (six hex digits, like f0f0f0)
cs:RGB (like RGB but cs gives a color space)
cs:RRGGBB (like RRGGBB but cs gives a color space)
If a color space is given, it should be one of:
srgb (the standard sRGB color space)
rgb (the device-specific color space)
p3 (the standard P3 color space, whose gamut is supported on some newer hardware)
=cut
# OSC 1337 ; SetColors=[key]=[value] ST
=item * add_annotation
OSC 1337 ; AddAnnotation=[message] ST
OSC 1337 ; AddAnnotation=[length] | [message] ST
OSC 1337 ; AddAnnotation=[message] | [length] | [x-coord] | [y-coord] ST
OSC 1337 ; AddHiddenAnnotation=[message] ST
OSC 1337 ; AddHiddenAnnotation=[length] | [message] ST
OSC 1337 ; AddHiddenAnnotation=[message] | [length] | [x-coord] | [y-coord] ST
`[message]`: The message to attach to the annotation.
`[length]`: The number of cells to annotate. Defaults to the rest of the line beginning at the start of the annotation.
`[x-coord]` and `[y-coord]`: The starting coordinate for the annotation. Defaults to the cursor's coordinate.
=cut
sub add_annotation () {}
=item * hide_cursor_guide
=item * show_cursor_guide
=cut
# OSC 1337 ; HighlightCursorLine=[boolean] ST
sub hide_cursor_guide () { state $s = _osc_1337( 'HighlightCursorLine=no' ); $s }
sub show_cursor_guide () { state $s = _osc_1337( 'HighlightCursorLine=yes' ); $s }
=item * iterm_attention
Play with the dock icon.
=over 4
=item * fireworks - animation at the cursor
=item * no - stop bouncing the dock icon
=item * once - bounce the dock icon once
=item * yes - bounce the dock indefinitely
=back
( run in 0.773 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )