Skip to content

Instantly share code, notes, and snippets.

@jonsherrard
Last active December 13, 2015 21:18
Show Gist options
  • Save jonsherrard/4976588 to your computer and use it in GitHub Desktop.
Save jonsherrard/4976588 to your computer and use it in GitHub Desktop.
A Userscript compatible version of VimFlowy plugin for Workflowy - https://github.com/thricedotted/vimflowy
function enterNormalMode() {
console.log("entering normal mode");
$(".editor > textarea").bind("keydown", blockAll);
$(".editor > textarea").addModalKeyboardShortcuts(normalKeybindings, insertKeybindings)
}
function enterInsertMode(e) {
e.preventDefault();
console.log("entering insert mode");
$(".editor > textarea").unbind("keydown", blockAll);
$(".editor > textarea").addModalKeyboardShortcuts(insertKeybindings, normalKeybindings)
}(function () {
function e(e) {
if (typeof e.value != "undefined") return "value";
if (typeof e.text != "undefined") return "text";
if (typeof e.textContent != "undefined") return "textContent";
return "innerText"
}
function t() {}
function n() {}
function r(e, t) {
var n = t.text.replace(/\r/g, "").length;
if (e.compareEndPoints("StartToStart", t) <= 0) return 0;
if (e.compareEndPoints("StartToEnd", t) >= 0) return n;
for (var r = 0; e.compareEndPoints("StartToStart", t) > 0; ++r, e.moveStart("character", -1));
return r
}
function i(e, t) {
var n = t.text.replace(/\r/g, "").length;
if (e.compareEndPoints("EndToEnd", t) >= 0) return n;
if (e.compareEndPoints("EndToStart", t) <= 0) return 0;
for (var r = 0; e.compareEndPoints("EndToStart", t) > 0; ++r, e.moveEnd("character", -1));
return r
}
function s() {}
function o() {}
function u(e, t) {
if (e.firstChild) return e.firstChild;
if (e.nextSibling) return e.nextSibling;
if (e === t) return null;
while (e.parentNode) {
e = e.parentNode;
if (e == t) return null;
if (e.nextSibling) return e.nextSibling
}
return null
}
function a(e, t, n, r) {
if (t <= 0) return;
var i = e[n ? "startContainer" : "endContainer"];
if (i.nodeType == 3) {
t += e[n ? "startOffset" : "endOffset"]
}
while (i) {
if (i.nodeType == 3) {
if (t <= i.nodeValue.length) {
e[n ? "setStart" : "setEnd"](i, t);
if (t == i.nodeValue.length) {
for (var s = u(i, r); s && s.nodeType == 3 && s.nodeValue.length == 0; s = u(s, r)) {
e[n ? "setStartAfter" : "setEndAfter"](s)
}
if (s && s.nodeType == 1 && s.nodeName == "BR") e[n ? "setStartAfter" : "setEndAfter"](s)
}
return
} else {
e[n ? "setStartAfter" : "setEndAfter"](i);
t -= i.nodeValue.length
}
}
i = u(i, r)
}
}
function p(e, t) {
if (e.compareBoundaryPoints(f, t) <= 0) return 0;
if (e.compareBoundaryPoints(h, t) >= 0) return t.toString().length;
e = e.cloneRange();
e.setEnd(t.endContainer, t.endOffset);
return t.toString().length - e.toString().length
}
function d(e, t) {
if (e.compareBoundaryPoints(c, t) >= 0) return t.toString().length;
if (e.compareBoundaryPoints(l, t) <= 0) return 0;
e = e.cloneRange();
e.setStart(t.startContainer, t.startOffset);
return e.toString().length
}
function v() {}
bililiteRange = function (t, r) {
var i;
if (r) {
i = new v
} else if (document.selection) {
i = new n
} else if (window.getSelection && t.setSelectionRange) {
i = new s
} else if (window.getSelection) {
i = new o
} else {
i = new v
}
i._el = t;
i._textProp = e(t);
i._bounds = [0, i.length()];
return i
};
t.prototype = {
length: function () {
return this._el[this._textProp].replace(/\r/g, "").length
},
bounds: function (e) {
if (e === "all") {
this._bounds = [0, this.length()]
} else if (e === "start") {
this._bounds = [0, 0]
} else if (e === "end") {
this._bounds = [this.length(), this.length()]
} else if (e === "selection") {
this.bounds("all");
this._bounds = this._nativeSelection()
} else if (e) {
this._bounds = e
} else {
var t = [Math.max(0, Math.min(this.length(), this._bounds[0])), Math.max(0, Math.min(this.length(), this._bounds[1]))];
return t
}
return this
},
select: function () {
this._nativeSelect(this._nativeRange(this.bounds()));
return this
},
text: function (e, t) {
if (arguments.length) {
this._nativeSetText(e, this._nativeRange(this.bounds()));
if (t == "start") {
this.bounds([this._bounds[0], this._bounds[0]]);
this.select()
} else if (t == "end") {
this.bounds([this._bounds[0] + e.length, this._bounds[0] + e.length]);
this.select()
} else if (t == "all") {
this.bounds([this._bounds[0], this._bounds[0] + e.length]);
this.select()
}
return this
} else {
return this._nativeGetText(this._nativeRange(this.bounds()))
}
},
insertEOL: function () {
this._nativeEOL();
this._bounds = [this._bounds[0] + 1, this._bounds[0] + 1];
return this
}
};
n.prototype = new t;
n.prototype._nativeRange = function (e) {
var t;
if (this._el.tagName == "INPUT") {
t = this._el.createTextRange()
} else {
t = document.body.createTextRange();
t.moveToElementText(this._el)
}
if (e) {
if (e[1] < 0) e[1] = 0;
if (e[0] > this.length()) e[0] = this.length();
if (e[1] < t.text.replace(/\r/g, "").length) {
t.moveEnd("character", -1);
t.moveEnd("character", e[1] - t.text.replace(/\r/g, "").length)
}
if (e[0] > 0) t.moveStart("character", e[0])
}
return t
};
n.prototype._nativeSelect = function (e) {
e.select()
};
n.prototype._nativeSelection = function () {
var e = this._nativeRange();
var t = this.length();
if (document.selection.type != "Text") return [t, t];
var n = document.selection.createRange();
try {
return [r(n, e), i(n, e)]
} catch (s) {
return n.parentElement().sourceIndex < this._el.sourceIndex ? [0, 0] : [t, t]
}
};
n.prototype._nativeGetText = function (e) {
return e.text.replace(/\r/g, "")
};
n.prototype._nativeSetText = function (e, t) {
t.text = e
};
n.prototype._nativeEOL = function () {
if (typeof this._el.value != "undefined") {
this.text("\n")
} else {
this._nativeRange(this.bounds()).pasteHTML("<br/>")
}
};
s.prototype = new t;
s.prototype._nativeRange = function (e) {
return e || [0, this.length()]
};
s.prototype._nativeSelect = function (e) {
this._el.setSelectionRange(e[0], e[1])
};
s.prototype._nativeSelection = function () {
return [this._el.selectionStart, this._el.selectionEnd]
};
s.prototype._nativeGetText = function (e) {
return this._el.value.substring(e[0], e[1])
};
s.prototype._nativeSetText = function (e, t) {
var n = this._el.value;
this._el.value = n.substring(0, t[0]) + e + n.substring(t[1])
};
s.prototype._nativeEOL = function () {
this.text("\n")
};
o.prototype = new t;
o.prototype._nativeRange = function (e) {
var t = document.createRange();
t.selectNodeContents(this._el);
if (e) {
a(t, e[0], true, this._el);
t.collapse(true);
a(t, e[1] - e[0], false, this._el)
}
return t
};
o.prototype._nativeSelect = function (e) {
window.getSelection().removeAllRanges();
window.getSelection().addRange(e)
};
o.prototype._nativeSelection = function () {
var e = this._nativeRange();
if (window.getSelection().rangeCount == 0) return [this.length(), this.length()];
var t = window.getSelection().getRangeAt(0);
return [p(t, e), d(t, e)]
};
o.prototype._nativeGetText = function (e) {
return e.toString()
};
o.prototype._nativeSetText = function (e, t) {
t.deleteContents();
t.insertNode(document.createTextNode(e));
this._el.normalize()
};
o.prototype._nativeEOL = function () {
var e = this._nativeRange(this.bounds());
e.deleteContents();
var t = document.createElement("br");
t.setAttribute("_moz_dirty", "");
e.insertNode(t);
e.insertNode(document.createTextNode("\n"));
e.collapse(false)
};
var f = 0;
var l = 1;
var c = 2;
var h = 3;
v.prototype = new t;
v.prototype._nativeRange = function (e) {
return e || [0, this.length()]
};
v.prototype._nativeSelect = function (e) {};
v.prototype._nativeSelection = function () {
return [0, 0]
};
v.prototype._nativeGetText = function (e) {
return this._el[this._textProp].substring(e[0], e[1])
};
v.prototype._nativeSetText = function (e, t) {
var n = this._el[this._textProp];
this._el[this._textProp] = n.substring(0, t[0]) + e + n.substring(t[1])
};
v.prototype._nativeEOL = function () {
this.text("\n")
}
})();
(function (e) {
"use strict";
function i(e) {
return r.test(Object.prototype.toString.call(e))
}
function s(e) {
for (var t = 0; t < window.frames.length; t += 1) {
if (window.frames[t].document === e) {
return window.frames[t]
}
}
return window
}
function o(t) {
var n, r;
t = e(t);
if (i(t[0])) {
r = t;
n = {
left: 0,
top: 0
}
} else {
r = e(t[0].ownerDocument || document);
n = t.offset()
}
return {
x: n.left + t.outerWidth() / 2 - r.scrollLeft(),
y: n.top + t.outerHeight() / 2 - r.scrollTop()
}
}
var t = /^key/,
n = /^(?:mouse|contextmenu)|click/,
r = /\[object (?:HTML)?Document\]/;
e.fn.simulate = function (t, n) {
return this.each(function () {
new e.simulate(this, t, n)
})
};
e.simulate = function (t, n, r) {
var i = e.camelCase("simulate-" + n);
this.target = t;
this.options = r || {};
if (this[i]) {
this[i]()
} else {
this.simulateEvent(t, n, this.options)
}
};
e.extend(e.simulate.prototype, {
simulateEvent: function (e, t, n) {
var r = this.createEvent(t, n);
this.dispatchEvent(e, t, r, n)
},
createEvent: function (e, r) {
if (t.test(e)) {
return this.keyEvent(e, r)
}
if (n.test(e)) {
return this.mouseEvent(e, r)
}
},
mouseEvent: function (t, n) {
var r, o, u = i(this.target) ? this.target : this.target.ownerDocument || document,
a, f;
n = e.extend({
bubbles: true,
cancelable: t !== "mousemove",
view: s(u),
detail: 0,
screenX: 0,
screenY: 0,
clientX: 1,
clientY: 1,
ctrlKey: false,
altKey: false,
shiftKey: false,
metaKey: false,
button: 0,
relatedTarget: undefined
}, n);
if (u.createEvent) {
r = u.createEvent("MouseEvents");
r.initMouseEvent(t, n.bubbles, n.cancelable, n.view, n.detail, n.screenX, n.screenY, n.clientX, n.clientY, n.ctrlKey, n.altKey, n.shiftKey, n.metaKey, n.button, n.relatedTarget || u.body.parentNode);
if (r.pageX === 0 && r.pageY === 0 && Object.defineProperty) {
o = i(r.relatedTarget) ? r.relatedTarget : r.relatedTarget.ownerDocument || document;
a = o.documentElement;
f = o.body;
Object.defineProperty(r, "pageX", {
get: function () {
return n.clientX + (a && a.scrollLeft || f && f.scrollLeft || 0) - (a && a.clientLeft || f && f.clientLeft || 0)
}
});
Object.defineProperty(r, "pageY", {
get: function () {
return n.clientY + (a && a.scrollTop || f && f.scrollTop || 0) - (a && a.clientTop || f && f.clientTop || 0)
}
})
}
} else if (u.createEventObject) {
r = u.createEventObject();
e.extend(r, n);
r.button = {
0: 1,
1: 4,
2: 2
}[r.button] || r.button
}
return r
},
keyEvent: function (t, n) {
var r, o;
n = e.extend({
bubbles: true,
cancelable: true,
view: s(o),
ctrlKey: false,
altKey: false,
shiftKey: false,
metaKey: false,
keyCode: 0,
charCode: undefined
}, n);
o = i(this.target) ? this.target : this.target.ownerDocument || document;
if (o.createEvent) {
try {
r = o.createEvent("KeyEvents");
r.initKeyEvent(t, n.bubbles, n.cancelable, n.view, n.ctrlKey, n.altKey, n.shiftKey, n.metaKey, n.keyCode, n.charCode)
} catch (u) {
r = o.createEvent("Events");
r.initEvent(t, n.bubbles, n.cancelable);
e.extend(r, {
view: n.view,
ctrlKey: n.ctrlKey,
altKey: n.altKey,
shiftKey: n.shiftKey,
metaKey: n.metaKey,
keyCode: n.keyCode,
charCode: n.charCode
})
}
} else if (o.createEventObject) {
r = o.createEventObject();
e.extend(r, n)
}
if (e.browser.msie || e.browser.opera) {
r.keyCode = n.charCode > 0 ? n.charCode : n.keyCode;
r.charCode = undefined
}
return r
},
dispatchEvent: function (e, t, n) {
if (e.dispatchEvent) {
e.dispatchEvent(n)
} else if (e.fireEvent) {
e.fireEvent("on" + t, n)
}
},
simulateFocus: function () {
function i() {
n = true
}
var t, n = false,
r = e(this.target);
r.bind("focus", i);
r[0].focus();
if (!n) {
t = e.Event("focusin");
t.preventDefault();
r.trigger(t);
r.triggerHandler("focus")
}
r.unbind("focus", i)
},
simulateBlur: function () {
function i() {
n = true
}
var t, n = false,
r = e(this.target);
r.bind("blur", i);
r[0].blur();
setTimeout(function () {
if (r[0].ownerDocument.activeElement === r[0]) {
r[0].ownerDocument.body.focus()
}
if (!n) {
t = e.Event("focusout");
t.preventDefault();
r.trigger(t);
r.triggerHandler("blur")
}
r.unbind("blur", i)
}, 1)
}
});
e.extend(e.simulate.prototype, {
simulateDrag: function () {
var e = this.target,
t = this.options,
n = o(e),
r = Math.floor(n.x),
s = Math.floor(n.y),
u = t.dx || 0,
a = t.dy || 0,
f = {
clientX: r,
clientY: s
}, l = i(e) ? e : e.ownerDocument || document;
this.simulateEvent(e, "mousedown", f);
f = {
clientX: r + 1,
clientY: s + 1
};
this.simulateEvent(l, "mousemove", f);
f = {
clientX: r + u,
clientY: s + a
};
this.simulateEvent(l, "mousemove", f);
this.simulateEvent(l, "mousemove", f);
this.simulateEvent(e, "mouseup", f);
this.simulateEvent(e, "click", f)
}
})
})(jQuery);
(function (e) {
"use strict";
var t = e.simulate.prototype.mouseEvent,
n = /\[object (?:HTML)?Document\]/;
e.simulate.prototype.mouseEvent = function (r, i) {
if (i.pageX || i.pageY) {
var s = n.test(Object.prototype.toString.call(this.target)) ? this.target : this.target.ownerDocument || document;
i.clientX = (i.pageX || 0) - e(s).scrollLeft();
i.clientY = (i.pageY || 0) - e(s).scrollTop()
}
return t.apply(this, [r, i])
}
})(jQuery);
(function (e) {
"use strict";
e.extend(e.simulate.prototype, {
simulateKeySequence: function () {
function o() {
e(t).trigger({
type: "simulate-keySequence",
sequence: r
});
if (e.isFunction(n.callback)) {
n.callback.apply(t, [{
sequence: r
}])
}
}
function u() {
var t = f() - l;
if (t >= n.delay) {
var c = a.exec(r);
if (c !== null) {
var h = c[0];
(i[h] || e.simulate.prototype.simulateKeySequence.defaults[h] || e.simulate.prototype.simulateKeySequence.defaults.simplechar)(s, h, n);
setTimeout(u, n.delay)
} else {
o()
}
l = f()
} else {
setTimeout(u, n.delay - t)
}
}
var t = this.target,
n = e.extend({
sequence: "",
triggerKeyEvents: true,
delay: 0,
callback: undefined
}, this.options),
r = n.sequence;
n.delay = parseInt(n.delay, 10);
var i = e.extend({}, n, e(t).data("simulate-keySequence"));
var s = e.data(t, "simulate-keySequence.selection");
if (!s) {
s = bililiteRange(t).bounds("selection");
e.data(t, "simulate-keySequence.selection", s);
e(t).bind("mouseup.simulate-keySequence", function () {
e.data(t, "simulate-keySequence.selection").bounds("selection")
}).bind("keyup.simulate-keySequence", function (n) {
if (n.which === 9) {
e.data(t, "simulate-keySequence.selection").select()
} else {
e.data(t, "simulate-keySequence.selection").bounds("selection")
}
})
}
t.focus();
if (typeof r === "undefined") {
return
}
r = r.replace(/\n/g, "{enter}");
if (!n.delay || n.delay <= 0) {
r.replace(/\{[^}]*\}|[^{]+/g, function (t) {
(i[t] || e.simulate.prototype.simulateKeySequence.defaults[t] || e.simulate.prototype.simulateKeySequence.defaults.simplechar)(s, t, n)
});
o()
} else {
var a = /\{[^}]*\}|[^{]/g;
var f = Date.now || function () {
return (new Date).getTime()
}, l = f();
u()
}
}
});
e.extend(e.simulate.prototype.simulateKeySequence.prototype, {
IEKeyCodeTable: {
33: 49,
64: 50,
35: 51,
36: 52,
37: 53,
94: 54,
38: 55,
42: 56,
40: 57,
41: 48,
59: 186,
58: 186,
61: 187,
43: 187,
44: 188,
60: 188,
45: 189,
95: 189,
46: 190,
62: 190,
47: 191,
63: 191,
96: 192,
126: 192,
91: 219,
123: 219,
92: 220,
124: 220,
93: 221,
125: 221,
39: 222,
34: 222
},
charToKeyCode: function (t) {
var n = e.simulate.prototype.simulateKeySequence.prototype.IEKeyCodeTable;
var r = t.charCodeAt(0);
if (r >= 64 && r <= 90 || r >= 48 && r <= 57) {
return r
} else if (r >= 97 && r <= 122) {
return t.toUpperCase().charCodeAt(0)
} else if (n[r] !== undefined) {
return n[r]
} else {
return r
}
}
});
e.simulate.prototype.simulateKeySequence.defaults = {
simplechar: function (t, n, r) {
t.text(n, "end");
if (r.triggerKeyEvents) {
for (var i = 0; i < n.length; i += 1) {
var s = n.charCodeAt(i);
var o = e.simulate.prototype.simulateKeySequence.prototype.charToKeyCode(n.charAt(i));
e(t._el).simulate("keydown", {
keyCode: o
});
e(t._el).simulate("keypress", {
keyCode: s,
which: s,
charCode: s
});
e(t._el).simulate("keyup", {
keyCode: o
})
}
}
},
"{{}": function (t, n, r) {
e.simulate.prototype.simulateKeySequence.defaults.simplechar(t, "{", r)
},
"{enter}": function (t, n, r) {
t.insertEOL();
t.select();
if (r.triggerKeyEvents === true) {
e(t._el).simulate("keydown", {
keyCode: 13
});
e(t._el).simulate("keypress", {
keyCode: 13,
which: 13,
charCode: 13
});
e(t._el).simulate("keyup", {
keyCode: 13
})
}
},
"{backspace}": function (t, n, r) {
var i = t.bounds();
if (i[0] === i[1]) {
t.bounds([i[0] - 1, i[0]])
}
t.text("", "end");
if (r.triggerKeyEvents === true) {
e(t._el).simulate("keydown", {
keyCode: 8
});
e(t._el).simulate("keyup", {
keyCode: 8
})
}
},
"{del}": function (t, n, r) {
var i = t.bounds();
if (i[0] === i[1]) {
t.bounds([i[0], i[0] + 1])
}
t.text("", "end");
if (r.triggerKeyEvents === true) {
e(t._el).simulate("keydown", {
keyCode: 46
});
e(t._el).simulate("keyup", {
keyCode: 46
})
}
},
"{rightarrow}": function (t, n, r) {
var i = t.bounds();
if (i[0] === i[1]) {
i[1] += 1
}
t.bounds([i[1], i[1]]).select();
if (r.triggerKeyEvents === true) {
e(t._el).simulate("keydown", {
keyCode: 39
});
e(t._el).simulate("keyup", {
keyCode: 39
})
}
},
"{leftarrow}": function (t, n, r) {
var i = t.bounds();
if (i[0] === i[1]) {
i[0] -= 1
}
t.bounds([i[0], i[0]]).select();
if (r.triggerKeyEvents === true) {
e(t._el).simulate("keydown", {
keyCode: 37
});
e(t._el).simulate("keyup", {
keyCode: 37
})
}
},
"{selectall}": function (e) {
e.bounds("all").select()
}
}
})(jQuery);
jQuery.fn.addModalKeyboardShortcuts = function (e, t) {
this.each(function () {
for (var n in e) {
if (e.hasOwnProperty(n)) {
$(this).bind("keydown", n, e[n])
}
}
for (var n in t) {
if (t.hasOwnProperty(n)) {
$(this).unbind("keydown", t[n])
}
}
})
};
jQuery.fn.addGlobalKeyboardShortcuts = function () {
this.each(function () {
$(this).registerHandlerForShortcuts("s", ["ctrl", "meta"], function () {
saveEditingContent();
pushpoll.scheduleNextPushAndPoll(true);
return false
});
$(this).registerHandlerForShortcuts("z", ["ctrl", "meta"], function () {
undoredo.undo();
return false
});
$(this).registerHandlerForShortcuts("shift+z", ["ctrl", "meta"], function () {
undoredo.redo();
return false
});
$(this).registerHandlerForShortcuts("y", ["ctrl", "meta"], function () {
undoredo.redo();
return false
});
$(this).registerHandlerForShortcuts("home", ["ctrl", "meta"], function () {
var e = getCurrentlyFocusedEditor();
if (!(e !== null && e.isNote())) {
focusFirstProject();
return false
}
});
$(this).registerHandlerForShortcuts("end", ["ctrl", "meta"], function () {
var e = getCurrentlyFocusedEditor();
if (!(e !== null && e.isNote())) {
focusLastProject();
return false
}
});
$(this).registerHandlerForShortcuts("shift+/", ["ctrl", "meta"], function () {
keyboardShortcutHelper.toggle();
return false
});
$(this).registerHandlerForShortcuts("/", ["ctrl", "meta"], function () {
keyboardShortcutHelper.toggle();
return false
})
});
return this
};
var commands = {
deleteWordBack: function (e) {
e.preventDefault();
var t = indexOfNextCaret($(e.target).getCaret().start, $(e.target).val(), {
backward: true,
shift: true
});
var n = $(e.target).getCaret().start - t;
for (var r = 0; r < n; r++) {
$(e.target).simulate("key-sequence", {
sequence: "{backspace}",
triggerKeyEvents: true
})
}
return false
},
deleteItemBack: function (e) {
e.preventDefault();
var t = $(e.target).getCaret().start;
for (var n = 0; n < t; n++) {
$(e.target).simulate("key-sequence", {
sequence: "{backspace}",
triggerKeyEvents: true
})
}
return false
},
moveWordForward: function (e) {
e.preventDefault();
var t = indexOfNextCaret($(e.target).getCaret().start, $(e.target).val(), {
shift: true
});
if (t > 0) {
$(e.target).setCaret(t)
} else {
$(e.target).setCaret($(e.target).val().length);
$(e.target).rightArrowHandler()
}
return false
},
moveWordBackward: function (e) {
e.preventDefault();
var t = indexOfNextCaret($(e.target).getCaret().start, $(e.target).val(), {
backward: true,
shift: true
});
if (t > -1) {
$(e.target).setCaret(t)
} else {
$(e.target).setCaret(0);
$(e.target).leftArrowHandler()
}
return false
},
doBackspace: function (e) {
e.preventDefault();
$(e.target).simulate("key-sequence", {
sequence: "{backspace}",
triggerKeyEvents: true
});
return false
},
moveDown: function (e) {
e.preventDefault();
$(e.target).downArrowHandler();
return false
},
moveUp: function (e) {
e.preventDefault();
$(e.target).upArrowHandler();
return false
},
moveLeft: function (e) {
e.preventDefault();
if ($(e.target).getCaret().start === 0) {
$(e.target).leftArrowHandler()
} else {
$(e.target).simulate("key-sequence", {
sequence: "{leftarrow}",
triggerKeyEvents: false
})
}
return false
},
moveRight: function (e) {
e.preventDefault();
if ($(e.target).getCaret().start === $(e.target).val().length) {
$(e.target).rightArrowHandler()
} else {
$(e.target).simulate("key-sequence", {
sequence: "{rightarrow}",
triggerKeyEvents: false
})
}
return false
},
doUndo: function (e) {
undoredo.undo();
return false
},
doRedo: function (e) {
e.preventDefault();
undoredo.redo();
return false
},
toggleFold: function (e) {
$(e.target).keyboardExpandToggle();
return false
},
openFold: function (e) {
$(e.target).keyboardExpand();
return false
},
closeFold: function (e) {
$(e.target).keyboardCollapse();
return false
},
zoomInFold: function (e) {
$(e.target).keyboardZoomIn();
return false
},
zoomOutFold: function (e) {
keyboardZoomOut();
return false
},
doIndent: function (e) {
$(e.target).indentProject();
return false
},
doDedent: function (e) {
$(e.target).dedentProject();
return false
},
createNewAfter: function (e) {
e.preventDefault();
$(e.target).setCaret($(e.target).val().length);
$(e.target).returnHandler();
enterInsertMode(e);
return false
},
createNewBefore: function (e) {
e.preventDefault();
$(e.target).setCaret(0);
$(e.target).returnHandler();
$(e.target).upArrowHandler();
enterInsertMode(e);
return false
},
insertBeginning: function (e) {
e.preventDefault();
$(e.target).setCaret(0);
enterInsertMode(e);
return false
},
insertEnd: function (e) {
e.preventDefault();
$(e.target).setCaret($(e.target).val().length);
enterInsertMode(e);
return false
},
doProjectUp: function (e) {
e.preventDefault();
$(e.target).moveProjectUp();
return false
},
doProjectDown: function (e) {
e.preventDefault();
$(e.target).moveProjectDown();
return false
},
enterSearchMode: function () {
$("#searchBox").focus();
return false
}
};
var indicesOf = function (e, t) {
var n = 0,
r = e.length;
var i, s = [];
while ((i = t.indexOf(e, n)) > -1) {
s.push(i);
n = i + r
}
return s
};
var indexOfNextCaret = function (e, t, n) {
if (typeof n === "undefined") {
var n = new Object;
n.backward = false;
n.shift = false
} else {
n.backward = typeof n.backward !== "undefined" ? n.backward : false;
n.shift = typeof n.shift !== "undefined" ? n.shift : false
}
var r, i = [];
var s = " ";
if (n.backward == false) {
r = t.indexOf(s, e + 1)
} else {
if (t.charAt(e - 1) == " ") {
e--
}
while (t.indexOf(s, r + 1) > -1 && t.indexOf(s, r + 1) < e) {
r = t.indexOf(s, r + 1)
}
if (isNaN(r)) {
r = -1
}
if (e == 0) {
r = -2
}
}
if (n.shift == true) {
r++
}
return r
};
var normalKeybindings = {
j: commands.moveDown,
k: commands.moveUp,
h: commands.moveLeft,
l: commands.moveRight,
w: commands.moveWordForward,
b: commands.moveWordBackward,
x: commands.doBackspace,
"shift+o": commands.createNewBefore,
o: commands.createNewAfter,
"shift+i": commands.insertBeginning,
"shift+a": commands.insertEnd,
u: commands.doUndo,
"ctrl+r": commands.doRedo,
i: enterInsertMode,
a: enterInsertMode
};
var insertKeybindings = {
esc: enterNormalMode,
"ctrl+c": enterNormalMode,
"ctrl+w": commands.deleteWordBack,
"ctrl+u": commands.deleteItemBack
};
var alwaysKeybindings = {
"alt+l": commands.zoomInFold,
"alt+h": commands.zoomOutFold,
"alt+shift+l": commands.doIndent,
"alt+shift+h": commands.doDedent,
"alt+shift+k": commands.doProjectUp,
"alt+shift+j": commands.doProjectDown
};
$(".editor > textarea").unbind("keydown");
$(".editor > textarea").addTextAreaEventHandlers();
$(".editor > textarea").addModalKeyboardShortcuts(alwaysKeybindings);
var blockAll = function (e) {
e.preventDefault()
};
enterNormalMode()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment