/*
Blank Newlines Macro for Komodo
This macro automatically removes blank new lines when you press enter,
while keeping the indentation level the same.
Copied original structure from http://code.activestate.com/recipes/577790/
Installation:
* Find the toolbox
* Right-click and choose "Add" > "New Macro"
* Give it a name, keep Javascript selected
* Paste this entire file into the text box
* Go to Triggers and set it to trigger on startup
* Execute the macro so you can use it without restarting Komodo
*/
if (typeof(window.extensions) == 'undefined') {
window.extensions = {};
}
if (extensions.blanknewlines && extensions.blanknewlines.onkeypress_handler) {
// Remove the existing trigger handler, we'll re-instate it.
var editor_pane = ko.views.manager.topView;
editor_pane.removeEventListener('keypress', extensions.blanknewlines.onkeypress_handler, true);
}
extensions.blanknewlines = {};
(function() {
var log = ko.logging.getLogger("blanknewlines");
log.setLevel(ko.logging.LOG_DEBUG);
var charCodeEnter = 13;
this.onkeypress_handler = function(e) {
try {
// Abort if it wasn't the Enter key.
if (e.which != charCodeEnter && e.keyCode != charCodeEnter) {
return;
}
// Only trap keypresses that originated in the editor.
if (e.getPreventDefault()) {
// Somebody else already tried to cancel this event.
return;
}
// Create shorthands for 'currentView'
var view = ko.views.manager.currentView;
if (e.originalTarget.localName != "scintilla" &&
e.originalTarget != view.scintilla._embed) {
// The event belongs to something else.
return;
}
if (view.scintilla.key_handler) {
// There is a specialized key handler registered, don't do
// anything, as Komodo's likely in interactive search mode.
return;
}
/**
* @type {Components.interfaces.ISciMoz}
*/
var editor = view.scimoz;
// Abort if there is a selection.
if (editor.selText.length) {
return;
}
// Get the current line number.
var lineNumber = editor.lineFromPosition(editor.currentPos);
// Abort if cursor is not at the end of the line.
if (editor.currentPos != editor.getLineEndPosition(lineNumber)) {
return;
}
// Get the current line's text.
var lineBuffer = new Object();
editor.getLine(lineNumber, lineBuffer);
var lineText = String(lineBuffer.value);
// Abort if the line is not just whitespace.
if (!lineText.match(/^\s+\r?\n?$/)) {
return;
}
if (lineText.length <= 1) {
// The user has pressed the enter key on a blank line with
// no whitespace at all.
// I don't like how Komodo will auto-indent in this case.
// If you do like it, then uncomment the next line.
// return;
// Insert a simple new line, avoiding the auto-indent.
editor.newLine();
} else {
// The user has pressed the enter key on a line that
// contains only whitespace.
// Insert an empty new line before the current line. This will
// make a new blank line appear, and push the the existing
// indented line downwards.
editor.home();
editor.newLine();
editor.lineEnd();
}
e.preventDefault();
e.stopPropagation();
} catch(ex) {
log.exception(ex);
}
}
// Hook up the keypress event listener.
var editor_pane = ko.views.manager.topView;
editor_pane.addEventListener('keypress', this.onkeypress_handler, true);
}).apply(extensions.blanknewlines);