codemirror-rails 3.20 → 3.21
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +240 -135
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +6 -2
- data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +10 -6
- data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +2 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/matchbrackets.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/comment-fold.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +13 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +6 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +3 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +29 -33
- data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +1 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +58 -9
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +58 -17
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -5
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +6 -1
- data/vendor/assets/javascripts/codemirror/addons/mode/multiplex.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +26 -11
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +22 -11
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +22 -9
- data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +48 -24
- data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +15 -9
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/wrap/hardwrap.js +21 -9
- data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +12 -1
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +110 -28
- data/vendor/assets/javascripts/codemirror/modes/clike.js +28 -9
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +3 -4
- data/vendor/assets/javascripts/codemirror/modes/css.js +341 -297
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +302 -179
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +10 -5
- data/vendor/assets/javascripts/codemirror/modes/gherkin.js +45 -50
- data/vendor/assets/javascripts/codemirror/modes/haml.js +0 -4
- data/vendor/assets/javascripts/codemirror/modes/haskell.js +5 -3
- data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +43 -30
- data/vendor/assets/javascripts/codemirror/modes/jinja2.js +13 -3
- data/vendor/assets/javascripts/codemirror/modes/less.js +7 -6
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +231 -45
- data/vendor/assets/javascripts/codemirror/modes/{ocaml.js → mllike.js} +88 -13
- data/vendor/assets/javascripts/codemirror/modes/pegjs.js +5 -9
- data/vendor/assets/javascripts/codemirror/modes/php.js +6 -7
- data/vendor/assets/javascripts/codemirror/modes/python.js +6 -0
- data/vendor/assets/javascripts/codemirror/modes/r.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/rpm-spec.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +3 -1
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +4 -2
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/sql.js +5 -4
- data/vendor/assets/javascripts/codemirror/modes/xml.js +87 -100
- data/vendor/assets/stylesheets/codemirror/themes/mbo.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/pastel-on-dark.css +49 -0
- data/vendor/assets/stylesheets/codemirror/themes/the-matrix.css +1 -1
- metadata +3 -2
@@ -12,10 +12,10 @@
|
|
12
12
|
CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
|
13
13
|
var prev = old && old != CodeMirror.Init;
|
14
14
|
if (val && !prev) {
|
15
|
-
updateActiveLine(cm);
|
16
|
-
cm.on("
|
15
|
+
updateActiveLine(cm, cm.getCursor().line);
|
16
|
+
cm.on("beforeSelectionChange", selectionChange);
|
17
17
|
} else if (!val && prev) {
|
18
|
-
cm.off("
|
18
|
+
cm.off("beforeSelectionChange", selectionChange);
|
19
19
|
clearActiveLine(cm);
|
20
20
|
delete cm.state.activeLine;
|
21
21
|
}
|
@@ -28,12 +28,18 @@
|
|
28
28
|
}
|
29
29
|
}
|
30
30
|
|
31
|
-
function updateActiveLine(cm) {
|
32
|
-
var line = cm.getLineHandleVisualStart(
|
31
|
+
function updateActiveLine(cm, selectedLine) {
|
32
|
+
var line = cm.getLineHandleVisualStart(selectedLine);
|
33
33
|
if (cm.state.activeLine == line) return;
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
cm.operation(function() {
|
35
|
+
clearActiveLine(cm);
|
36
|
+
cm.addLineClass(line, "wrap", WRAP_CLASS);
|
37
|
+
cm.addLineClass(line, "background", BACK_CLASS);
|
38
|
+
cm.state.activeLine = line;
|
39
|
+
});
|
40
|
+
}
|
41
|
+
|
42
|
+
function selectionChange(cm, sel) {
|
43
|
+
updateActiveLine(cm, sel.head.line);
|
38
44
|
}
|
39
45
|
})();
|
@@ -251,7 +251,7 @@
|
|
251
251
|
var lex = inner.state.lexical;
|
252
252
|
if (lex.info != "call") return;
|
253
253
|
|
254
|
-
var ch,
|
254
|
+
var ch, argPos = lex.pos || 0, tabSize = cm.getOption("tabSize");
|
255
255
|
for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) {
|
256
256
|
var str = cm.getLine(line), extra = 0;
|
257
257
|
for (var pos = 0;;) {
|
@@ -268,7 +268,7 @@
|
|
268
268
|
var start = Pos(line, ch);
|
269
269
|
var cache = ts.cachedArgHints;
|
270
270
|
if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0)
|
271
|
-
return showArgHints(ts, cm,
|
271
|
+
return showArgHints(ts, cm, argPos);
|
272
272
|
|
273
273
|
ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) {
|
274
274
|
if (error || !data.type || !(/^fn\(/).test(data.type)) return;
|
@@ -279,7 +279,7 @@
|
|
279
279
|
guess: data.guess,
|
280
280
|
doc: cm.getDoc()
|
281
281
|
};
|
282
|
-
showArgHints(ts, cm,
|
282
|
+
showArgHints(ts, cm, argPos);
|
283
283
|
});
|
284
284
|
}
|
285
285
|
|
@@ -36,31 +36,40 @@
|
|
36
36
|
var killTrailing = options.killTrailingSpace !== false;
|
37
37
|
var changes = [], curLine = "", curNo = from.line;
|
38
38
|
var lines = cm.getRange(from, to, false);
|
39
|
+
if (!lines.length) return null;
|
40
|
+
var leadingSpace = lines[0].match(/^[ \t]*/)[0];
|
41
|
+
|
39
42
|
for (var i = 0; i < lines.length; ++i) {
|
40
43
|
var text = lines[i], oldLen = curLine.length, spaceInserted = 0;
|
41
44
|
if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) {
|
42
45
|
curLine += " ";
|
43
46
|
spaceInserted = 1;
|
44
47
|
}
|
48
|
+
var spaceTrimmed = "";
|
49
|
+
if (i) {
|
50
|
+
spaceTrimmed = text.match(/^\s*/)[0];
|
51
|
+
text = text.slice(spaceTrimmed.length);
|
52
|
+
}
|
45
53
|
curLine += text;
|
46
54
|
if (i) {
|
47
|
-
var firstBreak = curLine.length > column &&
|
55
|
+
var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed &&
|
56
|
+
findBreakPoint(curLine, column, wrapOn, killTrailing);
|
48
57
|
// If this isn't broken, or is broken at a different point, remove old break
|
49
58
|
if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) {
|
50
|
-
changes.push({text: spaceInserted ? " " : "",
|
59
|
+
changes.push({text: [spaceInserted ? " " : ""],
|
51
60
|
from: Pos(curNo, oldLen),
|
52
|
-
to: Pos(curNo + 1,
|
61
|
+
to: Pos(curNo + 1, spaceTrimmed.length)});
|
53
62
|
} else {
|
54
|
-
curLine = text;
|
63
|
+
curLine = leadingSpace + text;
|
55
64
|
++curNo;
|
56
65
|
}
|
57
66
|
}
|
58
67
|
while (curLine.length > column) {
|
59
68
|
var bp = findBreakPoint(curLine, column, wrapOn, killTrailing);
|
60
|
-
changes.push({text: "
|
69
|
+
changes.push({text: ["", leadingSpace],
|
61
70
|
from: Pos(curNo, bp.from),
|
62
71
|
to: Pos(curNo, bp.to)});
|
63
|
-
curLine = curLine.slice(bp.to);
|
72
|
+
curLine = leadingSpace + curLine.slice(bp.to);
|
64
73
|
++curNo;
|
65
74
|
}
|
66
75
|
}
|
@@ -70,17 +79,18 @@
|
|
70
79
|
cm.replaceRange(change.text, change.from, change.to);
|
71
80
|
}
|
72
81
|
});
|
82
|
+
return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null;
|
73
83
|
}
|
74
84
|
|
75
85
|
CodeMirror.defineExtension("wrapParagraph", function(pos, options) {
|
76
86
|
options = options || {};
|
77
87
|
if (!pos) pos = this.getCursor();
|
78
88
|
var para = findParagraph(this, pos, options);
|
79
|
-
wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options);
|
89
|
+
return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options);
|
80
90
|
});
|
81
91
|
|
82
92
|
CodeMirror.defineExtension("wrapRange", function(from, to, options) {
|
83
|
-
wrapRange(this, from, to, options || {});
|
93
|
+
return wrapRange(this, from, to, options || {});
|
84
94
|
});
|
85
95
|
|
86
96
|
CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) {
|
@@ -91,9 +101,11 @@
|
|
91
101
|
paras.push(para);
|
92
102
|
line = para.to;
|
93
103
|
}
|
104
|
+
var madeChange = false;
|
94
105
|
if (paras.length) cm.operation(function() {
|
95
106
|
for (var i = paras.length - 1; i >= 0; --i)
|
96
|
-
wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options);
|
107
|
+
madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options);
|
97
108
|
});
|
109
|
+
return madeChange;
|
98
110
|
});
|
99
111
|
})();
|
@@ -201,6 +201,11 @@
|
|
201
201
|
cm.on("change", function() { cm.setExtending(false); });
|
202
202
|
}
|
203
203
|
|
204
|
+
function clearMark(cm) {
|
205
|
+
cm.setExtending(false);
|
206
|
+
cm.setCursor(cm.getCursor());
|
207
|
+
}
|
208
|
+
|
204
209
|
function getInput(cm, msg, f) {
|
205
210
|
if (cm.openDialog)
|
206
211
|
cm.openDialog(msg + ": <input type=\"text\" style=\"width: 10em\"/>", f, {bottom: true});
|
@@ -234,6 +239,11 @@
|
|
234
239
|
}
|
235
240
|
}
|
236
241
|
|
242
|
+
function quit(cm) {
|
243
|
+
cm.execCommand("clearSearch");
|
244
|
+
clearMark(cm);
|
245
|
+
}
|
246
|
+
|
237
247
|
// Actual keymap
|
238
248
|
|
239
249
|
var keyMap = CodeMirror.keyMap.emacs = {
|
@@ -249,6 +259,7 @@
|
|
249
259
|
}),
|
250
260
|
"Alt-W": function(cm) {
|
251
261
|
addToRing(cm.getSelection());
|
262
|
+
clearMark(cm);
|
252
263
|
},
|
253
264
|
"Ctrl-Y": function(cm) {
|
254
265
|
var start = cm.getCursor();
|
@@ -334,7 +345,7 @@
|
|
334
345
|
"Ctrl-/": repeated("undo"), "Shift-Ctrl--": repeated("undo"),
|
335
346
|
"Ctrl-Z": repeated("undo"), "Cmd-Z": repeated("undo"),
|
336
347
|
"Shift-Alt-,": "goDocStart", "Shift-Alt-.": "goDocEnd",
|
337
|
-
"Ctrl-S": "findNext", "Ctrl-R": "findPrev", "Ctrl-G":
|
348
|
+
"Ctrl-S": "findNext", "Ctrl-R": "findPrev", "Ctrl-G": quit, "Shift-Alt-5": "replace",
|
338
349
|
"Alt-/": "autocomplete",
|
339
350
|
"Ctrl-J": "newlineAndIndent", "Enter": false, "Tab": "indentAuto",
|
340
351
|
|
@@ -84,6 +84,7 @@
|
|
84
84
|
{ keys: ['<End>'], type: 'keyToKey', toKeys: ['$'] },
|
85
85
|
{ keys: ['<PageUp>'], type: 'keyToKey', toKeys: ['<C-b>'] },
|
86
86
|
{ keys: ['<PageDown>'], type: 'keyToKey', toKeys: ['<C-f>'] },
|
87
|
+
{ keys: ['<CR>'], type: 'keyToKey', toKeys: ['j', '^'], context: 'normal' },
|
87
88
|
// Motions
|
88
89
|
{ keys: ['H'], type: 'motion',
|
89
90
|
motion: 'moveToTopLine',
|
@@ -247,6 +248,12 @@
|
|
247
248
|
actionArgs: { forward: true }},
|
248
249
|
{ keys: ['<C-o>'], type: 'action', action: 'jumpListWalk',
|
249
250
|
actionArgs: { forward: false }},
|
251
|
+
{ keys: ['<C-e>'], type: 'action',
|
252
|
+
action: 'scroll',
|
253
|
+
actionArgs: { forward: true, linewise: true }},
|
254
|
+
{ keys: ['<C-y>'], type: 'action',
|
255
|
+
action: 'scroll',
|
256
|
+
actionArgs: { forward: false, linewise: true }},
|
250
257
|
{ keys: ['a'], type: 'action', action: 'enterInsertMode', isEdit: true,
|
251
258
|
actionArgs: { insertAt: 'charAfter' }},
|
252
259
|
{ keys: ['A'], type: 'action', action: 'enterInsertMode', isEdit: true,
|
@@ -324,12 +331,16 @@
|
|
324
331
|
CodeMirror.defineOption('vimMode', false, function(cm, val) {
|
325
332
|
if (val) {
|
326
333
|
cm.setOption('keyMap', 'vim');
|
334
|
+
cm.setOption('disableInput', true);
|
327
335
|
CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
|
328
336
|
cm.on('beforeSelectionChange', beforeSelectionChange);
|
329
337
|
maybeInitVimState(cm);
|
338
|
+
CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));
|
330
339
|
} else if (cm.state.vim) {
|
331
340
|
cm.setOption('keyMap', 'default');
|
341
|
+
cm.setOption('disableInput', false);
|
332
342
|
cm.off('beforeSelectionChange', beforeSelectionChange);
|
343
|
+
CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));
|
333
344
|
cm.state.vim = null;
|
334
345
|
}
|
335
346
|
});
|
@@ -342,6 +353,18 @@
|
|
342
353
|
head.ch--;
|
343
354
|
}
|
344
355
|
}
|
356
|
+
function getOnPasteFn(cm) {
|
357
|
+
var vim = cm.state.vim;
|
358
|
+
if (!vim.onPasteFn) {
|
359
|
+
vim.onPasteFn = function() {
|
360
|
+
if (!vim.insertMode) {
|
361
|
+
cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));
|
362
|
+
actions.enterInsertMode(cm, {}, vim);
|
363
|
+
}
|
364
|
+
};
|
365
|
+
}
|
366
|
+
return vim.onPasteFn;
|
367
|
+
}
|
345
368
|
|
346
369
|
var numberRegex = /[\d]/;
|
347
370
|
var wordRegexp = [(/\w/), (/[^\w\s]/)], bigWordRegexp = [(/\S/)];
|
@@ -549,9 +572,9 @@
|
|
549
572
|
maybeInitVimState_: maybeInitVimState,
|
550
573
|
|
551
574
|
InsertModeKey: InsertModeKey,
|
552
|
-
map: function(lhs, rhs) {
|
575
|
+
map: function(lhs, rhs, ctx) {
|
553
576
|
// Add user defined key bindings.
|
554
|
-
exCommandDispatcher.map(lhs, rhs);
|
577
|
+
exCommandDispatcher.map(lhs, rhs, ctx);
|
555
578
|
},
|
556
579
|
defineEx: function(name, prefix, func){
|
557
580
|
if (name.indexOf(prefix) !== 0) {
|
@@ -833,11 +856,17 @@
|
|
833
856
|
} else {
|
834
857
|
// Find the best match in the list of matchedCommands.
|
835
858
|
var context = vim.visualMode ? 'visual' : 'normal';
|
836
|
-
var bestMatch
|
859
|
+
var bestMatch; // Default to first in the list.
|
837
860
|
for (var i = 0; i < matchedCommands.length; i++) {
|
838
|
-
|
839
|
-
|
861
|
+
var current = matchedCommands[i];
|
862
|
+
if (current.context == context) {
|
863
|
+
bestMatch = current;
|
840
864
|
break;
|
865
|
+
} else if (!bestMatch && !current.context) {
|
866
|
+
// Only set an imperfect match to best match if no best match is
|
867
|
+
// set and the imperfect match is not restricted to another
|
868
|
+
// context.
|
869
|
+
bestMatch = current;
|
841
870
|
}
|
842
871
|
}
|
843
872
|
return getFullyMatchedCommandOrNull(bestMatch);
|
@@ -1636,6 +1665,43 @@
|
|
1636
1665
|
markPos = markPos ? markPos : cm.getCursor();
|
1637
1666
|
cm.setCursor(markPos);
|
1638
1667
|
},
|
1668
|
+
scroll: function(cm, actionArgs, vim) {
|
1669
|
+
if (vim.visualMode) {
|
1670
|
+
return;
|
1671
|
+
}
|
1672
|
+
var repeat = actionArgs.repeat || 1;
|
1673
|
+
var lineHeight = cm.defaultTextHeight();
|
1674
|
+
var top = cm.getScrollInfo().top;
|
1675
|
+
var delta = lineHeight * repeat;
|
1676
|
+
var newPos = actionArgs.forward ? top + delta : top - delta;
|
1677
|
+
var cursor = cm.getCursor();
|
1678
|
+
var cursorCoords = cm.charCoords(cursor, 'local');
|
1679
|
+
if (actionArgs.forward) {
|
1680
|
+
if (newPos > cursorCoords.top) {
|
1681
|
+
cursor.line += (newPos - cursorCoords.top) / lineHeight;
|
1682
|
+
cursor.line = Math.ceil(cursor.line);
|
1683
|
+
cm.setCursor(cursor);
|
1684
|
+
cursorCoords = cm.charCoords(cursor, 'local');
|
1685
|
+
cm.scrollTo(null, cursorCoords.top);
|
1686
|
+
} else {
|
1687
|
+
// Cursor stays within bounds. Just reposition the scroll window.
|
1688
|
+
cm.scrollTo(null, newPos);
|
1689
|
+
}
|
1690
|
+
} else {
|
1691
|
+
var newBottom = newPos + cm.getScrollInfo().clientHeight;
|
1692
|
+
if (newBottom < cursorCoords.bottom) {
|
1693
|
+
cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;
|
1694
|
+
cursor.line = Math.floor(cursor.line);
|
1695
|
+
cm.setCursor(cursor);
|
1696
|
+
cursorCoords = cm.charCoords(cursor, 'local');
|
1697
|
+
cm.scrollTo(
|
1698
|
+
null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);
|
1699
|
+
} else {
|
1700
|
+
// Cursor stays within bounds. Just reposition the scroll window.
|
1701
|
+
cm.scrollTo(null, newPos);
|
1702
|
+
}
|
1703
|
+
}
|
1704
|
+
},
|
1639
1705
|
scrollToCursor: function(cm, actionArgs) {
|
1640
1706
|
var lineNum = cm.getCursor().line;
|
1641
1707
|
var charCoords = cm.charCoords({line: lineNum, ch: 0}, 'local');
|
@@ -1691,6 +1757,7 @@
|
|
1691
1757
|
cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));
|
1692
1758
|
}
|
1693
1759
|
cm.setOption('keyMap', 'vim-insert');
|
1760
|
+
cm.setOption('disableInput', false);
|
1694
1761
|
if (actionArgs && actionArgs.replace) {
|
1695
1762
|
// Handle Replace-mode as a special case of insert mode.
|
1696
1763
|
cm.toggleOverwrite(true);
|
@@ -2896,14 +2963,16 @@
|
|
2896
2963
|
// pair of commands that have a shared prefix, at least one of their
|
2897
2964
|
// shortNames must not match the prefix of the other command.
|
2898
2965
|
var defaultExCommandMap = [
|
2899
|
-
{ name: 'map'
|
2900
|
-
{ name: '
|
2901
|
-
{ name: '
|
2902
|
-
{ name: '
|
2903
|
-
{ name: '
|
2904
|
-
{ name: '
|
2905
|
-
{ name: '
|
2906
|
-
{ name: '
|
2966
|
+
{ name: 'map' },
|
2967
|
+
{ name: 'nmap', shortName: 'nm' },
|
2968
|
+
{ name: 'vmap', shortName: 'vm' },
|
2969
|
+
{ name: 'write', shortName: 'w' },
|
2970
|
+
{ name: 'undo', shortName: 'u' },
|
2971
|
+
{ name: 'redo', shortName: 'red' },
|
2972
|
+
{ name: 'sort', shortName: 'sor' },
|
2973
|
+
{ name: 'substitute', shortName: 's' },
|
2974
|
+
{ name: 'nohlsearch', shortName: 'noh' },
|
2975
|
+
{ name: 'delmarks', shortName: 'delm' }
|
2907
2976
|
];
|
2908
2977
|
Vim.ExCommandDispatcher = function() {
|
2909
2978
|
this.buildCommandMap_();
|
@@ -2955,6 +3024,7 @@
|
|
2955
3024
|
exCommands[commandName](cm, params);
|
2956
3025
|
} catch(e) {
|
2957
3026
|
showConfirm(cm, e);
|
3027
|
+
throw e;
|
2958
3028
|
}
|
2959
3029
|
},
|
2960
3030
|
parseInput_: function(cm, inputStream, result) {
|
@@ -3037,8 +3107,9 @@
|
|
3037
3107
|
this.commandMap_[key] = command;
|
3038
3108
|
}
|
3039
3109
|
},
|
3040
|
-
map: function(lhs, rhs) {
|
3110
|
+
map: function(lhs, rhs, ctx) {
|
3041
3111
|
if (lhs != ':' && lhs.charAt(0) == ':') {
|
3112
|
+
if (ctx) { throw Error('Mode not supported for ex mappings'); }
|
3042
3113
|
var commandName = lhs.substring(1);
|
3043
3114
|
if (rhs != ':' && rhs.charAt(0) == ':') {
|
3044
3115
|
// Ex to Ex mapping
|
@@ -3058,17 +3129,21 @@
|
|
3058
3129
|
} else {
|
3059
3130
|
if (rhs != ':' && rhs.charAt(0) == ':') {
|
3060
3131
|
// Key to Ex mapping.
|
3061
|
-
|
3132
|
+
var mapping = {
|
3062
3133
|
keys: parseKeyString(lhs),
|
3063
3134
|
type: 'keyToEx',
|
3064
|
-
exArgs: { input: rhs.substring(1) }}
|
3135
|
+
exArgs: { input: rhs.substring(1) }};
|
3136
|
+
if (ctx) { mapping.context = ctx; }
|
3137
|
+
defaultKeymap.unshift(mapping);
|
3065
3138
|
} else {
|
3066
3139
|
// Key to key mapping
|
3067
|
-
|
3140
|
+
var mapping = {
|
3068
3141
|
keys: parseKeyString(lhs),
|
3069
3142
|
type: 'keyToKey',
|
3070
3143
|
toKeys: parseKeyString(rhs)
|
3071
|
-
}
|
3144
|
+
};
|
3145
|
+
if (ctx) { mapping.context = ctx; }
|
3146
|
+
defaultKeymap.unshift(mapping);
|
3072
3147
|
}
|
3073
3148
|
}
|
3074
3149
|
}
|
@@ -3090,7 +3165,7 @@
|
|
3090
3165
|
}
|
3091
3166
|
|
3092
3167
|
var exCommands = {
|
3093
|
-
map: function(cm, params) {
|
3168
|
+
map: function(cm, params, ctx) {
|
3094
3169
|
var mapArgs = params.args;
|
3095
3170
|
if (!mapArgs || mapArgs.length < 2) {
|
3096
3171
|
if (cm) {
|
@@ -3098,8 +3173,10 @@
|
|
3098
3173
|
}
|
3099
3174
|
return;
|
3100
3175
|
}
|
3101
|
-
exCommandDispatcher.map(mapArgs[0], mapArgs[1],
|
3176
|
+
exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx);
|
3102
3177
|
},
|
3178
|
+
nmap: function(cm, params) { this.map(cm, params, 'normal'); },
|
3179
|
+
vmap: function(cm, params) { this.map(cm, params, 'visual'); },
|
3103
3180
|
move: function(cm, params) {
|
3104
3181
|
commandDispatcher.processCommand(cm, cm.state.vim, {
|
3105
3182
|
type: 'motion',
|
@@ -3115,7 +3192,7 @@
|
|
3115
3192
|
var args = new CodeMirror.StringStream(params.argString);
|
3116
3193
|
if (args.eat('!')) { reverse = true; }
|
3117
3194
|
if (args.eol()) { return; }
|
3118
|
-
if (!args.eatSpace()) {
|
3195
|
+
if (!args.eatSpace()) { return 'Invalid arguments'; }
|
3119
3196
|
var opts = args.match(/[a-z]+/);
|
3120
3197
|
if (opts) {
|
3121
3198
|
opts = opts[0];
|
@@ -3124,13 +3201,17 @@
|
|
3124
3201
|
var decimal = opts.indexOf('d') != -1 && 1;
|
3125
3202
|
var hex = opts.indexOf('x') != -1 && 1;
|
3126
3203
|
var octal = opts.indexOf('o') != -1 && 1;
|
3127
|
-
if (decimal + hex + octal > 1) {
|
3204
|
+
if (decimal + hex + octal > 1) { return 'Invalid arguments'; }
|
3128
3205
|
number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';
|
3129
3206
|
}
|
3130
|
-
if (args.eatSpace() && args.match(/\/.*\//)) {
|
3207
|
+
if (args.eatSpace() && args.match(/\/.*\//)) { 'patterns not supported'; }
|
3131
3208
|
}
|
3132
3209
|
}
|
3133
|
-
parseArgs();
|
3210
|
+
var err = parseArgs();
|
3211
|
+
if (err) {
|
3212
|
+
showConfirm(cm, err + ': ' + params.argString);
|
3213
|
+
return;
|
3214
|
+
}
|
3134
3215
|
var lineStart = params.line || cm.firstLine();
|
3135
3216
|
var lineEnd = params.lineEnd || params.line || cm.lastLine();
|
3136
3217
|
if (lineStart == lineEnd) { return; }
|
@@ -3251,13 +3332,13 @@
|
|
3251
3332
|
clearSearchHighlight(cm);
|
3252
3333
|
},
|
3253
3334
|
delmarks: function(cm, params) {
|
3254
|
-
if (!params.argString || !params.argString
|
3335
|
+
if (!params.argString || !trim(params.argString)) {
|
3255
3336
|
showConfirm(cm, 'Argument required');
|
3256
3337
|
return;
|
3257
3338
|
}
|
3258
3339
|
|
3259
3340
|
var state = cm.state.vim;
|
3260
|
-
var stream = new CodeMirror.StringStream(params.argString
|
3341
|
+
var stream = new CodeMirror.StringStream(trim(params.argString));
|
3261
3342
|
while (!stream.eol()) {
|
3262
3343
|
stream.eatSpace();
|
3263
3344
|
|
@@ -3394,7 +3475,8 @@
|
|
3394
3475
|
// Actually do replace.
|
3395
3476
|
next();
|
3396
3477
|
if (done) {
|
3397
|
-
|
3478
|
+
showConfirm(cm, 'No matches for ' + query.source);
|
3479
|
+
return;
|
3398
3480
|
}
|
3399
3481
|
if (!confirm) {
|
3400
3482
|
replaceAll();
|
@@ -3445,7 +3527,6 @@
|
|
3445
3527
|
|
3446
3528
|
var cmToVimKeymap = {
|
3447
3529
|
'nofallthrough': true,
|
3448
|
-
'disableInput': true,
|
3449
3530
|
'style': 'fat-cursor'
|
3450
3531
|
};
|
3451
3532
|
function bindKeys(keys, modifier) {
|
@@ -3492,6 +3573,7 @@
|
|
3492
3573
|
cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
|
3493
3574
|
vim.insertMode = false;
|
3494
3575
|
cm.setOption('keyMap', 'vim');
|
3576
|
+
cm.setOption('disableInput', true);
|
3495
3577
|
cm.toggleOverwrite(false); // exit replace mode if we were in it.
|
3496
3578
|
CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
|
3497
3579
|
}
|