All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ber-security.graylog.graylog-plugin-alert-wizard.5.2.1.source-code.c1ef58663e7326fe623bed35be305efd.js.map Maven / Gradle / Ivy

The newest version!
{"version":3,"sources":["webpack://AlertWizard/c1ef58663e7326fe623bed35be305efd.js"],"sourcesContent":["ace.define(\"ace/ext/hardwrap\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/editor\",\"ace/config\"], function(require, exports, module){\"use strict\";\nvar Range = require(\"../range\").Range;\nfunction hardWrap(editor, options) {\n    var max = options.column || editor.getOption(\"printMarginColumn\");\n    var allowMerge = options.allowMerge != false;\n    var row = Math.min(options.startRow, options.endRow);\n    var endRow = Math.max(options.startRow, options.endRow);\n    var session = editor.session;\n    while (row <= endRow) {\n        var line = session.getLine(row);\n        if (line.length > max) {\n            var space = findSpace(line, max, 5);\n            if (space) {\n                var indentation = /^\\s*/.exec(line)[0];\n                session.replace(new Range(row, space.start, row, space.end), \"\\n\" + indentation);\n            }\n            endRow++;\n        }\n        else if (allowMerge && /\\S/.test(line) && row != endRow) {\n            var nextLine = session.getLine(row + 1);\n            if (nextLine && /\\S/.test(nextLine)) {\n                var trimmedLine = line.replace(/\\s+$/, \"\");\n                var trimmedNextLine = nextLine.replace(/^\\s+/, \"\");\n                var mergedLine = trimmedLine + \" \" + trimmedNextLine;\n                var space = findSpace(mergedLine, max, 5);\n                if (space && space.start > trimmedLine.length || mergedLine.length < max) {\n                    var replaceRange = new Range(row, trimmedLine.length, row + 1, nextLine.length - trimmedNextLine.length);\n                    session.replace(replaceRange, \" \");\n                    row--;\n                    endRow--;\n                }\n                else if (trimmedLine.length < line.length) {\n                    session.remove(new Range(row, trimmedLine.length, row, line.length));\n                }\n            }\n        }\n        row++;\n    }\n    function findSpace(line, max, min) {\n        if (line.length < max)\n            return;\n        var before = line.slice(0, max);\n        var after = line.slice(max);\n        var spaceAfter = /^(?:(\\s+)|(\\S+)(\\s+))/.exec(after);\n        var spaceBefore = /(?:(\\s+)|(\\s+)(\\S+))$/.exec(before);\n        var start = 0;\n        var end = 0;\n        if (spaceBefore && !spaceBefore[2]) {\n            start = max - spaceBefore[1].length;\n            end = max;\n        }\n        if (spaceAfter && !spaceAfter[2]) {\n            if (!start)\n                start = max;\n            end = max + spaceAfter[1].length;\n        }\n        if (start) {\n            return {\n                start: start,\n                end: end\n            };\n        }\n        if (spaceBefore && spaceBefore[2] && spaceBefore.index > min) {\n            return {\n                start: spaceBefore.index,\n                end: spaceBefore.index + spaceBefore[2].length\n            };\n        }\n        if (spaceAfter && spaceAfter[2]) {\n            start = max + spaceAfter[2].length;\n            return {\n                start: start,\n                end: start + spaceAfter[3].length\n            };\n        }\n    }\n}\nfunction wrapAfterInput(e) {\n    if (e.command.name == \"insertstring\" && /\\S/.test(e.args)) {\n        var editor = e.editor;\n        var cursor = editor.selection.cursor;\n        if (cursor.column <= editor.renderer.$printMarginColumn)\n            return;\n        var lastDelta = editor.session.$undoManager.$lastDelta;\n        hardWrap(editor, {\n            startRow: cursor.row, endRow: cursor.row,\n            allowMerge: false\n        });\n        if (lastDelta != editor.session.$undoManager.$lastDelta)\n            editor.session.markUndoGroup();\n    }\n}\nvar Editor = require(\"../editor\").Editor;\nrequire(\"../config\").defineOptions(Editor.prototype, \"editor\", {\n    hardWrap: {\n        set: function (val) {\n            if (val) {\n                this.commands.on(\"afterExec\", wrapAfterInput);\n            }\n            else {\n                this.commands.off(\"afterExec\", wrapAfterInput);\n            }\n        },\n        value: false\n    }\n});\nexports.hardWrap = hardWrap;\n\n});\n\nace.define(\"ace/keyboard/vim\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/keys\",\"ace/lib/event\",\"ace/search\",\"ace/lib/useragent\",\"ace/search_highlight\",\"ace/commands/multi_select_commands\",\"ace/mode/text\",\"ace/ext/hardwrap\",\"ace/multi_select\"], function(require, exports, module){// CodeMirror, copyright (c) by Marijn Haverbeke and others\n'use strict';\nfunction log() {\n    var d = \"\";\n    function format(p) {\n        if (typeof p != \"object\")\n            return p + \"\";\n        if (\"line\" in p) {\n            return p.line + \":\" + p.ch;\n        }\n        if (\"anchor\" in p) {\n            return format(p.anchor) + \"->\" + format(p.head);\n        }\n        if (Array.isArray(p))\n            return \"[\" + p.map(function (x) {\n                return format(x);\n            }) + \"]\";\n        return JSON.stringify(p);\n    }\n    for (var i = 0; i < arguments.length; i++) {\n        var p = arguments[i];\n        var f = format(p);\n        d += f + \"  \";\n    }\n    console.log(d);\n}\nvar Range = require(\"../range\").Range;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar domLib = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar KEYS = require(\"../lib/keys\");\nvar event = require(\"../lib/event\");\nvar Search = require(\"../search\").Search;\nvar useragent = require(\"../lib/useragent\");\nvar SearchHighlight = require(\"../search_highlight\").SearchHighlight;\nvar multiSelectCommands = require(\"../commands/multi_select_commands\");\nvar TextModeTokenRe = require(\"../mode/text\").Mode.prototype.tokenRe;\nvar hardWrap = require(\"../ext/hardwrap\").hardWrap;\nrequire(\"../multi_select\");\nvar CodeMirror = function (ace) {\n    this.ace = ace;\n    this.state = {};\n    this.marks = {};\n    this.options = {};\n    this.$uid = 0;\n    this.onChange = this.onChange.bind(this);\n    this.onSelectionChange = this.onSelectionChange.bind(this);\n    this.onBeforeEndOperation = this.onBeforeEndOperation.bind(this);\n    this.ace.on('change', this.onChange);\n    this.ace.on('changeSelection', this.onSelectionChange);\n    this.ace.on('beforeEndOperation', this.onBeforeEndOperation);\n};\nCodeMirror.Pos = function (line, ch) {\n    if (!(this instanceof Pos))\n        return new Pos(line, ch);\n    this.line = line;\n    this.ch = ch;\n};\nCodeMirror.defineOption = function (name, val, setter) { };\nCodeMirror.commands = {\n    redo: function (cm) { cm.ace.redo(); },\n    undo: function (cm) { cm.ace.undo(); },\n    newlineAndIndent: function (cm) { cm.ace.insert(\"\\n\"); },\n    goLineLeft: function (cm) { cm.ace.selection.moveCursorLineStart(); },\n    goLineRight: function (cm) { cm.ace.selection.moveCursorLineEnd(); }\n};\nCodeMirror.keyMap = {};\nCodeMirror.addClass = CodeMirror.rmClass = function () { };\nCodeMirror.e_stop = CodeMirror.e_preventDefault = event.stopEvent;\nCodeMirror.keyName = function (e) {\n    var key = (KEYS[e.keyCode] || e.key || \"\");\n    if (key.length == 1)\n        key = key.toUpperCase();\n    key = event.getModifierString(e).replace(/(^|-)\\w/g, function (m) {\n        return m.toUpperCase();\n    }) + key;\n    return key;\n};\nCodeMirror.keyMap['default'] = function (key) {\n    return function (cm) {\n        var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()];\n        return cmd && cm.ace.execCommand(cmd) !== false;\n    };\n};\nCodeMirror.lookupKey = function lookupKey(key, map, handle) {\n    if (!map)\n        map = \"default\";\n    if (typeof map == \"string\")\n        map = CodeMirror.keyMap[map];\n    var found = typeof map == \"function\" ? map(key) : map[key];\n    if (found === false)\n        return \"nothing\";\n    if (found === \"...\")\n        return \"multi\";\n    if (found != null && handle(found))\n        return \"handled\";\n    if (map.fallthrough) {\n        if (!Array.isArray(map.fallthrough))\n            return lookupKey(key, map.fallthrough, handle);\n        for (var i = 0; i < map.fallthrough.length; i++) {\n            var result = lookupKey(key, map.fallthrough[i], handle);\n            if (result)\n                return result;\n        }\n    }\n};\nCodeMirror.findMatchingTag = function (cm, head) {\n    return cm.findMatchingTag(head);\n};\nCodeMirror.findEnclosingTag = function (cm, head) {\n};\nCodeMirror.signal = function (o, name, e) { return o._signal(name, e); };\nCodeMirror.on = event.addListener;\nCodeMirror.off = event.removeListener;\nCodeMirror.isWordChar = function (ch) {\n    if (ch < \"\\x7f\")\n        return /^\\w$/.test(ch);\n    TextModeTokenRe.lastIndex = 0;\n    return TextModeTokenRe.test(ch);\n};\n(function () {\n    oop.implement(CodeMirror.prototype, EventEmitter);\n    this.destroy = function () {\n        this.ace.off('change', this.onChange);\n        this.ace.off('changeSelection', this.onSelectionChange);\n        this.ace.off('beforeEndOperation', this.onBeforeEndOperation);\n        this.removeOverlay();\n    };\n    this.virtualSelectionMode = function () {\n        return this.ace.inVirtualSelectionMode && this.ace.selection.index;\n    };\n    this.onChange = function (delta) {\n        var change = { text: delta.action[0] == 'i' ? delta.lines : [] };\n        var curOp = this.curOp = this.curOp || {};\n        if (!curOp.changeHandlers)\n            curOp.changeHandlers = this._eventRegistry[\"change\"] && this._eventRegistry[\"change\"].slice();\n        if (!curOp.lastChange) {\n            curOp.lastChange = curOp.change = change;\n        }\n        else {\n            curOp.lastChange.next = curOp.lastChange = change;\n        }\n        this.$updateMarkers(delta);\n    };\n    this.onSelectionChange = function () {\n        var curOp = this.curOp = this.curOp || {};\n        if (!curOp.cursorActivityHandlers)\n            curOp.cursorActivityHandlers = this._eventRegistry[\"cursorActivity\"] && this._eventRegistry[\"cursorActivity\"].slice();\n        this.curOp.cursorActivity = true;\n        if (this.ace.inMultiSelectMode) {\n            this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler);\n        }\n    };\n    this.operation = function (fn, force) {\n        if (!force && this.curOp || force && this.curOp && this.curOp.force) {\n            return fn();\n        }\n        if (force || !this.ace.curOp) {\n            if (this.curOp)\n                this.onBeforeEndOperation();\n        }\n        if (!this.ace.curOp) {\n            var prevOp = this.ace.prevOp;\n            this.ace.startOperation({\n                command: { name: \"vim\", scrollIntoView: \"cursor\" }\n            });\n        }\n        var curOp = this.curOp = this.curOp || {};\n        this.curOp.force = force;\n        var result = fn();\n        if (this.ace.curOp && this.ace.curOp.command.name == \"vim\") {\n            if (this.state.dialog)\n                this.ace.curOp.command.scrollIntoView = this.ace.curOp.vimDialogScroll;\n            this.ace.endOperation();\n            if (!curOp.cursorActivity && !curOp.lastChange && prevOp)\n                this.ace.prevOp = prevOp;\n        }\n        if (force || !this.ace.curOp) {\n            if (this.curOp)\n                this.onBeforeEndOperation();\n        }\n        return result;\n    };\n    this.onBeforeEndOperation = function () {\n        var op = this.curOp;\n        if (op) {\n            if (op.change) {\n                this.signal(\"change\", op.change, op);\n            }\n            if (op && op.cursorActivity) {\n                this.signal(\"cursorActivity\", null, op);\n            }\n            this.curOp = null;\n        }\n    };\n    this.signal = function (eventName, e, handlers) {\n        var listeners = handlers ? handlers[eventName + \"Handlers\"]\n            : (this._eventRegistry || {})[eventName];\n        if (!listeners)\n            return;\n        listeners = listeners.slice();\n        for (var i = 0; i < listeners.length; i++)\n            listeners[i](this, e);\n    };\n    this.firstLine = function () { return 0; };\n    this.lastLine = function () { return this.ace.session.getLength() - 1; };\n    this.lineCount = function () { return this.ace.session.getLength(); };\n    this.setCursor = function (line, ch) {\n        if (typeof line === 'object') {\n            ch = line.ch;\n            line = line.line;\n        }\n        var shouldScroll = !this.curOp && !this.ace.inVirtualSelectionMode;\n        if (!this.ace.inVirtualSelectionMode)\n            this.ace.exitMultiSelectMode();\n        this.ace.session.unfold({ row: line, column: ch });\n        this.ace.selection.moveTo(line, ch);\n        if (shouldScroll) {\n            this.ace.renderer.scrollCursorIntoView();\n            this.ace.endOperation();\n        }\n    };\n    this.getCursor = function (p) {\n        var sel = this.ace.selection;\n        var pos = p == 'anchor' ? (sel.isEmpty() ? sel.lead : sel.anchor) :\n            p == 'head' || !p ? sel.lead : sel.getRange()[p];\n        return toCmPos(pos);\n    };\n    this.listSelections = function (p) {\n        var ranges = this.ace.multiSelect.rangeList.ranges;\n        if (!ranges.length || this.ace.inVirtualSelectionMode)\n            return [{ anchor: this.getCursor('anchor'), head: this.getCursor('head') }];\n        return ranges.map(function (r) {\n            return {\n                anchor: this.clipPos(toCmPos(r.cursor == r.end ? r.start : r.end)),\n                head: this.clipPos(toCmPos(r.cursor))\n            };\n        }, this);\n    };\n    this.setSelections = function (p, primIndex) {\n        var sel = this.ace.multiSelect;\n        var ranges = p.map(function (x) {\n            var anchor = toAcePos(x.anchor);\n            var head = toAcePos(x.head);\n            var r = Range.comparePoints(anchor, head) < 0\n                ? new Range.fromPoints(anchor, head)\n                : new Range.fromPoints(head, anchor);\n            r.cursor = Range.comparePoints(r.start, head) ? r.end : r.start;\n            return r;\n        });\n        if (this.ace.inVirtualSelectionMode) {\n            this.ace.selection.fromOrientedRange(ranges[0]);\n            return;\n        }\n        if (!primIndex) {\n            ranges = ranges.reverse();\n        }\n        else if (ranges[primIndex]) {\n            ranges.push(ranges.splice(primIndex, 1)[0]);\n        }\n        sel.toSingleRange(ranges[0].clone());\n        var session = this.ace.session;\n        for (var i = 0; i < ranges.length; i++) {\n            var range = session.$clipRangeToDocument(ranges[i]); // todo why ace doesn't do this?\n            sel.addRange(range);\n        }\n    };\n    this.setSelection = function (a, h, options) {\n        var sel = this.ace.selection;\n        sel.moveTo(a.line, a.ch);\n        sel.selectTo(h.line, h.ch);\n        if (options && options.origin == '*mouse') {\n            this.onBeforeEndOperation();\n        }\n    };\n    this.somethingSelected = function (p) {\n        return !this.ace.selection.isEmpty();\n    };\n    this.clipPos = function (p) {\n        var pos = this.ace.session.$clipPositionToDocument(p.line, p.ch);\n        return toCmPos(pos);\n    };\n    this.foldCode = function (pos) {\n        this.ace.session.$toggleFoldWidget(pos.line, {});\n    };\n    this.markText = function (cursor) {\n        return { clear: function () { }, find: function () { } };\n    };\n    this.$updateMarkers = function (delta) {\n        var isInsert = delta.action == \"insert\";\n        var start = delta.start;\n        var end = delta.end;\n        var rowShift = (end.row - start.row) * (isInsert ? 1 : -1);\n        var colShift = (end.column - start.column) * (isInsert ? 1 : -1);\n        if (isInsert)\n            end = start;\n        for (var i in this.marks) {\n            var point = this.marks[i];\n            var cmp = Range.comparePoints(point, start);\n            if (cmp < 0) {\n                continue; // delta starts after the range\n            }\n            if (cmp === 0) {\n                if (isInsert) {\n                    if (point.bias == 1) {\n                        cmp = 1;\n                    }\n                    else {\n                        point.bias = -1;\n                        continue;\n                    }\n                }\n            }\n            var cmp2 = isInsert ? cmp : Range.comparePoints(point, end);\n            if (cmp2 > 0) {\n                point.row += rowShift;\n                point.column += point.row == end.row ? colShift : 0;\n                continue;\n            }\n            if (!isInsert && cmp2 <= 0) {\n                point.row = start.row;\n                point.column = start.column;\n                if (cmp2 === 0)\n                    point.bias = 1;\n            }\n        }\n    };\n    var Marker = function (cm, id, row, column) {\n        this.cm = cm;\n        this.id = id;\n        this.row = row;\n        this.column = column;\n        cm.marks[this.id] = this;\n    };\n    Marker.prototype.clear = function () { delete this.cm.marks[this.id]; };\n    Marker.prototype.find = function () { return toCmPos(this); };\n    this.setBookmark = function (cursor, options) {\n        var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch);\n        if (!options || !options.insertLeft)\n            bm.$insertRight = true;\n        this.marks[bm.id] = bm;\n        return bm;\n    };\n    this.moveH = function (increment, unit) {\n        if (unit == 'char') {\n            var sel = this.ace.selection;\n            sel.clearSelection();\n            sel.moveCursorBy(0, increment);\n        }\n    };\n    this.findPosV = function (start, amount, unit, goalColumn) {\n        if (unit == 'page') {\n            var renderer = this.ace.renderer;\n            var config = renderer.layerConfig;\n            amount = amount * Math.floor(config.height / config.lineHeight);\n            unit = 'line';\n        }\n        if (unit == 'line') {\n            var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch);\n            if (goalColumn != null)\n                screenPos.column = goalColumn;\n            screenPos.row += amount;\n            screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1);\n            var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column);\n            return toCmPos(pos);\n        }\n        else {\n            debugger;\n        }\n    };\n    this.charCoords = function (pos, mode) {\n        if (mode == 'div' || !mode) {\n            var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch);\n            return { left: sc.column, top: sc.row };\n        }\n        if (mode == 'local') {\n            var renderer = this.ace.renderer;\n            var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch);\n            var lh = renderer.layerConfig.lineHeight;\n            var cw = renderer.layerConfig.characterWidth;\n            var top = lh * sc.row;\n            return { left: sc.column * cw, top: top, bottom: top + lh };\n        }\n    };\n    this.coordsChar = function (pos, mode) {\n        var renderer = this.ace.renderer;\n        if (mode == 'local') {\n            var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight));\n            var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth));\n            var ch = renderer.session.screenToDocumentPosition(row, col);\n            return toCmPos(ch);\n        }\n        else if (mode == 'div') {\n            throw \"not implemented\";\n        }\n    };\n    this.getSearchCursor = function (query, pos, caseFold) {\n        var caseSensitive = false;\n        var isRegexp = false;\n        if (query instanceof RegExp && !query.global) {\n            caseSensitive = !query.ignoreCase;\n            query = query.source;\n            isRegexp = true;\n        }\n        if (query == \"\\\\n\") {\n            query = \"\\n\";\n            isRegexp = false;\n        }\n        var search = new Search();\n        if (pos.ch == undefined)\n            pos.ch = Number.MAX_VALUE;\n        var acePos = { row: pos.line, column: pos.ch };\n        var cm = this;\n        var last = null;\n        return {\n            findNext: function () { return this.find(false); },\n            findPrevious: function () { return this.find(true); },\n            find: function (back) {\n                search.setOptions({\n                    needle: query,\n                    caseSensitive: caseSensitive,\n                    wrap: false,\n                    backwards: back,\n                    regExp: isRegexp,\n                    start: last || acePos\n                });\n                var range = search.find(cm.ace.session);\n                last = range;\n                return last && [!last.isEmpty()];\n            },\n            from: function () { return last && toCmPos(last.start); },\n            to: function () { return last && toCmPos(last.end); },\n            replace: function (text) {\n                if (last) {\n                    last.end = cm.ace.session.doc.replace(last, text);\n                }\n            }\n        };\n    };\n    this.scrollTo = function (x, y) {\n        var renderer = this.ace.renderer;\n        var config = renderer.layerConfig;\n        var maxHeight = config.maxHeight;\n        maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd;\n        if (y != null)\n            this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight)));\n        if (x != null)\n            this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width)));\n    };\n    this.scrollInfo = function () { return 0; };\n    this.scrollIntoView = function (pos, margin) {\n        if (pos) {\n            var renderer = this.ace.renderer;\n            var viewMargin = { \"top\": 0, \"bottom\": margin };\n            renderer.scrollCursorIntoView(toAcePos(pos), (renderer.lineHeight * 2) / renderer.$size.scrollerHeight, viewMargin);\n        }\n    };\n    this.getLine = function (row) { return this.ace.session.getLine(row); };\n    this.getRange = function (s, e) {\n        return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch));\n    };\n    this.replaceRange = function (text, s, e) {\n        if (!e)\n            e = s;\n        var range = new Range(s.line, s.ch, e.line, e.ch);\n        this.ace.session.$clipRangeToDocument(range);\n        return this.ace.session.replace(range, text);\n    };\n    this.replaceSelection =\n        this.replaceSelections = function (p) {\n            var sel = this.ace.selection;\n            if (this.ace.inVirtualSelectionMode) {\n                this.ace.session.replace(sel.getRange(), p[0] || \"\");\n                return;\n            }\n            sel.inVirtualSelectionMode = true;\n            var ranges = sel.rangeList.ranges;\n            if (!ranges.length)\n                ranges = [this.ace.multiSelect.getRange()];\n            for (var i = ranges.length; i--;)\n                this.ace.session.replace(ranges[i], p[i] || \"\");\n            sel.inVirtualSelectionMode = false;\n        };\n    this.getSelection = function () {\n        return this.ace.getSelectedText();\n    };\n    this.getSelections = function () {\n        return this.listSelections().map(function (x) {\n            return this.getRange(x.anchor, x.head);\n        }, this);\n    };\n    this.getInputField = function () {\n        return this.ace.textInput.getElement();\n    };\n    this.getWrapperElement = function () {\n        return this.ace.container;\n    };\n    var optMap = {\n        indentWithTabs: \"useSoftTabs\",\n        indentUnit: \"tabSize\",\n        tabSize: \"tabSize\",\n        firstLineNumber: \"firstLineNumber\",\n        readOnly: \"readOnly\"\n    };\n    this.setOption = function (name, val) {\n        this.state[name] = val;\n        switch (name) {\n            case 'indentWithTabs':\n                name = optMap[name];\n                val = !val;\n                break;\n            case 'keyMap':\n                this.state.$keyMap = val;\n                return;\n                break;\n            default:\n                name = optMap[name];\n        }\n        if (name)\n            this.ace.setOption(name, val);\n    };\n    this.getOption = function (name) {\n        var val;\n        var aceOpt = optMap[name];\n        if (aceOpt)\n            val = this.ace.getOption(aceOpt);\n        switch (name) {\n            case 'indentWithTabs':\n                name = optMap[name];\n                return !val;\n            case 'keyMap':\n                return this.state.$keyMap || 'vim';\n        }\n        return aceOpt ? val : this.state[name];\n    };\n    this.toggleOverwrite = function (on) {\n        this.state.overwrite = on;\n        return this.ace.setOverwrite(on);\n    };\n    this.addOverlay = function (o) {\n        if (!this.$searchHighlight || !this.$searchHighlight.session) {\n            var highlight = new SearchHighlight(null, \"ace_highlight-marker\", \"text\");\n            var marker = this.ace.session.addDynamicMarker(highlight);\n            highlight.id = marker.id;\n            highlight.session = this.ace.session;\n            highlight.destroy = function (o) {\n                highlight.session.off(\"change\", highlight.updateOnChange);\n                highlight.session.off(\"changeEditor\", highlight.destroy);\n                highlight.session.removeMarker(highlight.id);\n                highlight.session = null;\n            };\n            highlight.updateOnChange = function (delta) {\n                var row = delta.start.row;\n                if (row == delta.end.row)\n                    highlight.cache[row] = undefined;\n                else\n                    highlight.cache.splice(row, highlight.cache.length);\n            };\n            highlight.session.on(\"changeEditor\", highlight.destroy);\n            highlight.session.on(\"change\", highlight.updateOnChange);\n        }\n        var re = new RegExp(o.query.source, \"gmi\");\n        this.$searchHighlight = o.highlight = highlight;\n        this.$searchHighlight.setRegexp(re);\n        this.ace.renderer.updateBackMarkers();\n    };\n    this.removeOverlay = function (o) {\n        if (this.$searchHighlight && this.$searchHighlight.session) {\n            this.$searchHighlight.destroy();\n        }\n    };\n    this.getScrollInfo = function () {\n        var renderer = this.ace.renderer;\n        var config = renderer.layerConfig;\n        return {\n            left: renderer.scrollLeft,\n            top: renderer.scrollTop,\n            height: config.maxHeight,\n            width: config.width,\n            clientHeight: config.height,\n            clientWidth: config.width\n        };\n    };\n    this.getValue = function () {\n        return this.ace.getValue();\n    };\n    this.setValue = function (v) {\n        return this.ace.setValue(v, -1);\n    };\n    this.getTokenTypeAt = function (pos) {\n        var token = this.ace.session.getTokenAt(pos.line, pos.ch);\n        return token && /comment|string/.test(token.type) ? \"string\" : \"\";\n    };\n    this.findMatchingBracket = function (pos) {\n        var m = this.ace.session.findMatchingBracket(toAcePos(pos));\n        return { to: m && toCmPos(m) };\n    };\n    this.findMatchingTag = function (pos) {\n        var m = this.ace.session.getMatchingTags(toAcePos(pos));\n        if (!m)\n            return;\n        return {\n            open: {\n                from: toCmPos(m.openTag.start),\n                to: toCmPos(m.openTag.end)\n            },\n            close: {\n                from: toCmPos(m.closeTag.start),\n                to: toCmPos(m.closeTag.end)\n            }\n        };\n    };\n    this.indentLine = function (line, method) {\n        if (method === true)\n            this.ace.session.indentRows(line, line, \"\\t\");\n        else if (method === false)\n            this.ace.session.outdentRows(new Range(line, 0, line, 0));\n    };\n    this.indexFromPos = function (pos) {\n        return this.ace.session.doc.positionToIndex(toAcePos(pos));\n    };\n    this.posFromIndex = function (index) {\n        return toCmPos(this.ace.session.doc.indexToPosition(index));\n    };\n    this.focus = function (index) {\n        return this.ace.textInput.focus();\n    };\n    this.blur = function (index) {\n        return this.ace.blur();\n    };\n    this.defaultTextHeight = function (index) {\n        return this.ace.renderer.layerConfig.lineHeight;\n    };\n    this.scanForBracket = function (pos, dir, _, options) {\n        var re = options.bracketRegex.source;\n        var tokenRe = /paren|text|operator|tag/;\n        if (dir == 1) {\n            var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe);\n        }\n        else {\n            var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), { row: pos.line, column: pos.ch + 1 }, tokenRe);\n        }\n        return m && { pos: toCmPos(m) };\n    };\n    this.refresh = function () {\n        return this.ace.resize(true);\n    };\n    this.getMode = function () {\n        return { name: this.getOption(\"mode\") };\n    };\n    this.execCommand = function (name) {\n        if (CodeMirror.commands.hasOwnProperty(name))\n            return CodeMirror.commands[name](this);\n        if (name == \"indentAuto\")\n            return this.ace.execCommand(\"autoindent\");\n        console.log(name + \" is not implemented\");\n    };\n    this.getLineNumber = function (handle) {\n        return handle.row;\n    };\n    this.getLineHandle = function (row) {\n        return { text: this.ace.session.getLine(row), row: row };\n    };\n}).call(CodeMirror.prototype);\nfunction toAcePos(cmPos) {\n    return { row: cmPos.line, column: cmPos.ch };\n}\nfunction toCmPos(acePos) {\n    return new Pos(acePos.row, acePos.column);\n}\nvar StringStream = CodeMirror.StringStream = function (string, tabSize) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n};\nStringStream.prototype = {\n    eol: function () { return this.pos >= this.string.length; },\n    sol: function () { return this.pos == this.lineStart; },\n    peek: function () { return this.string.charAt(this.pos) || undefined; },\n    next: function () {\n        if (this.pos < this.string.length)\n            return this.string.charAt(this.pos++);\n    },\n    eat: function (match) {\n        var ch = this.string.charAt(this.pos);\n        if (typeof match == \"string\")\n            var ok = ch == match;\n        else\n            var ok = ch && (match.test ? match.test(ch) : match(ch));\n        if (ok) {\n            ++this.pos;\n            return ch;\n        }\n    },\n    eatWhile: function (match) {\n        var start = this.pos;\n        while (this.eat(match)) { }\n        return this.pos > start;\n    },\n    eatSpace: function () {\n        var start = this.pos;\n        while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos)))\n            ++this.pos;\n        return this.pos > start;\n    },\n    skipToEnd: function () { this.pos = this.string.length; },\n    skipTo: function (ch) {\n        var found = this.string.indexOf(ch, this.pos);\n        if (found > -1) {\n            this.pos = found;\n            return true;\n        }\n    },\n    backUp: function (n) { this.pos -= n; },\n    column: function () {\n        throw \"not implemented\";\n    },\n    indentation: function () {\n        throw \"not implemented\";\n    },\n    match: function (pattern, consume, caseInsensitive) {\n        if (typeof pattern == \"string\") {\n            var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n            var substr = this.string.substr(this.pos, pattern.length);\n            if (cased(substr) == cased(pattern)) {\n                if (consume !== false)\n                    this.pos += pattern.length;\n                return true;\n            }\n        }\n        else {\n            var match = this.string.slice(this.pos).match(pattern);\n            if (match && match.index > 0)\n                return null;\n            if (match && consume !== false)\n                this.pos += match[0].length;\n            return match;\n        }\n    },\n    current: function () { return this.string.slice(this.start, this.pos); },\n    hideFirstChars: function (n, inner) {\n        this.lineStart += n;\n        try {\n            return inner();\n        }\n        finally {\n            this.lineStart -= n;\n        }\n    }\n};\nCodeMirror.defineExtension = function (name, fn) {\n    CodeMirror.prototype[name] = fn;\n};\ndomLib.importCssString(\".normal-mode .ace_cursor{\\n    border: none;\\n    background-color: rgba(255,0,0,0.5);\\n}\\n.normal-mode .ace_hidden-cursors .ace_cursor{\\n  background-color: transparent;\\n  border: 1px solid red;\\n  opacity: 0.7\\n}\\n.ace_dialog {\\n  position: absolute;\\n  left: 0; right: 0;\\n  background: inherit;\\n  z-index: 15;\\n  padding: .1em .8em;\\n  overflow: hidden;\\n  color: inherit;\\n}\\n.ace_dialog-top {\\n  border-bottom: 1px solid #444;\\n  top: 0;\\n}\\n.ace_dialog-bottom {\\n  border-top: 1px solid #444;\\n  bottom: 0;\\n}\\n.ace_dialog input {\\n  border: none;\\n  outline: none;\\n  background: transparent;\\n  width: 20em;\\n  color: inherit;\\n  font-family: monospace;\\n}\", \"vimMode\", false);\n(function () {\n    function dialogDiv(cm, template, bottom) {\n        var wrap = cm.ace.container;\n        var dialog;\n        dialog = wrap.appendChild(document.createElement(\"div\"));\n        if (bottom)\n            dialog.className = \"ace_dialog ace_dialog-bottom\";\n        else\n            dialog.className = \"ace_dialog ace_dialog-top\";\n        if (typeof template == \"string\") {\n            dialog.innerHTML = template;\n        }\n        else { // Assuming it's a detached DOM element.\n            dialog.appendChild(template);\n        }\n        return dialog;\n    }\n    function closeNotification(cm, newVal) {\n        if (cm.state.currentNotificationClose)\n            cm.state.currentNotificationClose();\n        cm.state.currentNotificationClose = newVal;\n    }\n    CodeMirror.defineExtension(\"openDialog\", function (template, callback, options) {\n        if (this.virtualSelectionMode())\n            return;\n        if (!options)\n            options = {};\n        closeNotification(this, null);\n        var dialog = dialogDiv(this, template, options.bottom);\n        var closed = false, me = this;\n        this.state.dialog = dialog;\n        function close(newVal) {\n            if (typeof newVal == 'string') {\n                inp.value = newVal;\n            }\n            else {\n                if (closed)\n                    return;\n                if (newVal && newVal.type == \"blur\") {\n                    if (document.activeElement === inp)\n                        return;\n                }\n                if (me.state.dialog == dialog) {\n                    me.state.dialog = null;\n                    me.focus();\n                }\n                closed = true;\n                dialog.remove();\n                if (options.onClose)\n                    options.onClose(dialog);\n                var cm = me;\n                if (cm.state.vim) {\n                    cm.state.vim.status = null;\n                    cm.ace._signal(\"changeStatus\");\n                    cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR);\n                }\n            }\n        }\n        var inp = dialog.getElementsByTagName(\"input\")[0], button;\n        if (inp) {\n            if (options.value) {\n                inp.value = options.value;\n                if (options.selectValueOnOpen !== false)\n                    inp.select();\n            }\n            if (options.onInput)\n                CodeMirror.on(inp, \"input\", function (e) { options.onInput(e, inp.value, close); });\n            if (options.onKeyUp)\n                CodeMirror.on(inp, \"keyup\", function (e) { options.onKeyUp(e, inp.value, close); });\n            CodeMirror.on(inp, \"keydown\", function (e) {\n                if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) {\n                    return;\n                }\n                if (e.keyCode == 13)\n                    callback(inp.value);\n                if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {\n                    CodeMirror.e_stop(e);\n                    close();\n                }\n            });\n            if (options.closeOnBlur !== false)\n                CodeMirror.on(inp, \"blur\", close);\n            inp.focus();\n        }\n        else if (button = dialog.getElementsByTagName(\"button\")[0]) {\n            CodeMirror.on(button, \"click\", function () {\n                close();\n                me.focus();\n            });\n            if (options.closeOnBlur !== false)\n                CodeMirror.on(button, \"blur\", close);\n            button.focus();\n        }\n        return close;\n    });\n    CodeMirror.defineExtension(\"openNotification\", function (template, options) {\n        if (this.virtualSelectionMode())\n            return;\n        closeNotification(this, close);\n        var dialog = dialogDiv(this, template, options && options.bottom);\n        var closed = false, doneTimer;\n        var duration = options && typeof options.duration !== \"undefined\" ? options.duration : 5000;\n        function close() {\n            if (closed)\n                return;\n            closed = true;\n            clearTimeout(doneTimer);\n            dialog.remove();\n        }\n        CodeMirror.on(dialog, 'click', function (e) {\n            CodeMirror.e_preventDefault(e);\n            close();\n        });\n        if (duration)\n            doneTimer = setTimeout(close, duration);\n        return close;\n    });\n})();\nvar Pos = CodeMirror.Pos;\nfunction transformCursor(cm, range) {\n    var vim = cm.state.vim;\n    if (!vim || vim.insertMode)\n        return range.head;\n    var head = vim.sel.head;\n    if (!head)\n        return range.head;\n    if (vim.visualBlock) {\n        if (range.head.line != head.line) {\n            return;\n        }\n    }\n    if (range.from() == range.anchor && !range.empty()) {\n        if (range.head.line == head.line && range.head.ch != head.ch)\n            return new Pos(range.head.line, range.head.ch - 1);\n    }\n    return range.head;\n}\nfunction updateSelectionForSurrogateCharacters(cm, curStart, curEnd) {\n    if (curStart.line === curEnd.line && curStart.ch >= curEnd.ch - 1) {\n        var text = cm.getLine(curStart.line);\n        var charCode = text.charCodeAt(curStart.ch);\n        if (0xD800 <= charCode && charCode <= 0xD8FF) {\n            curEnd.ch += 1;\n        }\n    }\n    return { start: curStart, end: curEnd };\n}\nvar defaultKeymap = [\n    { keys: '', type: 'keyToKey', toKeys: 'h' },\n    { keys: '', type: 'keyToKey', toKeys: 'l' },\n    { keys: '', type: 'keyToKey', toKeys: 'k' },\n    { keys: '', type: 'keyToKey', toKeys: 'j' },\n    { keys: 'g', type: 'keyToKey', toKeys: 'gk' },\n    { keys: 'g', type: 'keyToKey', toKeys: 'gj' },\n    { keys: '', type: 'keyToKey', toKeys: 'l' },\n    { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal' },\n    { keys: '', type: 'keyToKey', toKeys: 'x', context: 'normal' },\n    { keys: '', type: 'keyToKey', toKeys: 'W' },\n    { keys: '', type: 'keyToKey', toKeys: 'B', context: 'normal' },\n    { keys: '', type: 'keyToKey', toKeys: 'w' },\n    { keys: '', type: 'keyToKey', toKeys: 'b', context: 'normal' },\n    { keys: '', type: 'keyToKey', toKeys: 'j' },\n    { keys: '', type: 'keyToKey', toKeys: 'k' },\n    { keys: '', type: 'keyToKey', toKeys: '' },\n    { keys: '', type: 'keyToKey', toKeys: '' },\n    { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' },\n    { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' },\n    { keys: '', type: 'keyToKey', toKeys: '' },\n    { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' },\n    { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' },\n    { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual' },\n    { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' },\n    { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' },\n    { keys: '', type: 'keyToKey', toKeys: '0' },\n    { keys: '', type: 'keyToKey', toKeys: '$' },\n    { keys: '', type: 'keyToKey', toKeys: '' },\n    { keys: '', type: 'keyToKey', toKeys: '' },\n    { keys: '', type: 'keyToKey', toKeys: 'j^', context: 'normal' },\n    { keys: '', type: 'keyToKey', toKeys: 'i', context: 'normal' },\n    { keys: '', type: 'action', action: 'toggleOverwrite', context: 'insert' },\n    { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true } },\n    { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true } },\n    { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true } },\n    { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false } },\n    { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true } },\n    { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true } },\n    { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true } },\n    { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true } },\n    { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false } },\n    { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false } },\n    { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true } },\n    { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true } },\n    { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true } },\n    { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false } },\n    { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true } },\n    { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true } },\n    { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true } },\n    { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true } },\n    { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true } },\n    { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false } },\n    { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true } },\n    { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true } },\n    { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false } },\n    { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true } },\n    { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true } },\n    { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true } },\n    { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true } },\n    { keys: \"g$\", type: \"motion\", motion: \"moveToEndOfDisplayLine\" },\n    { keys: \"g^\", type: \"motion\", motion: \"moveToStartOfDisplayLine\" },\n    { keys: \"g0\", type: \"motion\", motion: \"moveToStartOfDisplayLine\" },\n    { keys: '0', type: 'motion', motion: 'moveToStartOfLine' },\n    { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar: true } },\n    { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar: true } },\n    { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar: true, repeatOffset: -1 } },\n    { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true } },\n    { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true } },\n    { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true, inclusive: true } },\n    { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false } },\n    { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true } },\n    { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false } },\n    { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true } },\n    { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false } },\n    { keys: '\\'', type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true, linewise: true } },\n    { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true } },\n    { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },\n    { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },\n    { keys: ']\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },\n    { keys: '[\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },\n    { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true } },\n    { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true } },\n    { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true } },\n    { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true } },\n    { keys: '|', type: 'motion', motion: 'moveToColumn' },\n    { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context: 'visual' },\n    { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: { sameLine: true }, context: 'visual' },\n    { keys: 'd', type: 'operator', operator: 'delete' },\n    { keys: 'y', type: 'operator', operator: 'yank' },\n    { keys: 'c', type: 'operator', operator: 'change' },\n    { keys: '=', type: 'operator', operator: 'indentAuto' },\n    { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true } },\n    { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false } },\n    { keys: 'g~', type: 'operator', operator: 'changeCase' },\n    { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: true }, isEdit: true },\n    { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: false }, isEdit: true },\n    { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true } },\n    { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true } },\n    { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true } },\n    { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false } },\n    { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false } },\n    { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true } },\n    { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal' },\n    { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual' },\n    { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal' },\n    { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual' },\n    { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal' },\n    { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual' },\n    { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal' },\n    { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual' },\n    { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveToStartOfLine', context: 'insert' },\n    { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' },\n    { keys: '', type: 'idle', context: 'normal' },\n    { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true } },\n    { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false } },\n    { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true } },\n    { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true } },\n    { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' },\n    { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' },\n    { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank' }, context: 'normal' },\n    { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol' }, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' },\n    { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' },\n    { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' },\n    { keys: 'v', type: 'action', action: 'toggleVisualMode' },\n    { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true } },\n    { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } },\n    { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } },\n    { keys: 'gv', type: 'action', action: 'reselectLastSelection' },\n    { keys: 'J', type: 'action', action: 'joinLines', isEdit: true },\n    { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true },\n    { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true } },\n    { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true } },\n    { keys: 'r', type: 'action', action: 'replace', isEdit: true },\n    { keys: '@', type: 'action', action: 'replayMacro' },\n    { keys: 'q', type: 'action', action: 'enterMacroRecordMode' },\n    { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal' },\n    { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true },\n    { keys: 'u', type: 'action', action: 'undo', context: 'normal' },\n    { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: true }, context: 'visual', isEdit: true },\n    { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: false }, context: 'visual', isEdit: true },\n    { keys: '', type: 'action', action: 'redo' },\n    { keys: 'm', type: 'action', action: 'setMark' },\n    { keys: '\"', type: 'action', action: 'setRegister' },\n    { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' } },\n    { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' } },\n    { keys: 'z', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' } },\n    { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '.', type: 'action', action: 'repeatLastEdit' },\n    { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: { increase: true, backtrack: false } },\n    { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: { increase: false, backtrack: false } },\n    { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' },\n    { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' },\n    { keys: 'a', type: 'motion', motion: 'textObjectManipulation' },\n    { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true } },\n    { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true } },\n    { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true } },\n    { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true } },\n    { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true } },\n    { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true } },\n    { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true } },\n    { keys: ':', type: 'ex' }\n];\nvar defaultKeymapLength = defaultKeymap.length;\nvar defaultExCommandMap = [\n    { name: 'colorscheme', shortName: 'colo' },\n    { name: 'map' },\n    { name: 'imap', shortName: 'im' },\n    { name: 'nmap', shortName: 'nm' },\n    { name: 'vmap', shortName: 'vm' },\n    { name: 'unmap' },\n    { name: 'write', shortName: 'w' },\n    { name: 'undo', shortName: 'u' },\n    { name: 'redo', shortName: 'red' },\n    { name: 'set', shortName: 'se' },\n    { name: 'setlocal', shortName: 'setl' },\n    { name: 'setglobal', shortName: 'setg' },\n    { name: 'sort', shortName: 'sor' },\n    { name: 'substitute', shortName: 's', possiblyAsync: true },\n    { name: 'nohlsearch', shortName: 'noh' },\n    { name: 'yank', shortName: 'y' },\n    { name: 'delmarks', shortName: 'delm' },\n    { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },\n    { name: 'vglobal', shortName: 'v' },\n    { name: 'global', shortName: 'g' }\n];\nfunction enterVimMode(cm) {\n    cm.setOption('disableInput', true);\n    cm.setOption('showCursorWhenSelecting', false);\n    CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"normal\" });\n    cm.on('cursorActivity', onCursorActivity);\n    maybeInitVimState(cm);\n    CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));\n}\nfunction leaveVimMode(cm) {\n    cm.setOption('disableInput', false);\n    cm.off('cursorActivity', onCursorActivity);\n    CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));\n    cm.state.vim = null;\n    if (highlightTimeout)\n        clearTimeout(highlightTimeout);\n}\nfunction detachVimMap(cm, next) {\n    if (this == CodeMirror.keyMap.vim) {\n        cm.options.$customCursor = null;\n        CodeMirror.rmClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n    }\n    if (!next || next.attach != attachVimMap)\n        leaveVimMode(cm);\n}\nfunction attachVimMap(cm, prev) {\n    if (this == CodeMirror.keyMap.vim) {\n        if (cm.curOp)\n            cm.curOp.selectionChanged = true;\n        cm.options.$customCursor = transformCursor;\n        CodeMirror.addClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n    }\n    if (!prev || prev.attach != attachVimMap)\n        enterVimMode(cm);\n}\nCodeMirror.defineOption('vimMode', false, function (cm, val, prev) {\n    if (val && cm.getOption(\"keyMap\") != \"vim\")\n        cm.setOption(\"keyMap\", \"vim\");\n    else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption(\"keyMap\")))\n        cm.setOption(\"keyMap\", \"default\");\n});\nfunction cmKey(key, cm) {\n    if (!cm) {\n        return undefined;\n    }\n    if (this[key]) {\n        return this[key];\n    }\n    var vimKey = cmKeyToVimKey(key);\n    if (!vimKey) {\n        return false;\n    }\n    var cmd = vimApi.findKey(cm, vimKey);\n    if (typeof cmd == 'function') {\n        CodeMirror.signal(cm, 'vim-keypress', vimKey);\n    }\n    return cmd;\n}\nvar modifiers = { Shift: 'S', Ctrl: 'C', Alt: 'A', Cmd: 'D', Mod: 'A', CapsLock: '' };\nvar specialKeys = { Enter: 'CR', Backspace: 'BS', Delete: 'Del', Insert: 'Ins' };\nfunction cmKeyToVimKey(key) {\n    if (key.charAt(0) == '\\'') {\n        return key.charAt(1);\n    }\n    var pieces = key.split(/-(?!$)/);\n    var lastPiece = pieces[pieces.length - 1];\n    if (pieces.length == 1 && pieces[0].length == 1) {\n        return false;\n    }\n    else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) {\n        return false;\n    }\n    var hasCharacter = false;\n    for (var i = 0; i < pieces.length; i++) {\n        var piece = pieces[i];\n        if (piece in modifiers) {\n            pieces[i] = modifiers[piece];\n        }\n        else {\n            hasCharacter = true;\n        }\n        if (piece in specialKeys) {\n            pieces[i] = specialKeys[piece];\n        }\n    }\n    if (!hasCharacter) {\n        return false;\n    }\n    if (isUpperCase(lastPiece)) {\n        pieces[pieces.length - 1] = lastPiece.toLowerCase();\n    }\n    return '<' + pieces.join('-') + '>';\n}\nfunction getOnPasteFn(cm) {\n    var vim = cm.state.vim;\n    if (!vim.onPasteFn) {\n        vim.onPasteFn = function () {\n            if (!vim.insertMode) {\n                cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n                actions.enterInsertMode(cm, {}, vim);\n            }\n        };\n    }\n    return vim.onPasteFn;\n}\nvar numberRegex = /[\\d]/;\nvar wordCharTest = [CodeMirror.isWordChar, function (ch) {\n        return ch && !CodeMirror.isWordChar(ch) && !/\\s/.test(ch);\n    }], bigWordCharTest = [function (ch) {\n        return /\\S/.test(ch);\n    }];\nfunction makeKeyRange(start, size) {\n    var keys = [];\n    for (var i = start; i < start + size; i++) {\n        keys.push(String.fromCharCode(i));\n    }\n    return keys;\n}\nvar upperCaseAlphabet = makeKeyRange(65, 26);\nvar lowerCaseAlphabet = makeKeyRange(97, 26);\nvar numbers = makeKeyRange(48, 10);\nvar validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);\nvar validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '\"', '.', ':', '_', '/', '+']);\nvar upperCaseChars;\ntry {\n    upperCaseChars = new RegExp(\"^[\\\\p{Lu}]$\", \"u\");\n}\ncatch (_) {\n    upperCaseChars = /^[A-Z]$/;\n}\nfunction isLine(cm, line) {\n    return line >= cm.firstLine() && line <= cm.lastLine();\n}\nfunction isLowerCase(k) {\n    return (/^[a-z]$/).test(k);\n}\nfunction isMatchableSymbol(k) {\n    return '()[]{}'.indexOf(k) != -1;\n}\nfunction isNumber(k) {\n    return numberRegex.test(k);\n}\nfunction isUpperCase(k) {\n    return upperCaseChars.test(k);\n}\nfunction isWhiteSpaceString(k) {\n    return (/^\\s*$/).test(k);\n}\nfunction isEndOfSentenceSymbol(k) {\n    return '.?!'.indexOf(k) != -1;\n}\nfunction inArray(val, arr) {\n    for (var i = 0; i < arr.length; i++) {\n        if (arr[i] == val) {\n            return true;\n        }\n    }\n    return false;\n}\nvar options = {};\nfunction defineOption(name, defaultValue, type, aliases, callback) {\n    if (defaultValue === undefined && !callback) {\n        throw Error('defaultValue is required unless callback is provided');\n    }\n    if (!type) {\n        type = 'string';\n    }\n    options[name] = {\n        type: type,\n        defaultValue: defaultValue,\n        callback: callback\n    };\n    if (aliases) {\n        for (var i = 0; i < aliases.length; i++) {\n            options[aliases[i]] = options[name];\n        }\n    }\n    if (defaultValue) {\n        setOption(name, defaultValue);\n    }\n}\nfunction setOption(name, value, cm, cfg) {\n    var option = options[name];\n    cfg = cfg || {};\n    var scope = cfg.scope;\n    if (!option) {\n        return new Error('Unknown option: ' + name);\n    }\n    if (option.type == 'boolean') {\n        if (value && value !== true) {\n            return new Error('Invalid argument: ' + name + '=' + value);\n        }\n        else if (value !== false) {\n            value = true;\n        }\n    }\n    if (option.callback) {\n        if (scope !== 'local') {\n            option.callback(value, undefined);\n        }\n        if (scope !== 'global' && cm) {\n            option.callback(value, cm);\n        }\n    }\n    else {\n        if (scope !== 'local') {\n            option.value = option.type == 'boolean' ? !!value : value;\n        }\n        if (scope !== 'global' && cm) {\n            cm.state.vim.options[name] = { value: value };\n        }\n    }\n}\nfunction getOption(name, cm, cfg) {\n    var option = options[name];\n    cfg = cfg || {};\n    var scope = cfg.scope;\n    if (!option) {\n        return new Error('Unknown option: ' + name);\n    }\n    if (option.callback) {\n        var local = cm && option.callback(undefined, cm);\n        if (scope !== 'global' && local !== undefined) {\n            return local;\n        }\n        if (scope !== 'local') {\n            return option.callback();\n        }\n        return;\n    }\n    else {\n        var local = (scope !== 'global') && (cm && cm.state.vim.options[name]);\n        return (local || (scope !== 'local') && option || {}).value;\n    }\n}\ndefineOption('filetype', undefined, 'string', ['ft'], function (name, cm) {\n    if (cm === undefined) {\n        return;\n    }\n    if (name === undefined) {\n        var mode = cm.getOption('mode');\n        return mode == 'null' ? '' : mode;\n    }\n    else {\n        var mode = name == '' ? 'null' : name;\n        cm.setOption('mode', mode);\n    }\n});\nvar createCircularJumpList = function () {\n    var size = 100;\n    var pointer = -1;\n    var head = 0;\n    var tail = 0;\n    var buffer = new Array(size);\n    function add(cm, oldCur, newCur) {\n        var current = pointer % size;\n        var curMark = buffer[current];\n        function useNextSlot(cursor) {\n            var next = ++pointer % size;\n            var trashMark = buffer[next];\n            if (trashMark) {\n                trashMark.clear();\n            }\n            buffer[next] = cm.setBookmark(cursor);\n        }\n        if (curMark) {\n            var markPos = curMark.find();\n            if (markPos && !cursorEqual(markPos, oldCur)) {\n                useNextSlot(oldCur);\n            }\n        }\n        else {\n            useNextSlot(oldCur);\n        }\n        useNextSlot(newCur);\n        head = pointer;\n        tail = pointer - size + 1;\n        if (tail < 0) {\n            tail = 0;\n        }\n    }\n    function move(cm, offset) {\n        pointer += offset;\n        if (pointer > head) {\n            pointer = head;\n        }\n        else if (pointer < tail) {\n            pointer = tail;\n        }\n        var mark = buffer[(size + pointer) % size];\n        if (mark && !mark.find()) {\n            var inc = offset > 0 ? 1 : -1;\n            var newCur;\n            var oldCur = cm.getCursor();\n            do {\n                pointer += inc;\n                mark = buffer[(size + pointer) % size];\n                if (mark &&\n                    (newCur = mark.find()) &&\n                    !cursorEqual(oldCur, newCur)) {\n                    break;\n                }\n            } while (pointer < head && pointer > tail);\n        }\n        return mark;\n    }\n    function find(cm, offset) {\n        var oldPointer = pointer;\n        var mark = move(cm, offset);\n        pointer = oldPointer;\n        return mark && mark.find();\n    }\n    return {\n        cachedCursor: undefined,\n        add: add,\n        find: find,\n        move: move\n    };\n};\nvar createInsertModeChanges = function (c) {\n    if (c) {\n        return {\n            changes: c.changes,\n            expectCursorActivityForChange: c.expectCursorActivityForChange\n        };\n    }\n    return {\n        changes: [],\n        expectCursorActivityForChange: false\n    };\n};\nfunction MacroModeState() {\n    this.latestRegister = undefined;\n    this.isPlaying = false;\n    this.isRecording = false;\n    this.replaySearchQueries = [];\n    this.onRecordingDone = undefined;\n    this.lastInsertModeChanges = createInsertModeChanges();\n}\nMacroModeState.prototype = {\n    exitMacroRecordMode: function () {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.onRecordingDone) {\n            macroModeState.onRecordingDone(); // close dialog\n        }\n        macroModeState.onRecordingDone = undefined;\n        macroModeState.isRecording = false;\n    },\n    enterMacroRecordMode: function (cm, registerName) {\n        var register = vimGlobalState.registerController.getRegister(registerName);\n        if (register) {\n            register.clear();\n            this.latestRegister = registerName;\n            if (cm.openDialog) {\n                var template = dom('span', { class: 'cm-vim-message' }, 'recording @' + registerName);\n                this.onRecordingDone = cm.openDialog(template, null, { bottom: true });\n            }\n            this.isRecording = true;\n        }\n    }\n};\nfunction maybeInitVimState(cm) {\n    if (!cm.state.vim) {\n        cm.state.vim = {\n            inputState: new InputState(),\n            lastEditInputState: undefined,\n            lastEditActionCommand: undefined,\n            lastHPos: -1,\n            lastHSPos: -1,\n            lastMotion: null,\n            marks: {},\n            insertMode: false,\n            insertModeRepeat: undefined,\n            visualMode: false,\n            visualLine: false,\n            visualBlock: false,\n            lastSelection: null,\n            lastPastedText: null,\n            sel: {},\n            options: {}\n        };\n    }\n    return cm.state.vim;\n}\nvar vimGlobalState;\nfunction resetVimGlobalState() {\n    vimGlobalState = {\n        searchQuery: null,\n        searchIsReversed: false,\n        lastSubstituteReplacePart: undefined,\n        jumpList: createCircularJumpList(),\n        macroModeState: new MacroModeState,\n        lastCharacterSearch: { increment: 0, forward: true, selectedCharacter: '' },\n        registerController: new RegisterController({}),\n        searchHistoryController: new HistoryController(),\n        exCommandHistoryController: new HistoryController()\n    };\n    for (var optionName in options) {\n        var option = options[optionName];\n        option.value = option.defaultValue;\n    }\n}\nvar lastInsertModeKeyTimer;\nvar vimApi = {\n    enterVimMode: enterVimMode,\n    leaveVimMode: leaveVimMode,\n    buildKeyMap: function () {\n    },\n    getRegisterController: function () {\n        return vimGlobalState.registerController;\n    },\n    resetVimGlobalState_: resetVimGlobalState,\n    getVimGlobalState_: function () {\n        return vimGlobalState;\n    },\n    maybeInitVimState_: maybeInitVimState,\n    suppressErrorLogging: false,\n    InsertModeKey: InsertModeKey,\n    map: function (lhs, rhs, ctx) {\n        exCommandDispatcher.map(lhs, rhs, ctx);\n    },\n    unmap: function (lhs, ctx) {\n        return exCommandDispatcher.unmap(lhs, ctx);\n    },\n    noremap: function (lhs, rhs, ctx) {\n        function toCtxArray(ctx) {\n            return ctx ? [ctx] : ['normal', 'insert', 'visual'];\n        }\n        var ctxsToMap = toCtxArray(ctx);\n        var actualLength = defaultKeymap.length, origLength = defaultKeymapLength;\n        for (var i = actualLength - origLength; i < actualLength && ctxsToMap.length; i++) {\n            var mapping = defaultKeymap[i];\n            if (mapping.keys == rhs &&\n                (!ctx || !mapping.context || mapping.context === ctx) &&\n                mapping.type.substr(0, 2) !== 'ex' &&\n                mapping.type.substr(0, 3) !== 'key') {\n                var newMapping = {};\n                for (var key in mapping) {\n                    newMapping[key] = mapping[key];\n                }\n                newMapping.keys = lhs;\n                if (ctx && !newMapping.context) {\n                    newMapping.context = ctx;\n                }\n                this._mapCommand(newMapping);\n                var mappedCtxs = toCtxArray(mapping.context);\n                ctxsToMap = ctxsToMap.filter(function (el) { return mappedCtxs.indexOf(el) === -1; });\n            }\n        }\n    },\n    mapclear: function (ctx) {\n        var actualLength = defaultKeymap.length, origLength = defaultKeymapLength;\n        var userKeymap = defaultKeymap.slice(0, actualLength - origLength);\n        defaultKeymap = defaultKeymap.slice(actualLength - origLength);\n        if (ctx) {\n            for (var i = userKeymap.length - 1; i >= 0; i--) {\n                var mapping = userKeymap[i];\n                if (ctx !== mapping.context) {\n                    if (mapping.context) {\n                        this._mapCommand(mapping);\n                    }\n                    else {\n                        var contexts = ['normal', 'insert', 'visual'];\n                        for (var j in contexts) {\n                            if (contexts[j] !== ctx) {\n                                var newMapping = {};\n                                for (var key in mapping) {\n                                    newMapping[key] = mapping[key];\n                                }\n                                newMapping.context = contexts[j];\n                                this._mapCommand(newMapping);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    },\n    setOption: setOption,\n    getOption: getOption,\n    defineOption: defineOption,\n    defineEx: function (name, prefix, func) {\n        if (!prefix) {\n            prefix = name;\n        }\n        else if (name.indexOf(prefix) !== 0) {\n            throw new Error('(Vim.defineEx) \"' + prefix + '\" is not a prefix of \"' + name + '\", command not registered');\n        }\n        exCommands[name] = func;\n        exCommandDispatcher.commandMap_[prefix] = { name: name, shortName: prefix, type: 'api' };\n    },\n    handleKey: function (cm, key, origin) {\n        var command = this.findKey(cm, key, origin);\n        if (typeof command === 'function') {\n            return command();\n        }\n    },\n    multiSelectHandleKey: multiSelectHandleKey,\n    findKey: function (cm, key, origin) {\n        var vim = maybeInitVimState(cm);\n        function handleMacroRecording() {\n            var macroModeState = vimGlobalState.macroModeState;\n            if (macroModeState.isRecording) {\n                if (key == 'q') {\n                    macroModeState.exitMacroRecordMode();\n                    clearInputState(cm);\n                    return true;\n                }\n                if (origin != 'mapping') {\n                    logKey(macroModeState, key);\n                }\n            }\n        }\n        function handleEsc() {\n            if (key == '') {\n                if (vim.visualMode) {\n                    exitVisualMode(cm);\n                }\n                else if (vim.insertMode) {\n                    exitInsertMode(cm);\n                }\n                else {\n                    return;\n                }\n                clearInputState(cm);\n                return true;\n            }\n        }\n        function doKeyToKey(keys) {\n            var match;\n            while (keys) {\n                match = (/<\\w+-.+?>|<\\w+>|./).exec(keys);\n                key = match[0];\n                keys = keys.substring(match.index + key.length);\n                vimApi.handleKey(cm, key, 'mapping');\n            }\n        }\n        function handleKeyInsertMode() {\n            if (handleEsc()) {\n                return true;\n            }\n            var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n            var keysAreChars = key.length == 1;\n            var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n            while (keys.length > 1 && match.type != 'full') {\n                var keys = vim.inputState.keyBuffer = keys.slice(1);\n                var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n                if (thisMatch.type != 'none') {\n                    match = thisMatch;\n                }\n            }\n            if (match.type == 'none') {\n                clearInputState(cm);\n                return false;\n            }\n            else if (match.type == 'partial') {\n                if (lastInsertModeKeyTimer) {\n                    window.clearTimeout(lastInsertModeKeyTimer);\n                }\n                lastInsertModeKeyTimer = window.setTimeout(function () { if (vim.insertMode && vim.inputState.keyBuffer) {\n                    clearInputState(cm);\n                } }, getOption('insertModeEscKeysTimeout'));\n                return !keysAreChars;\n            }\n            if (lastInsertModeKeyTimer) {\n                window.clearTimeout(lastInsertModeKeyTimer);\n            }\n            if (keysAreChars) {\n                var selections = cm.listSelections();\n                for (var i = 0; i < selections.length; i++) {\n                    var here = selections[i].head;\n                    cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input');\n                }\n                vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop();\n            }\n            clearInputState(cm);\n            return match.command;\n        }\n        function handleKeyNonInsertMode() {\n            if (handleMacroRecording() || handleEsc()) {\n                return true;\n            }\n            var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n            if (/^[1-9]\\d*$/.test(keys)) {\n                return true;\n            }\n            var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n            if (!keysMatcher) {\n                clearInputState(cm);\n                return false;\n            }\n            var context = vim.visualMode ? 'visual' :\n                'normal';\n            var mainKey = keysMatcher[2] || keysMatcher[1];\n            if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) {\n                mainKey = vim.inputState.operatorShortcut;\n            }\n            var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context);\n            if (match.type == 'none') {\n                clearInputState(cm);\n                return false;\n            }\n            else if (match.type == 'partial') {\n                return true;\n            }\n            else if (match.type == 'clear') {\n                clearInputState(cm);\n                return true;\n            }\n            vim.inputState.keyBuffer = '';\n            keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n            if (keysMatcher[1] && keysMatcher[1] != '0') {\n                vim.inputState.pushRepeatDigit(keysMatcher[1]);\n            }\n            return match.command;\n        }\n        var command;\n        if (vim.insertMode) {\n            command = handleKeyInsertMode();\n        }\n        else {\n            command = handleKeyNonInsertMode();\n        }\n        if (command === false) {\n            return undefined; //ace_patch\n        }\n        else if (command === true) {\n            return function () { return true; };\n        }\n        else {\n            return function () {\n                if ((command.operator || command.isEdit) && cm.getOption('readOnly'))\n                    return; // ace_patch\n                return cm.operation(function () {\n                    cm.curOp.isVimOp = true;\n                    try {\n                        if (command.type == 'keyToKey') {\n                            doKeyToKey(command.toKeys);\n                        }\n                        else {\n                            commandDispatcher.processCommand(cm, vim, command);\n                        }\n                    }\n                    catch (e) {\n                        cm.state.vim = undefined;\n                        maybeInitVimState(cm);\n                        if (!vimApi.suppressErrorLogging) {\n                            console['log'](e);\n                        }\n                        throw e;\n                    }\n                    return true;\n                });\n            };\n        }\n    },\n    handleEx: function (cm, input) {\n        exCommandDispatcher.processCommand(cm, input);\n    },\n    defineMotion: defineMotion,\n    defineAction: defineAction,\n    defineOperator: defineOperator,\n    mapCommand: mapCommand,\n    _mapCommand: _mapCommand,\n    defineRegister: defineRegister,\n    exitVisualMode: exitVisualMode,\n    exitInsertMode: exitInsertMode\n};\nfunction InputState() {\n    this.prefixRepeat = [];\n    this.motionRepeat = [];\n    this.operator = null;\n    this.operatorArgs = null;\n    this.motion = null;\n    this.motionArgs = null;\n    this.keyBuffer = []; // For matching multi-key commands.\n    this.registerName = null; // Defaults to the unnamed register.\n}\nInputState.prototype.pushRepeatDigit = function (n) {\n    if (!this.operator) {\n        this.prefixRepeat = this.prefixRepeat.concat(n);\n    }\n    else {\n        this.motionRepeat = this.motionRepeat.concat(n);\n    }\n};\nInputState.prototype.getRepeat = function () {\n    var repeat = 0;\n    if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {\n        repeat = 1;\n        if (this.prefixRepeat.length > 0) {\n            repeat *= parseInt(this.prefixRepeat.join(''), 10);\n        }\n        if (this.motionRepeat.length > 0) {\n            repeat *= parseInt(this.motionRepeat.join(''), 10);\n        }\n    }\n    return repeat;\n};\nfunction clearInputState(cm, reason) {\n    cm.state.vim.inputState = new InputState();\n    CodeMirror.signal(cm, 'vim-command-done', reason);\n}\nfunction Register(text, linewise, blockwise) {\n    this.clear();\n    this.keyBuffer = [text || ''];\n    this.insertModeChanges = [];\n    this.searchQueries = [];\n    this.linewise = !!linewise;\n    this.blockwise = !!blockwise;\n}\nRegister.prototype = {\n    setText: function (text, linewise, blockwise) {\n        this.keyBuffer = [text || ''];\n        this.linewise = !!linewise;\n        this.blockwise = !!blockwise;\n    },\n    pushText: function (text, linewise) {\n        if (linewise) {\n            if (!this.linewise) {\n                this.keyBuffer.push('\\n');\n            }\n            this.linewise = true;\n        }\n        this.keyBuffer.push(text);\n    },\n    pushInsertModeChanges: function (changes) {\n        this.insertModeChanges.push(createInsertModeChanges(changes));\n    },\n    pushSearchQuery: function (query) {\n        this.searchQueries.push(query);\n    },\n    clear: function () {\n        this.keyBuffer = [];\n        this.insertModeChanges = [];\n        this.searchQueries = [];\n        this.linewise = false;\n    },\n    toString: function () {\n        return this.keyBuffer.join('');\n    }\n};\nfunction defineRegister(name, register) {\n    var registers = vimGlobalState.registerController.registers;\n    if (!name || name.length != 1) {\n        throw Error('Register name must be 1 character');\n    }\n    registers[name] = register;\n    validRegisters.push(name);\n}\nfunction RegisterController(registers) {\n    this.registers = registers;\n    this.unnamedRegister = registers['\"'] = new Register();\n    registers['.'] = new Register();\n    registers[':'] = new Register();\n    registers['/'] = new Register();\n    registers['+'] = new Register();\n}\nRegisterController.prototype = {\n    pushText: function (registerName, operator, text, linewise, blockwise) {\n        if (registerName === '_')\n            return;\n        if (linewise && text.charAt(text.length - 1) !== '\\n') {\n            text += '\\n';\n        }\n        var register = this.isValidRegister(registerName) ?\n            this.getRegister(registerName) : null;\n        if (!register) {\n            switch (operator) {\n                case 'yank':\n                    this.registers['0'] = new Register(text, linewise, blockwise);\n                    break;\n                case 'delete':\n                case 'change':\n                    if (text.indexOf('\\n') == -1) {\n                        this.registers['-'] = new Register(text, linewise);\n                    }\n                    else {\n                        this.shiftNumericRegisters_();\n                        this.registers['1'] = new Register(text, linewise);\n                    }\n                    break;\n            }\n            this.unnamedRegister.setText(text, linewise, blockwise);\n            return;\n        }\n        var append = isUpperCase(registerName);\n        if (append) {\n            register.pushText(text, linewise);\n        }\n        else {\n            register.setText(text, linewise, blockwise);\n        }\n        if (registerName === '+') {\n            navigator.clipboard.writeText(text);\n        }\n        this.unnamedRegister.setText(register.toString(), linewise);\n    },\n    getRegister: function (name) {\n        if (!this.isValidRegister(name)) {\n            return this.unnamedRegister;\n        }\n        name = name.toLowerCase();\n        if (!this.registers[name]) {\n            this.registers[name] = new Register();\n        }\n        return this.registers[name];\n    },\n    isValidRegister: function (name) {\n        return name && inArray(name, validRegisters);\n    },\n    shiftNumericRegisters_: function () {\n        for (var i = 9; i >= 2; i--) {\n            this.registers[i] = this.getRegister('' + (i - 1));\n        }\n    }\n};\nfunction HistoryController() {\n    this.historyBuffer = [];\n    this.iterator = 0;\n    this.initialPrefix = null;\n}\nHistoryController.prototype = {\n    nextMatch: function (input, up) {\n        var historyBuffer = this.historyBuffer;\n        var dir = up ? -1 : 1;\n        if (this.initialPrefix === null)\n            this.initialPrefix = input;\n        for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i += dir) {\n            var element = historyBuffer[i];\n            for (var j = 0; j <= element.length; j++) {\n                if (this.initialPrefix == element.substring(0, j)) {\n                    this.iterator = i;\n                    return element;\n                }\n            }\n        }\n        if (i >= historyBuffer.length) {\n            this.iterator = historyBuffer.length;\n            return this.initialPrefix;\n        }\n        if (i < 0)\n            return input;\n    },\n    pushInput: function (input) {\n        var index = this.historyBuffer.indexOf(input);\n        if (index > -1)\n            this.historyBuffer.splice(index, 1);\n        if (input.length)\n            this.historyBuffer.push(input);\n    },\n    reset: function () {\n        this.initialPrefix = null;\n        this.iterator = this.historyBuffer.length;\n    }\n};\nvar commandDispatcher = {\n    matchCommand: function (keys, keyMap, inputState, context) {\n        var matches = commandMatches(keys, keyMap, context, inputState);\n        if (!matches.full && !matches.partial) {\n            return { type: 'none' };\n        }\n        else if (!matches.full && matches.partial) {\n            return { type: 'partial' };\n        }\n        var bestMatch;\n        for (var i = 0; i < matches.full.length; i++) {\n            var match = matches.full[i];\n            if (!bestMatch) {\n                bestMatch = match;\n            }\n        }\n        if (bestMatch.keys.slice(-11) == '') {\n            var character = lastChar(keys);\n            if (!character || character.length > 1)\n                return { type: 'clear' };\n            inputState.selectedCharacter = character;\n        }\n        return { type: 'full', command: bestMatch };\n    },\n    processCommand: function (cm, vim, command) {\n        vim.inputState.repeatOverride = command.repeatOverride;\n        switch (command.type) {\n            case 'motion':\n                this.processMotion(cm, vim, command);\n                break;\n            case 'operator':\n                this.processOperator(cm, vim, command);\n                break;\n            case 'operatorMotion':\n                this.processOperatorMotion(cm, vim, command);\n                break;\n            case 'action':\n                this.processAction(cm, vim, command);\n                break;\n            case 'search':\n                this.processSearch(cm, vim, command);\n                break;\n            case 'ex':\n            case 'keyToEx':\n                this.processEx(cm, vim, command);\n                break;\n            default:\n                break;\n        }\n    },\n    processMotion: function (cm, vim, command) {\n        vim.inputState.motion = command.motion;\n        vim.inputState.motionArgs = copyArgs(command.motionArgs);\n        this.evalInput(cm, vim);\n    },\n    processOperator: function (cm, vim, command) {\n        var inputState = vim.inputState;\n        if (inputState.operator) {\n            if (inputState.operator == command.operator) {\n                inputState.motion = 'expandToLine';\n                inputState.motionArgs = { linewise: true };\n                this.evalInput(cm, vim);\n                return;\n            }\n            else {\n                clearInputState(cm);\n            }\n        }\n        inputState.operator = command.operator;\n        inputState.operatorArgs = copyArgs(command.operatorArgs);\n        if (command.keys.length > 1) {\n            inputState.operatorShortcut = command.keys;\n        }\n        if (command.exitVisualBlock) {\n            vim.visualBlock = false;\n            updateCmSelection(cm);\n        }\n        if (vim.visualMode) {\n            this.evalInput(cm, vim);\n        }\n    },\n    processOperatorMotion: function (cm, vim, command) {\n        var visualMode = vim.visualMode;\n        var operatorMotionArgs = copyArgs(command.operatorMotionArgs);\n        if (operatorMotionArgs) {\n            if (visualMode && operatorMotionArgs.visualLine) {\n                vim.visualLine = true;\n            }\n        }\n        this.processOperator(cm, vim, command);\n        if (!visualMode) {\n            this.processMotion(cm, vim, command);\n        }\n    },\n    processAction: function (cm, vim, command) {\n        var inputState = vim.inputState;\n        var repeat = inputState.getRepeat();\n        var repeatIsExplicit = !!repeat;\n        var actionArgs = copyArgs(command.actionArgs) || {};\n        if (inputState.selectedCharacter) {\n            actionArgs.selectedCharacter = inputState.selectedCharacter;\n        }\n        if (command.operator) {\n            this.processOperator(cm, vim, command);\n        }\n        if (command.motion) {\n            this.processMotion(cm, vim, command);\n        }\n        if (command.motion || command.operator) {\n            this.evalInput(cm, vim);\n        }\n        actionArgs.repeat = repeat || 1;\n        actionArgs.repeatIsExplicit = repeatIsExplicit;\n        actionArgs.registerName = inputState.registerName;\n        clearInputState(cm);\n        vim.lastMotion = null;\n        if (command.isEdit) {\n            this.recordLastEdit(vim, inputState, command);\n        }\n        actions[command.action](cm, actionArgs, vim);\n    },\n    processSearch: function (cm, vim, command) {\n        if (!cm.getSearchCursor) {\n            return;\n        }\n        var forward = command.searchArgs.forward;\n        var wholeWordOnly = command.searchArgs.wholeWordOnly;\n        getSearchState(cm).setReversed(!forward);\n        var promptPrefix = (forward) ? '/' : '?';\n        var originalQuery = getSearchState(cm).getQuery();\n        var originalScrollPos = cm.getScrollInfo();\n        function handleQuery(query, ignoreCase, smartCase) {\n            vimGlobalState.searchHistoryController.pushInput(query);\n            vimGlobalState.searchHistoryController.reset();\n            try {\n                updateSearchQuery(cm, query, ignoreCase, smartCase);\n            }\n            catch (e) {\n                showConfirm(cm, 'Invalid regex: ' + query);\n                clearInputState(cm);\n                return;\n            }\n            commandDispatcher.processMotion(cm, vim, {\n                type: 'motion',\n                motion: 'findNext',\n                motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }\n            });\n        }\n        function onPromptClose(query) {\n            handleQuery(query, true /** ignoreCase */, true /** smartCase */);\n            var macroModeState = vimGlobalState.macroModeState;\n            if (macroModeState.isRecording) {\n                logSearchQuery(macroModeState, query);\n            }\n        }\n        function onPromptKeyUp(e, query, close) {\n            var keyName = CodeMirror.keyName(e), up, offset;\n            if (keyName == 'Up' || keyName == 'Down') {\n                up = keyName == 'Up' ? true : false;\n                offset = e.target ? e.target.selectionEnd : 0;\n                query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '';\n                close(query);\n                if (offset && e.target)\n                    e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n            }\n            else {\n                if (keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n                    vimGlobalState.searchHistoryController.reset();\n            }\n            var parsedQuery;\n            try {\n                parsedQuery = updateSearchQuery(cm, query, true /** ignoreCase */, true /** smartCase */);\n            }\n            catch (e) {\n            }\n            if (parsedQuery) {\n                cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);\n            }\n            else {\n                clearSearchHighlight(cm);\n                cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n            }\n        }\n        function onPromptKeyDown(e, query, close) {\n            var keyName = CodeMirror.keyName(e);\n            if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||\n                (keyName == 'Backspace' && query == '')) {\n                vimGlobalState.searchHistoryController.pushInput(query);\n                vimGlobalState.searchHistoryController.reset();\n                updateSearchQuery(cm, originalQuery);\n                clearSearchHighlight(cm);\n                cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n                CodeMirror.e_stop(e);\n                clearInputState(cm);\n                close();\n                cm.focus();\n            }\n            else if (keyName == 'Up' || keyName == 'Down') {\n                CodeMirror.e_stop(e);\n            }\n            else if (keyName == 'Ctrl-U') {\n                CodeMirror.e_stop(e);\n                close('');\n            }\n        }\n        switch (command.searchArgs.querySrc) {\n            case 'prompt':\n                var macroModeState = vimGlobalState.macroModeState;\n                if (macroModeState.isPlaying) {\n                    var query = macroModeState.replaySearchQueries.shift();\n                    handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n                }\n                else {\n                    showPrompt(cm, {\n                        onClose: onPromptClose,\n                        prefix: promptPrefix,\n                        desc: '(JavaScript regexp)',\n                        onKeyUp: onPromptKeyUp,\n                        onKeyDown: onPromptKeyDown\n                    });\n                }\n                break;\n            case 'wordUnderCursor':\n                var word = expandWordUnderCursor(cm, false /** inclusive */, true /** forward */, false /** bigWord */, true /** noSymbol */);\n                var isKeyword = true;\n                if (!word) {\n                    word = expandWordUnderCursor(cm, false /** inclusive */, true /** forward */, false /** bigWord */, false /** noSymbol */);\n                    isKeyword = false;\n                }\n                if (!word) {\n                    return;\n                }\n                var query = cm.getLine(word.start.line).substring(word.start.ch, word.end.ch);\n                if (isKeyword && wholeWordOnly) {\n                    query = '\\\\b' + query + '\\\\b';\n                }\n                else {\n                    query = escapeRegex(query);\n                }\n                vimGlobalState.jumpList.cachedCursor = cm.getCursor();\n                cm.setCursor(word.start);\n                handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n                break;\n        }\n    },\n    processEx: function (cm, vim, command) {\n        function onPromptClose(input) {\n            vimGlobalState.exCommandHistoryController.pushInput(input);\n            vimGlobalState.exCommandHistoryController.reset();\n            exCommandDispatcher.processCommand(cm, input);\n            if (cm.state.vim)\n                clearInputState(cm);\n        }\n        function onPromptKeyDown(e, input, close) {\n            var keyName = CodeMirror.keyName(e), up, offset;\n            if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||\n                (keyName == 'Backspace' && input == '')) {\n                vimGlobalState.exCommandHistoryController.pushInput(input);\n                vimGlobalState.exCommandHistoryController.reset();\n                CodeMirror.e_stop(e);\n                clearInputState(cm);\n                close();\n                cm.focus();\n            }\n            if (keyName == 'Up' || keyName == 'Down') {\n                CodeMirror.e_stop(e);\n                up = keyName == 'Up' ? true : false;\n                offset = e.target ? e.target.selectionEnd : 0;\n                input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '';\n                close(input);\n                if (offset && e.target)\n                    e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n            }\n            else if (keyName == 'Ctrl-U') {\n                CodeMirror.e_stop(e);\n                close('');\n            }\n            else {\n                if (keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n                    vimGlobalState.exCommandHistoryController.reset();\n            }\n        }\n        if (command.type == 'keyToEx') {\n            exCommandDispatcher.processCommand(cm, command.exArgs.input);\n        }\n        else {\n            if (vim.visualMode) {\n                showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\\'<,\\'>',\n                    onKeyDown: onPromptKeyDown, selectValueOnOpen: false });\n            }\n            else {\n                showPrompt(cm, { onClose: onPromptClose, prefix: ':',\n                    onKeyDown: onPromptKeyDown });\n            }\n        }\n    },\n    evalInput: function (cm, vim) {\n        var inputState = vim.inputState;\n        var motion = inputState.motion;\n        var motionArgs = inputState.motionArgs || {};\n        var operator = inputState.operator;\n        var operatorArgs = inputState.operatorArgs || {};\n        var registerName = inputState.registerName;\n        var sel = vim.sel;\n        var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head) : cm.getCursor('head'));\n        var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor'));\n        var oldHead = copyCursor(origHead);\n        var oldAnchor = copyCursor(origAnchor);\n        var newHead, newAnchor;\n        var repeat;\n        if (operator) {\n            this.recordLastEdit(vim, inputState);\n        }\n        if (inputState.repeatOverride !== undefined) {\n            repeat = inputState.repeatOverride;\n        }\n        else {\n            repeat = inputState.getRepeat();\n        }\n        if (repeat > 0 && motionArgs.explicitRepeat) {\n            motionArgs.repeatIsExplicit = true;\n        }\n        else if (motionArgs.noRepeat ||\n            (!motionArgs.explicitRepeat && repeat === 0)) {\n            repeat = 1;\n            motionArgs.repeatIsExplicit = false;\n        }\n        if (inputState.selectedCharacter) {\n            motionArgs.selectedCharacter = operatorArgs.selectedCharacter =\n                inputState.selectedCharacter;\n        }\n        motionArgs.repeat = repeat;\n        clearInputState(cm);\n        if (motion) {\n            var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState);\n            vim.lastMotion = motions[motion];\n            if (!motionResult) {\n                return;\n            }\n            if (motionArgs.toJumplist) {\n                if (!operator && cm.ace.curOp != null)\n                    cm.ace.curOp.command.scrollIntoView = \"center-animate\"; // ace_patch\n                var jumpList = vimGlobalState.jumpList;\n                var cachedCursor = jumpList.cachedCursor;\n                if (cachedCursor) {\n                    recordJumpPosition(cm, cachedCursor, motionResult);\n                    delete jumpList.cachedCursor;\n                }\n                else {\n                    recordJumpPosition(cm, origHead, motionResult);\n                }\n            }\n            if (motionResult instanceof Array) {\n                newAnchor = motionResult[0];\n                newHead = motionResult[1];\n            }\n            else {\n                newHead = motionResult;\n            }\n            if (!newHead) {\n                newHead = copyCursor(origHead);\n            }\n            if (vim.visualMode) {\n                if (!(vim.visualBlock && newHead.ch === Infinity)) {\n                    newHead = clipCursorToContent(cm, newHead, oldHead);\n                }\n                if (newAnchor) {\n                    newAnchor = clipCursorToContent(cm, newAnchor);\n                }\n                newAnchor = newAnchor || oldAnchor;\n                sel.anchor = newAnchor;\n                sel.head = newHead;\n                updateCmSelection(cm);\n                updateMark(cm, vim, '<', cursorIsBefore(newAnchor, newHead) ? newAnchor\n                    : newHead);\n                updateMark(cm, vim, '>', cursorIsBefore(newAnchor, newHead) ? newHead\n                    : newAnchor);\n            }\n            else if (!operator) {\n                if (cm.ace.curOp)\n                    cm.ace.curOp.vimDialogScroll = \"center-animate\"; // ace_patch\n                newHead = clipCursorToContent(cm, newHead, oldHead);\n                cm.setCursor(newHead.line, newHead.ch);\n            }\n        }\n        if (operator) {\n            if (operatorArgs.lastSel) {\n                newAnchor = oldAnchor;\n                var lastSel = operatorArgs.lastSel;\n                var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line);\n                var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch);\n                if (lastSel.visualLine) {\n                    newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n                }\n                else if (lastSel.visualBlock) {\n                    newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset);\n                }\n                else if (lastSel.head.line == lastSel.anchor.line) {\n                    newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset);\n                }\n                else {\n                    newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n                }\n                vim.visualMode = true;\n                vim.visualLine = lastSel.visualLine;\n                vim.visualBlock = lastSel.visualBlock;\n                sel = vim.sel = {\n                    anchor: newAnchor,\n                    head: newHead\n                };\n                updateCmSelection(cm);\n            }\n            else if (vim.visualMode) {\n                operatorArgs.lastSel = {\n                    anchor: copyCursor(sel.anchor),\n                    head: copyCursor(sel.head),\n                    visualBlock: vim.visualBlock,\n                    visualLine: vim.visualLine\n                };\n            }\n            var curStart, curEnd, linewise, mode;\n            var cmSel;\n            if (vim.visualMode) {\n                curStart = cursorMin(sel.head, sel.anchor);\n                curEnd = cursorMax(sel.head, sel.anchor);\n                linewise = vim.visualLine || operatorArgs.linewise;\n                mode = vim.visualBlock ? 'block' :\n                    linewise ? 'line' :\n                        'char';\n                var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd);\n                cmSel = makeCmSelection(cm, {\n                    anchor: newPositions.start,\n                    head: newPositions.end\n                }, mode);\n                if (linewise) {\n                    var ranges = cmSel.ranges;\n                    if (mode == 'block') {\n                        for (var i = 0; i < ranges.length; i++) {\n                            ranges[i].head.ch = lineLength(cm, ranges[i].head.line);\n                        }\n                    }\n                    else if (mode == 'line') {\n                        ranges[0].head = new Pos(ranges[0].head.line + 1, 0);\n                    }\n                }\n            }\n            else {\n                curStart = copyCursor(newAnchor || oldAnchor);\n                curEnd = copyCursor(newHead || oldHead);\n                if (cursorIsBefore(curEnd, curStart)) {\n                    var tmp = curStart;\n                    curStart = curEnd;\n                    curEnd = tmp;\n                }\n                linewise = motionArgs.linewise || operatorArgs.linewise;\n                if (linewise) {\n                    expandSelectionToLine(cm, curStart, curEnd);\n                }\n                else if (motionArgs.forward) {\n                    clipToLine(cm, curStart, curEnd);\n                }\n                mode = 'char';\n                var exclusive = !motionArgs.inclusive || linewise;\n                var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd);\n                cmSel = makeCmSelection(cm, {\n                    anchor: newPositions.start,\n                    head: newPositions.end\n                }, mode, exclusive);\n            }\n            cm.setSelections(cmSel.ranges, cmSel.primary);\n            vim.lastMotion = null;\n            operatorArgs.repeat = repeat; // For indent in visual mode.\n            operatorArgs.registerName = registerName;\n            operatorArgs.linewise = linewise;\n            var operatorMoveTo = operators[operator](cm, operatorArgs, cmSel.ranges, oldAnchor, newHead);\n            if (vim.visualMode) {\n                exitVisualMode(cm, operatorMoveTo != null);\n            }\n            if (operatorMoveTo) {\n                cm.setCursor(operatorMoveTo);\n            }\n        }\n    },\n    recordLastEdit: function (vim, inputState, actionCommand) {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) {\n            return;\n        }\n        vim.lastEditInputState = inputState;\n        vim.lastEditActionCommand = actionCommand;\n        macroModeState.lastInsertModeChanges.changes = [];\n        macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;\n        macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0;\n    }\n};\nvar motions = {\n    moveToTopLine: function (cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).top + motionArgs.repeat - 1;\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n    },\n    moveToMiddleLine: function (cm) {\n        var range = getUserVisibleLines(cm);\n        var line = Math.floor((range.top + range.bottom) * 0.5);\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n    },\n    moveToBottomLine: function (cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).bottom - motionArgs.repeat + 1;\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n    },\n    expandToLine: function (_cm, head, motionArgs) {\n        var cur = head;\n        return new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n    },\n    findNext: function (cm, _head, motionArgs) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        if (!query) {\n            return;\n        }\n        var prev = !motionArgs.forward;\n        prev = (state.isReversed()) ? !prev : prev;\n        highlightSearchMatches(cm, query);\n        return findNext(cm, prev /** prev */, query, motionArgs.repeat);\n    },\n    findAndSelectNextInclusive: function (cm, _head, motionArgs, vim, prevInputState) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        if (!query) {\n            return;\n        }\n        var prev = !motionArgs.forward;\n        prev = (state.isReversed()) ? !prev : prev;\n        var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim);\n        if (!next) {\n            return;\n        }\n        if (prevInputState.operator) {\n            return next;\n        }\n        var from = next[0];\n        var to = new Pos(next[1].line, next[1].ch - 1);\n        if (vim.visualMode) {\n            if (vim.visualLine || vim.visualBlock) {\n                vim.visualLine = false;\n                vim.visualBlock = false;\n                CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"visual\", subMode: \"\" });\n            }\n            var anchor = vim.sel.anchor;\n            if (anchor) {\n                if (state.isReversed()) {\n                    if (motionArgs.forward) {\n                        return [anchor, from];\n                    }\n                    return [anchor, to];\n                }\n                else {\n                    if (motionArgs.forward) {\n                        return [anchor, to];\n                    }\n                    return [anchor, from];\n                }\n            }\n        }\n        else {\n            vim.visualMode = true;\n            vim.visualLine = false;\n            vim.visualBlock = false;\n            CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"visual\", subMode: \"\" });\n        }\n        return prev ? [to, from] : [from, to];\n    },\n    goToMark: function (cm, _head, motionArgs, vim) {\n        var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter);\n        if (pos) {\n            return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;\n        }\n        return null;\n    },\n    moveToOtherHighlightedEnd: function (cm, _head, motionArgs, vim) {\n        if (vim.visualBlock && motionArgs.sameLine) {\n            var sel = vim.sel;\n            return [\n                clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)),\n                clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch))\n            ];\n        }\n        else {\n            return ([vim.sel.head, vim.sel.anchor]);\n        }\n    },\n    jumpToMark: function (cm, head, motionArgs, vim) {\n        var best = head;\n        for (var i = 0; i < motionArgs.repeat; i++) {\n            var cursor = best;\n            for (var key in vim.marks) {\n                if (!isLowerCase(key)) {\n                    continue;\n                }\n                var mark = vim.marks[key].find();\n                var isWrongDirection = (motionArgs.forward) ?\n                    cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark);\n                if (isWrongDirection) {\n                    continue;\n                }\n                if (motionArgs.linewise && (mark.line == cursor.line)) {\n                    continue;\n                }\n                var equal = cursorEqual(cursor, best);\n                var between = (motionArgs.forward) ?\n                    cursorIsBetween(cursor, mark, best) :\n                    cursorIsBetween(best, mark, cursor);\n                if (equal || between) {\n                    best = mark;\n                }\n            }\n        }\n        if (motionArgs.linewise) {\n            best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));\n        }\n        return best;\n    },\n    moveByCharacters: function (_cm, head, motionArgs) {\n        var cur = head;\n        var repeat = motionArgs.repeat;\n        var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;\n        return new Pos(cur.line, ch);\n    },\n    moveByLines: function (cm, head, motionArgs, vim) {\n        var cur = head;\n        var endCh = cur.ch;\n        switch (vim.lastMotion) {\n            case this.moveByLines:\n            case this.moveByDisplayLines:\n            case this.moveByScroll:\n            case this.moveToColumn:\n            case this.moveToEol:\n                endCh = vim.lastHPos;\n                break;\n            default:\n                vim.lastHPos = endCh;\n        }\n        var repeat = motionArgs.repeat + (motionArgs.repeatOffset || 0);\n        var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;\n        var first = cm.firstLine();\n        var last = cm.lastLine();\n        if (line < first && cur.line == first) {\n            return this.moveToStartOfLine(cm, head, motionArgs, vim);\n        }\n        else if (line > last && cur.line == last) {\n            return moveToEol(cm, head, motionArgs, vim, true);\n        }\n        var fold = cm.ace.session.getFoldLine(line);\n        if (fold) {\n            if (motionArgs.forward) {\n                if (line > fold.start.row)\n                    line = fold.end.row + 1;\n            }\n            else {\n                line = fold.start.row;\n            }\n        }\n        if (motionArgs.toFirstChar) {\n            endCh = findFirstNonWhiteSpaceCharacter(cm.getLine(line));\n            vim.lastHPos = endCh;\n        }\n        vim.lastHSPos = cm.charCoords(new Pos(line, endCh), 'div').left;\n        return new Pos(line, endCh);\n    },\n    moveByDisplayLines: function (cm, head, motionArgs, vim) {\n        var cur = head;\n        switch (vim.lastMotion) {\n            case this.moveByDisplayLines:\n            case this.moveByScroll:\n            case this.moveByLines:\n            case this.moveToColumn:\n            case this.moveToEol:\n                break;\n            default:\n                vim.lastHSPos = cm.charCoords(cur, 'div').left;\n        }\n        var repeat = motionArgs.repeat;\n        var res = cm.findPosV(cur, (motionArgs.forward ? repeat : -repeat), 'line', vim.lastHSPos);\n        if (res.hitSide) {\n            if (motionArgs.forward) {\n                var lastCharCoords = cm.charCoords(res, 'div');\n                var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };\n                var res = cm.coordsChar(goalCoords, 'div');\n            }\n            else {\n                var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div');\n                resCoords.left = vim.lastHSPos;\n                res = cm.coordsChar(resCoords, 'div');\n            }\n        }\n        vim.lastHPos = res.ch;\n        return res;\n    },\n    moveByPage: function (cm, head, motionArgs) {\n        var curStart = head;\n        var repeat = motionArgs.repeat;\n        return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page');\n    },\n    moveByParagraph: function (cm, head, motionArgs) {\n        var dir = motionArgs.forward ? 1 : -1;\n        return findParagraph(cm, head, motionArgs.repeat, dir);\n    },\n    moveBySentence: function (cm, head, motionArgs) {\n        var dir = motionArgs.forward ? 1 : -1;\n        return findSentence(cm, head, motionArgs.repeat, dir);\n    },\n    moveByScroll: function (cm, head, motionArgs, vim) {\n        var scrollbox = cm.getScrollInfo();\n        var curEnd = null;\n        var repeat = motionArgs.repeat;\n        if (!repeat) {\n            repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());\n        }\n        var orig = cm.charCoords(head, 'local');\n        motionArgs.repeat = repeat;\n        curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim);\n        if (!curEnd) {\n            return null;\n        }\n        var dest = cm.charCoords(curEnd, 'local');\n        cm.scrollTo(null, scrollbox.top + dest.top - orig.top);\n        return curEnd;\n    },\n    moveByWords: function (cm, head, motionArgs) {\n        return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, !!motionArgs.wordEnd, !!motionArgs.bigWord);\n    },\n    moveTillCharacter: function (cm, _head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter);\n        var increment = motionArgs.forward ? -1 : 1;\n        recordLastCharacterSearch(increment, motionArgs);\n        if (!curEnd)\n            return null;\n        curEnd.ch += increment;\n        return curEnd;\n    },\n    moveToCharacter: function (cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        recordLastCharacterSearch(0, motionArgs);\n        return moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head;\n    },\n    moveToSymbol: function (cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        return findSymbol(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head;\n    },\n    moveToColumn: function (cm, head, motionArgs, vim) {\n        var repeat = motionArgs.repeat;\n        vim.lastHPos = repeat - 1;\n        vim.lastHSPos = cm.charCoords(head, 'div').left;\n        return moveToColumn(cm, repeat);\n    },\n    moveToEol: function (cm, head, motionArgs, vim) {\n        return moveToEol(cm, head, motionArgs, vim, false);\n    },\n    moveToFirstNonWhiteSpaceCharacter: function (cm, head) {\n        var cursor = head;\n        return new Pos(cursor.line, findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));\n    },\n    moveToMatchedSymbol: function (cm, head) {\n        var cursor = head;\n        var line = cursor.line;\n        var ch = cursor.ch;\n        var lineText = cm.getLine(line);\n        var symbol;\n        for (; ch < lineText.length; ch++) {\n            symbol = lineText.charAt(ch);\n            if (symbol && isMatchableSymbol(symbol)) {\n                var style = cm.getTokenTypeAt(new Pos(line, ch + 1));\n                if (style !== \"string\" && style !== \"comment\") {\n                    break;\n                }\n            }\n        }\n        if (ch < lineText.length) {\n            var re = /[<>]/.test(lineText[ch]) ? /[(){}[\\]<>]/ : /[(){}[\\]]/; //ace_patch?\n            var matched = cm.findMatchingBracket(new Pos(line, ch + 1), { bracketRegex: re });\n            return matched.to;\n        }\n        else {\n            return cursor;\n        }\n    },\n    moveToStartOfLine: function (_cm, head) {\n        return new Pos(head.line, 0);\n    },\n    moveToLineOrEdgeOfDocument: function (cm, _head, motionArgs) {\n        var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();\n        if (motionArgs.repeatIsExplicit) {\n            lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');\n        }\n        return new Pos(lineNum, findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));\n    },\n    moveToStartOfDisplayLine: function (cm) {\n        cm.execCommand(\"goLineLeft\");\n        return cm.getCursor();\n    },\n    moveToEndOfDisplayLine: function (cm) {\n        cm.execCommand(\"goLineRight\");\n        var head = cm.getCursor();\n        if (head.sticky == \"before\")\n            head.ch--;\n        return head;\n    },\n    textObjectManipulation: function (cm, head, motionArgs, vim) {\n        var mirroredPairs = { '(': ')', ')': '(',\n            '{': '}', '}': '{',\n            '[': ']', ']': '[',\n            '<': '>', '>': '<' };\n        var selfPaired = { '\\'': true, '\"': true, '`': true };\n        var character = motionArgs.selectedCharacter;\n        if (character == 'b') {\n            character = '(';\n        }\n        else if (character == 'B') {\n            character = '{';\n        }\n        var inclusive = !motionArgs.textObjectInner;\n        var tmp;\n        if (mirroredPairs[character]) {\n            tmp = selectCompanionObject(cm, head, character, inclusive);\n        }\n        else if (selfPaired[character]) {\n            tmp = findBeginningAndEnd(cm, head, character, inclusive);\n        }\n        else if (character === 'W') {\n            tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, true /** bigWord */);\n        }\n        else if (character === 'w') {\n            tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, false /** bigWord */);\n        }\n        else if (character === 'p') {\n            tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive);\n            motionArgs.linewise = true;\n            if (vim.visualMode) {\n                if (!vim.visualLine) {\n                    vim.visualLine = true;\n                }\n            }\n            else {\n                var operatorArgs = vim.inputState.operatorArgs;\n                if (operatorArgs) {\n                    operatorArgs.linewise = true;\n                }\n                tmp.end.line--;\n            }\n        }\n        else if (character === 't') {\n            tmp = expandTagUnderCursor(cm, head, inclusive);\n        }\n        else if (character === 's') {\n            var content = cm.getLine(head.line);\n            if (head.ch > 0 && isEndOfSentenceSymbol(content[head.ch])) {\n                head.ch -= 1;\n            }\n            var end = getSentence(cm, head, motionArgs.repeat, 1, inclusive);\n            var start = getSentence(cm, head, motionArgs.repeat, -1, inclusive);\n            if (isWhiteSpaceString(cm.getLine(start.line)[start.ch])\n                && isWhiteSpaceString(cm.getLine(end.line)[end.ch - 1])) {\n                start = { line: start.line, ch: start.ch + 1 };\n            }\n            tmp = { start: start, end: end };\n        }\n        else {\n            return null;\n        }\n        if (!cm.state.vim.visualMode) {\n            return [tmp.start, tmp.end];\n        }\n        else {\n            return expandSelection(cm, tmp.start, tmp.end);\n        }\n    },\n    repeatLastCharacterSearch: function (cm, head, motionArgs) {\n        var lastSearch = vimGlobalState.lastCharacterSearch;\n        var repeat = motionArgs.repeat;\n        var forward = motionArgs.forward === lastSearch.forward;\n        var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);\n        cm.moveH(-increment, 'char');\n        motionArgs.inclusive = forward ? true : false;\n        var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);\n        if (!curEnd) {\n            cm.moveH(increment, 'char');\n            return head;\n        }\n        curEnd.ch += increment;\n        return curEnd;\n    }\n};\nfunction defineMotion(name, fn) {\n    motions[name] = fn;\n}\nfunction fillArray(val, times) {\n    var arr = [];\n    for (var i = 0; i < times; i++) {\n        arr.push(val);\n    }\n    return arr;\n}\nvar operators = {\n    change: function (cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        var anchor = ranges[0].anchor, head = ranges[0].head;\n        if (!vim.visualMode) {\n            text = cm.getRange(anchor, head);\n            var lastState = vim.lastEditInputState || {};\n            if (lastState.motion == \"moveByWords\" && !isWhiteSpaceString(text)) {\n                var match = (/\\s+$/).exec(text);\n                if (match && lastState.motionArgs && lastState.motionArgs.forward) {\n                    head = offsetCursor(head, 0, -match[0].length);\n                    text = text.slice(0, -match[0].length);\n                }\n            }\n            var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE);\n            var wasLastLine = cm.firstLine() == cm.lastLine();\n            if (head.line > cm.lastLine() && args.linewise && !wasLastLine) {\n                cm.replaceRange('', prevLineEnd, head);\n            }\n            else {\n                cm.replaceRange('', anchor, head);\n            }\n            if (args.linewise) {\n                if (!wasLastLine) {\n                    cm.setCursor(prevLineEnd);\n                    CodeMirror.commands.newlineAndIndent(cm);\n                }\n                anchor.ch = Number.MAX_VALUE;\n            }\n            finalHead = anchor;\n        }\n        else if (args.fullLine) {\n            head.ch = Number.MAX_VALUE;\n            head.line--;\n            cm.setSelection(anchor, head);\n            text = cm.getSelection();\n            cm.replaceSelection(\"\");\n            finalHead = anchor;\n        }\n        else {\n            text = cm.getSelection();\n            var replacement = fillArray('', ranges.length);\n            cm.replaceSelections(replacement);\n            finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n        }\n        vimGlobalState.registerController.pushText(args.registerName, 'change', text, args.linewise, ranges.length > 1);\n        actions.enterInsertMode(cm, { head: finalHead }, cm.state.vim);\n    },\n    'delete': function (cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        if (!vim.visualBlock) {\n            var anchor = ranges[0].anchor, head = ranges[0].head;\n            if (args.linewise &&\n                head.line != cm.firstLine() &&\n                anchor.line == cm.lastLine() &&\n                anchor.line == head.line - 1) {\n                if (anchor.line == cm.firstLine()) {\n                    anchor.ch = 0;\n                }\n                else {\n                    anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1));\n                }\n            }\n            text = cm.getRange(anchor, head);\n            cm.replaceRange('', anchor, head);\n            finalHead = anchor;\n            if (args.linewise) {\n                finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor);\n            }\n        }\n        else {\n            text = cm.getSelection();\n            var replacement = fillArray('', ranges.length);\n            cm.replaceSelections(replacement);\n            finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n        }\n        vimGlobalState.registerController.pushText(args.registerName, 'delete', text, args.linewise, vim.visualBlock);\n        return clipCursorToContent(cm, finalHead);\n    },\n    indent: function (cm, args, ranges) {\n        var vim = cm.state.vim;\n        if (cm.indentMore) {\n            var repeat = (vim.visualMode) ? args.repeat : 1;\n            for (var j = 0; j < repeat; j++) {\n                if (args.indentRight)\n                    cm.indentMore();\n                else\n                    cm.indentLess();\n            }\n        }\n        else {\n            var startLine = ranges[0].anchor.line;\n            var endLine = vim.visualBlock ?\n                ranges[ranges.length - 1].anchor.line :\n                ranges[0].head.line;\n            var repeat = (vim.visualMode) ? args.repeat : 1;\n            if (args.linewise) {\n                endLine--;\n            }\n            for (var i = startLine; i <= endLine; i++) {\n                for (var j = 0; j < repeat; j++) {\n                    cm.indentLine(i, args.indentRight);\n                }\n            }\n        }\n        return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n    },\n    indentAuto: function (cm, _args, ranges) {\n        if (ranges.length > 1) { // ace_patch\n            cm.setSelection(ranges[0].anchor, ranges[ranges.length - 1].head);\n        }\n        cm.execCommand(\"indentAuto\");\n        return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n    },\n    changeCase: function (cm, args, ranges, oldAnchor, newHead) {\n        var selections = cm.getSelections();\n        var swapped = [];\n        var toLower = args.toLower;\n        for (var j = 0; j < selections.length; j++) {\n            var toSwap = selections[j];\n            var text = '';\n            if (toLower === true) {\n                text = toSwap.toLowerCase();\n            }\n            else if (toLower === false) {\n                text = toSwap.toUpperCase();\n            }\n            else {\n                for (var i = 0; i < toSwap.length; i++) {\n                    var character = toSwap.charAt(i);\n                    text += isUpperCase(character) ? character.toLowerCase() :\n                        character.toUpperCase();\n                }\n            }\n            swapped.push(text);\n        }\n        cm.replaceSelections(swapped);\n        if (args.shouldMoveCursor) {\n            return newHead;\n        }\n        else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) {\n            return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor);\n        }\n        else if (args.linewise) {\n            return oldAnchor;\n        }\n        else {\n            return cursorMin(ranges[0].anchor, ranges[0].head);\n        }\n    },\n    yank: function (cm, args, ranges, oldAnchor) {\n        var vim = cm.state.vim;\n        var text = cm.getSelection();\n        var endPos = vim.visualMode\n            ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor)\n            : oldAnchor;\n        vimGlobalState.registerController.pushText(args.registerName, 'yank', text, args.linewise, vim.visualBlock);\n        return endPos;\n    }\n};\nfunction defineOperator(name, fn) {\n    operators[name] = fn;\n}\nvar actions = {\n    jumpListWalk: function (cm, actionArgs, vim) {\n        if (vim.visualMode) {\n            return;\n        }\n        var repeat = actionArgs.repeat;\n        var forward = actionArgs.forward;\n        var jumpList = vimGlobalState.jumpList;\n        var mark = jumpList.move(cm, forward ? repeat : -repeat);\n        var markPos = mark ? mark.find() : undefined;\n        markPos = markPos ? markPos : cm.getCursor();\n        cm.setCursor(markPos);\n        cm.ace.curOp.command.scrollIntoView = \"center-animate\"; // ace_patch\n    },\n    scroll: function (cm, actionArgs, vim) {\n        if (vim.visualMode) {\n            return;\n        }\n        var repeat = actionArgs.repeat || 1;\n        var lineHeight = cm.defaultTextHeight();\n        var top = cm.getScrollInfo().top;\n        var delta = lineHeight * repeat;\n        var newPos = actionArgs.forward ? top + delta : top - delta;\n        var cursor = copyCursor(cm.getCursor());\n        var cursorCoords = cm.charCoords(cursor, 'local');\n        if (actionArgs.forward) {\n            if (newPos > cursorCoords.top) {\n                cursor.line += (newPos - cursorCoords.top) / lineHeight;\n                cursor.line = Math.ceil(cursor.line);\n                cm.setCursor(cursor);\n                cursorCoords = cm.charCoords(cursor, 'local');\n                cm.scrollTo(null, cursorCoords.top);\n            }\n            else {\n                cm.scrollTo(null, newPos);\n            }\n        }\n        else {\n            var newBottom = newPos + cm.getScrollInfo().clientHeight;\n            if (newBottom < cursorCoords.bottom) {\n                cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;\n                cursor.line = Math.floor(cursor.line);\n                cm.setCursor(cursor);\n                cursorCoords = cm.charCoords(cursor, 'local');\n                cm.scrollTo(null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);\n            }\n            else {\n                cm.scrollTo(null, newPos);\n            }\n        }\n    },\n    scrollToCursor: function (cm, actionArgs) {\n        var lineNum = cm.getCursor().line;\n        var charCoords = cm.charCoords(new Pos(lineNum, 0), 'local');\n        var height = cm.getScrollInfo().clientHeight;\n        var y = charCoords.top;\n        switch (actionArgs.position) {\n            case 'center':\n                y = charCoords.bottom - height / 2;\n                break;\n            case 'bottom':\n                var lineLastCharPos = new Pos(lineNum, cm.getLine(lineNum).length - 1);\n                var lineLastCharCoords = cm.charCoords(lineLastCharPos, 'local');\n                var lineHeight = lineLastCharCoords.bottom - y;\n                y = y - height + lineHeight;\n                break;\n        }\n        cm.scrollTo(null, y);\n    },\n    replayMacro: function (cm, actionArgs, vim) {\n        var registerName = actionArgs.selectedCharacter;\n        var repeat = actionArgs.repeat;\n        var macroModeState = vimGlobalState.macroModeState;\n        if (registerName == '@') {\n            registerName = macroModeState.latestRegister;\n        }\n        else {\n            macroModeState.latestRegister = registerName;\n        }\n        while (repeat--) {\n            executeMacroRegister(cm, vim, macroModeState, registerName);\n        }\n    },\n    enterMacroRecordMode: function (cm, actionArgs) {\n        var macroModeState = vimGlobalState.macroModeState;\n        var registerName = actionArgs.selectedCharacter;\n        if (vimGlobalState.registerController.isValidRegister(registerName)) {\n            macroModeState.enterMacroRecordMode(cm, registerName);\n        }\n    },\n    toggleOverwrite: function (cm) {\n        if (!cm.state.overwrite) {\n            cm.toggleOverwrite(true);\n            cm.setOption('keyMap', 'vim-replace');\n            CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"replace\" });\n        }\n        else {\n            cm.toggleOverwrite(false);\n            cm.setOption('keyMap', 'vim-insert');\n            CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"insert\" });\n        }\n    },\n    enterInsertMode: function (cm, actionArgs, vim) {\n        if (cm.getOption('readOnly')) {\n            return;\n        }\n        vim.insertMode = true;\n        vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;\n        var insertAt = (actionArgs) ? actionArgs.insertAt : null;\n        var sel = vim.sel;\n        var head = actionArgs.head || cm.getCursor('head');\n        var height = cm.listSelections().length;\n        if (insertAt == 'eol') {\n            head = new Pos(head.line, lineLength(cm, head.line));\n        }\n        else if (insertAt == 'bol') {\n            head = new Pos(head.line, 0);\n        }\n        else if (insertAt == 'charAfter') {\n            var newPosition = updateSelectionForSurrogateCharacters(cm, head, offsetCursor(head, 0, 1));\n            head = newPosition.end;\n        }\n        else if (insertAt == 'firstNonBlank') {\n            var newPosition = updateSelectionForSurrogateCharacters(cm, head, motions.moveToFirstNonWhiteSpaceCharacter(cm, head));\n            head = newPosition.end;\n        }\n        else if (insertAt == 'startOfSelectedArea') {\n            if (!vim.visualMode)\n                return;\n            if (!vim.visualBlock) {\n                if (sel.head.line < sel.anchor.line) {\n                    head = sel.head;\n                }\n                else {\n                    head = new Pos(sel.anchor.line, 0);\n                }\n            }\n            else {\n                head = new Pos(Math.min(sel.head.line, sel.anchor.line), Math.min(sel.head.ch, sel.anchor.ch));\n                height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n            }\n        }\n        else if (insertAt == 'endOfSelectedArea') {\n            if (!vim.visualMode)\n                return;\n            if (!vim.visualBlock) {\n                if (sel.head.line >= sel.anchor.line) {\n                    head = offsetCursor(sel.head, 0, 1);\n                }\n                else {\n                    head = new Pos(sel.anchor.line, 0);\n                }\n            }\n            else {\n                head = new Pos(Math.min(sel.head.line, sel.anchor.line), Math.max(sel.head.ch, sel.anchor.ch) + 1);\n                height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n            }\n        }\n        else if (insertAt == 'inplace') {\n            if (vim.visualMode) {\n                return;\n            }\n        }\n        else if (insertAt == 'lastEdit') {\n            head = getLastEditPos(cm) || head;\n        }\n        cm.setOption('disableInput', false);\n        if (actionArgs && actionArgs.replace) {\n            cm.toggleOverwrite(true);\n            cm.setOption('keyMap', 'vim-replace');\n            CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"replace\" });\n        }\n        else {\n            cm.toggleOverwrite(false);\n            cm.setOption('keyMap', 'vim-insert');\n            CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"insert\" });\n        }\n        if (!vimGlobalState.macroModeState.isPlaying) {\n            cm.on('change', onChange);\n            CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n        }\n        if (vim.visualMode) {\n            exitVisualMode(cm);\n        }\n        selectForInsert(cm, head, height);\n    },\n    toggleVisualMode: function (cm, actionArgs, vim) {\n        var repeat = actionArgs.repeat;\n        var anchor = cm.getCursor();\n        var head;\n        if (!vim.visualMode) {\n            vim.visualMode = true;\n            vim.visualLine = !!actionArgs.linewise;\n            vim.visualBlock = !!actionArgs.blockwise;\n            head = clipCursorToContent(cm, new Pos(anchor.line, anchor.ch + repeat - 1));\n            var newPosition = updateSelectionForSurrogateCharacters(cm, anchor, head);\n            vim.sel = {\n                anchor: newPosition.start,\n                head: newPosition.end\n            };\n            CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\" });\n            updateCmSelection(cm);\n            updateMark(cm, vim, '<', cursorMin(anchor, head));\n            updateMark(cm, vim, '>', cursorMax(anchor, head));\n        }\n        else if (vim.visualLine ^ actionArgs.linewise ||\n            vim.visualBlock ^ actionArgs.blockwise) {\n            vim.visualLine = !!actionArgs.linewise;\n            vim.visualBlock = !!actionArgs.blockwise;\n            CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\" });\n            updateCmSelection(cm);\n        }\n        else {\n            exitVisualMode(cm);\n        }\n    },\n    reselectLastSelection: function (cm, _actionArgs, vim) {\n        var lastSelection = vim.lastSelection;\n        if (vim.visualMode) {\n            updateLastSelection(cm, vim);\n        }\n        if (lastSelection) {\n            var anchor = lastSelection.anchorMark.find();\n            var head = lastSelection.headMark.find();\n            if (!anchor || !head) {\n                return;\n            }\n            vim.sel = {\n                anchor: anchor,\n                head: head\n            };\n            vim.visualMode = true;\n            vim.visualLine = lastSelection.visualLine;\n            vim.visualBlock = lastSelection.visualBlock;\n            updateCmSelection(cm);\n            updateMark(cm, vim, '<', cursorMin(anchor, head));\n            updateMark(cm, vim, '>', cursorMax(anchor, head));\n            CodeMirror.signal(cm, 'vim-mode-change', {\n                mode: 'visual',\n                subMode: vim.visualLine ? 'linewise' :\n                    vim.visualBlock ? 'blockwise' : ''\n            });\n        }\n    },\n    joinLines: function (cm, actionArgs, vim) {\n        var curStart, curEnd;\n        if (vim.visualMode) {\n            curStart = cm.getCursor('anchor');\n            curEnd = cm.getCursor('head');\n            if (cursorIsBefore(curEnd, curStart)) {\n                var tmp = curEnd;\n                curEnd = curStart;\n                curStart = tmp;\n            }\n            curEnd.ch = lineLength(cm, curEnd.line) - 1;\n        }\n        else {\n            var repeat = Math.max(actionArgs.repeat, 2);\n            curStart = cm.getCursor();\n            curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1, Infinity));\n        }\n        var finalCh = 0;\n        for (var i = curStart.line; i < curEnd.line; i++) {\n            finalCh = lineLength(cm, curStart.line);\n            var text = '';\n            var nextStartCh = 0;\n            if (!actionArgs.keepSpaces) {\n                var nextLine = cm.getLine(curStart.line + 1);\n                nextStartCh = nextLine.search(/\\S/);\n                if (nextStartCh == -1) {\n                    nextStartCh = nextLine.length;\n                }\n                else {\n                    text = \" \";\n                }\n            }\n            cm.replaceRange(text, new Pos(curStart.line, finalCh), new Pos(curStart.line + 1, nextStartCh));\n        }\n        var curFinalPos = clipCursorToContent(cm, new Pos(curStart.line, finalCh));\n        if (vim.visualMode) {\n            exitVisualMode(cm, false);\n        }\n        cm.setCursor(curFinalPos);\n    },\n    newLineAndEnterInsertMode: function (cm, actionArgs, vim) {\n        vim.insertMode = true;\n        var insertAt = copyCursor(cm.getCursor());\n        if (insertAt.line === cm.firstLine() && !actionArgs.after) {\n            cm.replaceRange('\\n', new Pos(cm.firstLine(), 0));\n            cm.setCursor(cm.firstLine(), 0);\n        }\n        else {\n            insertAt.line = (actionArgs.after) ? insertAt.line :\n                insertAt.line - 1;\n            insertAt.ch = lineLength(cm, insertAt.line);\n            cm.setCursor(insertAt);\n            var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||\n                CodeMirror.commands.newlineAndIndent;\n            newlineFn(cm);\n        }\n        this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);\n    },\n    paste: function (cm, actionArgs, vim) {\n        var _this = this;\n        var register = vimGlobalState.registerController.getRegister(actionArgs.registerName);\n        if (actionArgs.registerName === '+') {\n            navigator.clipboard.readText().then(function (value) {\n                _this.continuePaste(cm, actionArgs, vim, value, register);\n            });\n        }\n        else {\n            var text = register.toString();\n            this.continuePaste(cm, actionArgs, vim, text, register);\n        }\n    },\n    continuePaste: function (cm, actionArgs, vim, text, register) {\n        var cur = copyCursor(cm.getCursor());\n        if (!text) {\n            return;\n        }\n        if (actionArgs.matchIndent) {\n            var tabSize = cm.getOption(\"tabSize\");\n            var whitespaceLength = function (str) {\n                var tabs = (str.split(\"\\t\").length - 1);\n                var spaces = (str.split(\" \").length - 1);\n                return tabs * tabSize + spaces * 1;\n            };\n            var currentLine = cm.getLine(cm.getCursor().line);\n            var indent = whitespaceLength(currentLine.match(/^\\s*/)[0]);\n            var chompedText = text.replace(/\\n$/, '');\n            var wasChomped = text !== chompedText;\n            var firstIndent = whitespaceLength(text.match(/^\\s*/)[0]);\n            var text = chompedText.replace(/^\\s*/gm, function (wspace) {\n                var newIndent = indent + (whitespaceLength(wspace) - firstIndent);\n                if (newIndent < 0) {\n                    return \"\";\n                }\n                else if (cm.getOption(\"indentWithTabs\")) {\n                    var quotient = Math.floor(newIndent / tabSize);\n                    return Array(quotient + 1).join('\\t');\n                }\n                else {\n                    return Array(newIndent + 1).join(' ');\n                }\n            });\n            text += wasChomped ? \"\\n\" : \"\";\n        }\n        if (actionArgs.repeat > 1) {\n            var text = Array(actionArgs.repeat + 1).join(text);\n        }\n        var linewise = register.linewise;\n        var blockwise = register.blockwise;\n        if (blockwise) {\n            text = text.split('\\n');\n            if (linewise) {\n                text.pop();\n            }\n            for (var i = 0; i < text.length; i++) {\n                text[i] = (text[i] == '') ? ' ' : text[i];\n            }\n            cur.ch += actionArgs.after ? 1 : 0;\n            cur.ch = Math.min(lineLength(cm, cur.line), cur.ch);\n        }\n        else if (linewise) {\n            if (vim.visualMode) {\n                text = vim.visualLine ? text.slice(0, -1) : '\\n' + text.slice(0, text.length - 1) + '\\n';\n            }\n            else if (actionArgs.after) {\n                text = '\\n' + text.slice(0, text.length - 1);\n                cur.ch = lineLength(cm, cur.line);\n            }\n            else {\n                cur.ch = 0;\n            }\n        }\n        else {\n            cur.ch += actionArgs.after ? 1 : 0;\n        }\n        var curPosFinal;\n        var idx;\n        if (vim.visualMode) {\n            vim.lastPastedText = text;\n            var lastSelectionCurEnd;\n            var selectedArea = getSelectedAreaRange(cm, vim);\n            var selectionStart = selectedArea[0];\n            var selectionEnd = selectedArea[1];\n            var selectedText = cm.getSelection();\n            var selections = cm.listSelections();\n            var emptyStrings = new Array(selections.length).join('1').split('1');\n            if (vim.lastSelection) {\n                lastSelectionCurEnd = vim.lastSelection.headMark.find();\n            }\n            vimGlobalState.registerController.unnamedRegister.setText(selectedText);\n            if (blockwise) {\n                cm.replaceSelections(emptyStrings);\n                selectionEnd = new Pos(selectionStart.line + text.length - 1, selectionStart.ch);\n                cm.setCursor(selectionStart);\n                selectBlock(cm, selectionEnd);\n                cm.replaceSelections(text);\n                curPosFinal = selectionStart;\n            }\n            else if (vim.visualBlock) {\n                cm.replaceSelections(emptyStrings);\n                cm.setCursor(selectionStart);\n                cm.replaceRange(text, selectionStart, selectionStart);\n                curPosFinal = selectionStart;\n            }\n            else {\n                cm.replaceRange(text, selectionStart, selectionEnd);\n                curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1);\n            }\n            if (lastSelectionCurEnd) {\n                vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd);\n            }\n            if (linewise) {\n                curPosFinal.ch = 0;\n            }\n        }\n        else {\n            if (blockwise) {\n                cm.setCursor(cur);\n                for (var i = 0; i < text.length; i++) {\n                    var line = cur.line + i;\n                    if (line > cm.lastLine()) {\n                        cm.replaceRange('\\n', new Pos(line, 0));\n                    }\n                    var lastCh = lineLength(cm, line);\n                    if (lastCh < cur.ch) {\n                        extendLineToColumn(cm, line, cur.ch);\n                    }\n                }\n                cm.setCursor(cur);\n                selectBlock(cm, new Pos(cur.line + text.length - 1, cur.ch));\n                cm.replaceSelections(text);\n                curPosFinal = cur;\n            }\n            else {\n                cm.replaceRange(text, cur);\n                if (linewise && actionArgs.after) {\n                    curPosFinal = new Pos(cur.line + 1, findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)));\n                }\n                else if (linewise && !actionArgs.after) {\n                    curPosFinal = new Pos(cur.line, findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)));\n                }\n                else if (!linewise && actionArgs.after) {\n                    idx = cm.indexFromPos(cur);\n                    curPosFinal = cm.posFromIndex(idx + text.length - 1);\n                }\n                else {\n                    idx = cm.indexFromPos(cur);\n                    curPosFinal = cm.posFromIndex(idx + text.length);\n                }\n            }\n        }\n        if (vim.visualMode) {\n            exitVisualMode(cm, false);\n        }\n        cm.setCursor(curPosFinal);\n    },\n    undo: function (cm, actionArgs) {\n        cm.operation(function () {\n            repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();\n            cm.setCursor(clipCursorToContent(cm, cm.getCursor('start')));\n        });\n    },\n    redo: function (cm, actionArgs) {\n        repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();\n    },\n    setRegister: function (_cm, actionArgs, vim) {\n        vim.inputState.registerName = actionArgs.selectedCharacter;\n    },\n    setMark: function (cm, actionArgs, vim) {\n        var markName = actionArgs.selectedCharacter;\n        updateMark(cm, vim, markName, cm.getCursor());\n    },\n    replace: function (cm, actionArgs, vim) {\n        var replaceWith = actionArgs.selectedCharacter;\n        var curStart = cm.getCursor();\n        var replaceTo;\n        var curEnd;\n        var selections = cm.listSelections();\n        if (vim.visualMode) {\n            curStart = cm.getCursor('start');\n            curEnd = cm.getCursor('end');\n        }\n        else {\n            var line = cm.getLine(curStart.line);\n            replaceTo = curStart.ch + actionArgs.repeat;\n            if (replaceTo > line.length) {\n                replaceTo = line.length;\n            }\n            curEnd = new Pos(curStart.line, replaceTo);\n        }\n        var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd);\n        curStart = newPositions.start;\n        curEnd = newPositions.end;\n        if (replaceWith == '\\n') {\n            if (!vim.visualMode)\n                cm.replaceRange('', curStart, curEnd);\n            (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);\n        }\n        else {\n            var replaceWithStr = cm.getRange(curStart, curEnd);\n            replaceWithStr = replaceWithStr.replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, replaceWith);\n            replaceWithStr = replaceWithStr.replace(/[^\\n]/g, replaceWith);\n            if (vim.visualBlock) {\n                var spaces = new Array(cm.getOption(\"tabSize\") + 1).join(' ');\n                replaceWithStr = cm.getSelection();\n                replaceWithStr = replaceWithStr.replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, replaceWith);\n                replaceWithStr = replaceWithStr.replace(/\\t/g, spaces).replace(/[^\\n]/g, replaceWith).split('\\n');\n                cm.replaceSelections(replaceWithStr);\n            }\n            else {\n                cm.replaceRange(replaceWithStr, curStart, curEnd);\n            }\n            if (vim.visualMode) {\n                curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ?\n                    selections[0].anchor : selections[0].head;\n                cm.setCursor(curStart);\n                exitVisualMode(cm, false);\n            }\n            else {\n                cm.setCursor(offsetCursor(curEnd, 0, -1));\n            }\n        }\n    },\n    incrementNumberToken: function (cm, actionArgs) {\n        var cur = cm.getCursor();\n        var lineStr = cm.getLine(cur.line);\n        var re = /(-?)(?:(0x)([\\da-f]+)|(0b|0|)(\\d+))/gi;\n        var match;\n        var start;\n        var end;\n        var numberStr;\n        while ((match = re.exec(lineStr)) !== null) {\n            start = match.index;\n            end = start + match[0].length;\n            if (cur.ch < end)\n                break;\n        }\n        if (!actionArgs.backtrack && (end <= cur.ch))\n            return;\n        if (match) {\n            var baseStr = match[2] || match[4];\n            var digits = match[3] || match[5];\n            var increment = actionArgs.increase ? 1 : -1;\n            var base = { '0b': 2, '0': 8, '': 10, '0x': 16 }[baseStr.toLowerCase()];\n            var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat);\n            numberStr = number.toString(base);\n            var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : '';\n            if (numberStr.charAt(0) === '-') {\n                numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1);\n            }\n            else {\n                numberStr = baseStr + zeroPadding + numberStr;\n            }\n            var from = new Pos(cur.line, start);\n            var to = new Pos(cur.line, end);\n            cm.replaceRange(numberStr, from, to);\n        }\n        else {\n            return;\n        }\n        cm.setCursor(new Pos(cur.line, start + numberStr.length - 1));\n    },\n    repeatLastEdit: function (cm, actionArgs, vim) {\n        var lastEditInputState = vim.lastEditInputState;\n        if (!lastEditInputState) {\n            return;\n        }\n        var repeat = actionArgs.repeat;\n        if (repeat && actionArgs.repeatIsExplicit) {\n            vim.lastEditInputState.repeatOverride = repeat;\n        }\n        else {\n            repeat = vim.lastEditInputState.repeatOverride || repeat;\n        }\n        repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);\n    },\n    indent: function (cm, actionArgs) {\n        cm.indentLine(cm.getCursor().line, actionArgs.indentRight);\n    },\n    exitInsertMode: exitInsertMode\n};\nfunction defineAction(name, fn) {\n    actions[name] = fn;\n}\nfunction clipCursorToContent(cm, cur, oldCur) {\n    var vim = cm.state.vim;\n    var includeLineBreak = vim.insertMode || vim.visualMode;\n    var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine());\n    var text = cm.getLine(line);\n    var maxCh = text.length - 1 + !!includeLineBreak;\n    var ch = Math.min(Math.max(0, cur.ch), maxCh);\n    var charCode = text.charCodeAt(ch);\n    if (0xDC00 < charCode && charCode < 0xDFFF) {\n        var direction = 1;\n        if (oldCur && oldCur.line == line) {\n            if (oldCur.ch > ch) {\n                direction = -1;\n            }\n        }\n        ch += direction;\n        if (ch > maxCh)\n            ch -= 2;\n    }\n    return new Pos(line, ch);\n}\nfunction copyArgs(args) {\n    var ret = {};\n    for (var prop in args) {\n        if (args.hasOwnProperty(prop)) {\n            ret[prop] = args[prop];\n        }\n    }\n    return ret;\n}\nfunction offsetCursor(cur, offsetLine, offsetCh) {\n    if (typeof offsetLine === 'object') {\n        offsetCh = offsetLine.ch;\n        offsetLine = offsetLine.line;\n    }\n    return new Pos(cur.line + offsetLine, cur.ch + offsetCh);\n}\nfunction commandMatches(keys, keyMap, context, inputState) {\n    var match, partial = [], full = [];\n    for (var i = 0; i < keyMap.length; i++) {\n        var command = keyMap[i];\n        if (context == 'insert' && command.context != 'insert' ||\n            command.context && command.context != context ||\n            inputState.operator && command.type == 'action' ||\n            !(match = commandMatch(keys, command.keys))) {\n            continue;\n        }\n        if (match == 'partial') {\n            partial.push(command);\n        }\n        if (match == 'full') {\n            full.push(command);\n        }\n    }\n    return {\n        partial: partial.length && partial,\n        full: full.length && full\n    };\n}\nfunction commandMatch(pressed, mapped) {\n    if (mapped.slice(-11) == '') {\n        var prefixLen = mapped.length - 11;\n        var pressedPrefix = pressed.slice(0, prefixLen);\n        var mappedPrefix = mapped.slice(0, prefixLen);\n        return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' :\n            mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false;\n    }\n    else {\n        return pressed == mapped ? 'full' :\n            mapped.indexOf(pressed) == 0 ? 'partial' : false;\n    }\n}\nfunction lastChar(keys) {\n    var match = /^.*(<[^>]+>)$/.exec(keys);\n    var selectedCharacter = match ? match[1] : keys.slice(-1);\n    if (selectedCharacter.length > 1) {\n        switch (selectedCharacter) {\n            case '':\n                selectedCharacter = '\\n';\n                break;\n            case '':\n                selectedCharacter = ' ';\n                break;\n            default:\n                selectedCharacter = '';\n                break;\n        }\n    }\n    return selectedCharacter;\n}\nfunction repeatFn(cm, fn, repeat) {\n    return function () {\n        for (var i = 0; i < repeat; i++) {\n            fn(cm);\n        }\n    };\n}\nfunction copyCursor(cur) {\n    return new Pos(cur.line, cur.ch);\n}\nfunction cursorEqual(cur1, cur2) {\n    return cur1.ch == cur2.ch && cur1.line == cur2.line;\n}\nfunction cursorIsBefore(cur1, cur2) {\n    if (cur1.line < cur2.line) {\n        return true;\n    }\n    if (cur1.line == cur2.line && cur1.ch < cur2.ch) {\n        return true;\n    }\n    return false;\n}\nfunction cursorMin(cur1, cur2) {\n    if (arguments.length > 2) {\n        cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1));\n    }\n    return cursorIsBefore(cur1, cur2) ? cur1 : cur2;\n}\nfunction cursorMax(cur1, cur2) {\n    if (arguments.length > 2) {\n        cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1));\n    }\n    return cursorIsBefore(cur1, cur2) ? cur2 : cur1;\n}\nfunction cursorIsBetween(cur1, cur2, cur3) {\n    var cur1before2 = cursorIsBefore(cur1, cur2);\n    var cur2before3 = cursorIsBefore(cur2, cur3);\n    return cur1before2 && cur2before3;\n}\nfunction lineLength(cm, lineNum) {\n    return cm.getLine(lineNum).length;\n}\nfunction trim(s) {\n    if (s.trim) {\n        return s.trim();\n    }\n    return s.replace(/^\\s+|\\s+$/g, '');\n}\nfunction escapeRegex(s) {\n    return s.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g, '\\\\$1');\n}\nfunction extendLineToColumn(cm, lineNum, column) {\n    var endCh = lineLength(cm, lineNum);\n    var spaces = new Array(column - endCh + 1).join(' ');\n    cm.setCursor(new Pos(lineNum, endCh));\n    cm.replaceRange(spaces, cm.getCursor());\n}\nfunction selectBlock(cm, selectionEnd) {\n    var selections = [], ranges = cm.listSelections();\n    var head = copyCursor(cm.clipPos(selectionEnd));\n    var isClipped = !cursorEqual(selectionEnd, head);\n    var curHead = cm.getCursor('head');\n    var primIndex = getIndex(ranges, curHead);\n    var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor);\n    var max = ranges.length - 1;\n    var index = max - primIndex > primIndex ? max : 0;\n    var base = ranges[index].anchor;\n    var firstLine = Math.min(base.line, head.line);\n    var lastLine = Math.max(base.line, head.line);\n    var baseCh = base.ch, headCh = head.ch;\n    var dir = ranges[index].head.ch - baseCh;\n    var newDir = headCh - baseCh;\n    if (dir > 0 && newDir <= 0) {\n        baseCh++;\n        if (!isClipped) {\n            headCh--;\n        }\n    }\n    else if (dir < 0 && newDir >= 0) {\n        baseCh--;\n        if (!wasClipped) {\n            headCh++;\n        }\n    }\n    else if (dir < 0 && newDir == -1) {\n        baseCh--;\n        headCh++;\n    }\n    for (var line = firstLine; line <= lastLine; line++) {\n        var range = { anchor: new Pos(line, baseCh), head: new Pos(line, headCh) };\n        selections.push(range);\n    }\n    cm.setSelections(selections);\n    selectionEnd.ch = headCh;\n    base.ch = baseCh;\n    return base;\n}\nfunction selectForInsert(cm, head, height) {\n    var sel = [];\n    for (var i = 0; i < height; i++) {\n        var lineHead = offsetCursor(head, i, 0);\n        sel.push({ anchor: lineHead, head: lineHead });\n    }\n    cm.setSelections(sel, 0);\n}\nfunction getIndex(ranges, cursor, end) {\n    for (var i = 0; i < ranges.length; i++) {\n        var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor);\n        var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor);\n        if (atAnchor || atHead) {\n            return i;\n        }\n    }\n    return -1;\n}\nfunction getSelectedAreaRange(cm, vim) {\n    var lastSelection = vim.lastSelection;\n    var getCurrentSelectedAreaRange = function () {\n        var selections = cm.listSelections();\n        var start = selections[0];\n        var end = selections[selections.length - 1];\n        var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head;\n        var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor;\n        return [selectionStart, selectionEnd];\n    };\n    var getLastSelectedAreaRange = function () {\n        var selectionStart = cm.getCursor();\n        var selectionEnd = cm.getCursor();\n        var block = lastSelection.visualBlock;\n        if (block) {\n            var width = block.width;\n            var height = block.height;\n            selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width);\n            var selections = [];\n            for (var i = selectionStart.line; i < selectionEnd.line; i++) {\n                var anchor = new Pos(i, selectionStart.ch);\n                var head = new Pos(i, selectionEnd.ch);\n                var range = { anchor: anchor, head: head };\n                selections.push(range);\n            }\n            cm.setSelections(selections);\n        }\n        else {\n            var start = lastSelection.anchorMark.find();\n            var end = lastSelection.headMark.find();\n            var line = end.line - start.line;\n            var ch = end.ch - start.ch;\n            selectionEnd = { line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch };\n            if (lastSelection.visualLine) {\n                selectionStart = new Pos(selectionStart.line, 0);\n                selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line));\n            }\n            cm.setSelection(selectionStart, selectionEnd);\n        }\n        return [selectionStart, selectionEnd];\n    };\n    if (!vim.visualMode) {\n        return getLastSelectedAreaRange();\n    }\n    else {\n        return getCurrentSelectedAreaRange();\n    }\n}\nfunction updateLastSelection(cm, vim) {\n    var anchor = vim.sel.anchor;\n    var head = vim.sel.head;\n    if (vim.lastPastedText) {\n        head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length);\n        vim.lastPastedText = null;\n    }\n    vim.lastSelection = { 'anchorMark': cm.setBookmark(anchor),\n        'headMark': cm.setBookmark(head),\n        'anchor': copyCursor(anchor),\n        'head': copyCursor(head),\n        'visualMode': vim.visualMode,\n        'visualLine': vim.visualLine,\n        'visualBlock': vim.visualBlock };\n}\nfunction expandSelection(cm, start, end) {\n    var sel = cm.state.vim.sel;\n    var head = sel.head;\n    var anchor = sel.anchor;\n    var tmp;\n    if (cursorIsBefore(end, start)) {\n        tmp = end;\n        end = start;\n        start = tmp;\n    }\n    if (cursorIsBefore(head, anchor)) {\n        head = cursorMin(start, head);\n        anchor = cursorMax(anchor, end);\n    }\n    else {\n        anchor = cursorMin(start, anchor);\n        head = cursorMax(head, end);\n        head = offsetCursor(head, 0, -1);\n        if (head.ch == -1 && head.line != cm.firstLine()) {\n            head = new Pos(head.line - 1, lineLength(cm, head.line - 1));\n        }\n    }\n    return [anchor, head];\n}\nfunction updateCmSelection(cm, sel, mode) {\n    var vim = cm.state.vim;\n    sel = sel || vim.sel;\n    var mode = mode ||\n        vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char';\n    var cmSel = makeCmSelection(cm, sel, mode);\n    cm.setSelections(cmSel.ranges, cmSel.primary);\n}\nfunction makeCmSelection(cm, sel, mode, exclusive) {\n    var head = copyCursor(sel.head);\n    var anchor = copyCursor(sel.anchor);\n    if (mode == 'char') {\n        var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        head = offsetCursor(sel.head, 0, headOffset);\n        anchor = offsetCursor(sel.anchor, 0, anchorOffset);\n        return {\n            ranges: [{ anchor: anchor, head: head }],\n            primary: 0\n        };\n    }\n    else if (mode == 'line') {\n        if (!cursorIsBefore(sel.head, sel.anchor)) {\n            anchor.ch = 0;\n            var lastLine = cm.lastLine();\n            if (head.line > lastLine) {\n                head.line = lastLine;\n            }\n            head.ch = lineLength(cm, head.line);\n        }\n        else {\n            head.ch = 0;\n            anchor.ch = lineLength(cm, anchor.line);\n        }\n        return {\n            ranges: [{ anchor: anchor, head: head }],\n            primary: 0\n        };\n    }\n    else if (mode == 'block') {\n        var top = Math.min(anchor.line, head.line), fromCh = anchor.ch, bottom = Math.max(anchor.line, head.line), toCh = head.ch;\n        if (fromCh < toCh) {\n            toCh += 1;\n        }\n        else {\n            fromCh += 1;\n        }\n        ;\n        var height = bottom - top + 1;\n        var primary = head.line == top ? 0 : height - 1;\n        var ranges = [];\n        for (var i = 0; i < height; i++) {\n            ranges.push({\n                anchor: new Pos(top + i, fromCh),\n                head: new Pos(top + i, toCh)\n            });\n        }\n        return {\n            ranges: ranges,\n            primary: primary\n        };\n    }\n}\nfunction getHead(cm) {\n    var cur = cm.getCursor('head');\n    if (cm.getSelection().length == 1) {\n        cur = cursorMin(cur, cm.getCursor('anchor'));\n    }\n    return cur;\n}\nfunction exitVisualMode(cm, moveHead) {\n    var vim = cm.state.vim;\n    if (moveHead !== false) {\n        cm.setCursor(clipCursorToContent(cm, vim.sel.head));\n    }\n    updateLastSelection(cm, vim);\n    vim.visualMode = false;\n    vim.visualLine = false;\n    vim.visualBlock = false;\n    if (!vim.insertMode)\n        CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"normal\" });\n}\nfunction clipToLine(cm, curStart, curEnd) {\n    var selection = cm.getRange(curStart, curEnd);\n    if (/\\n\\s*$/.test(selection)) {\n        var lines = selection.split('\\n');\n        lines.pop();\n        var line;\n        for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {\n            curEnd.line--;\n            curEnd.ch = 0;\n        }\n        if (line) {\n            curEnd.line--;\n            curEnd.ch = lineLength(cm, curEnd.line);\n        }\n        else {\n            curEnd.ch = 0;\n        }\n    }\n}\nfunction expandSelectionToLine(_cm, curStart, curEnd) {\n    curStart.ch = 0;\n    curEnd.ch = 0;\n    curEnd.line++;\n}\nfunction findFirstNonWhiteSpaceCharacter(text) {\n    if (!text) {\n        return 0;\n    }\n    var firstNonWS = text.search(/\\S/);\n    return firstNonWS == -1 ? text.length : firstNonWS;\n}\nfunction expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) {\n    var cur = getHead(cm);\n    var line = cm.getLine(cur.line);\n    var idx = cur.ch;\n    var test = noSymbol ? wordCharTest[0] : bigWordCharTest[0];\n    while (!test(line.charAt(idx))) {\n        idx++;\n        if (idx >= line.length) {\n            return null;\n        }\n    }\n    if (bigWord) {\n        test = bigWordCharTest[0];\n    }\n    else {\n        test = wordCharTest[0];\n        if (!test(line.charAt(idx))) {\n            test = wordCharTest[1];\n        }\n    }\n    var end = idx, start = idx;\n    while (test(line.charAt(end)) && end < line.length) {\n        end++;\n    }\n    while (test(line.charAt(start)) && start >= 0) {\n        start--;\n    }\n    start++;\n    if (inclusive) {\n        var wordEnd = end;\n        while (/\\s/.test(line.charAt(end)) && end < line.length) {\n            end++;\n        }\n        if (wordEnd == end) {\n            var wordStart = start;\n            while (/\\s/.test(line.charAt(start - 1)) && start > 0) {\n                start--;\n            }\n            if (!start) {\n                start = wordStart;\n            }\n        }\n    }\n    return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) };\n}\nfunction expandTagUnderCursor(cm, head, inclusive) {\n    var cur = head;\n    if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) {\n        return { start: cur, end: cur };\n    }\n    var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head);\n    if (!tags || !tags.open || !tags.close) {\n        return { start: cur, end: cur };\n    }\n    if (inclusive) {\n        return { start: tags.open.from, end: tags.close.to };\n    }\n    return { start: tags.open.to, end: tags.close.from };\n}\nfunction recordJumpPosition(cm, oldCur, newCur) {\n    if (!cursorEqual(oldCur, newCur)) {\n        vimGlobalState.jumpList.add(cm, oldCur, newCur);\n    }\n}\nfunction recordLastCharacterSearch(increment, args) {\n    vimGlobalState.lastCharacterSearch.increment = increment;\n    vimGlobalState.lastCharacterSearch.forward = args.forward;\n    vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter;\n}\nvar symbolToMode = {\n    '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',\n    '[': 'section', ']': 'section',\n    '*': 'comment', '/': 'comment',\n    'm': 'method', 'M': 'method',\n    '#': 'preprocess'\n};\nvar findSymbolModes = {\n    bracket: {\n        isComplete: function (state) {\n            if (state.nextCh === state.symb) {\n                state.depth++;\n                if (state.depth >= 1)\n                    return true;\n            }\n            else if (state.nextCh === state.reverseSymb) {\n                state.depth--;\n            }\n            return false;\n        }\n    },\n    section: {\n        init: function (state) {\n            state.curMoveThrough = true;\n            state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';\n        },\n        isComplete: function (state) {\n            return state.index === 0 && state.nextCh === state.symb;\n        }\n    },\n    comment: {\n        isComplete: function (state) {\n            var found = state.lastCh === '*' && state.nextCh === '/';\n            state.lastCh = state.nextCh;\n            return found;\n        }\n    },\n    method: {\n        init: function (state) {\n            state.symb = (state.symb === 'm' ? '{' : '}');\n            state.reverseSymb = state.symb === '{' ? '}' : '{';\n        },\n        isComplete: function (state) {\n            if (state.nextCh === state.symb)\n                return true;\n            return false;\n        }\n    },\n    preprocess: {\n        init: function (state) {\n            state.index = 0;\n        },\n        isComplete: function (state) {\n            if (state.nextCh === '#') {\n                var token = state.lineText.match(/^#(\\w+)/)[1];\n                if (token === 'endif') {\n                    if (state.forward && state.depth === 0) {\n                        return true;\n                    }\n                    state.depth++;\n                }\n                else if (token === 'if') {\n                    if (!state.forward && state.depth === 0) {\n                        return true;\n                    }\n                    state.depth--;\n                }\n                if (token === 'else' && state.depth === 0)\n                    return true;\n            }\n            return false;\n        }\n    }\n};\nfunction findSymbol(cm, repeat, forward, symb) {\n    var cur = copyCursor(cm.getCursor());\n    var increment = forward ? 1 : -1;\n    var endLine = forward ? cm.lineCount() : -1;\n    var curCh = cur.ch;\n    var line = cur.line;\n    var lineText = cm.getLine(line);\n    var state = {\n        lineText: lineText,\n        nextCh: lineText.charAt(curCh),\n        lastCh: null,\n        index: curCh,\n        symb: symb,\n        reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],\n        forward: forward,\n        depth: 0,\n        curMoveThrough: false\n    };\n    var mode = symbolToMode[symb];\n    if (!mode)\n        return cur;\n    var init = findSymbolModes[mode].init;\n    var isComplete = findSymbolModes[mode].isComplete;\n    if (init) {\n        init(state);\n    }\n    while (line !== endLine && repeat) {\n        state.index += increment;\n        state.nextCh = state.lineText.charAt(state.index);\n        if (!state.nextCh) {\n            line += increment;\n            state.lineText = cm.getLine(line) || '';\n            if (increment > 0) {\n                state.index = 0;\n            }\n            else {\n                var lineLen = state.lineText.length;\n                state.index = (lineLen > 0) ? (lineLen - 1) : 0;\n            }\n            state.nextCh = state.lineText.charAt(state.index);\n        }\n        if (isComplete(state)) {\n            cur.line = line;\n            cur.ch = state.index;\n            repeat--;\n        }\n    }\n    if (state.nextCh || state.curMoveThrough) {\n        return new Pos(line, state.index);\n    }\n    return cur;\n}\nfunction findWord(cm, cur, forward, bigWord, emptyLineIsWord) {\n    var lineNum = cur.line;\n    var pos = cur.ch;\n    var line = cm.getLine(lineNum);\n    var dir = forward ? 1 : -1;\n    var charTests = bigWord ? bigWordCharTest : wordCharTest;\n    if (emptyLineIsWord && line == '') {\n        lineNum += dir;\n        line = cm.getLine(lineNum);\n        if (!isLine(cm, lineNum)) {\n            return null;\n        }\n        pos = (forward) ? 0 : line.length;\n    }\n    while (true) {\n        if (emptyLineIsWord && line == '') {\n            return { from: 0, to: 0, line: lineNum };\n        }\n        var stop = (dir > 0) ? line.length : -1;\n        var wordStart = stop, wordEnd = stop;\n        while (pos != stop) {\n            var foundWord = false;\n            for (var i = 0; i < charTests.length && !foundWord; ++i) {\n                if (charTests[i](line.charAt(pos))) {\n                    wordStart = pos;\n                    while (pos != stop && charTests[i](line.charAt(pos))) {\n                        pos += dir;\n                    }\n                    wordEnd = pos;\n                    foundWord = wordStart != wordEnd;\n                    if (wordStart == cur.ch && lineNum == cur.line &&\n                        wordEnd == wordStart + dir) {\n                        continue;\n                    }\n                    else {\n                        return {\n                            from: Math.min(wordStart, wordEnd + 1),\n                            to: Math.max(wordStart, wordEnd),\n                            line: lineNum\n                        };\n                    }\n                }\n            }\n            if (!foundWord) {\n                pos += dir;\n            }\n        }\n        lineNum += dir;\n        if (!isLine(cm, lineNum)) {\n            return null;\n        }\n        line = cm.getLine(lineNum);\n        pos = (dir > 0) ? 0 : line.length;\n    }\n}\nfunction moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) {\n    var curStart = copyCursor(cur);\n    var words = [];\n    if (forward && !wordEnd || !forward && wordEnd) {\n        repeat++;\n    }\n    var emptyLineIsWord = !(forward && wordEnd);\n    for (var i = 0; i < repeat; i++) {\n        var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);\n        if (!word) {\n            var eodCh = lineLength(cm, cm.lastLine());\n            words.push(forward\n                ? { line: cm.lastLine(), from: eodCh, to: eodCh }\n                : { line: 0, from: 0, to: 0 });\n            break;\n        }\n        words.push(word);\n        cur = new Pos(word.line, forward ? (word.to - 1) : word.from);\n    }\n    var shortCircuit = words.length != repeat;\n    var firstWord = words[0];\n    var lastWord = words.pop();\n    if (forward && !wordEnd) {\n        if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {\n            lastWord = words.pop();\n        }\n        return new Pos(lastWord.line, lastWord.from);\n    }\n    else if (forward && wordEnd) {\n        return new Pos(lastWord.line, lastWord.to - 1);\n    }\n    else if (!forward && wordEnd) {\n        if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {\n            lastWord = words.pop();\n        }\n        return new Pos(lastWord.line, lastWord.to);\n    }\n    else {\n        return new Pos(lastWord.line, lastWord.from);\n    }\n}\nfunction moveToEol(cm, head, motionArgs, vim, keepHPos) {\n    var cur = head;\n    var retval = new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n    var end = cm.clipPos(retval);\n    end.ch--;\n    if (!keepHPos) {\n        vim.lastHPos = Infinity;\n        vim.lastHSPos = cm.charCoords(end, 'div').left;\n    }\n    return retval;\n}\nfunction moveToCharacter(cm, repeat, forward, character) {\n    var cur = cm.getCursor();\n    var start = cur.ch;\n    var idx;\n    for (var i = 0; i < repeat; i++) {\n        var line = cm.getLine(cur.line);\n        idx = charIdxInLine(start, line, character, forward, true);\n        if (idx == -1) {\n            return null;\n        }\n        start = idx;\n    }\n    return new Pos(cm.getCursor().line, idx);\n}\nfunction moveToColumn(cm, repeat) {\n    var line = cm.getCursor().line;\n    return clipCursorToContent(cm, new Pos(line, repeat - 1));\n}\nfunction updateMark(cm, vim, markName, pos) {\n    if (!inArray(markName, validMarks)) {\n        return;\n    }\n    if (vim.marks[markName]) {\n        vim.marks[markName].clear();\n    }\n    vim.marks[markName] = cm.setBookmark(pos);\n}\nfunction charIdxInLine(start, line, character, forward, includeChar) {\n    var idx;\n    if (forward) {\n        idx = line.indexOf(character, start + 1);\n        if (idx != -1 && !includeChar) {\n            idx -= 1;\n        }\n    }\n    else {\n        idx = line.lastIndexOf(character, start - 1);\n        if (idx != -1 && !includeChar) {\n            idx += 1;\n        }\n    }\n    return idx;\n}\nfunction findParagraph(cm, head, repeat, dir, inclusive) {\n    var line = head.line;\n    var min = cm.firstLine();\n    var max = cm.lastLine();\n    var start, end, i = line;\n    function isEmpty(i) { return !/\\S/.test(cm.getLine(i)); } // ace_patch\n    function isBoundary(i, dir, any) {\n        if (any) {\n            return isEmpty(i) != isEmpty(i + dir);\n        }\n        return !isEmpty(i) && isEmpty(i + dir);\n    }\n    function skipFold(i) {\n        dir = dir > 0 ? 1 : -1;\n        var foldLine = cm.ace.session.getFoldLine(i);\n        if (foldLine) {\n            if (i + dir > foldLine.start.row && i + dir < foldLine.end.row)\n                dir = (dir > 0 ? foldLine.end.row : foldLine.start.row) - i;\n        }\n    }\n    if (dir) {\n        while (min <= i && i <= max && repeat > 0) {\n            skipFold(i);\n            if (isBoundary(i, dir)) {\n                repeat--;\n            }\n            i += dir;\n        }\n        return new Pos(i, 0);\n    }\n    var vim = cm.state.vim;\n    if (vim.visualLine && isBoundary(line, 1, true)) {\n        var anchor = vim.sel.anchor;\n        if (isBoundary(anchor.line, -1, true)) {\n            if (!inclusive || anchor.line != line) {\n                line += 1;\n            }\n        }\n    }\n    var startState = isEmpty(line);\n    for (i = line; i <= max && repeat; i++) {\n        if (isBoundary(i, 1, true)) {\n            if (!inclusive || isEmpty(i) != startState) {\n                repeat--;\n            }\n        }\n    }\n    end = new Pos(i, 0);\n    if (i > max && !startState) {\n        startState = true;\n    }\n    else {\n        inclusive = false;\n    }\n    for (i = line; i > min; i--) {\n        if (!inclusive || isEmpty(i) == startState || i == line) {\n            if (isBoundary(i, -1, true)) {\n                break;\n            }\n        }\n    }\n    start = new Pos(i, 0);\n    return { start: start, end: end };\n}\nfunction getSentence(cm, cur, repeat, dir, inclusive /*includes whitespace*/) {\n    function nextChar(curr) {\n        if (curr.pos + curr.dir < 0 || curr.pos + curr.dir >= curr.line.length) {\n            curr.line = null;\n        }\n        else {\n            curr.pos += curr.dir;\n        }\n    }\n    function forward(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n        var curr = {\n            line: line,\n            ln: ln,\n            pos: pos,\n            dir: dir,\n        };\n        if (curr.line === \"\") {\n            return { ln: curr.ln, pos: curr.pos };\n        }\n        var lastSentencePos = curr.pos;\n        nextChar(curr);\n        while (curr.line !== null) {\n            lastSentencePos = curr.pos;\n            if (isEndOfSentenceSymbol(curr.line[curr.pos])) {\n                if (!inclusive) {\n                    return { ln: curr.ln, pos: curr.pos + 1 };\n                }\n                else {\n                    nextChar(curr);\n                    while (curr.line !== null) {\n                        if (isWhiteSpaceString(curr.line[curr.pos])) {\n                            lastSentencePos = curr.pos;\n                            nextChar(curr);\n                        }\n                        else {\n                            break;\n                        }\n                    }\n                    return { ln: curr.ln, pos: lastSentencePos + 1 };\n                }\n            }\n            nextChar(curr);\n        }\n        return { ln: curr.ln, pos: lastSentencePos + 1 };\n    }\n    function reverse(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n        var curr = {\n            line: line,\n            ln: ln,\n            pos: pos,\n            dir: dir,\n        };\n        if (curr.line === \"\") {\n            return { ln: curr.ln, pos: curr.pos };\n        }\n        var lastSentencePos = curr.pos;\n        nextChar(curr);\n        while (curr.line !== null) {\n            if (!isWhiteSpaceString(curr.line[curr.pos]) && !isEndOfSentenceSymbol(curr.line[curr.pos])) {\n                lastSentencePos = curr.pos;\n            }\n            else if (isEndOfSentenceSymbol(curr.line[curr.pos])) {\n                if (!inclusive) {\n                    return { ln: curr.ln, pos: lastSentencePos };\n                }\n                else {\n                    if (isWhiteSpaceString(curr.line[curr.pos + 1])) {\n                        return { ln: curr.ln, pos: curr.pos + 1 };\n                    }\n                    else {\n                        return { ln: curr.ln, pos: lastSentencePos };\n                    }\n                }\n            }\n            nextChar(curr);\n        }\n        curr.line = line;\n        if (inclusive && isWhiteSpaceString(curr.line[curr.pos])) {\n            return { ln: curr.ln, pos: curr.pos };\n        }\n        else {\n            return { ln: curr.ln, pos: lastSentencePos };\n        }\n    }\n    var curr_index = {\n        ln: cur.line,\n        pos: cur.ch,\n    };\n    while (repeat > 0) {\n        if (dir < 0) {\n            curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        else {\n            curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        repeat--;\n    }\n    return new Pos(curr_index.ln, curr_index.pos);\n}\nfunction findSentence(cm, cur, repeat, dir) {\n    function nextChar(cm, idx) {\n        if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) {\n            idx.ln += idx.dir;\n            if (!isLine(cm, idx.ln)) {\n                idx.line = null;\n                idx.ln = null;\n                idx.pos = null;\n                return;\n            }\n            idx.line = cm.getLine(idx.ln);\n            idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1;\n        }\n        else {\n            idx.pos += idx.dir;\n        }\n    }\n    function forward(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n        var stop = (line === \"\");\n        var curr = {\n            line: line,\n            ln: ln,\n            pos: pos,\n            dir: dir,\n        };\n        var last_valid = {\n            ln: curr.ln,\n            pos: curr.pos,\n        };\n        var skip_empty_lines = (curr.line === \"\");\n        nextChar(cm, curr);\n        while (curr.line !== null) {\n            last_valid.ln = curr.ln;\n            last_valid.pos = curr.pos;\n            if (curr.line === \"\" && !skip_empty_lines) {\n                return { ln: curr.ln, pos: curr.pos, };\n            }\n            else if (stop && curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n                return { ln: curr.ln, pos: curr.pos, };\n            }\n            else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n                && !stop\n                && (curr.pos === curr.line.length - 1\n                    || isWhiteSpaceString(curr.line[curr.pos + 1]))) {\n                stop = true;\n            }\n            nextChar(cm, curr);\n        }\n        var line = cm.getLine(last_valid.ln);\n        last_valid.pos = 0;\n        for (var i = line.length - 1; i >= 0; --i) {\n            if (!isWhiteSpaceString(line[i])) {\n                last_valid.pos = i;\n                break;\n            }\n        }\n        return last_valid;\n    }\n    function reverse(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n        var curr = {\n            line: line,\n            ln: ln,\n            pos: pos,\n            dir: dir,\n        };\n        var last_valid = {\n            ln: curr.ln,\n            pos: null,\n        };\n        var skip_empty_lines = (curr.line === \"\");\n        nextChar(cm, curr);\n        while (curr.line !== null) {\n            if (curr.line === \"\" && !skip_empty_lines) {\n                if (last_valid.pos !== null) {\n                    return last_valid;\n                }\n                else {\n                    return { ln: curr.ln, pos: curr.pos };\n                }\n            }\n            else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n                && last_valid.pos !== null\n                && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) {\n                return last_valid;\n            }\n            else if (curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n                skip_empty_lines = false;\n                last_valid = { ln: curr.ln, pos: curr.pos };\n            }\n            nextChar(cm, curr);\n        }\n        var line = cm.getLine(last_valid.ln);\n        last_valid.pos = 0;\n        for (var i = 0; i < line.length; ++i) {\n            if (!isWhiteSpaceString(line[i])) {\n                last_valid.pos = i;\n                break;\n            }\n        }\n        return last_valid;\n    }\n    var curr_index = {\n        ln: cur.line,\n        pos: cur.ch,\n    };\n    while (repeat > 0) {\n        if (dir < 0) {\n            curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        else {\n            curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        repeat--;\n    }\n    return new Pos(curr_index.ln, curr_index.pos);\n}\nfunction selectCompanionObject(cm, head, symb, inclusive) {\n    var cur = head, start, end;\n    var bracketRegexp = ({\n        '(': /[()]/, ')': /[()]/,\n        '[': /[[\\]]/, ']': /[[\\]]/,\n        '{': /[{}]/, '}': /[{}]/,\n        '<': /[<>]/, '>': /[<>]/\n    })[symb];\n    var openSym = ({\n        '(': '(', ')': '(',\n        '[': '[', ']': '[',\n        '{': '{', '}': '{',\n        '<': '<', '>': '<'\n    })[symb];\n    var curChar = cm.getLine(cur.line).charAt(cur.ch);\n    var offset = curChar === openSym ? 1 : 0;\n    start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, { 'bracketRegex': bracketRegexp });\n    end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, { 'bracketRegex': bracketRegexp });\n    if (!start || !end) {\n        return { start: cur, end: cur };\n    }\n    start = start.pos;\n    end = end.pos;\n    if ((start.line == end.line && start.ch > end.ch)\n        || (start.line > end.line)) {\n        var tmp = start;\n        start = end;\n        end = tmp;\n    }\n    if (inclusive) {\n        end.ch += 1;\n    }\n    else {\n        start.ch += 1;\n    }\n    return { start: start, end: end };\n}\nfunction findBeginningAndEnd(cm, head, symb, inclusive) {\n    var cur = copyCursor(head);\n    var line = cm.getLine(cur.line);\n    var chars = line.split('');\n    var start, end, i, len;\n    var firstIndex = chars.indexOf(symb);\n    if (cur.ch < firstIndex) {\n        cur.ch = firstIndex;\n    }\n    else if (firstIndex < cur.ch && chars[cur.ch] == symb) {\n        end = cur.ch; // assign end to the current cursor\n        --cur.ch; // make sure to look backwards\n    }\n    if (chars[cur.ch] == symb && !end) {\n        start = cur.ch + 1; // assign start to ahead of the cursor\n    }\n    else {\n        for (i = cur.ch; i > -1 && !start; i--) {\n            if (chars[i] == symb) {\n                start = i + 1;\n            }\n        }\n    }\n    if (start && !end) {\n        for (i = start, len = chars.length; i < len && !end; i++) {\n            if (chars[i] == symb) {\n                end = i;\n            }\n        }\n    }\n    if (!start || !end) {\n        return { start: cur, end: cur };\n    }\n    if (inclusive) {\n        --start;\n        ++end;\n    }\n    return {\n        start: new Pos(cur.line, start),\n        end: new Pos(cur.line, end)\n    };\n}\ndefineOption('pcre', true, 'boolean');\nfunction SearchState() { }\nSearchState.prototype = {\n    getQuery: function () {\n        return vimGlobalState.query;\n    },\n    setQuery: function (query) {\n        vimGlobalState.query = query;\n    },\n    getOverlay: function () {\n        return this.searchOverlay;\n    },\n    setOverlay: function (overlay) {\n        this.searchOverlay = overlay;\n    },\n    isReversed: function () {\n        return vimGlobalState.isReversed;\n    },\n    setReversed: function (reversed) {\n        vimGlobalState.isReversed = reversed;\n    },\n    getScrollbarAnnotate: function () {\n        return this.annotate;\n    },\n    setScrollbarAnnotate: function (annotate) {\n        this.annotate = annotate;\n    }\n};\nfunction getSearchState(cm) {\n    var vim = cm.state.vim;\n    return vim.searchState_ || (vim.searchState_ = new SearchState());\n}\nfunction splitBySlash(argString) {\n    return splitBySeparator(argString, '/');\n}\nfunction findUnescapedSlashes(argString) {\n    return findUnescapedSeparators(argString, '/');\n}\nfunction splitBySeparator(argString, separator) {\n    var slashes = findUnescapedSeparators(argString, separator) || [];\n    if (!slashes.length)\n        return [];\n    var tokens = [];\n    if (slashes[0] !== 0)\n        return;\n    for (var i = 0; i < slashes.length; i++) {\n        if (typeof slashes[i] == 'number')\n            tokens.push(argString.substring(slashes[i] + 1, slashes[i + 1]));\n    }\n    return tokens;\n}\nfunction findUnescapedSeparators(str, separator) {\n    if (!separator)\n        separator = '/';\n    var escapeNextChar = false;\n    var slashes = [];\n    for (var i = 0; i < str.length; i++) {\n        var c = str.charAt(i);\n        if (!escapeNextChar && c == separator) {\n            slashes.push(i);\n        }\n        escapeNextChar = !escapeNextChar && (c == '\\\\');\n    }\n    return slashes;\n}\nfunction translateRegex(str) {\n    var specials = '|(){';\n    var unescape = '}';\n    var escapeNextChar = false;\n    var out = [];\n    for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i + 1) || '';\n        var specialComesNext = (n && specials.indexOf(n) != -1);\n        if (escapeNextChar) {\n            if (c !== '\\\\' || !specialComesNext) {\n                out.push(c);\n            }\n            escapeNextChar = false;\n        }\n        else {\n            if (c === '\\\\') {\n                escapeNextChar = true;\n                if (n && unescape.indexOf(n) != -1) {\n                    specialComesNext = true;\n                }\n                if (!specialComesNext || n === '\\\\') {\n                    out.push(c);\n                }\n            }\n            else {\n                out.push(c);\n                if (specialComesNext && n !== '\\\\') {\n                    out.push('\\\\');\n                }\n            }\n        }\n    }\n    return out.join('');\n}\nvar charUnescapes = { '\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t' };\nfunction translateRegexReplace(str) {\n    var escapeNextChar = false;\n    var out = [];\n    for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i + 1) || '';\n        if (charUnescapes[c + n]) {\n            out.push(charUnescapes[c + n]);\n            i++;\n        }\n        else if (escapeNextChar) {\n            out.push(c);\n            escapeNextChar = false;\n        }\n        else {\n            if (c === '\\\\') {\n                escapeNextChar = true;\n                if ((isNumber(n) || n === '$')) {\n                    out.push('$');\n                }\n                else if (n !== '/' && n !== '\\\\') {\n                    out.push('\\\\');\n                }\n            }\n            else {\n                if (c === '$') {\n                    out.push('$');\n                }\n                out.push(c);\n                if (n === '/') {\n                    out.push('\\\\');\n                }\n            }\n        }\n    }\n    return out.join('');\n}\nvar unescapes = { '\\\\/': '/', '\\\\\\\\': '\\\\', '\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t', '\\\\&': '&' };\nfunction unescapeRegexReplace(str) {\n    var stream = new CodeMirror.StringStream(str);\n    var output = [];\n    while (!stream.eol()) {\n        while (stream.peek() && stream.peek() != '\\\\') {\n            output.push(stream.next());\n        }\n        var matched = false;\n        for (var matcher in unescapes) {\n            if (stream.match(matcher, true)) {\n                matched = true;\n                output.push(unescapes[matcher]);\n                break;\n            }\n        }\n        if (!matched) {\n            output.push(stream.next());\n        }\n    }\n    return output.join('');\n}\nfunction parseQuery(query, ignoreCase, smartCase) {\n    var lastSearchRegister = vimGlobalState.registerController.getRegister('/');\n    lastSearchRegister.setText(query);\n    if (query instanceof RegExp) {\n        return query;\n    }\n    var slashes = findUnescapedSlashes(query);\n    var regexPart;\n    var forceIgnoreCase;\n    if (!slashes.length) {\n        regexPart = query;\n    }\n    else {\n        regexPart = query.substring(0, slashes[0]);\n        var flagsPart = query.substring(slashes[0]);\n        forceIgnoreCase = (flagsPart.indexOf('i') != -1);\n    }\n    if (!regexPart) {\n        return null;\n    }\n    if (!getOption('pcre')) {\n        regexPart = translateRegex(regexPart);\n    }\n    if (smartCase) {\n        ignoreCase = (/^[^A-Z]*$/).test(regexPart);\n    }\n    var regexp = new RegExp(regexPart, (ignoreCase || forceIgnoreCase) ? 'im' : 'm');\n    return regexp;\n}\nfunction dom(n) {\n    if (typeof n === 'string')\n        n = document.createElement(n);\n    for (var a, i = 1; i < arguments.length; i++) {\n        if (!(a = arguments[i]))\n            continue;\n        if (typeof a !== 'object')\n            a = document.createTextNode(a);\n        if (a.nodeType)\n            n.appendChild(a);\n        else\n            for (var key in a) {\n                if (!Object.prototype.hasOwnProperty.call(a, key))\n                    continue;\n                if (key[0] === '$')\n                    n.style[key.slice(1)] = a[key];\n                else\n                    n.setAttribute(key, a[key]);\n            }\n    }\n    return n;\n}\nfunction showConfirm(cm, template) {\n    var pre = dom('div', { $color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message' }, template);\n    if (cm.openNotification) {\n        cm.openNotification(pre, { bottom: true, duration: 5000 });\n    }\n    else {\n        alert(pre.innerText);\n    }\n}\nfunction makePrompt(prefix, desc) {\n    return dom(document.createDocumentFragment(), dom('span', { $fontFamily: 'monospace', $whiteSpace: 'pre' }, prefix, dom('input', { type: 'text', autocorrect: 'off',\n        autocapitalize: 'off', spellcheck: 'false' })), desc && dom('span', { $color: '#888' }, desc));\n}\nfunction showPrompt(cm, options) {\n    var template = makePrompt(options.prefix, options.desc);\n    if (cm.openDialog) {\n        cm.openDialog(template, options.onClose, {\n            onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp,\n            bottom: true, selectValueOnOpen: false, value: options.value\n        });\n    }\n    else {\n        var shortText = '';\n        if (typeof options.prefix != \"string\" && options.prefix)\n            shortText += options.prefix.textContent;\n        if (options.desc)\n            shortText += \" \" + options.desc;\n        options.onClose(prompt(shortText, ''));\n    }\n}\nfunction regexEqual(r1, r2) {\n    if (r1 instanceof RegExp && r2 instanceof RegExp) {\n        var props = ['global', 'multiline', 'ignoreCase', 'source'];\n        for (var i = 0; i < props.length; i++) {\n            var prop = props[i];\n            if (r1[prop] !== r2[prop]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n}\nfunction updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {\n    if (!rawQuery) {\n        return;\n    }\n    var state = getSearchState(cm);\n    var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase);\n    if (!query) {\n        return;\n    }\n    highlightSearchMatches(cm, query);\n    if (regexEqual(query, state.getQuery())) {\n        return query;\n    }\n    state.setQuery(query);\n    return query;\n}\nfunction searchOverlay(query) {\n    if (query.source.charAt(0) == '^') {\n        var matchSol = true;\n    }\n    return {\n        token: function (stream) {\n            if (matchSol && !stream.sol()) {\n                stream.skipToEnd();\n                return;\n            }\n            var match = stream.match(query, false);\n            if (match) {\n                if (match[0].length == 0) {\n                    stream.next();\n                    return 'searching';\n                }\n                if (!stream.sol()) {\n                    stream.backUp(1);\n                    if (!query.exec(stream.next() + match[0])) {\n                        stream.next();\n                        return null;\n                    }\n                }\n                stream.match(query);\n                return 'searching';\n            }\n            while (!stream.eol()) {\n                stream.next();\n                if (stream.match(query, false))\n                    break;\n            }\n        },\n        query: query\n    };\n}\nvar highlightTimeout = 0;\nfunction highlightSearchMatches(cm, query) {\n    clearTimeout(highlightTimeout);\n    highlightTimeout = setTimeout(function () {\n        if (!cm.state.vim)\n            return;\n        var searchState = getSearchState(cm);\n        var overlay = searchState.getOverlay();\n        if (!overlay || query != overlay.query) {\n            if (overlay) {\n                cm.removeOverlay(overlay);\n            }\n            overlay = searchOverlay(query);\n            cm.addOverlay(overlay);\n            if (cm.showMatchesOnScrollbar) {\n                if (searchState.getScrollbarAnnotate()) {\n                    searchState.getScrollbarAnnotate().clear();\n                }\n                searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query));\n            }\n            searchState.setOverlay(overlay);\n        }\n    }, 50);\n}\nfunction findNext(cm, prev, query, repeat) {\n    if (repeat === undefined) {\n        repeat = 1;\n    }\n    return cm.operation(function () {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n        for (var i = 0; i < repeat; i++) {\n            var found = cursor.find(prev);\n            if (i == 0 && found && cursorEqual(cursor.from(), pos)) {\n                var lastEndPos = prev ? cursor.from() : cursor.to();\n                found = cursor.find(prev);\n                if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) {\n                    if (cm.getLine(lastEndPos.line).length == lastEndPos.ch)\n                        found = cursor.find(prev);\n                }\n            }\n            if (!found) {\n                cursor = cm.getSearchCursor(query, (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0));\n                if (!cursor.find(prev)) {\n                    return;\n                }\n            }\n        }\n        return cursor.from();\n    });\n}\nfunction findNextFromAndToInclusive(cm, prev, query, repeat, vim) {\n    if (repeat === undefined) {\n        repeat = 1;\n    }\n    return cm.operation(function () {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n        var found = cursor.find(!prev);\n        if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) {\n            cursor.find(!prev);\n        }\n        for (var i = 0; i < repeat; i++) {\n            found = cursor.find(prev);\n            if (!found) {\n                cursor = cm.getSearchCursor(query, (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0));\n                if (!cursor.find(prev)) {\n                    return;\n                }\n            }\n        }\n        return [cursor.from(), cursor.to()];\n    });\n}\nfunction clearSearchHighlight(cm) {\n    var state = getSearchState(cm);\n    cm.removeOverlay(getSearchState(cm).getOverlay());\n    state.setOverlay(null);\n    if (state.getScrollbarAnnotate()) {\n        state.getScrollbarAnnotate().clear();\n        state.setScrollbarAnnotate(null);\n    }\n}\nfunction isInRange(pos, start, end) {\n    if (typeof pos != 'number') {\n        pos = pos.line;\n    }\n    if (start instanceof Array) {\n        return inArray(pos, start);\n    }\n    else {\n        if (typeof end == 'number') {\n            return (pos >= start && pos <= end);\n        }\n        else {\n            return pos == start;\n        }\n    }\n}\nfunction getUserVisibleLines(cm) {\n    var renderer = cm.ace.renderer;\n    return {\n        top: renderer.getFirstFullyVisibleRow(),\n        bottom: renderer.getLastFullyVisibleRow()\n    };\n}\nfunction getMarkPos(cm, vim, markName) {\n    if (markName == '\\'' || markName == '`') {\n        return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0);\n    }\n    else if (markName == '.') {\n        return getLastEditPos(cm);\n    }\n    var mark = vim.marks[markName];\n    return mark && mark.find();\n}\nfunction getLastEditPos(cm) {\n    var undoManager = cm.ace.session.$undoManager;\n    if (undoManager && undoManager.$lastDelta)\n        return toCmPos(undoManager.$lastDelta.end);\n}\nvar ExCommandDispatcher = function () {\n    this.buildCommandMap_();\n};\nExCommandDispatcher.prototype = {\n    processCommand: function (cm, input, opt_params) {\n        var that = this;\n        cm.operation(function () {\n            cm.curOp.isVimOp = true;\n            that._processCommand(cm, input, opt_params);\n        });\n    },\n    _processCommand: function (cm, input, opt_params) {\n        var vim = cm.state.vim;\n        var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');\n        var previousCommand = commandHistoryRegister.toString();\n        if (vim.visualMode) {\n            exitVisualMode(cm);\n        }\n        var inputStream = new CodeMirror.StringStream(input);\n        commandHistoryRegister.setText(input);\n        var params = opt_params || {};\n        params.input = input;\n        try {\n            this.parseInput_(cm, inputStream, params);\n        }\n        catch (e) {\n            showConfirm(cm, e.toString());\n            throw e;\n        }\n        var command;\n        var commandName;\n        if (!params.commandName) {\n            if (params.line !== undefined) {\n                commandName = 'move';\n            }\n        }\n        else {\n            command = this.matchCommand_(params.commandName);\n            if (command) {\n                commandName = command.name;\n                if (command.excludeFromCommandHistory) {\n                    commandHistoryRegister.setText(previousCommand);\n                }\n                this.parseCommandArgs_(inputStream, params, command);\n                if (command.type == 'exToKey') {\n                    for (var i = 0; i < command.toKeys.length; i++) {\n                        vimApi.handleKey(cm, command.toKeys[i], 'mapping');\n                    }\n                    return;\n                }\n                else if (command.type == 'exToEx') {\n                    this.processCommand(cm, command.toInput);\n                    return;\n                }\n            }\n        }\n        if (!commandName) {\n            showConfirm(cm, 'Not an editor command \":' + input + '\"');\n            return;\n        }\n        try {\n            exCommands[commandName](cm, params);\n            if ((!command || !command.possiblyAsync) && params.callback) {\n                params.callback();\n            }\n        }\n        catch (e) {\n            showConfirm(cm, e.toString());\n            throw e;\n        }\n    },\n    parseInput_: function (cm, inputStream, result) {\n        inputStream.eatWhile(':');\n        if (inputStream.eat('%')) {\n            result.line = cm.firstLine();\n            result.lineEnd = cm.lastLine();\n        }\n        else {\n            result.line = this.parseLineSpec_(cm, inputStream);\n            if (result.line !== undefined && inputStream.eat(',')) {\n                result.lineEnd = this.parseLineSpec_(cm, inputStream);\n            }\n        }\n        var commandMatch = inputStream.match(/^(\\w+|!!|@@|[!#&*<=>@~])/);\n        if (commandMatch) {\n            result.commandName = commandMatch[1];\n        }\n        else {\n            result.commandName = inputStream.match(/.*/)[0];\n        }\n        return result;\n    },\n    parseLineSpec_: function (cm, inputStream) {\n        var numberMatch = inputStream.match(/^(\\d+)/);\n        if (numberMatch) {\n            return parseInt(numberMatch[1], 10) - 1;\n        }\n        switch (inputStream.next()) {\n            case '.':\n                return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n            case '$':\n                return this.parseLineSpecOffset_(inputStream, cm.lastLine());\n            case '\\'':\n                var markName = inputStream.next();\n                var markPos = getMarkPos(cm, cm.state.vim, markName);\n                if (!markPos)\n                    throw new Error('Mark not set');\n                return this.parseLineSpecOffset_(inputStream, markPos.line);\n            case '-':\n            case '+':\n                inputStream.backUp(1);\n                return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n            default:\n                inputStream.backUp(1);\n                return undefined;\n        }\n    },\n    parseLineSpecOffset_: function (inputStream, line) {\n        var offsetMatch = inputStream.match(/^([+-])?(\\d+)/);\n        if (offsetMatch) {\n            var offset = parseInt(offsetMatch[2], 10);\n            if (offsetMatch[1] == \"-\") {\n                line -= offset;\n            }\n            else {\n                line += offset;\n            }\n        }\n        return line;\n    },\n    parseCommandArgs_: function (inputStream, params, command) {\n        if (inputStream.eol()) {\n            return;\n        }\n        params.argString = inputStream.match(/.*/)[0];\n        var delim = command.argDelimiter || /\\s+/;\n        var args = trim(params.argString).split(delim);\n        if (args.length && args[0]) {\n            params.args = args;\n        }\n    },\n    matchCommand_: function (commandName) {\n        for (var i = commandName.length; i > 0; i--) {\n            var prefix = commandName.substring(0, i);\n            if (this.commandMap_[prefix]) {\n                var command = this.commandMap_[prefix];\n                if (command.name.indexOf(commandName) === 0) {\n                    return command;\n                }\n            }\n        }\n        return null;\n    },\n    buildCommandMap_: function () {\n        this.commandMap_ = {};\n        for (var i = 0; i < defaultExCommandMap.length; i++) {\n            var command = defaultExCommandMap[i];\n            var key = command.shortName || command.name;\n            this.commandMap_[key] = command;\n        }\n    },\n    map: function (lhs, rhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n            if (ctx) {\n                throw Error('Mode not supported for ex mappings');\n            }\n            var commandName = lhs.substring(1);\n            if (rhs != ':' && rhs.charAt(0) == ':') {\n                this.commandMap_[commandName] = {\n                    name: commandName,\n                    type: 'exToEx',\n                    toInput: rhs.substring(1),\n                    user: true\n                };\n            }\n            else {\n                this.commandMap_[commandName] = {\n                    name: commandName,\n                    type: 'exToKey',\n                    toKeys: rhs,\n                    user: true\n                };\n            }\n        }\n        else {\n            if (rhs != ':' && rhs.charAt(0) == ':') {\n                var mapping = {\n                    keys: lhs,\n                    type: 'keyToEx',\n                    exArgs: { input: rhs.substring(1) }\n                };\n                if (ctx) {\n                    mapping.context = ctx;\n                }\n                defaultKeymap.unshift(mapping);\n            }\n            else {\n                var mapping = {\n                    keys: lhs,\n                    type: 'keyToKey',\n                    toKeys: rhs\n                };\n                if (ctx) {\n                    mapping.context = ctx;\n                }\n                defaultKeymap.unshift(mapping);\n            }\n        }\n    },\n    unmap: function (lhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n            if (ctx) {\n                throw Error('Mode not supported for ex mappings');\n            }\n            var commandName = lhs.substring(1);\n            if (this.commandMap_[commandName] && this.commandMap_[commandName].user) {\n                delete this.commandMap_[commandName];\n                return true;\n            }\n        }\n        else {\n            var keys = lhs;\n            for (var i = 0; i < defaultKeymap.length; i++) {\n                if (keys == defaultKeymap[i].keys\n                    && defaultKeymap[i].context === ctx) {\n                    defaultKeymap.splice(i, 1);\n                    return true;\n                }\n            }\n        }\n    }\n};\nvar exCommands = {\n    colorscheme: function (cm, params) {\n        if (!params.args || params.args.length < 1) {\n            showConfirm(cm, cm.getOption('theme'));\n            return;\n        }\n        cm.setOption('theme', params.args[0]);\n    },\n    map: function (cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 2) {\n            if (cm) {\n                showConfirm(cm, 'Invalid mapping: ' + params.input);\n            }\n            return;\n        }\n        exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx);\n    },\n    imap: function (cm, params) { this.map(cm, params, 'insert'); },\n    nmap: function (cm, params) { this.map(cm, params, 'normal'); },\n    vmap: function (cm, params) { this.map(cm, params, 'visual'); },\n    unmap: function (cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) {\n            if (cm) {\n                showConfirm(cm, 'No such mapping: ' + params.input);\n            }\n        }\n    },\n    move: function (cm, params) {\n        commandDispatcher.processCommand(cm, cm.state.vim, {\n            type: 'motion',\n            motion: 'moveToLineOrEdgeOfDocument',\n            motionArgs: { forward: false, explicitRepeat: true,\n                linewise: true },\n            repeatOverride: params.line + 1\n        });\n    },\n    set: function (cm, params) {\n        var setArgs = params.args;\n        var setCfg = params.setCfg || {};\n        if (!setArgs || setArgs.length < 1) {\n            if (cm) {\n                showConfirm(cm, 'Invalid mapping: ' + params.input);\n            }\n            return;\n        }\n        var expr = setArgs[0].split('=');\n        var optionName = expr[0];\n        var value = expr[1];\n        var forceGet = false;\n        if (optionName.charAt(optionName.length - 1) == '?') {\n            if (value) {\n                throw Error('Trailing characters: ' + params.argString);\n            }\n            optionName = optionName.substring(0, optionName.length - 1);\n            forceGet = true;\n        }\n        if (value === undefined && optionName.substring(0, 2) == 'no') {\n            optionName = optionName.substring(2);\n            value = false;\n        }\n        var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean';\n        if (optionIsBoolean && value == undefined) {\n            value = true;\n        }\n        if (!optionIsBoolean && value === undefined || forceGet) {\n            var oldValue = getOption(optionName, cm, setCfg);\n            if (oldValue instanceof Error) {\n                showConfirm(cm, oldValue.message);\n            }\n            else if (oldValue === true || oldValue === false) {\n                showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);\n            }\n            else {\n                showConfirm(cm, '  ' + optionName + '=' + oldValue);\n            }\n        }\n        else {\n            var setOptionReturn = setOption(optionName, value, cm, setCfg);\n            if (setOptionReturn instanceof Error) {\n                showConfirm(cm, setOptionReturn.message);\n            }\n        }\n    },\n    setlocal: function (cm, params) {\n        params.setCfg = { scope: 'local' };\n        this.set(cm, params);\n    },\n    setglobal: function (cm, params) {\n        params.setCfg = { scope: 'global' };\n        this.set(cm, params);\n    },\n    registers: function (cm, params) {\n        var regArgs = params.args;\n        var registers = vimGlobalState.registerController.registers;\n        var regInfo = '----------Registers----------\\n\\n';\n        if (!regArgs) {\n            for (var registerName in registers) {\n                var text = registers[registerName].toString();\n                if (text.length) {\n                    regInfo += '\"' + registerName + '    ' + text + '\\n';\n                }\n            }\n        }\n        else {\n            var registerName;\n            regArgs = regArgs.join('');\n            for (var i = 0; i < regArgs.length; i++) {\n                registerName = regArgs.charAt(i);\n                if (!vimGlobalState.registerController.isValidRegister(registerName)) {\n                    continue;\n                }\n                var register = registers[registerName] || new Register();\n                regInfo += '\"' + registerName + '    ' + register.toString() + '\\n';\n            }\n        }\n        showConfirm(cm, regInfo);\n    },\n    sort: function (cm, params) {\n        var reverse, ignoreCase, unique, number, pattern;\n        function parseArgs() {\n            if (params.argString) {\n                var args = new CodeMirror.StringStream(params.argString);\n                if (args.eat('!')) {\n                    reverse = true;\n                }\n                if (args.eol()) {\n                    return;\n                }\n                if (!args.eatSpace()) {\n                    return 'Invalid arguments';\n                }\n                var opts = args.match(/([dinuox]+)?\\s*(\\/.+\\/)?\\s*/);\n                if (!opts && !args.eol()) {\n                    return 'Invalid arguments';\n                }\n                if (opts[1]) {\n                    ignoreCase = opts[1].indexOf('i') != -1;\n                    unique = opts[1].indexOf('u') != -1;\n                    var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1;\n                    var hex = opts[1].indexOf('x') != -1 && 1;\n                    var octal = opts[1].indexOf('o') != -1 && 1;\n                    if (decimal + hex + octal > 1) {\n                        return 'Invalid arguments';\n                    }\n                    number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';\n                }\n                if (opts[2]) {\n                    pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : '');\n                }\n            }\n        }\n        var err = parseArgs();\n        if (err) {\n            showConfirm(cm, err + ': ' + params.argString);\n            return;\n        }\n        var lineStart = params.line || cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        if (lineStart == lineEnd) {\n            return;\n        }\n        var curStart = new Pos(lineStart, 0);\n        var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd));\n        var text = cm.getRange(curStart, curEnd).split('\\n');\n        var numberRegex = pattern ? pattern :\n            (number == 'decimal') ? /(-?)([\\d]+)/ :\n                (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :\n                    (number == 'octal') ? /([0-7]+)/ : null;\n        var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;\n        var numPart = [], textPart = [];\n        if (number || pattern) {\n            for (var i = 0; i < text.length; i++) {\n                var matchPart = pattern ? text[i].match(pattern) : null;\n                if (matchPart && matchPart[0] != '') {\n                    numPart.push(matchPart);\n                }\n                else if (!pattern && numberRegex.exec(text[i])) {\n                    numPart.push(text[i]);\n                }\n                else {\n                    textPart.push(text[i]);\n                }\n            }\n        }\n        else {\n            textPart = text;\n        }\n        function compareFn(a, b) {\n            if (reverse) {\n                var tmp;\n                tmp = a;\n                a = b;\n                b = tmp;\n            }\n            if (ignoreCase) {\n                a = a.toLowerCase();\n                b = b.toLowerCase();\n            }\n            var anum = number && numberRegex.exec(a);\n            var bnum = number && numberRegex.exec(b);\n            if (!anum) {\n                return a < b ? -1 : 1;\n            }\n            anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix);\n            bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);\n            return anum - bnum;\n        }\n        function comparePatternFn(a, b) {\n            if (reverse) {\n                var tmp;\n                tmp = a;\n                a = b;\n                b = tmp;\n            }\n            if (ignoreCase) {\n                a[0] = a[0].toLowerCase();\n                b[0] = b[0].toLowerCase();\n            }\n            return (a[0] < b[0]) ? -1 : 1;\n        }\n        numPart.sort(pattern ? comparePatternFn : compareFn);\n        if (pattern) {\n            for (var i = 0; i < numPart.length; i++) {\n                numPart[i] = numPart[i].input;\n            }\n        }\n        else if (!number) {\n            textPart.sort(compareFn);\n        }\n        text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);\n        if (unique) { // Remove duplicate lines\n            var textOld = text;\n            var lastLine;\n            text = [];\n            for (var i = 0; i < textOld.length; i++) {\n                if (textOld[i] != lastLine) {\n                    text.push(textOld[i]);\n                }\n                lastLine = textOld[i];\n            }\n        }\n        cm.replaceRange(text.join('\\n'), curStart, curEnd);\n    },\n    vglobal: function (cm, params) {\n        this.global(cm, params);\n    },\n    global: function (cm, params) {\n        var argString = params.argString;\n        if (!argString) {\n            showConfirm(cm, 'Regular Expression missing from global');\n            return;\n        }\n        var inverted = params.commandName[0] === 'v';\n        var lineStart = (params.line !== undefined) ? params.line : cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        var tokens = splitBySlash(argString);\n        var regexPart = argString, cmd;\n        if (tokens.length) {\n            regexPart = tokens[0];\n            cmd = tokens.slice(1, tokens.length).join('/');\n        }\n        if (regexPart) {\n            try {\n                updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */);\n            }\n            catch (e) {\n                showConfirm(cm, 'Invalid regex: ' + regexPart);\n                return;\n            }\n        }\n        var query = getSearchState(cm).getQuery();\n        var matchedLines = [];\n        for (var i = lineStart; i <= lineEnd; i++) {\n            var line = cm.getLineHandle(i);\n            var matched = query.test(line.text);\n            if (matched !== inverted) {\n                matchedLines.push(cmd ? line : line.text);\n            }\n        }\n        if (!cmd) {\n            showConfirm(cm, matchedLines.join('\\n'));\n            return;\n        }\n        var index = 0;\n        var nextCommand = function () {\n            if (index < matchedLines.length) {\n                var line = matchedLines[index++];\n                var lineNum = cm.getLineNumber(line);\n                if (lineNum == null) {\n                    nextCommand();\n                    return;\n                }\n                var command = (lineNum + 1) + cmd;\n                exCommandDispatcher.processCommand(cm, command, {\n                    callback: nextCommand\n                });\n            }\n        };\n        nextCommand();\n    },\n    substitute: function (cm, params) {\n        if (!cm.getSearchCursor) {\n            throw new Error('Search feature not available. Requires searchcursor.js or ' +\n                'any other getSearchCursor implementation.');\n        }\n        var argString = params.argString;\n        var tokens = argString ? splitBySeparator(argString, argString[0]) : [];\n        var regexPart, replacePart = '', trailing, flagsPart, count;\n        var confirm = false; // Whether to confirm each replace.\n        var global = false; // True to replace all instances on a line, false to replace only 1.\n        if (tokens.length) {\n            regexPart = tokens[0];\n            if (getOption('pcre') && regexPart !== '') {\n                regexPart = new RegExp(regexPart).source; //normalize not escaped characters\n            }\n            replacePart = tokens[1];\n            if (replacePart !== undefined) {\n                if (getOption('pcre')) {\n                    replacePart = unescapeRegexReplace(replacePart.replace(/([^\\\\])&/g, \"$1$$&\"));\n                }\n                else {\n                    replacePart = translateRegexReplace(replacePart);\n                }\n                vimGlobalState.lastSubstituteReplacePart = replacePart;\n            }\n            trailing = tokens[2] ? tokens[2].split(' ') : [];\n        }\n        else {\n            if (argString && argString.length) {\n                showConfirm(cm, 'Substitutions should be of the form ' +\n                    ':s/pattern/replace/');\n                return;\n            }\n        }\n        if (trailing) {\n            flagsPart = trailing[0];\n            count = parseInt(trailing[1]);\n            if (flagsPart) {\n                if (flagsPart.indexOf('c') != -1) {\n                    confirm = true;\n                }\n                if (flagsPart.indexOf('g') != -1) {\n                    global = true;\n                }\n                if (getOption('pcre')) {\n                    regexPart = regexPart + '/' + flagsPart;\n                }\n                else {\n                    regexPart = regexPart.replace(/\\//g, \"\\\\/\") + '/' + flagsPart;\n                }\n            }\n        }\n        if (regexPart) {\n            try {\n                updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */);\n            }\n            catch (e) {\n                showConfirm(cm, 'Invalid regex: ' + regexPart);\n                return;\n            }\n        }\n        replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;\n        if (replacePart === undefined) {\n            showConfirm(cm, 'No previous substitute regular expression');\n            return;\n        }\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;\n        var lineEnd = params.lineEnd || lineStart;\n        if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) {\n            lineEnd = Infinity;\n        }\n        if (count) {\n            lineStart = lineEnd;\n            lineEnd = lineStart + count - 1;\n        }\n        var startPos = clipCursorToContent(cm, new Pos(lineStart, 0));\n        var cursor = cm.getSearchCursor(query, startPos);\n        doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback);\n    },\n    redo: CodeMirror.commands.redo,\n    undo: CodeMirror.commands.undo,\n    write: function (cm) {\n        if (CodeMirror.commands.save) {\n            CodeMirror.commands.save(cm);\n        }\n        else if (cm.save) {\n            cm.save();\n        }\n    },\n    nohlsearch: function (cm) {\n        clearSearchHighlight(cm);\n    },\n    yank: function (cm) {\n        var cur = copyCursor(cm.getCursor());\n        var line = cur.line;\n        var lineText = cm.getLine(line);\n        vimGlobalState.registerController.pushText('0', 'yank', lineText, true, true);\n    },\n    delmarks: function (cm, params) {\n        if (!params.argString || !trim(params.argString)) {\n            showConfirm(cm, 'Argument required');\n            return;\n        }\n        var state = cm.state.vim;\n        var stream = new CodeMirror.StringStream(trim(params.argString));\n        while (!stream.eol()) {\n            stream.eatSpace();\n            var count = stream.pos;\n            if (!stream.match(/[a-zA-Z]/, false)) {\n                showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n                return;\n            }\n            var sym = stream.next();\n            if (stream.match('-', true)) {\n                if (!stream.match(/[a-zA-Z]/, false)) {\n                    showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n                    return;\n                }\n                var startMark = sym;\n                var finishMark = stream.next();\n                if (isLowerCase(startMark) && isLowerCase(finishMark) ||\n                    isUpperCase(startMark) && isUpperCase(finishMark)) {\n                    var start = startMark.charCodeAt(0);\n                    var finish = finishMark.charCodeAt(0);\n                    if (start >= finish) {\n                        showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n                        return;\n                    }\n                    for (var j = 0; j <= finish - start; j++) {\n                        var mark = String.fromCharCode(start + j);\n                        delete state.marks[mark];\n                    }\n                }\n                else {\n                    showConfirm(cm, 'Invalid argument: ' + startMark + '-');\n                    return;\n                }\n            }\n            else {\n                delete state.marks[sym];\n            }\n        }\n    }\n};\nvar exCommandDispatcher = new ExCommandDispatcher();\nfunction doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, replaceWith, callback) {\n    cm.state.vim.exMode = true;\n    var done = false;\n    var lastPos, modifiedLineNumber, joined;\n    function replaceAll() {\n        cm.operation(function () {\n            while (!done) {\n                replace();\n                next();\n            }\n            stop();\n        });\n    }\n    function replace() {\n        var text = cm.getRange(searchCursor.from(), searchCursor.to());\n        var newText = text.replace(query, replaceWith);\n        var unmodifiedLineNumber = searchCursor.to().line;\n        searchCursor.replace(newText);\n        modifiedLineNumber = searchCursor.to().line;\n        lineEnd += modifiedLineNumber - unmodifiedLineNumber;\n        joined = modifiedLineNumber < unmodifiedLineNumber;\n    }\n    function findNextValidMatch() {\n        var lastMatchTo = lastPos && copyCursor(searchCursor.to());\n        var match = searchCursor.findNext();\n        if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) {\n            match = searchCursor.findNext();\n        }\n        return match;\n    }\n    function next() {\n        while (findNextValidMatch() &&\n            isInRange(searchCursor.from(), lineStart, lineEnd)) {\n            if (!global && searchCursor.from().line == modifiedLineNumber && !joined) {\n                continue;\n            }\n            cm.scrollIntoView(searchCursor.from(), 30);\n            cm.setSelection(searchCursor.from(), searchCursor.to());\n            lastPos = searchCursor.from();\n            done = false;\n            return;\n        }\n        done = true;\n    }\n    function stop(close) {\n        if (close) {\n            close();\n        }\n        cm.focus();\n        if (lastPos) {\n            cm.setCursor(lastPos);\n            var vim = cm.state.vim;\n            vim.exMode = false;\n            vim.lastHPos = vim.lastHSPos = lastPos.ch;\n        }\n        if (callback) {\n            callback();\n        }\n    }\n    function onPromptKeyDown(e, _value, close) {\n        CodeMirror.e_stop(e);\n        var keyName = CodeMirror.keyName(e);\n        switch (keyName) {\n            case 'Y':\n                replace();\n                next();\n                break;\n            case 'N':\n                next();\n                break;\n            case 'A':\n                var savedCallback = callback;\n                callback = undefined;\n                cm.operation(replaceAll);\n                callback = savedCallback;\n                break;\n            case 'L':\n                replace();\n            case 'Q':\n            case 'Esc':\n            case 'Ctrl-C':\n            case 'Ctrl-[':\n                stop(close);\n                break;\n        }\n        if (done) {\n            stop(close);\n        }\n        return true;\n    }\n    next();\n    if (done) {\n        showConfirm(cm, 'No matches for ' + query.source);\n        return;\n    }\n    if (!confirm) {\n        replaceAll();\n        if (callback) {\n            callback();\n        }\n        return;\n    }\n    showPrompt(cm, {\n        prefix: dom('span', 'replace with ', dom('strong', replaceWith), ' (y/n/a/q/l)'),\n        onKeyDown: onPromptKeyDown\n    });\n}\nCodeMirror.keyMap.vim = {\n    attach: attachVimMap,\n    detach: detachVimMap,\n    call: cmKey\n};\nfunction exitInsertMode(cm) {\n    var vim = cm.state.vim;\n    var macroModeState = vimGlobalState.macroModeState;\n    var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');\n    var isPlaying = macroModeState.isPlaying;\n    var lastChange = macroModeState.lastInsertModeChanges;\n    if (!isPlaying) {\n        cm.off('change', onChange);\n        CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n    }\n    if (!isPlaying && vim.insertModeRepeat > 1) {\n        repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, true /** repeatForInsert */);\n        vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;\n    }\n    delete vim.insertModeRepeat;\n    vim.insertMode = false;\n    cm.setCursor(cm.getCursor().line, cm.getCursor().ch - 1);\n    cm.setOption('keyMap', 'vim');\n    cm.setOption('disableInput', true);\n    cm.toggleOverwrite(false); // exit replace mode if we were in it.\n    insertModeChangeRegister.setText(lastChange.changes.join(''));\n    CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"normal\" });\n    if (macroModeState.isRecording) {\n        logInsertModeChange(macroModeState);\n    }\n}\nfunction _mapCommand(command) {\n    defaultKeymap.unshift(command);\n}\nfunction mapCommand(keys, type, name, args, extra) {\n    var command = { keys: keys, type: type };\n    command[type] = name;\n    command[type + \"Args\"] = args;\n    for (var key in extra)\n        command[key] = extra[key];\n    _mapCommand(command);\n}\ndefineOption('insertModeEscKeysTimeout', 200, 'number');\nCodeMirror.keyMap['vim-insert'] = {\n    fallthrough: ['default'],\n    attach: attachVimMap,\n    detach: detachVimMap,\n    call: cmKey\n};\nCodeMirror.keyMap['vim-replace'] = {\n    'Backspace': 'goCharLeft',\n    fallthrough: ['vim-insert'],\n    attach: attachVimMap,\n    detach: detachVimMap,\n    call: cmKey\n};\nfunction executeMacroRegister(cm, vim, macroModeState, registerName) {\n    var register = vimGlobalState.registerController.getRegister(registerName);\n    if (registerName == ':') {\n        if (register.keyBuffer[0]) {\n            exCommandDispatcher.processCommand(cm, register.keyBuffer[0]);\n        }\n        macroModeState.isPlaying = false;\n        return;\n    }\n    var keyBuffer = register.keyBuffer;\n    var imc = 0;\n    macroModeState.isPlaying = true;\n    macroModeState.replaySearchQueries = register.searchQueries.slice(0);\n    for (var i = 0; i < keyBuffer.length; i++) {\n        var text = keyBuffer[i];\n        var match, key;\n        while (text) {\n            match = (/<\\w+-.+?>|<\\w+>|./).exec(text);\n            key = match[0];\n            text = text.substring(match.index + key.length);\n            vimApi.handleKey(cm, key, 'macro');\n            if (vim.insertMode) {\n                var changes = register.insertModeChanges[imc++].changes;\n                vimGlobalState.macroModeState.lastInsertModeChanges.changes =\n                    changes;\n                repeatInsertModeChanges(cm, changes, 1);\n                exitInsertMode(cm);\n            }\n        }\n    }\n    macroModeState.isPlaying = false;\n}\nfunction logKey(macroModeState, key) {\n    if (macroModeState.isPlaying) {\n        return;\n    }\n    var registerName = macroModeState.latestRegister;\n    var register = vimGlobalState.registerController.getRegister(registerName);\n    if (register) {\n        register.pushText(key);\n    }\n}\nfunction logInsertModeChange(macroModeState) {\n    if (macroModeState.isPlaying) {\n        return;\n    }\n    var registerName = macroModeState.latestRegister;\n    var register = vimGlobalState.registerController.getRegister(registerName);\n    if (register && register.pushInsertModeChanges) {\n        register.pushInsertModeChanges(macroModeState.lastInsertModeChanges);\n    }\n}\nfunction logSearchQuery(macroModeState, query) {\n    if (macroModeState.isPlaying) {\n        return;\n    }\n    var registerName = macroModeState.latestRegister;\n    var register = vimGlobalState.registerController.getRegister(registerName);\n    if (register && register.pushSearchQuery) {\n        register.pushSearchQuery(query);\n    }\n}\nfunction onChange(cm, changeObj) {\n    var macroModeState = vimGlobalState.macroModeState;\n    var lastChange = macroModeState.lastInsertModeChanges;\n    if (!macroModeState.isPlaying) {\n        while (changeObj) {\n            lastChange.expectCursorActivityForChange = true;\n            if (lastChange.ignoreCount > 1) {\n                lastChange.ignoreCount--;\n            }\n            else if (changeObj.origin == '+input' || changeObj.origin == 'paste'\n                || changeObj.origin === undefined /* only in testing */) {\n                var selectionCount = cm.listSelections().length;\n                if (selectionCount > 1)\n                    lastChange.ignoreCount = selectionCount;\n                var text = changeObj.text.join('\\n');\n                if (lastChange.maybeReset) {\n                    lastChange.changes = [];\n                    lastChange.maybeReset = false;\n                }\n                if (text) {\n                    if (cm.state.overwrite && !/\\n/.test(text)) {\n                        lastChange.changes.push([text]);\n                    }\n                    else {\n                        lastChange.changes.push(text);\n                    }\n                }\n            }\n            changeObj = changeObj.next;\n        }\n    }\n}\nfunction onCursorActivity(cm) {\n    var vim = cm.state.vim;\n    if (vim.insertMode) {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) {\n            return;\n        }\n        var lastChange = macroModeState.lastInsertModeChanges;\n        if (lastChange.expectCursorActivityForChange) {\n            lastChange.expectCursorActivityForChange = false;\n        }\n        else {\n            lastChange.maybeReset = true;\n        }\n    }\n    else if (!cm.curOp.isVimOp) {\n        handleExternalSelection(cm, vim);\n    }\n}\nfunction handleExternalSelection(cm, vim, keepHPos) {\n    var anchor = cm.getCursor('anchor');\n    var head = cm.getCursor('head');\n    if (vim.visualMode && !cm.somethingSelected()) {\n        exitVisualMode(cm, false);\n    }\n    else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) {\n        vim.visualMode = true;\n        vim.visualLine = false;\n        CodeMirror.signal(cm, \"vim-mode-change\", { mode: \"visual\" });\n    }\n    if (vim.visualMode) {\n        var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n        var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n        head = offsetCursor(head, 0, headOffset);\n        anchor = offsetCursor(anchor, 0, anchorOffset);\n        vim.sel = {\n            anchor: anchor,\n            head: head\n        };\n        updateMark(cm, vim, '<', cursorMin(head, anchor));\n        updateMark(cm, vim, '>', cursorMax(head, anchor));\n    }\n    else if (!vim.insertMode && !keepHPos) {\n        vim.lastHPos = cm.getCursor().ch;\n    }\n}\nfunction InsertModeKey(keyName) {\n    this.keyName = keyName;\n}\nfunction onKeyEventTargetKeyDown(e) {\n    var macroModeState = vimGlobalState.macroModeState;\n    var lastChange = macroModeState.lastInsertModeChanges;\n    var keyName = CodeMirror.keyName(e);\n    if (!keyName) {\n        return;\n    }\n    function onKeyFound() {\n        if (lastChange.maybeReset) {\n            lastChange.changes = [];\n            lastChange.maybeReset = false;\n        }\n        lastChange.changes.push(new InsertModeKey(keyName));\n        return true;\n    }\n    if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) {\n        CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound);\n    }\n}\nfunction repeatLastEdit(cm, vim, repeat, repeatForInsert) {\n    var macroModeState = vimGlobalState.macroModeState;\n    macroModeState.isPlaying = true;\n    var isAction = !!vim.lastEditActionCommand;\n    var cachedInputState = vim.inputState;\n    function repeatCommand() {\n        if (isAction) {\n            commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand);\n        }\n        else {\n            commandDispatcher.evalInput(cm, vim);\n        }\n    }\n    function repeatInsert(repeat) {\n        if (macroModeState.lastInsertModeChanges.changes.length > 0) {\n            repeat = !vim.lastEditActionCommand ? 1 : repeat;\n            var changeObject = macroModeState.lastInsertModeChanges;\n            repeatInsertModeChanges(cm, changeObject.changes, repeat);\n        }\n    }\n    vim.inputState = vim.lastEditInputState;\n    if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) {\n        for (var i = 0; i < repeat; i++) {\n            repeatCommand();\n            repeatInsert(1);\n        }\n    }\n    else {\n        if (!repeatForInsert) {\n            repeatCommand();\n        }\n        repeatInsert(repeat);\n    }\n    vim.inputState = cachedInputState;\n    if (vim.insertMode && !repeatForInsert) {\n        exitInsertMode(cm);\n    }\n    macroModeState.isPlaying = false;\n}\nfunction repeatInsertModeChanges(cm, changes, repeat) {\n    function keyHandler(binding) {\n        if (typeof binding == 'string') {\n            CodeMirror.commands[binding](cm);\n        }\n        else {\n            binding(cm);\n        }\n        return true;\n    }\n    var head = cm.getCursor('head');\n    var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock;\n    if (visualBlock) {\n        selectForInsert(cm, head, visualBlock + 1);\n        repeat = cm.listSelections().length;\n        cm.setCursor(head);\n    }\n    for (var i = 0; i < repeat; i++) {\n        if (visualBlock) {\n            cm.setCursor(offsetCursor(head, i, 0));\n        }\n        for (var j = 0; j < changes.length; j++) {\n            var change = changes[j];\n            if (change instanceof InsertModeKey) {\n                CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler);\n            }\n            else if (typeof change == \"string\") {\n                cm.replaceSelection(change);\n            }\n            else {\n                var start = cm.getCursor();\n                var end = offsetCursor(start, 0, change[0].length);\n                cm.replaceRange(change[0], start, end);\n                cm.setCursor(end);\n            }\n        }\n    }\n    if (visualBlock) {\n        cm.setCursor(offsetCursor(head, 0, 1));\n    }\n}\nresetVimGlobalState();\nCodeMirror.Vim = vimApi;\nvar specialKey = { 'return': 'CR', backspace: 'BS', 'delete': 'Del', esc: 'Esc',\n    left: 'Left', right: 'Right', up: 'Up', down: 'Down', space: 'Space', insert: 'Ins',\n    home: 'Home', end: 'End', pageup: 'PageUp', pagedown: 'PageDown', enter: 'CR'\n};\nfunction lookupKey(hashId, key, e) {\n    if (key.length > 1 && key[0] == \"n\") {\n        key = key.replace(\"numpad\", \"\");\n    }\n    key = specialKey[key] || key;\n    var name = '';\n    if (e.ctrlKey) {\n        name += 'C-';\n    }\n    if (e.altKey) {\n        name += 'A-';\n    }\n    if ((name || key.length > 1) && e.shiftKey) {\n        name += 'S-';\n    }\n    name += key;\n    if (name.length > 1) {\n        name = '<' + name + '>';\n    }\n    return name;\n}\nvar handleKey = vimApi.handleKey.bind(vimApi);\nvimApi.handleKey = function (cm, key, origin) {\n    return cm.operation(function () {\n        return handleKey(cm, key, origin);\n    }, true);\n};\nfunction cloneVimState(state) {\n    var n = new state.constructor();\n    Object.keys(state).forEach(function (key) {\n        var o = state[key];\n        if (Array.isArray(o))\n            o = o.slice();\n        else if (o && typeof o == \"object\" && o.constructor != Object)\n            o = cloneVimState(o);\n        n[key] = o;\n    });\n    if (state.sel) {\n        n.sel = {\n            head: state.sel.head && copyCursor(state.sel.head),\n            anchor: state.sel.anchor && copyCursor(state.sel.anchor)\n        };\n    }\n    return n;\n}\nfunction multiSelectHandleKey(cm, key, origin) {\n    var isHandled = false;\n    var vim = vimApi.maybeInitVimState_(cm);\n    var visualBlock = vim.visualBlock || vim.wasInVisualBlock;\n    var wasMultiselect = cm.ace.inMultiSelectMode;\n    if (vim.wasInVisualBlock && !wasMultiselect) {\n        vim.wasInVisualBlock = false;\n    }\n    else if (wasMultiselect && vim.visualBlock) {\n        vim.wasInVisualBlock = true;\n    }\n    if (key == '' && !vim.insertMode && !vim.visualMode && wasMultiselect) {\n        cm.ace.exitMultiSelectMode();\n    }\n    else if (visualBlock || !wasMultiselect || cm.ace.inVirtualSelectionMode) {\n        isHandled = vimApi.handleKey(cm, key, origin);\n    }\n    else {\n        var old = cloneVimState(vim);\n        cm.operation(function () {\n            cm.ace.forEachSelection(function () {\n                var sel = cm.ace.selection;\n                cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn;\n                var head = cm.getCursor(\"head\");\n                var anchor = cm.getCursor(\"anchor\");\n                var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n                var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n                head = offsetCursor(head, 0, headOffset);\n                anchor = offsetCursor(anchor, 0, anchorOffset);\n                cm.state.vim.sel.head = head;\n                cm.state.vim.sel.anchor = anchor;\n                isHandled = handleKey(cm, key, origin);\n                sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos;\n                if (cm.virtualSelectionMode()) {\n                    cm.state.vim = cloneVimState(old);\n                }\n            });\n            if (cm.curOp.cursorActivity && !isHandled)\n                cm.curOp.cursorActivity = false;\n        }, true);\n    }\n    if (isHandled && !vim.visualMode && !vim.insert && vim.visualMode != cm.somethingSelected()) {\n        handleExternalSelection(cm, vim, true);\n    }\n    return isHandled;\n}\nexports.CodeMirror = CodeMirror;\nvar getVim = vimApi.maybeInitVimState_;\nexports.handler = {\n    $id: \"ace/keyboard/vim\",\n    drawCursor: function (element, pixelPos, config, sel, session) {\n        var vim = this.state.vim || {};\n        var w = config.characterWidth;\n        var h = config.lineHeight;\n        var top = pixelPos.top;\n        var left = pixelPos.left;\n        if (!vim.insertMode) {\n            var isbackwards = !sel.cursor\n                ? session.selection.isBackwards() || session.selection.isEmpty()\n                : Range.comparePoints(sel.cursor, sel.start) <= 0;\n            if (!isbackwards && left > w)\n                left -= w;\n        }\n        if (!vim.insertMode && vim.status) {\n            h = h / 2;\n            top += h;\n        }\n        domLib.translate(element, left, top);\n        domLib.setStyle(element.style, \"width\", w + \"px\");\n        domLib.setStyle(element.style, \"height\", h + \"px\");\n    },\n    $getDirectionForHighlight: function (editor) {\n        var cm = editor.state.cm;\n        var vim = getVim(cm);\n        if (!vim.insertMode) {\n            return editor.session.selection.isBackwards() || editor.session.selection.isEmpty();\n        }\n    },\n    handleKeyboard: function (data, hashId, key, keyCode, e) {\n        var editor = data.editor;\n        var cm = editor.state.cm;\n        var vim = getVim(cm);\n        if (keyCode == -1)\n            return;\n        if (!vim.insertMode) {\n            if (hashId == -1) {\n                if (key.charCodeAt(0) > 0xFF) {\n                    if (data.inputKey) {\n                        key = data.inputKey;\n                        if (key && data.inputHash == 4)\n                            key = key.toUpperCase();\n                    }\n                }\n                data.inputChar = key;\n            }\n            else if (hashId == 4 || hashId == 0) {\n                if (data.inputKey == key && data.inputHash == hashId && data.inputChar) {\n                    key = data.inputChar;\n                    hashId = -1;\n                }\n                else {\n                    data.inputChar = null;\n                    data.inputKey = key;\n                    data.inputHash = hashId;\n                }\n            }\n            else {\n                data.inputChar = data.inputKey = null;\n            }\n        }\n        if (cm.state.overwrite && vim.insertMode && key == \"backspace\" && hashId == 0) {\n            return { command: \"gotoleft\" };\n        }\n        if (key == \"c\" && hashId == 1) { // key == \"ctrl-c\"\n            if (!useragent.isMac && editor.getCopyText()) {\n                editor.once(\"copy\", function () {\n                    if (vim.insertMode)\n                        editor.selection.clearSelection();\n                    else\n                        cm.operation(function () { exitVisualMode(cm); });\n                });\n                return { command: \"null\", passEvent: true };\n            }\n        }\n        if (key == \"esc\" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) {\n            var searchState = getSearchState(cm);\n            var overlay = searchState.getOverlay();\n            if (overlay)\n                cm.removeOverlay(overlay);\n        }\n        if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) {\n            var insertMode = vim.insertMode;\n            var name = lookupKey(hashId, key, e || {});\n            if (vim.status == null)\n                vim.status = \"\";\n            var isHandled = multiSelectHandleKey(cm, name, 'user');\n            vim = getVim(cm); // may be changed by multiSelectHandleKey\n            if (isHandled && vim.status != null)\n                vim.status += name;\n            else if (vim.status == null)\n                vim.status = \"\";\n            cm._signal(\"changeStatus\");\n            if (!isHandled && (hashId != -1 || insertMode))\n                return;\n            return { command: \"null\", passEvent: !isHandled };\n        }\n    },\n    attach: function (editor) {\n        if (!editor.state)\n            editor.state = {};\n        var cm = new CodeMirror(editor);\n        editor.state.cm = cm;\n        editor.$vimModeHandler = this;\n        CodeMirror.keyMap.vim.attach(cm);\n        getVim(cm).status = null;\n        cm.on('vim-command-done', function () {\n            if (cm.virtualSelectionMode())\n                return;\n            getVim(cm).status = null;\n            cm.ace._signal(\"changeStatus\");\n            cm.ace.session.markUndoGroup();\n        });\n        cm.on(\"changeStatus\", function () {\n            cm.ace.renderer.updateCursor();\n            cm.ace._signal(\"changeStatus\");\n        });\n        cm.on(\"vim-mode-change\", function () {\n            if (cm.virtualSelectionMode())\n                return;\n            updateInputMode();\n            cm._signal(\"changeStatus\");\n        });\n        function updateInputMode() {\n            var isIntsert = getVim(cm).insertMode;\n            cm.ace.renderer.setStyle(\"normal-mode\", !isIntsert);\n            editor.textInput.setCommandMode(!isIntsert);\n            editor.renderer.$keepTextAreaAtCursor = isIntsert;\n            editor.renderer.$blockCursor = !isIntsert;\n        }\n        updateInputMode();\n        editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm);\n    },\n    detach: function (editor) {\n        var cm = editor.state.cm;\n        CodeMirror.keyMap.vim.detach(cm);\n        cm.destroy();\n        editor.state.cm = null;\n        editor.$vimModeHandler = null;\n        editor.renderer.$cursorLayer.drawCursor = null;\n        editor.renderer.setStyle(\"normal-mode\", false);\n        editor.textInput.setCommandMode(false);\n        editor.renderer.$keepTextAreaAtCursor = true;\n    },\n    getStatusText: function (editor) {\n        var cm = editor.state.cm;\n        var vim = getVim(cm);\n        if (vim.insertMode)\n            return \"INSERT\";\n        var status = \"\";\n        if (vim.visualMode) {\n            status += \"VISUAL\";\n            if (vim.visualLine)\n                status += \" LINE\";\n            if (vim.visualBlock)\n                status += \" BLOCK\";\n        }\n        if (vim.status)\n            status += (status ? \" \" : \"\") + vim.status;\n        return status;\n    }\n};\nvimApi.defineOption({\n    name: \"wrap\",\n    set: function (value, cm) {\n        if (cm) {\n            cm.ace.setOption(\"wrap\", value);\n        }\n    },\n    type: \"boolean\"\n}, false);\nvimApi.defineEx('write', 'w', function () {\n    console.log(':write is not implemented');\n});\ndefaultKeymap.push({ keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } }, { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } }, { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true } }, { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } }, { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } }, { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorAbove\" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorBelow\" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorAboveSkipCurrent\" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorBelowSkipCurrent\" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectMoreBefore\" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectMoreAfter\" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectNextBefore\" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectNextAfter\" } });\ndefaultKeymap.push({\n    keys: 'gq',\n    type: 'operator',\n    operator: 'hardWrap'\n});\nvimApi.defineOperator(\"hardWrap\", function (cm, operatorArgs, ranges, oldAnchor, newHead) {\n    var anchor = ranges[0].anchor.line;\n    var head = ranges[0].head.line;\n    if (operatorArgs.linewise)\n        head--;\n    hardWrap(cm.ace, { startRow: anchor, endRow: head });\n    return Pos(head, 0);\n});\ndefineOption('textwidth', undefined, 'number', ['tw'], function (width, cm) {\n    if (cm === undefined) {\n        return;\n    }\n    if (width === undefined) {\n        var value = cm.ace.getOption('printMarginColumn');\n        return value;\n    }\n    else {\n        var column = Math.round(width);\n        if (column > 1) {\n            cm.ace.setOption('printMarginColumn', column);\n        }\n    }\n});\nactions.aceCommand = function (cm, actionArgs, vim) {\n    cm.vimCmd = actionArgs;\n    if (cm.ace.inVirtualSelectionMode)\n        cm.ace.on(\"beforeEndOperation\", delayedExecAceCommand);\n    else\n        delayedExecAceCommand(null, cm.ace);\n};\nfunction delayedExecAceCommand(op, ace) {\n    ace.off(\"beforeEndOperation\", delayedExecAceCommand);\n    var cmd = ace.state.cm.vimCmd;\n    if (cmd) {\n        ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args);\n    }\n    ace.curOp = ace.prevOp;\n}\nactions.fold = function (cm, actionArgs, vim) {\n    cm.ace.execCommand(['toggleFoldWidget', 'toggleFoldWidget', 'foldOther', 'unfoldall'\n    ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]);\n};\nexports.handler.defaultKeymap = defaultKeymap;\nexports.handler.actions = actions;\nexports.Vim = vimApi;\n\n});                (function() {\n                    ace.require([\"ace/keyboard/vim\"], function(m) {\n                        if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n                            module.exports = m;\n                        }\n                    });\n                })();\n            "],"mappings":"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","names":["require_c1ef58663e7326fe623bed35be305efd","__commonJSMin","exports","module","require","Range","hardWrap","editor","options","max","allowMerge","row","endRow","session","line","space","findSpace","indentation","nextLine","trimmedLine","trimmedNextLine","mergedLine","replaceRange","min","before","after","spaceAfter","spaceBefore","start","end","wrapAfterInput","e","cursor","lastDelta","Editor","val","log","d","format","p","x","i","f","EventEmitter","domLib","oop","KEYS","event","Search","useragent","SearchHighlight","multiSelectCommands","TextModeTokenRe","CodeMirror","ace","ch","Pos","name","setter","cm","key","m","cmd","lookupKey","map","handle","found","result","head","o","delta","change","curOp","fn","force","prevOp","op","eventName","handlers","listeners","shouldScroll","sel","pos","toCmPos","ranges","r","primIndex","anchor","toAcePos","range","a","h","isInsert","rowShift","colShift","point","cmp","cmp2","Marker","id","column","bm","increment","unit","amount","goalColumn","renderer","config","screenPos","mode","sc","lh","cw","top","col","query","caseFold","caseSensitive","isRegexp","search","acePos","last","back","text","y","maxHeight","margin","viewMargin","s","optMap","aceOpt","on","highlight","marker","re","v","token","method","index","dir","_","tokenRe","cmPos","StringStream","string","tabSize","match","ok","n","pattern","consume","caseInsensitive","cased","str","substr","inner","dialogDiv","template","bottom","wrap","dialog","closeNotification","newVal","callback","closed","me","close","inp","button","doneTimer","duration","transformCursor","vim","updateSelectionForSurrogateCharacters","curStart","curEnd","charCode","defaultKeymap","defaultKeymapLength","defaultExCommandMap","enterVimMode","onCursorActivity","maybeInitVimState","getOnPasteFn","leaveVimMode","highlightTimeout","detachVimMap","next","attachVimMap","prev","cmKey","vimKey","cmKeyToVimKey","vimApi","modifiers","specialKeys","pieces","lastPiece","hasCharacter","piece","isUpperCase","offsetCursor","actions","numberRegex","wordCharTest","bigWordCharTest","makeKeyRange","size","keys","upperCaseAlphabet","lowerCaseAlphabet","numbers","validMarks","validRegisters","upperCaseChars","isLine","isLowerCase","k","isMatchableSymbol","isNumber","isWhiteSpaceString","isEndOfSentenceSymbol","inArray","arr","defineOption","defaultValue","type","aliases","setOption","value","cfg","option","scope","getOption","local","createCircularJumpList","pointer","tail","buffer","add","oldCur","newCur","current","curMark","useNextSlot","trashMark","markPos","cursorEqual","move","offset","mark","inc","find","oldPointer","createInsertModeChanges","c","MacroModeState","macroModeState","vimGlobalState","registerName","register","dom","InputState","resetVimGlobalState","RegisterController","HistoryController","optionName","lastInsertModeKeyTimer","InsertModeKey","lhs","rhs","ctx","exCommandDispatcher","toCtxArray","ctxsToMap","actualLength","origLength","mapping","newMapping","mappedCtxs","el","userKeymap","contexts","j","prefix","func","exCommands","origin","command","multiSelectHandleKey","handleMacroRecording","clearInputState","logKey","handleEsc","exitVisualMode","exitInsertMode","doKeyToKey","handleKeyInsertMode","keysAreChars","commandDispatcher","thisMatch","selections","here","handleKeyNonInsertMode","keysMatcher","context","mainKey","input","defineMotion","defineAction","defineOperator","mapCommand","_mapCommand","defineRegister","repeat","reason","Register","linewise","blockwise","changes","registers","operator","append","up","historyBuffer","element","keyMap","inputState","matches","commandMatches","bestMatch","character","lastChar","copyArgs","updateCmSelection","visualMode","operatorMotionArgs","repeatIsExplicit","actionArgs","forward","wholeWordOnly","getSearchState","promptPrefix","originalQuery","originalScrollPos","handleQuery","ignoreCase","smartCase","updateSearchQuery","showConfirm","onPromptClose","logSearchQuery","onPromptKeyUp","keyName","parsedQuery","findNext","clearSearchHighlight","onPromptKeyDown","showPrompt","word","expandWordUnderCursor","isKeyword","escapeRegex","motion","motionArgs","operatorArgs","origHead","copyCursor","clipCursorToContent","origAnchor","oldHead","oldAnchor","newHead","newAnchor","motionResult","motions","jumpList","cachedCursor","recordJumpPosition","updateMark","cursorIsBefore","lastSel","lineOffset","chOffset","cmSel","cursorMin","cursorMax","newPositions","makeCmSelection","lineLength","tmp","expandSelectionToLine","clipToLine","exclusive","operatorMoveTo","operators","actionCommand","_head","getUserVisibleLines","findFirstNonWhiteSpaceCharacter","_cm","cur","state","highlightSearchMatches","prevInputState","findNextFromAndToInclusive","from","to","getMarkPos","best","isWrongDirection","equal","between","cursorIsBetween","endCh","first","moveToEol","fold","res","lastCharCoords","goalCoords","resCoords","findParagraph","findSentence","scrollbox","orig","dest","moveToWord","moveToCharacter","recordLastCharacterSearch","findSymbol","moveToColumn","lineText","symbol","style","matched","lineNum","mirroredPairs","selfPaired","inclusive","selectCompanionObject","findBeginningAndEnd","expandTagUnderCursor","content","getSentence","expandSelection","lastSearch","fillArray","times","args","finalHead","replacement","lastState","prevLineEnd","wasLastLine","startLine","endLine","_args","swapped","toLower","toSwap","endPos","lineHeight","newPos","cursorCoords","newBottom","charCoords","height","lineLastCharPos","lineLastCharCoords","executeMacroRegister","insertAt","newPosition","getLastEditPos","onChange","onKeyEventTargetKeyDown","selectForInsert","_actionArgs","lastSelection","updateLastSelection","finalCh","nextStartCh","curFinalPos","newlineFn","_this","whitespaceLength","tabs","spaces","currentLine","indent","chompedText","wasChomped","firstIndent","wspace","newIndent","quotient","curPosFinal","idx","lastSelectionCurEnd","selectedArea","getSelectedAreaRange","selectionStart","selectionEnd","selectedText","emptyStrings","selectBlock","lastCh","extendLineToColumn","repeatFn","markName","replaceWith","replaceTo","replaceWithStr","lineStr","numberStr","baseStr","digits","base","number","zeroPadding","lastEditInputState","repeatLastEdit","includeLineBreak","maxCh","direction","ret","prop","offsetLine","offsetCh","partial","full","commandMatch","pressed","mapped","prefixLen","pressedPrefix","mappedPrefix","selectedCharacter","cur1","cur2","cur3","cur1before2","cur2before3","trim","isClipped","curHead","getIndex","wasClipped","firstLine","lastLine","baseCh","headCh","newDir","lineHead","atAnchor","atHead","getCurrentSelectedAreaRange","getLastSelectedAreaRange","block","width","headOffset","anchorOffset","fromCh","toCh","primary","getHead","moveHead","selection","lines","firstNonWS","_forward","bigWord","noSymbol","test","wordEnd","wordStart","tags","symbolToMode","findSymbolModes","symb","curCh","init","isComplete","lineLen","findWord","emptyLineIsWord","charTests","stop","foundWord","words","eodCh","shortCircuit","firstWord","lastWord","keepHPos","retval","charIdxInLine","includeChar","isEmpty","isBoundary","any","skipFold","foldLine","startState","nextChar","curr","ln","lastSentencePos","reverse","curr_index","last_valid","skip_empty_lines","bracketRegexp","openSym","curChar","chars","len","firstIndex","SearchState","overlay","reversed","annotate","splitBySlash","argString","splitBySeparator","findUnescapedSlashes","findUnescapedSeparators","separator","slashes","tokens","escapeNextChar","translateRegex","specials","unescape","out","specialComesNext","charUnescapes","translateRegexReplace","unescapes","unescapeRegexReplace","stream","output","matcher","parseQuery","lastSearchRegister","regexPart","forceIgnoreCase","flagsPart","regexp","pre","makePrompt","desc","shortText","regexEqual","r1","r2","props","rawQuery","searchOverlay","matchSol","searchState","lastEndPos","isInRange","undoManager","ExCommandDispatcher","opt_params","that","commandHistoryRegister","previousCommand","inputStream","params","commandName","numberMatch","offsetMatch","delim","mapArgs","setArgs","setCfg","expr","forceGet","optionIsBoolean","oldValue","setOptionReturn","regArgs","regInfo","unique","parseArgs","opts","decimal","hex","octal","err","lineStart","lineEnd","radix","numPart","textPart","matchPart","compareFn","b","anum","bnum","comparePatternFn","textOld","inverted","matchedLines","nextCommand","replacePart","trailing","count","confirm","global","startPos","doReplace","sym","startMark","finishMark","finish","searchCursor","done","lastPos","modifiedLineNumber","joined","replaceAll","replace","newText","unmodifiedLineNumber","findNextValidMatch","lastMatchTo","_value","savedCallback","insertModeChangeRegister","isPlaying","lastChange","logInsertModeChange","extra","keyBuffer","imc","repeatInsertModeChanges","changeObj","selectionCount","handleExternalSelection","onKeyFound","repeatForInsert","isAction","cachedInputState","repeatCommand","repeatInsert","changeObject","keyHandler","binding","visualBlock","specialKey","hashId","handleKey","cloneVimState","isHandled","wasMultiselect","old","getVim","pixelPos","w","left","isbackwards","data","keyCode","insertMode","updateInputMode","isIntsert","status","delayedExecAceCommand"],"sourceRoot":"","file":"c1ef58663e7326fe623bed35be305efd.js"}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy