Skip to content

Instantly share code, notes, and snippets.

@tenbits
Created February 17, 2013 10:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tenbits/4970919 to your computer and use it in GitHub Desktop.
Save tenbits/4970919 to your computer and use it in GitHub Desktop.
komodo inline eval macro
var view = ko.views.manager.currentView,
scimoz = view.scimoz,
selection = scimoz.selText,
result = null,
log = function() {
var message = '';
for (var i = 0; i < arguments.length; i++) {
message += arguments[i] + ' ';
}
ko.run.runEncodedCommand(window, 'echo ' + message);
};
if (!selection) {
var lineStart = scimoz.currentPos < 40 ? 0 : scimoz.currentPos - 40,
lineEnd = scimoz.currentPos,
line = scimoz.getTextRange(lineStart, lineEnd);
if (!line) {
log('Nothing to evaluate');
return;
}
var helper = {
definePos: function(output, start, end, replaceLength, pos) {
output.targetStart = lineStart + start;
output.targetEnd = lineStart + end;
output.position = lineStart + start + replaceLength + pos;
},
format: function() {
var args = Array.prototype.slice.call(arguments),
line = args.shift();
for (var i = 0; i < args.length; i++) {
line = line.split('%' + (i + 1)).join(args[i]);
}
return line;
}
}
var snippets = [{ /** (arg?,arg?) -> function(arg,arg){} */
regexp: /(\([\w,\$_ ]*)$/g,
eval: function(line, output) {
var start = line.lastIndexOf('('),
end = line.length,
args = line.substring(start + 1, end).replace(' ', '').split(',').join(', ');
output.result = helper.format('function(%1){}', args);
helper.definePos(output, start, end + 1, output.result.length, -1);
}
}, { /** obj!.value -> (obj.value || (obj.value = ?)) */
regexp: /([\w]+!\.[\w]+)$/g,
eval: function(line, output) {
var match = /([\w]+)!\.(\w+)$/.exec(line),
obj = match[1],
key = match[2];
output.result = helper.format(';(%1.%2 || (%1.%2 = ))', obj, key);
helper.definePos(output, match.index, line.length, output.result.length, -2);
}
}, {
regexp: /([\w$_]+\??\.)*([\w$_]+\??)(=)*$/,
eval: function(line, output) {
var match = this.regexp.exec(line),
regexp = /[\w]+\??\.?/g,
type = match[3],
// setter('=') || getter('')
r = '',
chain = '',
parts = (type ? match[0].substring(0, match[0].length - type.length) : match[0]).split('.');
for (var i = 0, x, length = parts.length; x = parts[i], i < length; i++) {
var safe = x[x.length - 1] == '?';
if (safe) x = x.replace('?', '');
chain += (chain.length ? '.' : '') + x;
var seperator = r.length ? '.' : '';
r += seperator + x + (safe ? ' && ' + chain : '');
if (i == length - 1) {
if (type == '=') {
var index = r.lastIndexOf(' ');
if (~index) {
r = r.substring(0, ++index) + '(' + r.substring(index);
}
r += ' = )';
}
r += ';';
}
}
output.result = r;
helper.definePos(output, match.index, line.length, r.length, type == '=' ? -2 : -1);
}
}];
for (var i = 0; i < snippets.length; i++) {
var snippet = snippets[i];
if (snippet.regexp.test(line) == false) continue;
var output = {};
snippet.eval(line, output);
scimoz.targetStart = output.targetStart;
scimoz.targetEnd = output.targetEnd;
scimoz.replaceTarget(output.result.length, output.result);
scimoz.gotoPos(output.position);
return;
}
log("Nothing selected");
return;
}
try {
result = eval(selection);
} catch (e) {
log('Error:: ' + e);
return;
}
scimoz.beginUndoAction();
scimoz.replaceSel(result);
scimoz.endUndoAction();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment