1#!/usr/bin/perl -w 2# 3# exceedingly ugly hack to convert bashprompt themes to zshprompt themes 4# 5# Adam Spiers <adam@spiers.net> 6 7use strict; 8 9my @colours = qw/grey red green yellow blue magenta cyan white/; 10 11my @codes = (); 12my %boldp; 13my $out = ''; 14 15print "# Converted to zsh prompt theme by bash2zshprompt, written by <adam\@spiers.net>\n"; 16 17my $seen_fn = 0; 18my $seen_fn_end = 0; 19while (<>) { 20 # Ugh 21 if (! $seen_fn) { 22 s/^\s*function (\w+) {\s*$/prompt_$1_setup () {\n/ and $seen_fn = $1; 23 } 24 # UGH 25 elsif (! $seen_fn_end && $seen_fn) { 26 s/^\s*/ /; 27 s/^\s*}\s*$/\n precmd () { setopt promptsubst }\n preexec () { }\n}\n/ and $seen_fn_end++; 28 } 29 30 s/\\\[/%{/g; 31 s/\\\]/%}/g; 32 33 s/\\033/\\e/g; 34 s/\\e\[([0-9;]+)m/split_codes($1)/eg; 35 s/\\e\[((\d?)(\d))m/color()/eg; 36 37 s/(?<!\\)\\u/%n/g; 38 s/(?<!\\)\\h/%m/g; 39 s/(?<!\\)\\t/%t/g; 40 s/(?<!\\)\\d/%D{%a %b %d}/g; 41 s/(?<!\\)\\?\$\(date\s+\+([^)]+)\)/%D{$1}/g; 42 s/(?<!\\)\\!/%!/g; 43 s/(?<!\\)\\#/%!/g; # hmmm 44 s/(?<!\\)\\n/\$prompt_newline/g; 45 s/(?<!\\)\\s/\$SHELL/g; 46 s/(?<!\\)\\v/\$ZSH_VERSION[1]/g; 47 s/(?<!\\)\\V/\${ZSH_VERSION%%-*}/g; 48 s/(?<!\\)\\w/%~/g; 49 s/(?<!\\)\\W/%1~/g; 50 s/(?<!\\)\\\$(?!\()/%\#/g; 51 52 s/(?<!\\)\\0?(\d{3})/push @codes, $1; "\$char_$1"/eg; 53 54 s/%}%{//g; 55 56 $out .= $_; 57} 58 59# Must be a better way of doing this 60print <<EOF if @codes; 61 62for code in @codes; do 63 local varname=char_\$code 64 : \${(P)varname=\$(echo -n "\\\\0\$code")} 65done 66 67EOF 68 69print $out; 70 71print qq!\nprompt_${seen_fn}_setup "\$@"\n! if $seen_fn; 72 73exit 0; 74 75sub color { 76 my @p = ($1, $2, $3); 77 78 my $fgbg = (($p[1] eq '3') ? 'fg' : 79 ($p[1] eq '4') ? 'bg' : 80 '???'); 81 82 $boldp{$fgbg} ||= ''; 83 84 if ($p[0] =~ /^0?0$/) { 85 $boldp{$fgbg} = ''; 86 return '$reset_color'; 87 } 88 89 if ($p[0] =~ /^0?1$/) { 90 $boldp{$fgbg} = 'bold_'; 91 return '$bold_color'; 92 } 93 94 return '$' . 95 "${fgbg}$boldp{$fgbg}\[" . 96 $colours[$p[2]] . 97 ']'; 98} 99 100sub split_codes { 101 join '', (map { "\\e\[${_}m" } (split m!;!, $_[0])); 102} 103