Hi folks,
I missed a command from BBEdit that let you comment and uncomment text magically for different languages with the same keystroke (Text->Un/Comment), so I wrote a version for TextMate. If there is enough interest, I will release commented source code and make it into a nice .tmbundle. It currently only supports perl, php, html, plist and tex. It is trivial to add support for other languages, which I'll do on request (or you can easily figure out yourself, I think... if you do, send me an e-mail so I can update mine!).
If the selection's first line is a comment; if so, it uncomments the rest of the selection. If not, it comments the whole selection, line by line. It tries to keep the selection's indentation.
It parses the filetype from the filename ending to figure out what are comments. If a language has more than one kind of delimiter pair, it will use the first pair in the list for commenting, and will search for all listed pairs for uncommenting. Notice this last feature improves on BBEdit's Text->Un/Comment functionality. The delimiters are stored in $a in the format "a,b,c"=>[$first, $last], where each of the file endings .a, .b and .c will use that delimiter pair. Roll your own!
This version is actually better than BBEdit's, in my opinion, because 1. it can uncomment many different comment formats for silly languages like PHP that support several; and 2. it places comment delimiters at the original level of indent (and not the first column like BB does); and 3. we can all customize it.
Textmate is powerful!
best wishes, Eric
--
To install it as a command:
Before: do nothing Command: perl -e '$a={"pl,pm"=>["#",""],"plist,c"=>["/*","*/"],"html,htm"=>["<!--","-->"],"tex,ltx"=>["%",""],"php"=>["#","","/*","*/","<!--","-->","//",""]};while(($k,$v)=each(%$a)){foreach(split(/\s*,\s*/,$k)){$c{"$_"}=$v;}}$_=shift@ARGV;($t)=/.(.*?)$/;($s,$f,@etc)=@{$c{$t}};$b=0;while(<STDIN>){push@in,$_;($in)=/^([ \t]*)/;$inl=0;foreach$j(1..(length($in))){$ch=substr($in,$j-1,1);if($ch eq" "){$inl++;}else{unless($inl%4){$inl+=4;}else{$inl+=$inl%4;}}}unless($i){$ind=$in;$indl=$inl;$i++;}else{if($inl<$indl||$in eq""){$ind=$in;$indl=$inl;}}}$i=0;foreach(@in){if(chomp){$n="\n";}unless(/\S/){$o.=$_."\n";next;}unless($b){$b=1;foreach$d(@{$c{$t}}){$i=1-$i;$d=quotemeta($d);if($i){if(/^\s*$d/){$y=1;$s=$d;}}elsif($y){$f=$d;last;}}}if($y){s/^(\s*)$s(\ )?/$1/;s/(\ )?$f(\s*)$/$1/;$o.=$_.$n;}else{s/^$ind//;$o.=$ind.$s." $_ ".$f.$n;}}print$o;' $TM_FILEPATH
STDIN: Selected STDOUT: Replace Selected