In article BB9A086A-5375-11D9-8F1A-000D93589AF6@macromates.com, Allan Odgaard allan@macromates.com wrote:
On Dec 21, 2004, at 16:46, Eric Hsu wrote:
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. [...]
Nice! :)
I changed the extension-grabbing code to this: ³($t)=/.([^.]*)$/² to handle paths with multiple dots and I quoted TM FILEPATH (for paths with spaces).
I also added: "cc,mm"=>["//","","/*","*/"] and m+h to the plist,c types.
So it's now: perl -e '$a={"cc,mm"=>["//","","/*","*/"],"pl,pm"=>["#",""],"plist,c,m,h"=>["/ *","*/"],"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"
If there is enough interest, I will release commented source code and make it into a nice .tmbundle.
Sounds like when you do, I should add that bundle to what's included by default with TM (if you don't mind)! :)
It might be worth discussing the feature before making it part of TextMate.
I'm really pleased to see this script, but would like to suggest an alternative implementation: - Separate commands for comment/uncomment, rather than trying to guess which is wanted. The philosophy of "explicit is better than implicit". This has significant advantages. - No ambiguity about what should be done. Many people temporarily comment out blocks of code AND may include the leading comments. Having separate commands makes it painless and reliable. Guessing leads to the wrong thing happening. Lack of this is one of the reasons I dislike BBEdit. - No need for the code to be fancy and try to guess!
Typically one would use a certain command keystroke (e.g. option-;) to comment, and use the same keystroke plus the option key to get uncomment. Thus nothing really extra to memorize.
I will also argue for putting the comment character in the first column (or offering an option for this). I use comment/uncomment solely to temporarily comment out blocks of code, and having the comment char in the 1st column makes such code easy to spot. Indenting the comment char makes it look like any other comment, hiding the block.
Just my two bits. What do others think?
-- Russell