in reply to Re^2: using colors with print()
in thread using colors with print()

I believe there is a need to print the newline character after the reset, not before, or in other words, do not let color attributes span unnecessary lines, and those last lines dealing with $command are redundant.

sub textcolor ($$$); print textcolor (RESET, RED, BLACK), 'In color', textcolor (RESET, WHITE, BLACK), "\n"; sub textcolor ($$$) { my ($attr, $fg, $bg) = @_; sprintf "\e[%d;%d;%dm", $attr, $fg + 30, $bg + 40; }

Replies are listed 'Best First'.
Re^4: using colors with print()
by tachyon (Chancellor) on Jun 20, 2004 at 09:30 UTC

    Actually the ANSI escapes span lines so newline position is really immaterial (except from a neatness point of view). In fact AFAIK they remain active until reset, and this status outlives the life of your program as you are effectively manipulating defaults on your term.

     
    $ cat col.pl
    #!/usr/bin/perl
    
    # default black background
    use constant BLUE => "\e[0;34;40m";
    use constant RED  => "\e[0;31;40m";
    use constant DEFAULT  => "\e[0;37;40m";
    
    print "The flag is:
    ", RED, "
    red
    ", DEFAULT, "
    white &
    ", BLUE,"
    blue.
    
    ANSI color escapes
    will span", DEFAULT, " at least with
    putty as the terminal emulation.
    ", BLUE;
    
    $ ./col.pl
    The flag is:
    
    red
    
    white &
    
    blue.
    
    ANSI color escapes
    will span at least with
    putty as the terminal emulation.
    $
    $ echo Oops forgot to reset blue mode
    Oops forgot to reset blue mode
    $ perl -e 'print "\e[0;37;40m"';
    $ echo Fixed....
    Fixed....
    
    

    cheers

    tachyon

      Oh, you're absolutely right, the sequences do span lines, and indeed should, but I had problems on Solaris 8/xterm when I relied on this. Perhaps I shouldn't have even mentioned this.

      I will mention though, that the longer those sequences remain active, the greater the chance of the userr hitting Crtl-C and having their terminal in need of an \e[0m.