Theming improvements
References from a theme property to another, references between themes, default foreground color, fixes to current theme.
This commit is contained in:
parent
20a930e07e
commit
dcdb5344d9
1 changed files with 74 additions and 44 deletions
118
spp.pl
118
spp.pl
|
@ -97,6 +97,8 @@ our %CONFIG = (
|
||||||
|
|
||||||
our %THEMES = ();
|
our %THEMES = ();
|
||||||
|
|
||||||
|
sub thref { bless {(@_==2)?(t=>$_[0],r=>$_[1]):(r=>$_[0])}, 'ThemeRef'; }
|
||||||
|
|
||||||
# Powerline based, using yellow and blue
|
# Powerline based, using yellow and blue
|
||||||
$THEMES{powerline_yb} = {
|
$THEMES{powerline_yb} = {
|
||||||
# Padding character
|
# Padding character
|
||||||
|
@ -120,99 +122,109 @@ $THEMES{powerline_yb} = {
|
||||||
# Secondary prompt suffix
|
# Secondary prompt suffix
|
||||||
ps2_suffix => '\f0\b2\f2\b1 ' ,
|
ps2_suffix => '\f0\b2\f2\b1 ' ,
|
||||||
|
|
||||||
|
# Color gradient to use
|
||||||
|
bg0 => 21 , bg1 => 61 , bg2 => 143 , bg3 => 226 ,
|
||||||
|
fg3 => 21 , fg2 => 26 , fg1 => 184 , fg0 => 226 ,
|
||||||
|
# Default foreground color
|
||||||
|
fg => 15 ,
|
||||||
|
|
||||||
# Extra colors for transition strings
|
# Extra colors for transition strings
|
||||||
transition => [ 233 ] ,
|
transition => [ 233 ] ,
|
||||||
# Default left side background color
|
# Default left side colors
|
||||||
bg_left => 239 ,
|
bg_left => 239 ,
|
||||||
# Default middle background color
|
fg_left => thref( 'fg' ) ,
|
||||||
|
# Default middle colors
|
||||||
bg_middle => 235 ,
|
bg_middle => 235 ,
|
||||||
|
fg_middle => thref( 'fg' ) ,
|
||||||
# Default right side background color
|
# Default right side background color
|
||||||
bg_right => 239 ,
|
bg_right => thref( 'bg_left' ) ,
|
||||||
|
fg_right => thref( 'fg' ) ,
|
||||||
# Default input prompt background color
|
# Default input prompt background color
|
||||||
bg_input => 238 ,
|
bg_input => 238 ,
|
||||||
|
fg_input => thref( 'fg' ) ,
|
||||||
# Secondary prompt backaground
|
# Secondary prompt backaground
|
||||||
bg_ps2 => 234 ,
|
bg_ps2 => 234 ,
|
||||||
|
|
||||||
# Current working directory - Truncation string
|
# Current working directory - Truncation string
|
||||||
cwd_trunc => '…' ,
|
cwd_trunc => '…' ,
|
||||||
# Current working directory - Foreground / background colors
|
# Current working directory - Foreground / background colors
|
||||||
cwd_fg_color => 15 ,
|
cwd_fg_color => -1 ,
|
||||||
cwd_bg_color => -1 ,
|
cwd_bg_color => -1 ,
|
||||||
|
|
||||||
# User@host - Remote host symbol
|
# User@host - Remote host symbol
|
||||||
uh_remote_symbol => '↥' ,
|
uh_remote_symbol => '↥' ,
|
||||||
# User@host - User - Foreground and background colors
|
# User@host - User - Foreground and background colors
|
||||||
uh_user_fg => 15 ,
|
uh_user_fg => thref( 'fg0' ) ,
|
||||||
uh_user_bg => 18 ,
|
uh_user_bg => thref( 'bg0' ) ,
|
||||||
# User@host - Root - Foreground and background colors
|
# User@host - Root - Foreground and background colors
|
||||||
uh_root_fg => 0 ,
|
uh_root_fg => thref( 'fg3' ) ,
|
||||||
uh_root_bg => 220 ,
|
uh_root_bg => thref( 'bg3' ) ,
|
||||||
|
|
||||||
# Date/time - Colors
|
# Date/time - Colors
|
||||||
dt_time_fg => 15 ,
|
dt_time_fg => -1 ,
|
||||||
dt_date_fg => 15 ,
|
dt_date_fg => -1 ,
|
||||||
dt_bg => -1 ,
|
dt_bg => -1 ,
|
||||||
|
|
||||||
# Previous command state - Symbols
|
# Previous command state - Symbols
|
||||||
pcmd_ok_sym => '✓' ,
|
pcmd_ok_sym => '✓' ,
|
||||||
pcmd_err_sym => '✗' ,
|
pcmd_err_sym => '✗' ,
|
||||||
# Previous command state - OK text / background color
|
# Previous command state - OK text / background color
|
||||||
pcmd_ok_fg => 21 ,
|
pcmd_ok_fg => thref( 'fg3' ) ,
|
||||||
pcmd_ok_bg => -1 ,
|
pcmd_ok_bg => -1 ,
|
||||||
# Previous command state - Error text / background color
|
# Previous command state - Error text / background color
|
||||||
pcmd_err_fg => 220 ,
|
pcmd_err_fg => thref( 'fg0' ) ,
|
||||||
pcmd_err_bg => -1 ,
|
pcmd_err_bg => -1 ,
|
||||||
# Previous command state - Other text foreground
|
# Previous command state - Other text foreground
|
||||||
pcmd_text_fg => 15 ,
|
pcmd_text_fg => -1 ,
|
||||||
|
|
||||||
# Load average - Symbol or text
|
# Load average - Symbol or text
|
||||||
load_title => '↟' ,
|
load_title => '↟' ,
|
||||||
# Load average - Low load colors
|
# Load average - Low load colors
|
||||||
load_low_fg => 15 ,
|
load_low_fg => -1 ,
|
||||||
load_low_bg => -1 ,
|
load_low_bg => -1 ,
|
||||||
# Load average - Medium load colors
|
# Load average - Medium load colors
|
||||||
load_med_fg => 231 ,
|
load_med_fg => thref( 'fg1' ) ,
|
||||||
load_med_bg => 135 ,
|
load_med_bg => thref( 'bg1' ) ,
|
||||||
# Load average - High load colors
|
# Load average - High load colors
|
||||||
load_high_fg => 231 ,
|
load_high_fg => thref( 'fg3' ) ,
|
||||||
load_high_bg => 130 ,
|
load_high_bg => thref( 'bg3' ) ,
|
||||||
|
|
||||||
# Git - Branch symbol
|
# Git - Branch symbol
|
||||||
git_branch_symbol => ' ' ,
|
git_branch_symbol => ' ' ,
|
||||||
# Git - Branch colors - No warning
|
# Git - Branch colors - No warning
|
||||||
git_branch_ok_bg => 33 ,
|
git_branch_ok_bg => thref( 'bg0' ) ,
|
||||||
git_branch_ok_fg => 15 ,
|
git_branch_ok_fg => thref( 'fg0' ) ,
|
||||||
# Git - Branch colors - Weak warning
|
# Git - Branch colors - Weak warning
|
||||||
git_branch_warn_bg => 139 ,
|
git_branch_warn_bg => thref( 'bg2' ) ,
|
||||||
git_branch_warn_fg => 0 ,
|
git_branch_warn_fg => thref( 'fg2' ) ,
|
||||||
# Git - Branch colors - Strong warning
|
# Git - Branch colors - Strong warning
|
||||||
git_branch_danger_bg => 220 ,
|
git_branch_danger_bg => thref( 'bg3' ) ,
|
||||||
git_branch_danger_fg => 0 ,
|
git_branch_danger_fg => 0 ,
|
||||||
# Git - Repo state colors
|
# Git - Repo state colors
|
||||||
git_repstate_bg => 220 ,
|
git_repstate_bg => thref( 'bg1' ) ,
|
||||||
git_repstate_fg => 0 ,
|
git_repstate_fg => thref( 'fg1' ) ,
|
||||||
# Git - Untracked symbol and colors
|
# Git - Untracked symbol and colors
|
||||||
git_untracked_symbol => '❄' ,
|
git_untracked_symbol => '❄' ,
|
||||||
git_untracked_bg => 220 ,
|
git_untracked_bg => thref( 'bg3' ) ,
|
||||||
git_untracked_normal_fg => 0 ,
|
git_untracked_normal_fg => thref( 'fg3' ) ,
|
||||||
git_untracked_add_fg => 0 ,
|
git_untracked_add_fg => thref( 'fg3' ) ,
|
||||||
git_untracked_mod_fg => 0 ,
|
git_untracked_mod_fg => thref( 'fg3' ) ,
|
||||||
git_untracked_del_fg => 0 ,
|
git_untracked_del_fg => thref( 'fg3' ) ,
|
||||||
# Git - Indexed symbol and colors
|
# Git - Indexed symbol and colors
|
||||||
git_indexed_symbol => '☰' ,
|
git_indexed_symbol => '☰' ,
|
||||||
git_indexed_bg => 139 ,
|
git_indexed_bg => thref( 'bg2' ) ,
|
||||||
git_indexed_normal_fg => 0 ,
|
git_indexed_normal_fg => thref( 'fg2' ) ,
|
||||||
git_indexed_add_fg => 0 ,
|
git_indexed_add_fg => thref( 'fg2' ) ,
|
||||||
git_indexed_mod_fg => 0 ,
|
git_indexed_mod_fg => thref( 'fg2' ) ,
|
||||||
git_indexed_del_fg => 0 ,
|
git_indexed_del_fg => thref( 'fg2' ) ,
|
||||||
# Git - Add/modify/delete symbols
|
# Git - Add/modify/delete symbols
|
||||||
git_add_symbol => '+' ,
|
git_add_symbol => '+' ,
|
||||||
git_mod_symbol => '±' ,
|
git_mod_symbol => '±' ,
|
||||||
git_del_symbol => '∅' ,
|
git_del_symbol => '∅' ,
|
||||||
# Git stash symbol and color
|
# Git stash symbol and color
|
||||||
git_stash_symbol => '‡' ,
|
git_stash_symbol => '‡' ,
|
||||||
git_stash_bg => 33 ,
|
git_stash_bg => thref( 'bg1' ) ,
|
||||||
git_stash_fg => 15 ,
|
git_stash_fg => thref( 'fg1' ) ,
|
||||||
};
|
};
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
|
@ -238,6 +250,17 @@ sub set_color
|
||||||
}
|
}
|
||||||
|
|
||||||
our $THEME = undef;
|
our $THEME = undef;
|
||||||
|
sub theme_resolve
|
||||||
|
{
|
||||||
|
my ( $theme , $key ) = @_;
|
||||||
|
my $value = $theme->{ $key };
|
||||||
|
if ( ref( $value ) eq 'ThemeRef' ) {
|
||||||
|
my $rt = exists( $value->{t} ) ? $THEMES{ $value->{t} } : $theme;
|
||||||
|
$theme->{ $key } = theme_resolve( $rt , $value->{r} );
|
||||||
|
$value = $theme->{ $key };
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
sub themed($)
|
sub themed($)
|
||||||
{
|
{
|
||||||
my $k = shift;
|
my $k = shift;
|
||||||
|
@ -246,6 +269,10 @@ sub themed($)
|
||||||
%{ $THEMES{ $CONFIG{layout_theme} } } ,
|
%{ $THEMES{ $CONFIG{layout_theme} } } ,
|
||||||
%{ $CONFIG{layout_theme_overrides} } ,
|
%{ $CONFIG{layout_theme_overrides} } ,
|
||||||
};
|
};
|
||||||
|
my @to_resolve = grep { ref($THEME->{$_}) eq 'ThemeRef' } keys %$THEME;
|
||||||
|
foreach my $k ( @to_resolve ) {
|
||||||
|
theme_resolve( $THEME , $k );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $THEME->{ $k };
|
return $THEME->{ $k };
|
||||||
}
|
}
|
||||||
|
@ -364,6 +391,7 @@ sub add_transitions
|
||||||
my $prefix = themed( $name . '_prefix' );
|
my $prefix = themed( $name . '_prefix' );
|
||||||
my $separator = themed( $name . '_separator' );
|
my $separator = themed( $name . '_separator' );
|
||||||
my $suffix = themed( $name . '_suffix' );
|
my $suffix = themed( $name . '_suffix' );
|
||||||
|
my $bgDefault = themed( 'bg_' . $name );
|
||||||
|
|
||||||
my $prevBg = undef;
|
my $prevBg = undef;
|
||||||
my $curBg = $cBefore;
|
my $curBg = $cBefore;
|
||||||
|
@ -371,6 +399,7 @@ sub add_transitions
|
||||||
foreach my $section ( @_ ) {
|
foreach my $section ( @_ ) {
|
||||||
$prevBg = $curBg;
|
$prevBg = $curBg;
|
||||||
$curBg = ( exists $section->{bg} ) ? $section->{bg} : -1;
|
$curBg = ( exists $section->{bg} ) ? $section->{bg} : -1;
|
||||||
|
$curBg = $bgDefault if $curBg < 0;
|
||||||
my $trans = scalar(@out) ? $separator : $prefix;
|
my $trans = scalar(@out) ? $separator : $prefix;
|
||||||
@out = ( @out ,
|
@out = ( @out ,
|
||||||
gen_transition( $trans , $prevBg , $curBg ) ,
|
gen_transition( $trans , $prevBg , $curBg ) ,
|
||||||
|
@ -389,7 +418,8 @@ sub render
|
||||||
my $out = '';
|
my $out = '';
|
||||||
my $mustSetFg = undef;
|
my $mustSetFg = undef;
|
||||||
my $mustSetBg = undef;
|
my $mustSetBg = undef;
|
||||||
my $cDefault = themed( 'bg_' . $name );
|
my $bgDefault = themed( 'bg_' . $name );
|
||||||
|
my $fgDefault = themed( 'fg_' . $name );
|
||||||
foreach my $section ( @_ ) {
|
foreach my $section ( @_ ) {
|
||||||
$mustSetBg = $section->{bg} if exists $section->{bg};
|
$mustSetBg = $section->{bg} if exists $section->{bg};
|
||||||
foreach my $part ( @{ $section->{content} } ) {
|
foreach my $part ( @{ $section->{content} } ) {
|
||||||
|
@ -398,11 +428,11 @@ sub render
|
||||||
$mustSetFg = $part->{fg} if exists $part->{fg};
|
$mustSetFg = $part->{fg} if exists $part->{fg};
|
||||||
} else {
|
} else {
|
||||||
if ( defined $mustSetBg ) {
|
if ( defined $mustSetBg ) {
|
||||||
$mustSetBg = $cDefault if $mustSetBg < 0;
|
$mustSetBg = $bgDefault if $mustSetBg < 0;
|
||||||
$out .= set_color( 'b' , $mustSetBg );
|
$out .= set_color( 'b' , $mustSetBg );
|
||||||
}
|
}
|
||||||
if ( defined $mustSetFg ) {
|
if ( defined $mustSetFg ) {
|
||||||
$mustSetFg = $cDefault if $mustSetFg < 0;
|
$mustSetFg = $fgDefault if $mustSetFg < 0;
|
||||||
$out .= set_color( 'f' , $mustSetFg );
|
$out .= set_color( 'f' , $mustSetFg );
|
||||||
}
|
}
|
||||||
$part =~ s/\\/\\\\/g;
|
$part =~ s/\\/\\\\/g;
|
||||||
|
@ -458,7 +488,7 @@ sub gen_top_line
|
||||||
my $txt = render( 'left' , add_transitions( 'left' , 0 , $mc , @left ) );
|
my $txt = render( 'left' , add_transitions( 'left' , 0 , $mc , @left ) );
|
||||||
$txt .= render( 'middle' , @lm , @middle , @mr , @mpad );
|
$txt .= render( 'middle' , @lm , @middle , @mr , @mpad );
|
||||||
$txt .= render( 'right' , add_transitions( 'right' , $mc , 0 , @right ) );
|
$txt .= render( 'right' , add_transitions( 'right' , $mc , 0 , @right ) );
|
||||||
return $txt . "\\n";
|
return $txt . tput_sequence( 'sgr0' ) . "\\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
sub gen_input_line
|
sub gen_input_line
|
||||||
|
@ -471,6 +501,7 @@ sub gen_input_line
|
||||||
push @input , {content=>['']} unless @input;
|
push @input , {content=>['']} unless @input;
|
||||||
return ( $len ,
|
return ( $len ,
|
||||||
render( 'input' , add_transitions( 'input' , 0 , 0 , @input ) )
|
render( 'input' , add_transitions( 'input' , 0 , 0 , @input ) )
|
||||||
|
. tput_sequence( 'sgr0' )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,7 +522,6 @@ sub gen_ps2
|
||||||
my $ps1 = gen_top_line;
|
my $ps1 = gen_top_line;
|
||||||
my ( $ill , $ilt ) = gen_input_line;
|
my ( $ill , $ilt ) = gen_input_line;
|
||||||
$ps1 .= $ilt;
|
$ps1 .= $ilt;
|
||||||
$ps1 .= tput_sequence( 'sgr0' ) if $ps1;
|
|
||||||
my $ps2 = gen_ps2( $ill );
|
my $ps2 = gen_ps2( $ill );
|
||||||
print "export PS1=\"$ps1\" PS2=\"$ps2\"\n";
|
print "export PS1=\"$ps1\" PS2=\"$ps2\"\n";
|
||||||
|
|
||||||
|
@ -602,12 +632,12 @@ sub render_prevcmd
|
||||||
my $col = themed( ( $status == 0 ) ? 'pcmd_ok_fg' : 'pcmd_err_fg' );
|
my $col = themed( ( $status == 0 ) ? 'pcmd_ok_fg' : 'pcmd_err_fg' );
|
||||||
my @out = ();
|
my @out = ();
|
||||||
if ( $ss ) {
|
if ( $ss ) {
|
||||||
push @out , { fg => ( $cl & 1 != 0 ) ? $col : -1 };
|
push @out , { fg => ( ( $cl & 1 ) != 0 ) ? $col : -1 };
|
||||||
push @out , themed( ( $status == 0 ) ? 'pcmd_ok_sym' : 'pcmd_err_sym' );
|
push @out , themed( ( $status == 0 ) ? 'pcmd_ok_sym' : 'pcmd_err_sym' );
|
||||||
}
|
}
|
||||||
if ( $sc ) {
|
if ( $sc ) {
|
||||||
push @out , ' ' if @out;
|
push @out , ' ' if @out;
|
||||||
push @out , { fg => ( $cl & 2 != 0 ) ? $col : -1 };
|
push @out , { fg => ( ( ( $cl & 2 ) != 0 ) ? $col : -1 ) };
|
||||||
if ( $pc ) {
|
if ( $pc ) {
|
||||||
my $str = sprintf '%' . ( $pc * 3 ) . 's' , $status;
|
my $str = sprintf '%' . ( $pc * 3 ) . 's' , $status;
|
||||||
my $pad = themed 'padding';
|
my $pad = themed 'padding';
|
||||||
|
|
Loading…
Reference in a new issue