2009-01-03 18:11:29 +00:00
|
|
|
TextMate {
|
2009-01-03 18:58:52 +00:00
|
|
|
classvar menu, <openClassInTextMate, <openReferencesInTextMate;
|
2009-01-03 18:11:29 +00:00
|
|
|
|
2009-01-17 15:07:08 +00:00
|
|
|
*saveState {
|
|
|
|
(
|
|
|
|
classfiles: openClassInTextMate.state,
|
|
|
|
references: openReferencesInTextMate.state
|
|
|
|
).writeArchive("%/.textmate-settings".format(Platform.userAppSupportDir));
|
|
|
|
}
|
|
|
|
|
2009-01-03 18:11:29 +00:00
|
|
|
*initClass {
|
|
|
|
var opt;
|
2009-01-18 01:42:45 +00:00
|
|
|
var settings;
|
|
|
|
var setpath = "%/.textmate-settings".format(Platform.userAppSupportDir);
|
2009-01-17 15:07:08 +00:00
|
|
|
|
2009-01-18 01:42:45 +00:00
|
|
|
if(File.exists(setpath)) {
|
|
|
|
settings = Object.readArchive(setpath);
|
|
|
|
} {
|
|
|
|
settings = (
|
|
|
|
classfiles: true,
|
|
|
|
references: true
|
|
|
|
)
|
|
|
|
};
|
2009-01-17 14:13:09 +00:00
|
|
|
|
|
|
|
try {
|
2009-02-24 09:53:25 +00:00
|
|
|
menu = SCMenuGroup(nil, "TextMate", 7);
|
2008-12-21 23:08:08 +00:00
|
|
|
|
2009-02-24 09:53:25 +00:00
|
|
|
opt = SCMenuItem(menu, "TextMate to front")
|
|
|
|
.action_{
|
|
|
|
"osascript << END
|
|
|
|
tell application \"TextMate\" to activate
|
|
|
|
END
|
|
|
|
".unixCmd(postOutput: false)
|
|
|
|
}
|
|
|
|
.setShortCut("T");
|
2009-01-17 15:07:08 +00:00
|
|
|
|
2009-02-24 09:53:25 +00:00
|
|
|
SCMenuSeparator(menu);
|
2009-01-17 15:07:08 +00:00
|
|
|
|
2009-02-24 09:53:25 +00:00
|
|
|
openClassInTextMate = SCMenuItem(menu, "Open class files in TextMate")
|
|
|
|
.action_{ |item|
|
|
|
|
item.state = item.state.not;
|
|
|
|
this.saveState;
|
|
|
|
}
|
|
|
|
.state_(settings.classfiles);
|
|
|
|
|
|
|
|
openReferencesInTextMate = SCMenuItem(menu, "Open references in TextMate")
|
|
|
|
.action_{ |item|
|
|
|
|
item.state = item.state.not;
|
|
|
|
this.saveState;
|
|
|
|
}
|
|
|
|
.state_(settings.references);
|
2009-01-17 15:07:08 +00:00
|
|
|
|
2009-02-24 09:53:25 +00:00
|
|
|
SCMenuSeparator(menu, 4);
|
|
|
|
|
|
|
|
SCMenuItem(menu, "About SuperCollider bundle")
|
|
|
|
.action_{ |item|
|
|
|
|
"open 'http://github.com/rfwatson/supercollider-tmbundle'".unixCmd(postOutput:false);
|
|
|
|
}
|
|
|
|
} {
|
2009-01-17 14:13:09 +00:00
|
|
|
"TextMate found a problem installing CocoaMenuItems - you may be running SC 3.2 or older, or booting from command-line.".warn
|
|
|
|
}
|
2009-01-03 18:11:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-10 12:57:13 +00:00
|
|
|
// adapted from http://github.com/rfwatson/sc3ctrl
|
2008-12-21 23:08:08 +00:00
|
|
|
SC3Controller {
|
|
|
|
classvar nodes;
|
|
|
|
|
|
|
|
*initClass {
|
|
|
|
nodes = List[];
|
|
|
|
|
2008-12-21 23:20:05 +00:00
|
|
|
Platform.case(\osx) {
|
2008-12-21 23:08:08 +00:00
|
|
|
StartUp.add {
|
|
|
|
this.addListeners;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*addListeners {
|
2008-12-21 23:20:05 +00:00
|
|
|
var node, postToFront;
|
|
|
|
|
|
|
|
postToFront = {
|
|
|
|
Document.listener.front;
|
|
|
|
};
|
|
|
|
|
2008-12-21 23:08:08 +00:00
|
|
|
if(nodes.isEmpty) {
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/cmd') { |t, r, msg|
|
2008-12-23 11:09:28 +00:00
|
|
|
{
|
2009-01-03 18:17:41 +00:00
|
|
|
thisThread.clock = SystemClock;
|
2008-12-23 11:09:28 +00:00
|
|
|
msg[1].asString.interpretPrint;
|
|
|
|
postToFront.();
|
2009-01-03 18:17:41 +00:00
|
|
|
}.defer
|
2008-12-21 23:08:08 +00:00
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/help') { |t, r, msg|
|
2009-01-03 18:58:52 +00:00
|
|
|
{
|
|
|
|
msg[1].asString.openHelpFile;
|
|
|
|
}.defer
|
2008-12-21 23:08:08 +00:00
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/class') { |t, r, msg|
|
2009-01-03 18:11:29 +00:00
|
|
|
// TM version only
|
2009-01-10 12:57:13 +00:00
|
|
|
var fname, cmd;
|
2009-01-03 18:11:29 +00:00
|
|
|
var klass = msg[1].asString;
|
|
|
|
var allClasses = Class.allClasses.collect(_.asString);
|
|
|
|
|
|
|
|
{
|
|
|
|
if(TextMate.openClassInTextMate.state) {
|
|
|
|
if(allClasses.detect{ |str| str == klass }.notNil) { // .includes doesn't work?
|
2009-01-10 12:57:13 +00:00
|
|
|
fname = klass.interpret.filenameSymbol;
|
|
|
|
cmd = "grep -nh \"^" ++ klass ++ "\" \"" ++ fname ++ "\" > /tmp/grepout.tmp";
|
2009-01-03 18:11:29 +00:00
|
|
|
cmd.unixCmd(postOutput: false, action: {
|
|
|
|
File.use("/tmp/grepout.tmp", "r") { |f|
|
|
|
|
var content = f.readAllString;
|
|
|
|
var split = content.split($:);
|
|
|
|
if("^[0-9]+$".matchRegexp(split.first.asString)) {
|
2009-01-03 22:39:52 +00:00
|
|
|
("mate -l" ++ split.first + "\"" ++ fname ++ "\"").unixCmd(postOutput: false);
|
2009-01-03 18:11:29 +00:00
|
|
|
} {
|
2009-01-03 23:05:00 +00:00
|
|
|
("mate -l1 \"" ++ fname ++ "\"").unixCmd(postOutput: false);
|
2009-01-03 18:11:29 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} { // open in SC.app
|
|
|
|
klass.interpret.openCodeFile;
|
|
|
|
};
|
|
|
|
}.defer
|
2008-12-21 23:08:08 +00:00
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/implementations') { |t, r, msg|
|
2009-01-03 18:58:52 +00:00
|
|
|
if(TextMate.openReferencesInTextMate.state) {
|
2009-01-03 23:05:00 +00:00
|
|
|
{ this.methodTemplates(msg[1], true) }.defer
|
2009-01-03 18:58:52 +00:00
|
|
|
} { // open in SC.app
|
2009-01-03 23:05:00 +00:00
|
|
|
{ this.methodTemplates(msg[1], false) }.defer
|
2009-01-03 18:58:52 +00:00
|
|
|
}
|
2008-12-21 23:08:08 +00:00
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/references') { |t, r, msg|
|
2009-01-03 18:58:52 +00:00
|
|
|
if(TextMate.openReferencesInTextMate.state) {
|
2009-01-03 23:05:00 +00:00
|
|
|
{ this.methodReferences(msg[1], true) }.defer
|
2009-01-03 18:58:52 +00:00
|
|
|
} { // open in SC.app
|
2009-01-03 23:05:00 +00:00
|
|
|
{ this.methodReferences(msg[1], false) }.defer
|
2009-01-03 18:58:52 +00:00
|
|
|
}
|
2008-12-21 23:08:08 +00:00
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
2009-01-03 18:11:29 +00:00
|
|
|
|
2008-12-21 23:08:08 +00:00
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/stop') { |t, r, msg|
|
2008-12-23 11:09:28 +00:00
|
|
|
thisProcess.stop; nil;
|
2008-12-21 23:08:08 +00:00
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/clear') { |t, r, msg|
|
|
|
|
{
|
|
|
|
Document.listener.string = ""; "";
|
|
|
|
postToFront.();
|
|
|
|
}.defer;
|
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/postfront') { |t, r, msg|
|
|
|
|
{ postToFront.() }.defer;
|
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
|
|
|
|
node = OSCresponderNode(nil, '/sc3ctrl/recompile') { |t, r, msg|
|
|
|
|
{
|
|
|
|
thisProcess.recompile;
|
|
|
|
postToFront.();
|
|
|
|
}.defer;
|
|
|
|
}.add;
|
|
|
|
nodes.add(node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*removeAllListeners {
|
|
|
|
nodes.do(_.remove);
|
|
|
|
}
|
|
|
|
|
|
|
|
// adapated from Kernel.sc
|
2009-01-03 18:58:52 +00:00
|
|
|
*methodTemplates { |name, openInTextMate=false|
|
2009-01-10 12:57:13 +00:00
|
|
|
var out, found = 0, namestring, fname;
|
2008-12-21 23:08:08 +00:00
|
|
|
out = CollStream.new;
|
|
|
|
out << "Implementations of '" << name << "' :\n";
|
|
|
|
Class.allClasses.do({ arg class;
|
|
|
|
class.methods.do({ arg method;
|
|
|
|
if (method.name == name, {
|
|
|
|
found = found + 1;
|
|
|
|
namestring = class.name ++ ":" ++ name;
|
|
|
|
out << " " << namestring << " : ";
|
|
|
|
if (method.argNames.isNil or: { method.argNames.size == 1 }, {
|
|
|
|
out << "this." << name;
|
|
|
|
if (name.isSetter, { out << "(val)"; });
|
|
|
|
},{
|
|
|
|
out << method.argNames.at(0);
|
|
|
|
if (name.asString.at(0).isAlpha, {
|
|
|
|
out << "." << name << "(";
|
|
|
|
method.argNames.do({ arg argName, i;
|
|
|
|
if (i > 0, {
|
|
|
|
if (i != 1, { out << ", " });
|
|
|
|
out << argName;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
out << ")";
|
|
|
|
},{
|
|
|
|
out << " " << name << " ";
|
|
|
|
out << method.argNames.at(1);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
out.nl;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if(found == 0)
|
|
|
|
{
|
|
|
|
Post << "\nNo implementations of '" << name << "'.\n";
|
|
|
|
}
|
|
|
|
{
|
2009-01-03 18:58:52 +00:00
|
|
|
if(openInTextMate) {
|
2009-01-10 12:57:13 +00:00
|
|
|
fname = "/tmp/" ++ Date.seed ++ ".sc";
|
2009-01-03 18:58:52 +00:00
|
|
|
File.use(fname, "w") { |f|
|
|
|
|
f << out.collection.asString;
|
2009-01-03 19:06:19 +00:00
|
|
|
("mate" + fname).unixCmd(postOutput: false);
|
2009-01-03 18:58:52 +00:00
|
|
|
};
|
|
|
|
} {
|
|
|
|
out.collection.newTextWindow(name.asString);
|
|
|
|
};
|
2008-12-21 23:08:08 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
// adapted from Kernel.sc
|
2009-01-03 18:58:52 +00:00
|
|
|
*methodReferences { |name, openInTextMate|
|
2009-01-10 12:57:13 +00:00
|
|
|
var out, references, fname;
|
2008-12-21 23:08:08 +00:00
|
|
|
name = name.asSymbol;
|
|
|
|
out = CollStream.new;
|
|
|
|
references = Class.findAllReferences(name);
|
|
|
|
|
|
|
|
if (references.notNil, {
|
|
|
|
out << "References to '" << name << "' :\n";
|
|
|
|
references.do({ arg ref; out << " " << ref.asString << "\n"; });
|
2009-01-03 18:58:52 +00:00
|
|
|
|
|
|
|
if(openInTextMate) {
|
2009-01-10 12:57:13 +00:00
|
|
|
fname = "/tmp/" ++ Date.seed ++ ".sc";
|
2009-01-03 18:58:52 +00:00
|
|
|
File.use(fname, "w") { |f|
|
|
|
|
f << out.collection.asString;
|
2009-01-03 19:06:19 +00:00
|
|
|
("mate" + fname).unixCmd(postOutput: false);
|
2009-01-03 18:58:52 +00:00
|
|
|
};
|
|
|
|
} {
|
|
|
|
out.collection.newTextWindow(name.asString);
|
|
|
|
};
|
2008-12-21 23:08:08 +00:00
|
|
|
},{
|
|
|
|
Post << "\nNo references to '" << name << "'.\n";
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|