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