ace-rails-ap 4.1.3 → 4.4

Sign up to get free protection for your applications and to get access to all the features.
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
+