ace-rails-ap 4.1.3 → 4.4

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 (437) hide show
  1. checksums.yaml +5 -5
  2. data/.gitmodules +1 -1
  3. data/Gemfile +2 -3
  4. data/ace-rails-ap.gemspec +0 -2
  5. data/lib/ace/rails/version.rb +1 -1
  6. data/update.sh +1 -1
  7. data/vendor/assets/javascripts/ace/ace.js +5192 -3414
  8. data/vendor/assets/javascripts/ace/ext-beautify.js +281 -288
  9. data/vendor/assets/javascripts/ace/ext-code_lens.js +238 -0
  10. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +6 -3
  11. data/vendor/assets/javascripts/ace/ext-emmet.js +353 -246
  12. data/vendor/assets/javascripts/ace/ext-error_marker.js +6 -3
  13. data/vendor/assets/javascripts/ace/ext-keybinding_menu.js +61 -38
  14. data/vendor/assets/javascripts/ace/ext-language_tools.js +532 -343
  15. data/vendor/assets/javascripts/ace/ext-linking.js +8 -5
  16. data/vendor/assets/javascripts/ace/ext-modelist.js +46 -12
  17. data/vendor/assets/javascripts/ace/ext-options.js +793 -0
  18. data/vendor/assets/javascripts/ace/ext-prompt.js +2783 -0
  19. data/vendor/assets/javascripts/ace/ext-rtl.js +122 -0
  20. data/vendor/assets/javascripts/ace/ext-searchbox.js +45 -40
  21. data/vendor/assets/javascripts/ace/ext-settings_menu.js +520 -369
  22. data/vendor/assets/javascripts/ace/ext-spellcheck.js +6 -4
  23. data/vendor/assets/javascripts/ace/ext-split.js +7 -46
  24. data/vendor/assets/javascripts/ace/ext-static_highlight.js +90 -22
  25. data/vendor/assets/javascripts/ace/ext-statusbar.js +9 -6
  26. data/vendor/assets/javascripts/ace/ext-textarea.js +21 -18
  27. data/vendor/assets/javascripts/ace/ext-themelist.js +10 -6
  28. data/vendor/assets/javascripts/ace/ext-whitespace.js +13 -6
  29. data/vendor/assets/javascripts/ace/keybinding-emacs.js +49 -61
  30. data/vendor/assets/javascripts/ace/keybinding-sublime.js +422 -0
  31. data/vendor/assets/javascripts/ace/keybinding-vim.js +620 -287
  32. data/vendor/assets/javascripts/ace/keybinding-vscode.js +262 -0
  33. data/vendor/assets/javascripts/ace/mode-abap.js +10 -3
  34. data/vendor/assets/javascripts/ace/mode-abc.js +14 -4
  35. data/vendor/assets/javascripts/ace/mode-actionscript.js +13 -5
  36. data/vendor/assets/javascripts/ace/mode-ada.js +54 -4
  37. data/vendor/assets/javascripts/ace/mode-alda.js +311 -0
  38. data/vendor/assets/javascripts/ace/mode-apache_conf.js +12 -5
  39. data/vendor/assets/javascripts/ace/mode-apex.js +457 -0
  40. data/vendor/assets/javascripts/ace/mode-applescript.js +11 -4
  41. data/vendor/assets/javascripts/ace/mode-aql.js +102 -0
  42. data/vendor/assets/javascripts/ace/mode-asciidoc.js +9 -2
  43. data/vendor/assets/javascripts/ace/mode-asl.js +422 -0
  44. data/vendor/assets/javascripts/ace/mode-assembly_x86.js +11 -4
  45. data/vendor/assets/javascripts/ace/mode-autohotkey.js +17 -8
  46. data/vendor/assets/javascripts/ace/mode-batchfile.js +12 -5
  47. data/vendor/assets/javascripts/ace/mode-c9search.js +9 -3
  48. data/vendor/assets/javascripts/ace/mode-c_cpp.js +23 -7
  49. data/vendor/assets/javascripts/ace/mode-cirru.js +11 -4
  50. data/vendor/assets/javascripts/ace/mode-clojure.js +9 -1
  51. data/vendor/assets/javascripts/ace/mode-cobol.js +8 -1
  52. data/vendor/assets/javascripts/ace/mode-coffee.js +12 -4
  53. data/vendor/assets/javascripts/ace/mode-coldfusion.js +163 -134
  54. data/vendor/assets/javascripts/ace/mode-crystal.js +642 -0
  55. data/vendor/assets/javascripts/ace/mode-csharp.js +13 -6
  56. data/vendor/assets/javascripts/ace/mode-csound_document.js +4036 -0
  57. data/vendor/assets/javascripts/ace/mode-csound_orchestra.js +2966 -0
  58. data/vendor/assets/javascripts/ace/mode-csound_score.js +462 -0
  59. data/vendor/assets/javascripts/ace/mode-csp.js +59 -0
  60. data/vendor/assets/javascripts/ace/mode-css.js +48 -27
  61. data/vendor/assets/javascripts/ace/mode-curly.js +162 -133
  62. data/vendor/assets/javascripts/ace/mode-d.js +12 -5
  63. data/vendor/assets/javascripts/ace/mode-dart.js +46 -20
  64. data/vendor/assets/javascripts/ace/mode-diff.js +11 -3
  65. data/vendor/assets/javascripts/ace/mode-django.js +164 -134
  66. data/vendor/assets/javascripts/ace/mode-dockerfile.js +12 -4
  67. data/vendor/assets/javascripts/ace/mode-dot.js +11 -4
  68. data/vendor/assets/javascripts/ace/mode-drools.js +46 -5
  69. data/vendor/assets/javascripts/ace/mode-edifact.js +166 -0
  70. data/vendor/assets/javascripts/ace/mode-eiffel.js +8 -1
  71. data/vendor/assets/javascripts/ace/mode-ejs.js +832 -298
  72. data/vendor/assets/javascripts/ace/mode-elixir.js +11 -4
  73. data/vendor/assets/javascripts/ace/mode-elm.js +10 -3
  74. data/vendor/assets/javascripts/ace/mode-erlang.js +13 -5
  75. data/vendor/assets/javascripts/ace/mode-forth.js +12 -5
  76. data/vendor/assets/javascripts/ace/mode-fortran.js +10 -3
  77. data/vendor/assets/javascripts/ace/mode-fsharp.js +316 -0
  78. data/vendor/assets/javascripts/ace/{mode-mipsassembler.js → mode-fsl.js} +91 -28
  79. data/vendor/assets/javascripts/ace/mode-ftl.js +23 -12
  80. data/vendor/assets/javascripts/ace/mode-gcode.js +8 -1
  81. data/vendor/assets/javascripts/ace/mode-gherkin.js +9 -4
  82. data/vendor/assets/javascripts/ace/mode-gitignore.js +8 -1
  83. data/vendor/assets/javascripts/ace/mode-glsl.js +24 -8
  84. data/vendor/assets/javascripts/ace/mode-gobstones.js +267 -99
  85. data/vendor/assets/javascripts/ace/mode-golang.js +11 -4
  86. data/vendor/assets/javascripts/ace/mode-graphqlschema.js +11 -3
  87. data/vendor/assets/javascripts/ace/mode-groovy.js +14 -5
  88. data/vendor/assets/javascripts/ace/mode-haml.js +442 -116
  89. data/vendor/assets/javascripts/ace/mode-handlebars.js +162 -133
  90. data/vendor/assets/javascripts/ace/mode-haskell.js +14 -6
  91. data/vendor/assets/javascripts/ace/mode-haskell_cabal.js +8 -1
  92. data/vendor/assets/javascripts/ace/mode-haxe.js +11 -4
  93. data/vendor/assets/javascripts/ace/mode-hjson.js +13 -6
  94. data/vendor/assets/javascripts/ace/mode-html.js +162 -133
  95. data/vendor/assets/javascripts/ace/mode-html_elixir.js +165 -136
  96. data/vendor/assets/javascripts/ace/mode-html_ruby.js +832 -298
  97. data/vendor/assets/javascripts/ace/mode-ini.js +8 -1
  98. data/vendor/assets/javascripts/ace/mode-io.js +14 -12
  99. data/vendor/assets/javascripts/ace/mode-jack.js +10 -3
  100. data/vendor/assets/javascripts/ace/mode-jade.js +272 -376
  101. data/vendor/assets/javascripts/ace/mode-java.js +110 -7
  102. data/vendor/assets/javascripts/ace/mode-javascript.js +14 -5
  103. data/vendor/assets/javascripts/ace/mode-json.js +13 -3
  104. data/vendor/assets/javascripts/ace/mode-json5.js +360 -0
  105. data/vendor/assets/javascripts/ace/mode-jsoniq.js +25 -12
  106. data/vendor/assets/javascripts/ace/mode-jsp.js +60 -15
  107. data/vendor/assets/javascripts/ace/mode-jssm.js +325 -0
  108. data/vendor/assets/javascripts/ace/mode-jsx.js +11 -4
  109. data/vendor/assets/javascripts/ace/mode-julia.js +12 -5
  110. data/vendor/assets/javascripts/ace/mode-kotlin.js +18 -7
  111. data/vendor/assets/javascripts/ace/mode-latex.js +87 -15
  112. data/vendor/assets/javascripts/ace/mode-less.js +47 -27
  113. data/vendor/assets/javascripts/ace/mode-liquid.js +2030 -472
  114. data/vendor/assets/javascripts/ace/mode-lisp.js +9 -2
  115. data/vendor/assets/javascripts/ace/mode-livescript.js +10 -2
  116. data/vendor/assets/javascripts/ace/mode-logiql.js +10 -3
  117. data/vendor/assets/javascripts/ace/mode-logtalk.js +352 -0
  118. data/vendor/assets/javascripts/ace/mode-lsl.js +11 -3
  119. data/vendor/assets/javascripts/ace/mode-lua.js +40 -12
  120. data/vendor/assets/javascripts/ace/mode-luapage.js +194 -144
  121. data/vendor/assets/javascripts/ace/mode-lucene.js +106 -22
  122. data/vendor/assets/javascripts/ace/mode-makefile.js +11 -3
  123. data/vendor/assets/javascripts/ace/mode-markdown.js +530 -201
  124. data/vendor/assets/javascripts/ace/mode-mask.js +101 -84
  125. data/vendor/assets/javascripts/ace/mode-matlab.js +8 -1
  126. data/vendor/assets/javascripts/ace/mode-maze.js +11 -3
  127. data/vendor/assets/javascripts/ace/mode-mediawiki.js +592 -0
  128. data/vendor/assets/javascripts/ace/mode-mel.js +11 -4
  129. data/vendor/assets/javascripts/ace/mode-mixal.js +122 -0
  130. data/vendor/assets/javascripts/ace/mode-mushcode.js +9 -2
  131. data/vendor/assets/javascripts/ace/mode-mysql.js +11 -4
  132. data/vendor/assets/javascripts/ace/mode-nginx.js +298 -0
  133. data/vendor/assets/javascripts/ace/mode-nim.js +363 -0
  134. data/vendor/assets/javascripts/ace/mode-nix.js +23 -7
  135. data/vendor/assets/javascripts/ace/mode-nsis.js +15 -8
  136. data/vendor/assets/javascripts/ace/mode-nunjucks.js +2698 -0
  137. data/vendor/assets/javascripts/ace/mode-objectivec.js +23 -8
  138. data/vendor/assets/javascripts/ace/mode-ocaml.js +8 -1
  139. data/vendor/assets/javascripts/ace/mode-pascal.js +92 -67
  140. data/vendor/assets/javascripts/ace/mode-perl.js +11 -3
  141. data/vendor/assets/javascripts/ace/mode-perl6.js +593 -0
  142. data/vendor/assets/javascripts/ace/mode-pgsql.js +314 -71
  143. data/vendor/assets/javascripts/ace/mode-php.js +1042 -995
  144. data/vendor/assets/javascripts/ace/mode-php_laravel_blade.js +13104 -0
  145. data/vendor/assets/javascripts/ace/mode-pig.js +13 -6
  146. data/vendor/assets/javascripts/ace/mode-plain_text.js +8 -1
  147. data/vendor/assets/javascripts/ace/mode-powershell.js +10 -3
  148. data/vendor/assets/javascripts/ace/mode-praat.js +17 -7
  149. data/vendor/assets/javascripts/ace/mode-prisma.js +489 -0
  150. data/vendor/assets/javascripts/ace/mode-prolog.js +12 -5
  151. data/vendor/assets/javascripts/ace/mode-properties.js +8 -1
  152. data/vendor/assets/javascripts/ace/mode-protobuf.js +23 -7
  153. data/vendor/assets/javascripts/ace/mode-puppet.js +368 -0
  154. data/vendor/assets/javascripts/ace/mode-python.js +306 -63
  155. data/vendor/assets/javascripts/ace/mode-qml.js +381 -0
  156. data/vendor/assets/javascripts/ace/mode-r.js +15 -4
  157. data/vendor/assets/javascripts/ace/mode-razor.js +166 -136
  158. data/vendor/assets/javascripts/ace/mode-rdoc.js +41 -3
  159. data/vendor/assets/javascripts/ace/mode-red.js +450 -0
  160. data/vendor/assets/javascripts/ace/mode-redshift.js +360 -0
  161. data/vendor/assets/javascripts/ace/mode-rhtml.js +162 -133
  162. data/vendor/assets/javascripts/ace/mode-rst.js +9 -1
  163. data/vendor/assets/javascripts/ace/mode-ruby.js +678 -166
  164. data/vendor/assets/javascripts/ace/mode-rust.js +16 -7
  165. data/vendor/assets/javascripts/ace/mode-sass.js +211 -116
  166. data/vendor/assets/javascripts/ace/mode-scad.js +11 -4
  167. data/vendor/assets/javascripts/ace/mode-scala.js +14 -5
  168. data/vendor/assets/javascripts/ace/mode-scheme.js +9 -2
  169. data/vendor/assets/javascripts/ace/mode-scss.js +412 -125
  170. data/vendor/assets/javascripts/ace/mode-sh.js +12 -4
  171. data/vendor/assets/javascripts/ace/mode-sjs.js +16 -7
  172. data/vendor/assets/javascripts/ace/mode-slim.js +5240 -0
  173. data/vendor/assets/javascripts/ace/mode-smarty.js +164 -135
  174. data/vendor/assets/javascripts/ace/mode-snippets.js +24 -16
  175. data/vendor/assets/javascripts/ace/mode-soy_template.js +164 -135
  176. data/vendor/assets/javascripts/ace/mode-space.js +8 -1
  177. data/vendor/assets/javascripts/ace/mode-sparql.js +13 -6
  178. data/vendor/assets/javascripts/ace/mode-sql.js +10 -2
  179. data/vendor/assets/javascripts/ace/mode-sqlserver.js +13 -5
  180. data/vendor/assets/javascripts/ace/mode-stylus.js +20 -10
  181. data/vendor/assets/javascripts/ace/mode-svg.js +27 -13
  182. data/vendor/assets/javascripts/ace/mode-swift.js +21 -8
  183. data/vendor/assets/javascripts/ace/mode-tcl.js +14 -3
  184. data/vendor/assets/javascripts/ace/mode-terraform.js +400 -0
  185. data/vendor/assets/javascripts/ace/mode-tex.js +9 -1
  186. data/vendor/assets/javascripts/ace/mode-text.js +8 -0
  187. data/vendor/assets/javascripts/ace/mode-textile.js +9 -1
  188. data/vendor/assets/javascripts/ace/mode-toml.js +9 -2
  189. data/vendor/assets/javascripts/ace/mode-tsx.js +28 -31
  190. data/vendor/assets/javascripts/ace/mode-turtle.js +13 -6
  191. data/vendor/assets/javascripts/ace/mode-twig.js +163 -134
  192. data/vendor/assets/javascripts/ace/mode-typescript.js +28 -31
  193. data/vendor/assets/javascripts/ace/mode-vala.js +14 -6
  194. data/vendor/assets/javascripts/ace/mode-vbscript.js +453 -17
  195. data/vendor/assets/javascripts/ace/mode-velocity.js +163 -133
  196. data/vendor/assets/javascripts/ace/mode-verilog.js +19 -5
  197. data/vendor/assets/javascripts/ace/mode-vhdl.js +13 -7
  198. data/vendor/assets/javascripts/ace/mode-visualforce.js +2640 -0
  199. data/vendor/assets/javascripts/ace/mode-wollok.js +17 -8
  200. data/vendor/assets/javascripts/ace/mode-xml.js +21 -9
  201. data/vendor/assets/javascripts/ace/mode-xquery.js +25 -12
  202. data/vendor/assets/javascripts/ace/mode-yaml.js +59 -18
  203. data/vendor/assets/javascripts/ace/mode-zeek.js +539 -0
  204. data/vendor/assets/javascripts/ace/snippets/abap.js +8 -6
  205. data/vendor/assets/javascripts/ace/snippets/abc.js +8 -1
  206. data/vendor/assets/javascripts/ace/snippets/actionscript.js +8 -1
  207. data/vendor/assets/javascripts/ace/snippets/ada.js +8 -6
  208. data/vendor/assets/javascripts/ace/snippets/alda.js +9 -0
  209. data/vendor/assets/javascripts/ace/snippets/apache_conf.js +8 -6
  210. data/vendor/assets/javascripts/ace/snippets/apex.js +9 -0
  211. data/vendor/assets/javascripts/ace/snippets/applescript.js +8 -6
  212. data/vendor/assets/javascripts/ace/snippets/aql.js +9 -0
  213. data/vendor/assets/javascripts/ace/snippets/asciidoc.js +8 -6
  214. data/vendor/assets/javascripts/ace/snippets/asl.js +9 -0
  215. data/vendor/assets/javascripts/ace/snippets/assembly_x86.js +8 -6
  216. data/vendor/assets/javascripts/ace/snippets/autohotkey.js +8 -6
  217. data/vendor/assets/javascripts/ace/snippets/batchfile.js +8 -6
  218. data/vendor/assets/javascripts/ace/snippets/c9search.js +8 -6
  219. data/vendor/assets/javascripts/ace/snippets/c_cpp.js +8 -1
  220. data/vendor/assets/javascripts/ace/snippets/cirru.js +8 -6
  221. data/vendor/assets/javascripts/ace/snippets/clojure.js +8 -1
  222. data/vendor/assets/javascripts/ace/snippets/cobol.js +8 -6
  223. data/vendor/assets/javascripts/ace/snippets/coffee.js +8 -1
  224. data/vendor/assets/javascripts/ace/snippets/coldfusion.js +8 -6
  225. data/vendor/assets/javascripts/ace/snippets/crystal.js +9 -0
  226. data/vendor/assets/javascripts/ace/snippets/csharp.js +8 -6
  227. data/vendor/assets/javascripts/ace/snippets/csound_document.js +24 -0
  228. data/vendor/assets/javascripts/ace/snippets/csound_orchestra.js +61 -0
  229. data/vendor/assets/javascripts/ace/snippets/csound_score.js +9 -0
  230. data/vendor/assets/javascripts/ace/snippets/csp.js +9 -0
  231. data/vendor/assets/javascripts/ace/snippets/css.js +8 -1
  232. data/vendor/assets/javascripts/ace/snippets/curly.js +8 -6
  233. data/vendor/assets/javascripts/ace/snippets/d.js +8 -6
  234. data/vendor/assets/javascripts/ace/snippets/dart.js +8 -1
  235. data/vendor/assets/javascripts/ace/snippets/diff.js +8 -1
  236. data/vendor/assets/javascripts/ace/snippets/django.js +8 -1
  237. data/vendor/assets/javascripts/ace/snippets/dockerfile.js +8 -6
  238. data/vendor/assets/javascripts/ace/snippets/dot.js +8 -6
  239. data/vendor/assets/javascripts/ace/snippets/drools.js +8 -1
  240. data/vendor/assets/javascripts/ace/snippets/edifact.js +254 -0
  241. data/vendor/assets/javascripts/ace/snippets/eiffel.js +8 -6
  242. data/vendor/assets/javascripts/ace/snippets/ejs.js +8 -6
  243. data/vendor/assets/javascripts/ace/snippets/elixir.js +8 -6
  244. data/vendor/assets/javascripts/ace/snippets/elm.js +8 -6
  245. data/vendor/assets/javascripts/ace/snippets/erlang.js +8 -1
  246. data/vendor/assets/javascripts/ace/snippets/forth.js +8 -6
  247. data/vendor/assets/javascripts/ace/snippets/fortran.js +8 -6
  248. data/vendor/assets/javascripts/ace/snippets/fsharp.js +9 -0
  249. data/vendor/assets/javascripts/ace/snippets/fsl.js +14 -0
  250. data/vendor/assets/javascripts/ace/snippets/ftl.js +8 -6
  251. data/vendor/assets/javascripts/ace/snippets/gcode.js +8 -6
  252. data/vendor/assets/javascripts/ace/snippets/gherkin.js +8 -6
  253. data/vendor/assets/javascripts/ace/snippets/gitignore.js +8 -6
  254. data/vendor/assets/javascripts/ace/snippets/glsl.js +8 -6
  255. data/vendor/assets/javascripts/ace/snippets/gobstones.js +1701 -24
  256. data/vendor/assets/javascripts/ace/snippets/golang.js +8 -6
  257. data/vendor/assets/javascripts/ace/snippets/graphqlschema.js +8 -1
  258. data/vendor/assets/javascripts/ace/snippets/groovy.js +8 -6
  259. data/vendor/assets/javascripts/ace/snippets/haml.js +8 -1
  260. data/vendor/assets/javascripts/ace/snippets/handlebars.js +8 -6
  261. data/vendor/assets/javascripts/ace/snippets/haskell.js +8 -1
  262. data/vendor/assets/javascripts/ace/snippets/haskell_cabal.js +8 -6
  263. data/vendor/assets/javascripts/ace/snippets/haxe.js +8 -6
  264. data/vendor/assets/javascripts/ace/snippets/hjson.js +8 -6
  265. data/vendor/assets/javascripts/ace/snippets/html.js +36 -2
  266. data/vendor/assets/javascripts/ace/snippets/html_elixir.js +8 -6
  267. data/vendor/assets/javascripts/ace/snippets/html_ruby.js +8 -6
  268. data/vendor/assets/javascripts/ace/snippets/ini.js +8 -6
  269. data/vendor/assets/javascripts/ace/snippets/io.js +8 -1
  270. data/vendor/assets/javascripts/ace/snippets/jack.js +8 -6
  271. data/vendor/assets/javascripts/ace/snippets/jade.js +8 -6
  272. data/vendor/assets/javascripts/ace/snippets/java.js +8 -1
  273. data/vendor/assets/javascripts/ace/snippets/javascript.js +8 -1
  274. data/vendor/assets/javascripts/ace/snippets/json.js +8 -6
  275. data/vendor/assets/javascripts/ace/snippets/json5.js +9 -0
  276. data/vendor/assets/javascripts/ace/snippets/jsoniq.js +8 -1
  277. data/vendor/assets/javascripts/ace/snippets/jsp.js +8 -1
  278. data/vendor/assets/javascripts/ace/snippets/jssm.js +9 -0
  279. data/vendor/assets/javascripts/ace/snippets/jsx.js +8 -6
  280. data/vendor/assets/javascripts/ace/snippets/julia.js +8 -6
  281. data/vendor/assets/javascripts/ace/snippets/kotlin.js +8 -6
  282. data/vendor/assets/javascripts/ace/snippets/latex.js +8 -6
  283. data/vendor/assets/javascripts/ace/snippets/less.js +8 -6
  284. data/vendor/assets/javascripts/ace/snippets/liquid.js +890 -2
  285. data/vendor/assets/javascripts/ace/snippets/lisp.js +8 -6
  286. data/vendor/assets/javascripts/ace/snippets/livescript.js +8 -6
  287. data/vendor/assets/javascripts/ace/snippets/logiql.js +8 -6
  288. data/vendor/assets/javascripts/ace/snippets/logtalk.js +9 -0
  289. data/vendor/assets/javascripts/ace/snippets/lsl.js +8 -1
  290. data/vendor/assets/javascripts/ace/snippets/lua.js +8 -1
  291. data/vendor/assets/javascripts/ace/snippets/luapage.js +8 -6
  292. data/vendor/assets/javascripts/ace/snippets/lucene.js +8 -6
  293. data/vendor/assets/javascripts/ace/snippets/makefile.js +8 -1
  294. data/vendor/assets/javascripts/ace/snippets/markdown.js +8 -1
  295. data/vendor/assets/javascripts/ace/snippets/mask.js +8 -6
  296. data/vendor/assets/javascripts/ace/snippets/matlab.js +8 -6
  297. data/vendor/assets/javascripts/ace/snippets/maze.js +8 -1
  298. data/vendor/assets/javascripts/ace/snippets/mediawiki.js +9 -0
  299. data/vendor/assets/javascripts/ace/snippets/mel.js +8 -6
  300. data/vendor/assets/javascripts/ace/snippets/mixal.js +9 -0
  301. data/vendor/assets/javascripts/ace/snippets/mushcode.js +8 -6
  302. data/vendor/assets/javascripts/ace/snippets/mysql.js +8 -6
  303. data/vendor/assets/javascripts/ace/snippets/nginx.js +9 -0
  304. data/vendor/assets/javascripts/ace/snippets/nim.js +9 -0
  305. data/vendor/assets/javascripts/ace/snippets/nix.js +8 -6
  306. data/vendor/assets/javascripts/ace/snippets/nsis.js +8 -6
  307. data/vendor/assets/javascripts/ace/snippets/nunjucks.js +9 -0
  308. data/vendor/assets/javascripts/ace/snippets/objectivec.js +8 -6
  309. data/vendor/assets/javascripts/ace/snippets/ocaml.js +8 -6
  310. data/vendor/assets/javascripts/ace/snippets/pascal.js +8 -6
  311. data/vendor/assets/javascripts/ace/snippets/perl.js +8 -1
  312. data/vendor/assets/javascripts/ace/snippets/perl6.js +9 -0
  313. data/vendor/assets/javascripts/ace/snippets/pgsql.js +8 -6
  314. data/vendor/assets/javascripts/ace/snippets/php.js +49 -36
  315. data/vendor/assets/javascripts/ace/snippets/php_laravel_blade.js +9 -0
  316. data/vendor/assets/javascripts/ace/snippets/pig.js +8 -6
  317. data/vendor/assets/javascripts/ace/snippets/plain_text.js +8 -6
  318. data/vendor/assets/javascripts/ace/snippets/powershell.js +8 -6
  319. data/vendor/assets/javascripts/ace/snippets/praat.js +8 -6
  320. data/vendor/assets/javascripts/ace/snippets/prisma.js +9 -0
  321. data/vendor/assets/javascripts/ace/snippets/prolog.js +8 -6
  322. data/vendor/assets/javascripts/ace/snippets/properties.js +8 -6
  323. data/vendor/assets/javascripts/ace/snippets/protobuf.js +8 -6
  324. data/vendor/assets/javascripts/ace/snippets/puppet.js +9 -0
  325. data/vendor/assets/javascripts/ace/snippets/python.js +8 -1
  326. data/vendor/assets/javascripts/ace/snippets/qml.js +9 -0
  327. data/vendor/assets/javascripts/ace/snippets/r.js +8 -1
  328. data/vendor/assets/javascripts/ace/snippets/razor.js +8 -1
  329. data/vendor/assets/javascripts/ace/snippets/rdoc.js +8 -6
  330. data/vendor/assets/javascripts/ace/snippets/red.js +9 -0
  331. data/vendor/assets/javascripts/ace/snippets/redshift.js +9 -0
  332. data/vendor/assets/javascripts/ace/snippets/rhtml.js +8 -6
  333. data/vendor/assets/javascripts/ace/snippets/rst.js +8 -1
  334. data/vendor/assets/javascripts/ace/snippets/ruby.js +8 -1
  335. data/vendor/assets/javascripts/ace/snippets/rust.js +8 -6
  336. data/vendor/assets/javascripts/ace/snippets/sass.js +8 -6
  337. data/vendor/assets/javascripts/ace/snippets/scad.js +8 -6
  338. data/vendor/assets/javascripts/ace/snippets/scala.js +8 -6
  339. data/vendor/assets/javascripts/ace/snippets/scheme.js +8 -6
  340. data/vendor/assets/javascripts/ace/snippets/scss.js +8 -6
  341. data/vendor/assets/javascripts/ace/snippets/sh.js +8 -1
  342. data/vendor/assets/javascripts/ace/snippets/sjs.js +8 -6
  343. data/vendor/assets/javascripts/ace/snippets/slim.js +9 -0
  344. data/vendor/assets/javascripts/ace/snippets/smarty.js +8 -6
  345. data/vendor/assets/javascripts/ace/snippets/snippets.js +8 -1
  346. data/vendor/assets/javascripts/ace/snippets/soy_template.js +8 -6
  347. data/vendor/assets/javascripts/ace/snippets/space.js +8 -6
  348. data/vendor/assets/javascripts/ace/snippets/sparql.js +8 -6
  349. data/vendor/assets/javascripts/ace/snippets/sql.js +8 -1
  350. data/vendor/assets/javascripts/ace/snippets/sqlserver.js +8 -1
  351. data/vendor/assets/javascripts/ace/snippets/stylus.js +8 -6
  352. data/vendor/assets/javascripts/ace/snippets/svg.js +8 -6
  353. data/vendor/assets/javascripts/ace/snippets/swift.js +8 -6
  354. data/vendor/assets/javascripts/ace/snippets/tcl.js +8 -1
  355. data/vendor/assets/javascripts/ace/snippets/terraform.js +9 -0
  356. data/vendor/assets/javascripts/ace/snippets/tex.js +8 -1
  357. data/vendor/assets/javascripts/ace/snippets/text.js +8 -6
  358. data/vendor/assets/javascripts/ace/snippets/textile.js +8 -1
  359. data/vendor/assets/javascripts/ace/snippets/toml.js +8 -6
  360. data/vendor/assets/javascripts/ace/snippets/tsx.js +8 -6
  361. data/vendor/assets/javascripts/ace/snippets/turtle.js +8 -6
  362. data/vendor/assets/javascripts/ace/snippets/twig.js +8 -6
  363. data/vendor/assets/javascripts/ace/snippets/typescript.js +8 -6
  364. data/vendor/assets/javascripts/ace/snippets/vala.js +8 -1
  365. data/vendor/assets/javascripts/ace/snippets/vbscript.js +8 -6
  366. data/vendor/assets/javascripts/ace/snippets/velocity.js +8 -1
  367. data/vendor/assets/javascripts/ace/snippets/verilog.js +8 -6
  368. data/vendor/assets/javascripts/ace/snippets/vhdl.js +8 -6
  369. data/vendor/assets/javascripts/ace/snippets/visualforce.js +9 -0
  370. data/vendor/assets/javascripts/ace/snippets/wollok.js +8 -1
  371. data/vendor/assets/javascripts/ace/snippets/xml.js +8 -6
  372. data/vendor/assets/javascripts/ace/snippets/xquery.js +8 -1
  373. data/vendor/assets/javascripts/ace/snippets/yaml.js +8 -6
  374. data/vendor/assets/javascripts/ace/snippets/zeek.js +9 -0
  375. data/vendor/assets/javascripts/ace/theme-ambiance.js +11 -8
  376. data/vendor/assets/javascripts/ace/theme-chaos.js +9 -2
  377. data/vendor/assets/javascripts/ace/theme-chrome.js +8 -1
  378. data/vendor/assets/javascripts/ace/theme-clouds.js +8 -1
  379. data/vendor/assets/javascripts/ace/theme-clouds_midnight.js +8 -1
  380. data/vendor/assets/javascripts/ace/theme-cobalt.js +8 -1
  381. data/vendor/assets/javascripts/ace/theme-crimson_editor.js +8 -1
  382. data/vendor/assets/javascripts/ace/theme-dawn.js +8 -1
  383. data/vendor/assets/javascripts/ace/theme-dracula.js +135 -0
  384. data/vendor/assets/javascripts/ace/theme-dreamweaver.js +8 -1
  385. data/vendor/assets/javascripts/ace/theme-eclipse.js +8 -1
  386. data/vendor/assets/javascripts/ace/theme-github.js +8 -1
  387. data/vendor/assets/javascripts/ace/theme-gob.js +8 -1
  388. data/vendor/assets/javascripts/ace/theme-gruvbox.js +8 -1
  389. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +8 -1
  390. data/vendor/assets/javascripts/ace/theme-iplastic.js +8 -1
  391. data/vendor/assets/javascripts/ace/theme-katzenmilch.js +8 -1
  392. data/vendor/assets/javascripts/ace/theme-kr_theme.js +8 -1
  393. data/vendor/assets/javascripts/ace/theme-kuroir.js +8 -1
  394. data/vendor/assets/javascripts/ace/theme-merbivore.js +8 -1
  395. data/vendor/assets/javascripts/ace/theme-merbivore_soft.js +8 -1
  396. data/vendor/assets/javascripts/ace/theme-mono_industrial.js +8 -1
  397. data/vendor/assets/javascripts/ace/theme-monokai.js +8 -1
  398. data/vendor/assets/javascripts/ace/theme-nord_dark.js +102 -0
  399. data/vendor/assets/javascripts/ace/theme-pastel_on_dark.js +8 -1
  400. data/vendor/assets/javascripts/ace/theme-solarized_dark.js +8 -1
  401. data/vendor/assets/javascripts/ace/theme-solarized_light.js +9 -2
  402. data/vendor/assets/javascripts/ace/theme-sqlserver.js +8 -1
  403. data/vendor/assets/javascripts/ace/theme-terminal.js +8 -1
  404. data/vendor/assets/javascripts/ace/theme-textmate.js +9 -1
  405. data/vendor/assets/javascripts/ace/theme-tomorrow.js +8 -1
  406. data/vendor/assets/javascripts/ace/theme-tomorrow_night.js +8 -1
  407. data/vendor/assets/javascripts/ace/theme-tomorrow_night_blue.js +8 -1
  408. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +8 -1
  409. data/vendor/assets/javascripts/ace/theme-tomorrow_night_eighties.js +8 -1
  410. data/vendor/assets/javascripts/ace/theme-twilight.js +8 -1
  411. data/vendor/assets/javascripts/ace/theme-vibrant_ink.js +8 -1
  412. data/vendor/assets/javascripts/ace/theme-xcode.js +8 -1
  413. data/vendor/assets/javascripts/ace/worker-base.js +1421 -0
  414. data/vendor/assets/javascripts/ace/worker-coffee.js +55 -742
  415. data/vendor/assets/javascripts/ace/worker-css.js +66 -739
  416. data/vendor/assets/javascripts/ace/worker-html.js +55 -738
  417. data/vendor/assets/javascripts/ace/worker-javascript.js +6693 -4209
  418. data/vendor/assets/javascripts/ace/worker-json.js +56 -737
  419. data/vendor/assets/javascripts/ace/worker-lua.js +56 -738
  420. data/vendor/assets/javascripts/ace/worker-php.js +897 -1512
  421. data/vendor/assets/javascripts/ace/worker-xml.js +129 -808
  422. data/vendor/assets/javascripts/ace/worker-xquery.js +54 -737
  423. metadata +74 -19
  424. data/vendor/assets/javascripts/ace/ext-chromevox.js +0 -540
  425. data/vendor/assets/javascripts/ace/ext-old_ie.js +0 -502
  426. data/vendor/assets/javascripts/ace/mode-bash.js +0 -247
  427. data/vendor/assets/javascripts/ace/mode-bro.js +0 -327
  428. data/vendor/assets/javascripts/ace/mode-lean.js +0 -281
  429. data/vendor/assets/javascripts/ace/mode-live_script.js +0 -481
  430. data/vendor/assets/javascripts/ace/mode-mips_assembler.js +0 -235
  431. data/vendor/assets/javascripts/ace/mode-swig.js +0 -1099
  432. data/vendor/assets/javascripts/ace/snippets/bro.js +0 -7
  433. data/vendor/assets/javascripts/ace/snippets/lean.js +0 -7
  434. data/vendor/assets/javascripts/ace/snippets/live_script.js +0 -7
  435. data/vendor/assets/javascripts/ace/snippets/mips_assembler.js +0 -7
  436. data/vendor/assets/javascripts/ace/snippets/mipsassembler.js +0 -7
  437. data/vendor/assets/javascripts/ace/snippets/swig.js +0 -7
