codemirror-rails 3.24 → 4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +3001 -1798
  4. data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +24 -4
  5. data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +47 -32
  6. data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +9 -2
  7. data/vendor/assets/javascripts/codemirror/addons/display/fullscreen.js +9 -2
  8. data/vendor/assets/javascripts/codemirror/addons/display/placeholder.js +9 -2
  9. data/vendor/assets/javascripts/codemirror/addons/display/rulers.js +9 -2
  10. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +76 -37
  11. data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +59 -37
  12. data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +25 -17
  13. data/vendor/assets/javascripts/codemirror/addons/edit/matchbrackets.js +67 -46
  14. data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +10 -3
  15. data/vendor/assets/javascripts/codemirror/addons/edit/trailingspace.js +23 -14
  16. data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +12 -3
  17. data/vendor/assets/javascripts/codemirror/addons/fold/comment-fold.js +12 -0
  18. data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +28 -3
  19. data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +9 -2
  20. data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +12 -1
  21. data/vendor/assets/javascripts/codemirror/addons/fold/markdown-fold.js +12 -0
  22. data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +9 -4
  23. data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +9 -2
  24. data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +10 -3
  25. data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +11 -3
  26. data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +9 -4
  27. data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +11 -3
  28. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +10 -4
  29. data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +9 -2
  30. data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +22 -34
  31. data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +12 -1
  32. data/vendor/assets/javascripts/codemirror/addons/lint/css-lint.js +12 -1
  33. data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +9 -4
  34. data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +12 -1
  35. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +12 -8
  36. data/vendor/assets/javascripts/codemirror/addons/lint/yaml-lint.js +12 -1
  37. data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +18 -16
  38. data/vendor/assets/javascripts/codemirror/addons/mode/loadmode.js +9 -2
  39. data/vendor/assets/javascripts/codemirror/addons/mode/multiplex.js +12 -0
  40. data/vendor/assets/javascripts/codemirror/addons/mode/overlay.js +15 -10
  41. data/vendor/assets/javascripts/codemirror/addons/runmode/colorize.js +11 -3
  42. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +0 -2
  43. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +12 -0
  44. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +4 -0
  45. data/vendor/assets/javascripts/codemirror/addons/scroll/scrollpastend.js +9 -2
  46. data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +12 -3
  47. data/vendor/assets/javascripts/codemirror/addons/search/search.js +24 -16
  48. data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +21 -2
  49. data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +38 -17
  50. data/vendor/assets/javascripts/codemirror/addons/selection/mark-selection.js +16 -9
  51. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +33 -5
  52. data/vendor/assets/javascripts/codemirror/addons/wrap/hardwrap.js +27 -2
  53. data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +12 -5
  54. data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +505 -0
  55. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +138 -179
  56. data/vendor/assets/javascripts/codemirror/modes/apl.js +12 -0
  57. data/vendor/assets/javascripts/codemirror/modes/asterisk.js +12 -0
  58. data/vendor/assets/javascripts/codemirror/modes/clike.js +15 -4
  59. data/vendor/assets/javascripts/codemirror/modes/clojure.js +13 -0
  60. data/vendor/assets/javascripts/codemirror/modes/cobol.js +12 -0
  61. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +12 -0
  62. data/vendor/assets/javascripts/codemirror/modes/commonlisp.js +12 -0
  63. data/vendor/assets/javascripts/codemirror/modes/css.js +18 -27
  64. data/vendor/assets/javascripts/codemirror/modes/d.js +12 -2
  65. data/vendor/assets/javascripts/codemirror/modes/diff.js +12 -0
  66. data/vendor/assets/javascripts/codemirror/modes/dtd.js +12 -0
  67. data/vendor/assets/javascripts/codemirror/modes/ecl.js +12 -0
  68. data/vendor/assets/javascripts/codemirror/modes/eiffel.js +12 -0
  69. data/vendor/assets/javascripts/codemirror/modes/erlang.js +13 -1
  70. data/vendor/assets/javascripts/codemirror/modes/fortran.js +12 -0
  71. data/vendor/assets/javascripts/codemirror/modes/gas.js +12 -0
  72. data/vendor/assets/javascripts/codemirror/modes/gfm.js +12 -0
  73. data/vendor/assets/javascripts/codemirror/modes/gherkin.js +12 -0
  74. data/vendor/assets/javascripts/codemirror/modes/go.js +12 -1
  75. data/vendor/assets/javascripts/codemirror/modes/groovy.js +12 -0
  76. data/vendor/assets/javascripts/codemirror/modes/haml.js +12 -0
  77. data/vendor/assets/javascripts/codemirror/modes/haskell.js +12 -0
  78. data/vendor/assets/javascripts/codemirror/modes/haxe.js +18 -9
  79. data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +12 -0
  80. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +12 -0
  81. data/vendor/assets/javascripts/codemirror/modes/http.js +12 -0
  82. data/vendor/assets/javascripts/codemirror/modes/jade.js +12 -0
  83. data/vendor/assets/javascripts/codemirror/modes/javascript.js +23 -16
  84. data/vendor/assets/javascripts/codemirror/modes/jinja2.js +53 -118
  85. data/vendor/assets/javascripts/codemirror/modes/julia.js +12 -0
  86. data/vendor/assets/javascripts/codemirror/modes/livescript.js +17 -4
  87. data/vendor/assets/javascripts/codemirror/modes/lua.js +12 -0
  88. data/vendor/assets/javascripts/codemirror/modes/markdown.js +12 -0
  89. data/vendor/assets/javascripts/codemirror/modes/mirc.js +13 -0
  90. data/vendor/assets/javascripts/codemirror/modes/mllike.js +12 -1
  91. data/vendor/assets/javascripts/codemirror/modes/nginx.js +12 -0
  92. data/vendor/assets/javascripts/codemirror/modes/ntriples.js +13 -0
  93. data/vendor/assets/javascripts/codemirror/modes/octave.js +12 -0
  94. data/vendor/assets/javascripts/codemirror/modes/pascal.js +12 -0
  95. data/vendor/assets/javascripts/codemirror/modes/pegjs.js +12 -0
  96. data/vendor/assets/javascripts/codemirror/modes/perl.js +84 -73
  97. data/vendor/assets/javascripts/codemirror/modes/php.js +20 -101
  98. data/vendor/assets/javascripts/codemirror/modes/pig.js +12 -0
  99. data/vendor/assets/javascripts/codemirror/modes/properties.js +12 -0
  100. data/vendor/assets/javascripts/codemirror/modes/puppet.js +13 -0
  101. data/vendor/assets/javascripts/codemirror/modes/python.js +21 -11
  102. data/vendor/assets/javascripts/codemirror/modes/q.js +12 -0
  103. data/vendor/assets/javascripts/codemirror/modes/r.js +13 -3
  104. data/vendor/assets/javascripts/codemirror/modes/{rpm-spec.js → rpm.js} +34 -2
  105. data/vendor/assets/javascripts/codemirror/modes/rst.js +12 -0
  106. data/vendor/assets/javascripts/codemirror/modes/ruby.js +11 -0
  107. data/vendor/assets/javascripts/codemirror/modes/rust.js +12 -0
  108. data/vendor/assets/javascripts/codemirror/modes/sass.js +12 -0
  109. data/vendor/assets/javascripts/codemirror/modes/scheme.js +13 -0
  110. data/vendor/assets/javascripts/codemirror/modes/shell.js +12 -0
  111. data/vendor/assets/javascripts/codemirror/modes/sieve.js +11 -4
  112. data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +12 -0
  113. data/vendor/assets/javascripts/codemirror/modes/smarty.js +13 -0
  114. data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +14 -2
  115. data/vendor/assets/javascripts/codemirror/modes/solr.js +12 -0
  116. data/vendor/assets/javascripts/codemirror/modes/sparql.js +12 -0
  117. data/vendor/assets/javascripts/codemirror/modes/sql.js +12 -0
  118. data/vendor/assets/javascripts/codemirror/modes/stex.js +12 -0
  119. data/vendor/assets/javascripts/codemirror/modes/tcl.js +13 -0
  120. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +13 -0
  121. data/vendor/assets/javascripts/codemirror/modes/tiki.js +12 -0
  122. data/vendor/assets/javascripts/codemirror/modes/toml.js +12 -0
  123. data/vendor/assets/javascripts/codemirror/modes/turtle.js +12 -0
  124. data/vendor/assets/javascripts/codemirror/modes/vb.js +12 -0
  125. data/vendor/assets/javascripts/codemirror/modes/vbscript.js +13 -0
  126. data/vendor/assets/javascripts/codemirror/modes/velocity.js +12 -0
  127. data/vendor/assets/javascripts/codemirror/modes/verilog.js +89 -236
  128. data/vendor/assets/javascripts/codemirror/modes/xml.js +41 -60
  129. data/vendor/assets/javascripts/codemirror/modes/xquery.js +12 -0
  130. data/vendor/assets/javascripts/codemirror/modes/yaml.js +12 -0
  131. data/vendor/assets/javascripts/codemirror/modes/z80.js +12 -0
  132. data/vendor/assets/stylesheets/codemirror.css +15 -10
  133. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +1 -0
  134. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +4 -0
  135. data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +1 -1
  136. data/vendor/assets/stylesheets/codemirror/themes/pastel-on-dark.css +1 -0
  137. data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +2 -0
  138. data/vendor/assets/stylesheets/codemirror/themes/solarized.css +17 -3
  139. metadata +20 -25
  140. data/vendor/assets/javascripts/codemirror/keymaps/extra.js +0 -43
  141. data/vendor/assets/javascripts/codemirror/modes/django.js +0 -55
  142. data/vendor/assets/javascripts/codemirror/modes/dylan.js +0 -284
  143. data/vendor/assets/javascripts/codemirror/modes/less.js +0 -347
  144. data/vendor/assets/javascripts/codemirror/modes/rpm-changes.js +0 -19
  145. data/vendor/assets/stylesheets/codemirror/modes/rpm-spec.css +0 -5
