mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 18:10:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #!/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 %boldp;
 | |
| 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 () { setopt promptsubst }\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/(?<!\\)\\v/\$ZSH_VERSION[1]/g;
 | |
|   s/(?<!\\)\\V/\${ZSH_VERSION%%-*}/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' :
 | |
|               '???');
 | |
| 
 | |
|   $boldp{$fgbg} ||= '';
 | |
| 
 | |
|   if ($p[0] =~ /^0?0$/) {
 | |
|     $boldp{$fgbg} = '';
 | |
|     return '$reset_color';
 | |
|   }
 | |
|   
 | |
|   if ($p[0] =~ /^0?1$/) {
 | |
|     $boldp{$fgbg} = 'bold_';
 | |
|     return '$bold_color';
 | |
|   }
 | |
| 
 | |
|   return '$' .
 | |
|          "${fgbg}$boldp{$fgbg}\[" .
 | |
|          $colours[$p[2]] .
 | |
|          ']';
 | |
| }
 | |
| 
 | |
| sub split_codes {
 | |
|   join '', (map { "\\e\[${_}m" } (split m!;!, $_[0]));
 | |
| }
 |