mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 05:24:23 +01:00
101 lines
1.9 KiB
Plaintext
101 lines
1.9 KiB
Plaintext
|
#!/usr/bin/perl -w
|
||
|
#
|
||
|
# exceedingly ugly hack to convert bashprompt themes to zshprompt themes
|
||
|
# (bashprompt is at http://bash.current.nu/)
|
||
|
#
|
||
|
# Adam Spiers <adam@spiers.net>
|
||
|
|
||
|
use strict;
|
||
|
|
||
|
my @colours = qw/grey red green yellow blue magenta cyan white/;
|
||
|
|
||
|
my @codes = ();
|
||
|
my %bold;
|
||
|
my $out = '';
|
||
|
|
||
|
print "# Converted to zsh prompt theme by bash2zshprompt, written by <adam\@spiers.net>\n";
|
||
|
|
||
|
my $seen_fn = 0;
|
||
|
my $seen_fn_end = 0;
|
||
|
while (<>) {
|
||
|
# Ugh
|
||
|
if (! $seen_fn) {
|
||
|
s/^\s*function (\w+) {\s*$/prompt_$1_setup () {\n/ and $seen_fn = $1;
|
||
|
}
|
||
|
# UGH
|
||
|
elsif (! $seen_fn_end && $seen_fn) {
|
||
|
s/^\s*/ /;
|
||
|
s/^\s*}\s*$/\n precmd () { }\n preexec () { }\n}\n/ and $seen_fn_end++;
|
||
|
}
|
||
|
|
||
|
s/\\\[/%{/g;
|
||
|
s/\\\]/%}/g;
|
||
|
|
||
|
s/\\033/\\e/g;
|
||
|
s/\\e\[([0-9;]+)m/split_codes($1)/eg;
|
||
|
s/\\e\[((\d?)(\d))m/color()/eg;
|
||
|
|
||
|
s/(?<!\\)\\u/%n/g;
|
||
|
s/(?<!\\)\\h/%m/g;
|
||
|
s/(?<!\\)\\t/%t/g;
|
||
|
s/(?<!\\)\\d/%D{%a %b %d}/g;
|
||
|
s/(?<!\\)\\?\$\(date\s+\+([^)]+)\)/%D{$1}/g;
|
||
|
s/(?<!\\)\\!/%!/g;
|
||
|
s/(?<!\\)\\#/%!/g; # hmmm
|
||
|
s/(?<!\\)\\n/\$prompt_newline/g;
|
||
|
s/(?<!\\)\\s/\$SHELL/g;
|
||
|
s/(?<!\\)\\w/%~/g;
|
||
|
s/(?<!\\)\\W/%1~/g;
|
||
|
s/(?<!\\)\\\$(?!\()/%\#/g;
|
||
|
|
||
|
s/(?<!\\)\\0?(\d{3})/push @codes, $1; "\$char_$1"/eg;
|
||
|
|
||
|
s/%}%{//g;
|
||
|
|
||
|
$out .= $_;
|
||
|
}
|
||
|
|
||
|
# Must be a better way of doing this
|
||
|
print <<EOF if @codes;
|
||
|
|
||
|
for code in @codes; do
|
||
|
local varname=char_\$code
|
||
|
: \${(P)varname=\$(echo -n "\\\\0\$code")}
|
||
|
done
|
||
|
|
||
|
EOF
|
||
|
|
||
|
print $out;
|
||
|
|
||
|
print qq!\nprompt_${seen_fn}_setup "\$@"\n! if $seen_fn;
|
||
|
|
||
|
exit 0;
|
||
|
|
||
|
sub color {
|
||
|
my @p = ($1, $2, $3);
|
||
|
|
||
|
my $fgbg = (($p[1] eq '3') ? 'fg' :
|
||
|
($p[1] eq '4') ? 'bg' :
|
||
|
'???');
|
||
|
|
||
|
$bold{$fgbg} ||= '';
|
||
|
|
||
|
if ($p[0] =~ /^0?0$/) {
|
||
|
$bold{$fgbg} = '';
|
||
|
return '$reset_color';
|
||
|
}
|
||
|
|
||
|
if ($p[0] =~ /^0?1$/) {
|
||
|
$bold{$fgbg} = 'bold_';
|
||
|
return '$bold_color';
|
||
|
}
|
||
|
|
||
|
return '$' .
|
||
|
"${fgbg}_$bold{$fgbg}" .
|
||
|
$colours[$p[2]];
|
||
|
}
|
||
|
|
||
|
sub split_codes {
|
||
|
join '', (map { "\\e\[${_}m" } (split m!;!, $_[0]));
|
||
|
}
|