ace-rails-ap 4.1.5 → 4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +1 -1
  3. data/lib/ace/rails/version.rb +1 -1
  4. data/vendor/assets/javascripts/ace/ace.js +3960 -2205
  5. data/vendor/assets/javascripts/ace/ext-beautify.js +279 -290
  6. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +6 -3
  7. data/vendor/assets/javascripts/ace/ext-emmet.js +14 -11
  8. data/vendor/assets/javascripts/ace/ext-error_marker.js +6 -3
  9. data/vendor/assets/javascripts/ace/ext-keybinding_menu.js +24 -6
  10. data/vendor/assets/javascripts/ace/ext-language_tools.js +118 -81
  11. data/vendor/assets/javascripts/ace/ext-linking.js +7 -4
  12. data/vendor/assets/javascripts/ace/ext-modelist.js +34 -10
  13. data/vendor/assets/javascripts/ace/ext-options.js +755 -0
  14. data/vendor/assets/javascripts/ace/ext-rtl.js +124 -0
  15. data/vendor/assets/javascripts/ace/ext-searchbox.js +45 -40
  16. data/vendor/assets/javascripts/ace/ext-settings_menu.js +478 -365
  17. data/vendor/assets/javascripts/ace/ext-spellcheck.js +7 -4
  18. data/vendor/assets/javascripts/ace/ext-split.js +7 -46
  19. data/vendor/assets/javascripts/ace/ext-static_highlight.js +90 -22
  20. data/vendor/assets/javascripts/ace/ext-statusbar.js +7 -4
  21. data/vendor/assets/javascripts/ace/ext-textarea.js +21 -18
  22. data/vendor/assets/javascripts/ace/ext-themelist.js +8 -5
  23. data/vendor/assets/javascripts/ace/ext-whitespace.js +9 -6
  24. data/vendor/assets/javascripts/ace/keybinding-emacs.js +27 -39
  25. data/vendor/assets/javascripts/ace/keybinding-sublime.js +425 -0
  26. data/vendor/assets/javascripts/ace/keybinding-vim.js +293 -226
  27. data/vendor/assets/javascripts/ace/mode-abap.js +10 -3
  28. data/vendor/assets/javascripts/ace/mode-abc.js +11 -4
  29. data/vendor/assets/javascripts/ace/mode-actionscript.js +12 -5
  30. data/vendor/assets/javascripts/ace/mode-ada.js +54 -4
  31. data/vendor/assets/javascripts/ace/mode-apache_conf.js +12 -5
  32. data/vendor/assets/javascripts/ace/mode-apex.js +457 -0
  33. data/vendor/assets/javascripts/ace/mode-applescript.js +11 -4
  34. data/vendor/assets/javascripts/ace/mode-asciidoc.js +9 -2
  35. data/vendor/assets/javascripts/ace/mode-asl.js +421 -0
  36. data/vendor/assets/javascripts/ace/mode-assembly_x86.js +11 -4
  37. data/vendor/assets/javascripts/ace/mode-autohotkey.js +14 -7
  38. data/vendor/assets/javascripts/ace/mode-batchfile.js +12 -5
  39. data/vendor/assets/javascripts/ace/mode-bro.js +13 -6
  40. data/vendor/assets/javascripts/ace/mode-c9search.js +9 -3
  41. data/vendor/assets/javascripts/ace/mode-c_cpp.js +22 -7
  42. data/vendor/assets/javascripts/ace/mode-cirru.js +9 -2
  43. data/vendor/assets/javascripts/ace/mode-clojure.js +8 -1
  44. data/vendor/assets/javascripts/ace/mode-cobol.js +8 -1
  45. data/vendor/assets/javascripts/ace/mode-coffee.js +11 -4
  46. data/vendor/assets/javascripts/ace/mode-coldfusion.js +160 -134
  47. data/vendor/assets/javascripts/ace/mode-csharp.js +13 -6
  48. data/vendor/assets/javascripts/ace/mode-csound_document.js +3988 -0
  49. data/vendor/assets/javascripts/ace/mode-csound_orchestra.js +2924 -0
  50. data/vendor/assets/javascripts/ace/mode-csound_score.js +453 -0
  51. data/vendor/assets/javascripts/ace/mode-csp.js +59 -0
  52. data/vendor/assets/javascripts/ace/mode-css.js +47 -27
  53. data/vendor/assets/javascripts/ace/mode-curly.js +159 -133
  54. data/vendor/assets/javascripts/ace/mode-d.js +11 -4
  55. data/vendor/assets/javascripts/ace/mode-dart.js +44 -20
  56. data/vendor/assets/javascripts/ace/mode-diff.js +10 -3
  57. data/vendor/assets/javascripts/ace/mode-django.js +160 -134
  58. data/vendor/assets/javascripts/ace/mode-dockerfile.js +11 -4
  59. data/vendor/assets/javascripts/ace/mode-dot.js +11 -4
  60. data/vendor/assets/javascripts/ace/mode-drools.js +45 -5
  61. data/vendor/assets/javascripts/ace/mode-edifact.js +165 -0
  62. data/vendor/assets/javascripts/ace/mode-eiffel.js +8 -1
  63. data/vendor/assets/javascripts/ace/mode-ejs.js +160 -134
  64. data/vendor/assets/javascripts/ace/mode-elixir.js +11 -4
  65. data/vendor/assets/javascripts/ace/mode-elm.js +10 -3
  66. data/vendor/assets/javascripts/ace/mode-erlang.js +12 -5
  67. data/vendor/assets/javascripts/ace/mode-forth.js +12 -5
  68. data/vendor/assets/javascripts/ace/mode-fortran.js +10 -3
  69. data/vendor/assets/javascripts/ace/mode-fsharp.js +316 -0
  70. data/vendor/assets/javascripts/ace/mode-fsl.js +258 -0
  71. data/vendor/assets/javascripts/ace/mode-ftl.js +23 -12
  72. data/vendor/assets/javascripts/ace/mode-gcode.js +8 -1
  73. data/vendor/assets/javascripts/ace/mode-gherkin.js +10 -3
  74. data/vendor/assets/javascripts/ace/mode-gitignore.js +8 -1
  75. data/vendor/assets/javascripts/ace/mode-glsl.js +23 -8
  76. data/vendor/assets/javascripts/ace/mode-gobstones.js +13 -5
  77. data/vendor/assets/javascripts/ace/mode-golang.js +11 -4
  78. data/vendor/assets/javascripts/ace/mode-graphqlschema.js +10 -3
  79. data/vendor/assets/javascripts/ace/mode-groovy.js +13 -5
  80. data/vendor/assets/javascripts/ace/mode-haml.js +23 -12
  81. data/vendor/assets/javascripts/ace/mode-handlebars.js +159 -133
  82. data/vendor/assets/javascripts/ace/mode-haskell.js +13 -6
  83. data/vendor/assets/javascripts/ace/mode-haskell_cabal.js +8 -1
  84. data/vendor/assets/javascripts/ace/mode-haxe.js +11 -4
  85. data/vendor/assets/javascripts/ace/mode-hjson.js +13 -6
  86. data/vendor/assets/javascripts/ace/mode-html.js +159 -133
  87. data/vendor/assets/javascripts/ace/mode-html_elixir.js +162 -136
  88. data/vendor/assets/javascripts/ace/mode-html_ruby.js +160 -134
  89. data/vendor/assets/javascripts/ace/mode-ini.js +8 -1
  90. data/vendor/assets/javascripts/ace/mode-io.js +12 -5
  91. data/vendor/assets/javascripts/ace/mode-jack.js +10 -3
  92. data/vendor/assets/javascripts/ace/mode-jade.js +271 -375
  93. data/vendor/assets/javascripts/ace/mode-java.js +108 -7
  94. data/vendor/assets/javascripts/ace/mode-javascript.js +13 -5
  95. data/vendor/assets/javascripts/ace/mode-json.js +10 -3
  96. data/vendor/assets/javascripts/ace/mode-jsoniq.js +24 -12
  97. data/vendor/assets/javascripts/ace/mode-jsp.js +59 -15
  98. data/vendor/assets/javascripts/ace/mode-jssm.js +325 -0
  99. data/vendor/assets/javascripts/ace/mode-jsx.js +11 -4
  100. data/vendor/assets/javascripts/ace/mode-julia.js +12 -5
  101. data/vendor/assets/javascripts/ace/mode-kotlin.js +16 -7
  102. data/vendor/assets/javascripts/ace/mode-latex.js +87 -15
  103. data/vendor/assets/javascripts/ace/mode-less.js +47 -27
  104. data/vendor/assets/javascripts/ace/mode-liquid.js +2026 -472
  105. data/vendor/assets/javascripts/ace/mode-lisp.js +9 -2
  106. data/vendor/assets/javascripts/ace/mode-livescript.js +10 -2
  107. data/vendor/assets/javascripts/ace/mode-logiql.js +10 -3
  108. data/vendor/assets/javascripts/ace/mode-logtalk.js +352 -0
  109. data/vendor/assets/javascripts/ace/mode-lsl.js +10 -3
  110. data/vendor/assets/javascripts/ace/mode-lua.js +9 -2
  111. data/vendor/assets/javascripts/ace/mode-luapage.js +160 -134
  112. data/vendor/assets/javascripts/ace/mode-lucene.js +36 -20
  113. data/vendor/assets/javascripts/ace/mode-makefile.js +10 -3
  114. data/vendor/assets/javascripts/ace/mode-markdown.js +523 -200
  115. data/vendor/assets/javascripts/ace/mode-mask.js +100 -83
  116. data/vendor/assets/javascripts/ace/mode-matlab.js +8 -1
  117. data/vendor/assets/javascripts/ace/mode-maze.js +10 -3
  118. data/vendor/assets/javascripts/ace/mode-mel.js +11 -4
  119. data/vendor/assets/javascripts/ace/mode-mixal.js +122 -0
  120. data/vendor/assets/javascripts/ace/mode-mushcode.js +9 -2
  121. data/vendor/assets/javascripts/ace/mode-mysql.js +11 -4
  122. data/vendor/assets/javascripts/ace/mode-nix.js +22 -7
  123. data/vendor/assets/javascripts/ace/mode-nsis.js +15 -8
  124. data/vendor/assets/javascripts/ace/mode-objectivec.js +23 -8
  125. data/vendor/assets/javascripts/ace/mode-ocaml.js +8 -1
  126. data/vendor/assets/javascripts/ace/mode-pascal.js +9 -2
  127. data/vendor/assets/javascripts/ace/mode-perl.js +10 -3
  128. data/vendor/assets/javascripts/ace/mode-perl6.js +593 -0
  129. data/vendor/assets/javascripts/ace/mode-pgsql.js +314 -71
  130. data/vendor/assets/javascripts/ace/mode-php.js +1037 -994
  131. data/vendor/assets/javascripts/ace/mode-php_laravel_blade.js +13100 -0
  132. data/vendor/assets/javascripts/ace/mode-pig.js +13 -6
  133. data/vendor/assets/javascripts/ace/mode-plain_text.js +8 -1
  134. data/vendor/assets/javascripts/ace/mode-powershell.js +10 -3
  135. data/vendor/assets/javascripts/ace/mode-praat.js +17 -7
  136. data/vendor/assets/javascripts/ace/mode-prolog.js +12 -5
  137. data/vendor/assets/javascripts/ace/mode-properties.js +8 -1
  138. data/vendor/assets/javascripts/ace/mode-protobuf.js +22 -7
  139. data/vendor/assets/javascripts/ace/mode-puppet.js +369 -0
  140. data/vendor/assets/javascripts/ace/mode-python.js +305 -63
  141. data/vendor/assets/javascripts/ace/mode-r.js +14 -4
  142. data/vendor/assets/javascripts/ace/mode-razor.js +162 -136
  143. data/vendor/assets/javascripts/ace/mode-rdoc.js +41 -3
  144. data/vendor/assets/javascripts/ace/mode-red.js +450 -0
  145. data/vendor/assets/javascripts/ace/mode-redshift.js +360 -0
  146. data/vendor/assets/javascripts/ace/mode-rhtml.js +159 -133
  147. data/vendor/assets/javascripts/ace/mode-rst.js +8 -1
  148. data/vendor/assets/javascripts/ace/mode-ruby.js +9 -2
  149. data/vendor/assets/javascripts/ace/mode-rust.js +16 -7
  150. data/vendor/assets/javascripts/ace/mode-sass.js +211 -116
  151. data/vendor/assets/javascripts/ace/mode-scad.js +11 -4
  152. data/vendor/assets/javascripts/ace/mode-scala.js +13 -5
  153. data/vendor/assets/javascripts/ace/mode-scheme.js +9 -2
  154. data/vendor/assets/javascripts/ace/mode-scss.js +412 -125
  155. data/vendor/assets/javascripts/ace/mode-sh.js +11 -4
  156. data/vendor/assets/javascripts/ace/mode-sjs.js +15 -7
  157. data/vendor/assets/javascripts/ace/mode-slim.js +4641 -0
  158. data/vendor/assets/javascripts/ace/mode-smarty.js +161 -135
  159. data/vendor/assets/javascripts/ace/mode-snippets.js +23 -16
  160. data/vendor/assets/javascripts/ace/mode-soy_template.js +161 -135
  161. data/vendor/assets/javascripts/ace/mode-space.js +8 -1
  162. data/vendor/assets/javascripts/ace/mode-sparql.js +13 -6
  163. data/vendor/assets/javascripts/ace/mode-sql.js +9 -2
  164. data/vendor/assets/javascripts/ace/mode-sqlserver.js +11 -4
  165. data/vendor/assets/javascripts/ace/mode-stylus.js +20 -10
  166. data/vendor/assets/javascripts/ace/mode-svg.js +26 -13
  167. data/vendor/assets/javascripts/ace/mode-swift.js +15 -8
  168. data/vendor/assets/javascripts/ace/mode-tcl.js +10 -3
  169. data/vendor/assets/javascripts/ace/mode-terraform.js +397 -0
  170. data/vendor/assets/javascripts/ace/mode-tex.js +8 -1
  171. data/vendor/assets/javascripts/ace/mode-text.js +8 -0
  172. data/vendor/assets/javascripts/ace/mode-textile.js +8 -1
  173. data/vendor/assets/javascripts/ace/mode-toml.js +9 -2
  174. data/vendor/assets/javascripts/ace/mode-tsx.js +27 -31
  175. data/vendor/assets/javascripts/ace/mode-turtle.js +13 -6
  176. data/vendor/assets/javascripts/ace/mode-twig.js +160 -134
  177. data/vendor/assets/javascripts/ace/mode-typescript.js +27 -31
  178. data/vendor/assets/javascripts/ace/mode-vala.js +13 -6
  179. data/vendor/assets/javascripts/ace/mode-vbscript.js +9 -2
  180. data/vendor/assets/javascripts/ace/mode-velocity.js +159 -133
  181. data/vendor/assets/javascripts/ace/mode-verilog.js +19 -5
  182. data/vendor/assets/javascripts/ace/mode-vhdl.js +8 -1
  183. data/vendor/assets/javascripts/ace/mode-visualforce.js +2637 -0
  184. data/vendor/assets/javascripts/ace/mode-wollok.js +15 -8
  185. data/vendor/assets/javascripts/ace/mode-xml.js +21 -9
  186. data/vendor/assets/javascripts/ace/mode-xquery.js +24 -12
  187. data/vendor/assets/javascripts/ace/mode-yaml.js +15 -5
  188. data/vendor/assets/javascripts/ace/theme-ambiance.js +8 -6
  189. data/vendor/assets/javascripts/ace/theme-chaos.js +8 -1
  190. data/vendor/assets/javascripts/ace/theme-chrome.js +8 -1
  191. data/vendor/assets/javascripts/ace/theme-clouds.js +8 -1
  192. data/vendor/assets/javascripts/ace/theme-clouds_midnight.js +8 -1
  193. data/vendor/assets/javascripts/ace/theme-cobalt.js +8 -1
  194. data/vendor/assets/javascripts/ace/theme-crimson_editor.js +8 -1
  195. data/vendor/assets/javascripts/ace/theme-dawn.js +8 -1
  196. data/vendor/assets/javascripts/ace/theme-dracula.js +135 -0
  197. data/vendor/assets/javascripts/ace/theme-dreamweaver.js +8 -1
  198. data/vendor/assets/javascripts/ace/theme-eclipse.js +8 -1
  199. data/vendor/assets/javascripts/ace/theme-github.js +8 -1
  200. data/vendor/assets/javascripts/ace/theme-gob.js +8 -1
  201. data/vendor/assets/javascripts/ace/theme-gruvbox.js +8 -1
  202. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +8 -1
  203. data/vendor/assets/javascripts/ace/theme-iplastic.js +8 -1
  204. data/vendor/assets/javascripts/ace/theme-katzenmilch.js +8 -1
  205. data/vendor/assets/javascripts/ace/theme-kr_theme.js +8 -1
  206. data/vendor/assets/javascripts/ace/theme-kuroir.js +8 -1
  207. data/vendor/assets/javascripts/ace/theme-merbivore.js +8 -1
  208. data/vendor/assets/javascripts/ace/theme-merbivore_soft.js +8 -1
  209. data/vendor/assets/javascripts/ace/theme-mono_industrial.js +8 -1
  210. data/vendor/assets/javascripts/ace/theme-monokai.js +8 -1
  211. data/vendor/assets/javascripts/ace/theme-pastel_on_dark.js +8 -1
  212. data/vendor/assets/javascripts/ace/theme-solarized_dark.js +8 -1
  213. data/vendor/assets/javascripts/ace/theme-solarized_light.js +9 -2
  214. data/vendor/assets/javascripts/ace/theme-sqlserver.js +8 -1
  215. data/vendor/assets/javascripts/ace/theme-terminal.js +8 -1
  216. data/vendor/assets/javascripts/ace/theme-textmate.js +9 -1
  217. data/vendor/assets/javascripts/ace/theme-tomorrow.js +8 -1
  218. data/vendor/assets/javascripts/ace/theme-tomorrow_night.js +8 -1
  219. data/vendor/assets/javascripts/ace/theme-tomorrow_night_blue.js +8 -1
  220. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +8 -1
  221. data/vendor/assets/javascripts/ace/theme-tomorrow_night_eighties.js +8 -1
  222. data/vendor/assets/javascripts/ace/theme-twilight.js +8 -1
  223. data/vendor/assets/javascripts/ace/theme-vibrant_ink.js +8 -1
  224. data/vendor/assets/javascripts/ace/theme-xcode.js +8 -1
  225. data/vendor/assets/javascripts/ace/worker-coffee.js +40 -41
  226. data/vendor/assets/javascripts/ace/worker-css.js +44 -37
  227. data/vendor/assets/javascripts/ace/worker-html.js +40 -37
  228. data/vendor/assets/javascripts/ace/worker-javascript.js +42 -39
  229. data/vendor/assets/javascripts/ace/worker-json.js +41 -36
  230. data/vendor/assets/javascripts/ace/worker-lua.js +41 -37
  231. data/vendor/assets/javascripts/ace/worker-php.js +40 -37
  232. data/vendor/assets/javascripts/ace/worker-xml.js +105 -103
  233. data/vendor/assets/javascripts/ace/worker-xquery.js +39 -36
  234. metadata +27 -4
