about summary refs log tree commit diff
path: root/Misc/bash2zshprompt
diff options
context:
space:
mode:
Diffstat (limited to 'Misc/bash2zshprompt')
-rw-r--r--Misc/bash2zshprompt100
1 files changed, 100 insertions, 0 deletions
diff --git a/Misc/bash2zshprompt b/Misc/bash2zshprompt
new file mode 100644
index 000000000..aa0472ed1
--- /dev/null
+++ b/Misc/bash2zshprompt
@@ -0,0 +1,100 @@
+#!/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]));
+}