@@ -56,7 +56,14 @@
56
56
  * 8. Set up Vim to work as a keymap for CodeMirror.
57
57
  */
58
58
 
59
- (function() {
59
+ (function(mod) {
60
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
61
+ mod(require("../lib/codemirror"), require("../addon/search/searchcursor"), require("../addon/dialog/dialog"));
62
+ else if (typeof define == "function" && define.amd) // AMD
63
+ define(["../lib/codemirror", "../addon/search/searchcursor", "../addon/dialog/dialog"], mod);
64
+ else // Plain browser env
65
+ mod(CodeMirror);
66
+ })(function(CodeMirror) {
60
67
  'use strict';
61
68
 
62
69
  var defaultKeymap = [
@@ -194,7 +201,7 @@
194
201
  { keys: [','], type: 'motion', motion: 'repeatLastCharacterSearch',
195
202
  motionArgs: { forward: false }},
196
203
  { keys: ['\'', 'character'], type: 'motion', motion: 'goToMark',
197
- motionArgs: {toJumplist: true, linewise: true}},
204
+ motionArgs: {toJumplist: true}},
198
205
  { keys: ['`', 'character'], type: 'motion', motion: 'goToMark',
199
206
  motionArgs: {toJumplist: true}},
200
207
  { keys: [']', '`'], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },
@@ -322,15 +329,15 @@
322
329
  { keys: ['?'], type: 'search',
323
330
  searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},
324
331
  { keys: ['*'], type: 'search',
325
- searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},
332
+ searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},
326
333
  { keys: ['#'], type: 'search',
327
- searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},
328
- { keys: ['g', '*'], type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},
329
- { keys: ['g', '#'], type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},
334
+ searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},
330
335
  // Ex command
331
336
  { keys: [':'], type: 'ex' }
332
337
  ];
333
338
 
339
+ var Pos = CodeMirror.Pos;
340
+
334
341
  var Vim = function() {
335
342
  CodeMirror.defineOption('vimMode', false, function(cm, val) {
336
343
  if (val) {
@@ -348,13 +355,16 @@
348
355
  cm.state.vim = null;
349
356
  }
350
357
  });
351
- function beforeSelectionChange(cm, cur) {
358
+ function beforeSelectionChange(cm, obj) {
352
359
  var vim = cm.state.vim;
353
360
  if (vim.insertMode || vim.exMode) return;
354
361
 
355
- var head = cur.head;
362
+ var head = obj.ranges[0].head;
363
+ var anchor = obj.ranges[0].anchor;
356
364
  if (head.ch && head.ch == cm.doc.getLine(head.line).length) {
357
- head.ch--;
365
+ var pos = Pos(head.line, head.ch - 1);
366
+ obj.update([{anchor: cursorEqual(head, anchor) ? pos : anchor,
367
+ head: pos}]);
358
368
  }
359
369
  }
360
370
  function getOnPasteFn(cm) {
@@ -386,7 +396,7 @@
386
396
  var specialKeys = ['Left', 'Right', 'Up', 'Down', 'Space', 'Backspace',
387
397
  'Esc', 'Home', 'End', 'PageUp', 'PageDown', 'Enter'];
388
398
  var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);
389
- var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':']);
399
+ var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"']);
390
400
 
391
401
  function isLine(cm, line) {
392
402
  return line >= cm.firstLine() && line <= cm.lastLine();
@@ -539,7 +549,6 @@
539
549
  this.latestRegister = undefined;
540
550
  this.isPlaying = false;
541
551
  this.isRecording = false;
542
- this.replaySearchQueries = [];
543
552
  this.onRecordingDone = undefined;
544
553
  this.lastInsertModeChanges = createInsertModeChanges();
545
554
  }
@@ -605,8 +614,6 @@
605
614
  searchQuery: null,
606
615
  // Whether we are searching backwards.
607
616
  searchIsReversed: false,
608
- // Replace part of the last substituted pattern
609
- lastSubstituteReplacePart: undefined,
610
617
  jumpList: createCircularJumpList(),
611
618
  macroModeState: new MacroModeState,
612
619
  // Recording latest f, t, F or T motion command.
@@ -757,7 +764,6 @@
757
764
  this.clear();
758
765
  this.keyBuffer = [text || ''];
759
766
  this.insertModeChanges = [];
760
- this.searchQueries = [];
761
767
  this.linewise = !!linewise;
762
768
  }
763
769
  Register.prototype = {
@@ -776,13 +782,9 @@
776
782
  pushInsertModeChanges: function(changes) {
777
783
  this.insertModeChanges.push(createInsertModeChanges(changes));
778
784
  },
779
- pushSearchQuery: function(query) {
780
- this.searchQueries.push(query);
781
- },
782
785
  clear: function() {
783
786
  this.keyBuffer = [];
784
787
  this.insertModeChanges = [];
785
- this.searchQueries = [];
786
788
  this.linewise = false;
787
789
  },
788
790
  toString: function() {
@@ -801,8 +803,6 @@
801
803
  function RegisterController(registers) {
802
804
  this.registers = registers;
803
805
  this.unnamedRegister = registers['"'] = new Register();
804
- registers['.'] = new Register();
805
- registers[':'] = new Register();
806
806
  }
807
807
  RegisterController.prototype = {
808
808
  pushText: function(registerName, operator, text, linewise) {
@@ -1056,7 +1056,6 @@
1056
1056
  return;
1057
1057
  }
1058
1058
  var forward = command.searchArgs.forward;
1059
- var wholeWordOnly = command.searchArgs.wholeWordOnly;
1060
1059
  getSearchState(cm).setReversed(!forward);
1061
1060
  var promptPrefix = (forward) ? '/' : '?';
1062
1061
  var originalQuery = getSearchState(cm).getQuery();
@@ -1077,10 +1076,6 @@
1077
1076
  function onPromptClose(query) {
1078
1077
  cm.scrollTo(originalScrollPos.left, originalScrollPos.top);
1079
1078
  handleQuery(query, true /** ignoreCase */, true /** smartCase */);
1080
- var macroModeState = vimGlobalState.macroModeState;
1081
- if (macroModeState.isRecording) {
1082
- logSearchQuery(macroModeState, query);
1083
- }
1084
1079
  }
1085
1080
  function onPromptKeyUp(_e, query) {
1086
1081
  var parsedQuery;
@@ -1111,19 +1106,13 @@
1111
1106
  }
1112
1107
  switch (command.searchArgs.querySrc) {
1113
1108
  case 'prompt':
1114
- var macroModeState = vimGlobalState.macroModeState;
1115
- if (macroModeState.isPlaying) {
1116
- var query = macroModeState.replaySearchQueries.shift();
1117
- handleQuery(query, true /** ignoreCase */, false /** smartCase */);
1118
- } else {
1119
- showPrompt(cm, {
1120
- onClose: onPromptClose,
1121
- prefix: promptPrefix,
1122
- desc: searchPromptDesc,
1123
- onKeyUp: onPromptKeyUp,
1124
- onKeyDown: onPromptKeyDown
1125
- });
1126
- }
1109
+ showPrompt(cm, {
1110
+ onClose: onPromptClose,
1111
+ prefix: promptPrefix,
1112
+ desc: searchPromptDesc,
1113
+ onKeyUp: onPromptKeyUp,
1114
+ onKeyDown: onPromptKeyDown
1115
+ });
1127
1116
  break;
1128
1117
  case 'wordUnderCursor':
1129
1118
  var word = expandWordUnderCursor(cm, false /** inclusive */,
@@ -1141,8 +1130,8 @@
1141
1130
  }
1142
1131
  var query = cm.getLine(word.start.line).substring(word.start.ch,
1143
1132
  word.end.ch);
1144
- if (isKeyword && wholeWordOnly) {
1145
- query = '\\b' + query + '\\b';
1133
+ if (isKeyword) {
1134
+ query = '\\b' + query + '\\b';
1146
1135
  } else {
1147
1136
  query = escapeRegex(query);
1148
1137
  }
@@ -1193,8 +1182,8 @@
1193
1182
  var operator = inputState.operator;
1194
1183
  var operatorArgs = inputState.operatorArgs || {};
1195
1184
  var registerName = inputState.registerName;
1196
- var selectionEnd = cm.getCursor('head');
1197
- var selectionStart = cm.getCursor('anchor');
1185
+ var selectionEnd = copyCursor(cm.getCursor('head'));
1186
+ var selectionStart = copyCursor(cm.getCursor('anchor'));
1198
1187
  // The difference between cur and selection cursors are that cur is
1199
1188
  // being operated on and ignores that there is a selection.
1200
1189
  var curStart = copyCursor(selectionEnd);
@@ -1250,7 +1239,7 @@
1250
1239
  }
1251
1240
  // TODO: Handle null returns from motion commands better.
1252
1241
  if (!curEnd) {
1253
- curEnd = { ch: curStart.ch, line: curStart.line };
1242
+ curEnd = Pos(curStart.line, curStart.ch);
1254
1243
  }
1255
1244
  if (vim.visualMode) {
1256
1245
  // Check if the selection crossed over itself. Will need to shift
@@ -1354,22 +1343,22 @@
1354
1343
  var motions = {
1355
1344
  moveToTopLine: function(cm, motionArgs) {
1356
1345
  var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;
1357
- return { line: line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(line)) };
1346
+ return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));
1358
1347
  },
1359
1348
  moveToMiddleLine: function(cm) {
1360
1349
  var range = getUserVisibleLines(cm);
1361
1350
  var line = Math.floor((range.top + range.bottom) * 0.5);
1362
- return { line: line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(line)) };
1351
+ return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));
1363
1352
  },
