Friday, January 29, 2010

Comment/Uncomment python scripts in Xcode

The default Comment/Uncomment script in Xcode works for python and pearl only if the first line of your scripts is #! /... . However, most of the times this is not what I do for my python scripts. So we can change the default script so that it determines the type of file from the extension .py.  To do so, go to the scripts tab in Xcode -the little icon before help- the select Edit User Scripts. Select the Comment/Uncomment scripts and change it to be:


#! /usr/bin/perl -w
#
# un_commentLines.pl - Comments or uncomments the selected lines
# Uses '# ' for Perl and shell scripts; '// ' otherwise

my $outputString = "";
my $perlCmt = "#";
my $cCmt = "//";

# get path to document
my $headerPath = <<'HEADERPATH';
%%%{PBXFilePath}%%%
HEADERPATH
chomp $headerPath;my $commentString;
if ($headerPath =~m/\.(sh|pl|py)$/) {
    $commentString = $perlCmt;
} else {
    $commentString = $cCmt;
}
my @selection =  ;       # read the selection from standard input

# no chars in selection, so create an empty selection
if (!@selection) {
    push @selection, "";
};

# add or remove comment markers depending on the state of the first line of the selection
# if it is uncommented, comment all lines.  If it is commented, remove comment markers, if present
my $firstLineOfSelection = $selection[0]; #get first line
my $addingCommentsString = 1;
if ($firstLineOfSelection =~ /^$commentString/) { #selection starts with comment
    $addingCommentsString = 0;
}

foreach my $line (@selection) {
    if ($addingCommentsString == 1) {
        $outputString .= $commentString.$line;
    } else {
        $line =~ s/^$commentString//;
        $outputString .= $line;
    }
}

print "%%%{PBXSelection}%%%";
print $outputString;
print "%%%{PBXSelection}%%%";

3 comments:

  1. I was getting errors using your script as is.

    I changed the line

    my @selection = ; # read the selection from standard input

    to

    my @selection = ; # read the selection from standard input

    so that it would read the selection appropriately and now it seems to be working fine.

    ReplyDelete
  2. Andre, I guess it was a typo, the right line is:

    my @selection = ; # read the selection from standard input

    ReplyDelete
  3. I get it, it is not possible to post the right line :( I'll explain it: The line is the same, but between the equal and the semicolon there should be written STDIN inclosed in smaller/bigger signs..

    ReplyDelete