annotate .cms/lib/codemirror/test/emacs_test.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 (function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 var Pos = CodeMirror.Pos;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 namespace = "emacs_";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 var eventCache = {};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 function fakeEvent(keyName) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 var event = eventCache[key];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 if (event) return event;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 var ctrl, shift, alt;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 var key = keyName.replace(/\w+-/g, function(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 if (type == "Ctrl-") ctrl = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 else if (type == "Alt-") alt = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 else if (type == "Shift-") shift = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 return "";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 var code;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 for (var c in CodeMirror.keyNames)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 if (CodeMirror.keyNames[c] == key) { code = c; break; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 if (code == null) throw new Error("Unknown key: " + key);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 return eventCache[keyName] = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 type: "keydown", keyCode: code, ctrlKey: ctrl, shiftKey: shift, altKey: alt,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 preventDefault: function(){}, stopPropagation: function(){}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 function sim(name, start /*, actions... */) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 var keys = Array.prototype.slice.call(arguments, 2);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 testCM(name, function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 for (var i = 0; i < keys.length; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 var cur = keys[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 if (cur instanceof Pos) cm.setCursor(cur);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 else if (cur.call) cur(cm);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 else cm.triggerOnKeyDown(fakeEvent(cur));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 }, {keyMap: "emacs", value: start, mode: "javascript"});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 function dialog(answer) { return function(cm) { cm.openDialog = function(_, cb) { cb(answer); }; }; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 function at(line, ch, sticky) { return function(cm) { eqCursorPos(cm.getCursor(), Pos(line, ch, sticky)); }; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 function txt(str) { return function(cm) { eq(cm.getValue(), str); }; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 sim("motionHSimple", "abc", "Ctrl-F", "Ctrl-F", "Ctrl-B", at(0, 1, "after"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 sim("motionHMulti", "abcde",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 "Ctrl-4", "Ctrl-F", at(0, 4, "before"), "Ctrl--", "Ctrl-2", "Ctrl-F", at(0, 2, "after"),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 "Ctrl-5", "Ctrl-B", at(0, 0, "after"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 sim("motionHWord", "abc. def ghi",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 "Alt-F", at(0, 3, "before"), "Alt-F", at(0, 8, "before"),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 "Ctrl-B", "Alt-B", at(0, 5, "after"), "Alt-B", at(0, 0, "after"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 sim("motionHWordMulti", "abc. def ghi ",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 "Ctrl-3", "Alt-F", at(0, 12, "before"), "Ctrl-2", "Alt-B", at(0, 5, "after"),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 "Ctrl--", "Alt-B", at(0, 8, "before"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 sim("motionVSimple", "a\nb\nc\n", "Ctrl-N", "Ctrl-N", "Ctrl-P", at(1, 0, "after"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 sim("motionVMulti", "a\nb\nc\nd\ne\n",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 "Ctrl-2", "Ctrl-N", at(2, 0, "after"), "Ctrl-F", "Ctrl--", "Ctrl-N", at(1, 1, "before"),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 "Ctrl--", "Ctrl-3", "Ctrl-P", at(4, 1, "before"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 sim("killYank", "abc\ndef\nghi",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 "Ctrl-F", "Ctrl-Space", "Ctrl-N", "Ctrl-N", "Ctrl-W", "Ctrl-E", "Ctrl-Y",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 txt("ahibc\ndef\ng"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 sim("killRing", "abcdef",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 "Ctrl-Space", "Ctrl-F", "Ctrl-W", "Ctrl-Space", "Ctrl-F", "Ctrl-W",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 "Ctrl-Y", "Alt-Y",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 txt("acdef"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 sim("copyYank", "abcd",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 "Ctrl-Space", "Ctrl-E", "Alt-W", "Ctrl-Y",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 txt("abcdabcd"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 sim("killLineSimple", "foo\nbar", "Ctrl-F", "Ctrl-K", txt("f\nbar"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 sim("killLineEmptyLine", "foo\n \nbar", "Ctrl-N", "Ctrl-K", txt("foo\nbar"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 sim("killLineMulti", "foo\nbar\nbaz",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 "Ctrl-F", "Ctrl-F", "Ctrl-K", "Ctrl-K", "Ctrl-K", "Ctrl-A", "Ctrl-Y",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 txt("o\nbarfo\nbaz"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 sim("moveByParagraph", "abc\ndef\n\n\nhij\nklm\n\n",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 "Ctrl-F", "Ctrl-Down", at(2, 0), "Ctrl-Down", at(6, 0),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 "Ctrl-N", "Ctrl-Up", at(3, 0), "Ctrl-Up", at(0, 0),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 Pos(1, 2), "Ctrl-Down", at(2, 0), Pos(4, 2), "Ctrl-Up", at(3, 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 sim("moveByParagraphMulti", "abc\n\ndef\n\nhij\n\nklm",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 "Ctrl-U", "2", "Ctrl-Down", at(3, 0),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 "Shift-Alt-.", "Ctrl-3", "Ctrl-Up", at(1, 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 sim("moveBySentence", "sentence one! sentence\ntwo\n\nparagraph two",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 "Alt-E", at(0, 13), "Alt-E", at(1, 3), "Ctrl-F", "Alt-A", at(0, 13));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 sim("moveByExpr", "function foo(a, b) {}",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 "Ctrl-Alt-F", at(0, 8), "Ctrl-Alt-F", at(0, 12), "Ctrl-Alt-F", at(0, 18),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 "Ctrl-Alt-B", at(0, 12), "Ctrl-Alt-B", at(0, 9));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 sim("moveByExprMulti", "foo bar baz bug",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 "Ctrl-2", "Ctrl-Alt-F", at(0, 7),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 "Ctrl--", "Ctrl-Alt-F", at(0, 4),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 "Ctrl--", "Ctrl-2", "Ctrl-Alt-B", at(0, 11));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 sim("delExpr", "var x = [\n a,\n b\n c\n];",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 Pos(0, 8), "Ctrl-Alt-K", txt("var x = ;"), "Ctrl-/",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 Pos(4, 1), "Ctrl-Alt-Backspace", txt("var x = ;"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 sim("delExprMulti", "foo bar baz",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 "Ctrl-2", "Ctrl-Alt-K", txt(" baz"),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 "Ctrl-/", "Ctrl-E", "Ctrl-2", "Ctrl-Alt-Backspace", txt("foo "));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 sim("justOneSpace", "hi bye ",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 Pos(0, 4), "Alt-Space", txt("hi bye "),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 Pos(0, 4), "Alt-Space", txt("hi b ye "),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 "Ctrl-A", "Alt-Space", "Ctrl-E", "Alt-Space", txt(" hi b ye "));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 sim("openLine", "foo bar", "Alt-F", "Ctrl-O", txt("foo\n bar"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 sim("transposeChar", "abcd\ne",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 "Ctrl-F", "Ctrl-T", "Ctrl-T", txt("bcad\ne"), at(0, 3),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 "Ctrl-F", "Ctrl-T", "Ctrl-T", "Ctrl-T", txt("bcda\ne"), at(0, 4),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 "Ctrl-F", "Ctrl-T", txt("bcde\na"), at(1, 1));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 sim("manipWordCase", "foo BAR bAZ",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 "Alt-C", "Alt-L", "Alt-U", txt("Foo bar BAZ"),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 "Ctrl-A", "Alt-U", "Alt-L", "Alt-C", txt("FOO bar Baz"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 sim("manipWordCaseMulti", "foo Bar bAz",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 "Ctrl-2", "Alt-U", txt("FOO BAR bAz"),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 "Ctrl-A", "Ctrl-3", "Alt-C", txt("Foo Bar Baz"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 sim("upExpr", "foo {\n bar[];\n baz(blah);\n}",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 Pos(2, 7), "Ctrl-Alt-U", at(2, 5), "Ctrl-Alt-U", at(0, 4));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 sim("transposeExpr", "do foo[bar] dah",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 Pos(0, 6), "Ctrl-Alt-T", txt("do [bar]foo dah"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 sim("clearMark", "abcde", Pos(0, 2), "Ctrl-Space", "Ctrl-F", "Ctrl-F",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 "Ctrl-G", "Ctrl-W", txt("abcde"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 sim("delRegion", "abcde", "Ctrl-Space", "Ctrl-F", "Ctrl-F", "Delete", txt("cde"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 sim("backspaceRegion", "abcde", "Ctrl-Space", "Ctrl-F", "Ctrl-F", "Backspace", txt("cde"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 sim("backspaceDoesntAddToRing", "foobar", "Ctrl-F", "Ctrl-F", "Ctrl-F", "Ctrl-K", "Backspace", "Backspace", "Ctrl-Y", txt("fbar"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 sim("gotoLine", "0\n1\n2\n3", dialog("3"), "Alt-G", "G", at(2, 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 sim("gotoInvalidLineFloat", "0\n1\n2\n3", dialog("2.2"), "Alt-G", "G", at(0, 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 testCM("gotoDialogTemplate", function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 cm.openDialog = function(template, cb) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 var input = template.querySelector("input");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 eq(template.textContent, "Goto line: ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 eq(input.tagName, "INPUT");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 cm.triggerOnKeyDown(fakeEvent("Alt-G"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 cm.triggerOnKeyDown(fakeEvent("G"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 }, {value: "", keyMap: "emacs"});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 testCM("save", function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 var saved = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 CodeMirror.commands.save = function(cm) { saved = cm.getValue(); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 cm.triggerOnKeyDown(fakeEvent("Ctrl-X"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 cm.triggerOnKeyDown(fakeEvent("Ctrl-S"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 is(saved, "hi");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 }, {value: "hi", keyMap: "emacs"});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 })();