[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