codemirror-rails 3.14 → 3.15
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 +178 -94
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +51 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +9 -6
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +9 -4
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +122 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +24 -17
- data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +34 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +7 -3
- data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +4 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +4 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +6 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +3 -6
- data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +12 -6
- data/vendor/assets/javascripts/codemirror/addons/merge/dep/diff_match_patch.js +50 -0
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +40 -24
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +11 -9
- data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +608 -0
- data/vendor/assets/javascripts/codemirror/addons/tern/worker.js +39 -0
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +120 -101
- data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/css.js +33 -16
- data/vendor/assets/javascripts/codemirror/modes/groovy.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/jade.js +90 -0
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +21 -18
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +26 -1
- data/vendor/assets/javascripts/codemirror/modes/nginx.js +163 -0
- data/vendor/assets/javascripts/codemirror/modes/python.js +19 -2
- data/vendor/assets/javascripts/codemirror/modes/rst.js +30 -19
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +4 -4
- data/vendor/assets/javascripts/codemirror/modes/rust.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/scss_test.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +12 -2
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +170 -0
- data/vendor/assets/javascripts/codemirror/modes/sparql.js +4 -2
- data/vendor/assets/javascripts/codemirror/modes/vbscript.js +330 -22
- data/vendor/assets/javascripts/codemirror/modes/xml.js +18 -3
- data/vendor/assets/stylesheets/codemirror.css +10 -0
- data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +39 -29
- data/vendor/assets/stylesheets/codemirror/addons/tern/tern.css +85 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +5 -14
- data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +2 -2
- metadata +17 -2
@@ -0,0 +1,39 @@
|
|
1
|
+
var server;
|
2
|
+
|
3
|
+
this.onmessage = function(e) {
|
4
|
+
var data = e.data;
|
5
|
+
switch (data.type) {
|
6
|
+
case "init": return startServer(data.defs, data.plugins, data.scripts);
|
7
|
+
case "add": return server.addFile(data.name, data.text);
|
8
|
+
case "del": return server.delFile(data.name);
|
9
|
+
case "req": return server.request(data.body, function(err, reqData) {
|
10
|
+
postMessage({id: data.id, body: reqData, err: err && String(err)});
|
11
|
+
});
|
12
|
+
case "getFile":
|
13
|
+
var c = pending[data.id];
|
14
|
+
delete pending[data.id];
|
15
|
+
return c(data.err, data.text);
|
16
|
+
default: throw new Error("Unknown message type: " + data.type);
|
17
|
+
}
|
18
|
+
};
|
19
|
+
|
20
|
+
var nextId = 0, pending = {};
|
21
|
+
function getFile(file, c) {
|
22
|
+
postMessage({type: "getFile", name: file, id: ++nextId});
|
23
|
+
pending[nextId] = c;
|
24
|
+
}
|
25
|
+
|
26
|
+
function startServer(defs, plugins, scripts) {
|
27
|
+
if (scripts) importScripts.apply(null, scripts);
|
28
|
+
|
29
|
+
server = new tern.Server({
|
30
|
+
getFile: getFile,
|
31
|
+
async: true,
|
32
|
+
defs: defs,
|
33
|
+
plugins: plugins
|
34
|
+
});
|
35
|
+
}
|
36
|
+
|
37
|
+
var console = {
|
38
|
+
log: function(v) { postMessage({type: "debug", message: v}); }
|
39
|
+
};
|
@@ -206,8 +206,7 @@
|
|
206
206
|
// Operators
|
207
207
|
{ keys: ['d'], type: 'operator', operator: 'delete' },
|
208
208
|
{ keys: ['y'], type: 'operator', operator: 'yank' },
|
209
|
-
{ keys: ['c'], type: 'operator', operator: 'change',
|
210
|
-
operatorArgs: { enterInsertMode: true } },
|
209
|
+
{ keys: ['c'], type: 'operator', operator: 'change' },
|
211
210
|
{ keys: ['>'], type: 'operator', operator: 'indent',
|
212
211
|
operatorArgs: { indentRight: true }},
|
213
212
|
{ keys: ['<'], type: 'operator', operator: 'indent',
|
@@ -231,10 +230,11 @@
|
|
231
230
|
motion: 'moveToEol', motionArgs: { inclusive: true },
|
232
231
|
operatorMotionArgs: { visualLine: true }},
|
233
232
|
{ keys: ['C'], type: 'operatorMotion',
|
234
|
-
operator: 'change',
|
233
|
+
operator: 'change',
|
235
234
|
motion: 'moveToEol', motionArgs: { inclusive: true },
|
236
235
|
operatorMotionArgs: { visualLine: true }},
|
237
|
-
{ keys: ['~'], type: 'operatorMotion',
|
236
|
+
{ keys: ['~'], type: 'operatorMotion',
|
237
|
+
operator: 'swapcase', operatorArgs: { shouldMoveCursor: true },
|
238
238
|
motion: 'moveByCharacters', motionArgs: { forward: true }},
|
239
239
|
// Actions
|
240
240
|
{ keys: ['<C-i>'], type: 'action', action: 'jumpListWalk',
|
@@ -315,6 +315,27 @@
|
|
315
315
|
];
|
316
316
|
|
317
317
|
var Vim = function() {
|
318
|
+
CodeMirror.defineOption('vimMode', false, function(cm, val) {
|
319
|
+
if (val) {
|
320
|
+
cm.setOption('keyMap', 'vim');
|
321
|
+
cm.on('beforeSelectionChange', beforeSelectionChange);
|
322
|
+
maybeInitVimState(cm);
|
323
|
+
} else if (cm.state.vim) {
|
324
|
+
cm.setOption('keyMap', 'default');
|
325
|
+
cm.off('beforeSelectionChange', beforeSelectionChange);
|
326
|
+
cm.state.vim = null;
|
327
|
+
}
|
328
|
+
});
|
329
|
+
function beforeSelectionChange(cm, cur) {
|
330
|
+
var vim = cm.state.vim;
|
331
|
+
if (vim.insertMode || vim.exMode) return;
|
332
|
+
|
333
|
+
var head = cur.head;
|
334
|
+
if (head.ch && head.ch == cm.doc.getLine(head.line).length) {
|
335
|
+
head.ch--;
|
336
|
+
}
|
337
|
+
}
|
338
|
+
|
318
339
|
var numberRegex = /[\d]/;
|
319
340
|
var wordRegexp = [(/\w/), (/[^\w\s]/)], bigWordRegexp = [(/\S/)];
|
320
341
|
function makeKeyRange(start, size) {
|
@@ -450,28 +471,11 @@
|
|
450
471
|
};
|
451
472
|
};
|
452
473
|
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
if (!vimGlobalState) {
|
457
|
-
vimGlobalState = {
|
458
|
-
// The current search query.
|
459
|
-
searchQuery: null,
|
460
|
-
// Whether we are searching backwards.
|
461
|
-
searchIsReversed: false,
|
462
|
-
jumpList: createCircularJumpList(),
|
463
|
-
macroModeState: createMacroState(),
|
464
|
-
// Recording latest f, t, F or T motion command.
|
465
|
-
lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
|
466
|
-
registerController: new RegisterController({})
|
467
|
-
};
|
468
|
-
}
|
469
|
-
return vimGlobalState;
|
470
|
-
}
|
471
|
-
function getVimState(cm) {
|
472
|
-
if (!cm.vimState) {
|
474
|
+
|
475
|
+
function maybeInitVimState(cm) {
|
476
|
+
if (!cm.state.vim) {
|
473
477
|
// Store instance state in the CodeMirror object.
|
474
|
-
cm.
|
478
|
+
cm.state.vim = {
|
475
479
|
inputState: new InputState(),
|
476
480
|
// Vim's input state that triggered the last edit, used to repeat
|
477
481
|
// motions and operators with '.'.
|
@@ -500,7 +504,21 @@
|
|
500
504
|
visualLine: false
|
501
505
|
};
|
502
506
|
}
|
503
|
-
return cm.
|
507
|
+
return cm.state.vim;
|
508
|
+
}
|
509
|
+
var vimGlobalState;
|
510
|
+
function resetVimGlobalState() {
|
511
|
+
vimGlobalState = {
|
512
|
+
// The current search query.
|
513
|
+
searchQuery: null,
|
514
|
+
// Whether we are searching backwards.
|
515
|
+
searchIsReversed: false,
|
516
|
+
jumpList: createCircularJumpList(),
|
517
|
+
macroModeState: createMacroState(),
|
518
|
+
// Recording latest f, t, F or T motion command.
|
519
|
+
lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
|
520
|
+
registerController: new RegisterController({})
|
521
|
+
};
|
504
522
|
}
|
505
523
|
|
506
524
|
var vimApi= {
|
@@ -510,16 +528,19 @@
|
|
510
528
|
// Testing hook, though it might be useful to expose the register
|
511
529
|
// controller anyways.
|
512
530
|
getRegisterController: function() {
|
513
|
-
return
|
531
|
+
return vimGlobalState.registerController;
|
514
532
|
},
|
515
533
|
// Testing hook.
|
516
|
-
|
517
|
-
|
518
|
-
},
|
534
|
+
resetVimGlobalState_: resetVimGlobalState,
|
535
|
+
|
519
536
|
// Testing hook.
|
520
537
|
getVimGlobalState_: function() {
|
521
538
|
return vimGlobalState;
|
522
539
|
},
|
540
|
+
|
541
|
+
// Testing hook.
|
542
|
+
maybeInitVimState_: maybeInitVimState,
|
543
|
+
|
523
544
|
InsertModeKey: InsertModeKey,
|
524
545
|
map: function(lhs, rhs) {
|
525
546
|
// Add user defined key bindings.
|
@@ -532,17 +553,12 @@
|
|
532
553
|
exCommands[name]=func;
|
533
554
|
exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};
|
534
555
|
},
|
535
|
-
// Initializes vim state variable on the CodeMirror object. Should only be
|
536
|
-
// called lazily by handleKey or for testing.
|
537
|
-
maybeInitState: function(cm) {
|
538
|
-
getVimState(cm);
|
539
|
-
},
|
540
556
|
// This is the outermost function called by CodeMirror, after keys have
|
541
557
|
// been mapped to their Vim equivalents.
|
542
558
|
handleKey: function(cm, key) {
|
543
559
|
var command;
|
544
|
-
var vim =
|
545
|
-
var macroModeState =
|
560
|
+
var vim = maybeInitVimState(cm);
|
561
|
+
var macroModeState = vimGlobalState.macroModeState;
|
546
562
|
if (macroModeState.enteredMacroMode) {
|
547
563
|
if (key == 'q') {
|
548
564
|
actions.exitMacroRecordMode();
|
@@ -554,19 +570,16 @@
|
|
554
570
|
// Clear input state and get back to normal mode.
|
555
571
|
vim.inputState = new InputState();
|
556
572
|
if (vim.visualMode) {
|
557
|
-
exitVisualMode(cm
|
573
|
+
exitVisualMode(cm);
|
558
574
|
}
|
559
575
|
return;
|
560
576
|
}
|
561
|
-
|
562
|
-
cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {
|
563
|
-
// The selection was cleared. Exit visual mode.
|
564
|
-
exitVisualMode(cm, vim);
|
565
|
-
}
|
577
|
+
// Enter visual mode when the mouse selects text.
|
566
578
|
if (!vim.visualMode &&
|
567
579
|
!cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {
|
568
580
|
vim.visualMode = true;
|
569
581
|
vim.visualLine = false;
|
582
|
+
cm.on('mousedown', exitVisualMode);
|
570
583
|
}
|
571
584
|
if (key != '0' || (key == '0' && vim.inputState.getRepeat() === 0)) {
|
572
585
|
// Have to special case 0 since it's both a motion and a number.
|
@@ -970,7 +983,7 @@
|
|
970
983
|
// cachedCursor is used to save the old position of the cursor
|
971
984
|
// when * or # causes vim to seek for the nearest word and shift
|
972
985
|
// the cursor before entering the motion.
|
973
|
-
|
986
|
+
vimGlobalState.jumpList.cachedCursor = cm.getCursor();
|
974
987
|
cm.setCursor(word.start);
|
975
988
|
|
976
989
|
handleQuery(query, true /** ignoreCase */, false /** smartCase */);
|
@@ -1052,7 +1065,7 @@
|
|
1052
1065
|
return;
|
1053
1066
|
}
|
1054
1067
|
if (motionArgs.toJumplist) {
|
1055
|
-
var jumpList =
|
1068
|
+
var jumpList = vimGlobalState.jumpList;
|
1056
1069
|
// if the current motion is # or *, use cachedCursor
|
1057
1070
|
var cachedCursor = jumpList.cachedCursor;
|
1058
1071
|
if (cachedCursor) {
|
@@ -1146,15 +1159,12 @@
|
|
1146
1159
|
operators[operator](cm, operatorArgs, vim, curStart,
|
1147
1160
|
curEnd, curOriginal);
|
1148
1161
|
if (vim.visualMode) {
|
1149
|
-
exitVisualMode(cm
|
1150
|
-
}
|
1151
|
-
if (operatorArgs.enterInsertMode) {
|
1152
|
-
actions.enterInsertMode(cm, {}, vim);
|
1162
|
+
exitVisualMode(cm);
|
1153
1163
|
}
|
1154
1164
|
}
|
1155
1165
|
},
|
1156
1166
|
recordLastEdit: function(vim, inputState, actionCommand) {
|
1157
|
-
var macroModeState =
|
1167
|
+
var macroModeState = vimGlobalState.macroModeState;
|
1158
1168
|
if (macroModeState.inReplay) { return; }
|
1159
1169
|
vim.lastEditInputState = inputState;
|
1160
1170
|
vim.lastEditActionCommand = actionCommand;
|
@@ -1272,8 +1282,13 @@
|
|
1272
1282
|
}
|
1273
1283
|
var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);
|
1274
1284
|
var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;
|
1275
|
-
|
1276
|
-
|
1285
|
+
var first = cm.firstLine();
|
1286
|
+
var last = cm.lastLine();
|
1287
|
+
// Vim cancels linewise motions that start on an edge and move beyond
|
1288
|
+
// that edge. It does not cancel motions that do not start on an edge.
|
1289
|
+
if ((line < first && cur.line == first) ||
|
1290
|
+
(line > last && cur.line == last)) {
|
1291
|
+
return;
|
1277
1292
|
}
|
1278
1293
|
if(motionArgs.toFirstChar){
|
1279
1294
|
endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));
|
@@ -1456,7 +1471,7 @@
|
|
1456
1471
|
return [start, end];
|
1457
1472
|
},
|
1458
1473
|
repeatLastCharacterSearch: function(cm, motionArgs) {
|
1459
|
-
var lastSearch =
|
1474
|
+
var lastSearch = vimGlobalState.lastChararacterSearch;
|
1460
1475
|
var repeat = motionArgs.repeat;
|
1461
1476
|
var forward = motionArgs.forward === lastSearch.forward;
|
1462
1477
|
var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);
|
@@ -1474,22 +1489,16 @@
|
|
1474
1489
|
|
1475
1490
|
var operators = {
|
1476
1491
|
change: function(cm, operatorArgs, _vim, curStart, curEnd) {
|
1477
|
-
|
1492
|
+
vimGlobalState.registerController.pushText(
|
1478
1493
|
operatorArgs.registerName, 'change', cm.getRange(curStart, curEnd),
|
1479
1494
|
operatorArgs.linewise);
|
1480
1495
|
if (operatorArgs.linewise) {
|
1481
|
-
//
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1485
|
-
//
|
1486
|
-
|
1487
|
-
// TODO: Fix the above.
|
1488
|
-
curStart.ch =
|
1489
|
-
findFirstNonWhiteSpaceCharacter(cm.getLine(curStart.line));
|
1490
|
-
// Insert an additional newline so that insert mode can start there.
|
1491
|
-
// curEnd should be on the first character of the new line.
|
1492
|
-
cm.replaceRange('\n', curStart, curEnd);
|
1496
|
+
// Push the next line back down, if there is a next line.
|
1497
|
+
var replacement = curEnd.line > cm.lastLine() ? '' : '\n';
|
1498
|
+
cm.replaceRange(replacement, curStart, curEnd);
|
1499
|
+
cm.indentLine(curStart.line, 'smart');
|
1500
|
+
// null ch so setCursor moves to end of line.
|
1501
|
+
curStart.ch = null;
|
1493
1502
|
} else {
|
1494
1503
|
// Exclude trailing whitespace if the range is not all whitespace.
|
1495
1504
|
var text = cm.getRange(curStart, curEnd);
|
@@ -1501,6 +1510,7 @@
|
|
1501
1510
|
}
|
1502
1511
|
cm.replaceRange('', curStart, curEnd);
|
1503
1512
|
}
|
1513
|
+
actions.enterInsertMode(cm, {}, cm.state.vim);
|
1504
1514
|
cm.setCursor(curStart);
|
1505
1515
|
},
|
1506
1516
|
// delete is a javascript keyword.
|
@@ -1512,7 +1522,7 @@
|
|
1512
1522
|
curStart.line--;
|
1513
1523
|
curStart.ch = lineLength(cm, curStart.line);
|
1514
1524
|
}
|
1515
|
-
|
1525
|
+
vimGlobalState.registerController.pushText(
|
1516
1526
|
operatorArgs.registerName, 'delete', cm.getRange(curStart, curEnd),
|
1517
1527
|
operatorArgs.linewise);
|
1518
1528
|
cm.replaceRange('', curStart, curEnd);
|
@@ -1542,7 +1552,7 @@
|
|
1542
1552
|
cm.setCursor(curStart);
|
1543
1553
|
cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));
|
1544
1554
|
},
|
1545
|
-
swapcase: function(cm,
|
1555
|
+
swapcase: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {
|
1546
1556
|
var toSwap = cm.getRange(curStart, curEnd);
|
1547
1557
|
var swapped = '';
|
1548
1558
|
for (var i = 0; i < toSwap.length; i++) {
|
@@ -1551,10 +1561,12 @@
|
|
1551
1561
|
character.toUpperCase();
|
1552
1562
|
}
|
1553
1563
|
cm.replaceRange(swapped, curStart, curEnd);
|
1554
|
-
|
1564
|
+
if (!operatorArgs.shouldMoveCursor) {
|
1565
|
+
cm.setCursor(curOriginal);
|
1566
|
+
}
|
1555
1567
|
},
|
1556
1568
|
yank: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {
|
1557
|
-
|
1569
|
+
vimGlobalState.registerController.pushText(
|
1558
1570
|
operatorArgs.registerName, 'yank',
|
1559
1571
|
cm.getRange(curStart, curEnd), operatorArgs.linewise);
|
1560
1572
|
cm.setCursor(curOriginal);
|
@@ -1568,7 +1580,7 @@
|
|
1568
1580
|
}
|
1569
1581
|
var repeat = actionArgs.repeat;
|
1570
1582
|
var forward = actionArgs.forward;
|
1571
|
-
var jumpList =
|
1583
|
+
var jumpList = vimGlobalState.jumpList;
|
1572
1584
|
|
1573
1585
|
var mark = jumpList.move(cm, forward ? repeat : -repeat);
|
1574
1586
|
var markPos = mark ? mark.find() : undefined;
|
@@ -1594,7 +1606,7 @@
|
|
1594
1606
|
replayMacro: function(cm, actionArgs) {
|
1595
1607
|
var registerName = actionArgs.selectedCharacter;
|
1596
1608
|
var repeat = actionArgs.repeat;
|
1597
|
-
var macroModeState =
|
1609
|
+
var macroModeState = vimGlobalState.macroModeState;
|
1598
1610
|
if (registerName == '@') {
|
1599
1611
|
registerName = macroModeState.latestRegister;
|
1600
1612
|
}
|
@@ -1604,18 +1616,19 @@
|
|
1604
1616
|
}
|
1605
1617
|
},
|
1606
1618
|
exitMacroRecordMode: function() {
|
1607
|
-
var macroModeState =
|
1619
|
+
var macroModeState = vimGlobalState.macroModeState;
|
1608
1620
|
macroModeState.toggle();
|
1609
1621
|
parseKeyBufferToRegister(macroModeState.latestRegister,
|
1610
1622
|
macroModeState.macroKeyBuffer);
|
1611
1623
|
},
|
1612
1624
|
enterMacroRecordMode: function(cm, actionArgs) {
|
1613
|
-
var macroModeState =
|
1625
|
+
var macroModeState = vimGlobalState.macroModeState;
|
1614
1626
|
var registerName = actionArgs.selectedCharacter;
|
1615
1627
|
macroModeState.toggle(cm, registerName);
|
1616
1628
|
emptyMacroKeyBuffer(macroModeState);
|
1617
1629
|
},
|
1618
1630
|
enterInsertMode: function(cm, actionArgs, vim) {
|
1631
|
+
if (cm.getOption('readOnly')) { return; }
|
1619
1632
|
vim.insertMode = true;
|
1620
1633
|
vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;
|
1621
1634
|
var insertAt = (actionArgs) ? actionArgs.insertAt : null;
|
@@ -1636,7 +1649,7 @@
|
|
1636
1649
|
} else {
|
1637
1650
|
cm.setOption('keyMap', 'vim-insert');
|
1638
1651
|
}
|
1639
|
-
if (!
|
1652
|
+
if (!vimGlobalState.macroModeState.inReplay) {
|
1640
1653
|
// Only record if not replaying.
|
1641
1654
|
cm.on('change', onChange);
|
1642
1655
|
cm.on('cursorActivity', onCursorActivity);
|
@@ -1651,6 +1664,7 @@
|
|
1651
1664
|
// equal to the repeat times the size of the previous visual
|
1652
1665
|
// operation.
|
1653
1666
|
if (!vim.visualMode) {
|
1667
|
+
cm.on('mousedown', exitVisualMode);
|
1654
1668
|
vim.visualMode = true;
|
1655
1669
|
vim.visualLine = !!actionArgs.linewise;
|
1656
1670
|
if (vim.visualLine) {
|
@@ -1692,7 +1706,7 @@
|
|
1692
1706
|
// mode instead of exiting visual mode.
|
1693
1707
|
vim.visualLine = false;
|
1694
1708
|
} else {
|
1695
|
-
exitVisualMode(cm
|
1709
|
+
exitVisualMode(cm);
|
1696
1710
|
}
|
1697
1711
|
}
|
1698
1712
|
updateMark(cm, vim, '<', cursorIsBefore(curStart, curEnd) ? curStart
|
@@ -1728,6 +1742,7 @@
|
|
1728
1742
|
});
|
1729
1743
|
},
|
1730
1744
|
newLineAndEnterInsertMode: function(cm, actionArgs, vim) {
|
1745
|
+
vim.insertMode = true;
|
1731
1746
|
var insertAt = cm.getCursor();
|
1732
1747
|
if (insertAt.line === cm.firstLine() && !actionArgs.after) {
|
1733
1748
|
// Special case for inserting newline before start of document.
|
@@ -1746,7 +1761,7 @@
|
|
1746
1761
|
},
|
1747
1762
|
paste: function(cm, actionArgs) {
|
1748
1763
|
var cur = cm.getCursor();
|
1749
|
-
var register =
|
1764
|
+
var register = vimGlobalState.registerController.getRegister(
|
1750
1765
|
actionArgs.registerName);
|
1751
1766
|
if (!register.text) {
|
1752
1767
|
return;
|
@@ -1832,7 +1847,7 @@
|
|
1832
1847
|
cm.replaceRange(replaceWithStr, curStart, curEnd);
|
1833
1848
|
if(vim.visualMode){
|
1834
1849
|
cm.setCursor(curStart);
|
1835
|
-
exitVisualMode(cm
|
1850
|
+
exitVisualMode(cm);
|
1836
1851
|
}else{
|
1837
1852
|
cm.setCursor(offsetCursor(curEnd, 0, -1));
|
1838
1853
|
}
|
@@ -1989,7 +2004,9 @@
|
|
1989
2004
|
return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1');
|
1990
2005
|
}
|
1991
2006
|
|
1992
|
-
function exitVisualMode(cm
|
2007
|
+
function exitVisualMode(cm) {
|
2008
|
+
cm.off('mousedown', exitVisualMode);
|
2009
|
+
var vim = cm.state.vim;
|
1993
2010
|
vim.visualMode = false;
|
1994
2011
|
vim.visualLine = false;
|
1995
2012
|
var selectionStart = cm.getCursor('anchor');
|
@@ -2113,12 +2130,11 @@
|
|
2113
2130
|
|
2114
2131
|
function recordJumpPosition(cm, oldCur, newCur) {
|
2115
2132
|
if(!cursorEqual(oldCur, newCur)) {
|
2116
|
-
|
2133
|
+
vimGlobalState.jumpList.add(cm, oldCur, newCur);
|
2117
2134
|
}
|
2118
2135
|
}
|
2119
2136
|
|
2120
2137
|
function recordLastCharacterSearch(increment, args) {
|
2121
|
-
var vimGlobalState = getVimGlobalState();
|
2122
2138
|
vimGlobalState.lastChararacterSearch.increment = increment;
|
2123
2139
|
vimGlobalState.lastChararacterSearch.forward = args.forward;
|
2124
2140
|
vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;
|
@@ -2572,10 +2588,10 @@
|
|
2572
2588
|
function SearchState() {}
|
2573
2589
|
SearchState.prototype = {
|
2574
2590
|
getQuery: function() {
|
2575
|
-
return
|
2591
|
+
return vimGlobalState.query;
|
2576
2592
|
},
|
2577
2593
|
setQuery: function(query) {
|
2578
|
-
|
2594
|
+
vimGlobalState.query = query;
|
2579
2595
|
},
|
2580
2596
|
getOverlay: function() {
|
2581
2597
|
return this.searchOverlay;
|
@@ -2584,14 +2600,14 @@
|
|
2584
2600
|
this.searchOverlay = overlay;
|
2585
2601
|
},
|
2586
2602
|
isReversed: function() {
|
2587
|
-
return
|
2603
|
+
return vimGlobalState.isReversed;
|
2588
2604
|
},
|
2589
2605
|
setReversed: function(reversed) {
|
2590
|
-
|
2606
|
+
vimGlobalState.isReversed = reversed;
|
2591
2607
|
}
|
2592
2608
|
};
|
2593
2609
|
function getSearchState(cm) {
|
2594
|
-
var vim =
|
2610
|
+
var vim = cm.state.vim;
|
2595
2611
|
return vim.searchState_ || (vim.searchState_ = new SearchState());
|
2596
2612
|
}
|
2597
2613
|
function dialog(cm, template, shortText, onClose, options) {
|
@@ -2840,9 +2856,9 @@
|
|
2840
2856
|
};
|
2841
2857
|
Vim.ExCommandDispatcher.prototype = {
|
2842
2858
|
processCommand: function(cm, input) {
|
2843
|
-
var vim =
|
2859
|
+
var vim = cm.state.vim;
|
2844
2860
|
if (vim.visualMode) {
|
2845
|
-
exitVisualMode(cm
|
2861
|
+
exitVisualMode(cm);
|
2846
2862
|
}
|
2847
2863
|
var inputStream = new CodeMirror.StringStream(input);
|
2848
2864
|
var params = {};
|
@@ -2921,7 +2937,7 @@
|
|
2921
2937
|
case '$':
|
2922
2938
|
return cm.lastLine();
|
2923
2939
|
case '\'':
|
2924
|
-
var mark =
|
2940
|
+
var mark = cm.state.vim.marks[inputStream.next()];
|
2925
2941
|
if (mark && mark.find()) {
|
2926
2942
|
return mark.find().line;
|
2927
2943
|
}
|
@@ -3031,7 +3047,7 @@
|
|
3031
3047
|
exCommandDispatcher.map(mapArgs[0], mapArgs[1], cm);
|
3032
3048
|
},
|
3033
3049
|
move: function(cm, params) {
|
3034
|
-
commandDispatcher.processCommand(cm,
|
3050
|
+
commandDispatcher.processCommand(cm, cm.state.vim, {
|
3035
3051
|
type: 'motion',
|
3036
3052
|
motion: 'moveToLineOrEdgeOfDocument',
|
3037
3053
|
motionArgs: { forward: false, explicitRepeat: true,
|
@@ -3186,7 +3202,7 @@
|
|
3186
3202
|
return;
|
3187
3203
|
}
|
3188
3204
|
|
3189
|
-
var state =
|
3205
|
+
var state = cm.state.vim;
|
3190
3206
|
var stream = new CodeMirror.StringStream(params.argString.trim());
|
3191
3207
|
while (!stream.eol()) {
|
3192
3208
|
stream.eatSpace();
|
@@ -3257,6 +3273,7 @@
|
|
3257
3273
|
function doReplace(cm, confirm, lineStart, lineEnd, searchCursor, query,
|
3258
3274
|
replaceWith) {
|
3259
3275
|
// Set up all the functions.
|
3276
|
+
cm.state.vim.exMode = true;
|
3260
3277
|
var done = false;
|
3261
3278
|
var lastPos = searchCursor.from();
|
3262
3279
|
function replaceAll() {
|
@@ -3291,7 +3308,8 @@
|
|
3291
3308
|
cm.focus();
|
3292
3309
|
if (lastPos) {
|
3293
3310
|
cm.setCursor(lastPos);
|
3294
|
-
var vim =
|
3311
|
+
var vim = cm.state.vim;
|
3312
|
+
vim.exMode = false;
|
3295
3313
|
vim.lastHPos = vim.lastHSPos = lastPos.ch;
|
3296
3314
|
}
|
3297
3315
|
}
|
@@ -3403,9 +3421,8 @@
|
|
3403
3421
|
CodeMirror.keyMap.vim = buildVimKeyMap();
|
3404
3422
|
|
3405
3423
|
function exitInsertMode(cm) {
|
3406
|
-
var vim =
|
3407
|
-
|
3408
|
-
var inReplay = getVimGlobalState().macroModeState.inReplay;
|
3424
|
+
var vim = cm.state.vim;
|
3425
|
+
var inReplay = vimGlobalState.macroModeState.inReplay;
|
3409
3426
|
if (!inReplay) {
|
3410
3427
|
cm.off('change', onChange);
|
3411
3428
|
cm.off('cursorActivity', onCursorActivity);
|
@@ -3419,6 +3436,7 @@
|
|
3419
3436
|
}
|
3420
3437
|
delete vim.insertModeRepeat;
|
3421
3438
|
cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
|
3439
|
+
vim.insertMode = false;
|
3422
3440
|
cm.setOption('keyMap', 'vim');
|
3423
3441
|
cm.toggleOverwrite(false); // exit replace mode if we were in it.
|
3424
3442
|
}
|
@@ -3446,7 +3464,7 @@
|
|
3446
3464
|
|
3447
3465
|
function parseRegisterToKeyBuffer(macroModeState, registerName) {
|
3448
3466
|
var match, key;
|
3449
|
-
var register =
|
3467
|
+
var register = vimGlobalState.registerController.getRegister(registerName);
|
3450
3468
|
var text = register.toString();
|
3451
3469
|
var macroKeyBuffer = macroModeState.macroKeyBuffer;
|
3452
3470
|
emptyMacroKeyBuffer(macroModeState);
|
@@ -3462,7 +3480,7 @@
|
|
3462
3480
|
|
3463
3481
|
function parseKeyBufferToRegister(registerName, keyBuffer) {
|
3464
3482
|
var text = keyBuffer.join('');
|
3465
|
-
|
3483
|
+
vimGlobalState.registerController.setRegisterText(registerName, text);
|
3466
3484
|
}
|
3467
3485
|
|
3468
3486
|
function emptyMacroKeyBuffer(macroModeState) {
|
@@ -3490,7 +3508,7 @@
|
|
3490
3508
|
* Should only be active in insert mode.
|
3491
3509
|
*/
|
3492
3510
|
function onChange(_cm, changeObj) {
|
3493
|
-
var macroModeState =
|
3511
|
+
var macroModeState = vimGlobalState.macroModeState;
|
3494
3512
|
var lastChange = macroModeState.lastInsertModeChanges;
|
3495
3513
|
while (changeObj) {
|
3496
3514
|
lastChange.expectCursorActivityForChange = true;
|
@@ -3510,7 +3528,7 @@
|
|
3510
3528
|
* - Should only be active in insert mode.
|
3511
3529
|
*/
|
3512
3530
|
function onCursorActivity() {
|
3513
|
-
var macroModeState =
|
3531
|
+
var macroModeState = vimGlobalState.macroModeState;
|
3514
3532
|
var lastChange = macroModeState.lastInsertModeChanges;
|
3515
3533
|
if (lastChange.expectCursorActivityForChange) {
|
3516
3534
|
lastChange.expectCursorActivityForChange = false;
|
@@ -3531,7 +3549,7 @@
|
|
3531
3549
|
* - For recording deletes in insert mode.
|
3532
3550
|
*/
|
3533
3551
|
function onKeyEventTargetKeyDown(e) {
|
3534
|
-
var macroModeState =
|
3552
|
+
var macroModeState = vimGlobalState.macroModeState;
|
3535
3553
|
var lastChange = macroModeState.lastInsertModeChanges;
|
3536
3554
|
var keyName = CodeMirror.keyName(e);
|
3537
3555
|
function onKeyFound() {
|
@@ -3553,7 +3571,7 @@
|
|
3553
3571
|
* corresponding enterInsertMode call was made with a count.
|
3554
3572
|
*/
|
3555
3573
|
function repeatLastEdit(cm, vim, repeat, repeatForInsert) {
|
3556
|
-
var macroModeState =
|
3574
|
+
var macroModeState = vimGlobalState.macroModeState;
|
3557
3575
|
macroModeState.inReplay = true;
|
3558
3576
|
var isAction = !!vim.lastEditActionCommand;
|
3559
3577
|
var cachedInputState = vim.inputState;
|
@@ -3621,6 +3639,7 @@
|
|
3621
3639
|
}
|
3622
3640
|
}
|
3623
3641
|
|
3642
|
+
resetVimGlobalState();
|
3624
3643
|
return vimApi;
|
3625
3644
|
};
|
3626
3645
|
// Initialize Vim and make it available as an API.
|