[TxMt] new command: Universal Un/Comment (BBEdit-ish)

Eric Hsu erichsu at math.sfsu.edu
Tue Dec 21 15:46:52 UTC 2004


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 at ARGV;($t)=/\.(.*?)$/;($s,$f, at etc)=@{$c{$t}};$b=0;while(<STDIN>){push at 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


-- 
Eric Hsu, Assistant Professor of Mathematics
San Francisco State University
erichsu at math.sfsu.edu
http://math.sfsu.edu/hsu



More information about the textmate mailing list