@@ -61,11 +61,10 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
61
61
  newlineAndIndent: function(cm) { cm.ace.insert("\n"); }
62
62
  };
63
63
  CodeMirror.keyMap = {};
64
- CodeMirror.addClass = CodeMirror.rmClass =
65
- CodeMirror.e_stop = function() {};
64
+ CodeMirror.addClass = CodeMirror.rmClass = function() {};
65
+ CodeMirror.e_stop = CodeMirror.e_preventDefault = event.stopEvent;
66
66
  CodeMirror.keyName = function(e) {
67
- if (e.key) return e.key;
68
- var key = (KEYS[e.keyCode] || "");
67
+ var key = (KEYS[e.keyCode] || e.key || "");
69
68
  if (key.length == 1) key = key.toUpperCase();
70
69
  key = event.getModifierString(e).replace(/(^|-)\w/g, function(m) {
71
70
  return m.toUpperCase();
@@ -122,7 +121,6 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
122
121
  var curOp = this.curOp = this.curOp || {};
123
122
  if (!curOp.changeHandlers)
124
123
  curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice();
125
- if (this.virtualSelectionMode()) return;
126
124
  if (!curOp.lastChange) {
127
125
  curOp.lastChange = curOp.change = change;
128
126
  } else {
@@ -157,6 +155,8 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
157
155
  this.curOp.force = force;
158
156
  var result = fn();
159
157
  if (this.ace.curOp && this.ace.curOp.command.name == "vim") {
158
+ if (this.state.dialog)
159
+ this.ace.curOp.command.scrollIntoView = false;
160
160
  this.ace.endOperation();
161
161
  if (!curOp.cursorActivity && !curOp.lastChange && prevOp)
162
162
  this.ace.prevOp = prevOp;
@@ -280,7 +280,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
280
280
  if (point.bias == 1) {
281
281
  cmp = 1;
282
282
  } else {
283
- point.bias == -1;
283
+ point.bias = -1;
284
284
  continue;
285
285
  }
286
286
  }
@@ -459,7 +459,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
459
459
  return this.ace.textInput.getElement();
460
460
  };
461
461
  this.getWrapperElement = function() {
462
- return this.ace.containter;
462
+ return this.ace.container;
463
463
  };
464
464
  var optMap = {
465
465
  indentWithTabs: "useSoftTabs",
@@ -565,7 +565,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
565
565
  return toCmPos(this.ace.session.doc.indexToPosition(index));
566
566
  };
567
567
  this.focus = function(index) {
568
- return this.ace.focus();
568
+ return this.ace.textInput.focus();
569
569
  };
570
570
  this.blur = function(index) {
571
571
  return this.ace.blur();
@@ -575,10 +575,11 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
575
575
  };
576
576
  this.scanForBracket = function(pos, dir, _, options) {
577
577
  var re = options.bracketRegex.source;
578
+ var tokenRe = /paren|text|operator|tag/;
578
579
  if (dir == 1) {
579
- var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), /paren|text/);
580
+ var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe);
580
581
  } else {
581
- var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, /paren|text/);
582
+ var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, tokenRe);
582
583
  }
583
584
  return m && {pos: toCmPos(m)};
584
585
  };
@@ -666,28 +667,29 @@ CodeMirror.defineExtension = function(name, fn) {
666
667
  CodeMirror.prototype[name] = fn;
667
668
  };
668
669
  dom.importCssString(".normal-mode .ace_cursor{\
669
- border: 1px solid red;\
670
- background-color: red;\
671
- opacity: 0.5;\
670
+ border: none;\
671
+ background-color: rgba(255,0,0,0.5);\
672
672
  }\
673
673
  .normal-mode .ace_hidden-cursors .ace_cursor{\
674
674
  background-color: transparent;\
675
+ border: 1px solid red;\
676
+ opacity: 0.7\
675
677
  }\
676
678
  .ace_dialog {\
677
679
  position: absolute;\
678
680
  left: 0; right: 0;\
679
- background: white;\
681
+ background: inherit;\
680
682
  z-index: 15;\
681
683
  padding: .1em .8em;\
682
684
  overflow: hidden;\
683
- color: #333;\
685
+ color: inherit;\
684
686
  }\
685
687
  .ace_dialog-top {\
686
- border-bottom: 1px solid #eee;\
688
+ border-bottom: 1px solid #444;\
687
689
  top: 0;\
688
690
  }\
689
691
  .ace_dialog-bottom {\
690
- border-top: 1px solid #eee;\
692
+ border-top: 1px solid #444;\
691
693
  bottom: 0;\
692
694
  }\
693
695
  .ace_dialog input {\
@@ -730,11 +732,19 @@ dom.importCssString(".normal-mode .ace_cursor{\
730
732
 
731
733
  var dialog = dialogDiv(this, template, options.bottom);
732
734
  var closed = false, me = this;
735
+ this.state.dialog = dialog;
733
736
  function close(newVal) {
734
737
  if (typeof newVal == 'string') {
735
738
  inp.value = newVal;
736
739
  } else {
737
740
  if (closed) return;
741
+
742
+ if (newVal && newVal.type == "blur") {
743
+ if (document.activeElement === inp)
744
+ return;
745
+ }
746
+
747
+ me.state.dialog = null;
738
748
  closed = true;
739
749
  dialog.parentNode.removeChild(dialog);
740
750
  me.focus();
@@ -747,7 +757,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
747
757
  if (inp) {
748
758
  if (options.value) {
749
759
  inp.value = options.value;
750
- if (options.select !== false) inp.select();
760
+ if (options.selectValueOnOpen !== false) inp.select();
751
761
  }
752
762
 
753
763
  if (options.onInput)
@@ -757,12 +767,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
757
767
 
758
768
  CodeMirror.on(inp, "keydown", function(e) {
759
769
  if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
770
+ if (e.keyCode == 13) callback(inp.value);
760
771
  if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
761
772
  inp.blur();
762
773
  CodeMirror.e_stop(e);
763
774
  close();
764
775
  }
765
- if (e.keyCode == 13) callback(inp.value);
766
776
  });
767
777
 
768
778
  if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close);
@@ -834,6 +844,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
834
844
  { keys: '<PageUp>', type: 'keyToKey', toKeys: '<C-b>' },
835
845
  { keys: '<PageDown>', type: 'keyToKey', toKeys: '<C-f>' },
836
846
  { keys: '<CR>', type: 'keyToKey', toKeys: 'j^', context: 'normal' },
847
+ { keys: '<Ins>', type: 'action', action: 'toggleOverwrite', context: 'insert' },
837
848
  { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }},
838
849
  { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }},
839
850
  { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }},
@@ -945,6 +956,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
945
956
  { keys: '.', type: 'action', action: 'repeatLastEdit' },
946
957
  { keys: '<C-a>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}},
947
958
  { keys: '<C-x>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}},
959
+ { keys: '<C-t>', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' },
960
+ { keys: '<C-d>', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' },
948
961
  { keys: 'a<character>', type: 'motion', motion: 'textObjectManipulation' },
949
962
  { keys: 'i<character>', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }},
950
963
  { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},
@@ -972,6 +985,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
972
985
  { name: 'sort', shortName: 'sor' },
973
986
  { name: 'substitute', shortName: 's', possiblyAsync: true },
974
987
  { name: 'nohlsearch', shortName: 'noh' },
988
+ { name: 'yank', shortName: 'y' },
975
989
  { name: 'delmarks', shortName: 'delm' },
976
990
  { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },
977
991
  { name: 'global', shortName: 'g' }
@@ -1001,7 +1015,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1001
1015
  CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor");
1002
1016
 
1003
1017
  if (!next || next.attach != attachVimMap)
1004
- leaveVimMode(cm, false);
1018
+ leaveVimMode(cm);
1005
1019
  }
1006
1020
  function attachVimMap(cm, prev) {
1007
1021
  if (this == CodeMirror.keyMap.vim)
@@ -1019,6 +1033,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1019
1033
 
1020
1034
  function cmKey(key, cm) {
1021
1035
  if (!cm) { return undefined; }
1036
+ if (this[key]) { return this[key]; }
1022
1037
  var vimKey = cmKeyToVimKey(key);
1023
1038
  if (!vimKey) {
1024
1039
  return false;
@@ -1031,7 +1046,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1031
1046
  }
1032
1047
 
1033
1048
  var modifiers = {'Shift': 'S', 'Ctrl': 'C', 'Alt': 'A', 'Cmd': 'D', 'Mod': 'A'};
1034
- var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del'};
1049
+ var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'};
1035
1050
  function cmKeyToVimKey(key) {
1036
1051
  if (key.charAt(0) == '\'') {
1037
1052
  return key.charAt(1);
@@ -1144,11 +1159,11 @@ dom.importCssString(".normal-mode .ace_cursor{\
1144
1159
  cfg = cfg || {};
1145
1160
  var scope = cfg.scope;
1146
1161
  if (!option) {
1147
- throw Error('Unknown option: ' + name);
1162
+ return new Error('Unknown option: ' + name);
1148
1163
  }
1149
1164
  if (option.type == 'boolean') {
1150
1165
  if (value && value !== true) {
1151
- throw Error('Invalid argument: ' + name + '=' + value);
1166
+ return new Error('Invalid argument: ' + name + '=' + value);
1152
1167
  } else if (value !== false) {
1153
1168
  value = true;
1154
1169
  }
@@ -1175,7 +1190,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1175
1190
  cfg = cfg || {};
1176
1191
  var scope = cfg.scope;
1177
1192
  if (!option) {
1178
- throw Error('Unknown option: ' + name);
1193
+ return new Error('Unknown option: ' + name);
1179
1194
  }
1180
1195
  if (option.callback) {
1181
1196
  var local = cm && option.callback(undefined, cm);
@@ -1344,10 +1359,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
1344
1359
  lastSubstituteReplacePart: undefined,
1345
1360
  jumpList: createCircularJumpList(),
1346
1361
  macroModeState: new MacroModeState,
1347
- lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
1362
+ lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''},
1348
1363
  registerController: new RegisterController({}),
1349
- searchHistoryController: new HistoryController({}),
1350
- exCommandHistoryController : new HistoryController({})
1364
+ searchHistoryController: new HistoryController(),
1365
+ exCommandHistoryController : new HistoryController()
1351
1366
  };
1352
1367
  for (var optionName in options) {
1353
1368
  var option = options[optionName];
@@ -1608,7 +1623,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1608
1623
  }
1609
1624
  };
1610
1625
  function defineRegister(name, register) {
1611
- var registers = vimGlobalState.registerController.registers[name];
1626
+ var registers = vimGlobalState.registerController.registers;
1612
1627
  if (!name || name.length != 1) {
1613
1628
  throw Error('Register name must be 1 character');
1614
1629
  }
@@ -1624,9 +1639,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
1624
1639
  }
1625
1640
  RegisterController.prototype = {
1626
1641
  pushText: function(registerName, operator, text, linewise, blockwise) {
1627
- if (linewise && text.charAt(0) == '\n') {
1628
- text = text.slice(1) + '\n';
1629
- }
1630
1642
  if (linewise && text.charAt(text.length - 1) !== '\n'){
1631
1643
  text += '\n';
1632
1644
  }
@@ -1679,7 +1691,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1679
1691
  };
1680
1692
  function HistoryController() {
1681
1693
  this.historyBuffer = [];
1682
- this.iterator;
1694
+ this.iterator = 0;
1683
1695
  this.initialPrefix = null;
1684
1696
  }
1685
1697
  HistoryController.prototype = {
@@ -1851,7 +1863,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
1851
1863
  });
1852
1864
  }
1853
1865
  function onPromptClose(query) {
1854
- cm.scrollTo(originalScrollPos.left, originalScrollPos.top);
1855
1866
  handleQuery(query, true /** ignoreCase */, true /** smartCase */);
1856
1867
  var macroModeState = vimGlobalState.macroModeState;
1857
1868
  if (macroModeState.isRecording) {
@@ -1859,11 +1870,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
1859
1870
  }
1860
1871
  }
1861
1872
  function onPromptKeyUp(e, query, close) {
1862
- var keyName = CodeMirror.keyName(e), up;
1873
+ var keyName = CodeMirror.keyName(e), up, offset;
1863
1874
  if (keyName == 'Up' || keyName == 'Down') {
1864
1875
  up = keyName == 'Up' ? true : false;
1876
+ offset = e.target ? e.target.selectionEnd : 0;
1865
1877
  query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '';
1866
1878
  close(query);
1879
+ if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);
1867
1880
  } else {
1868
1881
  if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')
1869
1882
  vimGlobalState.searchHistoryController.reset();
@@ -1894,6 +1907,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
1894
1907
  clearInputState(cm);
1895
1908
  close();
1896
1909
  cm.focus();
1910
+ } else if (keyName == 'Up' || keyName == 'Down') {
1911
+ CodeMirror.e_stop(e);
1897
1912
  } else if (keyName == 'Ctrl-U') {
1898
1913
  CodeMirror.e_stop(e);
1899
1914
  close('');
@@ -1950,7 +1965,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1950
1965
  exCommandDispatcher.processCommand(cm, input);
1951
1966
  }
1952
1967
  function onPromptKeyDown(e, input, close) {
1953
- var keyName = CodeMirror.keyName(e), up;
1968
+ var keyName = CodeMirror.keyName(e), up, offset;
1954
1969
  if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||
1955
1970
  (keyName == 'Backspace' && input == '')) {
1956
1971
  vimGlobalState.exCommandHistoryController.pushInput(input);
@@ -1961,9 +1976,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
1961
1976
  cm.focus();
1962
1977
  }
1963
1978
  if (keyName == 'Up' || keyName == 'Down') {
1979
+ CodeMirror.e_stop(e);
1964
1980
  up = keyName == 'Up' ? true : false;
1981
+ offset = e.target ? e.target.selectionEnd : 0;
1965
1982
  input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '';
1966
1983
  close(input);
1984
+ if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);
1967
1985
  } else if (keyName == 'Ctrl-U') {
1968
1986
  CodeMirror.e_stop(e);
1969
1987
  close('');
@@ -1977,7 +1995,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1977
1995
  } else {
1978
1996
  if (vim.visualMode) {
1979
1997
  showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>',
1980
- onKeyDown: onPromptKeyDown});
1998
+ onKeyDown: onPromptKeyDown, selectValueOnOpen: false});
1981
1999
  } else {
1982
2000
  showPrompt(cm, { onClose: onPromptClose, prefix: ':',
1983
2001
  onKeyDown: onPromptKeyDown});
@@ -2197,9 +2215,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
2197
2215
  return findNext(cm, prev/** prev */, query, motionArgs.repeat);
2198
2216
  },
2199
2217
  goToMark: function(cm, _head, motionArgs, vim) {
2200
- var mark = vim.marks[motionArgs.selectedCharacter];
2201
- if (mark) {
2202
- var pos = mark.find();
2218
+ var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter);
2219
+ if (pos) {
2203
2220
  return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;
2204
2221
  }
2205
2222
  return null;
@@ -2274,9 +2291,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
2274
2291
  var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;
2275
2292
  var first = cm.firstLine();
2276
2293
  var last = cm.lastLine();
2277
- if ((line < first && cur.line == first) ||
2278
- (line > last && cur.line == last)) {
2279
- return;
2294
+ if (line < first && cur.line == first){
2295
+ return this.moveToStartOfLine(cm, head, motionArgs, vim);
2296
+ }else if (line > last && cur.line == last){
2297
+ return this.moveToEol(cm, head, motionArgs, vim);
2280
2298
  }
2281
2299
  var fold = cm.ace.session.getFoldLine(line);
2282
2300
  if (fold) {
@@ -2429,8 +2447,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
2429
2447
  textObjectManipulation: function(cm, head, motionArgs, vim) {
2430
2448
  var mirroredPairs = {'(': ')', ')': '(',
2431
2449
  '{': '}', '}': '{',
2432
- '[': ']', ']': '['};
2433
- var selfPaired = {'\'': true, '"': true};
2450
+ '[': ']', ']': '[',
2451
+ '<': '>', '>': '<'};
2452
+ var selfPaired = {'\'': true, '"': true, '`': true};
2434
2453
 
2435
2454
  var character = motionArgs.selectedCharacter;
2436
2455
  if (character == 'b') {
@@ -2473,7 +2492,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
2473
2492
  },
2474
2493
 
2475
2494
  repeatLastCharacterSearch: function(cm, head, motionArgs) {
2476
- var lastSearch = vimGlobalState.lastChararacterSearch;
2495
+ var lastSearch = vimGlobalState.lastCharacterSearch;
2477
2496
  var repeat = motionArgs.repeat;
2478
2497
  var forward = motionArgs.forward === lastSearch.forward;
2479
2498
  var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);
@@ -2574,7 +2593,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
2574
2593
  vimGlobalState.registerController.pushText(
2575
2594
  args.registerName, 'delete', text,
2576
2595
  args.linewise, vim.visualBlock);
2577
- return clipCursorToContent(cm, finalHead);
2596
+ var includeLineBreak = vim.insertMode
2597
+ return clipCursorToContent(cm, finalHead, includeLineBreak);
2578
2598
  },
2579
2599
  indent: function(cm, args, ranges) {
2580
2600
  var vim = cm.state.vim;
@@ -2721,7 +2741,20 @@ dom.importCssString(".normal-mode .ace_cursor{\
2721
2741
  enterMacroRecordMode: function(cm, actionArgs) {
2722
2742
  var macroModeState = vimGlobalState.macroModeState;
2723
2743
  var registerName = actionArgs.selectedCharacter;
2724
- macroModeState.enterMacroRecordMode(cm, registerName);
2744
+ if (vimGlobalState.registerController.isValidRegister(registerName)) {
2745
+ macroModeState.enterMacroRecordMode(cm, registerName);
2746
+ }
2747
+ },
2748
+ toggleOverwrite: function(cm) {
2749
+ if (!cm.state.overwrite) {
2750
+ cm.toggleOverwrite(true);
2751
+ cm.setOption('keyMap', 'vim-replace');
2752
+ CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"});
2753
+ } else {
2754
+ cm.toggleOverwrite(false);
2755
+ cm.setOption('keyMap', 'vim-insert');
2756
+ CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"});
2757
+ }
2725
2758
  },
2726
2759
  enterInsertMode: function(cm, actionArgs, vim) {
2727
2760
  if (cm.getOption('readOnly')) { return; }
@@ -2768,13 +2801,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
2768
2801
  return;
2769
2802
  }
2770
2803
  }
2771
- cm.setOption('keyMap', 'vim-insert');
2772
2804
  cm.setOption('disableInput', false);
2773
2805
  if (actionArgs && actionArgs.replace) {
2774
2806
  cm.toggleOverwrite(true);
2775
2807
  cm.setOption('keyMap', 'vim-replace');
2776
2808
  CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"});
2777
2809
  } else {
2810
+ cm.toggleOverwrite(false);
2778
2811
  cm.setOption('keyMap', 'vim-insert');
2779
2812
  CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"});
2780
2813
  }
@@ -3088,25 +3121,32 @@ dom.importCssString(".normal-mode .ace_cursor{\
3088
3121
  incrementNumberToken: function(cm, actionArgs) {
3089
3122
  var cur = cm.getCursor();
3090
3123
  var lineStr = cm.getLine(cur.line);
3091
- var re = /-?\d+/g;
3124
+ var re = /(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi;
3092
3125
  var match;
3093
3126
  var start;
3094
3127
  var end;
3095
3128
  var numberStr;
3096
- var token;
3097
3129
  while ((match = re.exec(lineStr)) !== null) {
3098
- token = match[0];
3099
3130
  start = match.index;
3100
- end = start + token.length;
3131
+ end = start + match[0].length;
3101
3132
  if (cur.ch < end)break;
3102
3133
  }
3103
3134
  if (!actionArgs.backtrack && (end <= cur.ch))return;
3104
- if (token) {
3135
+ if (match) {
3136
+ var baseStr = match[2] || match[4]
3137
+ var digits = match[3] || match[5]
3105
3138
  var increment = actionArgs.increase ? 1 : -1;
3106
- var number = parseInt(token) + (increment * actionArgs.repeat);
3139
+ var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()];
3140
+ var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat);
3141
+ numberStr = number.toString(base);
3142
+ var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : ''
3143
+ if (numberStr.charAt(0) === '-') {
3144
+ numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1);
3145
+ } else {
3146
+ numberStr = baseStr + zeroPadding + numberStr;
3147
+ }
3107
3148
  var from = Pos(cur.line, start);
3108
3149
  var to = Pos(cur.line, end);
3109
- numberStr = number.toString();
3110
3150
  cm.replaceRange(numberStr, from, to);
3111
3151
  } else {
3112
3152
  return;
@@ -3124,6 +3164,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
3124
3164
  }
3125
3165
  repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);
3126
3166
  },
3167
+ indent: function(cm, actionArgs) {
3168
+ cm.indentLine(cm.getCursor().line, actionArgs.indentRight);
3169
+ },
3127
3170
  exitInsertMode: exitInsertMode
3128
3171
  };
3129
3172
 
@@ -3188,7 +3231,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
3188
3231
  }
3189
3232
  }
3190
3233
  function lastChar(keys) {
3191
- var match = /^.*(<[\w\-]+>)$/.exec(keys);
3234
+ var match = /^.*(<[^>]+>)$/.exec(keys);
3192
3235
  var selectedCharacter = match ? match[1] : keys.slice(-1);
3193
3236
  if (selectedCharacter.length > 1){
3194
3237
  switch(selectedCharacter){
@@ -3199,6 +3242,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
3199
3242
  selectedCharacter=' ';
3200
3243
  break;
3201
3244
  default:
3245
+ selectedCharacter='';
3202
3246
  break;
3203
3247
  }
3204
3248
  }
@@ -3292,7 +3336,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
3292
3336
  var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)};
3293
3337
  selections.push(range);
3294
3338
  }
3295
- primIndex = head.line == lastLine ? selections.length - 1 : 0;
3296
3339
  cm.setSelections(selections);
3297
3340
  selectionEnd.ch = headCh;
3298
3341
  base.ch = baseCh;
@@ -3554,9 +3597,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
3554
3597
  }
3555
3598
 
3556
3599
  function recordLastCharacterSearch(increment, args) {
3557
- vimGlobalState.lastChararacterSearch.increment = increment;
3558
- vimGlobalState.lastChararacterSearch.forward = args.forward;
3559
- vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;
3600
+ vimGlobalState.lastCharacterSearch.increment = increment;
3601
+ vimGlobalState.lastCharacterSearch.forward = args.forward;
3602
+ vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter;
3560
3603
  }
3561
3604
 
3562
3605
  var symbolToMode = {
@@ -3730,7 +3773,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
3730
3773
  line = cm.getLine(lineNum);
3731
3774
  pos = (dir > 0) ? 0 : line.length;
3732
3775
  }
3733
- throw new Error('The impossible happened.');
3734
3776
  }
3735
3777
  function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) {
3736
3778
  var curStart = copyCursor(cur);
@@ -3878,11 +3920,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
3878
3920
  var bracketRegexp = ({
3879
3921
  '(': /[()]/, ')': /[()]/,
3880
3922
  '[': /[[\]]/, ']': /[[\]]/,
3881
- '{': /[{}]/, '}': /[{}]/})[symb];
3923
+ '{': /[{}]/, '}': /[{}]/,
3924
+ '<': /[<>]/, '>': /[<>]/})[symb];
3882
3925
  var openSym = ({
3883
3926
  '(': '(', ')': '(',
3884
3927
  '[': '[', ']': '[',
3885
- '{': '{', '}': '{'})[symb];
3928
+ '{': '{', '}': '{',
3929
+ '<': '<', '>': '<'})[symb];
3886
3930
  var curChar = cm.getLine(cur.line).charAt(cur.ch);
3887
3931
  var offset = curChar === openSym ? 1 : 0;
3888
3932
 
@@ -3988,14 +4032,28 @@ dom.importCssString(".normal-mode .ace_cursor{\
3988
4032
  if (cm.openDialog) {
3989
4033
  cm.openDialog(template, onClose, { bottom: true, value: options.value,
3990
4034
  onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp,
3991
- selectValueOnOpen: false});
4035
+ selectValueOnOpen: false, onClose: function() {
4036
+ if (cm.state.vim) {
4037
+ cm.state.vim.status = "";
4038
+ cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR);
4039
+ }
4040
+ }});
3992
4041
  }
3993
4042
  else {
3994
4043
  onClose(prompt(shortText, ''));
3995
4044
  }
3996
4045
  }
4046
+
3997
4047
  function splitBySlash(argString) {
3998
- var slashes = findUnescapedSlashes(argString) || [];
4048
+ return splitBySeparator(argString, '/');
4049
+ }
4050
+
4051
+ function findUnescapedSlashes(argString) {
4052
+ return findUnescapedSeparators(argString, '/');
4053
+ }
4054
+
4055
+ function splitBySeparator(argString, separator) {
4056
+ var slashes = findUnescapedSeparators(argString, separator) || [];
3999
4057
  if (!slashes.length) return [];
4000
4058
  var tokens = [];
4001
4059
  if (slashes[0] !== 0) return;
@@ -4006,12 +4064,15 @@ dom.importCssString(".normal-mode .ace_cursor{\
4006
4064
  return tokens;
4007
4065
  }
4008
4066
 
4009
- function findUnescapedSlashes(str) {
4067
+ function findUnescapedSeparators(str, separator) {
4068
+ if (!separator)
4069
+ separator = '/';
4070
+
4010
4071
  var escapeNextChar = false;
4011
4072
  var slashes = [];
4012
4073
  for (var i = 0; i < str.length; i++) {
4013
4074
  var c = str.charAt(i);
4014
- if (!escapeNextChar && c == '/') {
4075
+ if (!escapeNextChar && c == separator) {
4015
4076
  slashes.push(i);
4016
4077
  }
4017
4078
  escapeNextChar = !escapeNextChar && (c == '\\');
@@ -4143,17 +4204,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
4143
4204
  }
4144
4205
  }
4145
4206
  function makePrompt(prefix, desc) {
4146
- var raw = '';
4147
- if (prefix) {
4148
- raw += '<span style="font-family: monospace">' + prefix + '</span>';
4149
- }
4150
- raw += '<input type="text"/> ' +
4151
- '<span style="color: #888">';
4152
- if (desc) {
4153
- raw += '<span style="color: #888">';
4154
- raw += desc;
4155
- raw += '</span>';
4156
- }
4207
+ var raw = '<span style="font-family: monospace; white-space: pre">' +
4208
+ (prefix || "") + '<input type="text" autocorrect="off" autocapitalize="none" autocomplete="off"></span>';
4209
+ if (desc)
4210
+ raw += ' <span style="color: #888">' + desc + '</span>';
4157
4211
  return raw;
4158
4212
  }
4159
4213
  var searchPromptDesc = '(Javascript regexp)';
@@ -4293,6 +4347,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
4293
4347
  }
4294
4348
  }
4295
4349
 
4350
+ function getMarkPos(cm, vim, markName) {
4351
+
4352
+ var mark = vim.marks[markName];
4353
+ return mark && mark.find();
4354
+ }
4355
+
4296
4356
  var ExCommandDispatcher = function() {
4297
4357
  this.buildCommandMap_();
4298
4358
  };
@@ -4387,20 +4447,35 @@ dom.importCssString(".normal-mode .ace_cursor{\
4387
4447
  }
4388
4448
  switch (inputStream.next()) {
4389
4449
  case '.':
4390
- return cm.getCursor().line;
4450
+ return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);
4391
4451
  case '$':
4392
- return cm.lastLine();
4452
+ return this.parseLineSpecOffset_(inputStream, cm.lastLine());
4393
4453
  case '\'':
4394
- var mark = cm.state.vim.marks[inputStream.next()];
4395
- if (mark && mark.find()) {
4396
- return mark.find().line;
4397
- }
4398
- throw new Error('Mark not set');
4454
+ var markName = inputStream.next();
4455
+ var markPos = getMarkPos(cm, cm.state.vim, markName);
4456
+ if (!markPos) throw new Error('Mark not set');
4457
+ return this.parseLineSpecOffset_(inputStream, markPos.line);
4458
+ case '-':
4459
+ case '+':
4460
+ inputStream.backUp(1);
4461
+ return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);
4399
4462
  default:
4400
4463
  inputStream.backUp(1);
4401
4464
  return undefined;
4402
4465
  }
4403
4466
  },
4467
+ parseLineSpecOffset_: function(inputStream, line) {
4468
+ var offsetMatch = inputStream.match(/^([+-])?(\d+)/);
4469
+ if (offsetMatch) {
4470
+ var offset = parseInt(offsetMatch[2], 10);
4471
+ if (offsetMatch[1] == "-") {
4472
+ line -= offset;
4473
+ } else {
4474
+ line += offset;
4475
+ }
4476
+ }
4477
+ return line;
4478
+ },
4404
4479
  parseCommandArgs_: function(inputStream, params, command) {
4405
4480
  if (inputStream.eol()) {
4406
4481
  return;
@@ -4456,16 +4531,15 @@ dom.importCssString(".normal-mode .ace_cursor{\
4456
4531
  var mapping = {
4457
4532
  keys: lhs,
4458
4533
  type: 'keyToEx',
4459
- exArgs: { input: rhs.substring(1) },
4460
- user: true};
4534
+ exArgs: { input: rhs.substring(1) }
4535
+ };
4461
4536
  if (ctx) { mapping.context = ctx; }
4462
4537
  defaultKeymap.unshift(mapping);
4463
4538
  } else {
4464
4539
  var mapping = {
4465
4540
  keys: lhs,
4466
4541
  type: 'keyToKey',
4467
- toKeys: rhs,
4468
- user: true
4542
+ toKeys: rhs
4469
4543
  };
4470
4544
  if (ctx) { mapping.context = ctx; }
4471
4545
  defaultKeymap.unshift(mapping);
@@ -4484,8 +4558,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
4484
4558
  var keys = lhs;
4485
4559
  for (var i = 0; i < defaultKeymap.length; i++) {
4486
4560
  if (keys == defaultKeymap[i].keys
4487
- && defaultKeymap[i].context === ctx
4488
- && defaultKeymap[i].user) {
4561
+ && defaultKeymap[i].context === ctx) {
4489
4562
  defaultKeymap.splice(i, 1);
4490
4563
  return;
4491
4564
  }
@@ -4563,13 +4636,18 @@ dom.importCssString(".normal-mode .ace_cursor{\
4563
4636
  }
4564
4637
  if (!optionIsBoolean && value === undefined || forceGet) {
4565
4638
  var oldValue = getOption(optionName, cm, setCfg);
4566
- if (oldValue === true || oldValue === false) {
4639
+ if (oldValue instanceof Error) {
4640
+ showConfirm(cm, oldValue.message);
4641
+ } else if (oldValue === true || oldValue === false) {
4567
4642
  showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);
4568
4643
  } else {
4569
4644
  showConfirm(cm, ' ' + optionName + '=' + oldValue);
4570
4645
  }
4571
4646
  } else {
4572
- setOption(optionName, value, cm, setCfg);
4647
+ var setOptionReturn = setOption(optionName, value, cm, setCfg);
4648
+ if (setOptionReturn instanceof Error) {
4649
+ showConfirm(cm, setOptionReturn.message);
4650
+ }
4573
4651
  }
4574
4652
  },
4575
4653
  setlocal: function (cm, params) {
@@ -4606,25 +4684,27 @@ dom.importCssString(".normal-mode .ace_cursor{\
4606
4684
  showConfirm(cm, regInfo);
4607
4685
  },
4608
4686
  sort: function(cm, params) {
4609
- var reverse, ignoreCase, unique, number;
4687
+ var reverse, ignoreCase, unique, number, pattern;
4610
4688
  function parseArgs() {
4611
4689
  if (params.argString) {
4612
4690
  var args = new CodeMirror.StringStream(params.argString);
4613
4691
  if (args.eat('!')) { reverse = true; }
4614
4692
  if (args.eol()) { return; }
4615
4693
  if (!args.eatSpace()) { return 'Invalid arguments'; }
4616
- var opts = args.match(/[a-z]+/);
4617
- if (opts) {
4618
- opts = opts[0];
4619
- ignoreCase = opts.indexOf('i') != -1;
4620
- unique = opts.indexOf('u') != -1;
4621
- var decimal = opts.indexOf('d') != -1 && 1;
4622
- var hex = opts.indexOf('x') != -1 && 1;
4623
- var octal = opts.indexOf('o') != -1 && 1;
4694
+ var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/);
4695
+ if (!opts && !args.eol()) { return 'Invalid arguments'; }
4696
+ if (opts[1]) {
4697
+ ignoreCase = opts[1].indexOf('i') != -1;
4698
+ unique = opts[1].indexOf('u') != -1;
4699
+ var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1;
4700
+ var hex = opts[1].indexOf('x') != -1 && 1;
4701
+ var octal = opts[1].indexOf('o') != -1 && 1;
4624
4702
  if (decimal + hex + octal > 1) { return 'Invalid arguments'; }
4625
4703
  number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';
4626
4704
  }
4627
- if (args.match(/\/.*\//)) { return 'patterns not supported'; }
4705
+ if (opts[2]) {
4706
+ pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : '');
4707
+ }
4628
4708
  }
4629
4709
  }
4630
4710
  var err = parseArgs();
@@ -4638,14 +4718,18 @@ dom.importCssString(".normal-mode .ace_cursor{\
4638
4718
  var curStart = Pos(lineStart, 0);
4639
4719
  var curEnd = Pos(lineEnd, lineLength(cm, lineEnd));
4640
4720
  var text = cm.getRange(curStart, curEnd).split('\n');
4641
- var numberRegex = (number == 'decimal') ? /(-?)([\d]+)/ :
4721
+ var numberRegex = pattern ? pattern :
4722
+ (number == 'decimal') ? /(-?)([\d]+)/ :
4642
4723
  (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :
4643
4724
  (number == 'octal') ? /([0-7]+)/ : null;
4644
4725
  var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;
4645
4726
  var numPart = [], textPart = [];
4646
- if (number) {
4727
+ if (number || pattern) {
4647
4728
  for (var i = 0; i < text.length; i++) {
4648
- if (numberRegex.exec(text[i])) {
4729
+ var matchPart = pattern ? text[i].match(pattern) : null;
4730
+ if (matchPart && matchPart[0] != '') {
4731
+ numPart.push(matchPart);
4732
+ } else if (!pattern && numberRegex.exec(text[i])) {
4649
4733
  numPart.push(text[i]);
4650
4734
  } else {
4651
4735
  textPart.push(text[i]);
@@ -4664,8 +4748,17 @@ dom.importCssString(".normal-mode .ace_cursor{\
4664
4748
  bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);
4665
4749
  return anum - bnum;
4666
4750
  }
4667
- numPart.sort(compareFn);
4668
- textPart.sort(compareFn);
4751
+ function comparePatternFn(a, b) {
4752
+ if (reverse) { var tmp; tmp = a; a = b; b = tmp; }
4753
+ if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); }
4754
+ return (a[0] < b[0]) ? -1 : 1;
4755
+ }
4756
+ numPart.sort(pattern ? comparePatternFn : compareFn);
4757
+ if (pattern) {
4758
+ for (var i = 0; i < numPart.length; i++) {
4759
+ numPart[i] = numPart[i].input;
4760
+ }
4761
+ } else if (!number) { textPart.sort(compareFn); }
4669
4762
  text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);
4670
4763
  if (unique) { // Remove duplicate lines
4671
4764
  var textOld = text;
@@ -4734,13 +4827,17 @@ dom.importCssString(".normal-mode .ace_cursor{\
4734
4827
  'any other getSearchCursor implementation.');
4735
4828
  }
4736
4829
  var argString = params.argString;
4737
- var tokens = argString ? splitBySlash(argString) : [];
4830
+ var tokens = argString ? splitBySeparator(argString, argString[0]) : [];
4738
4831
  var regexPart, replacePart = '', trailing, flagsPart, count;
4739
4832
  var confirm = false; // Whether to confirm each replace.
4740
4833
  var global = false; // True to replace all instances on a line, false to replace only 1.
4741
4834
  if (tokens.length) {
4742
4835
  regexPart = tokens[0];
4743
4836
  replacePart = tokens[1];
4837
+ if (regexPart && regexPart[regexPart.length - 1] === '$') {
4838
+ regexPart = regexPart.slice(0, regexPart.length - 1) + '\\n';
4839
+ replacePart = replacePart ? replacePart + '\n' : '\n';
4840
+ }
4744
4841
  if (replacePart !== undefined) {
4745
4842
  if (getOption('pcre')) {
4746
4843
  replacePart = unescapeRegexReplace(replacePart);
@@ -4769,7 +4866,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
4769
4866
  global = true;
4770
4867
  flagsPart.replace('g', '');
4771
4868
  }
4772
- regexPart = regexPart + '/' + flagsPart;
4869
+ regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart;
4773
4870
  }
4774
4871
  }
4775
4872
  if (regexPart) {
@@ -4806,13 +4903,20 @@ dom.importCssString(".normal-mode .ace_cursor{\
4806
4903
  write: function(cm) {
4807
4904
  if (CodeMirror.commands.save) {
4808
4905
  CodeMirror.commands.save(cm);
4809
- } else {
4906
+ } else if (cm.save) {
4810
4907
  cm.save();
4811
4908
  }
4812
4909
  },
4813
4910
  nohlsearch: function(cm) {
4814
4911
  clearSearchHighlight(cm);
4815
4912
  },
4913
+ yank: function (cm) {
4914
+ var cur = copyCursor(cm.getCursor());
4915
+ var line = cur.line;
4916
+ var lineText = cm.getLine(line);
4917
+ vimGlobalState.registerController.pushText(
4918
+ '0', 'yank', lineText, true, true);
4919
+ },
4816
4920
  delmarks: function(cm, params) {
4817
4921
  if (!params.argString || !trim(params.argString)) {
4818
4922
  showConfirm(cm, 'Argument required');
@@ -4961,21 +5065,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
4961
5065
  var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');
4962
5066
  var isPlaying = macroModeState.isPlaying;
4963
5067
  var lastChange = macroModeState.lastInsertModeChanges;
4964
- var text = [];
4965
5068
  if (!isPlaying) {
4966
- var selLength = lastChange.inVisualBlock ? vim.lastSelection.visualBlock.height : 1;
4967
- var changes = lastChange.changes;
4968
- var text = [];
4969
- var i = 0;
4970
- while (i < changes.length) {
4971
- text.push(changes[i]);
4972
- if (changes[i] instanceof InsertModeKey) {
4973
- i++;
4974
- } else {
4975
- i+= selLength;
4976
- }
4977
- }
4978
- lastChange.changes = text;
4979
5069
  cm.off('change', onChange);
4980
5070
  CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);
4981
5071
  }
@@ -4989,8 +5079,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
4989
5079
  cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);
4990
5080
  cm.setOption('keyMap', 'vim');
4991
5081
  cm.setOption('disableInput', true);
4992
-
4993
- lastChange.overwrite = cm.state.overwrite;
4994
5082
  cm.toggleOverwrite(false); // exit replace mode if we were in it.
4995
5083
  insertModeChangeRegister.setText(lastChange.changes.join(''));
4996
5084
  CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
@@ -5094,20 +5182,29 @@ dom.importCssString(".normal-mode .ace_cursor{\
5094
5182
  register.pushSearchQuery(query);
5095
5183
  }
5096
5184
  }
5097
- function onChange(_cm, changeObj) {
5185
+ function onChange(cm, changeObj) {
5098
5186
  var macroModeState = vimGlobalState.macroModeState;
5099
5187
  var lastChange = macroModeState.lastInsertModeChanges;
5100
5188
  if (!macroModeState.isPlaying) {
5101
5189
  while(changeObj) {
5102
5190
  lastChange.expectCursorActivityForChange = true;
5103
- if (changeObj.origin == '+input' || changeObj.origin == 'paste'
5191
+ if (lastChange.ignoreCount > 1) {
5192
+ lastChange.ignoreCount--;
5193
+ } else if (changeObj.origin == '+input' || changeObj.origin == 'paste'
5104
5194
  || changeObj.origin === undefined /* only in testing */) {
5195
+ var selectionCount = cm.listSelections().length;
5196
+ if (selectionCount > 1)
5197
+ lastChange.ignoreCount = selectionCount;
5105
5198
  var text = changeObj.text.join('\n');
5106
5199
  if (lastChange.maybeReset) {
5107
5200
  lastChange.changes = [];
5108
5201
  lastChange.maybeReset = false;
5109
5202
  }
5110
- lastChange.changes.push(text);
5203
+ if (cm.state.overwrite && !/\n/.test(text)) {
5204
+ lastChange.changes.push([text]);
5205
+ } else {
5206
+ lastChange.changes.push(text);
5207
+ }
5111
5208
  }
5112
5209
  changeObj = changeObj.next;
5113
5210
  }
@@ -5201,7 +5298,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5201
5298
  if (macroModeState.lastInsertModeChanges.changes.length > 0) {
5202
5299
  repeat = !vim.lastEditActionCommand ? 1 : repeat;
5203
5300
  var changeObject = macroModeState.lastInsertModeChanges;
5204
- repeatInsertModeChanges(cm, changeObject.changes, repeat, changeObject.overwrite);
5301
+ repeatInsertModeChanges(cm, changeObject.changes, repeat);
5205
5302
  }
5206
5303
  }
5207
5304
  vim.inputState = vim.lastEditInputState;
@@ -5223,7 +5320,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5223
5320
  macroModeState.isPlaying = false;
5224
5321
  }
5225
5322
 
5226
- function repeatInsertModeChanges(cm, changes, repeat, overwrite) {
5323
+ function repeatInsertModeChanges(cm, changes, repeat) {
5227
5324
  function keyHandler(binding) {
5228
5325
  if (typeof binding == 'string') {
5229
5326
  CodeMirror.commands[binding](cm);
@@ -5250,13 +5347,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
5250
5347
  var change = changes[j];
5251
5348
  if (change instanceof InsertModeKey) {
5252
5349
  CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler);
5253
- } else {
5350
+ } else if (typeof change == "string") {
5254
5351
  var cur = cm.getCursor();
5255
- var end = cur;
5256
- if (overwrite && !/\n/.test(change)) {
5257
- end = offsetCursor(cur, 0, change.length);
5258
- }
5259
- cm.replaceRange(change, cur, end);
5352
+ cm.replaceRange(change, cur, cur);
5353
+ } else {
5354
+ var start = cm.getCursor();
5355
+ var end = offsetCursor(start, 0, change[0].length);
5356
+ cm.replaceRange(change[0], start, end);
5260
5357
  }
5261
5358
  }
5262
5359
  }
@@ -5282,7 +5379,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5282
5379
  var name = '';
5283
5380
  if (e.ctrlKey) { name += 'C-'; }
5284
5381
  if (e.altKey) { name += 'A-'; }
5285
- if (e.shiftKey) { name += 'S-'; }
5382
+ if ((name || key.length > 1) && e.shiftKey) { name += 'S-'; }
5286
5383
 
5287
5384
  name += key;
5288
5385
  if (name.length > 1) { name = '<' + name + '>'; }
@@ -5351,13 +5448,15 @@ dom.importCssString(".normal-mode .ace_cursor{\
5351
5448
  cm.curOp.cursorActivity = false;
5352
5449
  }, true);
5353
5450
  }
5451
+ if (isHandled && !vim.visualMode && !vim.insert)
5452
+ handleExternalSelection(cm, vim);
5354
5453
  return isHandled;
5355
5454
  }
5356
5455
  exports.CodeMirror = CodeMirror;
5357
5456
  var getVim = Vim.maybeInitVimState_;
5358
5457
  exports.handler = {
5359
5458
  $id: "ace/keyboard/vim",
5360
- drawCursor: function(style, pixelPos, config, sel, session) {
5459
+ drawCursor: function(element, pixelPos, config, sel, session) {
5361
5460
  var vim = this.state.vim || {};
5362
5461
  var w = config.characterWidth;
5363
5462
  var h = config.lineHeight;
@@ -5374,17 +5473,41 @@ dom.importCssString(".normal-mode .ace_cursor{\
5374
5473
  h = h / 2;
5375
5474
  top += h;
5376
5475
  }
5377
- style.left = left + "px";
5378
- style.top = top + "px";
5379
- style.width = w + "px";
5380
- style.height = h + "px";
5476
+ dom.translate(element, left, top);
5477
+ dom.setStyle(element.style, "width", w + "px");
5478
+ dom.setStyle(element.style, "height", h + "px");
5381
5479
  },
5382
5480
  handleKeyboard: function(data, hashId, key, keyCode, e) {
5383
5481
  var editor = data.editor;
5384
5482
  var cm = editor.state.cm;
5385
5483
  var vim = getVim(cm);
5386
5484
  if (keyCode == -1) return;
5387
-
5485
+ if (!vim.insertMode) {
5486
+ if (hashId == -1) {
5487
+ if (key.charCodeAt(0) > 0xFF) {
5488
+ if (data.inputKey) {
5489
+ key = data.inputKey;
5490
+ if (key && data.inputHash == 4)
5491
+ key = key.toUpperCase();
5492
+ }
5493
+ }
5494
+ data.inputChar = key;
5495
+ }
5496
+ else if (hashId == 4 || hashId == 0) {
5497
+ if (data.inputKey == key && data.inputHash == hashId && data.inputChar) {
5498
+ key = data.inputChar;
5499
+ hashId = -1
5500
+ }
5501
+ else {
5502
+ data.inputChar = null;
5503
+ data.inputKey = key;
5504
+ data.inputHash = hashId;
5505
+ }
5506
+ }
5507
+ else {
5508
+ data.inputChar = data.inputKey = null;
5509
+ }
5510
+ }
5388
5511
  if (key == "c" && hashId == 1) { // key == "ctrl-c"
5389
5512
  if (!useragent.isMac && editor.getCopyText()) {
5390
5513
  editor.once("copy", function() {
@@ -5392,11 +5515,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
5392
5515
  });
5393
5516
  return {command: "null", passEvent: true};
5394
5517
  }
5395
- } else if (!vim.insertMode) {
5396
- if (useragent.isMac && this.handleMacRepeat(data, hashId, key)) {
5397
- hashId = -1;
5398
- key = data.inputChar;
5399
- }
5518
+ }
5519
+
5520
+ if (key == "esc" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) {
5521
+ var searchState = getSearchState(cm);
5522
+ var overlay = searchState.getOverlay();
5523
+ if (overlay) cm.removeOverlay(overlay);
5400
5524
  }
5401
5525
 
5402
5526
  if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) {
@@ -5435,12 +5559,18 @@ dom.importCssString(".normal-mode .ace_cursor{\
5435
5559
  });
5436
5560
  cm.on("vim-mode-change", function() {
5437
5561
  if (cm.virtualSelectionMode()) return;
5438
- cm.ace.renderer.setStyle("normal-mode", !getVim(cm).insertMode);
5562
+ updateInputMode();
5439
5563
  cm._signal("changeStatus");
5440
5564
  });
5441
- cm.ace.renderer.setStyle("normal-mode", !getVim(cm).insertMode);
5565
+ function updateInputMode() {
5566
+ var isIntsert = getVim(cm).insertMode;
5567
+ cm.ace.renderer.setStyle("normal-mode", !isIntsert);
5568
+ editor.textInput.setCommandMode(!isIntsert);
5569
+ editor.renderer.$keepTextAreaAtCursor = isIntsert;
5570
+ editor.renderer.$blockCursor = !isIntsert;
5571
+ }
5572
+ updateInputMode();
5442
5573
  editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm);
5443
- this.updateMacCompositionHandlers(editor, true);
5444
5574
  },
5445
5575
  detach: function(editor) {
5446
5576
  var cm = editor.state.cm;
@@ -5450,7 +5580,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
5450
5580
  editor.$vimModeHandler = null;
5451
5581
  editor.renderer.$cursorLayer.drawCursor = null;
5452
5582
  editor.renderer.setStyle("normal-mode", false);
5453
- this.updateMacCompositionHandlers(editor, false);
5583
+ editor.textInput.setCommandMode(false);
5584
+ editor.renderer.$keepTextAreaAtCursor = true;
5454
5585
  },
5455
5586
  getStatusText: function(editor) {
5456
5587
  var cm = editor.state.cm;
@@ -5468,77 +5599,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
5468
5599
  if (vim.status)
5469
5600
  status += (status ? " " : "") + vim.status;
5470
5601
  return status;
5471
- },
5472
- handleMacRepeat: function(data, hashId, key) {
5473
- if (hashId == -1) {
5474
- data.inputChar = key;
5475
- data.lastEvent = "input";
5476
- } else if (data.inputChar && data.$lastHash == hashId && data.$lastKey == key) {
5477
- if (data.lastEvent == "input") {
5478
- data.lastEvent = "input1";
5479
- } else if (data.lastEvent == "input1") {
5480
- return true;
5481
- }
5482
- } else {
5483
- data.$lastHash = hashId;
5484
- data.$lastKey = key;
5485
- data.lastEvent = "keypress";
5486
- }
5487
- },
5488
- updateMacCompositionHandlers: function(editor, enable) {
5489
- var onCompositionUpdateOverride = function(text) {
5490
- var cm = editor.state.cm;
5491
- var vim = getVim(cm);
5492
- if (!vim.insertMode) {
5493
- var el = this.textInput.getElement();
5494
- el.blur();
5495
- el.focus();
5496
- el.value = text;
5497
- } else {
5498
- this.onCompositionUpdateOrig(text);
5499
- }
5500
- };
5501
- var onCompositionStartOverride = function(text) {
5502
- var cm = editor.state.cm;
5503
- var vim = getVim(cm);
5504
- if (!vim.insertMode) {
5505
- this.onCompositionStartOrig(text);
5506
- }
5507
- };
5508
- if (enable) {
5509
- if (!editor.onCompositionUpdateOrig) {
5510
- editor.onCompositionUpdateOrig = editor.onCompositionUpdate;
5511
- editor.onCompositionUpdate = onCompositionUpdateOverride;
5512
- editor.onCompositionStartOrig = editor.onCompositionStart;
5513
- editor.onCompositionStart = onCompositionStartOverride;
5514
- }
5515
- } else {
5516
- if (editor.onCompositionUpdateOrig) {
5517
- editor.onCompositionUpdate = editor.onCompositionUpdateOrig;
5518
- editor.onCompositionUpdateOrig = null;
5519
- editor.onCompositionStart = editor.onCompositionStartOrig;
5520
- editor.onCompositionStartOrig = null;
5521
- }
5522
- }
5523
- }
5524
- };
5525
- var renderVirtualNumbers = {
5526
- getText: function(session, row) {
5527
- return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9? "\xb7" : "" ))) + "";
5528
- },
5529
- getWidth: function(session, lastLineNumber, config) {
5530
- return session.getLength().toString().length * config.characterWidth;
5531
- },
5532
- update: function(e, editor) {
5533
- editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER);
5534
- },
5535
- attach: function(editor) {
5536
- editor.renderer.$gutterLayer.$renderer = this;
5537
- editor.on("changeSelection", this.update);
5538
- },
5539
- detach: function(editor) {
5540
- editor.renderer.$gutterLayer.$renderer = null;
5541
- editor.off("changeSelection", this.update);
5542
5602
  }
5543
5603
  };
5544
5604
  Vim.defineOption({
@@ -5595,4 +5655,11 @@ dom.importCssString(".normal-mode .ace_cursor{\
5595
5655
  exports.Vim = Vim;
5596
5656
 
5597
5657
  Vim.map("Y", "yy", "normal");
5598
- });
5658
+ }); (function() {
5659
+ window.require(["ace/keyboard/vim"], function(m) {
5660
+ if (typeof module == "object" && typeof exports == "object" && module) {
5661
+ module.exports = m;
5662
+ }
5663
+ });
5664
+ })();
5665
+