codeq.makeEditor = function (elt, options, onEscape) { var statusBar = $(elt).siblings(".block-statusbar")[0], updateStatusBar = function (pos) { statusBar.innerHTML = 'line ' + (pos.line+1) + ', column ' + (pos.ch+1); }, allOptions = $.extend({ cursorHeight: 0.85, lineNumbers: true, matchBrackets: true, extraKeys: { // allow a custom function to escape the editor (there is no blur) 'Esc': onEscape || CodeMirror.Pass, // replace tabs with spaces 'Tab': function (cm) { var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); cm.replaceSelection(spaces); }, // decrease indent if on first non-whitespace character in line 'Backspace': function (cm) { var doc = cm.getDoc(), cursor = doc.getCursor(), line = doc.getLine(cursor.line), col = cursor.ch; if (col > 0 && !/\S/.test(line.substring(0, col)) && (col === line.length || /\S/.test(line[col]))) { // cursor on the first non-whitespace character in line cm.execCommand('indentLess'); } else { cm.execCommand('delCharBefore'); } }, 'Shift-Tab': 'indentLess', } }, options), editor = CodeMirror(elt, allOptions); updateStatusBar({line: 0, ch: 0}); editor.on('cursorActivity', function (instance) { var pos = instance.getDoc().getCursor(); updateStatusBar(pos); }); return editor; };