@@ -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();
@@ -79,6 +78,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
79
78
  };
80
79
  };
81
80
  CodeMirror.lookupKey = function lookupKey(key, map, handle) {
81
+ if (!map) map = "default";
82
82
  if (typeof map == "string")
83
83
  map = CodeMirror.keyMap[map];
84
84
  var found = typeof map == "function" ? map(key) : map[key];
@@ -122,7 +122,6 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
122
122
  var curOp = this.curOp = this.curOp || {};
123
123
  if (!curOp.changeHandlers)
124
124
  curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice();
125
- if (this.virtualSelectionMode()) return;
126
125
  if (!curOp.lastChange) {
127
126
  curOp.lastChange = curOp.change = change;
128
127
  } else {
@@ -157,6 +156,8 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
157
156
  this.curOp.force = force;
158
157
  var result = fn();
159
158
  if (this.ace.curOp && this.ace.curOp.command.name == "vim") {
159
+ if (this.state.dialog)
160
+ this.ace.curOp.command.scrollIntoView = false;
160
161
  this.ace.endOperation();
161
162
  if (!curOp.cursorActivity && !curOp.lastChange && prevOp)
162
163
  this.ace.prevOp = prevOp;
@@ -280,7 +281,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
280
281
  if (point.bias == 1) {
281
282
  cmp = 1;
282
283
  } else {
283
- point.bias == -1;
284
+ point.bias = -1;
284
285
  continue;
285
286
  }
286
287
  }
@@ -434,6 +435,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
434
435
  if (!e) e = s;
435
436
  return this.ace.session.replace(new Range(s.line, s.ch, e.line, e.ch), text);
436
437
  };
438
+ this.replaceSelection =
437
439
  this.replaceSelections = function(p) {
438
440
  var sel = this.ace.selection;
439
441
  if (this.ace.inVirtualSelectionMode) {
@@ -459,7 +461,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
459
461
  return this.ace.textInput.getElement();
460
462
  };
461
463
  this.getWrapperElement = function() {
462
- return this.ace.containter;
464
+ return this.ace.container;
463
465
  };
464
466
  var optMap = {
465
467
  indentWithTabs: "useSoftTabs",
@@ -475,6 +477,10 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
475
477
  name = optMap[name];
476
478
  val = !val;
477
479
  break;
480
+ case 'keyMap':
481
+ this.state.$keyMap = val;
482
+ return;
483
+ break;
478
484
  default:
479
485
  name = optMap[name];
480
486
  }
@@ -489,6 +495,8 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
489
495
  case 'indentWithTabs':
490
496
  name = optMap[name];
491
497
  return !val;
498
+ case 'keyMap':
499
+ return this.state.$keyMap;
492
500
  }
493
501
  return aceOpt ? val : this.state[name];
494
502
  };
@@ -542,7 +550,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
542
550
  return this.ace.getValue();
543
551
  };
544
552
  this.setValue = function(v) {
545
- return this.ace.setValue(v);
553
+ return this.ace.setValue(v, -1);
546
554
  };
547
555
  this.getTokenTypeAt = function(pos) {
548
556
  var token = this.ace.session.getTokenAt(pos.line, pos.ch);
@@ -565,7 +573,7 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
565
573
  return toCmPos(this.ace.session.doc.indexToPosition(index));
566
574
  };
567
575
  this.focus = function(index) {
568
- return this.ace.focus();
576
+ return this.ace.textInput.focus();
569
577
  };
570
578
  this.blur = function(index) {
571
579
  return this.ace.blur();
@@ -575,10 +583,11 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
575
583
  };
576
584
  this.scanForBracket = function(pos, dir, _, options) {
577
585
  var re = options.bracketRegex.source;
586
+ var tokenRe = /paren|text|operator|tag/;
578
587
  if (dir == 1) {
579
- var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), /paren|text/);
588
+ var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe);
580
589
  } else {
581
- var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, /paren|text/);
590
+ var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, tokenRe);
582
591
  }
583
592
  return m && {pos: toCmPos(m)};
584
593
  };
@@ -587,7 +596,11 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve
587
596
  };
588
597
  this.getMode = function() {
589
598
  return { name : this.getOption("mode") };
590
- }
599
+ };
600
+ this.execCommand = function(name) {
601
+ if (name == "indentAuto") this.ace.execCommand("autoindent");
602
+ else console.log(name + " is not implemented");
603
+ };
591
604
  }).call(CodeMirror.prototype);
592
605
  function toAcePos(cmPos) {
593
606
  return {row: cmPos.line, column: cmPos.ch};
@@ -666,28 +679,29 @@ CodeMirror.defineExtension = function(name, fn) {
666
679
  CodeMirror.prototype[name] = fn;
667
680
  };
668
681
  dom.importCssString(".normal-mode .ace_cursor{\
669
- border: 1px solid red;\
670
- background-color: red;\
671
- opacity: 0.5;\
682
+ border: none;\
683
+ background-color: rgba(255,0,0,0.5);\
672
684
  }\
673
685
  .normal-mode .ace_hidden-cursors .ace_cursor{\
674
686
  background-color: transparent;\
687
+ border: 1px solid red;\
688
+ opacity: 0.7\
675
689
  }\
676
690
  .ace_dialog {\
677
691
  position: absolute;\
678
692
  left: 0; right: 0;\
679
- background: white;\
693
+ background: inherit;\
680
694
  z-index: 15;\
681
695
  padding: .1em .8em;\
682
696
  overflow: hidden;\
683
- color: #333;\
697
+ color: inherit;\
684
698
  }\
685
699
  .ace_dialog-top {\
686
- border-bottom: 1px solid #eee;\
700
+ border-bottom: 1px solid #444;\
687
701
  top: 0;\
688
702
  }\
689
703
  .ace_dialog-bottom {\
690
- border-top: 1px solid #eee;\
704
+ border-top: 1px solid #444;\
691
705
  bottom: 0;\
692
706
  }\
693
707
  .ace_dialog input {\
@@ -730,11 +744,19 @@ dom.importCssString(".normal-mode .ace_cursor{\
730
744
 
731
745
  var dialog = dialogDiv(this, template, options.bottom);
732
746
  var closed = false, me = this;
747
+ this.state.dialog = dialog;
733
748
  function close(newVal) {
734
749
  if (typeof newVal == 'string') {
735
750
  inp.value = newVal;
736
751
  } else {
737
752
  if (closed) return;
753
+
754
+ if (newVal && newVal.type == "blur") {
755
+ if (document.activeElement === inp)
756
+ return;
757
+ }
758
+
759
+ me.state.dialog = null;
738
760
  closed = true;
739
761
  dialog.parentNode.removeChild(dialog);
740
762
  me.focus();
@@ -747,7 +769,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
747
769
  if (inp) {
748
770
  if (options.value) {
749
771
  inp.value = options.value;
750
- if (options.select !== false) inp.select();
772
+ if (options.selectValueOnOpen !== false) inp.select();
751
773
  }
752
774
 
753
775
  if (options.onInput)
@@ -757,12 +779,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
757
779
 
758
780
  CodeMirror.on(inp, "keydown", function(e) {
759
781
  if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
782
+ if (e.keyCode == 13) callback(inp.value);
760
783
  if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
761
784
  inp.blur();
762
785
  CodeMirror.e_stop(e);
763
786
  close();
764
787
  }
765
- if (e.keyCode == 13) callback(inp.value);
766
788
  });
767
789
 
768
790
  if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close);
@@ -815,6 +837,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
815
837
  { keys: '<Down>', type: 'keyToKey', toKeys: 'j' },
816
838
  { keys: '<Space>', type: 'keyToKey', toKeys: 'l' },
817
839
  { keys: '<BS>', type: 'keyToKey', toKeys: 'h', context: 'normal'},
840
+ { keys: '<Del>', type: 'keyToKey', toKeys: 'x', context: 'normal'},
818
841
  { keys: '<C-Space>', type: 'keyToKey', toKeys: 'W' },
819
842
  { keys: '<C-BS>', type: 'keyToKey', toKeys: 'B', context: 'normal' },
820
843
  { keys: '<S-Space>', type: 'keyToKey', toKeys: 'w' },
@@ -825,6 +848,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
825
848
  { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>' },
826
849
  { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },
827
850
  { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },
851
+ { keys: '<C-Esc>', type: 'keyToKey', toKeys: '<Esc>' }, // ace_patch ipad keyboard sends C-Esc instead of C-[
852
+ { keys: '<C-Esc>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },
828
853
  { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' },
829
854
  { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'},
830
855
  { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' },
@@ -834,6 +859,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
834
859
  { keys: '<PageUp>', type: 'keyToKey', toKeys: '<C-b>' },
835
860
  { keys: '<PageDown>', type: 'keyToKey', toKeys: '<C-f>' },
836
861
  { keys: '<CR>', type: 'keyToKey', toKeys: 'j^', context: 'normal' },
862
+ { keys: '<Ins>', type: 'action', action: 'toggleOverwrite', context: 'insert' },
837
863
  { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }},
838
864
  { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }},
839
865
  { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }},
@@ -853,6 +879,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
853
879
  { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }},
854
880
  { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }},
855
881
  { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }},
882
+ { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }},
883
+ { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }},
856
884
  { keys: '<C-f>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }},
857
885
  { keys: '<C-b>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }},
858
886
  { keys: '<C-d>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }},
@@ -888,6 +916,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
888
916
  { keys: 'd', type: 'operator', operator: 'delete' },
889
917
  { keys: 'y', type: 'operator', operator: 'yank' },
890
918
  { keys: 'c', type: 'operator', operator: 'change' },
919
+ { keys: '=', type: 'operator', operator: 'indentAuto' },
891
920
  { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }},
892
921
  { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }},
893
922
  { keys: 'g~', type: 'operator', operator: 'changeCase' },
@@ -899,13 +928,14 @@ dom.importCssString(".normal-mode .ace_cursor{\
899
928
  { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},
900
929
  { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},
901
930
  { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'},
902
- { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},
931
+ { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'},
903
932
  { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'},
904
933
  { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},
905
934
  { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'},
906
935
  { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'},
907
936
  { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'},
908
937
  { keys: '<C-w>', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' },
938
+ { keys: '<C-w>', type: 'idle', context: 'normal' },
909
939
  { keys: '<C-i>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }},
910
940
  { keys: '<C-o>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }},
911
941
  { keys: '<C-e>', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }},
@@ -914,7 +944,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
914
944
  { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' },
915
945
  { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' },
916
946
  { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' },
947
+ { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' },
917
948
  { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' },
949
+ { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol'}, context: 'normal' },
918
950
  { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' },
919
951
  { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' },
920
952
  { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' },
@@ -924,12 +956,14 @@ dom.importCssString(".normal-mode .ace_cursor{\
924
956
  { keys: '<C-q>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},
925
957
  { keys: 'gv', type: 'action', action: 'reselectLastSelection' },
926
958
  { keys: 'J', type: 'action', action: 'joinLines', isEdit: true },
959
+ { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true },
927
960
  { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }},
928
961
  { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }},
929
962
  { keys: 'r<character>', type: 'action', action: 'replace', isEdit: true },
930
963
  { keys: '@<character>', type: 'action', action: 'replayMacro' },
931
964
  { keys: 'q<character>', type: 'action', action: 'enterMacroRecordMode' },
932
- { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }},
965
+ { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'},
966
+ { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true},
933
967
  { keys: 'u', type: 'action', action: 'undo', context: 'normal' },
934
968
  { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true },
935
969
  { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true },
@@ -945,6 +979,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
945
979
  { keys: '.', type: 'action', action: 'repeatLastEdit' },
946
980
  { keys: '<C-a>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}},
947
981
  { keys: '<C-x>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}},
982
+ { keys: '<C-t>', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' },
983
+ { keys: '<C-d>', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' },
948
984
  { keys: 'a<character>', type: 'motion', motion: 'textObjectManipulation' },
949
985
  { keys: 'i<character>', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }},
950
986
  { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},
@@ -955,6 +991,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
955
991
  { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},
956
992
  { keys: ':', type: 'ex' }
957
993
  ];
994
+ var defaultKeymapLength = defaultKeymap.length;
958
995
  var defaultExCommandMap = [
959
996
  { name: 'colorscheme', shortName: 'colo' },
960
997
  { name: 'map' },
@@ -972,6 +1009,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
972
1009
  { name: 'sort', shortName: 'sor' },
973
1010
  { name: 'substitute', shortName: 's', possiblyAsync: true },
974
1011
  { name: 'nohlsearch', shortName: 'noh' },
1012
+ { name: 'yank', shortName: 'y' },
975
1013
  { name: 'delmarks', shortName: 'delm' },
976
1014
  { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },
977
1015
  { name: 'global', shortName: 'g' }
@@ -995,13 +1033,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
995
1033
  CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));
996
1034
  cm.state.vim = null;
997
1035
  }
998
-
999
1036
  function detachVimMap(cm, next) {
1000
1037
  if (this == CodeMirror.keyMap.vim)
1001
1038
  CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor");
1002
1039
 
1003
1040
  if (!next || next.attach != attachVimMap)
1004
- leaveVimMode(cm, false);
1041
+ leaveVimMode(cm);
1005
1042
  }
1006
1043
  function attachVimMap(cm, prev) {
1007
1044
  if (this == CodeMirror.keyMap.vim)
@@ -1019,6 +1056,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1019
1056
 
1020
1057
  function cmKey(key, cm) {
1021
1058
  if (!cm) { return undefined; }
1059
+ if (this[key]) { return this[key]; }
1022
1060
  var vimKey = cmKeyToVimKey(key);
1023
1061
  if (!vimKey) {
1024
1062
  return false;
@@ -1031,7 +1069,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1031
1069
  }
1032
1070
 
1033
1071
  var modifiers = {'Shift': 'S', 'Ctrl': 'C', 'Alt': 'A', 'Cmd': 'D', 'Mod': 'A'};
1034
- var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del'};
1072
+ var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'};
1035
1073
  function cmKeyToVimKey(key) {
1036
1074
  if (key.charAt(0) == '\'') {
1037
1075
  return key.charAt(1);
@@ -1109,6 +1147,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
1109
1147
  function isWhiteSpaceString(k) {
1110
1148
  return (/^\s*$/).test(k);
1111
1149
  }
1150
+ function isEndOfSentenceSymbol(k) {
1151
+ return '.?!'.indexOf(k) != -1;
1152
+ }
1112
1153
  function inArray(val, arr) {
1113
1154
  for (var i = 0; i < arr.length; i++) {
1114
1155
  if (arr[i] == val) {
@@ -1144,11 +1185,11 @@ dom.importCssString(".normal-mode .ace_cursor{\
1144
1185
  cfg = cfg || {};
1145
1186
  var scope = cfg.scope;
1146
1187
  if (!option) {
1147
- throw Error('Unknown option: ' + name);
1188
+ return new Error('Unknown option: ' + name);
1148
1189
  }
1149
1190
  if (option.type == 'boolean') {
1150
1191
  if (value && value !== true) {
1151
- throw Error('Invalid argument: ' + name + '=' + value);
1192
+ return new Error('Invalid argument: ' + name + '=' + value);
1152
1193
  } else if (value !== false) {
1153
1194
  value = true;
1154
1195
  }
@@ -1175,7 +1216,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1175
1216
  cfg = cfg || {};
1176
1217
  var scope = cfg.scope;
1177
1218
  if (!option) {
1178
- throw Error('Unknown option: ' + name);
1219
+ return new Error('Unknown option: ' + name);
1179
1220
  }
1180
1221
  if (option.callback) {
1181
1222
  var local = cm && option.callback(undefined, cm);
@@ -1261,9 +1302,16 @@ dom.importCssString(".normal-mode .ace_cursor{\
1261
1302
  }
1262
1303
  return mark;
1263
1304
  }
1305
+ function find(cm, offset) {
1306
+ var oldPointer = pointer;
1307
+ var mark = move(cm, offset);
1308
+ pointer = oldPointer;
1309
+ return mark && mark.find();
1310
+ }
1264
1311
  return {
1265
1312
  cachedCursor: undefined, //used for # and * jumps
1266
1313
  add: add,
1314
+ find: find,
1267
1315
  move: move
1268
1316
  };
1269
1317
  };
@@ -1344,10 +1392,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
1344
1392
  lastSubstituteReplacePart: undefined,
1345
1393
  jumpList: createCircularJumpList(),
1346
1394
  macroModeState: new MacroModeState,
1347
- lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
1395
+ lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''},
1348
1396
  registerController: new RegisterController({}),
1349
- searchHistoryController: new HistoryController({}),
1350
- exCommandHistoryController : new HistoryController({})
1397
+ searchHistoryController: new HistoryController(),
1398
+ exCommandHistoryController : new HistoryController()
1351
1399
  };
1352
1400
  for (var optionName in options) {
1353
1401
  var option = options[optionName];
@@ -1377,6 +1425,62 @@ dom.importCssString(".normal-mode .ace_cursor{\
1377
1425
  unmap: function(lhs, ctx) {
1378
1426
  exCommandDispatcher.unmap(lhs, ctx);
1379
1427
  },
1428
+ noremap: function(lhs, rhs, ctx) {
1429
+ function toCtxArray(ctx) {
1430
+ return ctx ? [ctx] : ['normal', 'insert', 'visual'];
1431
+ }
1432
+ var ctxsToMap = toCtxArray(ctx);
1433
+ var actualLength = defaultKeymap.length, origLength = defaultKeymapLength;
1434
+ for (var i = actualLength - origLength;
1435
+ i < actualLength && ctxsToMap.length;
1436
+ i++) {
1437
+ var mapping = defaultKeymap[i];
1438
+ if (mapping.keys == rhs &&
1439
+ (!ctx || !mapping.context || mapping.context === ctx) &&
1440
+ mapping.type.substr(0, 2) !== 'ex' &&
1441
+ mapping.type.substr(0, 3) !== 'key') {
1442
+ var newMapping = {};
1443
+ for (var key in mapping) {
1444
+ newMapping[key] = mapping[key];
1445
+ }
1446
+ newMapping.keys = lhs;
1447
+ if (ctx && !newMapping.context) {
1448
+ newMapping.context = ctx;
1449
+ }
1450
+ this._mapCommand(newMapping);
1451
+ var mappedCtxs = toCtxArray(mapping.context);
1452
+ ctxsToMap = ctxsToMap.filter(function(el) { return mappedCtxs.indexOf(el) === -1; });
1453
+ }
1454
+ }
1455
+ },
1456
+ mapclear: function(ctx) {
1457
+ var actualLength = defaultKeymap.length,
1458
+ origLength = defaultKeymapLength;
1459
+ var userKeymap = defaultKeymap.slice(0, actualLength - origLength);
1460
+ defaultKeymap = defaultKeymap.slice(actualLength - origLength);
1461
+ if (ctx) {
1462
+ for (var i = userKeymap.length - 1; i >= 0; i--) {
1463
+ var mapping = userKeymap[i];
1464
+ if (ctx !== mapping.context) {
1465
+ if (mapping.context) {
1466
+ this._mapCommand(mapping);
1467
+ } else {
1468
+ var contexts = ['normal', 'insert', 'visual'];
1469
+ for (var j in contexts) {
1470
+ if (contexts[j] !== ctx) {
1471
+ var newMapping = {};
1472
+ for (var key in mapping) {
1473
+ newMapping[key] = mapping[key];
1474
+ }
1475
+ newMapping.context = contexts[j];
1476
+ this._mapCommand(newMapping);
1477
+ }
1478
+ }
1479
+ }
1480
+ }
1481
+ }
1482
+ }
1483
+ },
1380
1484
  setOption: setOption,
1381
1485
  getOption: getOption,
1382
1486
  defineOption: defineOption,
@@ -1489,7 +1593,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1489
1593
  if (vim.insertMode) { command = handleKeyInsertMode(); }
1490
1594
  else { command = handleKeyNonInsertMode(); }
1491
1595
  if (command === false) {
1492
- return undefined;
1596
+ return undefined; //ace_patch
1493
1597
  } else if (command === true) {
1494
1598
  return function() { return true; };
1495
1599
  } else {
@@ -1608,7 +1712,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1608
1712
  }
1609
1713
  };
1610
1714
  function defineRegister(name, register) {
1611
- var registers = vimGlobalState.registerController.registers[name];
1715
+ var registers = vimGlobalState.registerController.registers;
1612
1716
  if (!name || name.length != 1) {
1613
1717
  throw Error('Register name must be 1 character');
1614
1718
  }
@@ -1624,9 +1728,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
1624
1728
  }
1625
1729
  RegisterController.prototype = {
1626
1730
  pushText: function(registerName, operator, text, linewise, blockwise) {
1627
- if (linewise && text.charAt(0) == '\n') {
1628
- text = text.slice(1) + '\n';
1629
- }
1630
1731
  if (linewise && text.charAt(text.length - 1) !== '\n'){
1631
1732
  text += '\n';
1632
1733
  }
@@ -1679,7 +1780,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1679
1780
  };
1680
1781
  function HistoryController() {
1681
1782
  this.historyBuffer = [];
1682
- this.iterator;
1783
+ this.iterator = 0;
1683
1784
  this.initialPrefix = null;
1684
1785
  }
1685
1786
  HistoryController.prototype = {
@@ -1730,7 +1831,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1730
1831
  }
1731
1832
  if (bestMatch.keys.slice(-11) == '<character>') {
1732
1833
  var character = lastChar(keys);
1733
- if (/<C-.>/.test(character)) return {type: 'none'};
1834
+ if (/<C-.>/.test(character) || !character) return {type: 'none'}; //ace_patch
1734
1835
  inputState.selectedCharacter = character;
1735
1836
  }
1736
1837
  return {type: 'full', command: bestMatch};
@@ -1780,6 +1881,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
1780
1881
  }
1781
1882
  inputState.operator = command.operator;
1782
1883
  inputState.operatorArgs = copyArgs(command.operatorArgs);
1884
+ if (command.exitVisualBlock) {
1885
+ vim.visualBlock = false;
1886
+ updateCmSelection(cm);
1887
+ }
1783
1888
  if (vim.visualMode) {
1784
1889
  this.evalInput(cm, vim);
1785
1890
  }
@@ -1859,11 +1964,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
1859
1964
  }
1860
1965
  }
1861
1966
  function onPromptKeyUp(e, query, close) {
1862
- var keyName = CodeMirror.keyName(e), up;
1967
+ var keyName = CodeMirror.keyName(e), up, offset;
1863
1968
  if (keyName == 'Up' || keyName == 'Down') {
1864
1969
  up = keyName == 'Up' ? true : false;
1970
+ offset = e.target ? e.target.selectionEnd : 0;
1865
1971
  query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '';
1866
1972
  close(query);
1973
+ if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);
1867
1974
  } else {
1868
1975
  if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')
1869
1976
  vimGlobalState.searchHistoryController.reset();
@@ -1894,6 +2001,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
1894
2001
  clearInputState(cm);
1895
2002
  close();
1896
2003
  cm.focus();
2004
+ } else if (keyName == 'Up' || keyName == 'Down') {
2005
+ CodeMirror.e_stop(e);
1897
2006
  } else if (keyName == 'Ctrl-U') {
1898
2007
  CodeMirror.e_stop(e);
1899
2008
  close('');
@@ -1950,7 +2059,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1950
2059
  exCommandDispatcher.processCommand(cm, input);
1951
2060
  }
1952
2061
  function onPromptKeyDown(e, input, close) {
1953
- var keyName = CodeMirror.keyName(e), up;
2062
+ var keyName = CodeMirror.keyName(e), up, offset;
1954
2063
  if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||
1955
2064
  (keyName == 'Backspace' && input == '')) {
1956
2065
  vimGlobalState.exCommandHistoryController.pushInput(input);
@@ -1961,9 +2070,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
1961
2070
  cm.focus();
1962
2071
  }
1963
2072
  if (keyName == 'Up' || keyName == 'Down') {
2073
+ CodeMirror.e_stop(e);
1964
2074
  up = keyName == 'Up' ? true : false;
2075
+ offset = e.target ? e.target.selectionEnd : 0;
1965
2076
  input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '';
1966
2077
  close(input);
2078
+ if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);
1967
2079
  } else if (keyName == 'Ctrl-U') {
1968
2080
  CodeMirror.e_stop(e);
1969
2081
  close('');
@@ -1977,7 +2089,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
1977
2089
  } else {
1978
2090
  if (vim.visualMode) {
1979
2091
  showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>',
1980
- onKeyDown: onPromptKeyDown});
2092
+ onKeyDown: onPromptKeyDown, selectValueOnOpen: false});
1981
2093
  } else {
1982
2094
  showPrompt(cm, { onClose: onPromptClose, prefix: ':',
1983
2095
  onKeyDown: onPromptKeyDown});
@@ -2165,6 +2277,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
2165
2277
  vim.lastEditActionCommand = actionCommand;
2166
2278
  macroModeState.lastInsertModeChanges.changes = [];
2167
2279
  macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;
2280
+ macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0;
2168
2281
  }
2169
2282
  };
2170
2283
  var motions = {
@@ -2197,9 +2310,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
2197
2310
  return findNext(cm, prev/** prev */, query, motionArgs.repeat);
2198
2311
  },
2199
2312
  goToMark: function(cm, _head, motionArgs, vim) {
2200
- var mark = vim.marks[motionArgs.selectedCharacter];
2201
- if (mark) {
2202
- var pos = mark.find();
2313
+ var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter);
2314
+ if (pos) {
2203
2315
  return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;
2204
2316
  }
2205
2317
  return null;
@@ -2274,9 +2386,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
2274
2386
  var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;
2275
2387
  var first = cm.firstLine();
2276
2388
  var last = cm.lastLine();
2277
- if ((line < first && cur.line == first) ||
2278
- (line > last && cur.line == last)) {
2279
- return;
2389
+ if (line < first && cur.line == first){
2390
+ return this.moveToStartOfLine(cm, head, motionArgs, vim);
2391
+ }else if (line > last && cur.line == last){
2392
+ return this.moveToEol(cm, head, motionArgs, vim, true);
2280
2393
  }
2281
2394
  var fold = cm.ace.session.getFoldLine(line);
2282
2395
  if (fold) {
@@ -2331,6 +2444,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
2331
2444
  var dir = motionArgs.forward ? 1 : -1;
2332
2445
  return findParagraph(cm, head, motionArgs.repeat, dir);
2333
2446
  },
2447
+ moveBySentence: function(cm, head, motionArgs) {
2448
+ var dir = motionArgs.forward ? 1 : -1;
2449
+ return findSentence(cm, head, motionArgs.repeat, dir);
2450
+ },
2334
2451
  moveByScroll: function(cm, head, motionArgs, vim) {
2335
2452
  var scrollbox = cm.getScrollInfo();
2336
2453
  var curEnd = null;
@@ -2379,13 +2496,15 @@ dom.importCssString(".normal-mode .ace_cursor{\
2379
2496
  vim.lastHSPos = cm.charCoords(head,'div').left;
2380
2497
  return moveToColumn(cm, repeat);
2381
2498
  },
2382
- moveToEol: function(cm, head, motionArgs, vim) {
2499
+ moveToEol: function(cm, head, motionArgs, vim, keepHPos) {
2383
2500
  var cur = head;
2384
- vim.lastHPos = Infinity;
2385
2501
  var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);
2386
2502
  var end=cm.clipPos(retval);
2387
2503
  end.ch--;
2388
- vim.lastHSPos = cm.charCoords(end,'div').left;
2504
+ if (!keepHPos) {
2505
+ vim.lastHPos = Infinity;
2506
+ vim.lastHSPos = cm.charCoords(end,'div').left;
2507
+ }
2389
2508
  return retval;
2390
2509
  },
2391
2510
  moveToFirstNonWhiteSpaceCharacter: function(cm, head) {
@@ -2399,17 +2518,18 @@ dom.importCssString(".normal-mode .ace_cursor{\
2399
2518
  var ch = cursor.ch;
2400
2519
  var lineText = cm.getLine(line);
2401
2520
  var symbol;
2402
- do {
2403
- symbol = lineText.charAt(ch++);
2521
+ for (; ch < lineText.length; ch++) {
2522
+ symbol = lineText.charAt(ch);
2404
2523
  if (symbol && isMatchableSymbol(symbol)) {
2405
- var style = cm.getTokenTypeAt(Pos(line, ch));
2524
+ var style = cm.getTokenTypeAt(Pos(line, ch + 1));
2406
2525
  if (style !== "string" && style !== "comment") {
2407
2526
  break;
2408
2527
  }
2409
2528
  }
2410
- } while (symbol);
2411
- if (symbol) {
2412
- var matched = cm.findMatchingBracket(Pos(line, ch));
2529
+ }
2530
+ if (ch < lineText.length) {
2531
+ var re = /[<>]/.test(lineText[ch]) ? /[(){}[\]<>]/ : /[(){}[\]]/; //ace_patch?
2532
+ var matched = cm.findMatchingBracket(Pos(line, ch+1), {bracketRegex: re});
2413
2533
  return matched.to;
2414
2534
  } else {
2415
2535
  return cursor;
@@ -2429,8 +2549,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
2429
2549
  textObjectManipulation: function(cm, head, motionArgs, vim) {
2430
2550
  var mirroredPairs = {'(': ')', ')': '(',
2431
2551
  '{': '}', '}': '{',
2432
- '[': ']', ']': '['};
2433
- var selfPaired = {'\'': true, '"': true};
2552
+ '[': ']', ']': '[',
2553
+ '<': '>', '>': '<'};
2554
+ var selfPaired = {'\'': true, '"': true, '`': true};
2434
2555
 
2435
2556
  var character = motionArgs.selectedCharacter;
2436
2557
  if (character == 'b') {
@@ -2473,7 +2594,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
2473
2594
  },
2474
2595
 
2475
2596
  repeatLastCharacterSearch: function(cm, head, motionArgs) {
2476
- var lastSearch = vimGlobalState.lastChararacterSearch;
2597
+ var lastSearch = vimGlobalState.lastCharacterSearch;
2477
2598
  var repeat = motionArgs.repeat;
2478
2599
  var forward = motionArgs.forward === lastSearch.forward;
2479
2600
  var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);
@@ -2504,10 +2625,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
2504
2625
  change: function(cm, args, ranges) {
2505
2626
  var finalHead, text;
2506
2627
  var vim = cm.state.vim;
2507
- vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock = vim.visualBlock;
2628
+ var anchor = ranges[0].anchor,
2629
+ head = ranges[0].head;
2508
2630
  if (!vim.visualMode) {
2509
- var anchor = ranges[0].anchor,
2510
- head = ranges[0].head;
2511
2631
  text = cm.getRange(anchor, head);
2512
2632
  var lastState = vim.lastEditInputState || {};
2513
2633
  if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) {
@@ -2532,6 +2652,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
2532
2652
  anchor.ch = Number.MAX_VALUE;
2533
2653
  }
2534
2654
  finalHead = anchor;
2655
+ } else if (args.fullLine) {
2656
+ head.ch = Number.MAX_VALUE;
2657
+ head.line--;
2658
+ cm.setSelection(anchor, head)
2659
+ text = cm.getSelection();
2660
+ cm.replaceSelection("");
2661
+ finalHead = anchor;
2535
2662
  } else {
2536
2663
  text = cm.getSelection();
2537
2664
  var replacement = fillArray('', ranges.length);
@@ -2574,7 +2701,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
2574
2701
  vimGlobalState.registerController.pushText(
2575
2702
  args.registerName, 'delete', text,
2576
2703
  args.linewise, vim.visualBlock);
2577
- return clipCursorToContent(cm, finalHead);
2704
+ var includeLineBreak = vim.insertMode
2705
+ return clipCursorToContent(cm, finalHead, includeLineBreak);
2578
2706
  },
2579
2707
  indent: function(cm, args, ranges) {
2580
2708
  var vim = cm.state.vim;
@@ -2593,6 +2721,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
2593
2721
  }
2594
2722
  return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);
2595
2723
  },
2724
+ indentAuto: function(cm, _args, ranges) {
2725
+ cm.execCommand("indentAuto");
2726
+ return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);
2727
+ },
2596
2728
  changeCase: function(cm, args, ranges, oldAnchor, newHead) {
2597
2729
  var selections = cm.getSelections();
2598
2730
  var swapped = [];
@@ -2700,9 +2832,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
2700
2832
  switch (actionArgs.position) {
2701
2833
  case 'center': y = y - (height / 2) + lineHeight;
2702
2834
  break;
2703
- case 'bottom': y = y - height + lineHeight*1.4;
2704
- break;
2705
- case 'top': y = y + lineHeight*0.4;
2835
+ case 'bottom': y = y - height + lineHeight;
2706
2836
  break;
2707
2837
  }
2708
2838
  cm.scrollTo(null, y);
@@ -2713,6 +2843,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
2713
2843
  var macroModeState = vimGlobalState.macroModeState;
2714
2844
  if (registerName == '@') {
2715
2845
  registerName = macroModeState.latestRegister;
2846
+ } else {
2847
+ macroModeState.latestRegister = registerName;
2716
2848
  }
2717
2849
  while(repeat--){
2718
2850
  executeMacroRegister(cm, vim, macroModeState, registerName);
@@ -2721,7 +2853,20 @@ dom.importCssString(".normal-mode .ace_cursor{\
2721
2853
  enterMacroRecordMode: function(cm, actionArgs) {
2722
2854
  var macroModeState = vimGlobalState.macroModeState;
2723
2855
  var registerName = actionArgs.selectedCharacter;
2724
- macroModeState.enterMacroRecordMode(cm, registerName);
2856
+ if (vimGlobalState.registerController.isValidRegister(registerName)) {
2857
+ macroModeState.enterMacroRecordMode(cm, registerName);
2858
+ }
2859
+ },
2860
+ toggleOverwrite: function(cm) {
2861
+ if (!cm.state.overwrite) {
2862
+ cm.toggleOverwrite(true);
2863
+ cm.setOption('keyMap', 'vim-replace');
2864
+ CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"});
2865
+ } else {
2866
+ cm.toggleOverwrite(false);
2867
+ cm.setOption('keyMap', 'vim-insert');
2868
+ CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"});
2869
+ }
2725
2870
  },
2726
2871
  enterInsertMode: function(cm, actionArgs, vim) {
2727
2872
  if (cm.getOption('readOnly')) { return; }
@@ -2733,11 +2878,15 @@ dom.importCssString(".normal-mode .ace_cursor{\
2733
2878
  var height = cm.listSelections().length;
2734
2879
  if (insertAt == 'eol') {
2735
2880
  head = Pos(head.line, lineLength(cm, head.line));
2881
+ } else if (insertAt == 'bol') {
2882
+ head = Pos(head.line, 0);
2736
2883
  } else if (insertAt == 'charAfter') {
2737
2884
  head = offsetCursor(head, 0, 1);
2738
2885
  } else if (insertAt == 'firstNonBlank') {
2739
2886
  head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head);
2740
2887
  } else if (insertAt == 'startOfSelectedArea') {
2888
+ if (!vim.visualMode)
2889
+ return;
2741
2890
  if (!vim.visualBlock) {
2742
2891
  if (sel.head.line < sel.anchor.line) {
2743
2892
  head = sel.head;
@@ -2751,6 +2900,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
2751
2900
  height = Math.abs(sel.head.line - sel.anchor.line) + 1;
2752
2901
  }
2753
2902
  } else if (insertAt == 'endOfSelectedArea') {
2903
+ if (!vim.visualMode)
2904
+ return;
2754
2905
  if (!vim.visualBlock) {
2755
2906
  if (sel.head.line >= sel.anchor.line) {
2756
2907
  head = offsetCursor(sel.head, 0, 1);
@@ -2767,14 +2918,16 @@ dom.importCssString(".normal-mode .ace_cursor{\
2767
2918
  if (vim.visualMode){
2768
2919
  return;
2769
2920
  }
2921
+ } else if (insertAt == 'lastEdit') {
2922
+ head = getLastEditPos(cm) || head;
2770
2923
  }
2771
- cm.setOption('keyMap', 'vim-insert');
2772
2924
  cm.setOption('disableInput', false);
2773
2925
  if (actionArgs && actionArgs.replace) {
2774
2926
  cm.toggleOverwrite(true);
2775
2927
  cm.setOption('keyMap', 'vim-replace');
2776
2928
  CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"});
2777
2929
  } else {
2930
+ cm.toggleOverwrite(false);
2778
2931
  cm.setOption('keyMap', 'vim-insert');
2779
2932
  CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"});
2780
2933
  }
@@ -2866,7 +3019,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
2866
3019
  var tmp = Pos(curStart.line + 1,
2867
3020
  lineLength(cm, curStart.line + 1));
2868
3021
  var text = cm.getRange(curStart, tmp);
2869
- text = text.replace(/\n\s*/g, ' ');
3022
+ text = actionArgs.keepSpaces
3023
+ ? text.replace(/\n\r?/g, '')
3024
+ : text.replace(/\n\s*/g, ' ');
2870
3025
  cm.replaceRange(text, curStart, tmp);
2871
3026
  }
2872
3027
  var curFinalPos = Pos(curStart.line, finalCh);
@@ -2932,7 +3087,17 @@ dom.importCssString(".normal-mode .ace_cursor{\
2932
3087
  }
2933
3088
  var linewise = register.linewise;
2934
3089
  var blockwise = register.blockwise;
2935
- if (linewise && !blockwise) {
3090
+ if (blockwise) {
3091
+ text = text.split('\n');
3092
+ if (linewise) {
3093
+ text.pop();
3094
+ }
3095
+ for (var i = 0; i < text.length; i++) {
3096
+ text[i] = (text[i] == '') ? ' ' : text[i];
3097
+ }
3098
+ cur.ch += actionArgs.after ? 1 : 0;
3099
+ cur.ch = Math.min(lineLength(cm, cur.line), cur.ch);
3100
+ } else if (linewise) {
2936
3101
  if(vim.visualMode) {
2937
3102
  text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n';
2938
3103
  } else if (actionArgs.after) {
@@ -2942,12 +3107,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
2942
3107
  cur.ch = 0;
2943
3108
  }
2944
3109
  } else {
2945
- if (blockwise) {
2946
- text = text.split('\n');
2947
- for (var i = 0; i < text.length; i++) {
2948
- text[i] = (text[i] == '') ? ' ' : text[i];
2949
- }
2950
- }
2951
3110
  cur.ch += actionArgs.after ? 1 : 0;
2952
3111
  }
2953
3112
  var curPosFinal;
@@ -3088,25 +3247,32 @@ dom.importCssString(".normal-mode .ace_cursor{\
3088
3247
  incrementNumberToken: function(cm, actionArgs) {
3089
3248
  var cur = cm.getCursor();
3090
3249
  var lineStr = cm.getLine(cur.line);
3091
- var re = /-?\d+/g;
3250
+ var re = /(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi;
3092
3251
  var match;
3093
3252
  var start;
3094
3253
  var end;
3095
3254
  var numberStr;
3096
- var token;
3097
3255
  while ((match = re.exec(lineStr)) !== null) {
3098
- token = match[0];
3099
3256
  start = match.index;
3100
- end = start + token.length;
3257
+ end = start + match[0].length;
3101
3258
  if (cur.ch < end)break;
3102
3259
  }
3103
3260
  if (!actionArgs.backtrack && (end <= cur.ch))return;
3104
- if (token) {
3261
+ if (match) {
3262
+ var baseStr = match[2] || match[4]
3263
+ var digits = match[3] || match[5]
3105
3264
  var increment = actionArgs.increase ? 1 : -1;
3106
- var number = parseInt(token) + (increment * actionArgs.repeat);
3265
+ var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()];
3266
+ var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat);
3267
+ numberStr = number.toString(base);
3268
+ var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : ''
3269
+ if (numberStr.charAt(0) === '-') {
3270
+ numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1);
3271
+ } else {
3272
+ numberStr = baseStr + zeroPadding + numberStr;
3273
+ }
3107
3274
  var from = Pos(cur.line, start);
3108
3275
  var to = Pos(cur.line, end);
3109
- numberStr = number.toString();
3110
3276
  cm.replaceRange(numberStr, from, to);
3111
3277
  } else {
3112
3278
  return;
@@ -3124,6 +3290,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
3124
3290
  }
3125
3291
  repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);
3126
3292
  },
3293
+ indent: function(cm, actionArgs) {
3294
+ cm.indentLine(cm.getCursor().line, actionArgs.indentRight);
3295
+ },
3127
3296
  exitInsertMode: exitInsertMode
3128
3297
  };
3129
3298
 
@@ -3153,12 +3322,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
3153
3322
  }
3154
3323
  return Pos(cur.line + offsetLine, cur.ch + offsetCh);
3155
3324
  }
3156
- function getOffset(anchor, head) {
3157
- return {
3158
- line: head.line - anchor.line,
3159
- ch: head.line - anchor.line
3160
- };
3161
- }
3162
3325
  function commandMatches(keys, keyMap, context, inputState) {
3163
3326
  var match, partial = [], full = [];
3164
3327
  for (var i = 0; i < keyMap.length; i++) {
@@ -3188,7 +3351,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
3188
3351
  }
3189
3352
  }
3190
3353
  function lastChar(keys) {
3191
- var match = /^.*(<[\w\-]+>)$/.exec(keys);
3354
+ var match = /^.*(<[^>]+>)$/.exec(keys);
3192
3355
  var selectedCharacter = match ? match[1] : keys.slice(-1);
3193
3356
  if (selectedCharacter.length > 1){
3194
3357
  switch(selectedCharacter){
@@ -3199,6 +3362,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
3199
3362
  selectedCharacter=' ';
3200
3363
  break;
3201
3364
  default:
3365
+ selectedCharacter='';
3202
3366
  break;
3203
3367
  }
3204
3368
  }
@@ -3292,7 +3456,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
3292
3456
  var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)};
3293
3457
  selections.push(range);
3294
3458
  }
3295
- primIndex = head.line == lastLine ? selections.length - 1 : 0;
3296
3459
  cm.setSelections(selections);
3297
3460
  selectionEnd.ch = headCh;
3298
3461
  base.ch = baseCh;
@@ -3554,9 +3717,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
3554
3717
  }
3555
3718
 
3556
3719
  function recordLastCharacterSearch(increment, args) {
3557
- vimGlobalState.lastChararacterSearch.increment = increment;
3558
- vimGlobalState.lastChararacterSearch.forward = args.forward;
3559
- vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;
3720
+ vimGlobalState.lastCharacterSearch.increment = increment;
3721
+ vimGlobalState.lastCharacterSearch.forward = args.forward;
3722
+ vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter;
3560
3723
  }
3561
3724
 
3562
3725
  var symbolToMode = {
@@ -3730,7 +3893,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
3730
3893
  line = cm.getLine(lineNum);
3731
3894
  pos = (dir > 0) ? 0 : line.length;
3732
3895
  }
3733
- throw new Error('The impossible happened.');
3734
3896
  }
3735
3897
  function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) {
3736
3898
  var curStart = copyCursor(cur);
@@ -3872,22 +4034,160 @@ dom.importCssString(".normal-mode .ace_cursor{\
3872
4034
  start = new Pos(i, 0);
3873
4035
  return { start: start, end: end };
3874
4036
  }
4037
+
4038
+ function findSentence(cm, cur, repeat, dir) {
4039
+ function nextChar(cm, idx) {
4040
+ if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) {
4041
+ idx.ln += idx.dir;
4042
+ if (!isLine(cm, idx.ln)) {
4043
+ idx.line = null;
4044
+ idx.ln = null;
4045
+ idx.pos = null;
4046
+ return;
4047
+ }
4048
+ idx.line = cm.getLine(idx.ln);
4049
+ idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1;
4050
+ }
4051
+ else {
4052
+ idx.pos += idx.dir;
4053
+ }
4054
+ }
4055
+ function forward(cm, ln, pos, dir) {
4056
+ var line = cm.getLine(ln);
4057
+ var stop = (line === "");
4058
+
4059
+ var curr = {
4060
+ line: line,
4061
+ ln: ln,
4062
+ pos: pos,
4063
+ dir: dir,
4064
+ }
4065
+
4066
+ var last_valid = {
4067
+ ln: curr.ln,
4068
+ pos: curr.pos,
4069
+ }
4070
+
4071
+ var skip_empty_lines = (curr.line === "");
4072
+ nextChar(cm, curr);
4073
+
4074
+ while (curr.line !== null) {
4075
+ last_valid.ln = curr.ln;
4076
+ last_valid.pos = curr.pos;
4077
+
4078
+ if (curr.line === "" && !skip_empty_lines) {
4079
+ return { ln: curr.ln, pos: curr.pos, };
4080
+ }
4081
+ else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) {
4082
+ return { ln: curr.ln, pos: curr.pos, };
4083
+ }
4084
+ else if (isEndOfSentenceSymbol(curr.line[curr.pos])
4085
+ && !stop
4086
+ && (curr.pos === curr.line.length - 1
4087
+ || isWhiteSpaceString(curr.line[curr.pos + 1]))) {
4088
+ stop = true;
4089
+ }
4090
+
4091
+ nextChar(cm, curr);
4092
+ }
4093
+ var line = cm.getLine(last_valid.ln);
4094
+ last_valid.pos = 0;
4095
+ for(var i = line.length - 1; i >= 0; --i) {
4096
+ if (!isWhiteSpaceString(line[i])) {
4097
+ last_valid.pos = i;
4098
+ break;
4099
+ }
4100
+ }
4101
+
4102
+ return last_valid;
4103
+
4104
+ }
4105
+ function reverse(cm, ln, pos, dir) {
4106
+ var line = cm.getLine(ln);
4107
+
4108
+ var curr = {
4109
+ line: line,
4110
+ ln: ln,
4111
+ pos: pos,
4112
+ dir: dir,
4113
+ }
4114
+
4115
+ var last_valid = {
4116
+ ln: curr.ln,
4117
+ pos: null,
4118
+ };
4119
+
4120
+ var skip_empty_lines = (curr.line === "");
4121
+ nextChar(cm, curr);
4122
+
4123
+ while (curr.line !== null) {
4124
+
4125
+ if (curr.line === "" && !skip_empty_lines) {
4126
+ if (last_valid.pos !== null) {
4127
+ return last_valid;
4128
+ }
4129
+ else {
4130
+ return { ln: curr.ln, pos: curr.pos };
4131
+ }
4132
+ }
4133
+ else if (isEndOfSentenceSymbol(curr.line[curr.pos])
4134
+ && last_valid.pos !== null
4135
+ && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) {
4136
+ return last_valid;
4137
+ }
4138
+ else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) {
4139
+ skip_empty_lines = false;
4140
+ last_valid = { ln: curr.ln, pos: curr.pos }
4141
+ }
4142
+
4143
+ nextChar(cm, curr);
4144
+ }
4145
+ var line = cm.getLine(last_valid.ln);
4146
+ last_valid.pos = 0;
4147
+ for(var i = 0; i < line.length; ++i) {
4148
+ if (!isWhiteSpaceString(line[i])) {
4149
+ last_valid.pos = i;
4150
+ break;
4151
+ }
4152
+ }
4153
+ return last_valid;
4154
+ }
4155
+
4156
+ var curr_index = {
4157
+ ln: cur.line,
4158
+ pos: cur.ch,
4159
+ };
4160
+
4161
+ while (repeat > 0) {
4162
+ if (dir < 0) {
4163
+ curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);
4164
+ }
4165
+ else {
4166
+ curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);
4167
+ }
4168
+ repeat--;
4169
+ }
4170
+
4171
+ return Pos(curr_index.ln, curr_index.pos);
4172
+ }
3875
4173
  function selectCompanionObject(cm, head, symb, inclusive) {
3876
4174
  var cur = head, start, end;
3877
4175
 
3878
4176
  var bracketRegexp = ({
3879
4177
  '(': /[()]/, ')': /[()]/,
3880
4178
  '[': /[[\]]/, ']': /[[\]]/,
3881
- '{': /[{}]/, '}': /[{}]/})[symb];
4179
+ '{': /[{}]/, '}': /[{}]/,
4180
+ '<': /[<>]/, '>': /[<>]/})[symb];
3882
4181
  var openSym = ({
3883
4182
  '(': '(', ')': '(',
3884
4183
  '[': '[', ']': '[',
3885
- '{': '{', '}': '{'})[symb];
4184
+ '{': '{', '}': '{',
4185
+ '<': '<', '>': '<'})[symb];
3886
4186
  var curChar = cm.getLine(cur.line).charAt(cur.ch);
3887
4187
  var offset = curChar === openSym ? 1 : 0;
3888
4188
 
3889
- start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp});
3890
- end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp});
4189
+ start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp});
4190
+ end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp});
3891
4191
 
3892
4192
  if (!start || !end) {
3893
4193
  return { start: cur, end: cur };
@@ -3988,14 +4288,27 @@ dom.importCssString(".normal-mode .ace_cursor{\
3988
4288
  if (cm.openDialog) {
3989
4289
  cm.openDialog(template, onClose, { bottom: true, value: options.value,
3990
4290
  onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp,
3991
- selectValueOnOpen: false});
4291
+ selectValueOnOpen: false, onClose: function() {
4292
+ if (cm.state.vim) {
4293
+ cm.state.vim.status = "";
4294
+ cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR);
4295
+ }
4296
+ }});
3992
4297
  }
3993
4298
  else {
3994
4299
  onClose(prompt(shortText, ''));
3995
4300
  }
3996
4301
  }
3997
4302
  function splitBySlash(argString) {
3998
- var slashes = findUnescapedSlashes(argString) || [];
4303
+ return splitBySeparator(argString, '/');
4304
+ }
4305
+
4306
+ function findUnescapedSlashes(argString) {
4307
+ return findUnescapedSeparators(argString, '/');
4308
+ }
4309
+
4310
+ function splitBySeparator(argString, separator) {
4311
+ var slashes = findUnescapedSeparators(argString, separator) || [];
3999
4312
  if (!slashes.length) return [];
4000
4313
  var tokens = [];
4001
4314
  if (slashes[0] !== 0) return;
@@ -4006,12 +4319,15 @@ dom.importCssString(".normal-mode .ace_cursor{\
4006
4319
  return tokens;
4007
4320
  }
4008
4321
 
4009
- function findUnescapedSlashes(str) {
4322
+ function findUnescapedSeparators(str, separator) {
4323
+ if (!separator)
4324
+ separator = '/';
4325
+
4010
4326
  var escapeNextChar = false;
4011
4327
  var slashes = [];
4012
4328
  for (var i = 0; i < str.length; i++) {
4013
4329
  var c = str.charAt(i);
4014
- if (!escapeNextChar && c == '/') {
4330
+ if (!escapeNextChar && c == separator) {
4015
4331
  slashes.push(i);
4016
4332
  }
4017
4333
  escapeNextChar = !escapeNextChar && (c == '\\');
@@ -4143,17 +4459,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
4143
4459
  }
4144
4460
  }
4145
4461
  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
- }
4462
+ var raw = '<span style="font-family: monospace; white-space: pre">' +
4463
+ (prefix || "") + '<input type="text" autocorrect="off" autocapitalize="none" autocomplete="off"></span>';
4464
+ if (desc)
4465
+ raw += ' <span style="color: #888">' + desc + '</span>';
4157
4466
  return raw;
4158
4467
  }
4159
4468
  var searchPromptDesc = '(Javascript regexp)';
@@ -4293,6 +4602,23 @@ dom.importCssString(".normal-mode .ace_cursor{\
4293
4602
  }
4294
4603
  }
4295
4604
 
4605
+ function getMarkPos(cm, vim, markName) {
4606
+ if (markName == '\'' || markName == '`') {
4607
+ return vimGlobalState.jumpList.find(cm, -1) || Pos(0, 0);
4608
+ } else if (markName == '.') {
4609
+ return getLastEditPos(cm);
4610
+ }
4611
+
4612
+ var mark = vim.marks[markName];
4613
+ return mark && mark.find();
4614
+ }
4615
+
4616
+ function getLastEditPos(cm) {
4617
+ var undoManager = cm.ace.session.$undoManager;
4618
+ if (undoManager && undoManager.$lastDelta)
4619
+ return toCmPos(undoManager.$lastDelta.end);
4620
+ }
4621
+
4296
4622
  var ExCommandDispatcher = function() {
4297
4623
  this.buildCommandMap_();
4298
4624
  };
@@ -4387,20 +4713,35 @@ dom.importCssString(".normal-mode .ace_cursor{\
4387
4713
  }
4388
4714
  switch (inputStream.next()) {
4389
4715
  case '.':
4390
- return cm.getCursor().line;
4716
+ return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);
4391
4717
  case '$':
4392
- return cm.lastLine();
4718
+ return this.parseLineSpecOffset_(inputStream, cm.lastLine());
4393
4719
  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');
4720
+ var markName = inputStream.next();
4721
+ var markPos = getMarkPos(cm, cm.state.vim, markName);
4722
+ if (!markPos) throw new Error('Mark not set');
4723
+ return this.parseLineSpecOffset_(inputStream, markPos.line);
4724
+ case '-':
4725
+ case '+':
4726
+ inputStream.backUp(1);
4727
+ return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);
4399
4728
  default:
4400
4729
  inputStream.backUp(1);
4401
4730
  return undefined;
4402
4731
  }
4403
4732
  },
4733
+ parseLineSpecOffset_: function(inputStream, line) {
4734
+ var offsetMatch = inputStream.match(/^([+-])?(\d+)/);
4735
+ if (offsetMatch) {
4736
+ var offset = parseInt(offsetMatch[2], 10);
4737
+ if (offsetMatch[1] == "-") {
4738
+ line -= offset;
4739
+ } else {
4740
+ line += offset;
4741
+ }
4742
+ }
4743
+ return line;
4744
+ },
4404
4745
  parseCommandArgs_: function(inputStream, params, command) {
4405
4746
  if (inputStream.eol()) {
4406
4747
  return;
@@ -4456,16 +4797,15 @@ dom.importCssString(".normal-mode .ace_cursor{\
4456
4797
  var mapping = {
4457
4798
  keys: lhs,
4458
4799
  type: 'keyToEx',
4459
- exArgs: { input: rhs.substring(1) },
4460
- user: true};
4800
+ exArgs: { input: rhs.substring(1) }
4801
+ };
4461
4802
  if (ctx) { mapping.context = ctx; }
4462
4803
  defaultKeymap.unshift(mapping);
4463
4804
  } else {
4464
4805
  var mapping = {
4465
4806
  keys: lhs,
4466
4807
  type: 'keyToKey',
4467
- toKeys: rhs,
4468
- user: true
4808
+ toKeys: rhs
4469
4809
  };
4470
4810
  if (ctx) { mapping.context = ctx; }
4471
4811
  defaultKeymap.unshift(mapping);
@@ -4484,8 +4824,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
4484
4824
  var keys = lhs;
4485
4825
  for (var i = 0; i < defaultKeymap.length; i++) {
4486
4826
  if (keys == defaultKeymap[i].keys
4487
- && defaultKeymap[i].context === ctx
4488
- && defaultKeymap[i].user) {
4827
+ && defaultKeymap[i].context === ctx) {
4489
4828
  defaultKeymap.splice(i, 1);
4490
4829
  return;
4491
4830
  }
@@ -4563,13 +4902,18 @@ dom.importCssString(".normal-mode .ace_cursor{\
4563
4902
  }
4564
4903
  if (!optionIsBoolean && value === undefined || forceGet) {
4565
4904
  var oldValue = getOption(optionName, cm, setCfg);
4566
- if (oldValue === true || oldValue === false) {
4905
+ if (oldValue instanceof Error) {
4906
+ showConfirm(cm, oldValue.message);
4907
+ } else if (oldValue === true || oldValue === false) {
4567
4908
  showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);
4568
4909
  } else {
4569
4910
  showConfirm(cm, ' ' + optionName + '=' + oldValue);
4570
4911
  }
4571
4912
  } else {
4572
- setOption(optionName, value, cm, setCfg);
4913
+ var setOptionReturn = setOption(optionName, value, cm, setCfg);
4914
+ if (setOptionReturn instanceof Error) {
4915
+ showConfirm(cm, setOptionReturn.message);
4916
+ }
4573
4917
  }
4574
4918
  },
4575
4919
  setlocal: function (cm, params) {
@@ -4606,25 +4950,27 @@ dom.importCssString(".normal-mode .ace_cursor{\
4606
4950
  showConfirm(cm, regInfo);
4607
4951
  },
4608
4952
  sort: function(cm, params) {
4609
- var reverse, ignoreCase, unique, number;
4953
+ var reverse, ignoreCase, unique, number, pattern;
4610
4954
  function parseArgs() {
4611
4955
  if (params.argString) {
4612
4956
  var args = new CodeMirror.StringStream(params.argString);
4613
4957
  if (args.eat('!')) { reverse = true; }
4614
4958
  if (args.eol()) { return; }
4615
4959
  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;
4960
+ var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/);
4961
+ if (!opts && !args.eol()) { return 'Invalid arguments'; }
4962
+ if (opts[1]) {
4963
+ ignoreCase = opts[1].indexOf('i') != -1;
4964
+ unique = opts[1].indexOf('u') != -1;
4965
+ var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1;
4966
+ var hex = opts[1].indexOf('x') != -1 && 1;
4967
+ var octal = opts[1].indexOf('o') != -1 && 1;
4624
4968
  if (decimal + hex + octal > 1) { return 'Invalid arguments'; }
4625
4969
  number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';
4626
4970
  }
4627
- if (args.match(/\/.*\//)) { return 'patterns not supported'; }
4971
+ if (opts[2]) {
4972
+ pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : '');
4973
+ }
4628
4974
  }
4629
4975
  }
4630
4976
  var err = parseArgs();
@@ -4638,14 +4984,18 @@ dom.importCssString(".normal-mode .ace_cursor{\
4638
4984
  var curStart = Pos(lineStart, 0);
4639
4985
  var curEnd = Pos(lineEnd, lineLength(cm, lineEnd));
4640
4986
  var text = cm.getRange(curStart, curEnd).split('\n');
4641
- var numberRegex = (number == 'decimal') ? /(-?)([\d]+)/ :
4987
+ var numberRegex = pattern ? pattern :
4988
+ (number == 'decimal') ? /(-?)([\d]+)/ :
4642
4989
  (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :
4643
4990
  (number == 'octal') ? /([0-7]+)/ : null;
4644
4991
  var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;
4645
4992
  var numPart = [], textPart = [];
4646
- if (number) {
4993
+ if (number || pattern) {
4647
4994
  for (var i = 0; i < text.length; i++) {
4648
- if (numberRegex.exec(text[i])) {
4995
+ var matchPart = pattern ? text[i].match(pattern) : null;
4996
+ if (matchPart && matchPart[0] != '') {
4997
+ numPart.push(matchPart);
4998
+ } else if (!pattern && numberRegex.exec(text[i])) {
4649
4999
  numPart.push(text[i]);
4650
5000
  } else {
4651
5001
  textPart.push(text[i]);
@@ -4664,8 +5014,17 @@ dom.importCssString(".normal-mode .ace_cursor{\
4664
5014
  bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);
4665
5015
  return anum - bnum;
4666
5016
  }
4667
- numPart.sort(compareFn);
4668
- textPart.sort(compareFn);
5017
+ function comparePatternFn(a, b) {
5018
+ if (reverse) { var tmp; tmp = a; a = b; b = tmp; }
5019
+ if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); }
5020
+ return (a[0] < b[0]) ? -1 : 1;
5021
+ }
5022
+ numPart.sort(pattern ? comparePatternFn : compareFn);
5023
+ if (pattern) {
5024
+ for (var i = 0; i < numPart.length; i++) {
5025
+ numPart[i] = numPart[i].input;
5026
+ }
5027
+ } else if (!number) { textPart.sort(compareFn); }
4669
5028
  text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);
4670
5029
  if (unique) { // Remove duplicate lines
4671
5030
  var textOld = text;
@@ -4734,16 +5093,23 @@ dom.importCssString(".normal-mode .ace_cursor{\
4734
5093
  'any other getSearchCursor implementation.');
4735
5094
  }
4736
5095
  var argString = params.argString;
4737
- var tokens = argString ? splitBySlash(argString) : [];
5096
+ var tokens = argString ? splitBySeparator(argString, argString[0]) : [];
4738
5097
  var regexPart, replacePart = '', trailing, flagsPart, count;
4739
5098
  var confirm = false; // Whether to confirm each replace.
4740
5099
  var global = false; // True to replace all instances on a line, false to replace only 1.
4741
5100
  if (tokens.length) {
4742
5101
  regexPart = tokens[0];
5102
+ if (getOption('pcre') && regexPart !== '') {
5103
+ regexPart = new RegExp(regexPart).source; //normalize not escaped characters
5104
+ }
4743
5105
  replacePart = tokens[1];
5106
+ if (regexPart && regexPart[regexPart.length - 1] === '$') {
5107
+ regexPart = regexPart.slice(0, regexPart.length - 1) + '\\n';
5108
+ replacePart = replacePart ? replacePart + '\n' : '\n';
5109
+ }
4744
5110
  if (replacePart !== undefined) {
4745
5111
  if (getOption('pcre')) {
4746
- replacePart = unescapeRegexReplace(replacePart);
5112
+ replacePart = unescapeRegexReplace(replacePart.replace(/([^\\])&/g,"$1$$&"));
4747
5113
  } else {
4748
5114
  replacePart = translateRegexReplace(replacePart);
4749
5115
  }
@@ -4769,7 +5135,11 @@ dom.importCssString(".normal-mode .ace_cursor{\
4769
5135
  global = true;
4770
5136
  flagsPart.replace('g', '');
4771
5137
  }
4772
- regexPart = regexPart + '/' + flagsPart;
5138
+ if (getOption('pcre')) {
5139
+ regexPart = regexPart + '/' + flagsPart;
5140
+ } else {
5141
+ regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart;
5142
+ }
4773
5143
  }
4774
5144
  }
4775
5145
  if (regexPart) {
@@ -4806,13 +5176,20 @@ dom.importCssString(".normal-mode .ace_cursor{\
4806
5176
  write: function(cm) {
4807
5177
  if (CodeMirror.commands.save) {
4808
5178
  CodeMirror.commands.save(cm);
4809
- } else {
5179
+ } else if (cm.save) {
4810
5180
  cm.save();
4811
5181
  }
4812
5182
  },
4813
5183
  nohlsearch: function(cm) {
4814
5184
  clearSearchHighlight(cm);
4815
5185
  },
5186
+ yank: function (cm) {
5187
+ var cur = copyCursor(cm.getCursor());
5188
+ var line = cur.line;
5189
+ var lineText = cm.getLine(line);
5190
+ vimGlobalState.registerController.pushText(
5191
+ '0', 'yank', lineText, true, true);
5192
+ },
4816
5193
  delmarks: function(cm, params) {
4817
5194
  if (!params.argString || !trim(params.argString)) {
4818
5195
  showConfirm(cm, 'Argument required');
@@ -4961,21 +5338,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
4961
5338
  var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');
4962
5339
  var isPlaying = macroModeState.isPlaying;
4963
5340
  var lastChange = macroModeState.lastInsertModeChanges;
4964
- var text = [];
4965
5341
  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
5342
  cm.off('change', onChange);
4980
5343
  CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);
4981
5344
  }
@@ -4989,8 +5352,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
4989
5352
  cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);
4990
5353
  cm.setOption('keyMap', 'vim');
4991
5354
  cm.setOption('disableInput', true);
4992
-
4993
- lastChange.overwrite = cm.state.overwrite;
4994
5355
  cm.toggleOverwrite(false); // exit replace mode if we were in it.
4995
5356
  insertModeChangeRegister.setText(lastChange.changes.join(''));
4996
5357
  CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
@@ -5014,13 +5375,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
5014
5375
  defineOption('insertModeEscKeysTimeout', 200, 'number');
5015
5376
 
5016
5377
  CodeMirror.keyMap['vim-insert'] = {
5017
- 'Ctrl-N': 'autocomplete',
5018
- 'Ctrl-P': 'autocomplete',
5019
- 'Enter': function(cm) {
5020
- var fn = CodeMirror.commands.newlineAndIndentContinueComment ||
5021
- CodeMirror.commands.newlineAndIndent;
5022
- fn(cm);
5023
- },
5024
5378
  fallthrough: ['default'],
5025
5379
  attach: attachVimMap,
5026
5380
  detach: detachVimMap,
@@ -5094,20 +5448,31 @@ dom.importCssString(".normal-mode .ace_cursor{\
5094
5448
  register.pushSearchQuery(query);
5095
5449
  }
5096
5450
  }
5097
- function onChange(_cm, changeObj) {
5451
+ function onChange(cm, changeObj) {
5098
5452
  var macroModeState = vimGlobalState.macroModeState;
5099
5453
  var lastChange = macroModeState.lastInsertModeChanges;
5100
5454
  if (!macroModeState.isPlaying) {
5101
5455
  while(changeObj) {
5102
5456
  lastChange.expectCursorActivityForChange = true;
5103
- if (changeObj.origin == '+input' || changeObj.origin == 'paste'
5457
+ if (lastChange.ignoreCount > 1) {
5458
+ lastChange.ignoreCount--;
5459
+ } else if (changeObj.origin == '+input' || changeObj.origin == 'paste'
5104
5460
  || changeObj.origin === undefined /* only in testing */) {
5461
+ var selectionCount = cm.listSelections().length;
5462
+ if (selectionCount > 1)
5463
+ lastChange.ignoreCount = selectionCount;
5105
5464
  var text = changeObj.text.join('\n');
5106
5465
  if (lastChange.maybeReset) {
5107
5466
  lastChange.changes = [];
5108
5467
  lastChange.maybeReset = false;
5109
5468
  }
5110
- lastChange.changes.push(text);
5469
+ if (text) {
5470
+ if (cm.state.overwrite && !/\n/.test(text)) {
5471
+ lastChange.changes.push([text]);
5472
+ } else {
5473
+ lastChange.changes.push(text);
5474
+ }
5475
+ }
5111
5476
  }
5112
5477
  changeObj = changeObj.next;
5113
5478
  }
@@ -5140,7 +5505,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5140
5505
  }
5141
5506
  vim.fakeCursor = cm.markText(from, to, {className: 'cm-animate-fat-cursor'});
5142
5507
  }
5143
- function handleExternalSelection(cm, vim) {
5508
+ function handleExternalSelection(cm, vim, keepHPos) {
5144
5509
  var anchor = cm.getCursor('anchor');
5145
5510
  var head = cm.getCursor('head');
5146
5511
  if (vim.visualMode && !cm.somethingSelected()) {
@@ -5161,7 +5526,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5161
5526
  };
5162
5527
  updateMark(cm, vim, '<', cursorMin(head, anchor));
5163
5528
  updateMark(cm, vim, '>', cursorMax(head, anchor));
5164
- } else if (!vim.insertMode) {
5529
+ } else if (!vim.insertMode && !keepHPos) {
5165
5530
  vim.lastHPos = cm.getCursor().ch;
5166
5531
  }
5167
5532
  }
@@ -5201,7 +5566,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5201
5566
  if (macroModeState.lastInsertModeChanges.changes.length > 0) {
5202
5567
  repeat = !vim.lastEditActionCommand ? 1 : repeat;
5203
5568
  var changeObject = macroModeState.lastInsertModeChanges;
5204
- repeatInsertModeChanges(cm, changeObject.changes, repeat, changeObject.overwrite);
5569
+ repeatInsertModeChanges(cm, changeObject.changes, repeat);
5205
5570
  }
5206
5571
  }
5207
5572
  vim.inputState = vim.lastEditInputState;
@@ -5223,7 +5588,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5223
5588
  macroModeState.isPlaying = false;
5224
5589
  }
5225
5590
 
5226
- function repeatInsertModeChanges(cm, changes, repeat, overwrite) {
5591
+ function repeatInsertModeChanges(cm, changes, repeat) {
5227
5592
  function keyHandler(binding) {
5228
5593
  if (typeof binding == 'string') {
5229
5594
  CodeMirror.commands[binding](cm);
@@ -5233,34 +5598,31 @@ dom.importCssString(".normal-mode .ace_cursor{\
5233
5598
  return true;
5234
5599
  }
5235
5600
  var head = cm.getCursor('head');
5236
- var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock;
5237
- if (inVisualBlock) {
5238
- var vim = cm.state.vim;
5239
- var lastSel = vim.lastSelection;
5240
- var offset = getOffset(lastSel.anchor, lastSel.head);
5241
- selectForInsert(cm, head, offset.line + 1);
5601
+ var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock;
5602
+ if (visualBlock) {
5603
+ selectForInsert(cm, head, visualBlock + 1);
5242
5604
  repeat = cm.listSelections().length;
5243
5605
  cm.setCursor(head);
5244
5606
  }
5245
5607
  for (var i = 0; i < repeat; i++) {
5246
- if (inVisualBlock) {
5608
+ if (visualBlock) {
5247
5609
  cm.setCursor(offsetCursor(head, i, 0));
5248
5610
  }
5249
5611
  for (var j = 0; j < changes.length; j++) {
5250
5612
  var change = changes[j];
5251
5613
  if (change instanceof InsertModeKey) {
5252
5614
  CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler);
5253
- } else {
5615
+ } else if (typeof change == "string") {
5254
5616
  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);
5617
+ cm.replaceRange(change, cur, cur);
5618
+ } else {
5619
+ var start = cm.getCursor();
5620
+ var end = offsetCursor(start, 0, change[0].length);
5621
+ cm.replaceRange(change[0], start, end);
5260
5622
  }
5261
5623
  }
5262
5624
  }
5263
- if (inVisualBlock) {
5625
+ if (visualBlock) {
5264
5626
  cm.setCursor(offsetCursor(head, 0, 1));
5265
5627
  }
5266
5628
  }
@@ -5282,7 +5644,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
5282
5644
  var name = '';
5283
5645
  if (e.ctrlKey) { name += 'C-'; }
5284
5646
  if (e.altKey) { name += 'A-'; }
5285
- if (e.shiftKey) { name += 'S-'; }
5647
+ if ((name || key.length > 1) && e.shiftKey) { name += 'S-'; }
5286
5648
 
5287
5649
  name += key;
5288
5650
  if (name.length > 1) { name = '<' + name + '>'; }
@@ -5316,15 +5678,17 @@ dom.importCssString(".normal-mode .ace_cursor{\
5316
5678
  var isHandled = false;
5317
5679
  var vim = Vim.maybeInitVimState_(cm);
5318
5680
  var visualBlock = vim.visualBlock || vim.wasInVisualBlock;
5319
- if (vim.wasInVisualBlock && !cm.ace.inMultiSelectMode) {
5681
+
5682
+ var wasMultiselect = cm.ace.inMultiSelectMode;
5683
+ if (vim.wasInVisualBlock && !wasMultiselect) {
5320
5684
  vim.wasInVisualBlock = false;
5321
- } else if (cm.ace.inMultiSelectMode && vim.visualBlock) {
5685
+ } else if (wasMultiselect && vim.visualBlock) {
5322
5686
  vim.wasInVisualBlock = true;
5323
5687
  }
5324
5688
 
5325
- if (key == '<Esc>' && !vim.insertMode && !vim.visualMode && cm.ace.inMultiSelectMode) {
5689
+ if (key == '<Esc>' && !vim.insertMode && !vim.visualMode && wasMultiselect) {
5326
5690
  cm.ace.exitMultiSelectMode();
5327
- } else if (visualBlock || !cm.ace.inMultiSelectMode || cm.ace.inVirtualSelectionMode) {
5691
+ } else if (visualBlock || !wasMultiselect || cm.ace.inVirtualSelectionMode) {
5328
5692
  isHandled = Vim.handleKey(cm, key, origin);
5329
5693
  } else {
5330
5694
  var old = cloneVimState(vim);
@@ -5351,13 +5715,16 @@ dom.importCssString(".normal-mode .ace_cursor{\
5351
5715
  cm.curOp.cursorActivity = false;
5352
5716
  }, true);
5353
5717
  }
5718
+ if (isHandled && !vim.visualMode && !vim.insert && vim.visualMode != cm.somethingSelected()) {
5719
+ handleExternalSelection(cm, vim, true);
5720
+ }
5354
5721
  return isHandled;
5355
5722
  }
5356
5723
  exports.CodeMirror = CodeMirror;
5357
5724
  var getVim = Vim.maybeInitVimState_;
5358
5725
  exports.handler = {
5359
5726
  $id: "ace/keyboard/vim",
5360
- drawCursor: function(style, pixelPos, config, sel, session) {
5727
+ drawCursor: function(element, pixelPos, config, sel, session) {
5361
5728
  var vim = this.state.vim || {};
5362
5729
  var w = config.characterWidth;
5363
5730
  var h = config.lineHeight;
@@ -5374,17 +5741,41 @@ dom.importCssString(".normal-mode .ace_cursor{\
5374
5741
  h = h / 2;
5375
5742
  top += h;
5376
5743
  }
5377
- style.left = left + "px";
5378
- style.top = top + "px";
5379
- style.width = w + "px";
5380
- style.height = h + "px";
5744
+ dom.translate(element, left, top);
5745
+ dom.setStyle(element.style, "width", w + "px");
5746
+ dom.setStyle(element.style, "height", h + "px");
5381
5747
  },
5382
5748
  handleKeyboard: function(data, hashId, key, keyCode, e) {
5383
5749
  var editor = data.editor;
5384
5750
  var cm = editor.state.cm;
5385
5751
  var vim = getVim(cm);
5386
5752
  if (keyCode == -1) return;
5387
-
5753
+ if (!vim.insertMode) {
5754
+ if (hashId == -1) {
5755
+ if (key.charCodeAt(0) > 0xFF) {
5756
+ if (data.inputKey) {
5757
+ key = data.inputKey;
5758
+ if (key && data.inputHash == 4)
5759
+ key = key.toUpperCase();
5760
+ }
5761
+ }
5762
+ data.inputChar = key;
5763
+ }
5764
+ else if (hashId == 4 || hashId == 0) {
5765
+ if (data.inputKey == key && data.inputHash == hashId && data.inputChar) {
5766
+ key = data.inputChar;
5767
+ hashId = -1
5768
+ }
5769
+ else {
5770
+ data.inputChar = null;
5771
+ data.inputKey = key;
5772
+ data.inputHash = hashId;
5773
+ }
5774
+ }
5775
+ else {
5776
+ data.inputChar = data.inputKey = null;
5777
+ }
5778
+ }
5388
5779
  if (key == "c" && hashId == 1) { // key == "ctrl-c"
5389
5780
  if (!useragent.isMac && editor.getCopyText()) {
5390
5781
  editor.once("copy", function() {
@@ -5392,11 +5783,12 @@ dom.importCssString(".normal-mode .ace_cursor{\
5392
5783
  });
5393
5784
  return {command: "null", passEvent: true};
5394
5785
  }
5395
- } else if (!vim.insertMode) {
5396
- if (useragent.isMac && this.handleMacRepeat(data, hashId, key)) {
5397
- hashId = -1;
5398
- key = data.inputChar;
5399
- }
5786
+ }
5787
+
5788
+ if (key == "esc" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) {
5789
+ var searchState = getSearchState(cm);
5790
+ var overlay = searchState.getOverlay();
5791
+ if (overlay) cm.removeOverlay(overlay);
5400
5792
  }
5401
5793
 
5402
5794
  if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) {
@@ -5435,12 +5827,18 @@ dom.importCssString(".normal-mode .ace_cursor{\
5435
5827
  });
5436
5828
  cm.on("vim-mode-change", function() {
5437
5829
  if (cm.virtualSelectionMode()) return;
5438
- cm.ace.renderer.setStyle("normal-mode", !getVim(cm).insertMode);
5830
+ updateInputMode();
5439
5831
  cm._signal("changeStatus");
5440
5832
  });
5441
- cm.ace.renderer.setStyle("normal-mode", !getVim(cm).insertMode);
5833
+ function updateInputMode() {
5834
+ var isIntsert = getVim(cm).insertMode;
5835
+ cm.ace.renderer.setStyle("normal-mode", !isIntsert);
5836
+ editor.textInput.setCommandMode(!isIntsert);
5837
+ editor.renderer.$keepTextAreaAtCursor = isIntsert;
5838
+ editor.renderer.$blockCursor = !isIntsert;
5839
+ }
5840
+ updateInputMode();
5442
5841
  editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm);
5443
- this.updateMacCompositionHandlers(editor, true);
5444
5842
  },
5445
5843
  detach: function(editor) {
5446
5844
  var cm = editor.state.cm;
@@ -5450,7 +5848,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
5450
5848
  editor.$vimModeHandler = null;
5451
5849
  editor.renderer.$cursorLayer.drawCursor = null;
5452
5850
  editor.renderer.setStyle("normal-mode", false);
5453
- this.updateMacCompositionHandlers(editor, false);
5851
+ editor.textInput.setCommandMode(false);
5852
+ editor.renderer.$keepTextAreaAtCursor = true;
5454
5853
  },
5455
5854
  getStatusText: function(editor) {
5456
5855
  var cm = editor.state.cm;
@@ -5468,77 +5867,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
5468
5867
  if (vim.status)
5469
5868
  status += (status ? " " : "") + vim.status;
5470
5869
  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
5870
  }
5543
5871
  };
5544
5872
  Vim.defineOption({
@@ -5593,6 +5921,11 @@ dom.importCssString(".normal-mode .ace_cursor{\
5593
5921
  exports.handler.defaultKeymap = defaultKeymap;
5594
5922
  exports.handler.actions = actions;
5595
5923
  exports.Vim = Vim;
5596
-
5597
- Vim.map("Y", "yy", "normal");
5598
- });
5924
+ }); (function() {
5925
+ window.require(["ace/keyboard/vim"], function(m) {
5926
+ if (typeof module == "object" && typeof exports == "object" && module) {
5927
+ module.exports = m;
5928
+ }
5929
+ });
5930
+ })();
5931
+