1364
1353
  moveToBottomLine: function(cm, motionArgs) {
1365
1354
  var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;
1366
- return { line: line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(line)) };
1355
+ return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));
1367
1356
  },
1368
1357
  expandToLine: function(cm, motionArgs) {
1369
1358
  // Expands forward to end of line, and then to next line if repeat is
1370
1359
  // >1. Does not handle backward motion!
1371
1360
  var cur = cm.getCursor();
1372
- return { line: cur.line + motionArgs.repeat - 1, ch: Infinity };
1361
+ return Pos(cur.line + motionArgs.repeat - 1, Infinity);
1373
1362
  },
1374
1363
  findNext: function(cm, motionArgs) {
1375
1364
  var state = getSearchState(cm);
@@ -1383,11 +1372,10 @@
1383
1372
  highlightSearchMatches(cm, query);
1384
1373
  return findNext(cm, prev/** prev */, query, motionArgs.repeat);
1385
1374
  },
1386
- goToMark: function(cm, motionArgs, vim) {
1375
+ goToMark: function(_cm, motionArgs, vim) {
1387
1376
  var mark = vim.marks[motionArgs.selectedCharacter];
1388
1377
  if (mark) {
1389
- var pos = mark.find();
1390
- return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;
1378
+ return mark.find();
1391
1379
  }
1392
1380
  return null;
1393
1381
  },
@@ -1435,7 +1423,7 @@
1435
1423
  // Vim places the cursor on the first non-whitespace character of
1436
1424
  // the line if there is one, else it places the cursor at the end
1437
1425
  // of the line, regardless of whether a mark was found.
1438
- best.ch = findFirstNonWhiteSpaceCharacter(cm.getLine(best.line));
1426
+ best = Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));
1439
1427
  }
1440
1428
  return best;
1441
1429
  },
@@ -1443,7 +1431,7 @@
1443
1431
  var cur = cm.getCursor();
1444
1432
  var repeat = motionArgs.repeat;
1445
1433
  var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;
1446
- return { line: cur.line, ch: ch };
1434
+ return Pos(cur.line, ch);
1447
1435
  },
1448
1436
  moveByLines: function(cm, motionArgs, vim) {
1449
1437
  var cur = cm.getCursor();
@@ -1478,8 +1466,8 @@
1478
1466
  endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));
1479
1467
  vim.lastHPos = endCh;
1480
1468
  }
1481
- vim.lastHSPos = cm.charCoords({line:line, ch:endCh},'div').left;
1482
- return { line: line, ch: endCh };
1469
+ vim.lastHSPos = cm.charCoords(Pos(line, endCh),'div').left;
1470
+ return Pos(line, endCh);
1483
1471
  },
1484
1472
  moveByDisplayLines: function(cm, motionArgs, vim) {
1485
1473
  var cur = cm.getCursor();
@@ -1501,7 +1489,7 @@
1501
1489
  var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };
1502
1490
  var res = cm.coordsChar(goalCoords, 'div');
1503
1491
  } else {
1504
- var resCoords = cm.charCoords({ line: cm.firstLine(), ch: 0}, 'div');
1492
+ var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div');
1505
1493
  resCoords.left = vim.lastHSPos;
1506
1494
  res = cm.coordsChar(resCoords, 'div');
1507
1495
  }
@@ -1534,7 +1522,7 @@
1534
1522
  line += inc;
1535
1523
  }
1536
1524
  }
1537
- return { line: line, ch: 0 };
1525
+ return Pos(line, 0);
1538
1526
  },
1539
1527
  moveByScroll: function(cm, motionArgs, vim) {
1540
1528
  var scrollbox = cm.getScrollInfo();
@@ -1588,7 +1576,7 @@
1588
1576
  moveToEol: function(cm, motionArgs, vim) {
1589
1577
  var cur = cm.getCursor();
1590
1578
  vim.lastHPos = Infinity;
1591
- var retval={ line: cur.line + motionArgs.repeat - 1, ch: Infinity };
1579
+ var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);
1592
1580
  var end=cm.clipPos(retval);
1593
1581
  end.ch--;
1594
1582
  vim.lastHSPos = cm.charCoords(end,'div').left;
@@ -1598,8 +1586,8 @@
1598
1586
  // Go to the start of the line where the text begins, or the end for
1599
1587
  // whitespace-only lines
1600
1588
  var cursor = cm.getCursor();
1601
- return { line: cursor.line,
1602
- ch: findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)) };
1589
+ return Pos(cursor.line,
1590
+ findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));
1603
1591
  },
1604
1592
  moveToMatchedSymbol: function(cm) {
1605
1593
  var cursor = cm.getCursor();
@@ -1612,7 +1600,7 @@
1612
1600
  do {
1613
1601
  symbol = lineText.charAt(ch++);
1614
1602
  if (symbol && isMatchableSymbol(symbol)) {
1615
- var endContext = cm.getTokenAt({line:line, ch:ch}).type;
1603
+ var endContext = cm.getTokenAt(Pos(line, ch)).type;
1616
1604
  var endCtxLevel = getContextLevel(endContext);
1617
1605
  if (startCtxLevel >= endCtxLevel) {
1618
1606
  break;
@@ -1620,22 +1608,22 @@
1620
1608
  }
1621
1609
  } while (symbol);
1622
1610
  if (symbol) {
1623
- return findMatchedSymbol(cm, {line:line, ch:ch-1}, symbol);
1611
+ return findMatchedSymbol(cm, Pos(line, ch-1), symbol);
1624
1612
  } else {
1625
1613
  return cursor;
1626
1614
  }
1627
1615
  },
1628
1616
  moveToStartOfLine: function(cm) {
1629
1617
  var cursor = cm.getCursor();
1630
- return { line: cursor.line, ch: 0 };
1618
+ return Pos(cursor.line, 0);
1631
1619
  },
1632
1620
  moveToLineOrEdgeOfDocument: function(cm, motionArgs) {
1633
1621
  var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();
1634
1622
  if (motionArgs.repeatIsExplicit) {
1635
1623
  lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');
1636
1624
  }
1637
- return { line: lineNum,
1638
- ch: findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)) };
1625
+ return Pos(lineNum,
1626
+ findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));
1639
1627
  },
