summaryrefslogtreecommitdiff
path: root/js/codeq/editor.js
blob: 2f8476c582852d29e4867ad26e53547f9c4ee99d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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;
};