1640
1628
  textObjectManipulation: function(cm, motionArgs) {
1641
1629
  // TODO: lots of possible exceptions that can be thrown here. Try da(
@@ -1802,7 +1790,7 @@
1802
1790
  var top = cm.getScrollInfo().top;
1803
1791
  var delta = lineHeight * repeat;
1804
1792
  var newPos = actionArgs.forward ? top + delta : top - delta;
1805
- var cursor = cm.getCursor();
1793
+ var cursor = copyCursor(cm.getCursor());
1806
1794
  var cursorCoords = cm.charCoords(cursor, 'local');
1807
1795
  if (actionArgs.forward) {
1808
1796
  if (newPos > cursorCoords.top) {
@@ -1832,7 +1820,7 @@
1832
1820
  },
1833
1821
  scrollToCursor: function(cm, actionArgs) {
1834
1822
  var lineNum = cm.getCursor().line;
1835
- var charCoords = cm.charCoords({line: lineNum, ch: 0}, 'local');
1823
+ var charCoords = cm.charCoords(Pos(lineNum, 0), 'local');
1836
1824
  var height = cm.getScrollInfo().clientHeight;
1837
1825
  var y = charCoords.top;
1838
1826
  var lineHeight = charCoords.bottom - y;
@@ -1869,7 +1857,7 @@
1869
1857
  var insertAt = (actionArgs) ? actionArgs.insertAt : null;
1870
1858
  if (insertAt == 'eol') {
1871
1859
  var cursor = cm.getCursor();
1872
- cursor = { line: cursor.line, ch: lineLength(cm, cursor.line) };
1860
+ cursor = Pos(cursor.line, lineLength(cm, cursor.line));
1873
1861
  cm.setCursor(cursor);
1874
1862
  } else if (insertAt == 'charAfter') {
1875
1863
  cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));
@@ -1907,15 +1895,13 @@
1907
1895
  vim.visualLine = !!actionArgs.linewise;
1908
1896
  if (vim.visualLine) {
1909
1897
  curStart.ch = 0;
1910
- curEnd = clipCursorToContent(cm, {
1911
- line: curStart.line + repeat - 1,
1912
- ch: lineLength(cm, curStart.line)
1913
- }, true /** includeLineBreak */);
1898
+ curEnd = clipCursorToContent(
1899
+ cm, Pos(curStart.line + repeat - 1, lineLength(cm, curStart.line)),
1900
+ true /** includeLineBreak */);
1914
1901
  } else {
1915
- curEnd = clipCursorToContent(cm, {
1916
- line: curStart.line,
1917
- ch: curStart.ch + repeat
1918
- }, true /** includeLineBreak */);
1902
+ curEnd = clipCursorToContent(
1903
+ cm, Pos(curStart.line, curStart.ch + repeat),
1904
+ true /** includeLineBreak */);
1919
1905
  }
1920
1906
  // Make the initial selection.
1921
1907
  if (!actionArgs.repeatIsExplicit && !vim.visualLine) {
@@ -1980,29 +1966,29 @@
1980
1966
  // Repeat is the number of lines to join. Minimum 2 lines.
1981
1967
  var repeat = Math.max(actionArgs.repeat, 2);
1982
1968
  curStart = cm.getCursor();
1983
- curEnd = clipCursorToContent(cm, { line: curStart.line + repeat - 1,
1984
- ch: Infinity });
1969
+ curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1,
1970
+ Infinity));
1985
1971
  }
1986
1972
  var finalCh = 0;
1987
1973
  cm.operation(function() {
1988
1974
  for (var i = curStart.line; i < curEnd.line; i++) {
1989
1975
  finalCh = lineLength(cm, curStart.line);
1990
- var tmp = { line: curStart.line + 1,
1991
- ch: lineLength(cm, curStart.line + 1) };
1976
+ var tmp = Pos(curStart.line + 1,
1977
+ lineLength(cm, curStart.line + 1));
1992
1978
  var text = cm.getRange(curStart, tmp);
1993
1979
  text = text.replace(/\n\s*/g, ' ');
1994
1980
  cm.replaceRange(text, curStart, tmp);
1995
1981
  }
1996
- var curFinalPos = { line: curStart.line, ch: finalCh };
1982
+ var curFinalPos = Pos(curStart.line, finalCh);
1997
1983
  cm.setCursor(curFinalPos);
1998
1984
  });
1999
1985
  },
2000
1986
  newLineAndEnterInsertMode: function(cm, actionArgs, vim) {
2001
1987
  vim.insertMode = true;
2002
- var insertAt = cm.getCursor();
1988
+ var insertAt = copyCursor(cm.getCursor());
2003
1989
  if (insertAt.line === cm.firstLine() && !actionArgs.after) {
2004
1990
  // Special case for inserting newline before start of document.
2005
- cm.replaceRange('\n', { line: cm.firstLine(), ch: 0 });
1991
+ cm.replaceRange('\n', Pos(cm.firstLine(), 0));
2006
1992
  cm.setCursor(cm.firstLine(), 0);
2007
1993
  } else {
2008
1994
  insertAt.line = (actionArgs.after) ? insertAt.line :
@@ -2016,7 +2002,7 @@
2016
2002
  this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);
2017
2003
  },
2018
2004
  paste: function(cm, actionArgs) {
2019
- var cur = cm.getCursor();
2005
+ var cur = copyCursor(cm.getCursor());
2020
2006
  var register = vimGlobalState.registerController.getRegister(
2021
2007
  actionArgs.registerName);
2022
2008
  var text = register.toString();
@@ -2044,11 +2030,13 @@
2044
2030
  var curPosFinal;
2045
2031
  var idx;
2046
2032
  if (linewise && actionArgs.after) {
2047
- curPosFinal = { line: cur.line + 1,
2048
- ch: findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)) };
2033
+ curPosFinal = Pos(
2034
+ cur.line + 1,
2035
+ findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)));
2049
2036
  } else if (linewise && !actionArgs.after) {
2050
- curPosFinal = { line: cur.line,
2051
- ch: findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)) };
2037
+ curPosFinal = Pos(
2038
+ cur.line,
2039
+ findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)));
2052
2040
  } else if (!linewise && actionArgs.after) {
2053
2041
  idx = cm.indexFromPos(cur);
2054
2042
  curPosFinal = cm.posFromIndex(idx + text.length - 1);
@@ -2084,14 +2072,14 @@
2084
2072
  curEnd=cm.getCursor('end');
2085
2073
  // workaround to catch the character under the cursor
2086
2074
  // existing workaround doesn't cover actions
2087
- curEnd=cm.clipPos({line: curEnd.line, ch: curEnd.ch+1});
2075
+ curEnd=cm.clipPos(Pos(curEnd.line, curEnd.ch+1));
2088
2076
  }else{
2089
2077
  var line = cm.getLine(curStart.line);
2090
2078
  replaceTo = curStart.ch + actionArgs.repeat;
2091
2079
  if (replaceTo > line.length) {
2092
2080
  replaceTo=line.length;
2093
2081
  }
2094
- curEnd = { line: curStart.line, ch: replaceTo };
2082
+ curEnd = Pos(curStart.line, replaceTo);
2095
2083
  }
2096
2084
  if (replaceWith=='\n'){
2097
2085
  if (!vim.visualMode) cm.replaceRange('', curStart, curEnd);
@@ -2129,14 +2117,14 @@
2129
2117
  if (token) {
2130
2118
  var increment = actionArgs.increase ? 1 : -1;
2131
2119
  var number = parseInt(token) + (increment * actionArgs.repeat);
2132
- var from = {ch:start, line:cur.line};
2133
- var to = {ch:end, line:cur.line};
2120
+ var from = Pos(cur.line, start);
2121
+ var to = Pos(cur.line, end);
2134
2122
  numberStr = number.toString();
2135
2123
  cm.replaceRange(numberStr, from, to);
2136
2124
  } else {
2137
2125
  return;
2138
2126
  }
2139
- cm.setCursor({line: cur.line, ch: start + numberStr.length - 1});
2127
+ cm.setCursor(Pos(cur.line, start + numberStr.length - 1));
2140
2128
  },
2141
2129
  repeatLastEdit: function(cm, actionArgs, vim) {
2142
2130
  var lastEditInputState = vim.lastEditInputState;
@@ -2164,7 +2152,7 @@
2164
2152
  var maxCh = lineLength(cm, line) - 1;
2165
2153
  maxCh = (includeLineBreak) ? maxCh + 1 : maxCh;
2166
2154
  var ch = Math.min(Math.max(0, cur.ch), maxCh);
2167
- return { line: line, ch: ch };
2155
+ return Pos(line, ch);
2168
2156
  }
2169
2157
  function copyArgs(args) {
2170
2158
  var ret = {};
@@ -2176,7 +2164,7 @@
2176
2164
  return ret;
2177
2165
  }
2178
2166
  function offsetCursor(cur, offsetLine, offsetCh) {
2179
- return { line: cur.line + offsetLine, ch: cur.ch + offsetCh };
2167
+ return Pos(cur.line + offsetLine, cur.ch + offsetCh);
2180
2168
  }
2181
2169
  function matchKeysPartial(pressed, mapped) {
2182
2170
  for (var i = 0; i < pressed.length; i++) {
@@ -2195,7 +2183,7 @@
2195
2183
  };
2196
2184
  }
2197
2185
  function copyCursor(cur) {
2198
- return { line: cur.line, ch: cur.ch };
2186
+ return Pos(cur.line, cur.ch);
2199
2187
  }
2200
2188
  function cursorEqual(cur1, cur2) {
2201
2189
  return cur1.ch == cur2.ch && cur1.line == cur2.line;
@@ -2356,8 +2344,8 @@
2356
2344
  }
2357
2345
  }
2358
2346
 
2359
- return { start: { line: cur.line, ch: wordStart },
2360
- end: { line: cur.line, ch: wordEnd }};
2347
+ return { start: Pos(cur.line, wordStart),
2348
+ end: Pos(cur.line, wordEnd) };
2361
2349
  }
2362
2350
 
2363
2351
  function recordJumpPosition(cm, oldCur, newCur) {
@@ -2445,7 +2433,7 @@
2445
2433
  }
2446
2434
  };
2447
2435
  function findSymbol(cm, repeat, forward, symb) {
2448
- var cur = cm.getCursor();
2436
+ var cur = copyCursor(cm.getCursor());
2449
2437
  var increment = forward ? 1 : -1;
2450
2438
  var endLine = forward ? cm.lineCount() : -1;
2451
2439
  var curCh = cur.ch;
@@ -2488,7 +2476,7 @@
2488
2476
  }
2489
2477
  }
2490
2478
  if (state.nextCh || state.curMoveThrough) {
2491
- return { line: line, ch: state.index };
2479
+ return Pos(line, state.index);
2492
2480
  }
2493
2481
  return cur;
2494
2482
  }
@@ -2602,7 +2590,7 @@
2602
2590
  break;
2603
2591
  }
2604
2592
  words.push(word);
2605
- cur = {line: word.line, ch: forward ? (word.to - 1) : word.from};
2593
+ cur = Pos(word.line, forward ? (word.to - 1) : word.from);
2606
2594
  }
2607
2595
  var shortCircuit = words.length != repeat;
2608
2596
  var firstWord = words[0];
@@ -2613,19 +2601,19 @@
2613
2601
  // We did not start in the middle of a word. Discard the extra word at the end.
2614
2602
  lastWord = words.pop();
2615
2603
  }
2616
- return {line: lastWord.line, ch: lastWord.from};
2604
+ return Pos(lastWord.line, lastWord.from);
2617
2605
  } else if (forward && wordEnd) {
2618
- return {line: lastWord.line, ch: lastWord.to - 1};
2606
+ return Pos(lastWord.line, lastWord.to - 1);
2619
2607
  } else if (!forward && wordEnd) {
2620
2608
  // ge
2621
2609
  if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {
2622
2610
  // We did not start in the middle of a word. Discard the extra word at the end.
2623
2611
  lastWord = words.pop();
2624
2612
  }
2625
- return {line: lastWord.line, ch: lastWord.to};
2613
+ return Pos(lastWord.line, lastWord.to);
2626
2614
  } else {
2627
2615
  // b
2628
- return {line: lastWord.line, ch: lastWord.from};
2616
+ return Pos(lastWord.line, lastWord.from);
2629
2617
  }
2630
2618
  }
2631
2619
 
@@ -2641,14 +2629,14 @@
2641
2629
  }
2642
2630
  start = idx;
2643
2631
  }
2644
- return { line: cm.getCursor().line, ch: idx };
2632
+ return Pos(cm.getCursor().line, idx);
2645
2633
  }
2646
2634
 
2647
2635
  function moveToColumn(cm, repeat) {
2648
2636
  // repeat is always >= 1, so repeat - 1 always corresponds
2649
2637
  // to the column we want to go to.
2650
2638
  var line = cm.getCursor().line;
2651
- return clipCursorToContent(cm, { line: line, ch: repeat - 1 });
2639
+ return clipCursorToContent(cm, Pos(line, repeat - 1));
2652
2640
  }
2653
2641
 
2654
2642
  function updateMark(cm, vim, markName, pos) {
@@ -2691,7 +2679,7 @@
2691
2679
  var ch = cur.ch;
2692
2680
  symb = symb ? symb : cm.getLine(line).charAt(ch);
2693
2681
 
2694
- var symbContext = cm.getTokenAt({line:line, ch:ch+1}).type;
2682
+ var symbContext = cm.getTokenAt(Pos(line, ch + 1)).type;
2695
2683
  var symbCtxLevel = getContextLevel(symbContext);
2696
2684
 
2697
2685
  var reverseSymb = ({
@@ -2727,7 +2715,7 @@
2727
2715
  }
2728
2716
  nextCh = lineText.charAt(index);
2729
2717
  }
2730
- var revSymbContext = cm.getTokenAt({line:line, ch:index+1}).type;
2718
+ var revSymbContext = cm.getTokenAt(Pos(line, index + 1)).type;
2731
2719
  var revSymbCtxLevel = getContextLevel(revSymbContext);
2732
2720
  if (symbCtxLevel >= revSymbCtxLevel) {
2733
2721
  if (nextCh === symb) {
@@ -2739,7 +2727,7 @@
2739
2727
  }
2740
2728
 
2741
2729
  if (nextCh) {
2742
- return { line: line, ch: index };
2730
+ return Pos(line, index);
2743
2731
  }
2744
2732
  return cur;
2745
2733
  }
@@ -2747,7 +2735,7 @@
2747
2735
  // TODO: perhaps this finagling of start and end positions belonds
2748
2736
  // in codmirror/replaceRange?
2749
2737
  function selectCompanionObject(cm, revSymb, inclusive) {
2750
- var cur = cm.getCursor();
2738
+ var cur = copyCursor(cm.getCursor());
2751
2739
  var end = findMatchedSymbol(cm, cur, revSymb);
2752
2740
  var start = findMatchedSymbol(cm, end);
2753
2741
 
@@ -2771,7 +2759,7 @@
2771
2759
  // have identical opening and closing symbols
2772
2760
  // TODO support across multiple lines
2773
2761
  function findBeginningAndEnd(cm, symb, inclusive) {
2774
- var cur = cm.getCursor();
2762
+ var cur = copyCursor(cm.getCursor());
2775
2763
  var line = cm.getLine(cur.line);
2776
2764
  var chars = line.split('');
2777
2765
  var start, end, i, len;
@@ -2823,8 +2811,8 @@
2823
2811
  }
2824
2812
 
2825
2813
  return {
2826
- start: { line: cur.line, ch: start },
2827
- end: { line: cur.line, ch: end }
2814
+ start: Pos(cur.line, start),
2815
+ end: Pos(cur.line, end)
2828
2816
  };
2829
2817
  }
2830
2818
 
@@ -3134,7 +3122,7 @@
3134
3122
  // SearchCursor may have returned null because it hit EOF, wrap
3135
3123
  // around and try again.
3136
3124
  cursor = cm.getSearchCursor(query,
3137
- (prev) ? { line: cm.lastLine() } : {line: cm.firstLine(), ch: 0} );
3125
+ (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) );
3138
3126
  if (!cursor.find(prev)) {
3139
3127
  return;
3140
3128
  }
@@ -3200,7 +3188,7 @@
3200
3188
  { name: 'substitute', shortName: 's' },
3201
3189
  { name: 'nohlsearch', shortName: 'noh' },
3202
3190
  { name: 'delmarks', shortName: 'delm' },
3203
- { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }
3191
+ { name: 'registers', shortName: 'reg' }
3204
3192
  ];
3205
3193
  Vim.ExCommandDispatcher = function() {
3206
3194
  this.buildCommandMap_();
@@ -3208,14 +3196,10 @@
3208
3196
  Vim.ExCommandDispatcher.prototype = {
3209
3197
  processCommand: function(cm, input) {
3210
3198
  var vim = cm.state.vim;
3211
- var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');
3212
- var previousCommand = commandHistoryRegister.toString();
3213
3199
  if (vim.visualMode) {
3214
3200
  exitVisualMode(cm);
3215
3201
  }
3216
3202
  var inputStream = new CodeMirror.StringStream(input);
3217
- // update ": with the latest command whether valid or invalid
3218
- commandHistoryRegister.setText(input);
3219
3203
  var params = {};
3220
3204
  params.input = input;
3221
3205
  try {
@@ -3234,9 +3218,6 @@
3234
3218
  var command = this.matchCommand_(params.commandName);
3235
3219
  if (command) {
3236
3220
  commandName = command.name;
3237
- if (command.excludeFromCommandHistory) {
3238
- commandHistoryRegister.setText(previousCommand);
3239
- }
3240
3221
  this.parseCommandArgs_(inputStream, params, command);
3241
3222
  if (command.type == 'exToKey') {
3242
3223
  // Handle Ex to Key mapping.
@@ -3528,7 +3509,7 @@
3528
3509
  continue;
3529
3510
  }
3530
3511
  var register = registers[registerName] || new Register();
3531
- regInfo += '"' + registerName + ' ' + register.toString() + '<br>';
3512
+ regInfo += '"' + registerName + ' ' + register.text + '<br>';
3532
3513
  }
3533
3514
  }
3534
3515
  showConfirm(cm, regInfo);
@@ -3563,8 +3544,8 @@
3563
3544
  var lineStart = params.line || cm.firstLine();
3564
3545
  var lineEnd = params.lineEnd || params.line || cm.lastLine();
3565
3546
  if (lineStart == lineEnd) { return; }
3566
- var curStart = { line: lineStart, ch: 0 };
3567
- var curEnd = { line: lineEnd, ch: lineLength(cm, lineEnd) };
3547
+ var curStart = Pos(lineStart, 0);
3548
+ var curEnd = Pos(lineEnd, lineLength(cm, lineEnd));
3568
3549
  var text = cm.getRange(curStart, curEnd).split('\n');
3569
3550
  var numberRegex = (number == 'decimal') ? /(-?)([\d]+)/ :
3570
3551
  (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :
@@ -3614,41 +3595,38 @@
3614
3595
  'any other getSearchCursor implementation.');
3615
3596
  }
3616
3597
  var argString = params.argString;
3617
- var slashes = argString ? findUnescapedSlashes(argString) : [];
3598
+ var slashes = findUnescapedSlashes(argString);
3599
+ if (slashes[0] !== 0) {
3600
+ showConfirm(cm, 'Substitutions should be of the form ' +
3601
+ ':s/pattern/replace/');
3602
+ return;
3603
+ }
3604
+ var regexPart = argString.substring(slashes[0] + 1, slashes[1]);
3618
3605
  var replacePart = '';
3619
- if (slashes.length) {
3620
- if (slashes[0] !== 0) {
3621
- showConfirm(cm, 'Substitutions should be of the form ' +
3622
- ':s/pattern/replace/');
3623
- return;
3624
- }
3625
- var regexPart = argString.substring(slashes[0] + 1, slashes[1]);
3626
- var flagsPart;
3627
- var count;
3628
- var confirm = false; // Whether to confirm each replace.
3629
- if (slashes[1]) {
3630
- replacePart = argString.substring(slashes[1] + 1, slashes[2]);
3631
- if (getOption('pcre')) {
3632
- replacePart = unescapeRegexReplace(replacePart);
3633
- } else {
3634
- replacePart = translateRegexReplace(replacePart);
3635
- }
3636
- vimGlobalState.lastSubstituteReplacePart = replacePart;
3637
- }
3638
- if (slashes[2]) {
3639
- // After the 3rd slash, we can have flags followed by a space followed
3640
- // by count.
3641
- var trailing = argString.substring(slashes[2] + 1).split(' ');
3642
- flagsPart = trailing[0];
3643
- count = parseInt(trailing[1]);
3606
+ var flagsPart;
3607
+ var count;
3608
+ var confirm = false; // Whether to confirm each replace.
3609
+ if (slashes[1]) {
3610
+ replacePart = argString.substring(slashes[1] + 1, slashes[2]);
3611
+ if (getOption('pcre')) {
3612
+ replacePart = unescapeRegexReplace(replacePart);
3613
+ } else {
3614
+ replacePart = translateRegexReplace(replacePart);
3644
3615
  }
3645
- if (flagsPart) {
3646
- if (flagsPart.indexOf('c') != -1) {
3647
- confirm = true;
3648
- flagsPart.replace('c', '');
3649
- }
3650
- regexPart = regexPart + '/' + flagsPart;
3616
+ }
3617
+ if (slashes[2]) {
3618
+ // After the 3rd slash, we can have flags followed by a space followed
3619
+ // by count.
3620
+ var trailing = argString.substring(slashes[2] + 1).split(' ');
3621
+ flagsPart = trailing[0];
3622
+ count = parseInt(trailing[1]);
3623
+ }
3624
+ if (flagsPart) {
3625
+ if (flagsPart.indexOf('c') != -1) {
3626
+ confirm = true;
3627
+ flagsPart.replace('c', '');
3651
3628
  }
3629
+ regexPart = regexPart + '/' + flagsPart;
3652
3630
  }
3653
3631
  if (regexPart) {
3654
3632
  // If regex part is empty, then use the previous query. Otherwise use
@@ -3661,11 +3639,6 @@
3661
3639
  return;
3662
3640
  }
3663
3641
  }
3664
- replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;
3665
- if (replacePart === undefined) {
3666
- showConfirm(cm, 'No previous substitute regular expression');
3667
- return;
3668
- }
3669
3642
  var state = getSearchState(cm);
3670
3643
  var query = state.getQuery();
3671
3644
  var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;
@@ -3674,7 +3647,7 @@
3674
3647
  lineStart = lineEnd;
3675
3648
  lineEnd = lineStart + count - 1;
3676
3649
  }
3677
- var startPos = clipCursorToContent(cm, { line: lineStart, ch: 0 });
3650
+ var startPos = clipCursorToContent(cm, Pos(lineStart, 0));
3678
3651
  var cursor = cm.getSearchCursor(query, startPos);
3679
3652
  doReplace(cm, confirm, lineStart, lineEnd, cursor, query, replacePart);
3680
3653
  },
@@ -3911,7 +3884,6 @@
3911
3884
  function exitInsertMode(cm) {
3912
3885
  var vim = cm.state.vim;
3913
3886
  var macroModeState = vimGlobalState.macroModeState;
3914
- var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');
3915
3887
  var isPlaying = macroModeState.isPlaying;
3916
3888
  if (!isPlaying) {
3917
3889
  cm.off('change', onChange);
@@ -3925,13 +3897,11 @@
3925
3897
  vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;
3926
3898
  }
3927
3899
  delete vim.insertModeRepeat;
3928
- cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
3900
+ cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);
3929
3901
  vim.insertMode = false;
3930
3902
  cm.setOption('keyMap', 'vim');
3931
3903
  cm.setOption('disableInput', true);
3932
3904
  cm.toggleOverwrite(false); // exit replace mode if we were in it.
3933
- // update the ". register before exiting insert mode
3934
- insertModeChangeRegister.setText(macroModeState.lastInsertModeChanges.changes.join(''));
3935
3905
  CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
3936
3906
  if (macroModeState.isRecording) {
3937
3907
  logInsertModeChange(macroModeState);
@@ -3964,7 +3934,6 @@
3964
3934
  var keyBuffer = register.keyBuffer;
3965
3935
  var imc = 0;
3966
3936
  macroModeState.isPlaying = true;
3967
- macroModeState.replaySearchQueries = register.searchQueries.slice(0);
3968
3937
  for (var i = 0; i < keyBuffer.length; i++) {
3969
3938
  var text = keyBuffer[i];
3970
3939
  var match, key;
@@ -4003,15 +3972,6 @@
4003
3972
  }
4004
3973
  }
4005
3974
 
4006
- function logSearchQuery(macroModeState, query) {
4007
- if (macroModeState.isPlaying) { return; }
4008
- var registerName = macroModeState.latestRegister;
4009
- var register = vimGlobalState.registerController.getRegister(registerName);
4010
- if (register) {
4011
- register.pushSearchQuery(query);
4012
- }
4013
- }
4014
-
4015
3975
  /**
4016
3976
  * Listens for changes made in insert mode.
4017
3977
  * Should only be active in insert mode.
@@ -4160,5 +4120,4 @@
4160
4120
  };
4161
4121
  // Initialize Vim and make it available as an API.
4162
4122
  CodeMirror.Vim = Vim();
4163
- }
4164
- )();
4123
+ });