@krainovsd/markdown-editor 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/lib/cjs/index-Byjf17iv.js +501 -0
  2. package/lib/cjs/index-Byjf17iv.js.map +1 -0
  3. package/lib/cjs/index-lPo-3QDL.js +1374 -0
  4. package/lib/cjs/index-lPo-3QDL.js.map +1 -0
  5. package/lib/cjs/index.js +14 -1
  6. package/lib/cjs/index.js.map +1 -1
  7. package/lib/esm/extensions/compartments/index.js +8 -0
  8. package/lib/esm/extensions/compartments/index.js.map +1 -0
  9. package/lib/esm/extensions/init-extensions.js +45 -0
  10. package/lib/esm/extensions/init-extensions.js.map +1 -0
  11. package/lib/esm/extensions/keymaps/init-key-map.js +91 -0
  12. package/lib/esm/extensions/keymaps/init-key-map.js.map +1 -0
  13. package/lib/esm/extensions/listeners/get-change-event.js +14 -0
  14. package/lib/esm/extensions/listeners/get-change-event.js.map +1 -0
  15. package/lib/esm/extensions/listeners/get-focus-event.js +16 -0
  16. package/lib/esm/extensions/listeners/get-focus-event.js.map +1 -0
  17. package/lib/esm/extensions/listeners/init-listeners.js +9 -0
  18. package/lib/esm/extensions/listeners/init-listeners.js.map +1 -0
  19. package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js +6 -0
  20. package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js.map +1 -0
  21. package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js +99 -0
  22. package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js.map +1 -0
  23. package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js +25 -0
  24. package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js.map +1 -0
  25. package/lib/esm/extensions/markdown/bold/bold-constants.js +5 -0
  26. package/lib/esm/extensions/markdown/bold/bold-constants.js.map +1 -0
  27. package/lib/esm/extensions/markdown/bold/bold-decoration.js +41 -0
  28. package/lib/esm/extensions/markdown/bold/bold-decoration.js.map +1 -0
  29. package/lib/esm/extensions/markdown/code/code-constants.js +6 -0
  30. package/lib/esm/extensions/markdown/code/code-constants.js.map +1 -0
  31. package/lib/esm/extensions/markdown/code/code-decoration.js +109 -0
  32. package/lib/esm/extensions/markdown/code/code-decoration.js.map +1 -0
  33. package/lib/esm/extensions/markdown/code/code-widget.js +83 -0
  34. package/lib/esm/extensions/markdown/code/code-widget.js.map +1 -0
  35. package/lib/esm/extensions/markdown/header/header-constants.js +6 -0
  36. package/lib/esm/extensions/markdown/header/header-constants.js.map +1 -0
  37. package/lib/esm/extensions/markdown/header/header-decoration.js +64 -0
  38. package/lib/esm/extensions/markdown/header/header-decoration.js.map +1 -0
  39. package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js +4 -0
  40. package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js.map +1 -0
  41. package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js +31 -0
  42. package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js.map +1 -0
  43. package/lib/esm/extensions/markdown/image/image-constants.js +8 -0
  44. package/lib/esm/extensions/markdown/image/image-constants.js.map +1 -0
  45. package/lib/esm/extensions/markdown/image/image-decoration.js +75 -0
  46. package/lib/esm/extensions/markdown/image/image-decoration.js.map +1 -0
  47. package/lib/esm/extensions/markdown/image/image-widget.js +184 -0
  48. package/lib/esm/extensions/markdown/image/image-widget.js.map +1 -0
  49. package/lib/esm/extensions/markdown/index.js +2 -0
  50. package/lib/esm/extensions/markdown/index.js.map +1 -0
  51. package/lib/esm/extensions/markdown/init-markdown.js +18 -0
  52. package/lib/esm/extensions/markdown/init-markdown.js.map +1 -0
  53. package/lib/esm/extensions/markdown/italic/italic-constants.js +5 -0
  54. package/lib/esm/extensions/markdown/italic/italic-constants.js.map +1 -0
  55. package/lib/esm/extensions/markdown/italic/italic-decoration.js +77 -0
  56. package/lib/esm/extensions/markdown/italic/italic-decoration.js.map +1 -0
  57. package/lib/esm/extensions/markdown/link/auto-link-decoration.js +24 -0
  58. package/lib/esm/extensions/markdown/link/auto-link-decoration.js.map +1 -0
  59. package/lib/esm/extensions/markdown/link/link-constants.js +10 -0
  60. package/lib/esm/extensions/markdown/link/link-constants.js.map +1 -0
  61. package/lib/esm/extensions/markdown/link/link-decoration.js +51 -0
  62. package/lib/esm/extensions/markdown/link/link-decoration.js.map +1 -0
  63. package/lib/esm/extensions/markdown/link/link-label-decoration.js +22 -0
  64. package/lib/esm/extensions/markdown/link/link-label-decoration.js.map +1 -0
  65. package/lib/esm/extensions/markdown/link/link-widget.js +144 -0
  66. package/lib/esm/extensions/markdown/link/link-widget.js.map +1 -0
  67. package/lib/esm/extensions/markdown/list/list-constants.js +7 -0
  68. package/lib/esm/extensions/markdown/list/list-constants.js.map +1 -0
  69. package/lib/esm/extensions/markdown/list/list-decoration.js +38 -0
  70. package/lib/esm/extensions/markdown/list/list-decoration.js.map +1 -0
  71. package/lib/esm/extensions/markdown/list/list-widget.js +33 -0
  72. package/lib/esm/extensions/markdown/list/list-widget.js.map +1 -0
  73. package/lib/esm/extensions/markdown/markdown-decoration.js +105 -0
  74. package/lib/esm/extensions/markdown/markdown-decoration.js.map +1 -0
  75. package/lib/esm/extensions/markdown/markdown-parser.js +6 -0
  76. package/lib/esm/extensions/markdown/markdown-parser.js.map +1 -0
  77. package/lib/esm/extensions/markdown/mention/mention-constants.js +6 -0
  78. package/lib/esm/extensions/markdown/mention/mention-constants.js.map +1 -0
  79. package/lib/esm/extensions/markdown/mention/mention-decoration.js +37 -0
  80. package/lib/esm/extensions/markdown/mention/mention-decoration.js.map +1 -0
  81. package/lib/esm/extensions/markdown/mention/mention-parser.js +25 -0
  82. package/lib/esm/extensions/markdown/mention/mention-parser.js.map +1 -0
  83. package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js +4 -0
  84. package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js.map +1 -0
  85. package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js +32 -0
  86. package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js.map +1 -0
  87. package/lib/esm/extensions/markdown/styles.module.scss.js +8 -0
  88. package/lib/esm/extensions/markdown/styles.module.scss.js.map +1 -0
  89. package/lib/esm/extensions/markdown/todo/todo-constants.js +6 -0
  90. package/lib/esm/extensions/markdown/todo/todo-constants.js.map +1 -0
  91. package/lib/esm/extensions/markdown/todo/todo-decoration.js +35 -0
  92. package/lib/esm/extensions/markdown/todo/todo-decoration.js.map +1 -0
  93. package/lib/esm/extensions/markdown/todo/todo-widget.js +51 -0
  94. package/lib/esm/extensions/markdown/todo/todo-widget.js.map +1 -0
  95. package/lib/esm/extensions/settings/init-settings.js +19 -0
  96. package/lib/esm/extensions/settings/init-settings.js.map +1 -0
  97. package/lib/esm/extensions/theme/init-theme.js +15 -0
  98. package/lib/esm/extensions/theme/init-theme.js.map +1 -0
  99. package/lib/esm/extensions/theme/theme-constants.js +17 -0
  100. package/lib/esm/extensions/theme/theme-constants.js.map +1 -0
  101. package/lib/esm/extensions/theme/themes/get-dark-theme.js +40 -0
  102. package/lib/esm/extensions/theme/themes/get-dark-theme.js.map +1 -0
  103. package/lib/esm/extensions/theme/themes/get-highlight-template.js +35 -0
  104. package/lib/esm/extensions/theme/themes/get-highlight-template.js.map +1 -0
  105. package/lib/esm/extensions/theme/themes/get-light-theme.js +40 -0
  106. package/lib/esm/extensions/theme/themes/get-light-theme.js.map +1 -0
  107. package/lib/esm/extensions/theme/themes/get-theme-template.js +69 -0
  108. package/lib/esm/extensions/theme/themes/get-theme-template.js.map +1 -0
  109. package/lib/esm/index.js +1 -1
  110. package/lib/esm/lib/utils/copy-to-clipboard.js +35 -0
  111. package/lib/esm/lib/utils/copy-to-clipboard.js.map +1 -0
  112. package/lib/esm/lib/utils/get-decoration.js +24 -0
  113. package/lib/esm/lib/utils/get-decoration.js.map +1 -0
  114. package/lib/esm/lib/utils/is-in-range.js +8 -0
  115. package/lib/esm/lib/utils/is-in-range.js.map +1 -0
  116. package/lib/esm/lib/utils/is-range-overlap.js +6 -0
  117. package/lib/esm/lib/utils/is-range-overlap.js.map +1 -0
  118. package/lib/esm/lib/utils/tick.js +22 -0
  119. package/lib/esm/lib/utils/tick.js.map +1 -0
  120. package/lib/esm/module/Editor/Editor.js +91 -0
  121. package/lib/esm/module/Editor/Editor.js.map +1 -0
  122. package/lib/esm/module/Editor/lib/init-editor-provider.js +32 -0
  123. package/lib/esm/module/Editor/lib/init-editor-provider.js.map +1 -0
  124. package/lib/esm/module/Editor/lib/init-editor-state.js +18 -0
  125. package/lib/esm/module/Editor/lib/init-editor-state.js.map +1 -0
  126. package/lib/esm/module/Editor/lib/init-editor.js +27 -0
  127. package/lib/esm/module/Editor/lib/init-editor.js.map +1 -0
  128. package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +29 -0
  129. package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
  130. package/lib/index.d.ts +137 -0
  131. package/package.json +30 -23
  132. package/lib/cjs/editor-qKPDa91b.js +0 -2
  133. package/lib/cjs/editor-qKPDa91b.js.map +0 -1
  134. package/lib/cjs/markdown_plugin-IXFRDWyN.js +0 -2
  135. package/lib/cjs/markdown_plugin-IXFRDWyN.js.map +0 -1
  136. package/lib/cjs/vendor_vim-BHa51_r7.js +0 -2
  137. package/lib/cjs/vendor_vim-BHa51_r7.js.map +0 -1
  138. package/lib/cjs/vendor_y.next-CVyX1ZQB.js +0 -2
  139. package/lib/cjs/vendor_y.next-CVyX1ZQB.js.map +0 -1
  140. package/lib/cjs/vendor_y.websocket-Dr9ojjFR.js +0 -2
  141. package/lib/cjs/vendor_y.websocket-Dr9ojjFR.js.map +0 -1
  142. package/lib/cjs/vendor_yjs-DXWp84x5.js +0 -2
  143. package/lib/cjs/vendor_yjs-DXWp84x5.js.map +0 -1
  144. package/lib/esm/editor-CLyV23xt.js +0 -2
  145. package/lib/esm/editor-CLyV23xt.js.map +0 -1
  146. package/lib/esm/markdown_plugin-DdBeaig8.js +0 -2
  147. package/lib/esm/markdown_plugin-DdBeaig8.js.map +0 -1
  148. package/lib/esm/vendor_vim-PF2jWG0J.js +0 -2
  149. package/lib/esm/vendor_vim-PF2jWG0J.js.map +0 -1
  150. package/lib/esm/vendor_y.next-B9hhKe5T.js +0 -2
  151. package/lib/esm/vendor_y.next-B9hhKe5T.js.map +0 -1
  152. package/lib/esm/vendor_y.websocket-gIpX3Cmo.js +0 -2
  153. package/lib/esm/vendor_y.websocket-gIpX3Cmo.js.map +0 -1
  154. package/lib/esm/vendor_yjs-otxZW90b.js +0 -2
  155. package/lib/esm/vendor_yjs-otxZW90b.js.map +0 -1
  156. package/tmp/app/helpers/common-test.d.ts +0 -1
  157. package/tmp/app/helpers/full-example.d.ts +0 -1
  158. package/tmp/app/helpers/index.d.ts +0 -5
  159. package/tmp/app/helpers/random-color.d.ts +0 -1
  160. package/tmp/app/helpers/random-string.d.ts +0 -1
  161. package/tmp/app/helpers/stress-test.d.ts +0 -1
  162. package/tmp/app/index.d.ts +0 -1
  163. package/tmp/extensions/compartments/index.d.ts +0 -4
  164. package/tmp/extensions/index.d.ts +0 -8
  165. package/tmp/extensions/init-extensions.d.ts +0 -14
  166. package/tmp/extensions/keymaps/bold-keymap.d.ts +0 -2
  167. package/tmp/extensions/keymaps/index.d.ts +0 -1
  168. package/tmp/extensions/keymaps/init-key-map.d.ts +0 -23
  169. package/tmp/extensions/keymaps/italic-key-map.d.ts +0 -2
  170. package/tmp/extensions/keymaps/line-through-key-map.d.ts +0 -2
  171. package/tmp/extensions/keymaps/underline-key-map.d.ts +0 -2
  172. package/tmp/extensions/listeners/get-change-event.d.ts +0 -6
  173. package/tmp/extensions/listeners/get-focus-event.d.ts +0 -8
  174. package/tmp/extensions/listeners/index.d.ts +0 -3
  175. package/tmp/extensions/listeners/init-listeners.d.ts +0 -4
  176. package/tmp/extensions/markdown/blockquote/blockquote-constants.d.ts +0 -3
  177. package/tmp/extensions/markdown/blockquote/blockquote-decoration.d.ts +0 -2
  178. package/tmp/extensions/markdown/blockquote/blockquote-widget.d.ts +0 -6
  179. package/tmp/extensions/markdown/blockquote/index.d.ts +0 -1
  180. package/tmp/extensions/markdown/bold/bold-constants.d.ts +0 -2
  181. package/tmp/extensions/markdown/bold/bold-decoration.d.ts +0 -2
  182. package/tmp/extensions/markdown/bold/index.d.ts +0 -1
  183. package/tmp/extensions/markdown/code/code-constants.d.ts +0 -3
  184. package/tmp/extensions/markdown/code/code-decoration.d.ts +0 -2
  185. package/tmp/extensions/markdown/code/code-widget.d.ts +0 -13
  186. package/tmp/extensions/markdown/code/index.d.ts +0 -1
  187. package/tmp/extensions/markdown/header/header-constants.d.ts +0 -3
  188. package/tmp/extensions/markdown/header/header-decoration.d.ts +0 -2
  189. package/tmp/extensions/markdown/header/index.d.ts +0 -1
  190. package/tmp/extensions/markdown/horizontal/horizontal-constants.d.ts +0 -1
  191. package/tmp/extensions/markdown/horizontal/horizontal-decoration.d.ts +0 -2
  192. package/tmp/extensions/markdown/horizontal/index.d.ts +0 -1
  193. package/tmp/extensions/markdown/image/image-constants.d.ts +0 -5
  194. package/tmp/extensions/markdown/image/image-decoration.d.ts +0 -2
  195. package/tmp/extensions/markdown/image/image-widget.d.ts +0 -14
  196. package/tmp/extensions/markdown/image/index.d.ts +0 -1
  197. package/tmp/extensions/markdown/index.d.ts +0 -2
  198. package/tmp/extensions/markdown/init-markdown.d.ts +0 -3
  199. package/tmp/extensions/markdown/italic/index.d.ts +0 -1
  200. package/tmp/extensions/markdown/italic/italic-constants.d.ts +0 -2
  201. package/tmp/extensions/markdown/italic/italic-decoration.d.ts +0 -2
  202. package/tmp/extensions/markdown/link/auto-link-decoration.d.ts +0 -2
  203. package/tmp/extensions/markdown/link/index.d.ts +0 -2
  204. package/tmp/extensions/markdown/link/link-constants.d.ts +0 -7
  205. package/tmp/extensions/markdown/link/link-decoration.d.ts +0 -2
  206. package/tmp/extensions/markdown/link/link-label-decoration.d.ts +0 -2
  207. package/tmp/extensions/markdown/link/link-widget.d.ts +0 -17
  208. package/tmp/extensions/markdown/list/index.d.ts +0 -1
  209. package/tmp/extensions/markdown/list/list-constants.d.ts +0 -4
  210. package/tmp/extensions/markdown/list/list-decoration.d.ts +0 -2
  211. package/tmp/extensions/markdown/list/list-widget.d.ts +0 -7
  212. package/tmp/extensions/markdown/markdown-decoration.d.ts +0 -5
  213. package/tmp/extensions/markdown/markdown-parser.d.ts +0 -2
  214. package/tmp/extensions/markdown/markdown-types.d.ts +0 -24
  215. package/tmp/extensions/markdown/mention/index.d.ts +0 -1
  216. package/tmp/extensions/markdown/mention/mention-constants.d.ts +0 -3
  217. package/tmp/extensions/markdown/mention/mention-decoration.d.ts +0 -2
  218. package/tmp/extensions/markdown/mention/mention-parser.d.ts +0 -2
  219. package/tmp/extensions/markdown/strike-through/index.d.ts +0 -1
  220. package/tmp/extensions/markdown/strike-through/strike-through-constants.d.ts +0 -1
  221. package/tmp/extensions/markdown/strike-through/strike-through-decoration.d.ts +0 -2
  222. package/tmp/extensions/markdown/todo/index.d.ts +0 -1
  223. package/tmp/extensions/markdown/todo/todo-constants.d.ts +0 -3
  224. package/tmp/extensions/markdown/todo/todo-decoration.d.ts +0 -2
  225. package/tmp/extensions/markdown/todo/todo-widget.d.ts +0 -11
  226. package/tmp/extensions/settings/index.d.ts +0 -1
  227. package/tmp/extensions/settings/init-settings.d.ts +0 -6
  228. package/tmp/extensions/theme/index.d.ts +0 -4
  229. package/tmp/extensions/theme/init-theme.d.ts +0 -3
  230. package/tmp/extensions/theme/theme-constants.d.ts +0 -14
  231. package/tmp/extensions/theme/theme-types.d.ts +0 -39
  232. package/tmp/extensions/theme/themes/get-dark-theme.d.ts +0 -2
  233. package/tmp/extensions/theme/themes/get-highlight-template.d.ts +0 -6
  234. package/tmp/extensions/theme/themes/get-light-theme.d.ts +0 -2
  235. package/tmp/extensions/theme/themes/get-theme-template.d.ts +0 -2
  236. package/tmp/extensions/theme/themes/index.d.ts +0 -2
  237. package/tmp/index.d.ts +0 -3
  238. package/tmp/lib/index.d.ts +0 -1
  239. package/tmp/lib/utils/copy-to-clipboard.d.ts +0 -1
  240. package/tmp/lib/utils/get-decoration.d.ts +0 -26
  241. package/tmp/lib/utils/index.d.ts +0 -6
  242. package/tmp/lib/utils/is-in-range.d.ts +0 -2
  243. package/tmp/lib/utils/is-range-overlap.d.ts +0 -1
  244. package/tmp/lib/utils/random-string.d.ts +0 -1
  245. package/tmp/lib/utils/tick.d.ts +0 -10
  246. package/tmp/module/Editor/Editor.d.ts +0 -18
  247. package/tmp/module/Editor/Editor.types.d.ts +0 -13
  248. package/tmp/module/Editor/index.d.ts +0 -3
  249. package/tmp/module/Editor/lib/index.d.ts +0 -1
  250. package/tmp/module/Editor/lib/init-editor-provider.d.ts +0 -9
  251. package/tmp/module/Editor/lib/init-editor-state.d.ts +0 -7
  252. package/tmp/module/Editor/lib/init-editor.d.ts +0 -7
  253. package/tmp/module/index.d.ts +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"vendor_vim-PF2jWG0J.js","sources":["../../node_modules/.pnpm/@codemirror+search@6.5.8/node_modules/@codemirror/search/dist/index.js","../../node_modules/.pnpm/@replit+codemirror-vim@6.2.1_@codemirror+commands@6.7.1_@codemirror+language@6.10.6_@codemirr_c73bpgvkhq7zwfdtngw5lpqyue/node_modules/@replit/codemirror-vim/dist/index.js"],"sourcesContent":["import { showPanel, EditorView, getPanel, Decoration, ViewPlugin, runScopeHandlers } from '@codemirror/view';\nimport { codePointAt, fromCodePoint, codePointSize, StateEffect, StateField, EditorSelection, Facet, combineConfig, CharCategory, RangeSetBuilder, Prec, EditorState, findClusterBreak } from '@codemirror/state';\nimport elt from 'crelt';\n\nconst basicNormalize = typeof String.prototype.normalize == \"function\"\n ? x => x.normalize(\"NFKD\") : x => x;\n/**\nA search cursor provides an iterator over text matches in a\ndocument.\n*/\nclass SearchCursor {\n /**\n Create a text cursor. The query is the search string, `from` to\n `to` provides the region to search.\n \n When `normalize` is given, it will be called, on both the query\n string and the content it is matched against, before comparing.\n You can, for example, create a case-insensitive search by\n passing `s => s.toLowerCase()`.\n \n Text is always normalized with\n [`.normalize(\"NFKD\")`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)\n (when supported).\n */\n constructor(text, query, from = 0, to = text.length, normalize, test) {\n this.test = test;\n /**\n The current match (only holds a meaningful value after\n [`next`](https://codemirror.net/6/docs/ref/#search.SearchCursor.next) has been called and when\n `done` is false).\n */\n this.value = { from: 0, to: 0 };\n /**\n Whether the end of the iterated region has been reached.\n */\n this.done = false;\n this.matches = [];\n this.buffer = \"\";\n this.bufferPos = 0;\n this.iter = text.iterRange(from, to);\n this.bufferStart = from;\n this.normalize = normalize ? x => normalize(basicNormalize(x)) : basicNormalize;\n this.query = this.normalize(query);\n }\n peek() {\n if (this.bufferPos == this.buffer.length) {\n this.bufferStart += this.buffer.length;\n this.iter.next();\n if (this.iter.done)\n return -1;\n this.bufferPos = 0;\n this.buffer = this.iter.value;\n }\n return codePointAt(this.buffer, this.bufferPos);\n }\n /**\n Look for the next match. Updates the iterator's\n [`value`](https://codemirror.net/6/docs/ref/#search.SearchCursor.value) and\n [`done`](https://codemirror.net/6/docs/ref/#search.SearchCursor.done) properties. Should be called\n at least once before using the cursor.\n */\n next() {\n while (this.matches.length)\n this.matches.pop();\n return this.nextOverlapping();\n }\n /**\n The `next` method will ignore matches that partially overlap a\n previous match. This method behaves like `next`, but includes\n such matches.\n */\n nextOverlapping() {\n for (;;) {\n let next = this.peek();\n if (next < 0) {\n this.done = true;\n return this;\n }\n let str = fromCodePoint(next), start = this.bufferStart + this.bufferPos;\n this.bufferPos += codePointSize(next);\n let norm = this.normalize(str);\n if (norm.length)\n for (let i = 0, pos = start;; i++) {\n let code = norm.charCodeAt(i);\n let match = this.match(code, pos, this.bufferPos + this.bufferStart);\n if (i == norm.length - 1) {\n if (match) {\n this.value = match;\n return this;\n }\n break;\n }\n if (pos == start && i < str.length && str.charCodeAt(i) == code)\n pos++;\n }\n }\n }\n match(code, pos, end) {\n let match = null;\n for (let i = 0; i < this.matches.length; i += 2) {\n let index = this.matches[i], keep = false;\n if (this.query.charCodeAt(index) == code) {\n if (index == this.query.length - 1) {\n match = { from: this.matches[i + 1], to: end };\n }\n else {\n this.matches[i]++;\n keep = true;\n }\n }\n if (!keep) {\n this.matches.splice(i, 2);\n i -= 2;\n }\n }\n if (this.query.charCodeAt(0) == code) {\n if (this.query.length == 1)\n match = { from: pos, to: end };\n else\n this.matches.push(1, pos);\n }\n if (match && this.test && !this.test(match.from, match.to, this.buffer, this.bufferStart))\n match = null;\n return match;\n }\n}\nif (typeof Symbol != \"undefined\")\n SearchCursor.prototype[Symbol.iterator] = function () { return this; };\n\nconst empty = { from: -1, to: -1, match: /*@__PURE__*//.*/.exec(\"\") };\nconst baseFlags = \"gm\" + (/x/.unicode == null ? \"\" : \"u\");\n/**\nThis class is similar to [`SearchCursor`](https://codemirror.net/6/docs/ref/#search.SearchCursor)\nbut searches for a regular expression pattern instead of a plain\nstring.\n*/\nclass RegExpCursor {\n /**\n Create a cursor that will search the given range in the given\n document. `query` should be the raw pattern (as you'd pass it to\n `new RegExp`).\n */\n constructor(text, query, options, from = 0, to = text.length) {\n this.text = text;\n this.to = to;\n this.curLine = \"\";\n /**\n Set to `true` when the cursor has reached the end of the search\n range.\n */\n this.done = false;\n /**\n Will contain an object with the extent of the match and the\n match object when [`next`](https://codemirror.net/6/docs/ref/#search.RegExpCursor.next)\n sucessfully finds a match.\n */\n this.value = empty;\n if (/\\\\[sWDnr]|\\n|\\r|\\[\\^/.test(query))\n return new MultilineRegExpCursor(text, query, options, from, to);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.iter = text.iter();\n let startLine = text.lineAt(from);\n this.curLineStart = startLine.from;\n this.matchPos = toCharEnd(text, from);\n this.getLine(this.curLineStart);\n }\n getLine(skip) {\n this.iter.next(skip);\n if (this.iter.lineBreak) {\n this.curLine = \"\";\n }\n else {\n this.curLine = this.iter.value;\n if (this.curLineStart + this.curLine.length > this.to)\n this.curLine = this.curLine.slice(0, this.to - this.curLineStart);\n this.iter.next();\n }\n }\n nextLine() {\n this.curLineStart = this.curLineStart + this.curLine.length + 1;\n if (this.curLineStart > this.to)\n this.curLine = \"\";\n else\n this.getLine(0);\n }\n /**\n Move to the next match, if there is one.\n */\n next() {\n for (let off = this.matchPos - this.curLineStart;;) {\n this.re.lastIndex = off;\n let match = this.matchPos <= this.to && this.re.exec(this.curLine);\n if (match) {\n let from = this.curLineStart + match.index, to = from + match[0].length;\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n if (from == this.curLineStart + this.curLine.length)\n this.nextLine();\n if ((from < to || from > this.value.to) && (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n return this;\n }\n off = this.matchPos - this.curLineStart;\n }\n else if (this.curLineStart + this.curLine.length < this.to) {\n this.nextLine();\n off = 0;\n }\n else {\n this.done = true;\n return this;\n }\n }\n }\n}\nconst flattened = /*@__PURE__*/new WeakMap();\n// Reusable (partially) flattened document strings\nclass FlattenedDoc {\n constructor(from, text) {\n this.from = from;\n this.text = text;\n }\n get to() { return this.from + this.text.length; }\n static get(doc, from, to) {\n let cached = flattened.get(doc);\n if (!cached || cached.from >= to || cached.to <= from) {\n let flat = new FlattenedDoc(from, doc.sliceString(from, to));\n flattened.set(doc, flat);\n return flat;\n }\n if (cached.from == from && cached.to == to)\n return cached;\n let { text, from: cachedFrom } = cached;\n if (cachedFrom > from) {\n text = doc.sliceString(from, cachedFrom) + text;\n cachedFrom = from;\n }\n if (cached.to < to)\n text += doc.sliceString(cached.to, to);\n flattened.set(doc, new FlattenedDoc(cachedFrom, text));\n return new FlattenedDoc(from, text.slice(from - cachedFrom, to - cachedFrom));\n }\n}\nclass MultilineRegExpCursor {\n constructor(text, query, options, from, to) {\n this.text = text;\n this.to = to;\n this.done = false;\n this.value = empty;\n this.matchPos = toCharEnd(text, from);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.flat = FlattenedDoc.get(text, from, this.chunkEnd(from + 5000 /* Chunk.Base */));\n }\n chunkEnd(pos) {\n return pos >= this.to ? this.to : this.text.lineAt(pos).to;\n }\n next() {\n for (;;) {\n let off = this.re.lastIndex = this.matchPos - this.flat.from;\n let match = this.re.exec(this.flat.text);\n // Skip empty matches directly after the last match\n if (match && !match[0] && match.index == off) {\n this.re.lastIndex = off + 1;\n match = this.re.exec(this.flat.text);\n }\n if (match) {\n let from = this.flat.from + match.index, to = from + match[0].length;\n // If a match goes almost to the end of a noncomplete chunk, try\n // again, since it'll likely be able to match more\n if ((this.flat.to >= this.to || match.index + match[0].length <= this.flat.text.length - 10) &&\n (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n return this;\n }\n }\n if (this.flat.to == this.to) {\n this.done = true;\n return this;\n }\n // Grow the flattened doc\n this.flat = FlattenedDoc.get(this.text, this.flat.from, this.chunkEnd(this.flat.from + this.flat.text.length * 2));\n }\n }\n}\nif (typeof Symbol != \"undefined\") {\n RegExpCursor.prototype[Symbol.iterator] = MultilineRegExpCursor.prototype[Symbol.iterator] =\n function () { return this; };\n}\nfunction validRegExp(source) {\n try {\n new RegExp(source, baseFlags);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction toCharEnd(text, pos) {\n if (pos >= text.length)\n return pos;\n let line = text.lineAt(pos), next;\n while (pos < line.to && (next = line.text.charCodeAt(pos - line.from)) >= 0xDC00 && next < 0xE000)\n pos++;\n return pos;\n}\n\nfunction createLineDialog(view) {\n let line = String(view.state.doc.lineAt(view.state.selection.main.head).number);\n let input = elt(\"input\", { class: \"cm-textfield\", name: \"line\", value: line });\n let dom = elt(\"form\", {\n class: \"cm-gotoLine\",\n onkeydown: (event) => {\n if (event.keyCode == 27) { // Escape\n event.preventDefault();\n view.dispatch({ effects: dialogEffect.of(false) });\n view.focus();\n }\n else if (event.keyCode == 13) { // Enter\n event.preventDefault();\n go();\n }\n },\n onsubmit: (event) => {\n event.preventDefault();\n go();\n }\n }, elt(\"label\", view.state.phrase(\"Go to line\"), \": \", input), \" \", elt(\"button\", { class: \"cm-button\", type: \"submit\" }, view.state.phrase(\"go\")));\n function go() {\n let match = /^([+-])?(\\d+)?(:\\d+)?(%)?$/.exec(input.value);\n if (!match)\n return;\n let { state } = view, startLine = state.doc.lineAt(state.selection.main.head);\n let [, sign, ln, cl, percent] = match;\n let col = cl ? +cl.slice(1) : 0;\n let line = ln ? +ln : startLine.number;\n if (ln && percent) {\n let pc = line / 100;\n if (sign)\n pc = pc * (sign == \"-\" ? -1 : 1) + (startLine.number / state.doc.lines);\n line = Math.round(state.doc.lines * pc);\n }\n else if (ln && sign) {\n line = line * (sign == \"-\" ? -1 : 1) + startLine.number;\n }\n let docLine = state.doc.line(Math.max(1, Math.min(state.doc.lines, line)));\n let selection = EditorSelection.cursor(docLine.from + Math.max(0, Math.min(col, docLine.length)));\n view.dispatch({\n effects: [dialogEffect.of(false), EditorView.scrollIntoView(selection.from, { y: 'center' })],\n selection,\n });\n view.focus();\n }\n return { dom };\n}\nconst dialogEffect = /*@__PURE__*/StateEffect.define();\nconst dialogField = /*@__PURE__*/StateField.define({\n create() { return true; },\n update(value, tr) {\n for (let e of tr.effects)\n if (e.is(dialogEffect))\n value = e.value;\n return value;\n },\n provide: f => showPanel.from(f, val => val ? createLineDialog : null)\n});\n/**\nCommand that shows a dialog asking the user for a line number, and\nwhen a valid position is provided, moves the cursor to that line.\n\nSupports line numbers, relative line offsets prefixed with `+` or\n`-`, document percentages suffixed with `%`, and an optional\ncolumn position by adding `:` and a second number after the line\nnumber.\n*/\nconst gotoLine = view => {\n let panel = getPanel(view, createLineDialog);\n if (!panel) {\n let effects = [dialogEffect.of(true)];\n if (view.state.field(dialogField, false) == null)\n effects.push(StateEffect.appendConfig.of([dialogField, baseTheme$1]));\n view.dispatch({ effects });\n panel = getPanel(view, createLineDialog);\n }\n if (panel)\n panel.dom.querySelector(\"input\").select();\n return true;\n};\nconst baseTheme$1 = /*@__PURE__*/EditorView.baseTheme({\n \".cm-panel.cm-gotoLine\": {\n padding: \"2px 6px 4px\",\n \"& label\": { fontSize: \"80%\" }\n }\n});\n\nconst defaultHighlightOptions = {\n highlightWordAroundCursor: false,\n minSelectionLength: 1,\n maxMatches: 100,\n wholeWords: false\n};\nconst highlightConfig = /*@__PURE__*/Facet.define({\n combine(options) {\n return combineConfig(options, defaultHighlightOptions, {\n highlightWordAroundCursor: (a, b) => a || b,\n minSelectionLength: Math.min,\n maxMatches: Math.min\n });\n }\n});\n/**\nThis extension highlights text that matches the selection. It uses\nthe `\"cm-selectionMatch\"` class for the highlighting. When\n`highlightWordAroundCursor` is enabled, the word at the cursor\nitself will be highlighted with `\"cm-selectionMatch-main\"`.\n*/\nfunction highlightSelectionMatches(options) {\n let ext = [defaultTheme, matchHighlighter];\n if (options)\n ext.push(highlightConfig.of(options));\n return ext;\n}\nconst matchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch\" });\nconst mainMatchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch cm-selectionMatch-main\" });\n// Whether the characters directly outside the given positions are non-word characters\nfunction insideWordBoundaries(check, state, from, to) {\n return (from == 0 || check(state.sliceDoc(from - 1, from)) != CharCategory.Word) &&\n (to == state.doc.length || check(state.sliceDoc(to, to + 1)) != CharCategory.Word);\n}\n// Whether the characters directly at the given positions are word characters\nfunction insideWord(check, state, from, to) {\n return check(state.sliceDoc(from, from + 1)) == CharCategory.Word\n && check(state.sliceDoc(to - 1, to)) == CharCategory.Word;\n}\nconst matchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.decorations = this.getDeco(view);\n }\n update(update) {\n if (update.selectionSet || update.docChanged || update.viewportChanged)\n this.decorations = this.getDeco(update.view);\n }\n getDeco(view) {\n let conf = view.state.facet(highlightConfig);\n let { state } = view, sel = state.selection;\n if (sel.ranges.length > 1)\n return Decoration.none;\n let range = sel.main, query, check = null;\n if (range.empty) {\n if (!conf.highlightWordAroundCursor)\n return Decoration.none;\n let word = state.wordAt(range.head);\n if (!word)\n return Decoration.none;\n check = state.charCategorizer(range.head);\n query = state.sliceDoc(word.from, word.to);\n }\n else {\n let len = range.to - range.from;\n if (len < conf.minSelectionLength || len > 200)\n return Decoration.none;\n if (conf.wholeWords) {\n query = state.sliceDoc(range.from, range.to); // TODO: allow and include leading/trailing space?\n check = state.charCategorizer(range.head);\n if (!(insideWordBoundaries(check, state, range.from, range.to) &&\n insideWord(check, state, range.from, range.to)))\n return Decoration.none;\n }\n else {\n query = state.sliceDoc(range.from, range.to);\n if (!query)\n return Decoration.none;\n }\n }\n let deco = [];\n for (let part of view.visibleRanges) {\n let cursor = new SearchCursor(state.doc, query, part.from, part.to);\n while (!cursor.next().done) {\n let { from, to } = cursor.value;\n if (!check || insideWordBoundaries(check, state, from, to)) {\n if (range.empty && from <= range.from && to >= range.to)\n deco.push(mainMatchDeco.range(from, to));\n else if (from >= range.to || to <= range.from)\n deco.push(matchDeco.range(from, to));\n if (deco.length > conf.maxMatches)\n return Decoration.none;\n }\n }\n }\n return Decoration.set(deco);\n }\n}, {\n decorations: v => v.decorations\n});\nconst defaultTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-selectionMatch\": { backgroundColor: \"#99ff7780\" },\n \".cm-searchMatch .cm-selectionMatch\": { backgroundColor: \"transparent\" }\n});\n// Select the words around the cursors.\nconst selectWord = ({ state, dispatch }) => {\n let { selection } = state;\n let newSel = EditorSelection.create(selection.ranges.map(range => state.wordAt(range.head) || EditorSelection.cursor(range.head)), selection.mainIndex);\n if (newSel.eq(selection))\n return false;\n dispatch(state.update({ selection: newSel }));\n return true;\n};\n// Find next occurrence of query relative to last cursor. Wrap around\n// the document if there are no more matches.\nfunction findNextOccurrence(state, query) {\n let { main, ranges } = state.selection;\n let word = state.wordAt(main.head), fullWord = word && word.from == main.from && word.to == main.to;\n for (let cycled = false, cursor = new SearchCursor(state.doc, query, ranges[ranges.length - 1].to);;) {\n cursor.next();\n if (cursor.done) {\n if (cycled)\n return null;\n cursor = new SearchCursor(state.doc, query, 0, Math.max(0, ranges[ranges.length - 1].from - 1));\n cycled = true;\n }\n else {\n if (cycled && ranges.some(r => r.from == cursor.value.from))\n continue;\n if (fullWord) {\n let word = state.wordAt(cursor.value.from);\n if (!word || word.from != cursor.value.from || word.to != cursor.value.to)\n continue;\n }\n return cursor.value;\n }\n }\n}\n/**\nSelect next occurrence of the current selection. Expand selection\nto the surrounding word when the selection is empty.\n*/\nconst selectNextOccurrence = ({ state, dispatch }) => {\n let { ranges } = state.selection;\n if (ranges.some(sel => sel.from === sel.to))\n return selectWord({ state, dispatch });\n let searchedText = state.sliceDoc(ranges[0].from, ranges[0].to);\n if (state.selection.ranges.some(r => state.sliceDoc(r.from, r.to) != searchedText))\n return false;\n let range = findNextOccurrence(state, searchedText);\n if (!range)\n return false;\n dispatch(state.update({\n selection: state.selection.addRange(EditorSelection.range(range.from, range.to), false),\n effects: EditorView.scrollIntoView(range.to)\n }));\n return true;\n};\n\nconst searchConfigFacet = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n top: false,\n caseSensitive: false,\n literal: false,\n regexp: false,\n wholeWord: false,\n createPanel: view => new SearchPanel(view),\n scrollToMatch: range => EditorView.scrollIntoView(range)\n });\n }\n});\n/**\nAdd search state to the editor configuration, and optionally\nconfigure the search extension.\n([`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) will automatically\nenable this if it isn't already on).\n*/\nfunction search(config) {\n return config ? [searchConfigFacet.of(config), searchExtensions] : searchExtensions;\n}\n/**\nA search query. Part of the editor's search state.\n*/\nclass SearchQuery {\n /**\n Create a query object.\n */\n constructor(config) {\n this.search = config.search;\n this.caseSensitive = !!config.caseSensitive;\n this.literal = !!config.literal;\n this.regexp = !!config.regexp;\n this.replace = config.replace || \"\";\n this.valid = !!this.search && (!this.regexp || validRegExp(this.search));\n this.unquoted = this.unquote(this.search);\n this.wholeWord = !!config.wholeWord;\n }\n /**\n @internal\n */\n unquote(text) {\n return this.literal ? text :\n text.replace(/\\\\([nrt\\\\])/g, (_, ch) => ch == \"n\" ? \"\\n\" : ch == \"r\" ? \"\\r\" : ch == \"t\" ? \"\\t\" : \"\\\\\");\n }\n /**\n Compare this query to another query.\n */\n eq(other) {\n return this.search == other.search && this.replace == other.replace &&\n this.caseSensitive == other.caseSensitive && this.regexp == other.regexp &&\n this.wholeWord == other.wholeWord;\n }\n /**\n @internal\n */\n create() {\n return this.regexp ? new RegExpQuery(this) : new StringQuery(this);\n }\n /**\n Get a search cursor for this query, searching through the given\n range in the given state.\n */\n getCursor(state, from = 0, to) {\n let st = state.doc ? state : EditorState.create({ doc: state });\n if (to == null)\n to = st.doc.length;\n return this.regexp ? regexpCursor(this, st, from, to) : stringCursor(this, st, from, to);\n }\n}\nclass QueryType {\n constructor(spec) {\n this.spec = spec;\n }\n}\nfunction stringCursor(spec, state, from, to) {\n return new SearchCursor(state.doc, spec.unquoted, from, to, spec.caseSensitive ? undefined : x => x.toLowerCase(), spec.wholeWord ? stringWordTest(state.doc, state.charCategorizer(state.selection.main.head)) : undefined);\n}\nfunction stringWordTest(doc, categorizer) {\n return (from, to, buf, bufPos) => {\n if (bufPos > from || bufPos + buf.length < to) {\n bufPos = Math.max(0, from - 2);\n buf = doc.sliceString(bufPos, Math.min(doc.length, to + 2));\n }\n return (categorizer(charBefore(buf, from - bufPos)) != CharCategory.Word ||\n categorizer(charAfter(buf, from - bufPos)) != CharCategory.Word) &&\n (categorizer(charAfter(buf, to - bufPos)) != CharCategory.Word ||\n categorizer(charBefore(buf, to - bufPos)) != CharCategory.Word);\n };\n}\nclass StringQuery extends QueryType {\n constructor(spec) {\n super(spec);\n }\n nextMatch(state, curFrom, curTo) {\n let cursor = stringCursor(this.spec, state, curTo, state.doc.length).nextOverlapping();\n if (cursor.done) {\n let end = Math.min(state.doc.length, curFrom + this.spec.unquoted.length);\n cursor = stringCursor(this.spec, state, 0, end).nextOverlapping();\n }\n return cursor.done || cursor.value.from == curFrom && cursor.value.to == curTo ? null : cursor.value;\n }\n // Searching in reverse is, rather than implementing an inverted search\n // cursor, done by scanning chunk after chunk forward.\n prevMatchInRange(state, from, to) {\n for (let pos = to;;) {\n let start = Math.max(from, pos - 10000 /* FindPrev.ChunkSize */ - this.spec.unquoted.length);\n let cursor = stringCursor(this.spec, state, start, pos), range = null;\n while (!cursor.nextOverlapping().done)\n range = cursor.value;\n if (range)\n return range;\n if (start == from)\n return null;\n pos -= 10000 /* FindPrev.ChunkSize */;\n }\n }\n prevMatch(state, curFrom, curTo) {\n let found = this.prevMatchInRange(state, 0, curFrom);\n if (!found)\n found = this.prevMatchInRange(state, Math.max(0, curTo - this.spec.unquoted.length), state.doc.length);\n return found && (found.from != curFrom || found.to != curTo) ? found : null;\n }\n getReplacement(_result) { return this.spec.unquote(this.spec.replace); }\n matchAll(state, limit) {\n let cursor = stringCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = stringCursor(this.spec, state, Math.max(0, from - this.spec.unquoted.length), Math.min(to + this.spec.unquoted.length, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\nfunction regexpCursor(spec, state, from, to) {\n return new RegExpCursor(state.doc, spec.search, {\n ignoreCase: !spec.caseSensitive,\n test: spec.wholeWord ? regexpWordTest(state.charCategorizer(state.selection.main.head)) : undefined\n }, from, to);\n}\nfunction charBefore(str, index) {\n return str.slice(findClusterBreak(str, index, false), index);\n}\nfunction charAfter(str, index) {\n return str.slice(index, findClusterBreak(str, index));\n}\nfunction regexpWordTest(categorizer) {\n return (_from, _to, match) => !match[0].length ||\n (categorizer(charBefore(match.input, match.index)) != CharCategory.Word ||\n categorizer(charAfter(match.input, match.index)) != CharCategory.Word) &&\n (categorizer(charAfter(match.input, match.index + match[0].length)) != CharCategory.Word ||\n categorizer(charBefore(match.input, match.index + match[0].length)) != CharCategory.Word);\n}\nclass RegExpQuery extends QueryType {\n nextMatch(state, curFrom, curTo) {\n let cursor = regexpCursor(this.spec, state, curTo, state.doc.length).next();\n if (cursor.done)\n cursor = regexpCursor(this.spec, state, 0, curFrom).next();\n return cursor.done ? null : cursor.value;\n }\n prevMatchInRange(state, from, to) {\n for (let size = 1;; size++) {\n let start = Math.max(from, to - size * 10000 /* FindPrev.ChunkSize */);\n let cursor = regexpCursor(this.spec, state, start, to), range = null;\n while (!cursor.next().done)\n range = cursor.value;\n if (range && (start == from || range.from > start + 10))\n return range;\n if (start == from)\n return null;\n }\n }\n prevMatch(state, curFrom, curTo) {\n return this.prevMatchInRange(state, 0, curFrom) ||\n this.prevMatchInRange(state, curTo, state.doc.length);\n }\n getReplacement(result) {\n return this.spec.unquote(this.spec.replace).replace(/\\$([$&\\d+])/g, (m, i) => i == \"$\" ? \"$\"\n : i == \"&\" ? result.match[0]\n : i != \"0\" && +i < result.match.length ? result.match[i]\n : m);\n }\n matchAll(state, limit) {\n let cursor = regexpCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = regexpCursor(this.spec, state, Math.max(0, from - 250 /* RegExp.HighlightMargin */), Math.min(to + 250 /* RegExp.HighlightMargin */, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\n/**\nA state effect that updates the current search query. Note that\nthis only has an effect if the search state has been initialized\n(by including [`search`](https://codemirror.net/6/docs/ref/#search.search) in your configuration or\nby running [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) at least\nonce).\n*/\nconst setSearchQuery = /*@__PURE__*/StateEffect.define();\nconst togglePanel = /*@__PURE__*/StateEffect.define();\nconst searchState = /*@__PURE__*/StateField.define({\n create(state) {\n return new SearchState(defaultQuery(state).create(), null);\n },\n update(value, tr) {\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery))\n value = new SearchState(effect.value.create(), value.panel);\n else if (effect.is(togglePanel))\n value = new SearchState(value.query, effect.value ? createSearchPanel : null);\n }\n return value;\n },\n provide: f => showPanel.from(f, val => val.panel)\n});\n/**\nGet the current search query from an editor state.\n*/\nfunction getSearchQuery(state) {\n let curState = state.field(searchState, false);\n return curState ? curState.query.spec : defaultQuery(state);\n}\n/**\nQuery whether the search panel is open in the given editor state.\n*/\nfunction searchPanelOpen(state) {\n var _a;\n return ((_a = state.field(searchState, false)) === null || _a === void 0 ? void 0 : _a.panel) != null;\n}\nclass SearchState {\n constructor(query, panel) {\n this.query = query;\n this.panel = panel;\n }\n}\nconst matchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch\" }), selectedMatchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch cm-searchMatch-selected\" });\nconst searchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.decorations = this.highlight(view.state.field(searchState));\n }\n update(update) {\n let state = update.state.field(searchState);\n if (state != update.startState.field(searchState) || update.docChanged || update.selectionSet || update.viewportChanged)\n this.decorations = this.highlight(state);\n }\n highlight({ query, panel }) {\n if (!panel || !query.spec.valid)\n return Decoration.none;\n let { view } = this;\n let builder = new RangeSetBuilder();\n for (let i = 0, ranges = view.visibleRanges, l = ranges.length; i < l; i++) {\n let { from, to } = ranges[i];\n while (i < l - 1 && to > ranges[i + 1].from - 2 * 250 /* RegExp.HighlightMargin */)\n to = ranges[++i].to;\n query.highlight(view.state, from, to, (from, to) => {\n let selected = view.state.selection.ranges.some(r => r.from == from && r.to == to);\n builder.add(from, to, selected ? selectedMatchMark : matchMark);\n });\n }\n return builder.finish();\n }\n}, {\n decorations: v => v.decorations\n});\nfunction searchCommand(f) {\n return view => {\n let state = view.state.field(searchState, false);\n return state && state.query.spec.valid ? f(view, state) : openSearchPanel(view);\n };\n}\n/**\nOpen the search panel if it isn't already open, and move the\nselection to the first match after the current main selection.\nWill wrap around to the start of the document when it reaches the\nend.\n*/\nconst findNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { to } = view.state.selection.main;\n let next = query.nextMatch(view.state, to, to);\n if (!next)\n return false;\n let selection = EditorSelection.single(next.from, next.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, next), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nMove the selection to the previous instance of the search query,\nbefore the current main selection. Will wrap past the start\nof the document to start searching at the end again.\n*/\nconst findPrevious = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from } = state.selection.main;\n let prev = query.prevMatch(state, from, from);\n if (!prev)\n return false;\n let selection = EditorSelection.single(prev.from, prev.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, prev), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nSelect all instances of the search query.\n*/\nconst selectMatches = /*@__PURE__*/searchCommand((view, { query }) => {\n let ranges = query.matchAll(view.state, 1000);\n if (!ranges || !ranges.length)\n return false;\n view.dispatch({\n selection: EditorSelection.create(ranges.map(r => EditorSelection.range(r.from, r.to))),\n userEvent: \"select.search.matches\"\n });\n return true;\n});\n/**\nSelect all instances of the currently selected text.\n*/\nconst selectSelectionMatches = ({ state, dispatch }) => {\n let sel = state.selection;\n if (sel.ranges.length > 1 || sel.main.empty)\n return false;\n let { from, to } = sel.main;\n let ranges = [], main = 0;\n for (let cur = new SearchCursor(state.doc, state.sliceDoc(from, to)); !cur.next().done;) {\n if (ranges.length > 1000)\n return false;\n if (cur.value.from == from)\n main = ranges.length;\n ranges.push(EditorSelection.range(cur.value.from, cur.value.to));\n }\n dispatch(state.update({\n selection: EditorSelection.create(ranges, main),\n userEvent: \"select.search.matches\"\n }));\n return true;\n};\n/**\nReplace the current match of the search query.\n*/\nconst replaceNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from, to } = state.selection.main;\n if (state.readOnly)\n return false;\n let match = query.nextMatch(state, from, from);\n if (!match)\n return false;\n let next = match;\n let changes = [], selection, replacement;\n let effects = [];\n if (next.from == from && next.to == to) {\n replacement = state.toText(query.getReplacement(next));\n changes.push({ from: next.from, to: next.to, insert: replacement });\n next = query.nextMatch(state, next.from, next.to);\n effects.push(EditorView.announce.of(state.phrase(\"replaced match on line $\", state.doc.lineAt(from).number) + \".\"));\n }\n if (next) {\n let off = changes.length == 0 || changes[0].from >= match.to ? 0 : match.to - match.from - replacement.length;\n selection = EditorSelection.single(next.from - off, next.to - off);\n effects.push(announceMatch(view, next));\n effects.push(state.facet(searchConfigFacet).scrollToMatch(selection.main, view));\n }\n view.dispatch({\n changes, selection, effects,\n userEvent: \"input.replace\"\n });\n return true;\n});\n/**\nReplace all instances of the search query with the given\nreplacement.\n*/\nconst replaceAll = /*@__PURE__*/searchCommand((view, { query }) => {\n if (view.state.readOnly)\n return false;\n let changes = query.matchAll(view.state, 1e9).map(match => {\n let { from, to } = match;\n return { from, to, insert: query.getReplacement(match) };\n });\n if (!changes.length)\n return false;\n let announceText = view.state.phrase(\"replaced $ matches\", changes.length) + \".\";\n view.dispatch({\n changes,\n effects: EditorView.announce.of(announceText),\n userEvent: \"input.replace.all\"\n });\n return true;\n});\nfunction createSearchPanel(view) {\n return view.state.facet(searchConfigFacet).createPanel(view);\n}\nfunction defaultQuery(state, fallback) {\n var _a, _b, _c, _d, _e;\n let sel = state.selection.main;\n let selText = sel.empty || sel.to > sel.from + 100 ? \"\" : state.sliceDoc(sel.from, sel.to);\n if (fallback && !selText)\n return fallback;\n let config = state.facet(searchConfigFacet);\n return new SearchQuery({\n search: ((_a = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _a !== void 0 ? _a : config.literal) ? selText : selText.replace(/\\n/g, \"\\\\n\"),\n caseSensitive: (_b = fallback === null || fallback === void 0 ? void 0 : fallback.caseSensitive) !== null && _b !== void 0 ? _b : config.caseSensitive,\n literal: (_c = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _c !== void 0 ? _c : config.literal,\n regexp: (_d = fallback === null || fallback === void 0 ? void 0 : fallback.regexp) !== null && _d !== void 0 ? _d : config.regexp,\n wholeWord: (_e = fallback === null || fallback === void 0 ? void 0 : fallback.wholeWord) !== null && _e !== void 0 ? _e : config.wholeWord\n });\n}\nfunction getSearchInput(view) {\n let panel = getPanel(view, createSearchPanel);\n return panel && panel.dom.querySelector(\"[main-field]\");\n}\nfunction selectSearchInput(view) {\n let input = getSearchInput(view);\n if (input && input == view.root.activeElement)\n input.select();\n}\n/**\nMake sure the search panel is open and focused.\n*/\nconst openSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (state && state.panel) {\n let searchInput = getSearchInput(view);\n if (searchInput && searchInput != view.root.activeElement) {\n let query = defaultQuery(view.state, state.query.spec);\n if (query.valid)\n view.dispatch({ effects: setSearchQuery.of(query) });\n searchInput.focus();\n searchInput.select();\n }\n }\n else {\n view.dispatch({ effects: [\n togglePanel.of(true),\n state ? setSearchQuery.of(defaultQuery(view.state, state.query.spec)) : StateEffect.appendConfig.of(searchExtensions)\n ] });\n }\n return true;\n};\n/**\nClose the search panel.\n*/\nconst closeSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (!state || !state.panel)\n return false;\n let panel = getPanel(view, createSearchPanel);\n if (panel && panel.dom.contains(view.root.activeElement))\n view.focus();\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n/**\nDefault search-related key bindings.\n\n - Mod-f: [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel)\n - F3, Mod-g: [`findNext`](https://codemirror.net/6/docs/ref/#search.findNext)\n - Shift-F3, Shift-Mod-g: [`findPrevious`](https://codemirror.net/6/docs/ref/#search.findPrevious)\n - Mod-Alt-g: [`gotoLine`](https://codemirror.net/6/docs/ref/#search.gotoLine)\n - Mod-d: [`selectNextOccurrence`](https://codemirror.net/6/docs/ref/#search.selectNextOccurrence)\n*/\nconst searchKeymap = [\n { key: \"Mod-f\", run: openSearchPanel, scope: \"editor search-panel\" },\n { key: \"F3\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Mod-g\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Escape\", run: closeSearchPanel, scope: \"editor search-panel\" },\n { key: \"Mod-Shift-l\", run: selectSelectionMatches },\n { key: \"Mod-Alt-g\", run: gotoLine },\n { key: \"Mod-d\", run: selectNextOccurrence, preventDefault: true },\n];\nclass SearchPanel {\n constructor(view) {\n this.view = view;\n let query = this.query = view.state.field(searchState).query.spec;\n this.commit = this.commit.bind(this);\n this.searchField = elt(\"input\", {\n value: query.search,\n placeholder: phrase(view, \"Find\"),\n \"aria-label\": phrase(view, \"Find\"),\n class: \"cm-textfield\",\n name: \"search\",\n form: \"\",\n \"main-field\": \"true\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.replaceField = elt(\"input\", {\n value: query.replace,\n placeholder: phrase(view, \"Replace\"),\n \"aria-label\": phrase(view, \"Replace\"),\n class: \"cm-textfield\",\n name: \"replace\",\n form: \"\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.caseField = elt(\"input\", {\n type: \"checkbox\",\n name: \"case\",\n form: \"\",\n checked: query.caseSensitive,\n onchange: this.commit\n });\n this.reField = elt(\"input\", {\n type: \"checkbox\",\n name: \"re\",\n form: \"\",\n checked: query.regexp,\n onchange: this.commit\n });\n this.wordField = elt(\"input\", {\n type: \"checkbox\",\n name: \"word\",\n form: \"\",\n checked: query.wholeWord,\n onchange: this.commit\n });\n function button(name, onclick, content) {\n return elt(\"button\", { class: \"cm-button\", name, onclick, type: \"button\" }, content);\n }\n this.dom = elt(\"div\", { onkeydown: (e) => this.keydown(e), class: \"cm-search\" }, [\n this.searchField,\n button(\"next\", () => findNext(view), [phrase(view, \"next\")]),\n button(\"prev\", () => findPrevious(view), [phrase(view, \"previous\")]),\n button(\"select\", () => selectMatches(view), [phrase(view, \"all\")]),\n elt(\"label\", null, [this.caseField, phrase(view, \"match case\")]),\n elt(\"label\", null, [this.reField, phrase(view, \"regexp\")]),\n elt(\"label\", null, [this.wordField, phrase(view, \"by word\")]),\n ...view.state.readOnly ? [] : [\n elt(\"br\"),\n this.replaceField,\n button(\"replace\", () => replaceNext(view), [phrase(view, \"replace\")]),\n button(\"replaceAll\", () => replaceAll(view), [phrase(view, \"replace all\")])\n ],\n elt(\"button\", {\n name: \"close\",\n onclick: () => closeSearchPanel(view),\n \"aria-label\": phrase(view, \"close\"),\n type: \"button\"\n }, [\"×\"])\n ]);\n }\n commit() {\n let query = new SearchQuery({\n search: this.searchField.value,\n caseSensitive: this.caseField.checked,\n regexp: this.reField.checked,\n wholeWord: this.wordField.checked,\n replace: this.replaceField.value,\n });\n if (!query.eq(this.query)) {\n this.query = query;\n this.view.dispatch({ effects: setSearchQuery.of(query) });\n }\n }\n keydown(e) {\n if (runScopeHandlers(this.view, e, \"search-panel\")) {\n e.preventDefault();\n }\n else if (e.keyCode == 13 && e.target == this.searchField) {\n e.preventDefault();\n (e.shiftKey ? findPrevious : findNext)(this.view);\n }\n else if (e.keyCode == 13 && e.target == this.replaceField) {\n e.preventDefault();\n replaceNext(this.view);\n }\n }\n update(update) {\n for (let tr of update.transactions)\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery) && !effect.value.eq(this.query))\n this.setQuery(effect.value);\n }\n }\n setQuery(query) {\n this.query = query;\n this.searchField.value = query.search;\n this.replaceField.value = query.replace;\n this.caseField.checked = query.caseSensitive;\n this.reField.checked = query.regexp;\n this.wordField.checked = query.wholeWord;\n }\n mount() {\n this.searchField.select();\n }\n get pos() { return 80; }\n get top() { return this.view.state.facet(searchConfigFacet).top; }\n}\nfunction phrase(view, phrase) { return view.state.phrase(phrase); }\nconst AnnounceMargin = 30;\nconst Break = /[\\s\\.,:;?!]/;\nfunction announceMatch(view, { from, to }) {\n let line = view.state.doc.lineAt(from), lineEnd = view.state.doc.lineAt(to).to;\n let start = Math.max(line.from, from - AnnounceMargin), end = Math.min(lineEnd, to + AnnounceMargin);\n let text = view.state.sliceDoc(start, end);\n if (start != line.from) {\n for (let i = 0; i < AnnounceMargin; i++)\n if (!Break.test(text[i + 1]) && Break.test(text[i])) {\n text = text.slice(i);\n break;\n }\n }\n if (end != lineEnd) {\n for (let i = text.length - 1; i > text.length - AnnounceMargin; i--)\n if (!Break.test(text[i - 1]) && Break.test(text[i])) {\n text = text.slice(0, i);\n break;\n }\n }\n return EditorView.announce.of(`${view.state.phrase(\"current match\")}. ${text} ${view.state.phrase(\"on line\")} ${line.number}.`);\n}\nconst baseTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-panel.cm-search\": {\n padding: \"2px 6px 4px\",\n position: \"relative\",\n \"& [name=close]\": {\n position: \"absolute\",\n top: \"0\",\n right: \"4px\",\n backgroundColor: \"inherit\",\n border: \"none\",\n font: \"inherit\",\n padding: 0,\n margin: 0\n },\n \"& input, & button, & label\": {\n margin: \".2em .6em .2em 0\"\n },\n \"& input[type=checkbox]\": {\n marginRight: \".2em\"\n },\n \"& label\": {\n fontSize: \"80%\",\n whiteSpace: \"pre\"\n }\n },\n \"&light .cm-searchMatch\": { backgroundColor: \"#ffff0054\" },\n \"&dark .cm-searchMatch\": { backgroundColor: \"#00ffff8a\" },\n \"&light .cm-searchMatch-selected\": { backgroundColor: \"#ff6a0054\" },\n \"&dark .cm-searchMatch-selected\": { backgroundColor: \"#ff00ff8a\" }\n});\nconst searchExtensions = [\n searchState,\n /*@__PURE__*/Prec.low(searchHighlighter),\n baseTheme\n];\n\nexport { RegExpCursor, SearchCursor, SearchQuery, closeSearchPanel, findNext, findPrevious, getSearchQuery, gotoLine, highlightSelectionMatches, openSearchPanel, replaceAll, replaceNext, search, searchKeymap, searchPanelOpen, selectMatches, selectNextOccurrence, selectSelectionMatches, setSearchQuery };\n","import { EditorSelection, MapMode, Prec, RangeSetBuilder, StateEffect, StateField } from '@codemirror/state';\nimport { foldCode, matchBrackets, indentUnit, ensureSyntaxTree, StringStream } from '@codemirror/language';\nimport * as View from '@codemirror/view';\nimport { runScopeHandlers, EditorView, Direction, ViewPlugin, Decoration, showPanel } from '@codemirror/view';\nimport { SearchQuery, setSearchQuery, RegExpCursor } from '@codemirror/search';\nimport { indentMore, indentLess, cursorLineBoundaryBackward, cursorLineBoundaryForward, cursorCharBackward, cursorCharLeft, insertNewlineAndIndent, indentSelection, undo, redo } from '@codemirror/commands';\n\n//@ts-check\n\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n/**\n * Supported keybindings:\n * Too many to list. Refer to defaultKeymap below.\n *\n * Supported Ex commands:\n * Refer to defaultExCommandMap below.\n *\n * Registers: unnamed, -, ., :, /, _, a-z, A-Z, 0-9\n * (Does not respect the special case for number registers when delete\n * operator is made with these commands: %, (, ), , /, ?, n, N, {, } )\n * TODO: Implement the remaining registers.\n *\n * Marks: a-z, A-Z, and 0-9\n * TODO: Implement the remaining special marks. They have more complex\n * behavior.\n *\n * Events:\n * 'vim-mode-change' - raised on the editor anytime the current mode changes,\n * Event object: {mode: \"visual\", subMode: \"linewise\"}\n *\n * Code structure:\n * 1. Default keymap\n * 2. Variable declarations and short basic helpers\n * 3. Instance (External API) implementation\n * 4. Internal state tracking objects (input state, counter) implementation\n * and instantiation\n * 5. Key handler (the main command dispatcher) implementation\n * 6. Motion, operator, and action implementations\n * 7. Helper functions for the key handler, motions, operators, and actions\n * 8. Set up Vim to work as a keymap for CodeMirror.\n * 9. Ex command implementations.\n */\n\n/**\n * @typedef { import(\"./cm_adapter\").CodeMirror } CodeMirror\n * @typedef { import(\"./types\").CodeMirrorV} CodeMirrorV\n * @typedef { import(\"./types\").Pos } Pos\n * @typedef { import(\"./types\").CM5Range } CM5Range\n * @typedef { import(\"./types\").vimState } vimState \n * @typedef { import(\"./types\").ExFn } ExFn\n * @typedef { import(\"./types\").MotionArgs } MotionArgs\n * @typedef { import(\"./types\").ActionArgs } ActionArgs\n * @typedef { import(\"./types\").OperatorArgs } OperatorArgs\n * @typedef { import(\"./types\").vimKey } vimKey\n * @typedef { import(\"./types\").InputStateInterface } InputStateInterface\n */\n\n/** @arg {typeof import(\"./cm_adapter\").CodeMirror} CodeMirror */\nfunction initVim(CodeMirror) {\n\n var Pos = CodeMirror.Pos;\n\n /** @arg {CodeMirror} cm @arg {Pos} curStart @arg {Pos} curEnd */\n function updateSelectionForSurrogateCharacters(cm, curStart, curEnd) {\n // start and character position when no selection \n // is the same in visual mode, and differs in 1 character in normal mode\n if (curStart.line === curEnd.line && curStart.ch >= curEnd.ch - 1) {\n var text = cm.getLine(curStart.line);\n var charCode = text.charCodeAt(curStart.ch);\n if (0xD800 <= charCode && charCode <= 0xD8FF) {\n curEnd.ch += 1;\n }\n }\n\n return {start: curStart, end: curEnd};\n }\n /** @type {import(\"./types\").vimKeyMap} */\n var defaultKeymap = [\n // Key to key mapping. This goes first to make it possible to override\n // existing mappings.\n { keys: '<Left>', type: 'keyToKey', toKeys: 'h' },\n { keys: '<Right>', type: 'keyToKey', toKeys: 'l' },\n { keys: '<Up>', type: 'keyToKey', toKeys: 'k' },\n { keys: '<Down>', type: 'keyToKey', toKeys: 'j' },\n { keys: 'g<Up>', type: 'keyToKey', toKeys: 'gk' },\n { keys: 'g<Down>', type: 'keyToKey', toKeys: 'gj' },\n { keys: '<Space>', type: 'keyToKey', toKeys: 'l' },\n { keys: '<BS>', type: 'keyToKey', toKeys: 'h'},\n { keys: '<Del>', type: 'keyToKey', toKeys: 'x' },\n { keys: '<C-Space>', type: 'keyToKey', toKeys: 'W' },\n { keys: '<C-BS>', type: 'keyToKey', toKeys: 'B' },\n { keys: '<S-Space>', type: 'keyToKey', toKeys: 'w' },\n { keys: '<S-BS>', type: 'keyToKey', toKeys: 'b' },\n { keys: '<C-n>', type: 'keyToKey', toKeys: 'j' },\n { keys: '<C-p>', type: 'keyToKey', toKeys: 'k' },\n { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>' },\n { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>' },\n { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n { keys: '<C-Esc>', type: 'keyToKey', toKeys: '<Esc>' }, // ipad keyboard sends C-Esc instead of C-[\n { keys: '<C-Esc>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' },\n { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'},\n { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' },\n { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' },\n { keys: '<Home>', type: 'keyToKey', toKeys: '0' },\n { keys: '<End>', type: 'keyToKey', toKeys: '$' },\n { keys: '<PageUp>', type: 'keyToKey', toKeys: '<C-b>' },\n { keys: '<PageDown>', type: 'keyToKey', toKeys: '<C-f>' },\n { keys: '<CR>', type: 'keyToKey', toKeys: 'j^', context: 'normal' },\n { keys: '<Ins>', type: 'keyToKey', toKeys: 'i', context: 'normal'},\n { keys: '<Ins>', type: 'action', action: 'toggleOverwrite', context: 'insert' },\n // Motions\n { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }},\n { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }},\n { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }},\n { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }},\n { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }},\n { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }},\n { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }},\n { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }},\n { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }},\n { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }},\n { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }},\n { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }},\n { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }},\n { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }},\n { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }},\n { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }},\n { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }},\n { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }},\n { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }},\n { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }},\n { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }},\n { keys: '<C-f>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }},\n { keys: '<C-b>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }},\n { keys: '<C-d>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }},\n { keys: '<C-u>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }},\n { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }},\n { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }},\n {keys: \"g$\", type: \"motion\", motion: \"moveToEndOfDisplayLine\"},\n {keys: \"g^\", type: \"motion\", motion: \"moveToStartOfDisplayLine\"},\n {keys: \"g0\", type: \"motion\", motion: \"moveToStartOfDisplayLine\"},\n { keys: '0', type: 'motion', motion: 'moveToStartOfLine' },\n { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }},\n { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }},\n { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }},\n { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }},\n { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }},\n { keys: 'f<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }},\n { keys: 'F<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }},\n { keys: 't<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }},\n { keys: 'T<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }},\n { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }},\n { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }},\n { keys: '\\'<register>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}},\n { keys: '`<register>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}},\n { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },\n { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },\n { keys: ']\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },\n { keys: '[\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },\n // the next two aren't motions but must come before more general motion declarations\n { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}},\n { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}},\n { keys: ']<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}},\n { keys: '[<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}},\n { keys: '|', type: 'motion', motion: 'moveToColumn'},\n { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'},\n { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'},\n // Operators\n { keys: 'd', type: 'operator', operator: 'delete' },\n { keys: 'y', type: 'operator', operator: 'yank' },\n { keys: 'c', type: 'operator', operator: 'change' },\n { keys: '=', type: 'operator', operator: 'indentAuto' },\n { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }},\n { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }},\n { keys: 'g~', type: 'operator', operator: 'changeCase' },\n { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true },\n { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true },\n { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }},\n { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }},\n { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }},\n { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }},\n { keys: 'gq', type: 'operator', operator: 'hardWrap' },\n { keys: 'gw', type: 'operator', operator: 'hardWrap', operatorArgs: {keepCursor: true}},\n // Operator-Motion dual commands\n { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }},\n { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},\n { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'},\n { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'},\n { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'},\n { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'},\n { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'},\n { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'},\n { keys: '<C-u>', type: 'operatorMotion', operator: 'delete', motion: 'moveToStartOfLine', context: 'insert' },\n { keys: '<C-w>', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' },\n //ignore C-w in normal mode\n { keys: '<C-w>', type: 'idle', context: 'normal' },\n // Actions\n { keys: '<C-i>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }},\n { keys: '<C-o>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }},\n { keys: '<C-e>', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }},\n { keys: '<C-y>', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }},\n { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' },\n { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' },\n { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' },\n { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' },\n { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' },\n { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' },\n { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol'}, context: 'normal' },\n { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' },\n { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' },\n { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' },\n { keys: 'v', type: 'action', action: 'toggleVisualMode' },\n { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }},\n { keys: '<C-v>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},\n { keys: '<C-q>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},\n { keys: 'gv', type: 'action', action: 'reselectLastSelection' },\n { keys: 'J', type: 'action', action: 'joinLines', isEdit: true },\n { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true },\n { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }},\n { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }},\n { keys: 'r<character>', type: 'action', action: 'replace', isEdit: true },\n { keys: '@<register>', type: 'action', action: 'replayMacro' },\n { keys: 'q<register>', type: 'action', action: 'enterMacroRecordMode' },\n // Handle Replace-mode as a special case of insert mode.\n { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'},\n { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true},\n { keys: 'u', type: 'action', action: 'undo', context: 'normal' },\n { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true },\n { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true },\n { keys: '<C-r>', type: 'action', action: 'redo' },\n { keys: 'm<register>', type: 'action', action: 'setMark' },\n { keys: '\"<register>', type: 'action', action: 'setRegister' },\n { keys: '<C-r><register>', type: 'action', action: 'insertRegister', context: 'insert', isEdit: true },\n { keys: '<C-o>', type: 'action', action: 'oneNormalCommand', context: 'insert' },\n { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }},\n { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }},\n { keys: 'z<CR>', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }},\n { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: '.', type: 'action', action: 'repeatLastEdit' },\n { keys: '<C-a>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}},\n { keys: '<C-x>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}},\n { keys: '<C-t>', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' },\n { keys: '<C-d>', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' },\n // Text object motions\n { keys: 'a<register>', type: 'motion', motion: 'textObjectManipulation' },\n { keys: 'i<register>', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }},\n // Search\n { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},\n { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},\n { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},\n { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},\n // Ex command\n { keys: ':', type: 'ex' }\n ];\n var defaultKeymapLength = defaultKeymap.length;\n\n /**\n * Ex commands\n * Care must be taken when adding to the default Ex command map. For any\n * pair of commands that have a shared prefix, at least one of their\n * shortNames must not match the prefix of the other command.\n */\n var defaultExCommandMap = [\n { name: 'colorscheme', shortName: 'colo' },\n { name: 'map' },\n { name: 'imap', shortName: 'im' },\n { name: 'nmap', shortName: 'nm' },\n { name: 'vmap', shortName: 'vm' },\n { name: 'omap', shortName: 'om' },\n { name: 'noremap', shortName: 'no' },\n { name: 'nnoremap', shortName: 'nn' },\n { name: 'vnoremap', shortName: 'vn' },\n { name: 'inoremap', shortName: 'ino' },\n { name: 'onoremap', shortName: 'ono' },\n { name: 'unmap' },\n { name: 'mapclear', shortName: 'mapc' },\n { name: 'nmapclear', shortName: 'nmapc' },\n { name: 'vmapclear', shortName: 'vmapc' },\n { name: 'imapclear', shortName: 'imapc' },\n { name: 'omapclear', shortName: 'omapc' },\n { name: 'write', shortName: 'w' },\n { name: 'undo', shortName: 'u' },\n { name: 'redo', shortName: 'red' },\n { name: 'set', shortName: 'se' },\n { name: 'setlocal', shortName: 'setl' },\n { name: 'setglobal', shortName: 'setg' },\n { name: 'sort', shortName: 'sor' },\n { name: 'substitute', shortName: 's', possiblyAsync: true },\n { name: 'startinsert', shortName: 'start' },\n { name: 'nohlsearch', shortName: 'noh' },\n { name: 'yank', shortName: 'y' },\n { name: 'delmarks', shortName: 'delm' },\n { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },\n { name: 'vglobal', shortName: 'v' },\n { name: 'delete', shortName: 'd' },\n { name: 'join', shortName: 'j' },\n { name: 'normal', shortName: 'norm' },\n { name: 'global', shortName: 'g' }\n ];\n\n /**\n * Langmap\n * Determines how to interpret keystrokes in Normal and Visual mode.\n * Useful for people who use a different keyboard layout than QWERTY\n */\n var langmap = parseLangmap('');\n\n /** @arg {CodeMirror} cm */\n function enterVimMode(cm) {\n cm.setOption('disableInput', true);\n cm.setOption('showCursorWhenSelecting', false);\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n cm.on('cursorActivity', onCursorActivity);\n maybeInitVimState(cm);\n // @ts-ignore\n CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));\n }\n\n /** @arg {CodeMirror} cm */\n function leaveVimMode(cm) {\n cm.setOption('disableInput', false);\n cm.off('cursorActivity', onCursorActivity);\n // @ts-ignore\n CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));\n cm.state.vim = null;\n if (highlightTimeout) clearTimeout(highlightTimeout);\n }\n\n /** @arg {CodeMirrorV} cm */\n function getOnPasteFn(cm) {\n var vim = cm.state.vim;\n if (!vim.onPasteFn) {\n vim.onPasteFn = function() {\n if (!vim.insertMode) {\n cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n actions.enterInsertMode(cm, {}, vim);\n }\n };\n }\n return vim.onPasteFn;\n }\n\n var numberRegex = /[\\d]/;\n var wordCharTest = [CodeMirror.isWordChar, function(ch) {\n return ch && !CodeMirror.isWordChar(ch) && !/\\s/.test(ch);\n }], bigWordCharTest = [function(ch) {\n return /\\S/.test(ch);\n }];\n var validMarks = ['<', '>'];\n var validRegisters = ['-', '\"', '.', ':', '_', '/', '+'];\n var latinCharRegex = /^\\w$/;\n var upperCaseChars;\n try { upperCaseChars = new RegExp(\"^[\\\\p{Lu}]$\", \"u\"); }\n catch (_) { upperCaseChars = /^[A-Z]$/; }\n\n /** @arg {CodeMirror} cm @arg {number} line */\n function isLine(cm, line) {\n return line >= cm.firstLine() && line <= cm.lastLine();\n }\n /** @arg {string} k */\n function isLowerCase(k) {\n return (/^[a-z]$/).test(k);\n }\n /** @arg {string} k */\n function isMatchableSymbol(k) {\n return '()[]{}'.indexOf(k) != -1;\n }\n /** @arg {string} k */\n function isNumber(k) {\n return numberRegex.test(k);\n }\n /** @arg {string} k */\n function isUpperCase(k) {\n return upperCaseChars.test(k);\n }\n /** @arg {string} k */\n function isWhiteSpaceString(k) {\n return (/^\\s*$/).test(k);\n }\n /** @arg {string} k */\n function isEndOfSentenceSymbol(k) {\n return '.?!'.indexOf(k) != -1;\n }\n /** @arg {any} val @arg {string | any[]} arr */\n function inArray(val, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] == val) {\n return true;\n }\n }\n return false;\n }\n\n\n /** @typedef {import(\"./types\").optionCallback} optionCallback */\n /** @typedef {import(\"./types\").vimOption} vimOption */\n /** @type {Object<string, vimOption>} */\n var options = {};\n /** \n * @arg {string} name \n * @arg {any} defaultValue \n * @arg {string} type \n * @arg {string[] } [aliases] \n * @arg {optionCallback} [callback] \n * */\n function defineOption(name, defaultValue, type, aliases, callback) {\n if (defaultValue === undefined && !callback) {\n throw Error('defaultValue is required unless callback is provided');\n }\n if (!type) { type = 'string'; }\n options[name] = {\n type: type,\n defaultValue: defaultValue,\n callback: callback\n };\n if (aliases) {\n for (var i = 0; i < aliases.length; i++) {\n options[aliases[i]] = options[name];\n }\n }\n if (defaultValue) {\n setOption(name, defaultValue);\n }\n }\n\n /**\n * @arg {string} name \n * @arg {any} value \n * @arg {CodeMirrorV} [cm] \n * @arg {{ scope?: any; } | undefined} [cfg] */\n function setOption(name, value, cm, cfg) {\n var option = options[name];\n cfg = cfg || {};\n var scope = cfg.scope;\n if (!option) {\n return new Error('Unknown option: ' + name);\n }\n if (option.type == 'boolean') {\n if (value && value !== true) {\n return new Error('Invalid argument: ' + name + '=' + value);\n } else if (value !== false) {\n // Boolean options are set to true if value is not defined.\n value = true;\n }\n }\n if (option.callback) {\n if (scope !== 'local') {\n option.callback(value, undefined);\n }\n if (scope !== 'global' && cm) {\n option.callback(value, cm);\n }\n } else {\n if (scope !== 'local') {\n option.value = option.type == 'boolean' ? !!value : value;\n }\n if (scope !== 'global' && cm) {\n cm.state.vim.options[name] = {value: value};\n }\n }\n }\n\n /** \n * @arg {string} name \n * @arg {CodeMirrorV} [cm] \n * @arg {{ scope?: any; } | undefined} [cfg] */\n function getOption(name, cm, cfg) {\n var option = options[name];\n cfg = cfg || {};\n var scope = cfg.scope;\n if (!option) {\n return new Error('Unknown option: ' + name);\n }\n if (option.callback) {\n let local = cm && option.callback(undefined, cm);\n if (scope !== 'global' && local !== undefined) {\n return local;\n }\n if (scope !== 'local') {\n return option.callback();\n }\n return;\n } else {\n let local = (scope !== 'global') && (cm && cm.state.vim.options[name]);\n return (local || (scope !== 'local') && option || {}).value;\n }\n }\n /** @arg {string|undefined} name @arg {CodeMirrorV} [cm] */\n defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) {\n // Option is local. Do nothing for global.\n if (cm === undefined) {\n return;\n }\n // The 'filetype' option proxies to the CodeMirror 'mode' option.\n if (name === undefined) {\n let mode = cm.getOption('mode');\n return mode == 'null' ? '' : mode;\n } else {\n let mode = name == '' ? 'null' : name;\n cm.setOption('mode', mode);\n }\n });\n defineOption('textwidth', 80, 'number', ['tw'], function(width, cm) {\n // Option is local. Do nothing for global.\n if (cm === undefined) {\n return;\n }\n // The 'filetype' option proxies to the CodeMirror 'mode' option.\n if (width === undefined) {\n var value = cm.getOption('textwidth');\n return value;\n } else {\n var column = Math.round(/**@type {any}*/(width));\n if (column > 1) {\n cm.setOption('textwidth', column);\n }\n }\n });\n\n var createCircularJumpList = function() {\n var size = 100;\n var pointer = -1;\n var head = 0;\n var tail = 0;\n var buffer = new Array(size);\n /** @arg {CodeMirror} cm @arg {any} oldCur @arg {any} newCur */\n function add(cm, oldCur, newCur) {\n var current = pointer % size;\n var curMark = buffer[current];\n /** @arg {Pos} cursor */\n function useNextSlot(cursor) {\n var next = ++pointer % size;\n var trashMark = buffer[next];\n if (trashMark) {\n trashMark.clear();\n }\n buffer[next] = cm.setBookmark(cursor);\n }\n if (curMark) {\n var markPos = curMark.find();\n // avoid recording redundant cursor position\n if (markPos && !cursorEqual(markPos, oldCur)) {\n useNextSlot(oldCur);\n }\n } else {\n useNextSlot(oldCur);\n }\n useNextSlot(newCur);\n head = pointer;\n tail = pointer - size + 1;\n if (tail < 0) {\n tail = 0;\n }\n }\n /** @arg {CodeMirror} cm @arg {number} offset */\n function move(cm, offset) {\n pointer += offset;\n if (pointer > head) {\n pointer = head;\n } else if (pointer < tail) {\n pointer = tail;\n }\n var mark = buffer[(size + pointer) % size];\n // skip marks that are temporarily removed from text buffer\n if (mark && !mark.find()) {\n var inc = offset > 0 ? 1 : -1;\n var newCur;\n var oldCur = cm.getCursor();\n do {\n pointer += inc;\n mark = buffer[(size + pointer) % size];\n // skip marks that are the same as current position\n if (mark &&\n (newCur = mark.find()) &&\n !cursorEqual(oldCur, newCur)) {\n break;\n }\n } while (pointer < head && pointer > tail);\n }\n return mark;\n }\n /** @arg {CodeMirror} cm @arg {number} offset */\n function find(cm, offset) {\n var oldPointer = pointer;\n var mark = move(cm, offset);\n pointer = oldPointer;\n return mark && mark.find();\n }\n return {\n cachedCursor: undefined, //used for # and * jumps\n add: add,\n find: find,\n move: move\n };\n };\n\n /** \n * Returns an object to track the changes associated insert mode. It\n * clones the object that is passed in, or creates an empty object one if\n * none is provided.\n * @arg {import(\"./types\").InsertModeChanges | undefined} [c]\n * @returns {import(\"./types\").InsertModeChanges} \n */\n var createInsertModeChanges = function(c) {\n if (c) {\n // Copy construction\n return {\n changes: c.changes,\n expectCursorActivityForChange: c.expectCursorActivityForChange\n };\n }\n return {\n // Change list\n changes: [],\n // Set to true on change, false on cursorActivity.\n expectCursorActivityForChange: false\n };\n };\n\n class MacroModeState {\n constructor() {\n this.latestRegister = undefined;\n this.isPlaying = false;\n this.isRecording = false;\n this.replaySearchQueries = [];\n this.onRecordingDone = undefined;\n this.lastInsertModeChanges = createInsertModeChanges();\n }\n exitMacroRecordMode() {\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.onRecordingDone) {\n macroModeState.onRecordingDone(); // close dialog\n }\n macroModeState.onRecordingDone = undefined;\n macroModeState.isRecording = false;\n }\n enterMacroRecordMode(cm, registerName) {\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (register) {\n register.clear();\n this.latestRegister = registerName;\n if (cm.openDialog) {\n var template = dom('span', {class: 'cm-vim-message'}, 'recording @' + registerName);\n this.onRecordingDone = cm.openDialog(template, null, {bottom:true});\n }\n this.isRecording = true;\n }\n }\n }\n /**\n * @arg Codemirror\n * @return {vimState}\n */\n function maybeInitVimState(cm) {\n if (!cm.state.vim) {\n // Store instance state in the CodeMirror object.\n cm.state.vim = {\n inputState: new InputState(),\n // Vim's input state that triggered the last edit, used to repeat\n // motions and operators with '.'.\n lastEditInputState: undefined,\n // Vim's action command before the last edit, used to repeat actions\n // with '.' and insert mode repeat.\n lastEditActionCommand: undefined,\n // When using jk for navigation, if you move from a longer line to a\n // shorter line, the cursor may clip to the end of the shorter line.\n // If j is pressed again and cursor goes to the next line, the\n // cursor should go back to its horizontal position on the longer\n // line if it can. This is to keep track of the horizontal position.\n lastHPos: -1,\n // Doing the same with screen-position for gj/gk\n lastHSPos: -1,\n // The last motion command run. Cleared if a non-motion command gets\n // executed in between.\n lastMotion: null,\n marks: {},\n insertMode: false,\n insertModeReturn: false,\n // Repeat count for changes made in insert mode, triggered by key\n // sequences like 3,i. Only exists when insertMode is true.\n insertModeRepeat: undefined,\n visualMode: false,\n // If we are in visual line mode. No effect if visualMode is false.\n visualLine: false,\n visualBlock: false,\n lastSelection: null,\n lastPastedText: null,\n sel: {},\n // Buffer-local/window-local values of vim options.\n options: {},\n // Whether the next character should be interpreted literally\n // Necassary for correct implementation of f<character>, r<character> etc.\n // in terms of langmaps.\n expectLiteralNext: false\n };\n }\n return cm.state.vim;\n }\n /**\n * @type { \n {\n macroModeState: MacroModeState;\n registerController: RegisterController;\n searchHistoryController: HistoryController;\n jumpList: any;\n exCommandHistoryController: HistoryController; \n lastCharacterSearch: any; \n query?: any;\n isReversed?: any;\n lastSubstituteReplacePart: any;\n searchQuery?: null; \n searchIsReversed?: boolean; \n }\n }\n */\n var vimGlobalState;\n function resetVimGlobalState() {\n vimGlobalState = {\n // The current search query.\n searchQuery: null,\n // Whether we are searching backwards.\n searchIsReversed: false,\n // Replace part of the last substituted pattern\n lastSubstituteReplacePart: undefined,\n jumpList: createCircularJumpList(),\n macroModeState: new MacroModeState(),\n // Recording latest f, t, F or T motion command.\n lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''},\n registerController: new RegisterController({}),\n // search history buffer\n searchHistoryController: new HistoryController(),\n // ex Command history buffer\n exCommandHistoryController : new HistoryController()\n };\n for (var optionName in options) {\n var option = options[optionName];\n option.value = option.defaultValue;\n }\n }\n\n /** @type {number | undefined|false} */\n var lastInsertModeKeyTimer;\n var vimApi = {\n enterVimMode: enterVimMode,\n leaveVimMode: leaveVimMode,\n buildKeyMap: function() {\n // TODO: Convert keymap into dictionary format for fast lookup.\n },\n // Testing hook, though it might be useful to expose the register\n // controller anyway.\n getRegisterController: function() {\n return vimGlobalState.registerController;\n },\n // Testing hook.\n resetVimGlobalState_: resetVimGlobalState,\n\n // Testing hook.\n getVimGlobalState_: function() {\n return vimGlobalState;\n },\n\n // Testing hook.\n maybeInitVimState_: maybeInitVimState,\n\n suppressErrorLogging: false,\n\n InsertModeKey: InsertModeKey,\n /**@type {(lhs: string, rhs: string, ctx: string) => void} */\n map: function(lhs, rhs, ctx) {\n // Add user defined key bindings.\n exCommandDispatcher.map(lhs, rhs, ctx);\n },\n /**@type {(lhs: string, ctx: string) => any} */\n unmap: function(lhs, ctx) {\n return exCommandDispatcher.unmap(lhs, ctx);\n },\n // Non-recursive map function.\n // NOTE: This will not create mappings to key maps that aren't present\n // in the default key map. See TODO at bottom of function.\n /**@type {(lhs: string, rhs: string, ctx: string) => void} */\n noremap: function(lhs, rhs, ctx) {\n exCommandDispatcher.map(lhs, rhs, ctx, true);\n },\n // Remove all user-defined mappings for the provided context.\n /**@arg {string} [ctx]} */\n mapclear: function(ctx) {\n // Partition the existing keymap into user-defined and true defaults.\n var actualLength = defaultKeymap.length,\n origLength = defaultKeymapLength;\n var userKeymap = defaultKeymap.slice(0, actualLength - origLength);\n defaultKeymap = defaultKeymap.slice(actualLength - origLength);\n if (ctx) {\n // If a specific context is being cleared, we need to keep mappings\n // from all other contexts.\n for (var i = userKeymap.length - 1; i >= 0; i--) {\n var mapping = userKeymap[i];\n if (ctx !== mapping.context) {\n if (mapping.context) {\n this._mapCommand(mapping);\n } else {\n // `mapping` applies to all contexts so create keymap copies\n // for each context except the one being cleared.\n var contexts = ['normal', 'insert', 'visual'];\n for (var j in contexts) {\n if (contexts[j] !== ctx) {\n var newMapping = Object.assign({}, mapping);\n newMapping.context = contexts[j];\n this._mapCommand(newMapping);\n }\n }\n }\n }\n }\n }\n },\n langmap: updateLangmap,\n vimKeyFromEvent: vimKeyFromEvent,\n // TODO: Expose setOption and getOption as instance methods. Need to decide how to namespace\n // them, or somehow make them work with the existing CodeMirror setOption/getOption API.\n setOption: setOption,\n getOption: getOption,\n defineOption: defineOption,\n /**@type {(name: string, prefix: string|undefined, func: ExFn) => void} */\n defineEx: function(name, prefix, func){\n if (!prefix) {\n prefix = name;\n } else if (name.indexOf(prefix) !== 0) {\n throw new Error('(Vim.defineEx) \"'+prefix+'\" is not a prefix of \"'+name+'\", command not registered');\n }\n exCommands[name]=func;\n exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};\n },\n /**@type {(cm: CodeMirror, key: string, origin: string) => undefined | boolean} */\n handleKey: function (cm, key, origin) {\n var command = this.findKey(cm, key, origin);\n if (typeof command === 'function') {\n return command();\n }\n },\n multiSelectHandleKey: multiSelectHandleKey,\n\n /**\n * This is the outermost function called by CodeMirror, after keys have\n * been mapped to their Vim equivalents.\n *\n * Finds a command based on the key (and cached keys if there is a\n * multi-key sequence). Returns `undefined` if no key is matched, a noop\n * function if a partial match is found (multi-key), and a function to\n * execute the bound command if a a key is matched. The function always\n * returns true.\n */\n /**@type {(cm_: CodeMirror, key: string, origin?: string| undefined) => (() => boolean) | undefined} */\n findKey: function(cm_, key, origin) {\n var vim = maybeInitVimState(cm_);\n var cm = /**@type {CodeMirrorV}*/(cm_);\n\n function handleMacroRecording() {\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isRecording) {\n if (key == 'q') {\n macroModeState.exitMacroRecordMode();\n clearInputState(cm);\n return true;\n }\n if (origin != 'mapping') {\n logKey(macroModeState, key);\n }\n }\n }\n function handleEsc() {\n if (key == '<Esc>') {\n if (vim.visualMode) {\n // Get back to normal mode.\n exitVisualMode(cm);\n } else if (vim.insertMode) {\n // Get back to normal mode.\n exitInsertMode(cm);\n } else {\n // We're already in normal mode. Let '<Esc>' be handled normally.\n return;\n }\n clearInputState(cm);\n return true;\n }\n }\n\n function handleKeyInsertMode() {\n if (handleEsc()) { return true; }\n vim.inputState.keyBuffer.push(key);\n var keys = vim.inputState.keyBuffer.join(\"\");\n var keysAreChars = key.length == 1;\n var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n var changeQueue = vim.inputState.changeQueue;\n\n if (match.type == 'none') { clearInputState(cm); return false; }\n else if (match.type == 'partial') {\n if (match.expectLiteralNext) vim.expectLiteralNext = true;\n if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n lastInsertModeKeyTimer = keysAreChars && window.setTimeout(\n function() { if (vim.insertMode && vim.inputState.keyBuffer.length) { clearInputState(cm); } },\n getOption('insertModeEscKeysTimeout'));\n if (keysAreChars) {\n var selections = cm.listSelections();\n if (!changeQueue || changeQueue.removed.length != selections.length)\n changeQueue = vim.inputState.changeQueue = new ChangeQueue;\n changeQueue.inserted += key;\n for (var i = 0; i < selections.length; i++) {\n var from = cursorMin(selections[i].anchor, selections[i].head);\n var to = cursorMax(selections[i].anchor, selections[i].head);\n var text = cm.getRange(from, cm.state.overwrite ? offsetCursor(to, 0, 1) : to);\n changeQueue.removed[i] = (changeQueue.removed[i] || \"\") + text;\n }\n }\n return !keysAreChars;\n }\n vim.expectLiteralNext = false;\n\n if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n if (match.command && changeQueue) {\n var selections = cm.listSelections();\n for (var i = 0; i < selections.length; i++) {\n var here = selections[i].head;\n cm.replaceRange(changeQueue.removed[i] || \"\", \n offsetCursor(here, 0, -changeQueue.inserted.length), here, '+input');\n }\n vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop();\n }\n if (!match.command) clearInputState(cm);\n return match.command;\n }\n\n function handleKeyNonInsertMode() {\n if (handleMacroRecording() || handleEsc()) { return true; }\n\n vim.inputState.keyBuffer.push(key);\n var keys = vim.inputState.keyBuffer.join(\"\");\n if (/^[1-9]\\d*$/.test(keys)) { return true; }\n\n var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n if (!keysMatcher) { clearInputState(cm); return false; }\n var context = vim.visualMode ? 'visual' :\n 'normal';\n var mainKey = keysMatcher[2] || keysMatcher[1];\n if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) {\n // multikey operators act linewise by repeating only the last character\n mainKey = vim.inputState.operatorShortcut;\n }\n var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context);\n if (match.type == 'none') { clearInputState(cm); return false; }\n else if (match.type == 'partial') {\n if (match.expectLiteralNext) vim.expectLiteralNext = true;\n return true;\n }\n else if (match.type == 'clear') { clearInputState(cm); return true; }\n vim.expectLiteralNext = false;\n\n vim.inputState.keyBuffer.length = 0;\n keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n if (keysMatcher && keysMatcher[1] && keysMatcher[1] != '0') {\n vim.inputState.pushRepeatDigit(keysMatcher[1]);\n }\n return match.command;\n }\n\n var command;\n if (vim.insertMode) { command = handleKeyInsertMode(); }\n else { command = handleKeyNonInsertMode(); }\n if (command === false) {\n return !vim.insertMode && key.length === 1 ? function() { return true; } : undefined;\n } else if (command === true) {\n // TODO: Look into using CodeMirror's multi-key handling.\n // Return no-op since we are caching the key. Counts as handled, but\n // don't want act on it just yet.\n return function() { return true; };\n } else {\n return function() {\n return cm.operation(function() {\n // @ts-ignore\n cm.curOp.isVimOp = true;\n try {\n if (command.type == 'keyToKey') {\n doKeyToKey(cm, command.toKeys, command);\n } else {\n commandDispatcher.processCommand(cm, vim, command);\n }\n } catch (e) {\n // clear VIM state in case it's in a bad state.\n // @ts-ignore\n cm.state.vim = undefined;\n maybeInitVimState(cm);\n if (!vimApi.suppressErrorLogging) {\n console['log'](e);\n }\n throw e;\n }\n return true;\n });\n };\n }\n },\n handleEx: function(cm, input) {\n exCommandDispatcher.processCommand(cm, input);\n },\n\n defineMotion: defineMotion,\n defineAction: defineAction,\n defineOperator: defineOperator,\n mapCommand: mapCommand,\n _mapCommand: _mapCommand,\n\n defineRegister: defineRegister,\n\n exitVisualMode: exitVisualMode,\n exitInsertMode: exitInsertMode\n };\n\n var keyToKeyStack = [];\n var noremap = false;\n var virtualPrompt;\n function sendKeyToPrompt(key) {\n if (key[0] == \"<\") {\n var lowerKey = key.toLowerCase().slice(1, -1);\n var parts = lowerKey.split('-');\n lowerKey = parts.pop() || '';\n if (lowerKey == 'lt') key = '<';\n else if (lowerKey == 'space') key = ' ';\n else if (lowerKey == 'cr') key = '\\n';\n else if (vimToCmKeyMap[lowerKey]) {\n var value = virtualPrompt.value;\n var event = {\n key: vimToCmKeyMap[lowerKey],\n target: {\n value: value,\n selectionEnd: value.length,\n selectionStart: value.length\n }\n };\n if (virtualPrompt.onKeyDown) {\n virtualPrompt.onKeyDown(event, virtualPrompt.value, close);\n }\n if (virtualPrompt && virtualPrompt.onKeyUp) {\n virtualPrompt.onKeyUp(event, virtualPrompt.value, close);\n }\n return;\n }\n }\n if (key == '\\n') {\n var prompt = virtualPrompt;\n virtualPrompt = null;\n prompt.onClose && prompt.onClose(prompt.value);\n } else {\n virtualPrompt.value = (virtualPrompt.value || '') + key;\n }\n\n function close(value) {\n if (typeof value == 'string') { virtualPrompt.value = value; }\n else { virtualPrompt = null; }\n }\n }\n function doKeyToKey(cm, keys, fromKey) {\n var noremapBefore = noremap;\n // prevent infinite recursion.\n if (fromKey) {\n if (keyToKeyStack.indexOf(fromKey) != -1) return;\n keyToKeyStack.push(fromKey);\n noremap = fromKey.noremap != false;\n }\n\n try {\n var vim = maybeInitVimState(cm);\n var keyRe = /<(?:[CSMA]-)*\\w+>|./gi;\n\n var match;\n // Pull off one command key, which is either a single character\n // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n while ((match = keyRe.exec(keys))) {\n var key = match[0];\n var wasInsert = vim.insertMode;\n if (virtualPrompt) {\n sendKeyToPrompt(key);\n continue;\n }\n\n var result = vimApi.handleKey(cm, key, 'mapping');\n\n if (!result && wasInsert && vim.insertMode) {\n if (key[0] == \"<\") {\n var lowerKey = key.toLowerCase().slice(1, -1);\n var parts = lowerKey.split('-');\n lowerKey = parts.pop() || '';\n if (lowerKey == 'lt') key = '<';\n else if (lowerKey == 'space') key = ' ';\n else if (lowerKey == 'cr') key = '\\n';\n else if (vimToCmKeyMap.hasOwnProperty(lowerKey)) {\n // todo support codemirror keys in insertmode vimToCmKeyMap\n key = vimToCmKeyMap[lowerKey];\n sendCmKey(cm, key);\n continue;\n } else {\n key = key[0];\n keyRe.lastIndex = match.index + 1;\n }\n }\n cm.replaceSelection(key);\n }\n }\n } finally {\n keyToKeyStack.pop();\n noremap = keyToKeyStack.length ? noremapBefore : false;\n if (!keyToKeyStack.length && virtualPrompt) {\n var promptOptions = virtualPrompt;\n virtualPrompt = null;\n showPrompt(cm, promptOptions);\n }\n }\n }\n\n var specialKey = {\n Return: 'CR', Backspace: 'BS', 'Delete': 'Del', Escape: 'Esc', Insert: 'Ins',\n ArrowLeft: 'Left', ArrowRight: 'Right', ArrowUp: 'Up', ArrowDown: 'Down',\n Enter: 'CR', ' ': 'Space'\n };\n var ignoredKeys = { Shift: 1, Alt: 1, Command: 1, Control: 1,\n CapsLock: 1, AltGraph: 1, Dead: 1, Unidentified: 1 };\n\n var vimToCmKeyMap = {};\n 'Left|Right|Up|Down|End|Home'.split('|').concat(Object.keys(specialKey)).forEach(function(x) {\n vimToCmKeyMap[(specialKey[x] || '').toLowerCase()]\n = vimToCmKeyMap[x.toLowerCase()] = x;\n });\n\n function vimKeyFromEvent(e, vim) {\n var key = e.key;\n if (ignoredKeys[key]) return;\n if (key.length > 1 && key[0] == \"n\") {\n key = key.replace(\"Numpad\", \"\");\n }\n key = specialKey[key] || key;\n\n var name = '';\n if (e.ctrlKey) { name += 'C-'; }\n if (e.altKey) { name += 'A-'; }\n if (e.metaKey) { name += 'M-'; }\n // on mac many characters are entered as option- combos\n // (e.g. on swiss keyboard { is option-8)\n // so we ignore lonely A- modifier for keypress event on mac\n if (CodeMirror.isMac && e.altKey && !e.metaKey && !e.ctrlKey) {\n name = name.slice(2);\n }\n if ((name || key.length > 1) && e.shiftKey) { name += 'S-'; }\n\n if (vim && !vim.expectLiteralNext && key.length == 1) {\n if (langmap.keymap && key in langmap.keymap) {\n if (langmap.remapCtrl != false || !name)\n key = langmap.keymap[key];\n } else if (key.charCodeAt(0) > 255) {\n var code = e.code?.slice(-1) || \"\";\n if (!e.shiftKey) code = code.toLowerCase();\n if (code) key = code;\n }\n }\n\n name += key;\n if (name.length > 1) { name = '<' + name + '>'; }\n return name;\n }\n // langmap support\n function updateLangmap(langmapString, remapCtrl) {\n if (langmap.string !== langmapString) {\n langmap = parseLangmap(langmapString);\n }\n langmap.remapCtrl = remapCtrl;\n }\n /** \n * From :help langmap\n * The 'langmap' option is a list of parts, separated with commas. Each\n * part can be in one of two forms:\n * 1. A list of pairs. Each pair is a \"from\" character immediately\n * followed by the \"to\" character. Examples: \"aA\", \"aAbBcC\".\n * 2. A list of \"from\" characters, a semi-colon and a list of \"to\"\n * characters. Example: \"abc;ABC\"\n * @arg {string} langmapString\n * @returns {{string: string, keymap: Record<string, string>, remapCtrl?: boolean}}\n */\n function parseLangmap(langmapString) {\n let keymap = ({})/**@type {Record<string, string>}*/;\n if (!langmapString) return { keymap: keymap, string: '' };\n\n function getEscaped(list) {\n return list.split(/\\\\?(.)/).filter(Boolean);\n }\n langmapString.split(/((?:[^\\\\,]|\\\\.)+),/).map(part => {\n if (!part) return;\n const semicolon = part.split(/((?:[^\\\\;]|\\\\.)+);/);\n if (semicolon.length == 3) {\n const from = getEscaped(semicolon[1]);\n const to = getEscaped(semicolon[2]);\n if (from.length !== to.length) return; // skip over malformed part\n for (let i = 0; i < from.length; ++i) keymap[from[i]] = to[i];\n } else if (semicolon.length == 1) {\n const pairs = getEscaped(part);\n if (pairs.length % 2 !== 0) return; // skip over malformed part\n for (let i = 0; i < pairs.length; i += 2) keymap[pairs[i]] = pairs[i + 1];\n }\n });\n\n return { keymap: keymap, string: langmapString };\n }\n\n defineOption('langmap', undefined, 'string', ['lmap'], function(name, cm) {\n // The 'filetype' option proxies to the CodeMirror 'mode' option.\n if (name === undefined) {\n return langmap.string;\n } else {\n updateLangmap(name);\n }\n });\n\n // Represents the current input state.\n class InputState {\n constructor() {\n this.prefixRepeat = [];\n this.motionRepeat = [];\n\n this.operator = null;\n this.operatorArgs = null;\n this.motion = null;\n this.motionArgs = null;\n this.keyBuffer = []; // For matching multi-key commands.\n this.registerName = null; // Defaults to the unnamed register.\n this.changeQueue = null; // For restoring text used by insert mode keybindings\n }\n pushRepeatDigit(n) {\n if (!this.operator) {\n this.prefixRepeat = this.prefixRepeat.concat(n);\n } else {\n this.motionRepeat = this.motionRepeat.concat(n);\n }\n }\n getRepeat() {\n var repeat = 0;\n if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {\n repeat = 1;\n if (this.prefixRepeat.length > 0) {\n repeat *= parseInt(this.prefixRepeat.join(''), 10);\n }\n if (this.motionRepeat.length > 0) {\n repeat *= parseInt(this.motionRepeat.join(''), 10);\n }\n }\n return repeat;\n }\n }\n\n /** @arg {CodeMirrorV} cm @arg {string} [reason] */\n function clearInputState(cm, reason) {\n cm.state.vim.inputState = new InputState();\n cm.state.vim.expectLiteralNext = false;\n CodeMirror.signal(cm, 'vim-command-done', reason);\n }\n\n function ChangeQueue() {\n this.removed = [];\n this.inserted = \"\";\n }\n\n /**\n * Register stores information about copy and paste registers. Besides\n * text, a register must store whether it is linewise (i.e., when it is\n * pasted, should it insert itself into a new line, or should the text be\n * inserted at the cursor position.)\n */\n class Register {\n constructor(text, linewise, blockwise) {\n this.clear();\n this.keyBuffer = [text || ''];\n this.insertModeChanges = [];\n this.searchQueries = [];\n this.linewise = !!linewise;\n this.blockwise = !!blockwise;\n }\n setText(text, linewise, blockwise) {\n this.keyBuffer = [text || ''];\n this.linewise = !!linewise;\n this.blockwise = !!blockwise;\n }\n pushText(text, linewise) {\n // if this register has ever been set to linewise, use linewise.\n if (linewise) {\n if (!this.linewise) {\n this.keyBuffer.push('\\n');\n }\n this.linewise = true;\n }\n this.keyBuffer.push(text);\n }\n pushInsertModeChanges(changes) {\n this.insertModeChanges.push(createInsertModeChanges(changes));\n }\n pushSearchQuery(query) {\n this.searchQueries.push(query);\n }\n clear() {\n this.keyBuffer = [];\n this.insertModeChanges = [];\n this.searchQueries = [];\n this.linewise = false;\n }\n toString() {\n return this.keyBuffer.join('');\n }\n }\n\n /**\n * Defines an external register.\n *\n * The name should be a single character that will be used to reference the register.\n * The register should support setText, pushText, clear, and toString(). See Register\n * for a reference implementation.\n * @arg {string} name\n * @arg {Register} register\n */\n function defineRegister(name, register) {\n var registers = vimGlobalState.registerController.registers;\n if (!name || name.length != 1) {\n throw Error('Register name must be 1 character');\n }\n if (registers[name]) {\n throw Error('Register already defined ' + name);\n }\n registers[name] = register;\n validRegisters.push(name);\n }\n\n /**\n * vim registers allow you to keep many independent copy and paste buffers.\n * See http://usevim.com/2012/04/13/registers/ for an introduction.\n *\n * RegisterController keeps the state of all the registers. An initial\n * state may be passed in. The unnamed register '\"' will always be\n * overridden.\n */\n class RegisterController {\n /** @arg {Object<string, Register>} registers */\n constructor(registers) {\n this.registers = registers;\n this.unnamedRegister = registers['\"'] = new Register();\n registers['.'] = new Register();\n registers[':'] = new Register();\n registers['/'] = new Register();\n registers['+'] = new Register();\n }\n pushText(registerName, operator, text, linewise, blockwise) {\n // The black hole register, \"_, means delete/yank to nowhere.\n if (registerName === '_') return;\n if (linewise && text.charAt(text.length - 1) !== '\\n') {\n text += '\\n';\n }\n // Lowercase and uppercase registers refer to the same register.\n // Uppercase just means append.\n var register = this.isValidRegister(registerName) ?\n this.getRegister(registerName) : null;\n // if no register/an invalid register was specified, things go to the\n // default registers\n if (!register) {\n switch (operator) {\n case 'yank':\n // The 0 register contains the text from the most recent yank.\n this.registers['0'] = new Register(text, linewise, blockwise);\n break;\n case 'delete':\n case 'change':\n if (text.indexOf('\\n') == -1) {\n // Delete less than 1 line. Update the small delete register.\n this.registers['-'] = new Register(text, linewise);\n } else {\n // Shift down the contents of the numbered registers and put the\n // deleted text into register 1.\n this.shiftNumericRegisters_();\n this.registers['1'] = new Register(text, linewise);\n }\n break;\n }\n // Make sure the unnamed register is set to what just happened\n this.unnamedRegister.setText(text, linewise, blockwise);\n return;\n }\n\n // If we've gotten to this point, we've actually specified a register\n var append = isUpperCase(registerName);\n if (append) {\n register.pushText(text, linewise);\n } else {\n register.setText(text, linewise, blockwise);\n }\n if (registerName === '+') {\n navigator.clipboard.writeText(text);\n }\n // The unnamed register always has the same value as the last used\n // register.\n this.unnamedRegister.setText(register.toString(), linewise);\n }\n /**\n * Gets the register named @name. If one of @name doesn't already exist,\n * create it. If @name is invalid, return the unnamedRegister.\n * @arg {string} [name]\n */\n getRegister(name) {\n if (!this.isValidRegister(name)) {\n return this.unnamedRegister;\n }\n name = name.toLowerCase();\n if (!this.registers[name]) {\n this.registers[name] = new Register();\n }\n return this.registers[name];\n }\n /**@type {{(name: any): name is string}} */\n isValidRegister(name) {\n return name && (inArray(name, validRegisters) || latinCharRegex.test(name));\n }\n shiftNumericRegisters_() {\n for (var i = 9; i >= 2; i--) {\n this.registers[i] = this.getRegister('' + (i - 1));\n }\n }\n }\n class HistoryController {\n constructor() {\n this.historyBuffer = [];\n this.iterator = 0;\n this.initialPrefix = null;\n }\n // the input argument here acts a user entered prefix for a small time\n // until we start autocompletion in which case it is the autocompleted.\n nextMatch(input, up) {\n var historyBuffer = this.historyBuffer;\n var dir = up ? -1 : 1;\n if (this.initialPrefix === null) this.initialPrefix = input;\n for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i += dir) {\n var element = historyBuffer[i];\n for (var j = 0; j <= element.length; j++) {\n if (this.initialPrefix == element.substring(0, j)) {\n this.iterator = i;\n return element;\n }\n }\n }\n // should return the user input in case we reach the end of buffer.\n if (i >= historyBuffer.length) {\n this.iterator = historyBuffer.length;\n return this.initialPrefix;\n }\n // return the last autocompleted query or exCommand as it is.\n if (i < 0) return input;\n }\n pushInput(input) {\n var index = this.historyBuffer.indexOf(input);\n if (index > -1) this.historyBuffer.splice(index, 1);\n if (input.length) this.historyBuffer.push(input);\n }\n reset() {\n this.initialPrefix = null;\n this.iterator = this.historyBuffer.length;\n }\n }\n var commandDispatcher = {\n matchCommand: function(keys, keyMap, inputState, context) {\n var matches = commandMatches(keys, keyMap, context, inputState);\n if (!matches.full && !matches.partial) {\n return {type: 'none'};\n } else if (!matches.full && matches.partial) {\n return {\n type: 'partial',\n expectLiteralNext: matches.partial.length == 1 && matches.partial[0].keys.slice(-11) == '<character>' // langmap literal logic\n };\n }\n\n var bestMatch;\n // @ts-ignore\n for (var i = 0; i < matches.full.length; i++) {\n var match = matches.full[i];\n if (!bestMatch) {\n bestMatch = match;\n }\n }\n if (bestMatch.keys.slice(-11) == '<character>' || bestMatch.keys.slice(-10) == '<register>') {\n var character = lastChar(keys);\n if (!character || character.length > 1) return {type: 'clear'};\n inputState.selectedCharacter = character;\n }\n return {type: 'full', command: bestMatch};\n },\n /**\n * @arg {CodeMirrorV} cm\n * @arg {vimState} vim\n * @arg {vimKey} command\n */\n processCommand: function(cm, vim, command) {\n vim.inputState.repeatOverride = command.repeatOverride;\n switch (command.type) {\n case 'motion':\n this.processMotion(cm, vim, command);\n break;\n case 'operator':\n this.processOperator(cm, vim, command);\n break;\n case 'operatorMotion':\n this.processOperatorMotion(cm, vim, command);\n break;\n case 'action':\n this.processAction(cm, vim, command);\n break;\n case 'search':\n this.processSearch(cm, vim, command);\n break;\n case 'ex':\n case 'keyToEx':\n this.processEx(cm, vim, command);\n break;\n }\n },\n /**\n * @arg {CodeMirrorV} cm\n * @arg {vimState} vim\n * @arg {import(\"./types\").motionCommand|import(\"./types\").operatorMotionCommand} command\n */\n processMotion: function(cm, vim, command) {\n vim.inputState.motion = command.motion;\n vim.inputState.motionArgs = /**@type {MotionArgs}*/(copyArgs(command.motionArgs));\n this.evalInput(cm, vim);\n },\n /**\n * @arg {CodeMirrorV} cm\n * @arg {vimState} vim\n * @arg {import(\"./types\").operatorCommand|import(\"./types\").operatorMotionCommand} command\n */\n processOperator: function(cm, vim, command) {\n var inputState = vim.inputState;\n if (inputState.operator) {\n if (inputState.operator == command.operator) {\n // Typing an operator twice like 'dd' makes the operator operate\n // linewise\n inputState.motion = 'expandToLine';\n inputState.motionArgs = { linewise: true, repeat: 1 };\n this.evalInput(cm, vim);\n return;\n } else {\n // 2 different operators in a row doesn't make sense.\n clearInputState(cm);\n }\n }\n inputState.operator = command.operator;\n inputState.operatorArgs = copyArgs(command.operatorArgs);\n if (command.keys.length > 1) {\n inputState.operatorShortcut = command.keys;\n }\n if (command.exitVisualBlock) {\n vim.visualBlock = false;\n updateCmSelection(cm);\n }\n if (vim.visualMode) {\n // Operating on a selection in visual mode. We don't need a motion.\n this.evalInput(cm, vim);\n }\n },\n /**\n * @arg {CodeMirrorV} cm\n * @arg {vimState} vim\n * @arg {import(\"./types\").operatorMotionCommand} command\n */\n processOperatorMotion: function(cm, vim, command) {\n var visualMode = vim.visualMode;\n var operatorMotionArgs = copyArgs(command.operatorMotionArgs);\n if (operatorMotionArgs) {\n // Operator motions may have special behavior in visual mode.\n if (visualMode && operatorMotionArgs.visualLine) {\n vim.visualLine = true;\n }\n }\n this.processOperator(cm, vim, command);\n if (!visualMode) {\n this.processMotion(cm, vim, command);\n }\n },\n /**\n * @arg {CodeMirrorV} cm\n * @arg {vimState} vim\n * @arg {import(\"./types\").actionCommand} command\n */\n processAction: function(cm, vim, command) {\n var inputState = vim.inputState;\n var repeat = inputState.getRepeat();\n var repeatIsExplicit = !!repeat;\n var actionArgs = /**@type {ActionArgs}*/(copyArgs(command.actionArgs) || {repeat: 1});\n if (inputState.selectedCharacter) {\n actionArgs.selectedCharacter = inputState.selectedCharacter;\n }\n // Actions may or may not have motions and operators. Do these first.\n if (command.operator) {\n // @ts-ignore\n this.processOperator(cm, vim, command);\n }\n if (command.motion) {\n // @ts-ignore\n this.processMotion(cm, vim, command);\n }\n if (command.motion || command.operator) {\n this.evalInput(cm, vim);\n }\n actionArgs.repeat = repeat || 1;\n actionArgs.repeatIsExplicit = repeatIsExplicit;\n actionArgs.registerName = inputState.registerName;\n clearInputState(cm);\n vim.lastMotion = null;\n if (command.isEdit) {\n this.recordLastEdit(vim, inputState, command);\n }\n actions[command.action](cm, actionArgs, vim);\n },\n /** @arg {CodeMirrorV} cm @arg {vimState} vim @arg {import(\"./types\").searchCommand} command*/\n processSearch: function(cm, vim, command) {\n if (!cm.getSearchCursor) {\n // Search depends on SearchCursor.\n return;\n }\n var forward = command.searchArgs.forward;\n var wholeWordOnly = command.searchArgs.wholeWordOnly;\n getSearchState(cm).setReversed(!forward);\n var promptPrefix = (forward) ? '/' : '?';\n var originalQuery = getSearchState(cm).getQuery();\n var originalScrollPos = cm.getScrollInfo();\n /** @arg {string} query @arg {boolean} ignoreCase @arg {boolean} smartCase */\n function handleQuery(query, ignoreCase, smartCase) {\n vimGlobalState.searchHistoryController.pushInput(query);\n vimGlobalState.searchHistoryController.reset();\n try {\n updateSearchQuery(cm, query, ignoreCase, smartCase);\n } catch (e) {\n showConfirm(cm, 'Invalid regex: ' + query);\n clearInputState(cm);\n return;\n }\n commandDispatcher.processMotion(cm, vim, {\n keys: '',\n type: 'motion',\n motion: 'findNext',\n motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }\n });\n }\n /** @arg {string} query */\n function onPromptClose(query) {\n cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n handleQuery(query, true /** ignoreCase */, true /** smartCase */);\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isRecording) {\n logSearchQuery(macroModeState, query);\n }\n }\n /** \n * @arg {KeyboardEvent&{target:HTMLInputElement}} e \n * @arg {any} query \n * @arg {(arg0: any) => void} close \n */\n function onPromptKeyUp(e, query, close) {\n var keyName = vimKeyFromEvent(e), up, offset;\n if (keyName == '<Up>' || keyName == '<Down>') {\n up = keyName == '<Up>' ? true : false;\n offset = e.target ? e.target.selectionEnd : 0;\n query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '';\n close(query);\n if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n } else if (keyName && keyName != '<Left>' && keyName != '<Right>') {\n vimGlobalState.searchHistoryController.reset();\n }\n var parsedQuery;\n try {\n parsedQuery = updateSearchQuery(cm, query,\n true /** ignoreCase */, true /** smartCase */);\n } catch (e) {\n // Swallow bad regexes for incremental search.\n }\n if (parsedQuery) {\n cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);\n } else {\n clearSearchHighlight(cm);\n cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n }\n }\n /** @arg {KeyboardEvent} e @arg {string} query @arg {(arg0?: string) => void} close */\n function onPromptKeyDown(e, query, close) {\n var keyName = vimKeyFromEvent(e);\n if (keyName == '<Esc>' || keyName == '<C-c>' || keyName == '<C-[>' ||\n (keyName == '<BS>' && query == '')) {\n vimGlobalState.searchHistoryController.pushInput(query);\n vimGlobalState.searchHistoryController.reset();\n updateSearchQuery(cm, originalQuery);\n clearSearchHighlight(cm);\n cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n CodeMirror.e_stop(e);\n clearInputState(cm);\n close();\n cm.focus();\n } else if (keyName == '<Up>' || keyName == '<Down>') {\n CodeMirror.e_stop(e);\n } else if (keyName == '<C-u>') {\n // Ctrl-U clears input.\n CodeMirror.e_stop(e);\n close('');\n }\n }\n switch (command.searchArgs.querySrc) {\n case 'prompt':\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isPlaying) {\n let query = macroModeState.replaySearchQueries.shift();\n handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n } else {\n showPrompt(cm, {\n onClose: onPromptClose,\n prefix: promptPrefix,\n desc: '(JavaScript regexp)',\n onKeyUp: onPromptKeyUp,\n onKeyDown: onPromptKeyDown\n });\n }\n break;\n case 'wordUnderCursor':\n var word = expandWordUnderCursor(cm, {noSymbol: true});\n var isKeyword = true;\n if (!word) {\n word = expandWordUnderCursor(cm, {noSymbol: false});\n isKeyword = false;\n }\n if (!word) {\n showConfirm(cm, 'No word under cursor');\n clearInputState(cm);\n return;\n }\n let query = cm.getLine(word.start.line).substring(word.start.ch,\n word.end.ch);\n if (isKeyword && wholeWordOnly) {\n query = '\\\\b' + query + '\\\\b';\n } else {\n query = escapeRegex(query);\n }\n\n // cachedCursor is used to save the old position of the cursor\n // when * or # causes vim to seek for the nearest word and shift\n // the cursor before entering the motion.\n vimGlobalState.jumpList.cachedCursor = cm.getCursor();\n cm.setCursor(word.start);\n\n handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n break;\n }\n },\n /**\n * @arg {CodeMirrorV} cm\n * @arg {vimState} vim\n * @arg {import(\"./types\").exCommand | import(\"./types\").keyToExCommand} command\n */\n processEx: function(cm, vim, command) {\n /**@arg {string} input*/\n function onPromptClose(input) {\n // Give the prompt some time to close so that if processCommand shows\n // an error, the elements don't overlap.\n vimGlobalState.exCommandHistoryController.pushInput(input);\n vimGlobalState.exCommandHistoryController.reset();\n exCommandDispatcher.processCommand(cm, input);\n if (cm.state.vim) clearInputState(cm);\n }\n /**\n * @arg {KeyboardEvent&{target:HTMLInputElement}} e\n * @arg {string} input\n * @arg {(arg0?: string) => void} close\n */\n function onPromptKeyDown(e, input, close) {\n var keyName = vimKeyFromEvent(e), up, offset;\n if (keyName == '<Esc>' || keyName == '<C-c>' || keyName == '<C-[>' ||\n (keyName == '<BS>' && input == '')) {\n vimGlobalState.exCommandHistoryController.pushInput(input);\n vimGlobalState.exCommandHistoryController.reset();\n CodeMirror.e_stop(e);\n clearInputState(cm);\n close();\n cm.focus();\n }\n if (keyName == '<Up>' || keyName == '<Down>') {\n CodeMirror.e_stop(e);\n up = keyName == '<Up>' ? true : false;\n offset = e.target ? e.target.selectionEnd : 0;\n input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '';\n close(input);\n if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n } else if (keyName == '<C-u>') {\n // Ctrl-U clears input.\n CodeMirror.e_stop(e);\n close('');\n } else if (keyName && keyName != '<Left>' && keyName != '<Right>') {\n vimGlobalState.exCommandHistoryController.reset();\n }\n }\n if (command.type == 'keyToEx') {\n // Handle user defined Ex to Ex mappings\n exCommandDispatcher.processCommand(cm, command.exArgs.input);\n } else {\n if (vim.visualMode) {\n showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\\'<,\\'>',\n onKeyDown: onPromptKeyDown, selectValueOnOpen: false});\n } else {\n showPrompt(cm, { onClose: onPromptClose, prefix: ':',\n onKeyDown: onPromptKeyDown});\n }\n }\n },\n /**@arg {CodeMirrorV} cm @arg {vimState} vim */\n evalInput: function(cm, vim) {\n // If the motion command is set, execute both the operator and motion.\n // Otherwise return.\n var inputState = vim.inputState;\n var motion = inputState.motion;\n /** @type {MotionArgs}*/\n var motionArgs = inputState.motionArgs || { repeat: 1};\n var operator = inputState.operator;\n /** @type {OperatorArgs}*/\n var operatorArgs = inputState.operatorArgs || {};\n var registerName = inputState.registerName;\n var sel = vim.sel;\n // TODO: Make sure cm and vim selections are identical outside visual mode.\n var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head'));\n var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor'));\n var oldHead = copyCursor(origHead);\n var oldAnchor = copyCursor(origAnchor);\n var newHead, newAnchor;\n var repeat;\n if (operator) {\n this.recordLastEdit(vim, inputState);\n }\n if (inputState.repeatOverride !== undefined) {\n // If repeatOverride is specified, that takes precedence over the\n // input state's repeat. Used by Ex mode and can be user defined.\n repeat = inputState.repeatOverride;\n } else {\n repeat = inputState.getRepeat();\n }\n if (repeat > 0 && motionArgs.explicitRepeat) {\n motionArgs.repeatIsExplicit = true;\n } else if (motionArgs.noRepeat ||\n (!motionArgs.explicitRepeat && repeat === 0)) {\n repeat = 1;\n motionArgs.repeatIsExplicit = false;\n }\n if (inputState.selectedCharacter) {\n // If there is a character input, stick it in all of the arg arrays.\n motionArgs.selectedCharacter = operatorArgs.selectedCharacter =\n inputState.selectedCharacter;\n }\n motionArgs.repeat = repeat;\n clearInputState(cm);\n if (motion) {\n var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState);\n vim.lastMotion = motions[motion];\n if (!motionResult) {\n return;\n }\n if (motionArgs.toJumplist) {\n var jumpList = vimGlobalState.jumpList;\n // if the current motion is # or *, use cachedCursor\n var cachedCursor = jumpList.cachedCursor;\n if (cachedCursor) {\n // @ts-ignore\n recordJumpPosition(cm, cachedCursor, motionResult);\n delete jumpList.cachedCursor;\n } else {\n // @ts-ignore\n recordJumpPosition(cm, origHead, motionResult);\n }\n }\n if (motionResult instanceof Array) {\n newAnchor = motionResult[0];\n newHead = motionResult[1];\n } else {\n newHead = motionResult;\n }\n // TODO: Handle null returns from motion commands better.\n if (!newHead) {\n newHead = copyCursor(origHead);\n }\n if (vim.visualMode) {\n if (!(vim.visualBlock && newHead.ch === Infinity)) {\n newHead = clipCursorToContent(cm, newHead, oldHead);\n }\n if (newAnchor) {\n newAnchor = clipCursorToContent(cm, newAnchor);\n }\n newAnchor = newAnchor || oldAnchor;\n sel.anchor = newAnchor;\n sel.head = newHead;\n updateCmSelection(cm);\n updateMark(cm, vim, '<',\n cursorIsBefore(newAnchor, newHead) ? newAnchor\n : newHead);\n updateMark(cm, vim, '>',\n cursorIsBefore(newAnchor, newHead) ? newHead\n : newAnchor);\n } else if (!operator) {\n newHead = clipCursorToContent(cm, newHead, oldHead);\n cm.setCursor(newHead.line, newHead.ch);\n }\n }\n if (operator) {\n if (operatorArgs.lastSel) {\n // Replaying a visual mode operation\n newAnchor = oldAnchor;\n var lastSel = operatorArgs.lastSel;\n var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line);\n var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch);\n if (lastSel.visualLine) {\n // Linewise Visual mode: The same number of lines.\n newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n } else if (lastSel.visualBlock) {\n // Blockwise Visual mode: The same number of lines and columns.\n newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset);\n } else if (lastSel.head.line == lastSel.anchor.line) {\n // Normal Visual mode within one line: The same number of characters.\n newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset);\n } else {\n // Normal Visual mode with several lines: The same number of lines, in the\n // last line the same number of characters as in the last line the last time.\n newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n }\n vim.visualMode = true;\n vim.visualLine = lastSel.visualLine;\n vim.visualBlock = lastSel.visualBlock;\n sel = vim.sel = {\n anchor: newAnchor,\n head: newHead\n };\n updateCmSelection(cm);\n } else if (vim.visualMode) {\n operatorArgs.lastSel = {\n anchor: copyCursor(sel.anchor),\n head: copyCursor(sel.head),\n visualBlock: vim.visualBlock,\n visualLine: vim.visualLine\n };\n }\n var curStart, curEnd, linewise;\n /** @type {'block'|'line'|'char'}*/ var mode;\n var cmSel;\n if (vim.visualMode) {\n // Init visual op\n curStart = cursorMin(sel.head, sel.anchor);\n curEnd = cursorMax(sel.head, sel.anchor);\n linewise = vim.visualLine || operatorArgs.linewise;\n mode = vim.visualBlock ? 'block' :\n linewise ? 'line' :\n 'char';\n var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd);\n cmSel = makeCmSelection(cm, {\n anchor: newPositions.start,\n head: newPositions.end\n }, mode);\n if (linewise) {\n var ranges = cmSel.ranges;\n if (mode == 'block') {\n // Linewise operators in visual block mode extend to end of line\n for (var i = 0; i < ranges.length; i++) {\n ranges[i].head.ch = lineLength(cm, ranges[i].head.line);\n }\n } else if (mode == 'line') {\n ranges[0].head = new Pos(ranges[0].head.line + 1, 0);\n }\n }\n } else {\n // Init motion op\n curStart = copyCursor(newAnchor || oldAnchor);\n curEnd = copyCursor(newHead || oldHead);\n if (cursorIsBefore(curEnd, curStart)) {\n var tmp = curStart;\n curStart = curEnd;\n curEnd = tmp;\n }\n linewise = motionArgs.linewise || operatorArgs.linewise;\n if (linewise) {\n // Expand selection to entire line.\n expandSelectionToLine(cm, curStart, curEnd);\n } else if (motionArgs.forward) {\n // Clip to trailing newlines only if the motion goes forward.\n clipToLine(cm, curStart, curEnd);\n }\n mode = 'char';\n var exclusive = !motionArgs.inclusive || linewise;\n var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd);\n cmSel = makeCmSelection(cm, {\n anchor: newPositions.start,\n head: newPositions.end\n }, mode, exclusive);\n }\n cm.setSelections(cmSel.ranges, cmSel.primary);\n vim.lastMotion = null;\n operatorArgs.repeat = repeat; // For indent in visual mode.\n operatorArgs.registerName = registerName;\n // Keep track of linewise as it affects how paste and change behave.\n operatorArgs.linewise = linewise;\n var operatorMoveTo = operators[operator](\n cm, operatorArgs, cmSel.ranges, oldAnchor, newHead);\n if (vim.visualMode) {\n exitVisualMode(cm, operatorMoveTo != null);\n }\n if (operatorMoveTo) {\n cm.setCursor(operatorMoveTo);\n }\n }\n },\n /**@arg {vimState} vim @arg {InputStateInterface} inputState, @arg {import(\"./types\").actionCommand} [actionCommand] */\n recordLastEdit: function(vim, inputState, actionCommand) {\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isPlaying) { return; }\n vim.lastEditInputState = inputState;\n vim.lastEditActionCommand = actionCommand;\n macroModeState.lastInsertModeChanges.changes = [];\n macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;\n macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0;\n }\n };\n\n /**\n * All of the functions below return Cursor objects.\n * @type {import(\"./types\").vimMotions}}\n */\n var motions = {\n moveToTopLine: function(cm, _head, motionArgs) {\n var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;\n return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n },\n moveToMiddleLine: function(cm) {\n var range = getUserVisibleLines(cm);\n var line = Math.floor((range.top + range.bottom) * 0.5);\n return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n },\n moveToBottomLine: function(cm, _head, motionArgs) {\n var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;\n return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n },\n expandToLine: function(_cm, head, motionArgs) {\n // Expands forward to end of line, and then to next line if repeat is\n // >1. Does not handle backward motion!\n var cur = head;\n return new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n },\n findNext: function(cm, _head, motionArgs) {\n var state = getSearchState(cm);\n var query = state.getQuery();\n if (!query) {\n return;\n }\n var prev = !motionArgs.forward;\n // If search is initiated with ? instead of /, negate direction.\n prev = (state.isReversed()) ? !prev : prev;\n highlightSearchMatches(cm, query);\n return findNext(cm, prev/** prev */, query, motionArgs.repeat);\n },\n /**\n * Find and select the next occurrence of the search query. If the cursor is currently\n * within a match, then find and select the current match. Otherwise, find the next occurrence in the\n * appropriate direction.\n *\n * This differs from `findNext` in the following ways:\n *\n * 1. Instead of only returning the \"from\", this returns a \"from\", \"to\" range.\n * 2. If the cursor is currently inside a search match, this selects the current match\n * instead of the next match.\n * 3. If there is no associated operator, this will turn on visual mode.\n */\n findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) {\n var state = getSearchState(cm);\n var query = state.getQuery();\n\n if (!query) {\n return;\n }\n\n var prev = !motionArgs.forward;\n prev = (state.isReversed()) ? !prev : prev;\n\n // next: [from, to] | null\n var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim);\n\n // No matches.\n if (!next) {\n return;\n }\n\n // If there's an operator that will be executed, return the selection.\n if (prevInputState.operator) {\n return next;\n }\n\n // At this point, we know that there is no accompanying operator -- let's\n // deal with visual mode in order to select an appropriate match.\n\n var from = next[0];\n // For whatever reason, when we use the \"to\" as returned by searchcursor.js directly,\n // the resulting selection is extended by 1 char. Let's shrink it so that only the\n // match is selected.\n var to = new Pos(next[1].line, next[1].ch - 1);\n\n if (vim.visualMode) {\n // If we were in visualLine or visualBlock mode, get out of it.\n if (vim.visualLine || vim.visualBlock) {\n vim.visualLine = false;\n vim.visualBlock = false;\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"\"});\n }\n\n // If we're currently in visual mode, we should extend the selection to include\n // the search result.\n var anchor = vim.sel.anchor;\n if (anchor) {\n if (state.isReversed()) {\n if (motionArgs.forward) {\n return [anchor, from];\n }\n\n return [anchor, to];\n } else {\n if (motionArgs.forward) {\n return [anchor, to];\n }\n\n return [anchor, from];\n }\n }\n } else {\n // Let's turn visual mode on.\n vim.visualMode = true;\n vim.visualLine = false;\n vim.visualBlock = false;\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"\"});\n }\n\n return prev ? [to, from] : [from, to];\n },\n goToMark: function(cm, _head, motionArgs, vim) {\n var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter || \"\");\n if (pos) {\n return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;\n }\n return null;\n },\n moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) {\n if (vim.visualBlock && motionArgs.sameLine) {\n var sel = vim.sel;\n return [\n clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)),\n clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch))\n ];\n } else {\n return ([vim.sel.head, vim.sel.anchor]);\n }\n },\n jumpToMark: function(cm, head, motionArgs, vim) {\n var best = head;\n for (var i = 0; i < motionArgs.repeat; i++) {\n var cursor = best;\n for (var key in vim.marks) {\n if (!isLowerCase(key)) {\n continue;\n }\n var mark = vim.marks[key].find();\n var isWrongDirection = (motionArgs.forward) ?\n // @ts-ignore\n cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark);\n\n if (isWrongDirection) {\n continue;\n }\n // @ts-ignore\n if (motionArgs.linewise && (mark.line == cursor.line)) {\n continue;\n }\n\n var equal = cursorEqual(cursor, best);\n var between = (motionArgs.forward) ?\n // @ts-ignore\n cursorIsBetween(cursor, mark, best) :\n // @ts-ignore\n cursorIsBetween(best, mark, cursor);\n\n if (equal || between) {\n // @ts-ignore\n best = mark;\n }\n }\n }\n\n if (motionArgs.linewise) {\n // Vim places the cursor on the first non-whitespace character of\n // the line if there is one, else it places the cursor at the end\n // of the line, regardless of whether a mark was found.\n best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));\n }\n return best;\n },\n moveByCharacters: function(_cm, head, motionArgs) {\n var cur = head;\n var repeat = motionArgs.repeat;\n var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;\n return new Pos(cur.line, ch);\n },\n moveByLines: function(cm, head, motionArgs, vim) {\n var cur = head;\n var endCh = cur.ch;\n // Depending what our last motion was, we may want to do different\n // things. If our last motion was moving vertically, we want to\n // preserve the HPos from our last horizontal move. If our last motion\n // was going to the end of a line, moving vertically we should go to\n // the end of the line, etc.\n switch (vim.lastMotion) {\n case this.moveByLines:\n case this.moveByDisplayLines:\n case this.moveByScroll:\n case this.moveToColumn:\n case this.moveToEol:\n endCh = vim.lastHPos;\n break;\n default:\n vim.lastHPos = endCh;\n }\n var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);\n var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;\n var first = cm.firstLine();\n var last = cm.lastLine();\n var posV = cm.findPosV(cur, (motionArgs.forward ? repeat : -repeat), 'line', vim.lastHSPos);\n var hasMarkedText = motionArgs.forward ? posV.line > line : posV.line < line;\n if (hasMarkedText) {\n line = posV.line;\n endCh = posV.ch;\n }\n // Vim go to line begin or line end when cursor at first/last line and\n // move to previous/next line is triggered.\n if (line < first && cur.line == first){\n return this.moveToStartOfLine(cm, head, motionArgs, vim);\n } else if (line > last && cur.line == last){\n return moveToEol(cm, head, motionArgs, vim, true);\n }\n if (motionArgs.toFirstChar){\n endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));\n vim.lastHPos = endCh;\n }\n vim.lastHSPos = cm.charCoords(new Pos(line, endCh),'div').left;\n return new Pos(line, endCh);\n },\n moveByDisplayLines: function(cm, head, motionArgs, vim) {\n var cur = head;\n switch (vim.lastMotion) {\n case this.moveByDisplayLines:\n case this.moveByScroll:\n case this.moveByLines:\n case this.moveToColumn:\n case this.moveToEol:\n break;\n default:\n vim.lastHSPos = cm.charCoords(cur,'div').left;\n }\n var repeat = motionArgs.repeat;\n var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos);\n if (res.hitSide) {\n if (motionArgs.forward) {\n var lastCharCoords = cm.charCoords(res, 'div');\n var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };\n res = cm.coordsChar(goalCoords, 'div');\n } else {\n var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div');\n resCoords.left = vim.lastHSPos;\n res = cm.coordsChar(resCoords, 'div');\n }\n }\n vim.lastHPos = res.ch;\n return res;\n },\n moveByPage: function(cm, head, motionArgs) {\n // CodeMirror only exposes functions that move the cursor page down, so\n // doing this bad hack to move the cursor and move it back. evalInput\n // will move the cursor to where it should be in the end.\n var curStart = head;\n var repeat = motionArgs.repeat;\n return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page');\n },\n moveByParagraph: function(cm, head, motionArgs) {\n var dir = motionArgs.forward ? 1 : -1;\n return findParagraph(cm, head, motionArgs.repeat, dir).start;\n },\n moveBySentence: function(cm, head, motionArgs) {\n var dir = motionArgs.forward ? 1 : -1;\n return findSentence(cm, head, motionArgs.repeat, dir);\n },\n moveByScroll: function(cm, head, motionArgs, vim) {\n var scrollbox = cm.getScrollInfo();\n var curEnd = null;\n var repeat = motionArgs.repeat;\n if (!repeat) {\n repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());\n }\n var orig = cm.charCoords(head, 'local');\n motionArgs.repeat = repeat;\n curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim);\n if (!curEnd) {\n return null;\n }\n var dest = cm.charCoords(curEnd, 'local');\n cm.scrollTo(null, scrollbox.top + dest.top - orig.top);\n return curEnd;\n },\n moveByWords: function(cm, head, motionArgs) {\n return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward,\n !!motionArgs.wordEnd, !!motionArgs.bigWord);\n },\n moveTillCharacter: function(cm, head, motionArgs) {\n var repeat = motionArgs.repeat;\n var curEnd = moveToCharacter(cm, repeat, motionArgs.forward,\n motionArgs.selectedCharacter, head);\n var increment = motionArgs.forward ? -1 : 1;\n recordLastCharacterSearch(increment, motionArgs);\n if (!curEnd) return null;\n curEnd.ch += increment;\n return curEnd;\n },\n moveToCharacter: function(cm, head, motionArgs) {\n var repeat = motionArgs.repeat;\n recordLastCharacterSearch(0, motionArgs);\n return moveToCharacter(cm, repeat, motionArgs.forward,\n motionArgs.selectedCharacter, head) || head;\n },\n moveToSymbol: function(cm, head, motionArgs) {\n var repeat = motionArgs.repeat;\n return motionArgs.selectedCharacter\n && findSymbol(cm, repeat, motionArgs.forward,\n motionArgs.selectedCharacter) || head;\n },\n moveToColumn: function(cm, head, motionArgs, vim) {\n var repeat = motionArgs.repeat;\n // repeat is equivalent to which column we want to move to!\n vim.lastHPos = repeat - 1;\n vim.lastHSPos = cm.charCoords(head,'div').left;\n return moveToColumn(cm, repeat);\n },\n moveToEol: function(cm, head, motionArgs, vim) {\n return moveToEol(cm, head, motionArgs, vim, false);\n },\n moveToFirstNonWhiteSpaceCharacter: function(cm, head) {\n // Go to the start of the line where the text begins, or the end for\n // whitespace-only lines\n var cursor = head;\n return new Pos(cursor.line,\n findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));\n },\n moveToMatchedSymbol: function(cm, head) {\n var cursor = head;\n var line = cursor.line;\n var ch = cursor.ch;\n var lineText = cm.getLine(line);\n var symbol;\n for (; ch < lineText.length; ch++) {\n symbol = lineText.charAt(ch);\n if (symbol && isMatchableSymbol(symbol)) {\n var style = cm.getTokenTypeAt(new Pos(line, ch + 1));\n if (style !== \"string\" && style !== \"comment\") {\n break;\n }\n }\n }\n if (ch < lineText.length) {\n // Only include angle brackets in analysis if they are being matched.\n var re = (symbol === '<' || symbol === '>') ? /[(){}[\\]<>]/ : /[(){}[\\]]/;\n var matched = cm.findMatchingBracket(new Pos(line, ch), {bracketRegex: re});\n return matched.to;\n } else {\n return cursor;\n }\n },\n moveToStartOfLine: function(_cm, head) {\n return new Pos(head.line, 0);\n },\n moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) {\n var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();\n if (motionArgs.repeatIsExplicit) {\n lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');\n }\n return new Pos(lineNum,\n findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));\n },\n moveToStartOfDisplayLine: function(cm) {\n cm.execCommand(\"goLineLeft\");\n return cm.getCursor();\n },\n moveToEndOfDisplayLine: function(cm) {\n cm.execCommand(\"goLineRight\");\n var head = cm.getCursor();\n if (head.sticky == \"before\") head.ch--;\n return head;\n },\n textObjectManipulation: function(cm, head, motionArgs, vim) {\n // TODO: lots of possible exceptions that can be thrown here. Try da(\n // outside of a () block.\n /** @type{Object<string, string>} */\n var mirroredPairs = {'(': ')', ')': '(',\n '{': '}', '}': '{',\n '[': ']', ']': '[',\n '<': '>', '>': '<'};\n /** @type{Object<string, boolean>} */\n var selfPaired = {'\\'': true, '\"': true, '`': true};\n\n var character = motionArgs.selectedCharacter || \"\";\n // 'b' refers to '()' block.\n // 'B' refers to '{}' block.\n if (character == 'b') {\n character = '(';\n } else if (character == 'B') {\n character = '{';\n }\n\n // Inclusive is the difference between a and i\n // TODO: Instead of using the additional text object map to perform text\n // object operations, merge the map into the defaultKeyMap and use\n // motionArgs to define behavior. Define separate entries for 'aw',\n // 'iw', 'a[', 'i[', etc.\n var inclusive = !motionArgs.textObjectInner;\n\n var tmp, move;\n if (mirroredPairs[character]) {\n move = true;\n tmp = selectCompanionObject(cm, head, character, inclusive);\n if (!tmp) {\n var sc = cm.getSearchCursor(new RegExp(\"\\\\\" + character, \"g\"), head);\n if (sc.find()) {\n // @ts-ignore\n tmp = selectCompanionObject(cm, sc.from(), character, inclusive);\n }\n }\n } else if (selfPaired[character]) {\n move = true;\n tmp = findBeginningAndEnd(cm, head, character, inclusive);\n } else if (character === 'W' || character === 'w') {\n var repeat = motionArgs.repeat || 1;\n while (repeat-- > 0) {\n var repeated = expandWordUnderCursor(cm, {\n inclusive,\n innerWord: !inclusive,\n bigWord: character === 'W',\n noSymbol: character === 'W',\n multiline: true\n }, tmp && tmp.end);\n if (repeated) {\n if (!tmp) tmp = repeated;\n tmp.end = repeated.end;\n }\n }\n } else if (character === 'p') {\n tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive);\n motionArgs.linewise = true;\n if (vim.visualMode) {\n if (!vim.visualLine) { vim.visualLine = true; }\n } else {\n var operatorArgs = vim.inputState.operatorArgs;\n if (operatorArgs) { operatorArgs.linewise = true; }\n tmp.end.line--;\n }\n } else if (character === 't') {\n tmp = expandTagUnderCursor(cm, head, inclusive);\n } else if (character === 's') {\n // account for cursor on end of sentence symbol\n var content = cm.getLine(head.line);\n if (head.ch > 0 && isEndOfSentenceSymbol(content[head.ch])) {\n head.ch -= 1;\n }\n var end = getSentence(cm, head, motionArgs.repeat, 1, inclusive);\n var start = getSentence(cm, head, motionArgs.repeat, -1, inclusive);\n // closer vim behaviour, 'a' only takes the space after the sentence if there is one before and after\n if (isWhiteSpaceString(cm.getLine(start.line)[start.ch])\n && isWhiteSpaceString(cm.getLine(end.line)[end.ch -1])) {\n start = {line: start.line, ch: start.ch + 1};\n }\n tmp = {start: start, end: end};\n }\n\n if (!tmp) {\n // No valid text object, don't move.\n return null;\n }\n\n if (!cm.state.vim.visualMode) {\n return [tmp.start, tmp.end];\n } else {\n return expandSelection(cm, tmp.start, tmp.end, move);\n }\n },\n\n repeatLastCharacterSearch: function(cm, head, motionArgs) {\n var lastSearch = vimGlobalState.lastCharacterSearch;\n var repeat = motionArgs.repeat;\n var forward = motionArgs.forward === lastSearch.forward;\n var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);\n cm.moveH(-increment, 'char');\n motionArgs.inclusive = forward ? true : false;\n var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);\n if (!curEnd) {\n cm.moveH(increment, 'char');\n return head;\n }\n curEnd.ch += increment;\n return curEnd;\n }\n };\n\n /** @arg {string} name @arg {import(\"./types\").MotionFn} fn */\n function defineMotion(name, fn) {\n motions[name] = fn;\n }\n\n /** @arg {string} val @arg {number} times */\n function fillArray(val, times) {\n var arr = [];\n for (var i = 0; i < times; i++) {\n arr.push(val);\n }\n return arr;\n }\n /**\n * An operator acts on a text selection. It receives the list of selections\n * as input. The corresponding CodeMirror selection is guaranteed to\n * match the input selection.\n */\n /** @type {import(\"./types\").vimOperators} */\n var operators = {\n change: function(cm, args, ranges) {\n var finalHead, text;\n var vim = cm.state.vim;\n var anchor = ranges[0].anchor,\n head = ranges[0].head;\n if (!vim.visualMode) {\n text = cm.getRange(anchor, head);\n var lastState = vim.lastEditInputState;\n if (lastState?.motion == \"moveByWords\" && !isWhiteSpaceString(text)) {\n // Exclude trailing whitespace if the range is not all whitespace.\n var match = (/\\s+$/).exec(text);\n if (match && lastState.motionArgs && lastState.motionArgs.forward) {\n head = offsetCursor(head, 0, - match[0].length);\n text = text.slice(0, - match[0].length);\n }\n }\n if (args.linewise) {\n anchor = new Pos(anchor.line, findFirstNonWhiteSpaceCharacter(cm.getLine(anchor.line)));\n if (head.line > anchor.line) {\n head = new Pos(head.line - 1, Number.MAX_VALUE);\n }\n }\n cm.replaceRange('', anchor, head);\n finalHead = anchor;\n } else if (args.fullLine) {\n head.ch = Number.MAX_VALUE;\n head.line--;\n cm.setSelection(anchor, head);\n text = cm.getSelection();\n cm.replaceSelection(\"\");\n finalHead = anchor;\n } else {\n text = cm.getSelection();\n var replacement = fillArray('', ranges.length);\n cm.replaceSelections(replacement);\n finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n }\n vimGlobalState.registerController.pushText(\n args.registerName, 'change', text,\n args.linewise, ranges.length > 1);\n actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim);\n },\n delete: function(cm, args, ranges) {\n var finalHead, text;\n var vim = cm.state.vim;\n if (!vim.visualBlock) {\n var anchor = ranges[0].anchor,\n head = ranges[0].head;\n if (args.linewise &&\n head.line != cm.firstLine() &&\n anchor.line == cm.lastLine() &&\n anchor.line == head.line - 1) {\n // Special case for dd on last line (and first line).\n if (anchor.line == cm.firstLine()) {\n anchor.ch = 0;\n } else {\n anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1));\n }\n }\n text = cm.getRange(anchor, head);\n cm.replaceRange('', anchor, head);\n finalHead = anchor;\n if (args.linewise) {\n finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor);\n }\n } else {\n text = cm.getSelection();\n var replacement = fillArray('', ranges.length);\n cm.replaceSelections(replacement);\n finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n }\n vimGlobalState.registerController.pushText(\n args.registerName, 'delete', text,\n args.linewise, vim.visualBlock);\n return clipCursorToContent(cm, finalHead);\n },\n indent: function(cm, args, ranges) {\n var vim = cm.state.vim;\n var repeat = (vim.visualMode) ? (args.repeat || 0) : 1;\n if (cm.indentMore) {\n for (var j = 0; j < repeat; j++) {\n if (args.indentRight) cm.indentMore();\n else cm.indentLess();\n }\n } else {\n var startLine = ranges[0].anchor.line;\n var endLine = vim.visualBlock ?\n ranges[ranges.length - 1].anchor.line :\n ranges[0].head.line;\n // In visual mode, n> shifts the selection right n times, instead of\n // shifting n lines right once.\n if (args.linewise) {\n // The only way to delete a newline is to delete until the start of\n // the next line, so in linewise mode evalInput will include the next\n // line. We don't want this in indent, so we go back a line.\n endLine--;\n }\n for (var i = startLine; i <= endLine; i++) {\n for (var j = 0; j < repeat; j++) {\n cm.indentLine(i, args.indentRight);\n }\n }\n }\n return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n },\n indentAuto: function(cm, _args, ranges) {\n cm.execCommand(\"indentAuto\");\n return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n },\n hardWrap: function(cm, operatorArgs, ranges, oldAnchor) {\n if (!cm.hardWrap) return;\n var from = ranges[0].anchor.line;\n var to = ranges[0].head.line;\n if (operatorArgs.linewise) to--;\n var endRow = cm.hardWrap({from: from, to: to});\n if (endRow > from && operatorArgs.linewise) endRow--;\n return operatorArgs.keepCursor ? oldAnchor : new Pos(endRow, 0);\n },\n changeCase: function(cm, args, ranges, oldAnchor, newHead) {\n var selections = cm.getSelections();\n var swapped = [];\n var toLower = args.toLower;\n for (var j = 0; j < selections.length; j++) {\n var toSwap = selections[j];\n var text = '';\n if (toLower === true) {\n text = toSwap.toLowerCase();\n } else if (toLower === false) {\n text = toSwap.toUpperCase();\n } else {\n for (var i = 0; i < toSwap.length; i++) {\n var character = toSwap.charAt(i);\n text += isUpperCase(character) ? character.toLowerCase() :\n character.toUpperCase();\n }\n }\n swapped.push(text);\n }\n cm.replaceSelections(swapped);\n if (args.shouldMoveCursor){\n return newHead;\n } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) {\n return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor);\n } else if (args.linewise){\n return oldAnchor;\n } else {\n return cursorMin(ranges[0].anchor, ranges[0].head);\n }\n },\n yank: function(cm, args, ranges, oldAnchor) {\n var vim = cm.state.vim;\n var text = cm.getSelection();\n var endPos = vim.visualMode\n ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor)\n : oldAnchor;\n vimGlobalState.registerController.pushText(\n args.registerName, 'yank',\n text, args.linewise, vim.visualBlock);\n return endPos;\n }\n };\n\n /** @arg {string} name @arg {import(\"./types\").OperatorFn} fn */\n function defineOperator(name, fn) {\n operators[name] = fn;\n }\n\n /** @type {import(\"./types\").vimActions} */\n var actions = {\n jumpListWalk: function(cm, actionArgs, vim) {\n if (vim.visualMode) {\n return;\n }\n var repeat = actionArgs.repeat || 1;\n var forward = actionArgs.forward;\n var jumpList = vimGlobalState.jumpList;\n\n var mark = jumpList.move(cm, forward ? repeat : -repeat);\n var markPos = mark ? mark.find() : undefined;\n markPos = markPos ? markPos : cm.getCursor();\n cm.setCursor(markPos);\n },\n scroll: function(cm, actionArgs, vim) {\n if (vim.visualMode) {\n return;\n }\n var repeat = actionArgs.repeat || 1;\n var lineHeight = cm.defaultTextHeight();\n var top = cm.getScrollInfo().top;\n var delta = lineHeight * repeat;\n var newPos = actionArgs.forward ? top + delta : top - delta;\n var cursor = copyCursor(cm.getCursor());\n var cursorCoords = cm.charCoords(cursor, 'local');\n if (actionArgs.forward) {\n if (newPos > cursorCoords.top) {\n cursor.line += (newPos - cursorCoords.top) / lineHeight;\n cursor.line = Math.ceil(cursor.line);\n cm.setCursor(cursor);\n cursorCoords = cm.charCoords(cursor, 'local');\n cm.scrollTo(null, cursorCoords.top);\n } else {\n // Cursor stays within bounds. Just reposition the scroll window.\n cm.scrollTo(null, newPos);\n }\n } else {\n var newBottom = newPos + cm.getScrollInfo().clientHeight;\n if (newBottom < cursorCoords.bottom) {\n cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;\n cursor.line = Math.floor(cursor.line);\n cm.setCursor(cursor);\n cursorCoords = cm.charCoords(cursor, 'local');\n cm.scrollTo(\n null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);\n } else {\n // Cursor stays within bounds. Just reposition the scroll window.\n cm.scrollTo(null, newPos);\n }\n }\n },\n scrollToCursor: function(cm, actionArgs) {\n var lineNum = cm.getCursor().line;\n var charCoords = cm.charCoords(new Pos(lineNum, 0), 'local');\n var height = cm.getScrollInfo().clientHeight;\n var y = charCoords.top;\n switch (actionArgs.position) {\n case 'center': y = charCoords.bottom - height / 2;\n break;\n case 'bottom':\n var lineLastCharPos = new Pos(lineNum, cm.getLine(lineNum).length - 1);\n var lineLastCharCoords = cm.charCoords(lineLastCharPos, 'local');\n var lineHeight = lineLastCharCoords.bottom - y;\n y = y - height + lineHeight;\n break;\n }\n cm.scrollTo(null, y);\n },\n replayMacro: function(cm, actionArgs, vim) {\n var registerName = actionArgs.selectedCharacter || \"\";\n var repeat = actionArgs.repeat || 1;\n var macroModeState = vimGlobalState.macroModeState;\n if (registerName == '@') {\n registerName = macroModeState.latestRegister;\n } else {\n macroModeState.latestRegister = registerName;\n }\n while(repeat--){\n executeMacroRegister(cm, vim, macroModeState, registerName);\n }\n },\n enterMacroRecordMode: function(cm, actionArgs) {\n var macroModeState = vimGlobalState.macroModeState;\n var registerName = actionArgs.selectedCharacter;\n if (vimGlobalState.registerController.isValidRegister(registerName)) {\n macroModeState.enterMacroRecordMode(cm, registerName);\n }\n },\n toggleOverwrite: function(cm) {\n if (!cm.state.overwrite) {\n cm.toggleOverwrite(true);\n cm.setOption('keyMap', 'vim-replace');\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n } else {\n cm.toggleOverwrite(false);\n cm.setOption('keyMap', 'vim-insert');\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n }\n },\n enterInsertMode: function(cm, actionArgs, vim) {\n if (cm.getOption('readOnly')) { return; }\n vim.insertMode = true;\n vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;\n var insertAt = (actionArgs) ? actionArgs.insertAt : null;\n var sel = vim.sel;\n var head = actionArgs.head || cm.getCursor('head');\n var height = cm.listSelections().length;\n if (insertAt == 'eol') {\n head = new Pos(head.line, lineLength(cm, head.line));\n } else if (insertAt == 'bol') {\n head = new Pos(head.line, 0);\n } else if (insertAt == 'charAfter') {\n var newPosition = updateSelectionForSurrogateCharacters(cm, head, offsetCursor(head, 0, 1));\n head = newPosition.end;\n } else if (insertAt == 'firstNonBlank') {\n var newPosition = updateSelectionForSurrogateCharacters(cm, head, motions.moveToFirstNonWhiteSpaceCharacter(cm, head));\n head = newPosition.end;\n } else if (insertAt == 'startOfSelectedArea') {\n if (!vim.visualMode)\n return;\n if (!vim.visualBlock) {\n if (sel.head.line < sel.anchor.line) {\n head = sel.head;\n } else {\n head = new Pos(sel.anchor.line, 0);\n }\n } else {\n head = new Pos(\n Math.min(sel.head.line, sel.anchor.line),\n Math.min(sel.head.ch, sel.anchor.ch));\n height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n }\n } else if (insertAt == 'endOfSelectedArea') {\n if (!vim.visualMode)\n return;\n if (!vim.visualBlock) {\n if (sel.head.line >= sel.anchor.line) {\n head = offsetCursor(sel.head, 0, 1);\n } else {\n head = new Pos(sel.anchor.line, 0);\n }\n } else {\n head = new Pos(\n Math.min(sel.head.line, sel.anchor.line),\n Math.max(sel.head.ch, sel.anchor.ch) + 1);\n height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n }\n } else if (insertAt == 'inplace') {\n if (vim.visualMode){\n return;\n }\n } else if (insertAt == 'lastEdit') {\n head = getLastEditPos(cm) || head;\n }\n cm.setOption('disableInput', false);\n if (actionArgs && actionArgs.replace) {\n // Handle Replace-mode as a special case of insert mode.\n cm.toggleOverwrite(true);\n cm.setOption('keyMap', 'vim-replace');\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n } else {\n cm.toggleOverwrite(false);\n cm.setOption('keyMap', 'vim-insert');\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n }\n if (!vimGlobalState.macroModeState.isPlaying) {\n // Only record if not replaying.\n cm.on('change', onChange);\n if (vim.insertEnd) vim.insertEnd.clear();\n vim.insertEnd = cm.setBookmark(head, {insertLeft: true});\n CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n }\n if (vim.visualMode) {\n exitVisualMode(cm);\n }\n selectForInsert(cm, head, height);\n },\n toggleVisualMode: function(cm, actionArgs, vim) {\n var repeat = actionArgs.repeat;\n var anchor = cm.getCursor();\n var head;\n // TODO: The repeat should actually select number of characters/lines\n // equal to the repeat times the size of the previous visual\n // operation.\n if (!vim.visualMode) {\n // Entering visual mode\n vim.visualMode = true;\n vim.visualLine = !!actionArgs.linewise;\n vim.visualBlock = !!actionArgs.blockwise;\n head = clipCursorToContent(\n cm, new Pos(anchor.line, anchor.ch + repeat - 1));\n var newPosition = updateSelectionForSurrogateCharacters(cm, anchor, head);\n vim.sel = {\n anchor: newPosition.start,\n head: newPosition.end\n };\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n updateCmSelection(cm);\n updateMark(cm, vim, '<', cursorMin(anchor, head));\n updateMark(cm, vim, '>', cursorMax(anchor, head));\n } else if (vim.visualLine != !!actionArgs.linewise ||\n vim.visualBlock != !!actionArgs.blockwise) {\n // Toggling between modes\n vim.visualLine = !!actionArgs.linewise;\n vim.visualBlock = !!actionArgs.blockwise;\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n updateCmSelection(cm);\n } else {\n exitVisualMode(cm);\n }\n },\n reselectLastSelection: function(cm, _actionArgs, vim) {\n var lastSelection = vim.lastSelection;\n if (vim.visualMode) {\n updateLastSelection(cm, vim);\n }\n if (lastSelection) {\n var anchor = lastSelection.anchorMark.find();\n var head = lastSelection.headMark.find();\n if (!anchor || !head) {\n // If the marks have been destroyed due to edits, do nothing.\n return;\n }\n vim.sel = {\n anchor: anchor,\n head: head\n };\n vim.visualMode = true;\n vim.visualLine = lastSelection.visualLine;\n vim.visualBlock = lastSelection.visualBlock;\n updateCmSelection(cm);\n updateMark(cm, vim, '<', cursorMin(anchor, head));\n updateMark(cm, vim, '>', cursorMax(anchor, head));\n CodeMirror.signal(cm, 'vim-mode-change', {\n mode: 'visual',\n subMode: vim.visualLine ? 'linewise' :\n vim.visualBlock ? 'blockwise' : ''});\n }\n },\n joinLines: function(cm, actionArgs, vim) {\n var curStart, curEnd;\n if (vim.visualMode) {\n curStart = cm.getCursor('anchor');\n curEnd = cm.getCursor('head');\n if (cursorIsBefore(curEnd, curStart)) {\n var tmp = curEnd;\n curEnd = curStart;\n curStart = tmp;\n }\n curEnd.ch = lineLength(cm, curEnd.line) - 1;\n } else {\n // Repeat is the number of lines to join. Minimum 2 lines.\n var repeat = Math.max(actionArgs.repeat, 2);\n curStart = cm.getCursor();\n curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1,\n Infinity));\n }\n var finalCh = 0;\n for (var i = curStart.line; i < curEnd.line; i++) {\n finalCh = lineLength(cm, curStart.line);\n var text = '';\n var nextStartCh = 0;\n if (!actionArgs.keepSpaces) {\n var nextLine = cm.getLine(curStart.line + 1);\n nextStartCh = nextLine.search(/\\S/);\n if (nextStartCh == -1) {\n nextStartCh = nextLine.length;\n } else {\n text = \" \";\n }\n }\n cm.replaceRange(text, \n new Pos(curStart.line, finalCh),\n new Pos(curStart.line + 1, nextStartCh));\n }\n var curFinalPos = clipCursorToContent(cm, new Pos(curStart.line, finalCh));\n if (vim.visualMode) {\n exitVisualMode(cm, false);\n }\n cm.setCursor(curFinalPos);\n },\n newLineAndEnterInsertMode: function(cm, actionArgs, vim) {\n vim.insertMode = true;\n var insertAt = copyCursor(cm.getCursor());\n if (insertAt.line === cm.firstLine() && !actionArgs.after) {\n // Special case for inserting newline before start of document.\n cm.replaceRange('\\n', new Pos(cm.firstLine(), 0));\n cm.setCursor(cm.firstLine(), 0);\n } else {\n insertAt.line = (actionArgs.after) ? insertAt.line :\n insertAt.line - 1;\n insertAt.ch = lineLength(cm, insertAt.line);\n cm.setCursor(insertAt);\n var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||\n CodeMirror.commands.newlineAndIndent;\n newlineFn(cm);\n }\n this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);\n },\n paste: function(cm, actionArgs, vim) {\n var register = vimGlobalState.registerController.getRegister(\n actionArgs.registerName);\n if (actionArgs.registerName === '+') {\n navigator.clipboard.readText().then((value) => {\n this.continuePaste(cm, actionArgs, vim, value, register);\n });\n } else {\n var text = register.toString();\n this.continuePaste(cm, actionArgs, vim, text, register);\n }\n },\n continuePaste: function(cm, actionArgs, vim, text, register) {\n var cur = copyCursor(cm.getCursor());\n if (!text) {\n return;\n }\n if (actionArgs.matchIndent) {\n var tabSize = cm.getOption(\"tabSize\");\n // length that considers tabs and tabSize\n var whitespaceLength = function(/** @type {string} */ str) {\n var tabs = (str.split(\"\\t\").length - 1);\n var spaces = (str.split(\" \").length - 1);\n return tabs * tabSize + spaces * 1;\n };\n var currentLine = cm.getLine(cm.getCursor().line);\n // @ts-ignore\n var indent = whitespaceLength(currentLine.match(/^\\s*/)[0]);\n // chomp last newline b/c don't want it to match /^\\s*/gm\n var chompedText = text.replace(/\\n$/, '');\n var wasChomped = text !== chompedText;\n // @ts-ignore\n var firstIndent = whitespaceLength(text.match(/^\\s*/)[0]);\n var text = chompedText.replace(/^\\s*/gm, function(wspace) {\n var newIndent = indent + (whitespaceLength(wspace) - firstIndent);\n if (newIndent < 0) {\n return \"\";\n }\n else if (cm.getOption(\"indentWithTabs\")) {\n var quotient = Math.floor(newIndent / tabSize);\n return Array(quotient + 1).join('\\t');\n }\n else {\n return Array(newIndent + 1).join(' ');\n }\n });\n text += wasChomped ? \"\\n\" : \"\";\n }\n if (actionArgs.repeat > 1) {\n var text = Array(actionArgs.repeat + 1).join(text);\n }\n var linewise = register.linewise;\n var blockwise = register.blockwise;\n if (blockwise) {\n // @ts-ignore\n text = text.split('\\n');\n if (linewise) {\n // @ts-ignore\n text.pop();\n }\n for (var i = 0; i < text.length; i++) {\n // @ts-ignore\n text[i] = (text[i] == '') ? ' ' : text[i];\n }\n cur.ch += actionArgs.after ? 1 : 0;\n cur.ch = Math.min(lineLength(cm, cur.line), cur.ch);\n } else if (linewise) {\n if(vim.visualMode) {\n text = vim.visualLine ? text.slice(0, -1) : '\\n' + text.slice(0, text.length - 1) + '\\n';\n } else if (actionArgs.after) {\n // Move the newline at the end to the start instead, and paste just\n // before the newline character of the line we are on right now.\n text = '\\n' + text.slice(0, text.length - 1);\n cur.ch = lineLength(cm, cur.line);\n } else {\n cur.ch = 0;\n }\n } else {\n cur.ch += actionArgs.after ? 1 : 0;\n }\n var curPosFinal;\n if (vim.visualMode) {\n // save the pasted text for reselection if the need arises\n vim.lastPastedText = text;\n var lastSelectionCurEnd;\n var selectedArea = getSelectedAreaRange(cm, vim);\n var selectionStart = selectedArea[0];\n var selectionEnd = selectedArea[1];\n var selectedText = cm.getSelection();\n var selections = cm.listSelections();\n var emptyStrings = new Array(selections.length).join('1').split('1');\n // save the curEnd marker before it get cleared due to cm.replaceRange.\n if (vim.lastSelection) {\n lastSelectionCurEnd = vim.lastSelection.headMark.find();\n }\n // push the previously selected text to unnamed register\n vimGlobalState.registerController.unnamedRegister.setText(selectedText);\n if (blockwise) {\n // first delete the selected text\n cm.replaceSelections(emptyStrings);\n // Set new selections as per the block length of the yanked text\n selectionEnd = new Pos(selectionStart.line + text.length-1, selectionStart.ch);\n cm.setCursor(selectionStart);\n selectBlock(cm, selectionEnd);\n // @ts-ignore\n cm.replaceSelections(text);\n curPosFinal = selectionStart;\n } else if (vim.visualBlock) {\n cm.replaceSelections(emptyStrings);\n cm.setCursor(selectionStart);\n cm.replaceRange(text, selectionStart, selectionStart);\n curPosFinal = selectionStart;\n } else {\n cm.replaceRange(text, selectionStart, selectionEnd);\n curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1);\n }\n // restore the curEnd marker\n if(lastSelectionCurEnd) {\n vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd);\n }\n if (linewise) {\n curPosFinal.ch=0;\n }\n } else {\n if (blockwise) {\n cm.setCursor(cur);\n for (var i = 0; i < text.length; i++) {\n var line = cur.line+i;\n if (line > cm.lastLine()) {\n cm.replaceRange('\\n', new Pos(line, 0));\n }\n var lastCh = lineLength(cm, line);\n if (lastCh < cur.ch) {\n extendLineToColumn(cm, line, cur.ch);\n }\n }\n cm.setCursor(cur);\n selectBlock(cm, new Pos(cur.line + text.length-1, cur.ch));\n // @ts-ignore\n cm.replaceSelections(text);\n curPosFinal = cur;\n } else {\n cm.replaceRange(text, cur);\n // Now fine tune the cursor to where we want it.\n if (linewise) {\n var line = actionArgs.after ? cur.line + 1 : cur.line;\n curPosFinal = new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n } else {\n curPosFinal = copyCursor(cur);\n if (!/\\n/.test(text)) {\n curPosFinal.ch += text.length - (actionArgs.after ? 1 : 0);\n }\n }\n }\n }\n if (vim.visualMode) {\n exitVisualMode(cm, false);\n }\n cm.setCursor(curPosFinal);\n },\n undo: function(cm, actionArgs) {\n cm.operation(function() {\n repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();\n cm.setCursor(clipCursorToContent(cm, cm.getCursor('start')));\n });\n },\n redo: function(cm, actionArgs) {\n repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();\n },\n setRegister: function(_cm, actionArgs, vim) {\n vim.inputState.registerName = actionArgs.selectedCharacter;\n },\n insertRegister: function(cm, actionArgs, vim) {\n var registerName = actionArgs.selectedCharacter;\n var register = vimGlobalState.registerController.getRegister(registerName);\n var text = register && register.toString();\n if (text) {\n cm.replaceSelection(text);\n }\n },\n oneNormalCommand: function(cm, actionArgs, vim) {\n exitInsertMode(cm, true);\n vim.insertModeReturn = true;\n CodeMirror.on(cm, 'vim-command-done', function handler() {\n if (vim.visualMode) return;\n if (vim.insertModeReturn) {\n vim.insertModeReturn = false;\n if (!vim.insertMode) {\n actions.enterInsertMode(cm, {}, vim);\n }\n }\n CodeMirror.off(cm, 'vim-command-done', handler);\n });\n },\n setMark: function(cm, actionArgs, vim) {\n var markName = actionArgs.selectedCharacter;\n if (markName) updateMark(cm, vim, markName, cm.getCursor());\n },\n replace: function(cm, actionArgs, vim) {\n var replaceWith = actionArgs.selectedCharacter || \"\";\n var curStart = cm.getCursor();\n var replaceTo;\n var curEnd;\n var selections = cm.listSelections();\n if (vim.visualMode) {\n curStart = cm.getCursor('start');\n curEnd = cm.getCursor('end');\n } else {\n var line = cm.getLine(curStart.line);\n replaceTo = curStart.ch + actionArgs.repeat;\n if (replaceTo > line.length) {\n replaceTo=line.length;\n }\n curEnd = new Pos(curStart.line, replaceTo);\n }\n\n var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd);\n curStart = newPositions.start;\n curEnd = newPositions.end;\n if (replaceWith=='\\n') {\n if (!vim.visualMode) cm.replaceRange('', curStart, curEnd);\n // special case, where vim help says to replace by just one line-break\n (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);\n } else {\n var replaceWithStr = cm.getRange(curStart, curEnd);\n // replace all surrogate characters with selected character\n replaceWithStr = replaceWithStr.replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, replaceWith);\n //replace all characters in range by selected, but keep linebreaks\n replaceWithStr = replaceWithStr.replace(/[^\\n]/g, replaceWith);\n if (vim.visualBlock) {\n // Tabs are split in visua block before replacing\n var spaces = new Array(cm.getOption(\"tabSize\")+1).join(' ');\n replaceWithStr = cm.getSelection();\n replaceWithStr = replaceWithStr.replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, replaceWith);\n var replaceWithStrings = replaceWithStr.replace(/\\t/g, spaces).replace(/[^\\n]/g, replaceWith).split('\\n');\n cm.replaceSelections(replaceWithStrings);\n } else {\n cm.replaceRange(replaceWithStr, curStart, curEnd);\n }\n if (vim.visualMode) {\n curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ?\n selections[0].anchor : selections[0].head;\n cm.setCursor(curStart);\n exitVisualMode(cm, false);\n } else {\n cm.setCursor(offsetCursor(curEnd, 0, -1));\n }\n }\n },\n incrementNumberToken: function(cm, actionArgs) {\n var cur = cm.getCursor();\n var lineStr = cm.getLine(cur.line);\n var re = /(-?)(?:(0x)([\\da-f]+)|(0b|0|)(\\d+))/gi;\n var match;\n var start;\n var end;\n var numberStr;\n while ((match = re.exec(lineStr)) !== null) {\n start = match.index;\n end = start + match[0].length;\n if (cur.ch < end)break;\n }\n // @ts-ignore\n if (!actionArgs.backtrack && (end <= cur.ch))return;\n if (match) {\n var baseStr = match[2] || match[4];\n var digits = match[3] || match[5];\n var increment = actionArgs.increase ? 1 : -1;\n var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()];\n var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat);\n numberStr = number.toString(base);\n var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : '';\n if (numberStr.charAt(0) === '-') {\n numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1);\n } else {\n numberStr = baseStr + zeroPadding + numberStr;\n }\n // @ts-ignore\n var from = new Pos(cur.line, start);\n // @ts-ignore\n var to = new Pos(cur.line, end);\n cm.replaceRange(numberStr, from, to);\n } else {\n return;\n }\n // @ts-ignore\n cm.setCursor(new Pos(cur.line, start + numberStr.length - 1));\n },\n repeatLastEdit: function(cm, actionArgs, vim) {\n var lastEditInputState = vim.lastEditInputState;\n if (!lastEditInputState) { return; }\n var repeat = actionArgs.repeat;\n if (repeat && actionArgs.repeatIsExplicit) {\n lastEditInputState.repeatOverride = repeat;\n } else {\n repeat = lastEditInputState.repeatOverride || repeat;\n }\n repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);\n },\n indent: function(cm, actionArgs) {\n cm.indentLine(cm.getCursor().line, actionArgs.indentRight);\n },\n exitInsertMode: function(cm, actionArgs) {\n exitInsertMode(cm);\n }\n };\n\n /** @arg {string } name @arg {import(\"./types\").ActionFn} fn */\n function defineAction(name, fn) {\n actions[name] = fn;\n }\n\n /*\n * Below are miscellaneous utility functions used by vim.js\n */\n\n /**\n * Clips cursor to ensure that line is within the buffer's range\n * and is not inside surrogate pair\n * If includeLineBreak is true, then allow cur.ch == lineLength.\n * @arg {CodeMirrorV} cm \n * @arg {Pos} cur \n * @arg {Pos} [oldCur]\n * @return {Pos}\n */\n function clipCursorToContent(cm, cur, oldCur) {\n var vim = cm.state.vim;\n var includeLineBreak = vim.insertMode || vim.visualMode;\n var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() );\n var text = cm.getLine(line);\n var maxCh = text.length - 1 + Number(!!includeLineBreak);\n var ch = Math.min(Math.max(0, cur.ch), maxCh);\n // prevent cursor from entering surrogate pair\n var charCode = text.charCodeAt(ch);\n if (0xDC00 <= charCode && charCode <= 0xDFFF) {\n var direction = 1;\n if (oldCur && oldCur.line == line && oldCur.ch > ch) {\n direction = -1;\n }\n ch +=direction;\n if (ch > maxCh) ch -=2;\n }\n return new Pos(line, ch);\n }\n function copyArgs(args) {\n var ret = {};\n for (var prop in args) {\n if (args.hasOwnProperty(prop)) {\n ret[prop] = args[prop];\n }\n }\n return ret;\n }\n function offsetCursor(cur, offsetLine, offsetCh) {\n if (typeof offsetLine === 'object') {\n offsetCh = offsetLine.ch;\n offsetLine = offsetLine.line;\n }\n return new Pos(cur.line + offsetLine, cur.ch + offsetCh);\n }\n function commandMatches(keys, keyMap, context, inputState) {\n // Partial matches are not applied. They inform the key handler\n // that the current key sequence is a subsequence of a valid key\n // sequence, so that the key buffer is not cleared.\n if (inputState.operator) context = \"operatorPending\";\n var match, partial = [], full = [];\n // if currently expanded key comes from a noremap, searcg only in default keys\n var startIndex = noremap ? keyMap.length - defaultKeymapLength : 0;\n for (var i = startIndex; i < keyMap.length; i++) {\n var command = keyMap[i];\n if (context == 'insert' && command.context != 'insert' ||\n (command.context && command.context != context) ||\n inputState.operator && command.type == 'action' ||\n !(match = commandMatch(keys, command.keys))) { continue; }\n if (match == 'partial') { partial.push(command); }\n if (match == 'full') { full.push(command); }\n }\n return {\n partial: partial.length && partial,\n full: full.length && full\n };\n }\n /** @arg {string} pressed @arg {string} mapped @return {'full'|'partial'|false}*/\n function commandMatch(pressed, mapped) {\n const isLastCharacter = mapped.slice(-11) == '<character>';\n const isLastRegister = mapped.slice(-10) == '<register>';\n if (isLastCharacter || isLastRegister) {\n // Last character matches anything.\n var prefixLen = mapped.length - (isLastCharacter ? 11 : 10);\n var pressedPrefix = pressed.slice(0, prefixLen);\n var mappedPrefix = mapped.slice(0, prefixLen);\n return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' :\n mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false;\n } else {\n return pressed == mapped ? 'full' :\n mapped.indexOf(pressed) == 0 ? 'partial' : false;\n }\n }\n /** @arg {string} keys */\n function lastChar(keys) {\n var match = /^.*(<[^>]+>)$/.exec(keys);\n var selectedCharacter = match ? match[1] : keys.slice(-1);\n if (selectedCharacter.length > 1){\n switch(selectedCharacter){\n case '<CR>':\n case '<S-CR>':\n selectedCharacter='\\n';\n break;\n case '<Space>':\n case '<S-Space>':\n selectedCharacter=' ';\n break;\n default:\n selectedCharacter='';\n break;\n }\n }\n return selectedCharacter;\n }\n /** @arg {CodeMirror} cm @arg {{ (cm: CodeMirror): void }} fn @arg {number} repeat */\n function repeatFn(cm, fn, repeat) {\n return function() {\n for (var i = 0; i < repeat; i++) {\n fn(cm);\n }\n };\n }\n /** @arg {Pos} cur @return {Pos}*/\n function copyCursor(cur) {\n return new Pos(cur.line, cur.ch);\n }\n /** @arg {Pos} cur1 @arg {Pos} cur2 @return {boolean} */\n function cursorEqual(cur1, cur2) {\n return cur1.ch == cur2.ch && cur1.line == cur2.line;\n }\n /** @arg {Pos} cur1 @arg {Pos} cur2 @return {boolean}*/\n function cursorIsBefore(cur1, cur2) {\n if (cur1.line < cur2.line) {\n return true;\n }\n if (cur1.line == cur2.line && cur1.ch < cur2.ch) {\n return true;\n }\n return false;\n }\n /** @arg {Pos} cur1 @arg {Pos} cur2 @return {Pos}*/\n function cursorMin(cur1, cur2) {\n if (arguments.length > 2) {\n // @ts-ignore\n cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1));\n }\n return cursorIsBefore(cur1, cur2) ? cur1 : cur2;\n }\n /** @arg {Pos} cur1 @arg {Pos} cur2 @return {Pos} */\n function cursorMax(cur1, cur2) {\n if (arguments.length > 2) {\n // @ts-ignore\n cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1));\n }\n return cursorIsBefore(cur1, cur2) ? cur2 : cur1;\n }\n /** @arg {Pos} cur1 @arg {Pos} cur2 @arg {Pos} cur3 @return {boolean}*/ \n function cursorIsBetween(cur1, cur2, cur3) {\n // returns true if cur2 is between cur1 and cur3.\n var cur1before2 = cursorIsBefore(cur1, cur2);\n var cur2before3 = cursorIsBefore(cur2, cur3);\n return cur1before2 && cur2before3;\n }\n /** @arg {CodeMirror} cm @arg {number} lineNum */\n function lineLength(cm, lineNum) {\n return cm.getLine(lineNum).length;\n }\n /** @arg {string} s */\n function trim(s) {\n if (s.trim) {\n return s.trim();\n }\n return s.replace(/^\\s+|\\s+$/g, '');\n }\n /** @arg {string} s */\n function escapeRegex(s) {\n return s.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g, '\\\\$1');\n }\n /** @arg {CodeMirror} cm @arg {number} lineNum @arg {number} column */\n function extendLineToColumn(cm, lineNum, column) {\n var endCh = lineLength(cm, lineNum);\n var spaces = new Array(column-endCh+1).join(' ');\n cm.setCursor(new Pos(lineNum, endCh));\n cm.replaceRange(spaces, cm.getCursor());\n }\n // This functions selects a rectangular block\n // of text with selectionEnd as any of its corner\n // Height of block:\n // Difference in selectionEnd.line and first/last selection.line\n // Width of the block:\n // Distance between selectionEnd.ch and any(first considered here) selection.ch\n /** @arg {CodeMirror} cm @arg {Pos} selectionEnd */\n function selectBlock(cm, selectionEnd) {\n var selections = [], ranges = cm.listSelections();\n var head = copyCursor(cm.clipPos(selectionEnd));\n var isClipped = !cursorEqual(selectionEnd, head);\n var curHead = cm.getCursor('head');\n var primIndex = getIndex(ranges, curHead);\n var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor);\n var max = ranges.length - 1;\n var index = max - primIndex > primIndex ? max : 0;\n var base = ranges[index].anchor;\n\n var firstLine = Math.min(base.line, head.line);\n var lastLine = Math.max(base.line, head.line);\n var baseCh = base.ch, headCh = head.ch;\n\n var dir = ranges[index].head.ch - baseCh;\n var newDir = headCh - baseCh;\n if (dir > 0 && newDir <= 0) {\n baseCh++;\n if (!isClipped) { headCh--; }\n } else if (dir < 0 && newDir >= 0) {\n baseCh--;\n if (!wasClipped) { headCh++; }\n } else if (dir < 0 && newDir == -1) {\n baseCh--;\n headCh++;\n }\n for (var line = firstLine; line <= lastLine; line++) {\n var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)};\n selections.push(range);\n }\n cm.setSelections(selections);\n selectionEnd.ch = headCh;\n base.ch = baseCh;\n return base;\n }\n /** @arg {CodeMirror} cm @arg {any} head @arg {number} height */\n function selectForInsert(cm, head, height) {\n var sel = [];\n for (var i = 0; i < height; i++) {\n var lineHead = offsetCursor(head, i, 0);\n sel.push({anchor: lineHead, head: lineHead});\n }\n cm.setSelections(sel, 0);\n }\n // getIndex returns the index of the cursor in the selections.\n /** @arg {string | any[]} ranges @arg {any} cursor @arg {string | undefined} [end] */\n function getIndex(ranges, cursor, end) {\n for (var i = 0; i < ranges.length; i++) {\n var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor);\n var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor);\n if (atAnchor || atHead) {\n return i;\n }\n }\n return -1;\n }\n /** @arg {CodeMirror} cm @arg {vimState} vim */\n function getSelectedAreaRange(cm, vim) {\n var lastSelection = vim.lastSelection;\n /** @return {[Pos,Pos]} */\n var getCurrentSelectedAreaRange = function() {\n var selections = cm.listSelections();\n var start = selections[0];\n var end = selections[selections.length-1];\n var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head;\n var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor;\n return [selectionStart, selectionEnd];\n };\n var getLastSelectedAreaRange = function() {\n var selectionStart = cm.getCursor();\n var selectionEnd = cm.getCursor();\n var block = lastSelection.visualBlock;\n if (block) {\n var width = block.width;\n var height = block.height;\n selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width);\n var selections = [];\n // selectBlock creates a 'proper' rectangular block.\n // We do not want that in all cases, so we manually set selections.\n for (var i = selectionStart.line; i < selectionEnd.line; i++) {\n var anchor = new Pos(i, selectionStart.ch);\n var head = new Pos(i, selectionEnd.ch);\n var range = {anchor: anchor, head: head};\n selections.push(range);\n }\n cm.setSelections(selections);\n } else {\n var start = lastSelection.anchorMark.find();\n var end = lastSelection.headMark.find();\n var line = end.line - start.line;\n var ch = end.ch - start.ch;\n selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch};\n if (lastSelection.visualLine) {\n selectionStart = new Pos(selectionStart.line, 0);\n selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line));\n }\n cm.setSelection(selectionStart, selectionEnd);\n }\n return [selectionStart, selectionEnd];\n };\n if (!vim.visualMode) {\n // In case of replaying the action.\n return getLastSelectedAreaRange();\n } else {\n return getCurrentSelectedAreaRange();\n }\n }\n // Updates the previous selection with the current selection's values. This\n // should only be called in visual mode.\n /** @arg {CodeMirror} cm @arg {vimState} vim */\n function updateLastSelection(cm, vim) {\n var anchor = vim.sel.anchor;\n var head = vim.sel.head;\n // To accommodate the effect of lastPastedText in the last selection\n if (vim.lastPastedText) {\n head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length);\n vim.lastPastedText = null;\n }\n vim.lastSelection = {'anchorMark': cm.setBookmark(anchor),\n 'headMark': cm.setBookmark(head),\n 'anchor': copyCursor(anchor),\n 'head': copyCursor(head),\n 'visualMode': vim.visualMode,\n 'visualLine': vim.visualLine,\n 'visualBlock': vim.visualBlock};\n }\n /** @arg {CodeMirrorV} cm @arg {Pos} start @arg {Pos} end @returns {[Pos, Pos]} */\n function expandSelection(cm, start, end, move) {\n var sel = cm.state.vim.sel;\n var head = move ? start: sel.head;\n var anchor = move ? start: sel.anchor;\n var tmp;\n if (cursorIsBefore(end, start)) {\n tmp = end;\n end = start;\n start = tmp;\n }\n if (cursorIsBefore(head, anchor)) {\n head = cursorMin(start, head);\n anchor = cursorMax(anchor, end);\n } else {\n anchor = cursorMin(start, anchor);\n head = cursorMax(head, end);\n head = offsetCursor(head, 0, -1);\n if (head.ch == -1 && head.line != cm.firstLine()) {\n head = new Pos(head.line - 1, lineLength(cm, head.line - 1));\n }\n }\n return [anchor, head];\n }\n /**\n * Updates the CodeMirror selection to match the provided vim selection.\n * If no arguments are given, it uses the current vim selection state.\n * @arg {CodeMirrorV} cm \n * @arg {vimState[\"sel\"]} [sel] \n * @arg {\"char\"|\"line\"|\"block\" | undefined} [mode]\n */\n function updateCmSelection(cm, sel, mode) {\n var vim = cm.state.vim;\n sel = sel || vim.sel;\n if (!mode) {\n mode = vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char';\n }\n var cmSel = makeCmSelection(cm, sel, mode);\n cm.setSelections(cmSel.ranges, cmSel.primary);\n }\n /**\n * @arg {CodeMirror} cm \n * @arg {import(\"./types\").CM5RangeInterface} sel\n * @arg {\"char\"|\"line\"|\"block\"} mode \n * @arg {boolean|undefined} [exclusive] \n * @return {{ranges: any, primary: number}}\n */\n function makeCmSelection(cm, sel, mode, exclusive) {\n var head = copyCursor(sel.head);\n var anchor = copyCursor(sel.anchor);\n if (mode == 'char') {\n var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n head = offsetCursor(sel.head, 0, headOffset);\n anchor = offsetCursor(sel.anchor, 0, anchorOffset);\n return {\n ranges: [{anchor: anchor, head: head}],\n primary: 0\n };\n } else if (mode == 'line') {\n if (!cursorIsBefore(sel.head, sel.anchor)) {\n anchor.ch = 0;\n\n var lastLine = cm.lastLine();\n if (head.line > lastLine) {\n head.line = lastLine;\n }\n head.ch = lineLength(cm, head.line);\n } else {\n head.ch = 0;\n anchor.ch = lineLength(cm, anchor.line);\n }\n return {\n ranges: [{anchor: anchor, head: head}],\n primary: 0\n };\n } else if (mode == 'block') {\n var top = Math.min(anchor.line, head.line),\n fromCh = anchor.ch,\n bottom = Math.max(anchor.line, head.line),\n toCh = head.ch;\n if (fromCh < toCh) { toCh += 1; }\n else { fromCh += 1; } var height = bottom - top + 1;\n var primary = head.line == top ? 0 : height - 1;\n var ranges = [];\n for (var i = 0; i < height; i++) {\n ranges.push({\n anchor: new Pos(top + i, fromCh),\n head: new Pos(top + i, toCh)\n });\n }\n return {\n ranges: ranges,\n primary: primary\n };\n }\n throw \"never happens\";\n }\n /** @arg {CodeMirror} cm */\n function getHead(cm) {\n var cur = cm.getCursor('head');\n if (cm.getSelection().length == 1) {\n // Small corner case when only 1 character is selected. The \"real\"\n // head is the left of head and anchor.\n cur = cursorMin(cur, cm.getCursor('anchor'));\n }\n return cur;\n }\n\n /**\n * If moveHead is set to false, the CodeMirror selection will not be\n * touched. The caller assumes the responsibility of putting the cursor\n * in the right place.\n * @arg {CodeMirrorV} cm \n * @arg {boolean} [moveHead]\n */\n function exitVisualMode(cm, moveHead) {\n var vim = cm.state.vim;\n if (moveHead !== false) {\n cm.setCursor(clipCursorToContent(cm, vim.sel.head));\n }\n updateLastSelection(cm, vim);\n vim.visualMode = false;\n vim.visualLine = false;\n vim.visualBlock = false;\n if (!vim.insertMode) CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n }\n\n /** \n * Remove any trailing newlines from the selection. For\n * example, with the caret at the start of the last word on the line,\n * 'dw' should word, but not the newline, while 'w' should advance the\n * caret to the first character of the next line.\n * @arg {CodeMirror} cm\n * @arg {Pos} curStart\n * @arg {Pos} curEnd\n */\n function clipToLine(cm, curStart, curEnd) {\n var selection = cm.getRange(curStart, curEnd);\n // Only clip if the selection ends with trailing newline + whitespace\n if (/\\n\\s*$/.test(selection)) {\n var lines = selection.split('\\n');\n // We know this is all whitespace.\n lines.pop();\n\n // Cases:\n // 1. Last word is an empty line - do not clip the trailing '\\n'\n // 2. Last word is not an empty line - clip the trailing '\\n'\n // Find the line containing the last word, and clip all whitespace up\n // to it.\n for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {\n curEnd.line--;\n curEnd.ch = 0;\n }\n // If the last word is not an empty line, clip an additional newline\n if (line) {\n curEnd.line--;\n curEnd.ch = lineLength(cm, curEnd.line);\n } else {\n curEnd.ch = 0;\n }\n }\n }\n\n // Expand the selection to line ends.\n /** @arg {CodeMirror} _cm @arg {Pos} curStart @arg {Pos} curEnd */\n function expandSelectionToLine(_cm, curStart, curEnd) {\n curStart.ch = 0;\n curEnd.ch = 0;\n curEnd.line++;\n }\n\n /** @arg {string} [text] */\n function findFirstNonWhiteSpaceCharacter(text) {\n if (!text) {\n return 0;\n }\n var firstNonWS = text.search(/\\S/);\n return firstNonWS == -1 ? text.length : firstNonWS;\n }\n\n /** \n * @arg {CodeMirror} cm \n * @arg {{inclusive?: boolean, innerWord?: boolean, bigWord?: boolean, noSymbol?: boolean, multiline?: boolean}} options\n * @arg {Pos} [cursor]\n **/\n function expandWordUnderCursor(cm, {inclusive, innerWord, bigWord, noSymbol, multiline}, cursor) {\n var cur = cursor || getHead(cm);\n var line = cm.getLine(cur.line);\n var endLine = line;\n var startLineNumber = cur.line;\n var endLineNumber = startLineNumber;\n var idx = cur.ch;\n\n var wordOnNextLine;\n // Seek to first word or non-whitespace character, depending on if\n // noSymbol is true.\n var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0];\n if (innerWord && /\\s/.test(line.charAt(idx))) {\n test = function(/** @type {string} */ ch) { return /\\s/.test(ch); };\n } else {\n while (!test(line.charAt(idx))) {\n idx++;\n if (idx >= line.length) {\n if (!multiline) return null;\n idx--;\n wordOnNextLine = findWord(cm, cur, true, bigWord, true);\n break\n }\n }\n\n if (bigWord) {\n test = bigWordCharTest[0];\n } else {\n test = wordCharTest[0];\n if (!test(line.charAt(idx))) {\n test = wordCharTest[1];\n }\n }\n }\n\n var end = idx, start = idx;\n while (test(line.charAt(start)) && start >= 0) { start--; }\n start++;\n if (wordOnNextLine) {\n end = wordOnNextLine.to;\n endLineNumber = wordOnNextLine.line;\n endLine = cm.getLine(endLineNumber);\n if (!endLine && end == 0) end++;\n } else {\n while (test(line.charAt(end)) && end < line.length) { end++; }\n }\n\n if (inclusive) {\n // If present, include all whitespace after word.\n // Otherwise, include all whitespace before word, except indentation.\n var wordEnd = end;\n var startsWithSpace = cur.ch <= start && /\\s/.test(line.charAt(cur.ch));\n if (!startsWithSpace) {\n while (/\\s/.test(endLine.charAt(end)) && end < endLine.length) { end++; }\n }\n if (wordEnd == end || startsWithSpace) {\n var wordStart = start;\n while (/\\s/.test(line.charAt(start - 1)) && start > 0) { start--; }\n if (!start && !startsWithSpace) { start = wordStart; }\n }\n }\n\n return { start: new Pos(startLineNumber, start), end: new Pos(endLineNumber, end) };\n }\n\n /**\n * Depends on the following:\n *\n * - editor mode should be htmlmixedmode / xml\n * - mode/xml/xml.js should be loaded\n * - addon/fold/xml-fold.js should be loaded\n *\n * If any of the above requirements are not true, this function noops.\n *\n * This is _NOT_ a 100% accurate implementation of vim tag text objects.\n * The following caveats apply (based off cursory testing, I'm sure there\n * are other discrepancies):\n *\n * - Does not work inside comments:\n * ```\n * <!-- <div>broken</div> -->\n * ```\n * - Does not work when tags have different cases:\n * ```\n * <div>broken</DIV>\n * ```\n * - Does not work when cursor is inside a broken tag:\n * ```\n * <div><brok><en></div>\n * ```\n * @arg {CodeMirror} cm \n * @arg {Pos} head \n * @arg {boolean} [inclusive]\n */\n function expandTagUnderCursor(cm, head, inclusive) {\n var cur = head;\n if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) {\n return { start: cur, end: cur };\n }\n\n var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head);\n if (!tags || !tags.open || !tags.close) {\n return { start: cur, end: cur };\n }\n\n if (inclusive) {\n return { start: tags.open.from, end: tags.close.to };\n }\n return { start: tags.open.to, end: tags.close.from };\n }\n\n /** @arg {CodeMirror} cm @arg {Pos} oldCur @arg {Pos} newCur */\n function recordJumpPosition(cm, oldCur, newCur) {\n if (!cursorEqual(oldCur, newCur)) {\n vimGlobalState.jumpList.add(cm, oldCur, newCur);\n }\n }\n\n /** @arg {number} increment @arg {{ forward?: any; selectedCharacter?: any; }} args */\n function recordLastCharacterSearch(increment, args) {\n vimGlobalState.lastCharacterSearch.increment = increment;\n vimGlobalState.lastCharacterSearch.forward = args.forward;\n vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter;\n }\n\n var symbolToMode = {\n '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',\n '[': 'section', ']': 'section',\n '*': 'comment', '/': 'comment',\n 'm': 'method', 'M': 'method',\n '#': 'preprocess'\n };\n var findSymbolModes = {\n bracket: {\n isComplete: function(state) {\n if (state.nextCh === state.symb) {\n state.depth++;\n if (state.depth >= 1)return true;\n } else if (state.nextCh === state.reverseSymb) {\n state.depth--;\n }\n return false;\n }\n },\n section: {\n init: function(state) {\n state.curMoveThrough = true;\n state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';\n },\n isComplete: function(state) {\n return state.index === 0 && state.nextCh === state.symb;\n }\n },\n comment: {\n isComplete: function(state) {\n var found = state.lastCh === '*' && state.nextCh === '/';\n state.lastCh = state.nextCh;\n return found;\n }\n },\n // TODO: The original Vim implementation only operates on level 1 and 2.\n // The current implementation doesn't check for code block level and\n // therefore it operates on any levels.\n method: {\n init: function(state) {\n state.symb = (state.symb === 'm' ? '{' : '}');\n state.reverseSymb = state.symb === '{' ? '}' : '{';\n },\n isComplete: function(state) {\n if (state.nextCh === state.symb)return true;\n return false;\n }\n },\n preprocess: {\n init: function(state) {\n state.index = 0;\n },\n isComplete: function(state) {\n if (state.nextCh === '#') {\n var token = state.lineText.match(/^#(\\w+)/)[1];\n if (token === 'endif') {\n if (state.forward && state.depth === 0) {\n return true;\n }\n state.depth++;\n } else if (token === 'if') {\n if (!state.forward && state.depth === 0) {\n return true;\n }\n state.depth--;\n }\n if (token === 'else' && state.depth === 0)return true;\n }\n return false;\n }\n }\n };\n /** @arg {CodeMirrorV} cm @arg {number} repeat @arg {boolean|undefined} forward @arg {string} symb */\n function findSymbol(cm, repeat, forward, symb) {\n var cur = copyCursor(cm.getCursor());\n var increment = forward ? 1 : -1;\n var endLine = forward ? cm.lineCount() : -1;\n var curCh = cur.ch;\n var line = cur.line;\n var lineText = cm.getLine(line);\n var state = {\n lineText: lineText,\n nextCh: lineText.charAt(curCh),\n lastCh: null,\n index: curCh,\n symb: symb,\n reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],\n forward: forward,\n depth: 0,\n curMoveThrough: false\n };\n var mode = symbolToMode[symb];\n if (!mode)return cur;\n var init = findSymbolModes[mode].init;\n var isComplete = findSymbolModes[mode].isComplete;\n if (init) { init(state); }\n while (line !== endLine && repeat) {\n state.index += increment;\n state.nextCh = state.lineText.charAt(state.index);\n if (!state.nextCh) {\n line += increment;\n state.lineText = cm.getLine(line) || '';\n if (increment > 0) {\n state.index = 0;\n } else {\n var lineLen = state.lineText.length;\n state.index = (lineLen > 0) ? (lineLen-1) : 0;\n }\n state.nextCh = state.lineText.charAt(state.index);\n }\n if (isComplete(state)) {\n cur.line = line;\n cur.ch = state.index;\n repeat--;\n }\n }\n if (state.nextCh || state.curMoveThrough) {\n return new Pos(line, state.index);\n }\n return cur;\n }\n\n /*\n * Returns the boundaries of the next word. If the cursor in the middle of\n * the word, then returns the boundaries of the current word, starting at\n * the cursor. If the cursor is at the start/end of a word, and we are going\n * forward/backward, respectively, find the boundaries of the next word.\n *\n * @arg {CodeMirror} cm CodeMirror object.\n * @arg {Cursor} cur The cursor position.\n * @arg {boolean} forward True to search forward. False to search\n * backward.\n * @arg {boolean} bigWord True if punctuation count as part of the word.\n * False if only [a-zA-Z0-9] characters count as part of the word.\n * @arg {boolean} emptyLineIsWord True if empty lines should be treated\n * as words.\n * @return {Object{from:number, to:number, line: number}} The boundaries of\n * the word, or null if there are no more words.\n */\n function findWord(cm, cur, forward, bigWord, emptyLineIsWord) {\n var lineNum = cur.line;\n var pos = cur.ch;\n var line = cm.getLine(lineNum);\n var dir = forward ? 1 : -1;\n var charTests = bigWord ? bigWordCharTest: wordCharTest;\n\n if (emptyLineIsWord && line == '') {\n lineNum += dir;\n line = cm.getLine(lineNum);\n if (!isLine(cm, lineNum)) {\n return null;\n }\n pos = (forward) ? 0 : line.length;\n }\n\n while (true) {\n if (emptyLineIsWord && line == '') {\n return { from: 0, to: 0, line: lineNum };\n }\n var stop = (dir > 0) ? line.length : -1;\n var wordStart = stop, wordEnd = stop;\n // Find bounds of next word.\n while (pos != stop) {\n var foundWord = false;\n for (var i = 0; i < charTests.length && !foundWord; ++i) {\n if (charTests[i](line.charAt(pos))) {\n wordStart = pos;\n // Advance to end of word.\n while (pos != stop && charTests[i](line.charAt(pos))) {\n pos += dir;\n }\n wordEnd = pos;\n foundWord = wordStart != wordEnd;\n if (wordStart == cur.ch && lineNum == cur.line &&\n wordEnd == wordStart + dir) {\n // We started at the end of a word. Find the next one.\n continue;\n } else {\n return {\n from: Math.min(wordStart, wordEnd + 1),\n to: Math.max(wordStart, wordEnd),\n line: lineNum };\n }\n }\n }\n if (!foundWord) {\n pos += dir;\n }\n }\n // Advance to next/prev line.\n lineNum += dir;\n if (!isLine(cm, lineNum)) {\n return null;\n }\n line = cm.getLine(lineNum);\n pos = (dir > 0) ? 0 : line.length;\n }\n }\n\n /**\n * @arg {CodeMirror} cm CodeMirror object.\n * @arg {Pos} cur The position to start from.\n * @arg {number} repeat Number of words to move past.\n * @arg {boolean} forward True to search forward. False to search\n * backward.\n * @arg {boolean} wordEnd True to move to end of word. False to move to\n * beginning of word.\n * @arg {boolean} bigWord True if punctuation count as part of the word.\n * False if only alphabet characters count as part of the word.\n * @return {Pos|undefined} The position the cursor should move to.\n */\n function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) {\n var curStart = copyCursor(cur);\n var words = [];\n if (forward && !wordEnd || !forward && wordEnd) {\n repeat++;\n }\n // For 'e', empty lines are not considered words, go figure.\n var emptyLineIsWord = !(forward && wordEnd);\n for (var i = 0; i < repeat; i++) {\n var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);\n if (!word) {\n var eodCh = lineLength(cm, cm.lastLine());\n words.push(forward\n ? {line: cm.lastLine(), from: eodCh, to: eodCh}\n : {line: 0, from: 0, to: 0});\n break;\n }\n words.push(word);\n cur = new Pos(word.line, forward ? (word.to - 1) : word.from);\n }\n var shortCircuit = words.length != repeat;\n var firstWord = words[0];\n var lastWord = words.pop();\n if (forward && !wordEnd) {\n // w\n if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {\n // We did not start in the middle of a word. Discard the extra word at the end.\n lastWord = words.pop();\n }\n return lastWord && new Pos(lastWord.line, lastWord.from);\n } else if (forward && wordEnd) {\n return lastWord && new Pos(lastWord.line, lastWord.to - 1);\n } else if (!forward && wordEnd) {\n // ge\n if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {\n // We did not start in the middle of a word. Discard the extra word at the end.\n lastWord = words.pop();\n }\n return lastWord && new Pos(lastWord.line, lastWord.to);\n } else {\n // b\n return lastWord && new Pos(lastWord.line, lastWord.from);\n }\n }\n\n /**\n * @arg {CodeMirror} cm \n * @arg {Pos} head \n * @arg {MotionArgs} motionArgs \n * @arg {vimState} vim \n * @arg {boolean} keepHPos */\n function moveToEol(cm, head, motionArgs, vim, keepHPos) {\n var cur = head;\n var retval= new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n var end=cm.clipPos(retval);\n end.ch--;\n if (!keepHPos) {\n vim.lastHPos = Infinity;\n vim.lastHSPos = cm.charCoords(end,'div').left;\n }\n return retval;\n }\n\n /** \n * @arg {CodeMirror} cm \n * @arg {number} repeat \n * @arg {boolean} [forward]\n * @arg {string} [character]\n * @arg {Pos} [head]\n */\n function moveToCharacter(cm, repeat, forward, character, head) {\n if (!character) return;\n var cur = head || cm.getCursor();\n var start = cur.ch;\n var idx;\n for (var i = 0; i < repeat; i ++) {\n var line = cm.getLine(cur.line);\n idx = charIdxInLine(start, line, character, forward, true);\n if (idx == -1) {\n return undefined;\n }\n start = idx;\n }\n if (idx != undefined)\n return new Pos(cm.getCursor().line, idx);\n }\n\n /** @arg {CodeMirrorV} cm @arg {number} repeat */\n function moveToColumn(cm, repeat) {\n // repeat is always >= 1, so repeat - 1 always corresponds\n // to the column we want to go to.\n var line = cm.getCursor().line;\n return clipCursorToContent(cm, new Pos(line, repeat - 1));\n }\n\n /**\n * @arg {CodeMirror} cm \n * @arg {vimState} vim \n * @arg {string} markName \n * @arg {Pos} pos */\n function updateMark(cm, vim, markName, pos) {\n if (!inArray(markName, validMarks) && !latinCharRegex.test(markName)) {\n return;\n }\n if (vim.marks[markName]) {\n vim.marks[markName].clear();\n }\n vim.marks[markName] = cm.setBookmark(pos);\n }\n\n /**\n * @arg {number} start \n * @arg {string | any[]} line \n * @arg {any} character \n * @arg {boolean} [forward] \n * @arg {boolean} [includeChar] */\n function charIdxInLine(start, line, character, forward, includeChar) {\n // Search for char in line.\n // motion_options: {forward, includeChar}\n // If includeChar = true, include it too.\n // If forward = true, search forward, else search backwards.\n // If char is not found on this line, do nothing\n var idx;\n if (forward) {\n idx = line.indexOf(character, start + 1);\n if (idx != -1 && !includeChar) {\n idx -= 1;\n }\n } else {\n idx = line.lastIndexOf(character, start - 1);\n if (idx != -1 && !includeChar) {\n idx += 1;\n }\n }\n return idx;\n }\n\n /** @arg {CodeMirrorV} cm \n * @arg {Pos} head \n * @arg {number} repeat \n * @arg {number} dir \n * @arg {boolean} [inclusive] */\n function findParagraph(cm, head, repeat, dir, inclusive) {\n var line = head.line;\n var min = cm.firstLine();\n var max = cm.lastLine();\n var start, end, i = line;\n /** @arg {number} i */\n function isEmpty(i) { return !cm.getLine(i); }\n /** @arg {number} i @arg {number} dir @arg {boolean} [any] */\n function isBoundary(i, dir, any) {\n if (any) { return isEmpty(i) != isEmpty(i + dir); }\n return !isEmpty(i) && isEmpty(i + dir);\n }\n if (dir) {\n while (min <= i && i <= max && repeat > 0) {\n if (isBoundary(i, dir)) { repeat--; }\n i += dir;\n }\n return {start: new Pos(i, 0), end: head};\n }\n\n var vim = cm.state.vim;\n if (vim.visualLine && isBoundary(line, 1, true)) {\n var anchor = vim.sel.anchor;\n if (isBoundary(anchor.line, -1, true)) {\n if (!inclusive || anchor.line != line) {\n line += 1;\n }\n }\n }\n var startState = isEmpty(line);\n for (i = line; i <= max && repeat; i++) {\n if (isBoundary(i, 1, true)) {\n if (!inclusive || isEmpty(i) != startState) {\n repeat--;\n }\n }\n }\n end = new Pos(i, 0);\n // select boundary before paragraph for the last one\n if (i > max && !startState) { startState = true; }\n else { inclusive = false; }\n for (i = line; i > min; i--) {\n if (!inclusive || isEmpty(i) == startState || i == line) {\n if (isBoundary(i, -1, true)) { break; }\n }\n }\n start = new Pos(i, 0);\n return { start: start, end: end };\n }\n\n /**\n * Based on {@link findSentence}. The internal functions have the same names,\n * but their behaviour is different. findSentence() crosses line breaks and \n * is used for jumping to sentence beginnings before or after the current cursor position, \n * whereas getSentence() is for getting the beginning or end of the sentence \n * at the current cursor position, either including (a) or excluding (i) whitespace.\n * @arg {CodeMirror} cm\n * @arg {Pos} cur\n * @arg {number} repeat\n * @arg {number} dir\n * @arg {boolean} inclusive\n */\n function getSentence(cm, cur, repeat, dir, inclusive /*includes whitespace*/) {\n\n /*\n Takes an index object\n {\n line: the line string,\n ln: line number,\n pos: index in line,\n dir: direction of traversal (-1 or 1)\n }\n and modifies the pos member to represent the\n next valid position or sets the line to null if there are\n no more valid positions.\n */\n function nextChar(curr) {\n if (curr.pos + curr.dir < 0 || curr.pos + curr.dir >= curr.line.length) {\n curr.line = null;\n }\n else {\n curr.pos += curr.dir;\n }\n }\n /*\n Performs one iteration of traversal in forward direction\n Returns an index object of the sentence end\n */\n function forward(cm, ln, pos, dir) {\n var line = cm.getLine(ln);\n\n var curr = {\n line: line,\n ln: ln,\n pos: pos,\n dir: dir,\n };\n\n if (curr.line === \"\") {\n return { ln: curr.ln, pos: curr.pos };\n }\n\n var lastSentencePos = curr.pos;\n\n // Move one step to skip character we start on\n nextChar(curr);\n\n while (curr.line !== null) {\n lastSentencePos = curr.pos;\n if (isEndOfSentenceSymbol(curr.line[curr.pos])) {\n if (!inclusive) {\n return { ln: curr.ln, pos: curr.pos + 1 };\n } \n else {\n nextChar(curr);\n while (curr.line !== null ) {\n if (isWhiteSpaceString(curr.line[curr.pos])) {\n lastSentencePos = curr.pos;\n nextChar(curr);\n } \n else {\n break;\n }\n }\n return { ln: curr.ln, pos: lastSentencePos + 1 };\n }\n }\n nextChar(curr);\n }\n return { ln: curr.ln, pos: lastSentencePos + 1 };\n }\n\n /** \n * Performs one iteration of traversal in reverse direction\n * Returns an index object of the sentence start\n * @arg {CodeMirror} cm \n * @arg {number} ln \n * @arg {number} pos \n * @arg {number} dir\n */\n function reverse(cm, ln, pos, dir) {\n var line = cm.getLine(ln);\n\n var curr = {\n line: line,\n ln: ln,\n pos: pos,\n dir: dir,\n };\n\n if (curr.line === \"\") {\n return { ln: curr.ln, pos: curr.pos };\n }\n\n var lastSentencePos = curr.pos;\n\n // Move one step to skip character we start on\n nextChar(curr);\n\n while (curr.line !== null) {\n if (!isWhiteSpaceString(curr.line[curr.pos]) && !isEndOfSentenceSymbol(curr.line[curr.pos])) {\n lastSentencePos = curr.pos;\n }\n\n else if (isEndOfSentenceSymbol(curr.line[curr.pos]) ) {\n if (!inclusive) {\n return { ln: curr.ln, pos: lastSentencePos };\n } \n else {\n if (isWhiteSpaceString(curr.line[curr.pos + 1])) {\n return { ln: curr.ln, pos: curr.pos + 1 };\n } \n else {\n return { ln: curr.ln, pos: lastSentencePos };\n }\n }\n }\n\n nextChar(curr);\n }\n curr.line = line;\n if (inclusive && isWhiteSpaceString(curr.line[curr.pos])) {\n return { ln: curr.ln, pos: curr.pos };\n } \n else {\n return { ln: curr.ln, pos: lastSentencePos };\n }\n\n }\n\n var curr_index = {\n ln: cur.line,\n pos: cur.ch,\n };\n\n while (repeat > 0) {\n if (dir < 0) {\n curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);\n }\n else {\n curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);\n }\n repeat--;\n }\n\n return new Pos(curr_index.ln, curr_index.pos);\n }\n\n function findSentence(cm, cur, repeat, dir) {\n\n /*\n Takes an index object\n {\n line: the line string,\n ln: line number,\n pos: index in line,\n dir: direction of traversal (-1 or 1)\n }\n and modifies the line, ln, and pos members to represent the\n next valid position or sets them to null if there are\n no more valid positions.\n */\n function nextChar(cm, idx) {\n if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) {\n idx.ln += idx.dir;\n if (!isLine(cm, idx.ln)) {\n idx.line = null;\n idx.ln = null;\n idx.pos = null;\n return;\n }\n idx.line = cm.getLine(idx.ln);\n idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1;\n }\n else {\n idx.pos += idx.dir;\n }\n }\n\n /*\n Performs one iteration of traversal in forward direction\n Returns an index object of the new location\n */\n /** @arg {CodeMirror} cm @arg {number} ln @arg {number} pos @arg {number} dir */\n function forward(cm, ln, pos, dir) {\n var line = cm.getLine(ln);\n var stop = (line === \"\");\n\n var curr = {\n line: line,\n ln: ln,\n pos: pos,\n dir: dir,\n };\n\n var last_valid = {\n ln: curr.ln,\n pos: curr.pos,\n };\n\n var skip_empty_lines = (curr.line === \"\");\n\n // Move one step to skip character we start on\n nextChar(cm, curr);\n\n while (curr.line !== null) {\n last_valid.ln = curr.ln;\n last_valid.pos = curr.pos;\n\n if (curr.line === \"\" && !skip_empty_lines) {\n return { ln: curr.ln, pos: curr.pos, };\n }\n else if (stop && curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n return { ln: curr.ln, pos: curr.pos, };\n }\n else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n && !stop\n && (curr.pos === curr.line.length - 1\n || isWhiteSpaceString(curr.line[curr.pos + 1]))) {\n stop = true;\n }\n\n nextChar(cm, curr);\n }\n\n /*\n Set the position to the last non whitespace character on the last\n valid line in the case that we reach the end of the document.\n */\n var line = cm.getLine(last_valid.ln);\n last_valid.pos = 0;\n for(var i = line.length - 1; i >= 0; --i) {\n if (!isWhiteSpaceString(line[i])) {\n last_valid.pos = i;\n break;\n }\n }\n\n return last_valid;\n\n }\n\n /*\n Performs one iteration of traversal in reverse direction\n Returns an index object of the new location\n */\n /** @arg {CodeMirror} cm @arg {number} ln @arg {number} pos @arg {number} dir */\n function reverse(cm, ln, pos, dir) {\n var line = cm.getLine(ln);\n\n var curr = {\n line: line,\n ln: ln,\n pos: pos,\n dir: dir,\n };\n\n /** @type {{ln: number, pos: number|null}} */\n var last_valid = {\n ln: curr.ln,\n pos: null,\n };\n\n var skip_empty_lines = (curr.line === \"\");\n\n // Move one step to skip character we start on\n nextChar(cm, curr);\n\n while (curr.line !== null) {\n\n if (curr.line === \"\" && !skip_empty_lines) {\n if (last_valid.pos !== null) {\n return last_valid;\n }\n else {\n return { ln: curr.ln, pos: curr.pos };\n }\n }\n else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n && last_valid.pos !== null\n && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) {\n return last_valid;\n }\n else if (curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n skip_empty_lines = false;\n last_valid = { ln: curr.ln, pos: curr.pos };\n }\n\n nextChar(cm, curr);\n }\n\n /*\n Set the position to the first non whitespace character on the last\n valid line in the case that we reach the beginning of the document.\n */\n var line = cm.getLine(last_valid.ln);\n last_valid.pos = 0;\n for(var i = 0; i < line.length; ++i) {\n if (!isWhiteSpaceString(line[i])) {\n last_valid.pos = i;\n break;\n }\n }\n return last_valid;\n }\n\n var curr_index = {\n ln: cur.line,\n pos: cur.ch,\n };\n\n while (repeat > 0) {\n if (dir < 0) {\n curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);\n }\n else {\n curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);\n }\n repeat--;\n }\n\n return new Pos(curr_index.ln, curr_index.pos);\n }\n\n // TODO: perhaps this finagling of start and end positions belongs\n // in codemirror/replaceRange?\n /** @arg {CodeMirror} cm @arg {Pos} head @arg {string | number} symb @arg {boolean} inclusive */\n function selectCompanionObject(cm, head, symb, inclusive) {\n var cur = head;\n\n var bracketRegexp = ({\n '(': /[()]/, ')': /[()]/,\n '[': /[[\\]]/, ']': /[[\\]]/,\n '{': /[{}]/, '}': /[{}]/,\n '<': /[<>]/, '>': /[<>]/})[symb];\n var openSym = ({\n '(': '(', ')': '(',\n '[': '[', ']': '[',\n '{': '{', '}': '{',\n '<': '<', '>': '<'})[symb];\n var curChar = cm.getLine(cur.line).charAt(cur.ch);\n // Due to the behavior of scanForBracket, we need to add an offset if the\n // cursor is on a matching open bracket.\n var offset = curChar === openSym ? 1 : 0;\n\n var startBracket = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp});\n var endBracket = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp});\n\n if (!startBracket || !endBracket) return null;\n\n var start = startBracket.pos; \n var end = endBracket.pos;\n\n if ((start.line == end.line && start.ch > end.ch)\n || (start.line > end.line)) {\n var tmp = start;\n start = end;\n end = tmp;\n }\n\n if (inclusive) {\n end.ch += 1;\n } else {\n start.ch += 1;\n }\n\n return { start: start, end: end };\n }\n\n // Takes in a symbol and a cursor and tries to simulate text objects that\n // have identical opening and closing symbols\n // TODO support across multiple lines\n /** @arg {CodeMirror} cm @arg {Pos} head @arg {string} symb @arg {boolean} inclusive */\n function findBeginningAndEnd(cm, head, symb, inclusive) {\n var cur = copyCursor(head);\n var line = cm.getLine(cur.line);\n var chars = line.split('');\n var start, end, i, len;\n var firstIndex = chars.indexOf(symb);\n\n // the decision tree is to always look backwards for the beginning first,\n // but if the cursor is in front of the first instance of the symb,\n // then move the cursor forward\n if (cur.ch < firstIndex) {\n cur.ch = firstIndex;\n }\n // otherwise if the cursor is currently on the closing symbol\n else if (firstIndex < cur.ch && chars[cur.ch] == symb) {\n var stringAfter = /string/.test(cm.getTokenTypeAt(offsetCursor(head, 0, 1)));\n var stringBefore = /string/.test(cm.getTokenTypeAt(head));\n var isStringStart = stringAfter && !stringBefore;\n if (!isStringStart) {\n end = cur.ch; // assign end to the current cursor\n --cur.ch; // make sure to look backwards\n }\n }\n\n // if we're currently on the symbol, we've got a start\n if (chars[cur.ch] == symb && !end) {\n start = cur.ch + 1; // assign start to ahead of the cursor\n } else {\n // go backwards to find the start\n for (i = cur.ch; i > -1 && !start; i--) {\n if (chars[i] == symb) {\n start = i + 1;\n }\n }\n }\n\n // look forwards for the end symbol\n if (start && !end) {\n for (i = start, len = chars.length; i < len && !end; i++) {\n if (chars[i] == symb) {\n end = i;\n }\n }\n }\n\n // nothing found\n if (!start || !end) {\n return { start: cur, end: cur };\n }\n\n // include the symbols\n if (inclusive) {\n --start; ++end;\n }\n\n return {\n start: new Pos(cur.line, start),\n end: new Pos(cur.line, end)\n };\n }\n\n // Search functions\n defineOption('pcre', true, 'boolean');\n \n class SearchState {\n getQuery() {\n return vimGlobalState.query;\n };\n setQuery(query) {\n vimGlobalState.query = query;\n };\n getOverlay() {\n return this.searchOverlay;\n };\n setOverlay(overlay) {\n this.searchOverlay = overlay;\n };\n isReversed() {\n return vimGlobalState.isReversed;\n };\n setReversed(reversed) {\n vimGlobalState.isReversed = reversed;\n };\n getScrollbarAnnotate() {\n return this.annotate;\n };\n setScrollbarAnnotate(annotate) {\n this.annotate = annotate;\n };\n } /** @arg {CodeMirrorV} cm */\n function getSearchState(cm) {\n var vim = cm.state.vim;\n return vim.searchState_ || (vim.searchState_ = new SearchState());\n }\n /** @arg {string} argString */\n function splitBySlash(argString) {\n return splitBySeparator(argString, '/');\n }\n\n /** @arg {string} argString */\n function findUnescapedSlashes(argString) {\n return findUnescapedSeparators(argString, '/');\n }\n\n /** @arg {string} argString @arg {string} separator */\n function splitBySeparator(argString, separator) {\n var slashes = findUnescapedSeparators(argString, separator) || [];\n if (!slashes.length) return [];\n var tokens = [];\n // in case of strings like foo/bar\n if (slashes[0] !== 0) return;\n for (var i = 0; i < slashes.length; i++) {\n if (typeof slashes[i] == 'number')\n tokens.push(argString.substring(slashes[i] + 1, slashes[i+1]));\n }\n return tokens;\n }\n\n /** @arg {string} str @arg {string} separator */\n function findUnescapedSeparators(str, separator) {\n if (!separator)\n separator = '/';\n\n var escapeNextChar = false;\n var slashes = [];\n for (var i = 0; i < str.length; i++) {\n var c = str.charAt(i);\n if (!escapeNextChar && c == separator) {\n slashes.push(i);\n }\n escapeNextChar = !escapeNextChar && (c == '\\\\');\n }\n return slashes;\n }\n\n // Translates a search string from ex (vim) syntax into javascript form.\n /** @arg {string} str */\n function translateRegex(str) {\n // When these match, add a '\\' if unescaped or remove one if escaped.\n var specials = '|(){';\n // Remove, but never add, a '\\' for these.\n var unescape = '}';\n var escapeNextChar = false;\n var out = [];\n for (var i = -1; i < str.length; i++) {\n var c = str.charAt(i) || '';\n var n = str.charAt(i+1) || '';\n var specialComesNext = (n && specials.indexOf(n) != -1);\n if (escapeNextChar) {\n if (c !== '\\\\' || !specialComesNext) {\n out.push(c);\n }\n escapeNextChar = false;\n } else {\n if (c === '\\\\') {\n escapeNextChar = true;\n // Treat the unescape list as special for removing, but not adding '\\'.\n if (n && unescape.indexOf(n) != -1) {\n specialComesNext = true;\n }\n // Not passing this test means removing a '\\'.\n if (!specialComesNext || n === '\\\\') {\n out.push(c);\n }\n } else {\n out.push(c);\n if (specialComesNext && n !== '\\\\') {\n out.push('\\\\');\n }\n }\n }\n }\n return out.join('');\n }\n\n // Translates the replace part of a search and replace from ex (vim) syntax into\n // javascript form. Similar to translateRegex, but additionally fixes back references\n // (translates '\\[0..9]' to '$[0..9]') and follows different rules for escaping '$'.\n /** @type{Object<string, string>} */\n var charUnescapes = {'\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t'};\n /** @arg {string} str */\n function translateRegexReplace(str) {\n var escapeNextChar = false;\n var out = [];\n for (var i = -1; i < str.length; i++) {\n var c = str.charAt(i) || '';\n var n = str.charAt(i+1) || '';\n if (charUnescapes[c + n]) {\n out.push(charUnescapes[c+n]);\n i++;\n } else if (escapeNextChar) {\n // At any point in the loop, escapeNextChar is true if the previous\n // character was a '\\' and was not escaped.\n out.push(c);\n escapeNextChar = false;\n } else {\n if (c === '\\\\') {\n escapeNextChar = true;\n if ((isNumber(n) || n === '$')) {\n out.push('$');\n } else if (n !== '/' && n !== '\\\\') {\n out.push('\\\\');\n }\n } else {\n if (c === '$') {\n out.push('$');\n }\n out.push(c);\n if (n === '/') {\n out.push('\\\\');\n }\n }\n }\n }\n return out.join('');\n }\n\n // Unescape \\ and / in the replace part, for PCRE mode.\n /** @type{Record<string, string>} */\n var unescapes = {'\\\\/': '/', '\\\\\\\\': '\\\\', '\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t', '\\\\&':'&'};\n /** @arg {string} str */\n function unescapeRegexReplace(str) {\n var stream = new CodeMirror.StringStream(str);\n var output = [];\n while (!stream.eol()) {\n // Search for \\.\n while (stream.peek() && stream.peek() != '\\\\') {\n output.push(stream.next());\n }\n var matched = false;\n for (var matcher in unescapes) {\n if (stream.match(matcher, true)) {\n matched = true;\n output.push(unescapes[matcher]);\n break;\n }\n }\n if (!matched) {\n // Don't change anything\n output.push(stream.next());\n }\n }\n return output.join('');\n }\n\n /**\n * Extract the regular expression from the query and return a Regexp object.\n * Returns null if the query is blank.\n * If ignoreCase is passed in, the Regexp object will have the 'i' flag set.\n * If smartCase is passed in, and the query contains upper case letters,\n * then ignoreCase is overridden, and the 'i' flag will not be set.\n * If the query contains the /i in the flag part of the regular expression,\n * then both ignoreCase and smartCase are ignored, and 'i' will be passed\n * through to the Regex object.\n * @arg {string|RegExp} query\n * @arg {boolean} ignoreCase\n * @arg {boolean} smartCase\n */\n function parseQuery(query, ignoreCase, smartCase) {\n // First update the last search register\n var lastSearchRegister = vimGlobalState.registerController.getRegister('/');\n lastSearchRegister.setText(query);\n // Check if the query is already a regex.\n if (query instanceof RegExp) { return query; }\n // First try to extract regex + flags from the input. If no flags found,\n // extract just the regex. IE does not accept flags directly defined in\n // the regex string in the form /regex/flags\n var slashes = findUnescapedSlashes(query);\n var regexPart;\n var forceIgnoreCase;\n if (!slashes.length) {\n // Query looks like 'regexp'\n regexPart = query;\n } else {\n // Query looks like 'regexp/...'\n regexPart = query.substring(0, slashes[0]);\n var flagsPart = query.substring(slashes[0]);\n forceIgnoreCase = (flagsPart.indexOf('i') != -1);\n }\n if (!regexPart) {\n return null;\n }\n if (!getOption('pcre')) {\n regexPart = translateRegex(regexPart);\n }\n if (smartCase) {\n ignoreCase = (/^[^A-Z]*$/).test(regexPart);\n }\n var regexp = new RegExp(regexPart,\n (ignoreCase || forceIgnoreCase) ? 'im' : 'm');\n return regexp;\n }\n\n /**\n * dom - Document Object Manipulator\n * Usage:\n * dom('<tag>'|<node>[, ...{<attributes>|<$styles>}|<child-node>|'<text>'])\n * Examples:\n * dom('div', {id:'xyz'}, dom('p', 'CM rocks!', {$color:'red'}))\n * dom(document.head, dom('script', 'alert(\"hello!\")'))\n * Not supported:\n * dom('p', ['arrays are objects'], Error('objects specify attributes'))\n * @arg {string | HTMLElement } n\n */\n function dom(n) {\n if (typeof n === 'string') n = document.createElement(n);\n for (var a, i = 1; i < arguments.length; i++) {\n if (!(a = arguments[i])) continue;\n if (typeof a !== 'object') a = document.createTextNode(a);\n if (a.nodeType) n.appendChild(a);\n else for (var key in a) {\n if (!Object.prototype.hasOwnProperty.call(a, key)) continue;\n if (key[0] === '$') n.style[key.slice(1)] = a[key];\n else n.setAttribute(key, a[key]);\n }\n }\n return n;\n }\n\n /** @arg {CodeMirror} cm @arg {any} template */\n function showConfirm(cm, template) {\n var pre = dom('div', {$color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message'}, template);\n if (cm.openNotification) {\n cm.openNotification(pre, {bottom: true, duration: 5000});\n } else {\n alert(pre.innerText);\n }\n }\n /** @arg {string} prefix @arg {string} desc */\n function makePrompt(prefix, desc) {\n return dom('div', {$display: 'flex'},\n dom('span', {$fontFamily: 'monospace', $whiteSpace: 'pre', $flex: 1},\n prefix,\n dom('input', {type: 'text', autocorrect: 'off',\n autocapitalize: 'off', spellcheck: 'false', $width: '100%'})),\n desc && dom('span', {$color: '#888'}, desc));\n }\n /**\n * @arg {CodeMirror} cm \n * @arg {{ onClose?: any; prefix: any; desc?: any; onKeyUp?: any; onKeyDown: any; value?: any; selectValueOnOpen?: boolean; }} options \n */\n function showPrompt(cm, options) {\n if (keyToKeyStack.length) {\n if (!options.value) options.value = '';\n virtualPrompt = options;\n return;\n }\n var template = makePrompt(options.prefix, options.desc);\n if (cm.openDialog) {\n cm.openDialog(template, options.onClose, {\n onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp,\n bottom: true, selectValueOnOpen: false, value: options.value\n });\n }\n else {\n var shortText = '';\n if (typeof options.prefix != \"string\" && options.prefix) shortText += options.prefix.textContent;\n if (options.desc) shortText += \" \" + options.desc;\n options.onClose(prompt(shortText, ''));\n }\n }\n\n /** @arg {RegExp|unknown} r1 @arg {RegExp|unknown} r2 */\n function regexEqual(r1, r2) {\n if (r1 instanceof RegExp && r2 instanceof RegExp) {\n var props = ['global', 'multiline', 'ignoreCase', 'source'];\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n if (r1[prop] !== r2[prop]) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n // Returns true if the query is valid.\n /**\n * @arg {CodeMirrorV} cm \n * @arg {string | RegExp} rawQuery \n * @arg {boolean | undefined} [ignoreCase] \n * @arg {boolean | undefined} [smartCase]\n */\n function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {\n if (!rawQuery) {\n return;\n }\n var state = getSearchState(cm);\n var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase);\n if (!query) {\n return;\n }\n highlightSearchMatches(cm, query);\n if (regexEqual(query, state.getQuery())) {\n return query;\n }\n state.setQuery(query);\n return query;\n }\n /** @arg {RegExp} query */\n function searchOverlay(query) {\n if (query.source.charAt(0) == '^') {\n var matchSol = true;\n }\n return {\n token: function(stream) {\n if (matchSol && !stream.sol()) {\n stream.skipToEnd();\n return;\n }\n var match = stream.match(query, false);\n if (match) {\n if (match[0].length == 0) {\n // Matched empty string, skip to next.\n stream.next();\n return 'searching';\n }\n if (!stream.sol()) {\n // Backtrack 1 to match \\b\n stream.backUp(1);\n if (!query.exec(stream.next() + match[0])) {\n stream.next();\n return null;\n }\n }\n stream.match(query);\n return 'searching';\n }\n while (!stream.eol()) {\n stream.next();\n if (stream.match(query, false)) break;\n }\n },\n query: query\n };\n }\n var highlightTimeout = 0;\n /** @arg {CodeMirrorV} cm @arg {RegExp} query */\n function highlightSearchMatches(cm, query) {\n clearTimeout(highlightTimeout);\n var searchState = getSearchState(cm);\n searchState.highlightTimeout = highlightTimeout;\n highlightTimeout = setTimeout(function() {\n if (!cm.state.vim) return;\n var searchState = getSearchState(cm);\n searchState.highlightTimeout = null;\n var overlay = searchState.getOverlay();\n if (!overlay || query != overlay.query) {\n if (overlay) {\n cm.removeOverlay(overlay);\n }\n overlay = searchOverlay(query);\n cm.addOverlay(overlay);\n if (cm.showMatchesOnScrollbar) {\n if (searchState.getScrollbarAnnotate()) {\n searchState.getScrollbarAnnotate().clear();\n }\n searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query));\n }\n searchState.setOverlay(overlay);\n }\n }, 50);\n }\n /** @arg {CodeMirror} cm @arg {boolean} prev @arg {RegExp} query @arg {number | undefined} [repeat] */\n function findNext(cm, prev, query, repeat) {\n return cm.operation(function() {\n if (repeat === undefined) { repeat = 1; }\n var pos = cm.getCursor();\n var cursor = cm.getSearchCursor(query, pos);\n for (var i = 0; i < repeat; i++) {\n var found = cursor.find(prev);\n // @ts-ignore\n if (i == 0 && found && cursorEqual(cursor.from(), pos)) {\n var lastEndPos = prev ? cursor.from() : cursor.to();\n found = cursor.find(prev);\n // @ts-ignore\n if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) {\n // @ts-ignore\n if (cm.getLine(lastEndPos.line).length == lastEndPos.ch)\n found = cursor.find(prev);\n }\n }\n if (!found) {\n // SearchCursor may have returned null because it hit EOF, wrap\n // around and try again.\n cursor = cm.getSearchCursor(query,\n // @ts-ignore\n (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) );\n if (!cursor.find(prev)) {\n return;\n }\n }\n }\n return cursor.from();\n });\n }\n /**\n * Pretty much the same as `findNext`, except for the following differences:\n *\n * 1. Before starting the search, move to the previous search. This way if our cursor is\n * already inside a match, we should return the current match.\n * 2. Rather than only returning the cursor's from, we return the cursor's from and to as a tuple.\n * @arg {CodeMirror} cm\n * @arg {boolean} prev\n * @arg {any} query\n * @arg {number | undefined} repeat\n * @arg {vimState} vim\n */\n function findNextFromAndToInclusive(cm, prev, query, repeat, vim) {\n return cm.operation(function() {\n if (repeat === undefined) { repeat = 1; }\n var pos = cm.getCursor();\n var cursor = cm.getSearchCursor(query, pos);\n\n // Go back one result to ensure that if the cursor is currently a match, we keep it.\n var found = cursor.find(!prev);\n\n // If we haven't moved, go back one more (similar to if i==0 logic in findNext).\n // @ts-ignore\n if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) {\n cursor.find(!prev);\n }\n\n for (var i = 0; i < repeat; i++) {\n found = cursor.find(prev);\n if (!found) {\n // SearchCursor may have returned null because it hit EOF, wrap\n // around and try again.\n cursor = cm.getSearchCursor(query,\n // @ts-ignore\n (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) );\n if (!cursor.find(prev)) {\n return;\n }\n }\n }\n return [cursor.from(), cursor.to()];\n });\n }\n /** @arg {CodeMirrorV} cm */\n function clearSearchHighlight(cm) {\n var state = getSearchState(cm);\n if (state.highlightTimeout) {\n clearTimeout(state.highlightTimeout);\n state.highlightTimeout = null;\n }\n cm.removeOverlay(getSearchState(cm).getOverlay());\n state.setOverlay(null);\n if (state.getScrollbarAnnotate()) {\n state.getScrollbarAnnotate().clear();\n state.setScrollbarAnnotate(null);\n }\n }\n /**\n * Check if pos is in the specified range, INCLUSIVE.\n * Range can be specified with 1 or 2 arguments.\n * If the first range argument is an array, treat it as an array of line\n * numbers. Match pos against any of the lines.\n * If the first range argument is a number,\n * if there is only 1 range argument, check if pos has the same line\n * number\n * if there are 2 range arguments, then check if pos is in between the two\n * range arguments.\n * @arg {number|Pos} pos\n * @arg {number|number[]} start\n * @arg {number} end\n */\n function isInRange(pos, start, end) {\n if (typeof pos != 'number') {\n // Assume it is a cursor position. Get the line number.\n pos = pos.line;\n }\n if (start instanceof Array) {\n return inArray(pos, start);\n } else {\n if (typeof end == 'number') {\n return (pos >= start && pos <= end);\n } else {\n return pos == start;\n }\n }\n }\n /** @arg {CodeMirror} cm */\n function getUserVisibleLines(cm) {\n var scrollInfo = cm.getScrollInfo();\n var occludeToleranceTop = 6;\n var occludeToleranceBottom = 10;\n var from = cm.coordsChar({left:0, top: occludeToleranceTop + scrollInfo.top}, 'local');\n var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top;\n var to = cm.coordsChar({left:0, top: bottomY}, 'local');\n return {top: from.line, bottom: to.line};\n }\n\n /** @arg {CodeMirror} cm @arg {vimState} vim @arg {string} markName */\n function getMarkPos(cm, vim, markName) {\n if (markName == '\\'' || markName == '`') {\n return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0);\n } else if (markName == '.') {\n return getLastEditPos(cm);\n }\n\n var mark = vim.marks[markName];\n return mark && mark.find();\n }\n\n /** @arg {CodeMirror} cm */\n function getLastEditPos(cm) {\n if (cm.getLastEditEnd) {\n return cm.getLastEditEnd();\n }\n // for old cm\n var done = /**@type{any}*/(cm).doc.history.done;\n for (var i = done.length; i--;) {\n if (done[i].changes) {\n return copyCursor(done[i].changes[0].to);\n }\n }\n }\n\n class ExCommandDispatcher {\n constructor() {\n /**@type {Record<string, any>} */\n this.commandMap_;\n this.buildCommandMap_();\n }\n processCommand(cm, input, opt_params) {\n var that = this;\n cm.operation(function () {\n cm.curOp.isVimOp = true;\n that._processCommand(cm, input, opt_params);\n });\n }\n _processCommand(cm, input, opt_params) {\n var vim = cm.state.vim;\n var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');\n var previousCommand = commandHistoryRegister.toString();\n var inputStream = new CodeMirror.StringStream(input);\n // update \": with the latest command whether valid or invalid\n commandHistoryRegister.setText(input);\n var params = opt_params || {};\n params.input = input;\n try {\n this.parseInput_(cm, inputStream, params);\n } catch(e) {\n showConfirm(cm, e + \"\");\n throw e;\n }\n\n if (vim.visualMode) {\n exitVisualMode(cm);\n }\n\n var command;\n var commandName;\n if (!params.commandName) {\n // If only a line range is defined, move to the line.\n if (params.line !== undefined) {\n commandName = 'move';\n }\n } else {\n command = this.matchCommand_(params.commandName);\n if (command) {\n commandName = command.name;\n if (command.excludeFromCommandHistory) {\n commandHistoryRegister.setText(previousCommand);\n }\n this.parseCommandArgs_(inputStream, params, command);\n if (command.type == 'exToKey') {\n // Handle Ex to Key mapping.\n doKeyToKey(cm, command.toKeys, command);\n return;\n } else if (command.type == 'exToEx') {\n // Handle Ex to Ex mapping.\n this.processCommand(cm, command.toInput);\n return;\n }\n }\n }\n if (!commandName) {\n showConfirm(cm, 'Not an editor command \":' + input + '\"');\n return;\n }\n try {\n exCommands[commandName](cm, params);\n // Possibly asynchronous commands (e.g. substitute, which might have a\n // user confirmation), are responsible for calling the callback when\n // done. All others have it taken care of for them here.\n if ((!command || !command.possiblyAsync) && params.callback) {\n params.callback();\n }\n } catch(e) {\n showConfirm(cm, e + \"\");\n throw e;\n }\n }\n parseInput_(cm, inputStream, result) {\n inputStream.eatWhile(':');\n // Parse range.\n if (inputStream.eat('%')) {\n result.line = cm.firstLine();\n result.lineEnd = cm.lastLine();\n } else {\n result.line = this.parseLineSpec_(cm, inputStream);\n if (result.line !== undefined && inputStream.eat(',')) {\n result.lineEnd = this.parseLineSpec_(cm, inputStream);\n }\n }\n\n if (result.line == undefined) {\n if (cm.state.vim.visualMode) {\n result.selectionLine = getMarkPos(cm, cm.state.vim, '<')?.line;\n result.selectionLineEnd = getMarkPos(cm, cm.state.vim, '>')?.line;\n } else {\n result.selectionLine = cm.getCursor().line;\n }\n } else {\n result.selectionLine = result.line;\n result.selectionLineEnd = result.lineEnd;\n }\n\n // Parse command name.\n var commandMatch = inputStream.match(/^(\\w+|!!|@@|[!#&*<=>@~])/);\n if (commandMatch) {\n result.commandName = commandMatch[1];\n } else {\n result.commandName = inputStream.match(/.*/)[0];\n }\n\n return result;\n }\n parseLineSpec_(cm, inputStream) {\n var numberMatch = inputStream.match(/^(\\d+)/);\n if (numberMatch) {\n // Absolute line number plus offset (N+M or N-M) is probably a typo,\n // not something the user actually wanted. (NB: vim does allow this.)\n return parseInt(numberMatch[1], 10) - 1;\n }\n switch (inputStream.next()) {\n case '.':\n return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n case '$':\n return this.parseLineSpecOffset_(inputStream, cm.lastLine());\n case '\\'':\n var markName = inputStream.next();\n var markPos = getMarkPos(cm, cm.state.vim, markName);\n if (!markPos) throw new Error('Mark not set');\n return this.parseLineSpecOffset_(inputStream, markPos.line);\n case '-':\n case '+':\n inputStream.backUp(1);\n // Offset is relative to current line if not otherwise specified.\n return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n default:\n inputStream.backUp(1);\n return undefined;\n }\n }\n parseLineSpecOffset_(inputStream, line) {\n var offsetMatch = inputStream.match(/^([+-])?(\\d+)/);\n if (offsetMatch) {\n var offset = parseInt(offsetMatch[2], 10);\n if (offsetMatch[1] == \"-\") {\n line -= offset;\n } else {\n line += offset;\n }\n }\n return line;\n }\n parseCommandArgs_(inputStream, params, command) {\n if (inputStream.eol()) {\n return;\n }\n params.argString = inputStream.match(/.*/)[0];\n // Parse command-line arguments\n var delim = command.argDelimiter || /\\s+/;\n var args = trim(params.argString).split(delim);\n if (args.length && args[0]) {\n params.args = args;\n }\n }\n matchCommand_(commandName) {\n // Return the command in the command map that matches the shortest\n // prefix of the passed in command name. The match is guaranteed to be\n // unambiguous if the defaultExCommandMap's shortNames are set up\n // correctly. (see @code{defaultExCommandMap}).\n for (var i = commandName.length; i > 0; i--) {\n var prefix = commandName.substring(0, i);\n if (this.commandMap_[prefix]) {\n var command = this.commandMap_[prefix];\n if (command.name.indexOf(commandName) === 0) {\n return command;\n }\n }\n }\n return null;\n }\n buildCommandMap_() {\n this.commandMap_ = {};\n for (var i = 0; i < defaultExCommandMap.length; i++) {\n var command = defaultExCommandMap[i];\n var key = command.shortName || command.name;\n this.commandMap_[key] = command;\n }\n }\n /**@type {(lhs: string, rhs: string, ctx: string, noremap?: boolean) => void} */\n map(lhs, rhs, ctx, noremap) {\n if (lhs != ':' && lhs.charAt(0) == ':') {\n if (ctx) { throw Error('Mode not supported for ex mappings'); }\n var commandName = lhs.substring(1);\n if (rhs != ':' && rhs.charAt(0) == ':') {\n // Ex to Ex mapping\n this.commandMap_[commandName] = {\n name: commandName,\n type: 'exToEx',\n toInput: rhs.substring(1),\n user: true\n };\n } else {\n // Ex to key mapping\n this.commandMap_[commandName] = {\n name: commandName,\n type: 'exToKey',\n toKeys: rhs,\n user: true\n };\n }\n } else {\n // Key to key or ex mapping\n var mapping = {\n keys: lhs,\n type: 'keyToKey',\n toKeys: rhs,\n noremap: !!noremap\n };\n if (ctx) { mapping.context = ctx; }\n // @ts-ignore\n defaultKeymap.unshift(mapping);\n }\n }\n /**@type {(lhs: string, ctx: string) => boolean|void} */\n unmap(lhs, ctx) {\n if (lhs != ':' && lhs.charAt(0) == ':') {\n // Ex to Ex or Ex to key mapping\n if (ctx) { throw Error('Mode not supported for ex mappings'); }\n var commandName = lhs.substring(1);\n if (this.commandMap_[commandName] && this.commandMap_[commandName].user) {\n delete this.commandMap_[commandName];\n return true;\n }\n } else {\n // Key to Ex or key to key mapping\n var keys = lhs;\n for (var i = 0; i < defaultKeymap.length; i++) {\n if (keys == defaultKeymap[i].keys\n && defaultKeymap[i].context === ctx) {\n defaultKeymap.splice(i, 1);\n return true;\n }\n }\n }\n }\n }\n\n /** @typedef { import(\"./types\").ExParams} ExParams */\n var exCommands = {\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n colorscheme: function(cm, params) {\n if (!params.args || params.args.length < 1) {\n showConfirm(cm, cm.getOption('theme'));\n return;\n }\n cm.setOption('theme', params.args[0]);\n },\n map: function(cm, params, ctx, defaultOnly) {\n var mapArgs = params.args;\n if (!mapArgs || mapArgs.length < 2) {\n if (cm) {\n showConfirm(cm, 'Invalid mapping: ' + params.input);\n }\n return;\n }\n exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx, defaultOnly);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n imap: function(cm, params) { this.map(cm, params, 'insert'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n nmap: function(cm, params) { this.map(cm, params, 'normal'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n vmap: function(cm, params) { this.map(cm, params, 'visual'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n omap: function(cm, params) { this.map(cm, params, 'operatorPending'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n noremap: function(cm, params) { this.map(cm, params, undefined, true); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n inoremap: function(cm, params) { this.map(cm, params, 'insert', true); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n nnoremap: function(cm, params) { this.map(cm, params, 'normal', true); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n vnoremap: function(cm, params) { this.map(cm, params, 'visual', true); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n onoremap: function(cm, params) { this.map(cm, params, 'operatorPending', true); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params @arg {string} ctx*/\n unmap: function(cm, params, ctx) {\n var mapArgs = params.args;\n if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) {\n if (cm) {\n showConfirm(cm, 'No such mapping: ' + params.input);\n }\n }\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n mapclear: function(cm, params) { vimApi.mapclear(); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n imapclear: function(cm, params) { vimApi.mapclear('insert'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n nmapclear: function(cm, params) { vimApi.mapclear('normal'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n vmapclear: function(cm, params) { vimApi.mapclear('visual'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n omapclear: function(cm, params) { vimApi.mapclear('operatorPending'); },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n move: function(cm, params) {\n commandDispatcher.processCommand(cm, cm.state.vim, {\n keys: \"\",\n type: 'motion',\n motion: 'moveToLineOrEdgeOfDocument',\n motionArgs: { forward: false, explicitRepeat: true, linewise: true },\n repeatOverride: params.line+1\n });\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n set: function(cm, params) {\n var setArgs = params.args;\n // Options passed through to the setOption/getOption calls. May be passed in by the\n // local/global versions of the set command\n var setCfg = params.setCfg || {};\n if (!setArgs || setArgs.length < 1) {\n if (cm) {\n showConfirm(cm, 'Invalid mapping: ' + params.input);\n }\n return;\n }\n var expr = setArgs[0].split('=');\n var optionName = expr.shift() || \"\";\n /**@type {string|boolean|undefined} */\n var value = expr.length > 0 ? expr.join('=') : undefined;\n var forceGet = false;\n var forceToggle = false;\n\n if (optionName.charAt(optionName.length - 1) == '?') {\n // If post-fixed with ?, then the set is actually a get.\n if (value) { throw Error('Trailing characters: ' + params.argString); }\n optionName = optionName.substring(0, optionName.length - 1);\n forceGet = true;\n } else if (optionName.charAt(optionName.length - 1) == '!') {\n optionName = optionName.substring(0, optionName.length - 1);\n forceToggle = true;\n }\n if (value === undefined && optionName.substring(0, 2) == 'no') {\n // To set boolean options to false, the option name is prefixed with\n // 'no'.\n optionName = optionName.substring(2);\n value = false;\n }\n\n var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean';\n if (optionIsBoolean) {\n if (forceToggle) {\n value = !getOption(optionName, cm, setCfg);\n } else if (value == undefined) {\n // Calling set with a boolean option sets it to true.\n value = true;\n }\n }\n // If no value is provided, then we assume this is a get.\n if (!optionIsBoolean && value === undefined || forceGet) {\n var oldValue = getOption(optionName, cm, setCfg);\n if (oldValue instanceof Error) {\n showConfirm(cm, oldValue.message);\n } else if (oldValue === true || oldValue === false) {\n showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);\n } else {\n showConfirm(cm, ' ' + optionName + '=' + oldValue);\n }\n } else {\n var setOptionReturn = setOption(optionName, value, cm, setCfg);\n if (setOptionReturn instanceof Error) {\n showConfirm(cm, setOptionReturn.message);\n }\n }\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n setlocal: function (cm, params) {\n // setCfg is passed through to setOption\n params.setCfg = {scope: 'local'};\n this.set(cm, params);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n setglobal: function (cm, params) {\n // setCfg is passed through to setOption\n params.setCfg = {scope: 'global'};\n this.set(cm, params);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n registers: function(cm, params) {\n var regArgs = params.args;\n var registers = vimGlobalState.registerController.registers;\n var regInfo = '----------Registers----------\\n\\n';\n if (!regArgs) {\n for (var registerName in registers) {\n var text = registers[registerName].toString();\n if (text.length) {\n regInfo += '\"' + registerName + ' ' + text + '\\n';\n }\n }\n } else {\n var registerNames = regArgs.join('');\n for (var i = 0; i < registerNames.length; i++) {\n var registerName = registerNames.charAt(i);\n if (!vimGlobalState.registerController.isValidRegister(registerName)) {\n continue;\n }\n var register = registers[registerName] || new Register();\n regInfo += '\"' + registerName + ' ' + register.toString() + '\\n';\n }\n }\n showConfirm(cm, regInfo);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n sort: function(cm, params) {\n var reverse, ignoreCase, unique, number, pattern;\n function parseArgs() {\n if (params.argString) {\n var args = new CodeMirror.StringStream(params.argString);\n if (args.eat('!')) { reverse = true; }\n if (args.eol()) { return; }\n if (!args.eatSpace()) { return 'Invalid arguments'; }\n var opts = args.match(/([dinuox]+)?\\s*(\\/.+\\/)?\\s*/);\n if (!opts || !args.eol()) { return 'Invalid arguments'; }\n if (opts[1]) {\n ignoreCase = opts[1].indexOf('i') != -1;\n unique = opts[1].indexOf('u') != -1;\n var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1;\n var hex = opts[1].indexOf('x') != -1;\n var octal = opts[1].indexOf('o') != -1;\n if (Number(decimal) + Number(hex) + Number(octal) > 1) { return 'Invalid arguments'; }\n number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';\n }\n if (opts[2]) {\n pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : '');\n }\n }\n }\n var err = parseArgs();\n if (err) {\n showConfirm(cm, err + ': ' + params.argString);\n return;\n }\n var lineStart = params.line || cm.firstLine();\n var lineEnd = params.lineEnd || params.line || cm.lastLine();\n if (lineStart == lineEnd) { return; }\n var curStart = new Pos(lineStart, 0);\n var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd));\n var text = cm.getRange(curStart, curEnd).split('\\n');\n var numberRegex =\n (number == 'decimal') ? /(-?)([\\d]+)/ :\n (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :\n (number == 'octal') ? /([0-7]+)/ : null;\n var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : undefined;\n var numPart = [], textPart = [];\n if (number || pattern) {\n for (var i = 0; i < text.length; i++) {\n var matchPart = pattern ? text[i].match(pattern) : null;\n if (matchPart && matchPart[0] != '') {\n numPart.push(matchPart);\n } else if (numberRegex && numberRegex.exec(text[i])) {\n numPart.push(text[i]);\n } else {\n textPart.push(text[i]);\n }\n }\n } else {\n textPart = text;\n }\n /** @arg {string} a @arg {string} b */\n function compareFn(a, b) {\n if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); }\n var amatch = numberRegex && numberRegex.exec(a);\n var bmatch = numberRegex && numberRegex.exec(b);\n if (!amatch || !bmatch) { return a < b ? -1 : 1; }\n var anum = parseInt((amatch[1] + amatch[2]).toLowerCase(), radix);\n var bnum = parseInt((bmatch[1] + bmatch[2]).toLowerCase(), radix);\n return anum - bnum;\n }\n /** @arg {string[]} a @arg {string[]} b */\n function comparePatternFn(a, b) {\n if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); }\n return (a[0] < b[0]) ? -1 : 1;\n }\n // @ts-ignore\n numPart.sort(pattern ? comparePatternFn : compareFn);\n if (pattern) {\n for (var i = 0; i < numPart.length; i++) {\n // @ts-ignore\n numPart[i] = numPart[i].input;\n }\n } else if (!number) { textPart.sort(compareFn); }\n text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);\n if (unique) { // Remove duplicate lines\n var textOld = text;\n var lastLine;\n text = [];\n for (var i = 0; i < textOld.length; i++) {\n if (textOld[i] != lastLine) {\n text.push(textOld[i]);\n }\n lastLine = textOld[i];\n }\n }\n cm.replaceRange(text.join('\\n'), curStart, curEnd);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n vglobal: function(cm, params) {\n // global inspects params.commandName\n this.global(cm, params);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n normal: function(cm, params) {\n var argString = params.argString;\n if (argString && argString[0] == '!') {\n argString = argString.slice(1);\n noremap = true;\n }\n argString = argString.trimStart();\n if (!argString) {\n showConfirm(cm, 'Argument is required.');\n return;\n }\n var line = params.line;\n if (typeof line == 'number') {\n var lineEnd = isNaN(params.lineEnd) ? line : params.lineEnd;\n for (var i = line; i <= lineEnd; i++) {\n cm.setCursor(i, 0);\n doKeyToKey(cm, params.argString.trimStart());\n if (cm.state.vim.insertMode) {\n exitInsertMode(cm, true);\n }\n }\n } else {\n doKeyToKey(cm, params.argString.trimStart());\n if (cm.state.vim.insertMode) {\n exitInsertMode(cm, true);\n }\n }\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n global: function(cm, params) {\n // a global command is of the form\n // :[range]g/pattern/[cmd]\n // argString holds the string /pattern/[cmd]\n var argString = params.argString;\n if (!argString) {\n showConfirm(cm, 'Regular Expression missing from global');\n return;\n }\n var inverted = params.commandName[0] === 'v';\n if (argString[0] === '!' && params.commandName[0] === 'g') {\n inverted = true;\n argString = argString.slice(1);\n }\n // range is specified here\n var lineStart = (params.line !== undefined) ? params.line : cm.firstLine();\n var lineEnd = params.lineEnd || params.line || cm.lastLine();\n // get the tokens from argString\n var tokens = splitBySlash(argString);\n var regexPart = argString, cmd = \"\";\n if (tokens && tokens.length) {\n regexPart = tokens[0];\n cmd = tokens.slice(1, tokens.length).join('/');\n }\n if (regexPart) {\n // If regex part is empty, then use the previous query. Otherwise\n // use the regex part as the new query.\n try {\n updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n true /** smartCase */);\n } catch (e) {\n showConfirm(cm, 'Invalid regex: ' + regexPart);\n return;\n }\n }\n // now that we have the regexPart, search for regex matches in the\n // specified range of lines\n var query = getSearchState(cm).getQuery();\n /**@type {(string|import(\"./types\").LineHandle)[]}*/\n var matchedLines = [];\n for (var i = lineStart; i <= lineEnd; i++) {\n var line = cm.getLine(i);\n var matched = query.test(line);\n if (matched !== inverted) {\n matchedLines.push(cmd ? cm.getLineHandle(i) : line);\n }\n }\n // if there is no [cmd], just display the list of matched lines\n if (!cmd) {\n showConfirm(cm, matchedLines.join('\\n'));\n return;\n }\n var index = 0;\n var nextCommand = function() {\n if (index < matchedLines.length) {\n var lineHandle = matchedLines[index++];\n var lineNum = cm.getLineNumber(lineHandle);\n if (lineNum == null) {\n nextCommand();\n return;\n }\n var command = (lineNum + 1) + cmd;\n exCommandDispatcher.processCommand(cm, command, {\n callback: nextCommand\n });\n } else if (cm.releaseLineHandles) {\n cm.releaseLineHandles();\n }\n };\n nextCommand();\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n substitute: function(cm, params) {\n if (!cm.getSearchCursor) {\n throw new Error('Search feature not available. Requires searchcursor.js or ' +\n 'any other getSearchCursor implementation.');\n }\n var argString = params.argString;\n var tokens = argString ? splitBySeparator(argString, argString[0]) : [];\n var regexPart = '', replacePart = '', trailing, flagsPart, count;\n var confirm = false; // Whether to confirm each replace.\n var global = false; // True to replace all instances on a line, false to replace only 1.\n if (tokens && tokens.length) {\n regexPart = tokens[0];\n if (getOption('pcre') && regexPart !== '') {\n regexPart = new RegExp(regexPart).source; //normalize not escaped characters\n }\n replacePart = tokens[1];\n if (replacePart !== undefined) {\n if (getOption('pcre')) {\n replacePart = unescapeRegexReplace(replacePart.replace(/([^\\\\])&/g,\"$1$$&\"));\n } else {\n replacePart = translateRegexReplace(replacePart);\n }\n vimGlobalState.lastSubstituteReplacePart = replacePart;\n }\n trailing = tokens[2] ? tokens[2].split(' ') : [];\n } else {\n // either the argString is empty or its of the form ' hello/world'\n // actually splitBySlash returns a list of tokens\n // only if the string starts with a '/'\n if (argString && argString.length) {\n showConfirm(cm, 'Substitutions should be of the form ' +\n ':s/pattern/replace/');\n return;\n }\n }\n // After the 3rd slash, we can have flags followed by a space followed\n // by count.\n if (trailing) {\n flagsPart = trailing[0];\n count = parseInt(trailing[1]);\n if (flagsPart) {\n if (flagsPart.indexOf('c') != -1) {\n confirm = true;\n }\n if (flagsPart.indexOf('g') != -1) {\n global = true;\n }\n if (getOption('pcre')) {\n regexPart = regexPart + '/' + flagsPart;\n } else {\n regexPart = regexPart.replace(/\\//g, \"\\\\/\") + '/' + flagsPart;\n }\n }\n }\n if (regexPart) {\n // If regex part is empty, then use the previous query. Otherwise use\n // the regex part as the new query.\n try {\n updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n true /** smartCase */);\n } catch (e) {\n showConfirm(cm, 'Invalid regex: ' + regexPart);\n return;\n }\n }\n replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;\n if (replacePart === undefined) {\n showConfirm(cm, 'No previous substitute regular expression');\n return;\n }\n var state = getSearchState(cm);\n var query = state.getQuery();\n var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;\n var lineEnd = params.lineEnd || lineStart;\n if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) {\n lineEnd = Infinity;\n }\n if (count) {\n lineStart = lineEnd;\n lineEnd = lineStart + count - 1;\n }\n var startPos = clipCursorToContent(cm, new Pos(lineStart, 0));\n var cursor = cm.getSearchCursor(query, startPos);\n doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n startinsert: function(cm, params) {\n doKeyToKey(cm, params.argString == '!' ? 'A' : 'i', {});\n },\n redo: CodeMirror.commands.redo,\n undo: CodeMirror.commands.undo,\n /** @arg {CodeMirrorV} cm */\n write: function(cm) {\n if (CodeMirror.commands.save) {\n CodeMirror.commands.save(cm);\n } else if (cm.save) {\n // Saves to text area if no save command is defined and cm.save() is available.\n cm.save();\n }\n },\n /** @arg {CodeMirrorV} cm */\n nohlsearch: function(cm) {\n clearSearchHighlight(cm);\n },\n /** @arg {CodeMirrorV} cm */\n yank: function (cm) {\n var cur = copyCursor(cm.getCursor());\n var line = cur.line;\n var lineText = cm.getLine(line);\n vimGlobalState.registerController.pushText(\n '0', 'yank', lineText, true, true);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n delete: function(cm, params) {\n var line = params.selectionLine;\n var lineEnd = isNaN(params.selectionLineEnd) ? line : params.selectionLineEnd;\n operators.delete(cm, {linewise: true}, [\n { anchor: new Pos(line, 0),\n head: new Pos(lineEnd + 1, 0) }\n ]);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n join: function(cm, params) {\n var line = params.selectionLine;\n var lineEnd = isNaN(params.selectionLineEnd) ? line : params.selectionLineEnd;\n cm.setCursor(new Pos(line, 0));\n actions.joinLines(cm, {repeat: lineEnd - line}, cm.state.vim);\n },\n /** @arg {CodeMirrorV} cm @arg {ExParams} params*/\n delmarks: function(cm, params) {\n if (!params.argString || !trim(params.argString)) {\n showConfirm(cm, 'Argument required');\n return;\n }\n\n var state = cm.state.vim;\n var stream = new CodeMirror.StringStream(trim(params.argString));\n while (!stream.eol()) {\n stream.eatSpace();\n\n // Record the streams position at the beginning of the loop for use\n // in error messages.\n var count = stream.pos;\n\n if (!stream.match(/[a-zA-Z]/, false)) {\n showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n return;\n }\n\n var sym = stream.next();\n // Check if this symbol is part of a range\n if (stream.match('-', true)) {\n // This symbol is part of a range.\n\n // The range must terminate at an alphabetic character.\n if (!stream.match(/[a-zA-Z]/, false)) {\n showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n return;\n }\n\n var startMark = sym;\n var finishMark = stream.next();\n // The range must terminate at an alphabetic character which\n // shares the same case as the start of the range.\n if (startMark && finishMark && isLowerCase(startMark) == isLowerCase(finishMark)) {\n var start = startMark.charCodeAt(0);\n var finish = finishMark.charCodeAt(0);\n if (start >= finish) {\n showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n return;\n }\n\n // Because marks are always ASCII values, and we have\n // determined that they are the same case, we can use\n // their char codes to iterate through the defined range.\n for (var j = 0; j <= finish - start; j++) {\n var mark = String.fromCharCode(start + j);\n delete state.marks[mark];\n }\n } else {\n showConfirm(cm, 'Invalid argument: ' + startMark + '-');\n return;\n }\n } else if (sym) {\n // This symbol is a valid mark, and is not part of a range.\n delete state.marks[sym];\n }\n }\n }\n };\n\n var exCommandDispatcher = new ExCommandDispatcher();\n\n/**\n * @arg {CodeMirrorV} cm CodeMirror instance we are in.\n * @arg {boolean} confirm Whether to confirm each replace.\n * @arg {boolean} global \n * @arg {number} lineStart Line to start replacing from.\n * @arg {number} lineEnd Line to stop replacing at.\n * @arg {RegExp} query Query for performing matches with.\n * @arg {string} replaceWith Text to replace matches with. May contain $1,\n * $2, etc for replacing captured groups using JavaScript replace.\n * @arg {function} [callback] A callback for when the replace is done.\n */\n function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query,\n replaceWith, callback) {\n // Set up all the functions.\n cm.state.vim.exMode = true;\n var done = false;\n \n /** @type {Pos}*/ var lastPos;\n /** @type {number}*/ var modifiedLineNumber;\n /** @type {boolean}*/var joined;\n function replaceAll() {\n cm.operation(function() {\n while (!done) {\n replace();\n next();\n }\n stop();\n });\n }\n function replace() {\n var text = cm.getRange(searchCursor.from(), searchCursor.to());\n var newText = text.replace(query, replaceWith);\n var unmodifiedLineNumber = searchCursor.to().line;\n searchCursor.replace(newText);\n modifiedLineNumber = searchCursor.to().line;\n lineEnd += modifiedLineNumber - unmodifiedLineNumber;\n joined = modifiedLineNumber < unmodifiedLineNumber;\n }\n function findNextValidMatch() {\n var lastMatchTo = lastPos && copyCursor(searchCursor.to());\n var match = searchCursor.findNext();\n if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) {\n match = searchCursor.findNext();\n }\n return match;\n }\n function next() {\n // The below only loops to skip over multiple occurrences on the same\n // line when 'global' is not true.\n while(findNextValidMatch() &&\n isInRange(searchCursor.from(), lineStart, lineEnd)) {\n if (!global && searchCursor.from().line == modifiedLineNumber && !joined) {\n continue;\n }\n cm.scrollIntoView(searchCursor.from(), 30);\n cm.setSelection(searchCursor.from(), searchCursor.to());\n lastPos = searchCursor.from();\n done = false;\n return;\n }\n done = true;\n }\n /** @arg {(() => void) | undefined} [close] */\n function stop(close) {\n if (close) { close(); }\n cm.focus();\n if (lastPos) {\n cm.setCursor(lastPos);\n var vim = cm.state.vim;\n vim.exMode = false;\n vim.lastHPos = vim.lastHSPos = lastPos.ch;\n }\n if (callback) { callback(); }\n }\n /** @arg {KeyboardEvent} e @arg {any} _value @arg {any} close */\n function onPromptKeyDown(e, _value, close) {\n // Swallow all keys.\n CodeMirror.e_stop(e);\n var keyName = vimKeyFromEvent(e);\n switch (keyName) {\n case 'y':\n replace(); next(); break;\n case 'n':\n next(); break;\n case 'a':\n // replaceAll contains a call to close of its own. We don't want it\n // to fire too early or multiple times.\n var savedCallback = callback;\n callback = undefined;\n cm.operation(replaceAll);\n callback = savedCallback;\n break;\n case 'l':\n replace();\n // fall through and exit.\n case 'q':\n case '<Esc>':\n case '<C-c>':\n case '<C-[>':\n stop(close);\n break;\n }\n if (done) { stop(close); }\n return true;\n }\n\n // Actually do replace.\n next();\n if (done) {\n showConfirm(cm, 'No matches for ' + query.source);\n return;\n }\n if (!confirm) {\n replaceAll();\n if (callback) { callback(); }\n return;\n }\n showPrompt(cm, {\n prefix: dom('span', 'replace with ', dom('strong', replaceWith), ' (y/n/a/q/l)'),\n onKeyDown: onPromptKeyDown\n });\n }\n\n /** @arg {CodeMirrorV} cm @arg {boolean} [keepCursor] */\n function exitInsertMode(cm, keepCursor) {\n var vim = cm.state.vim;\n var macroModeState = vimGlobalState.macroModeState;\n var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');\n var isPlaying = macroModeState.isPlaying;\n var lastChange = macroModeState.lastInsertModeChanges;\n if (!isPlaying) {\n cm.off('change', onChange);\n if (vim.insertEnd) vim.insertEnd.clear();\n vim.insertEnd = undefined;\n CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n }\n if (!isPlaying && vim.insertModeRepeat > 1) {\n // Perform insert mode repeat for commands like 3,a and 3,o.\n repeatLastEdit(cm, vim, vim.insertModeRepeat - 1,\n true /** repeatForInsert */);\n // @ts-ignore\n vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;\n }\n delete vim.insertModeRepeat;\n vim.insertMode = false;\n if (!keepCursor) {\n cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);\n }\n cm.setOption('keyMap', 'vim');\n cm.setOption('disableInput', true);\n cm.toggleOverwrite(false); // exit replace mode if we were in it.\n // update the \". register before exiting insert mode\n insertModeChangeRegister.setText(lastChange.changes.join(''));\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n if (macroModeState.isRecording) {\n logInsertModeChange(macroModeState);\n }\n }\n\n /** @arg {vimKey} command*/\n function _mapCommand(command) {\n defaultKeymap.unshift(command);\n }\n\n /** \n * @arg {string} keys\n * @arg {string} type \n * @arg {string} name\n * @arg {any} args\n * @arg {{ [x: string]: any; }} extra \n **/\n function mapCommand(keys, type, name, args, extra) {\n /**@type{any} */\n var command = {keys: keys, type: type};\n command[type] = name;\n command[type + \"Args\"] = args;\n for (var key in extra)\n command[key] = extra[key];\n _mapCommand(command);\n }\n\n // The timeout in milliseconds for the two-character ESC keymap should be\n // adjusted according to your typing speed to prevent false positives.\n defineOption('insertModeEscKeysTimeout', 200, 'number');\n\n\n /**\n * @arg {CodeMirrorV} cm \n * @arg {vimState} vim \n * @arg {MacroModeState} macroModeState \n * @arg {string} registerName\n */\n function executeMacroRegister(cm, vim, macroModeState, registerName) {\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (registerName == ':') {\n // Read-only register containing last Ex command.\n if (register.keyBuffer[0]) {\n exCommandDispatcher.processCommand(cm, register.keyBuffer[0]);\n }\n macroModeState.isPlaying = false;\n return;\n }\n var keyBuffer = register.keyBuffer;\n var imc = 0;\n macroModeState.isPlaying = true;\n macroModeState.replaySearchQueries = register.searchQueries.slice(0);\n for (var i = 0; i < keyBuffer.length; i++) {\n var text = keyBuffer[i];\n var match, key;\n var keyRe = /<(?:[CSMA]-)*\\w+>|./gi;\n while ((match = keyRe.exec(text))) {\n // Pull off one command key, which is either a single character\n // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n key = match[0];\n vimApi.handleKey(cm, key, 'macro');\n if (vim.insertMode) {\n var changes = register.insertModeChanges[imc++].changes;\n vimGlobalState.macroModeState.lastInsertModeChanges.changes = changes;\n repeatInsertModeChanges(cm, changes, 1);\n exitInsertMode(cm);\n }\n }\n }\n macroModeState.isPlaying = false;\n }\n\n /** @arg {MacroModeState} macroModeState @arg {any} key */\n function logKey(macroModeState, key) {\n if (macroModeState.isPlaying) { return; }\n var registerName = macroModeState.latestRegister;\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (register) {\n register.pushText(key);\n }\n }\n\n /** @arg {MacroModeState} macroModeState */\n function logInsertModeChange(macroModeState) {\n if (macroModeState.isPlaying) { return; }\n var registerName = macroModeState.latestRegister;\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (register && register.pushInsertModeChanges) {\n register.pushInsertModeChanges(macroModeState.lastInsertModeChanges);\n }\n }\n\n /** @arg {MacroModeState} macroModeState @arg {string} query */\n function logSearchQuery(macroModeState, query) {\n if (macroModeState.isPlaying) { return; }\n var registerName = macroModeState.latestRegister;\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (register && register.pushSearchQuery) {\n register.pushSearchQuery(query);\n }\n }\n\n /**\n * Listens for changes made in insert mode.\n * Should only be active in insert mode.\n * @arg {CodeMirror} cm\n * @arg {{ origin: string | undefined; text: any[]; next: any; }} changeObj\n */\n function onChange(cm, changeObj) {\n var macroModeState = vimGlobalState.macroModeState;\n var lastChange = macroModeState.lastInsertModeChanges;\n if (!macroModeState.isPlaying) {\n var vim = cm.state.vim;\n while(changeObj) {\n lastChange.expectCursorActivityForChange = true;\n // @ts-ignore\n if (lastChange.ignoreCount > 1) {\n // @ts-ignore\n lastChange.ignoreCount--;\n } else if (changeObj.origin == '+input' || changeObj.origin == 'paste'\n || changeObj.origin === undefined /* only in testing */) {\n var selectionCount = cm.listSelections().length;\n if (selectionCount > 1)\n lastChange.ignoreCount = selectionCount;\n var text = changeObj.text.join('\\n');\n if (lastChange.maybeReset) {\n lastChange.changes = [];\n lastChange.maybeReset = false;\n }\n if (text) {\n if (cm.state.overwrite && !/\\n/.test(text)) {\n lastChange.changes.push([text]);\n } else {\n if (text.length > 1) {\n var insertEnd = vim && vim.insertEnd && vim.insertEnd.find();\n var cursor = cm.getCursor();\n if (insertEnd && insertEnd.line == cursor.line) {\n var offset = insertEnd.ch - cursor.ch;\n if (offset > 0 && offset < text.length) {\n lastChange.changes.push([text, offset]);\n text = '';\n }\n }\n }\n if (text) lastChange.changes.push(text);\n }\n }\n }\n // Change objects may be chained with next.\n changeObj = changeObj.next;\n }\n }\n }\n\n /**\n * Listens for any kind of cursor activity on CodeMirror.\n * @arg {CodeMirrorV} cm\n */\n function onCursorActivity(cm) {\n var vim = cm.state.vim;\n if (vim.insertMode) {\n // Tracking cursor activity in insert mode (for macro support).\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isPlaying) { return; }\n var lastChange = macroModeState.lastInsertModeChanges;\n if (lastChange.expectCursorActivityForChange) {\n lastChange.expectCursorActivityForChange = false;\n } else {\n // Cursor moved outside the context of an edit. Reset the change.\n lastChange.maybeReset = true;\n if (vim.insertEnd) vim.insertEnd.clear();\n vim.insertEnd = cm.setBookmark(cm.getCursor(), {insertLeft: true});\n }\n } else if (!cm.curOp?.isVimOp) {\n handleExternalSelection(cm, vim);\n }\n }\n /** @arg {CodeMirrorV} cm @arg {vimState} vim */\n function handleExternalSelection(cm, vim) {\n var anchor = cm.getCursor('anchor');\n var head = cm.getCursor('head');\n // Enter or exit visual mode to match mouse selection.\n if (vim.visualMode && !cm.somethingSelected()) {\n exitVisualMode(cm, false);\n } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) {\n vim.visualMode = true;\n vim.visualLine = false;\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n }\n if (vim.visualMode) {\n // Bind CodeMirror selection model to vim selection model.\n // Mouse selections are considered visual characterwise.\n var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n head = offsetCursor(head, 0, headOffset);\n anchor = offsetCursor(anchor, 0, anchorOffset);\n vim.sel = {\n anchor: anchor,\n head: head\n };\n updateMark(cm, vim, '<', cursorMin(head, anchor));\n updateMark(cm, vim, '>', cursorMax(head, anchor));\n } else if (!vim.insertMode) {\n // Reset lastHPos if selection was modified by something outside of vim mode e.g. by mouse.\n vim.lastHPos = cm.getCursor().ch;\n }\n }\n\n /**\n * Wrapper for special keys pressed in insert mode\n * @arg {string} keyName\n */\n function InsertModeKey(keyName, e) {\n this.keyName = keyName;\n this.key = e.key;\n this.ctrlKey = e.ctrlKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n this.shiftKey = e.shiftKey;\n }\n\n /**\n * Handles raw key down events from the text area.\n * - Should only be active in insert mode.\n * - For recording deletes in insert mode.\n * @arg {KeyboardEvent} e\n */\n function onKeyEventTargetKeyDown(e) {\n var macroModeState = vimGlobalState.macroModeState;\n var lastChange = macroModeState.lastInsertModeChanges;\n var keyName = CodeMirror.keyName ? CodeMirror.keyName(e) : e.key;\n if (!keyName) { return; }\n \n if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) {\n if (lastChange.maybeReset) {\n lastChange.changes = [];\n lastChange.maybeReset = false;\n }\n lastChange.changes.push(new InsertModeKey(keyName, e));\n }\n }\n\n /**\n * Repeats the last edit, which includes exactly 1 command and at most 1\n * insert. Operator and motion commands are read from lastEditInputState,\n * while action commands are read from lastEditActionCommand.\n *\n * If repeatForInsert is true, then the function was called by\n * exitInsertMode to repeat the insert mode changes the user just made. The\n * corresponding enterInsertMode call was made with a count.\n * @arg {CodeMirrorV} cm \n * @arg {vimState} vim \n * @arg {number} repeat \n * @arg {boolean} repeatForInsert\n */\n function repeatLastEdit(cm, vim, repeat, repeatForInsert) {\n var macroModeState = vimGlobalState.macroModeState;\n macroModeState.isPlaying = true;\n var lastAction = vim.lastEditActionCommand;\n var cachedInputState = vim.inputState;\n function repeatCommand() {\n if (lastAction) {\n commandDispatcher.processAction(cm, vim, lastAction);\n } else {\n commandDispatcher.evalInput(cm, vim);\n }\n }\n /** @arg {number} repeat */\n function repeatInsert(repeat) {\n if (macroModeState.lastInsertModeChanges.changes.length > 0) {\n // For some reason, repeat cw in desktop VIM does not repeat\n // insert mode changes. Will conform to that behavior.\n repeat = !vim.lastEditActionCommand ? 1 : repeat;\n var changeObject = macroModeState.lastInsertModeChanges;\n repeatInsertModeChanges(cm, changeObject.changes, repeat);\n }\n }\n // @ts-ignore\n vim.inputState = vim.lastEditInputState;\n if (lastAction && lastAction.interlaceInsertRepeat) {\n // o and O repeat have to be interlaced with insert repeats so that the\n // insertions appear on separate lines instead of the last line.\n for (var i = 0; i < repeat; i++) {\n repeatCommand();\n repeatInsert(1);\n }\n } else {\n if (!repeatForInsert) {\n // Hack to get the cursor to end up at the right place. If I is\n // repeated in insert mode repeat, cursor will be 1 insert\n // change set left of where it should be.\n repeatCommand();\n }\n repeatInsert(repeat);\n }\n vim.inputState = cachedInputState;\n if (vim.insertMode && !repeatForInsert) {\n // Don't exit insert mode twice. If repeatForInsert is set, then we\n // were called by an exitInsertMode call lower on the stack.\n exitInsertMode(cm);\n }\n macroModeState.isPlaying = false;\n }\n /**@arg {CodeMirrorV} cm, @arg {string} key */\n function sendCmKey(cm, key) {\n CodeMirror.lookupKey(key, 'vim-insert', function keyHandler(binding) {\n if (typeof binding == 'string') {\n CodeMirror.commands[binding](cm);\n } else {\n binding(cm);\n }\n return true;\n });\n }\n function repeatInsertModeChanges(cm, changes, repeat) {\n var head = cm.getCursor('head');\n var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock;\n if (visualBlock) {\n // Set up block selection again for repeating the changes.\n selectForInsert(cm, head, visualBlock + 1);\n repeat = cm.listSelections().length;\n cm.setCursor(head);\n }\n for (var i = 0; i < repeat; i++) {\n if (visualBlock) {\n cm.setCursor(offsetCursor(head, i, 0));\n }\n for (var j = 0; j < changes.length; j++) {\n var change = changes[j];\n if (change instanceof InsertModeKey) {\n sendCmKey(cm, change.keyName);\n } else if (typeof change == \"string\") {\n cm.replaceSelection(change);\n } else {\n var start = cm.getCursor();\n var end = offsetCursor(start, 0, change[0].length - (change[1] || 0));\n cm.replaceRange(change[0], start, change[1] ? start: end);\n cm.setCursor(end);\n }\n }\n }\n if (visualBlock) {\n cm.setCursor(offsetCursor(head, 0, 1));\n }\n }\n\n // multiselect support\n /** @arg {vimState} state */\n function cloneVimState(state) {\n var n = new state.constructor();\n Object.keys(state).forEach(function(key) {\n if (key == \"insertEnd\") return;\n var o = state[key];\n if (Array.isArray(o))\n o = o.slice();\n else if (o && typeof o == \"object\" && o.constructor != Object)\n o = cloneVimState(o);\n n[key] = o;\n });\n if (state.sel) {\n n.sel = {\n head: state.sel.head && copyCursor(state.sel.head),\n anchor: state.sel.anchor && copyCursor(state.sel.anchor)\n };\n }\n return n;\n }\n /** @arg {CodeMirror} cm_ @arg {string} key @arg {string} origin */\n function multiSelectHandleKey(cm_, key, origin) {\n var vim = maybeInitVimState(cm_);\n var cm = /**@type {CodeMirrorV}*/(cm_);\n /** @type {boolean | undefined} */\n var isHandled = false;\n var vim = vimApi.maybeInitVimState_(cm);\n var visualBlock = vim.visualBlock || vim.wasInVisualBlock;\n\n var wasMultiselect = cm.isInMultiSelectMode();\n if (vim.wasInVisualBlock && !wasMultiselect) {\n vim.wasInVisualBlock = false;\n } else if (wasMultiselect && vim.visualBlock) {\n vim.wasInVisualBlock = true;\n }\n\n if (key == '<Esc>' && !vim.insertMode && !vim.visualMode && wasMultiselect && vim.status == \"<Esc>\") {\n // allow editor to exit multiselect\n clearInputState(cm);\n // @ts-ignore\n } else if (visualBlock || !wasMultiselect || cm.inVirtualSelectionMode) {\n isHandled = vimApi.handleKey(cm, key, origin);\n } else {\n var old = cloneVimState(vim);\n var changeQueueList = vim.inputState.changeQueueList || [];\n\n cm.operation(function() {\n if (cm.curOp)\n cm.curOp.isVimOp = true;\n var index = 0;\n cm.forEachSelection(function() {\n cm.state.vim.inputState.changeQueue = changeQueueList[index];\n var head = cm.getCursor(\"head\");\n var anchor = cm.getCursor(\"anchor\");\n var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n head = offsetCursor(head, 0, headOffset);\n anchor = offsetCursor(anchor, 0, anchorOffset);\n cm.state.vim.sel.head = head;\n cm.state.vim.sel.anchor = anchor;\n\n isHandled = vimApi.handleKey(cm, key, origin);\n if (cm.virtualSelection) {\n changeQueueList[index] = cm.state.vim.inputState.changeQueue;\n cm.state.vim = cloneVimState(old);\n }\n index++;\n });\n if (cm.curOp?.cursorActivity && !isHandled)\n cm.curOp.cursorActivity = false;\n cm.state.vim = vim;\n vim.inputState.changeQueueList = changeQueueList;\n vim.inputState.changeQueue = null;\n }, true);\n }\n // some commands may bring visualMode and selection out of sync\n if (isHandled && !vim.visualMode && !vim.insert && vim.visualMode != cm.somethingSelected()) {\n handleExternalSelection(cm, vim);\n }\n return isHandled;\n }\n resetVimGlobalState();\n\n return vimApi;\n}\n\nfunction indexFromPos(doc, pos) {\n var ch = pos.ch;\n var lineNumber = pos.line + 1;\n if (lineNumber < 1) {\n lineNumber = 1;\n ch = 0;\n }\n if (lineNumber > doc.lines) {\n lineNumber = doc.lines;\n ch = Number.MAX_VALUE;\n }\n var line = doc.line(lineNumber);\n return Math.min(line.from + Math.max(0, ch), line.to);\n}\nfunction posFromIndex(doc, offset) {\n let line = doc.lineAt(offset);\n return { line: line.number - 1, ch: offset - line.from };\n}\nclass Pos {\n constructor(line, ch) {\n this.line = line;\n this.ch = ch;\n }\n}\nfunction on(emitter, type, f) {\n if (emitter.addEventListener) {\n emitter.addEventListener(type, f, false);\n }\n else {\n var map = emitter._handlers || (emitter._handlers = {});\n map[type] = (map[type] || []).concat(f);\n }\n}\nfunction off(emitter, type, f) {\n if (emitter.removeEventListener) {\n emitter.removeEventListener(type, f, false);\n }\n else {\n var map = emitter._handlers, arr = map && map[type];\n if (arr) {\n var index = arr.indexOf(f);\n if (index > -1) {\n map[type] = arr.slice(0, index).concat(arr.slice(index + 1));\n }\n }\n }\n}\nfunction signal(emitter, type, ...args) {\n var _a;\n var handlers = (_a = emitter._handlers) === null || _a === void 0 ? void 0 : _a[type];\n if (!handlers)\n return;\n for (var i = 0; i < handlers.length; ++i) {\n handlers[i](...args);\n }\n}\nfunction signalTo(handlers, ...args) {\n if (!handlers)\n return;\n for (var i = 0; i < handlers.length; ++i) {\n handlers[i](...args);\n }\n}\nlet wordChar;\ntry {\n wordChar = /*@__PURE__*/new RegExp(\"[\\\\w\\\\p{Alphabetic}\\\\p{Number}_]\", \"u\");\n}\ncatch (_) {\n wordChar = /[\\w]/;\n}\n// workaround for missing api for merging transactions\nfunction dispatchChange(cm, transaction) {\n var view = cm.cm6;\n if (view.state.readOnly)\n return;\n var type = \"input.type.compose\";\n if (cm.curOp) {\n if (!cm.curOp.lastChange)\n type = \"input.type.compose.start\";\n }\n if (transaction.annotations) {\n try {\n transaction.annotations.some(function (note) {\n if (note.value == \"input\")\n note.value = type;\n });\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n transaction.userEvent = type;\n }\n return view.dispatch(transaction);\n}\nfunction runHistoryCommand(cm, revert) {\n var _a;\n if (cm.curOp) {\n cm.curOp.$changeStart = undefined;\n }\n (revert ? undo : redo)(cm.cm6);\n let changeStartIndex = (_a = cm.curOp) === null || _a === void 0 ? void 0 : _a.$changeStart;\n // vim mode expects the changed text to be either selected or cursor placed at the start\n if (changeStartIndex != null) {\n cm.cm6.dispatch({ selection: { anchor: changeStartIndex } });\n }\n}\nvar keys = {};\n/*@__PURE__*/\"Left|Right|Up|Down|Backspace|Delete\".split(\"|\").forEach(key => {\n keys[key] = (cm) => runScopeHandlers(cm.cm6, { key: key }, \"editor\");\n});\nclass CodeMirror {\n constructor(cm6) {\n this.state = {};\n this.marks = Object.create(null);\n this.$mid = 0; // marker id counter\n this.options = {};\n this._handlers = {};\n this.$lastChangeEndOffset = 0;\n this.virtualSelection = null;\n this.cm6 = cm6;\n this.onChange = this.onChange.bind(this);\n this.onSelectionChange = this.onSelectionChange.bind(this);\n }\n // --------------------------\n openDialog(template, callback, options) {\n return openDialog(this, template, callback, options);\n }\n ;\n openNotification(template, options) {\n return openNotification(this, template, options);\n }\n ;\n ;\n on(type, f) { on(this, type, f); }\n off(type, f) { off(this, type, f); }\n signal(type, e, handlers) { signal(this, type, e, handlers); }\n indexFromPos(pos) {\n return indexFromPos(this.cm6.state.doc, pos);\n }\n ;\n posFromIndex(offset) {\n return posFromIndex(this.cm6.state.doc, offset);\n }\n ;\n foldCode(pos) {\n let view = this.cm6;\n let ranges = view.state.selection.ranges;\n let doc = this.cm6.state.doc;\n let index = indexFromPos(doc, pos);\n let tmpRanges = EditorSelection.create([EditorSelection.range(index, index)], 0).ranges;\n view.state.selection.ranges = tmpRanges;\n foldCode(view);\n view.state.selection.ranges = ranges;\n }\n firstLine() { return 0; }\n ;\n lastLine() { return this.cm6.state.doc.lines - 1; }\n ;\n lineCount() { return this.cm6.state.doc.lines; }\n ;\n setCursor(line, ch) {\n if (typeof line === 'object') {\n ch = line.ch;\n line = line.line;\n }\n var offset = indexFromPos(this.cm6.state.doc, { line, ch: ch || 0 });\n this.cm6.dispatch({ selection: { anchor: offset } }, { scrollIntoView: !this.curOp });\n if (this.curOp && !this.curOp.isVimOp)\n this.onBeforeEndOperation();\n }\n ;\n getCursor(p) {\n var sel = this.cm6.state.selection.main;\n var offset = p == \"head\" || !p\n ? sel.head\n : p == \"anchor\"\n ? sel.anchor\n : p == \"start\"\n ? sel.from\n : p == \"end\"\n ? sel.to\n : null;\n if (offset == null)\n throw new Error(\"Invalid cursor type\");\n return this.posFromIndex(offset);\n }\n ;\n listSelections() {\n var doc = this.cm6.state.doc;\n return this.cm6.state.selection.ranges.map(r => {\n return {\n anchor: posFromIndex(doc, r.anchor),\n head: posFromIndex(doc, r.head),\n };\n });\n }\n ;\n setSelections(p, primIndex) {\n var doc = this.cm6.state.doc;\n var ranges = p.map(x => {\n var head = indexFromPos(doc, x.head);\n var anchor = indexFromPos(doc, x.anchor);\n // workaround for codemirror bug, see https://github.com/replit/codemirror-vim/issues/169\n if (head == anchor)\n return EditorSelection.cursor(head, 1);\n return EditorSelection.range(anchor, head);\n });\n this.cm6.dispatch({\n selection: EditorSelection.create(ranges, primIndex)\n });\n }\n ;\n setSelection(anchor, head, options) {\n this.setSelections([{ anchor, head }], 0);\n if (options && options.origin == '*mouse') {\n this.onBeforeEndOperation();\n }\n }\n ;\n getLine(row) {\n var doc = this.cm6.state.doc;\n if (row < 0 || row >= doc.lines)\n return \"\";\n return this.cm6.state.doc.line(row + 1).text;\n }\n ;\n getLineHandle(row) {\n if (!this.$lineHandleChanges)\n this.$lineHandleChanges = [];\n return { row: row, index: this.indexFromPos(new Pos(row, 0)) };\n }\n getLineNumber(handle) {\n var updates = this.$lineHandleChanges;\n if (!updates)\n return null;\n var offset = handle.index;\n for (var i = 0; i < updates.length; i++) {\n offset = updates[i].changes.mapPos(offset, 1, MapMode.TrackAfter);\n if (offset == null)\n return null;\n }\n var pos = this.posFromIndex(offset);\n return pos.ch == 0 ? pos.line : null;\n }\n releaseLineHandles() {\n this.$lineHandleChanges = undefined;\n }\n getRange(s, e) {\n var doc = this.cm6.state.doc;\n return this.cm6.state.sliceDoc(indexFromPos(doc, s), indexFromPos(doc, e));\n }\n ;\n replaceRange(text, s, e, source) {\n if (!e)\n e = s;\n var doc = this.cm6.state.doc;\n var from = indexFromPos(doc, s);\n var to = indexFromPos(doc, e);\n dispatchChange(this, { changes: { from, to, insert: text } });\n }\n ;\n replaceSelection(text) {\n dispatchChange(this, this.cm6.state.replaceSelection(text));\n }\n ;\n replaceSelections(replacements) {\n var ranges = this.cm6.state.selection.ranges;\n var changes = ranges.map((r, i) => {\n return { from: r.from, to: r.to, insert: replacements[i] || \"\" };\n });\n dispatchChange(this, { changes });\n }\n ;\n getSelection() {\n return this.getSelections().join(\"\\n\");\n }\n ;\n getSelections() {\n var cm = this.cm6;\n return cm.state.selection.ranges.map(r => cm.state.sliceDoc(r.from, r.to));\n }\n ;\n somethingSelected() {\n return this.cm6.state.selection.ranges.some(r => !r.empty);\n }\n ;\n getInputField() {\n return this.cm6.contentDOM;\n }\n ;\n clipPos(p) {\n var doc = this.cm6.state.doc;\n var ch = p.ch;\n var lineNumber = p.line + 1;\n if (lineNumber < 1) {\n lineNumber = 1;\n ch = 0;\n }\n if (lineNumber > doc.lines) {\n lineNumber = doc.lines;\n ch = Number.MAX_VALUE;\n }\n var line = doc.line(lineNumber);\n ch = Math.min(Math.max(0, ch), line.to - line.from);\n return new Pos(lineNumber - 1, ch);\n }\n ;\n getValue() {\n return this.cm6.state.doc.toString();\n }\n ;\n setValue(text) {\n var cm = this.cm6;\n return cm.dispatch({\n changes: { from: 0, to: cm.state.doc.length, insert: text },\n selection: EditorSelection.range(0, 0)\n });\n }\n ;\n focus() {\n return this.cm6.focus();\n }\n ;\n blur() {\n return this.cm6.contentDOM.blur();\n }\n ;\n defaultTextHeight() {\n return this.cm6.defaultLineHeight;\n }\n ;\n findMatchingBracket(pos, _options) {\n var state = this.cm6.state;\n var offset = indexFromPos(state.doc, pos);\n var m = matchBrackets(state, offset + 1, -1);\n if (m && m.end) {\n return { to: posFromIndex(state.doc, m.end.from) };\n }\n m = matchBrackets(state, offset, 1);\n if (m && m.end) {\n return { to: posFromIndex(state.doc, m.end.from) };\n }\n return { to: undefined };\n }\n ;\n scanForBracket(pos, dir, style, config) {\n return scanForBracket(this, pos, dir, style, config);\n }\n ;\n indentLine(line, more) {\n // todo how to indent only one line instead of selection\n if (more)\n this.indentMore();\n else\n this.indentLess();\n }\n ;\n indentMore() {\n indentMore(this.cm6);\n }\n ;\n indentLess() {\n indentLess(this.cm6);\n }\n ;\n execCommand(name) {\n if (name == \"indentAuto\")\n CodeMirror.commands.indentAuto(this);\n else if (name == \"goLineLeft\")\n cursorLineBoundaryBackward(this.cm6);\n else if (name == \"goLineRight\") {\n cursorLineBoundaryForward(this.cm6);\n let state = this.cm6.state;\n let cur = state.selection.main.head;\n if (cur < state.doc.length && state.sliceDoc(cur, cur + 1) !== \"\\n\") {\n cursorCharBackward(this.cm6);\n }\n }\n else\n console.log(name + \" is not implemented\");\n }\n ;\n setBookmark(cursor, options) {\n var assoc = (options === null || options === void 0 ? void 0 : options.insertLeft) ? 1 : -1;\n var offset = this.indexFromPos(cursor);\n var bm = new Marker(this, offset, assoc);\n return bm;\n }\n ;\n addOverlay({ query }) {\n let cm6Query = new SearchQuery({\n regexp: true,\n search: query.source,\n caseSensitive: !/i/.test(query.flags),\n });\n if (cm6Query.valid) {\n cm6Query.forVim = true;\n this.cm6Query = cm6Query;\n let effect = setSearchQuery.of(cm6Query);\n this.cm6.dispatch({ effects: effect });\n return cm6Query;\n }\n }\n ;\n removeOverlay(overlay) {\n if (!this.cm6Query)\n return;\n this.cm6Query.forVim = false;\n let effect = setSearchQuery.of(this.cm6Query);\n this.cm6.dispatch({ effects: effect });\n }\n ;\n getSearchCursor(query, pos) {\n var cm = this;\n var last = null;\n var lastCM5Result = null;\n if (pos.ch == undefined)\n pos.ch = Number.MAX_VALUE;\n var firstOffset = indexFromPos(cm.cm6.state.doc, pos);\n var source = query.source.replace(/(\\\\.|{(?:\\d+(?:,\\d*)?|,\\d+)})|[{}]/g, function (a, b) {\n if (!b)\n return \"\\\\\" + a;\n return b;\n });\n function rCursor(doc, from = 0, to = doc.length) {\n return new RegExpCursor(doc, source, { ignoreCase: query.ignoreCase }, from, to);\n }\n function nextMatch(from) {\n var doc = cm.cm6.state.doc;\n if (from > doc.length)\n return null;\n let res = rCursor(doc, from).next();\n return res.done ? null : res.value;\n }\n var ChunkSize = 10000;\n function prevMatchInRange(from, to) {\n var doc = cm.cm6.state.doc;\n for (let size = 1;; size++) {\n let start = Math.max(from, to - size * ChunkSize);\n let cursor = rCursor(doc, start, to), range = null;\n while (!cursor.next().done)\n range = cursor.value;\n if (range && (start == from || range.from > start + 10))\n return range;\n if (start == from)\n return null;\n }\n }\n return {\n findNext: function () { return this.find(false); },\n findPrevious: function () { return this.find(true); },\n find: function (back) {\n var doc = cm.cm6.state.doc;\n if (back) {\n let endAt = last ? (last.from == last.to ? last.to - 1 : last.from) : firstOffset;\n last = prevMatchInRange(0, endAt);\n }\n else {\n let startFrom = last ? (last.from == last.to ? last.to + 1 : last.to) : firstOffset;\n last = nextMatch(startFrom);\n }\n lastCM5Result = last && {\n from: posFromIndex(doc, last.from),\n to: posFromIndex(doc, last.to),\n match: last.match,\n };\n return last && last.match;\n },\n from: function () { return lastCM5Result === null || lastCM5Result === void 0 ? void 0 : lastCM5Result.from; },\n to: function () { return lastCM5Result === null || lastCM5Result === void 0 ? void 0 : lastCM5Result.to; },\n replace: function (text) {\n if (last) {\n dispatchChange(cm, {\n changes: { from: last.from, to: last.to, insert: text }\n });\n last.to = last.from + text.length;\n if (lastCM5Result) {\n lastCM5Result.to = posFromIndex(cm.cm6.state.doc, last.to);\n }\n }\n }\n };\n }\n ;\n findPosV(start, amount, unit, goalColumn) {\n let { cm6 } = this;\n const doc = cm6.state.doc;\n let pixels = unit == 'page' ? cm6.dom.clientHeight : 0;\n const startOffset = indexFromPos(doc, start);\n let range = EditorSelection.cursor(startOffset, 1, undefined, goalColumn);\n let count = Math.round(Math.abs(amount));\n for (let i = 0; i < count; i++) {\n if (unit == 'page') {\n range = cm6.moveVertically(range, amount > 0, pixels);\n }\n else if (unit == 'line') {\n range = cm6.moveVertically(range, amount > 0);\n }\n }\n let pos = posFromIndex(doc, range.head);\n // set hitside to true if there was no place to move and cursor was clipped to the edge\n // of document. Needed for gj/gk\n if ((amount < 0 &&\n range.head == 0 && goalColumn != 0 &&\n start.line == 0 && start.ch != 0) || (amount > 0 &&\n range.head == doc.length && pos.ch != goalColumn\n && start.line == pos.line)) {\n pos.hitSide = true;\n }\n return pos;\n }\n ;\n charCoords(pos, mode) {\n var rect = this.cm6.contentDOM.getBoundingClientRect();\n var offset = indexFromPos(this.cm6.state.doc, pos);\n var coords = this.cm6.coordsAtPos(offset);\n var d = -rect.top;\n return { left: ((coords === null || coords === void 0 ? void 0 : coords.left) || 0) - rect.left, top: ((coords === null || coords === void 0 ? void 0 : coords.top) || 0) + d, bottom: ((coords === null || coords === void 0 ? void 0 : coords.bottom) || 0) + d };\n }\n ;\n coordsChar(coords, mode) {\n var rect = this.cm6.contentDOM.getBoundingClientRect();\n var offset = this.cm6.posAtCoords({ x: coords.left + rect.left, y: coords.top + rect.top }) || 0;\n return posFromIndex(this.cm6.state.doc, offset);\n }\n ;\n getScrollInfo() {\n var scroller = this.cm6.scrollDOM;\n return {\n left: scroller.scrollLeft, top: scroller.scrollTop,\n height: scroller.scrollHeight,\n width: scroller.scrollWidth,\n clientHeight: scroller.clientHeight, clientWidth: scroller.clientWidth\n };\n }\n ;\n scrollTo(x, y) {\n if (x != null)\n this.cm6.scrollDOM.scrollLeft = x;\n if (y != null)\n this.cm6.scrollDOM.scrollTop = y;\n }\n ;\n scrollIntoView(pos, margin) {\n if (pos) {\n var offset = this.indexFromPos(pos);\n this.cm6.dispatch({\n effects: EditorView.scrollIntoView(offset)\n });\n }\n else {\n this.cm6.dispatch({ scrollIntoView: true, userEvent: \"scroll\" });\n }\n }\n ;\n getWrapperElement() {\n return this.cm6.dom;\n }\n ;\n // for tests\n getMode() {\n return { name: this.getOption(\"mode\") };\n }\n ;\n setSize(w, h) {\n this.cm6.dom.style.width = w + 4 + \"px\";\n this.cm6.dom.style.height = h + \"px\";\n this.refresh();\n }\n refresh() {\n this.cm6.measure();\n }\n // event listeners\n destroy() {\n this.removeOverlay();\n }\n ;\n getLastEditEnd() {\n return this.posFromIndex(this.$lastChangeEndOffset);\n }\n ;\n onChange(update) {\n if (this.$lineHandleChanges) {\n this.$lineHandleChanges.push(update);\n }\n for (let i in this.marks) {\n let m = this.marks[i];\n m.update(update.changes);\n }\n if (this.virtualSelection) {\n this.virtualSelection.ranges = this.virtualSelection.ranges.map(range => range.map(update.changes));\n }\n var curOp = this.curOp = this.curOp || {};\n update.changes.iterChanges((fromA, toA, fromB, toB, text) => {\n if (curOp.$changeStart == null || curOp.$changeStart > fromB)\n curOp.$changeStart = fromB;\n this.$lastChangeEndOffset = toB;\n var change = { text: text.toJSON() };\n if (!curOp.lastChange) {\n curOp.lastChange = curOp.change = change;\n }\n else {\n curOp.lastChange.next = curOp.lastChange = change;\n }\n }, true);\n if (!curOp.changeHandlers)\n curOp.changeHandlers = this._handlers[\"change\"] && this._handlers[\"change\"].slice();\n }\n ;\n onSelectionChange() {\n var curOp = this.curOp = this.curOp || {};\n if (!curOp.cursorActivityHandlers)\n curOp.cursorActivityHandlers = this._handlers[\"cursorActivity\"] && this._handlers[\"cursorActivity\"].slice();\n this.curOp.cursorActivity = true;\n }\n ;\n operation(fn, force) {\n if (!this.curOp)\n this.curOp = { $d: 0 };\n this.curOp.$d++;\n try {\n var result = fn();\n }\n finally {\n if (this.curOp) {\n this.curOp.$d--;\n if (!this.curOp.$d)\n this.onBeforeEndOperation();\n }\n }\n return result;\n }\n ;\n onBeforeEndOperation() {\n var op = this.curOp;\n var scrollIntoView = false;\n if (op) {\n if (op.change) {\n signalTo(op.changeHandlers, this, op.change);\n }\n if (op && op.cursorActivity) {\n signalTo(op.cursorActivityHandlers, this, null);\n if (op.isVimOp)\n scrollIntoView = true;\n }\n this.curOp = null;\n }\n if (scrollIntoView)\n this.scrollIntoView();\n }\n ;\n moveH(increment, unit) {\n if (unit == 'char') {\n // todo\n var cur = this.getCursor();\n this.setCursor(cur.line, cur.ch + increment);\n }\n }\n ;\n setOption(name, val) {\n switch (name) {\n case \"keyMap\":\n this.state.keyMap = val;\n break;\n case \"textwidth\":\n this.state.textwidth = val;\n break;\n }\n }\n ;\n getOption(name) {\n switch (name) {\n case \"firstLineNumber\": return 1;\n case \"tabSize\": return this.cm6.state.tabSize || 4;\n case \"readOnly\": return this.cm6.state.readOnly;\n case \"indentWithTabs\": return this.cm6.state.facet(indentUnit) == \"\\t\"; // TODO\n case \"indentUnit\": return this.cm6.state.facet(indentUnit).length || 2;\n case \"textwidth\": return this.state.textwidth;\n // for tests\n case \"keyMap\": return this.state.keyMap || \"vim\";\n }\n }\n ;\n toggleOverwrite(on) {\n this.state.overwrite = on;\n }\n ;\n getTokenTypeAt(pos) {\n var _a;\n // only comment|string are needed\n var offset = this.indexFromPos(pos);\n var tree = ensureSyntaxTree(this.cm6.state, offset);\n var node = tree === null || tree === void 0 ? void 0 : tree.resolve(offset);\n var type = ((_a = node === null || node === void 0 ? void 0 : node.type) === null || _a === void 0 ? void 0 : _a.name) || \"\";\n if (/comment/i.test(type))\n return \"comment\";\n if (/string/i.test(type))\n return \"string\";\n return \"\";\n }\n ;\n overWriteSelection(text) {\n var doc = this.cm6.state.doc;\n var sel = this.cm6.state.selection;\n var ranges = sel.ranges.map(x => {\n if (x.empty) {\n var ch = x.to < doc.length ? doc.sliceString(x.from, x.to + 1) : \"\";\n if (ch && !/\\n/.test(ch))\n return EditorSelection.range(x.from, x.to + 1);\n }\n return x;\n });\n this.cm6.dispatch({\n selection: EditorSelection.create(ranges, sel.mainIndex)\n });\n this.replaceSelection(text);\n }\n /*** multiselect ****/\n isInMultiSelectMode() {\n return this.cm6.state.selection.ranges.length > 1;\n }\n virtualSelectionMode() {\n return !!this.virtualSelection;\n }\n forEachSelection(command) {\n var selection = this.cm6.state.selection;\n this.virtualSelection = EditorSelection.create(selection.ranges, selection.mainIndex);\n for (var i = 0; i < this.virtualSelection.ranges.length; i++) {\n var range = this.virtualSelection.ranges[i];\n if (!range)\n continue;\n this.cm6.dispatch({ selection: EditorSelection.create([range]) });\n command();\n this.virtualSelection.ranges[i] = this.cm6.state.selection.ranges[0];\n }\n this.cm6.dispatch({ selection: this.virtualSelection });\n this.virtualSelection = null;\n }\n hardWrap(options) {\n return hardWrap(this, options);\n }\n}\nCodeMirror.isMac = typeof navigator != \"undefined\" && /*@__PURE__*//Mac/.test(navigator.platform);\n// --------------------------\nCodeMirror.Pos = Pos;\nCodeMirror.StringStream = StringStream;\nCodeMirror.commands = {\n cursorCharLeft: function (cm) { cursorCharLeft(cm.cm6); },\n redo: function (cm) { runHistoryCommand(cm, false); },\n undo: function (cm) { runHistoryCommand(cm, true); },\n newlineAndIndent: function (cm) {\n insertNewlineAndIndent({\n state: cm.cm6.state,\n dispatch: (tr) => {\n return dispatchChange(cm, tr);\n }\n });\n },\n indentAuto: function (cm) {\n indentSelection(cm.cm6);\n },\n newlineAndIndentContinueComment: undefined,\n save: undefined,\n};\nCodeMirror.isWordChar = function (ch) {\n return wordChar.test(ch);\n};\nCodeMirror.keys = keys;\nCodeMirror.addClass = function (el, str) { };\nCodeMirror.rmClass = function (el, str) { };\nCodeMirror.e_preventDefault = function (e) {\n e.preventDefault();\n};\nCodeMirror.e_stop = function (e) {\n var _a, _b;\n (_a = e === null || e === void 0 ? void 0 : e.stopPropagation) === null || _a === void 0 ? void 0 : _a.call(e);\n (_b = e === null || e === void 0 ? void 0 : e.preventDefault) === null || _b === void 0 ? void 0 : _b.call(e);\n};\nCodeMirror.lookupKey = function lookupKey(key, map, handle) {\n var result = CodeMirror.keys[key];\n if (result)\n handle(result);\n};\nCodeMirror.on = on;\nCodeMirror.off = off;\nCodeMirror.signal = signal;\nCodeMirror.findMatchingTag = findMatchingTag;\nCodeMirror.findEnclosingTag = findEnclosingTag;\nCodeMirror.keyName = undefined;\n/************* dialog *************/\nfunction dialogDiv(cm, template, bottom) {\n var dialog = document.createElement(\"div\");\n dialog.appendChild(template);\n return dialog;\n}\nfunction closeNotification(cm, newVal) {\n if (cm.state.currentNotificationClose)\n cm.state.currentNotificationClose();\n cm.state.currentNotificationClose = newVal;\n}\nfunction openNotification(cm, template, options) {\n closeNotification(cm, close);\n var dialog = dialogDiv(cm, template, options && options.bottom);\n var closed = false;\n var doneTimer;\n var duration = options && typeof options.duration !== \"undefined\" ? options.duration : 5000;\n function close() {\n if (closed)\n return;\n closed = true;\n clearTimeout(doneTimer);\n dialog.remove();\n hideDialog(cm, dialog);\n }\n dialog.onclick = function (e) {\n e.preventDefault();\n close();\n };\n showDialog(cm, dialog);\n if (duration)\n doneTimer = setTimeout(close, duration);\n return close;\n}\nfunction showDialog(cm, dialog) {\n var oldDialog = cm.state.dialog;\n cm.state.dialog = dialog;\n if (dialog && oldDialog !== dialog) {\n if (oldDialog && oldDialog.contains(document.activeElement))\n cm.focus();\n if (oldDialog && oldDialog.parentElement) {\n oldDialog.parentElement.replaceChild(dialog, oldDialog);\n }\n else if (oldDialog) {\n oldDialog.remove();\n }\n CodeMirror.signal(cm, \"dialog\");\n }\n}\nfunction hideDialog(cm, dialog) {\n if (cm.state.dialog == dialog) {\n cm.state.dialog = null;\n CodeMirror.signal(cm, \"dialog\");\n }\n}\nfunction openDialog(me, template, callback, options) {\n if (!options)\n options = {};\n closeNotification(me, undefined);\n var dialog = dialogDiv(me, template, options.bottom);\n var closed = false;\n showDialog(me, dialog);\n function close(newVal) {\n if (typeof newVal == 'string') {\n inp.value = newVal;\n }\n else {\n if (closed)\n return;\n closed = true;\n hideDialog(me, dialog);\n if (!me.state.dialog)\n me.focus();\n if (options.onClose)\n options.onClose(dialog);\n }\n }\n var inp = dialog.getElementsByTagName(\"input\")[0];\n if (inp) {\n if (options.value) {\n inp.value = options.value;\n if (options.selectValueOnOpen !== false)\n inp.select();\n }\n if (options.onInput)\n CodeMirror.on(inp, \"input\", function (e) { options.onInput(e, inp.value, close); });\n if (options.onKeyUp)\n CodeMirror.on(inp, \"keyup\", function (e) { options.onKeyUp(e, inp.value, close); });\n CodeMirror.on(inp, \"keydown\", function (e) {\n if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) {\n return;\n }\n if (e.keyCode == 13)\n callback(inp.value);\n if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {\n inp.blur();\n CodeMirror.e_stop(e);\n close();\n }\n });\n if (options.closeOnBlur !== false)\n CodeMirror.on(inp, \"blur\", function () {\n setTimeout(function () {\n if (document.activeElement === inp)\n return;\n close();\n });\n });\n inp.focus();\n }\n return close;\n}\nvar matching = { \"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\", \"<\": \">>\", \">\": \"<<\" };\nfunction bracketRegex(config) {\n return config && config.bracketRegex || /[(){}[\\]]/;\n}\nfunction scanForBracket(cm, where, dir, style, config) {\n var maxScanLen = (config && config.maxScanLineLength) || 10000;\n var maxScanLines = (config && config.maxScanLines) || 1000;\n var stack = [];\n var re = bracketRegex(config);\n var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n var line = cm.getLine(lineNo);\n if (!line)\n continue;\n var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n if (line.length > maxScanLen)\n continue;\n if (lineNo == where.line)\n pos = where.ch - (dir < 0 ? 1 : 0);\n for (; pos != end; pos += dir) {\n var ch = line.charAt(pos);\n if (re.test(ch) /*&& (style === undefined ||\n (cm.getTokenTypeAt(new Pos(lineNo, pos + 1)) || \"\") == (style || \"\"))*/) {\n var match = matching[ch];\n if (match && (match.charAt(1) == \">\") == (dir > 0))\n stack.push(ch);\n else if (!stack.length)\n return { pos: new Pos(lineNo, pos), ch: ch };\n else\n stack.pop();\n }\n }\n }\n return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n}\nfunction findMatchingTag(cm, pos) {\n}\nfunction findEnclosingTag(cm, pos) {\n var _a, _b;\n var state = cm.cm6.state;\n var offset = cm.indexFromPos(pos);\n if (offset < state.doc.length) {\n var text = state.sliceDoc(offset, offset + 1);\n if (text == \"<\")\n offset++;\n }\n var tree = ensureSyntaxTree(state, offset);\n var node = (tree === null || tree === void 0 ? void 0 : tree.resolve(offset)) || null;\n while (node) {\n if (((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.type.name) == 'OpenTag'\n && ((_b = node.lastChild) === null || _b === void 0 ? void 0 : _b.type.name) == 'CloseTag') {\n return {\n open: convertRange(state.doc, node.firstChild),\n close: convertRange(state.doc, node.lastChild),\n };\n }\n node = node.parent;\n }\n}\nfunction convertRange(doc, cm6Range) {\n return {\n from: posFromIndex(doc, cm6Range.from),\n to: posFromIndex(doc, cm6Range.to)\n };\n}\nclass Marker {\n constructor(cm, offset, assoc) {\n this.cm = cm;\n this.id = cm.$mid++;\n this.offset = offset;\n this.assoc = assoc;\n cm.marks[this.id] = this;\n }\n ;\n clear() { delete this.cm.marks[this.id]; }\n ;\n find() {\n if (this.offset == null)\n return null;\n return this.cm.posFromIndex(this.offset);\n }\n ;\n update(change) {\n if (this.offset != null)\n this.offset = change.mapPos(this.offset, this.assoc, MapMode.TrackDel);\n }\n}\nfunction hardWrap(cm, options) {\n var _a;\n var max = options.column || cm.getOption('textwidth') || 80;\n var allowMerge = options.allowMerge != false;\n var row = Math.min(options.from, options.to);\n var endRow = Math.max(options.from, options.to);\n while (row <= endRow) {\n var line = cm.getLine(row);\n if (line.length > max) {\n var space = findSpace(line, max, 5);\n if (space) {\n var indentation = (_a = /^\\s*/.exec(line)) === null || _a === void 0 ? void 0 : _a[0];\n cm.replaceRange(\"\\n\" + indentation, new Pos(row, space.start), new Pos(row, space.end));\n }\n endRow++;\n }\n else if (allowMerge && /\\S/.test(line) && row != endRow) {\n var nextLine = cm.getLine(row + 1);\n if (nextLine && /\\S/.test(nextLine)) {\n var trimmedLine = line.replace(/\\s+$/, \"\");\n var trimmedNextLine = nextLine.replace(/^\\s+/, \"\");\n var mergedLine = trimmedLine + \" \" + trimmedNextLine;\n var space = findSpace(mergedLine, max, 5);\n if (space && space.start > trimmedLine.length || mergedLine.length < max) {\n cm.replaceRange(\" \", new Pos(row, trimmedLine.length), new Pos(row + 1, nextLine.length - trimmedNextLine.length));\n row--;\n endRow--;\n }\n else if (trimmedLine.length < line.length) {\n cm.replaceRange(\"\", new Pos(row, trimmedLine.length), new Pos(row, line.length));\n }\n }\n }\n row++;\n }\n return row;\n function findSpace(line, max, min) {\n if (line.length < max)\n return;\n var before = line.slice(0, max);\n var after = line.slice(max);\n var spaceAfter = /^(?:(\\s+)|(\\S+)(\\s+))/.exec(after);\n var spaceBefore = /(?:(\\s+)|(\\s+)(\\S+))$/.exec(before);\n var start = 0;\n var end = 0;\n if (spaceBefore && !spaceBefore[2]) {\n start = max - spaceBefore[1].length;\n end = max;\n }\n if (spaceAfter && !spaceAfter[2]) {\n if (!start)\n start = max;\n end = max + spaceAfter[1].length;\n }\n if (start) {\n return {\n start: start,\n end: end\n };\n }\n if (spaceBefore && spaceBefore[2] && spaceBefore.index > min) {\n return {\n start: spaceBefore.index,\n end: spaceBefore.index + spaceBefore[2].length\n };\n }\n if (spaceAfter && spaceAfter[2]) {\n start = max + spaceAfter[2].length;\n return {\n start: start,\n end: start + spaceAfter[3].length\n };\n }\n }\n}\n\n// backwards compatibility for old versions not supporting getDrawSelectionConfig\nlet getDrawSelectionConfig = View.getDrawSelectionConfig || /*@__PURE__*/function () {\n let defaultConfig = { cursorBlinkRate: 1200 };\n return function () {\n return defaultConfig;\n };\n}();\nclass Piece {\n constructor(left, top, height, fontFamily, fontSize, fontWeight, color, className, letter, partial) {\n this.left = left;\n this.top = top;\n this.height = height;\n this.fontFamily = fontFamily;\n this.fontSize = fontSize;\n this.fontWeight = fontWeight;\n this.color = color;\n this.className = className;\n this.letter = letter;\n this.partial = partial;\n }\n draw() {\n let elt = document.createElement(\"div\");\n elt.className = this.className;\n this.adjust(elt);\n return elt;\n }\n adjust(elt) {\n elt.style.left = this.left + \"px\";\n elt.style.top = this.top + \"px\";\n elt.style.height = this.height + \"px\";\n elt.style.lineHeight = this.height + \"px\";\n elt.style.fontFamily = this.fontFamily;\n elt.style.fontSize = this.fontSize;\n elt.style.fontWeight = this.fontWeight;\n elt.style.color = this.partial ? \"transparent\" : this.color;\n elt.className = this.className;\n elt.textContent = this.letter;\n }\n eq(p) {\n return this.left == p.left && this.top == p.top && this.height == p.height &&\n this.fontFamily == p.fontFamily && this.fontSize == p.fontSize &&\n this.fontWeight == p.fontWeight && this.color == p.color &&\n this.className == p.className &&\n this.letter == p.letter;\n }\n}\nclass BlockCursorPlugin {\n constructor(view, cm) {\n this.view = view;\n this.rangePieces = [];\n this.cursors = [];\n this.cm = cm;\n this.measureReq = { read: this.readPos.bind(this), write: this.drawSel.bind(this) };\n this.cursorLayer = view.scrollDOM.appendChild(document.createElement(\"div\"));\n this.cursorLayer.className = \"cm-cursorLayer cm-vimCursorLayer\";\n this.cursorLayer.setAttribute(\"aria-hidden\", \"true\");\n view.requestMeasure(this.measureReq);\n this.setBlinkRate();\n }\n setBlinkRate() {\n let config = getDrawSelectionConfig(this.cm.cm6.state);\n let blinkRate = config.cursorBlinkRate;\n this.cursorLayer.style.animationDuration = blinkRate + \"ms\";\n }\n update(update) {\n if (update.selectionSet || update.geometryChanged || update.viewportChanged) {\n this.view.requestMeasure(this.measureReq);\n this.cursorLayer.style.animationName = this.cursorLayer.style.animationName == \"cm-blink\" ? \"cm-blink2\" : \"cm-blink\";\n }\n if (configChanged(update))\n this.setBlinkRate();\n }\n scheduleRedraw() {\n this.view.requestMeasure(this.measureReq);\n }\n readPos() {\n let { state } = this.view;\n let cursors = [];\n for (let r of state.selection.ranges) {\n let prim = r == state.selection.main;\n let piece = measureCursor(this.cm, this.view, r, prim);\n if (piece)\n cursors.push(piece);\n }\n return { cursors };\n }\n drawSel({ cursors }) {\n if (cursors.length != this.cursors.length || cursors.some((c, i) => !c.eq(this.cursors[i]))) {\n let oldCursors = this.cursorLayer.children;\n if (oldCursors.length !== cursors.length) {\n this.cursorLayer.textContent = \"\";\n for (const c of cursors)\n this.cursorLayer.appendChild(c.draw());\n }\n else {\n cursors.forEach((c, idx) => c.adjust(oldCursors[idx]));\n }\n this.cursors = cursors;\n }\n }\n destroy() {\n this.cursorLayer.remove();\n }\n}\nfunction configChanged(update) {\n return getDrawSelectionConfig(update.startState) != getDrawSelectionConfig(update.state);\n}\nconst themeSpec = {\n \".cm-vimMode .cm-line\": {\n \"& ::selection\": { backgroundColor: \"transparent !important\" },\n \"&::selection\": { backgroundColor: \"transparent !important\" },\n caretColor: \"transparent !important\",\n },\n \".cm-fat-cursor\": {\n position: \"absolute\",\n background: \"#ff9696\",\n border: \"none\",\n whiteSpace: \"pre\",\n },\n \"&:not(.cm-focused) .cm-fat-cursor\": {\n background: \"none\",\n outline: \"solid 1px #ff9696\",\n color: \"transparent !important\",\n },\n};\nconst hideNativeSelection = /*@__PURE__*/Prec.highest(/*@__PURE__*/EditorView.theme(themeSpec));\nfunction getBase(view) {\n let rect = view.scrollDOM.getBoundingClientRect();\n let left = view.textDirection == Direction.LTR ? rect.left : rect.right - view.scrollDOM.clientWidth;\n return { left: left - view.scrollDOM.scrollLeft, top: rect.top - view.scrollDOM.scrollTop };\n}\nfunction measureCursor(cm, view, cursor, primary) {\n var _a, _b;\n let head = cursor.head;\n let fatCursor = false;\n let hCoeff = 1;\n let vim = cm.state.vim;\n if (vim && (!vim.insertMode || cm.state.overwrite)) {\n fatCursor = true;\n if (vim.visualBlock && !primary)\n return null;\n if (cursor.anchor < cursor.head)\n head--;\n if (cm.state.overwrite)\n hCoeff = 0.2;\n else if (vim.status)\n hCoeff = 0.5;\n }\n if (fatCursor) {\n let letter = head < view.state.doc.length && view.state.sliceDoc(head, head + 1);\n if (letter && (/[\\uDC00-\\uDFFF]/.test(letter) && head > 1)) {\n // step back if cursor is on the second half of a surrogate pair\n head--;\n letter = view.state.sliceDoc(head, head + 1);\n }\n let pos = view.coordsAtPos(head, 1);\n if (!pos)\n return null;\n let base = getBase(view);\n let domAtPos = view.domAtPos(head);\n let node = domAtPos ? domAtPos.node : view.contentDOM;\n while (domAtPos && domAtPos.node instanceof HTMLElement) {\n node = domAtPos.node;\n domAtPos = { node: domAtPos.node.childNodes[domAtPos.offset], offset: 0 };\n }\n if (!(node instanceof HTMLElement)) {\n if (!node.parentNode)\n return null;\n node = node.parentNode;\n }\n let style = getComputedStyle(node);\n let left = pos.left;\n // TODO remove coordsAtPos when all supported versions of codemirror have coordsForChar api\n let charCoords = (_b = (_a = view).coordsForChar) === null || _b === void 0 ? void 0 : _b.call(_a, head);\n if (charCoords) {\n left = charCoords.left;\n }\n if (!letter || letter == \"\\n\" || letter == \"\\r\") {\n letter = \"\\xa0\";\n }\n else if (letter == \"\\t\") {\n letter = \"\\xa0\";\n var nextPos = view.coordsAtPos(head + 1, -1);\n if (nextPos) {\n left = nextPos.left - (nextPos.left - pos.left) / parseInt(style.tabSize);\n }\n }\n else if ((/[\\uD800-\\uDBFF]/.test(letter) && head < view.state.doc.length - 1)) {\n // include the second half of a surrogate pair in cursor\n letter += view.state.sliceDoc(head + 1, head + 2);\n }\n let h = (pos.bottom - pos.top);\n return new Piece(left - base.left, pos.top - base.top + h * (1 - hCoeff), h * hCoeff, style.fontFamily, style.fontSize, style.fontWeight, style.color, primary ? \"cm-fat-cursor cm-cursor-primary\" : \"cm-fat-cursor cm-cursor-secondary\", letter, hCoeff != 1);\n }\n else {\n return null;\n }\n}\n\nvar FIREFOX_LINUX = typeof navigator != \"undefined\"\n && /*@__PURE__*//linux/i.test(navigator.platform)\n && /*@__PURE__*// Gecko\\/\\d+/.exec(navigator.userAgent);\nconst Vim = /*@__PURE__*/initVim(CodeMirror);\nconst HighlightMargin = 250;\nconst vimStyle = /*@__PURE__*/EditorView.baseTheme({\n \".cm-vimMode .cm-cursorLayer:not(.cm-vimCursorLayer)\": {\n display: \"none\",\n },\n \".cm-vim-panel\": {\n padding: \"0px 10px\",\n fontFamily: \"monospace\",\n minHeight: \"1.3em\",\n },\n \".cm-vim-panel input\": {\n border: \"none\",\n outline: \"none\",\n backgroundColor: \"inherit\",\n },\n \"&light .cm-searchMatch\": { backgroundColor: \"#ffff0054\" },\n \"&dark .cm-searchMatch\": { backgroundColor: \"#00ffff8a\" },\n});\nconst vimPlugin = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.status = \"\";\n this.query = null;\n this.decorations = Decoration.none;\n this.waitForCopy = false;\n this.lastKeydown = '';\n this.useNextTextInput = false;\n this.compositionText = '';\n this.view = view;\n const cm = (this.cm = new CodeMirror(view));\n Vim.enterVimMode(this.cm);\n this.view.cm = this.cm;\n this.cm.state.vimPlugin = this;\n this.blockCursor = new BlockCursorPlugin(view, cm);\n this.updateClass();\n this.cm.on(\"vim-command-done\", () => {\n if (cm.state.vim)\n cm.state.vim.status = \"\";\n this.blockCursor.scheduleRedraw();\n this.updateStatus();\n });\n this.cm.on(\"vim-mode-change\", (e) => {\n if (!cm.state.vim)\n return;\n cm.state.vim.mode = e.mode;\n if (e.subMode) {\n cm.state.vim.mode += \" block\";\n }\n cm.state.vim.status = \"\";\n this.blockCursor.scheduleRedraw();\n this.updateClass();\n this.updateStatus();\n });\n this.cm.on(\"dialog\", () => {\n if (this.cm.state.statusbar) {\n this.updateStatus();\n }\n else {\n view.dispatch({\n effects: showVimPanel.of(!!this.cm.state.dialog),\n });\n }\n });\n this.dom = document.createElement(\"span\");\n this.dom.style.cssText = \"position: absolute; right: 10px; top: 1px\";\n this.statusButton = document.createElement(\"span\");\n this.statusButton.onclick = (e) => {\n Vim.handleKey(this.cm, \"<Esc>\", \"user\");\n this.cm.focus();\n };\n this.statusButton.style.cssText = \"cursor: pointer\";\n }\n update(update) {\n var _a;\n if ((update.viewportChanged || update.docChanged) && this.query) {\n this.highlight(this.query);\n }\n if (update.docChanged) {\n this.cm.onChange(update);\n }\n if (update.selectionSet) {\n this.cm.onSelectionChange();\n }\n if (update.viewportChanged) ;\n if (this.cm.curOp && !this.cm.curOp.isVimOp) {\n this.cm.onBeforeEndOperation();\n }\n if (update.transactions) {\n for (let tr of update.transactions)\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery)) {\n let forVim = (_a = effect.value) === null || _a === void 0 ? void 0 : _a.forVim;\n if (!forVim) {\n this.highlight(null);\n }\n else {\n let query = effect.value.create();\n this.highlight(query);\n }\n }\n }\n }\n this.blockCursor.update(update);\n }\n updateClass() {\n const state = this.cm.state;\n if (!state.vim || (state.vim.insertMode && !state.overwrite))\n this.view.scrollDOM.classList.remove(\"cm-vimMode\");\n else\n this.view.scrollDOM.classList.add(\"cm-vimMode\");\n }\n updateStatus() {\n let dom = this.cm.state.statusbar;\n let vim = this.cm.state.vim;\n if (!dom || !vim)\n return;\n let dialog = this.cm.state.dialog;\n if (dialog) {\n if (dialog.parentElement != dom) {\n dom.textContent = \"\";\n dom.appendChild(dialog);\n }\n }\n else {\n dom.textContent = \"\";\n var status = (vim.mode || \"normal\").toUpperCase();\n if (vim.insertModeReturn)\n status += \"(C-O)\";\n this.statusButton.textContent = `--${status}--`;\n dom.appendChild(this.statusButton);\n }\n this.dom.textContent = vim.status;\n dom.appendChild(this.dom);\n }\n destroy() {\n Vim.leaveVimMode(this.cm);\n this.updateClass();\n this.blockCursor.destroy();\n delete this.view.cm;\n }\n highlight(query) {\n this.query = query;\n if (!query)\n return (this.decorations = Decoration.none);\n let { view } = this;\n let builder = new RangeSetBuilder();\n for (let i = 0, ranges = view.visibleRanges, l = ranges.length; i < l; i++) {\n let { from, to } = ranges[i];\n while (i < l - 1 && to > ranges[i + 1].from - 2 * HighlightMargin)\n to = ranges[++i].to;\n query.highlight(view.state, from, to, (from, to) => {\n builder.add(from, to, matchMark);\n });\n }\n return (this.decorations = builder.finish());\n }\n handleKey(e, view) {\n const cm = this.cm;\n let vim = cm.state.vim;\n if (!vim)\n return;\n const key = Vim.vimKeyFromEvent(e, vim);\n CodeMirror.signal(this.cm, 'inputEvent', { type: \"handleKey\", key });\n if (!key)\n return;\n // clear search highlight\n if (key == \"<Esc>\" &&\n !vim.insertMode &&\n !vim.visualMode &&\n this.query /* && !cm.inMultiSelectMode*/) {\n const searchState = vim.searchState_;\n if (searchState) {\n cm.removeOverlay(searchState.getOverlay());\n searchState.setOverlay(null);\n }\n }\n let isCopy = key === \"<C-c>\" && !CodeMirror.isMac;\n if (isCopy && cm.somethingSelected()) {\n this.waitForCopy = true;\n return true;\n }\n vim.status = (vim.status || \"\") + key;\n let result = Vim.multiSelectHandleKey(cm, key, \"user\");\n vim = Vim.maybeInitVimState_(cm); // the object can change if there is an exception in handleKey\n // insert mode\n if (!result && vim.insertMode && cm.state.overwrite) {\n if (e.key && e.key.length == 1 && !/\\n/.test(e.key)) {\n result = true;\n cm.overWriteSelection(e.key);\n }\n else if (e.key == \"Backspace\") {\n result = true;\n CodeMirror.commands.cursorCharLeft(cm);\n }\n }\n if (result) {\n CodeMirror.signal(this.cm, 'vim-keypress', key);\n e.preventDefault();\n e.stopPropagation();\n this.blockCursor.scheduleRedraw();\n }\n this.updateStatus();\n return !!result;\n }\n}, {\n eventHandlers: {\n copy: function (e, view) {\n if (!this.waitForCopy)\n return;\n this.waitForCopy = false;\n Promise.resolve().then(() => {\n var cm = this.cm;\n var vim = cm.state.vim;\n if (!vim)\n return;\n if (vim.insertMode) {\n cm.setSelection(cm.getCursor(), cm.getCursor());\n }\n else {\n cm.operation(() => {\n if (cm.curOp)\n cm.curOp.isVimOp = true;\n Vim.handleKey(cm, '<Esc>', 'user');\n });\n }\n });\n },\n compositionstart: function (e, view) {\n this.useNextTextInput = true;\n CodeMirror.signal(this.cm, 'inputEvent', e);\n },\n compositionupdate: function (e, view) {\n CodeMirror.signal(this.cm, 'inputEvent', e);\n },\n compositionend: function (e, view) {\n CodeMirror.signal(this.cm, 'inputEvent', e);\n },\n keypress: function (e, view) {\n CodeMirror.signal(this.cm, 'inputEvent', e);\n if (this.lastKeydown == \"Dead\")\n this.handleKey(e, view);\n },\n keydown: function (e, view) {\n CodeMirror.signal(this.cm, 'inputEvent', e);\n this.lastKeydown = e.key;\n if (this.lastKeydown == \"Unidentified\"\n || this.lastKeydown == \"Process\"\n || this.lastKeydown == \"Dead\") {\n this.useNextTextInput = true;\n }\n else {\n this.useNextTextInput = false;\n this.handleKey(e, view);\n }\n },\n },\n provide: () => {\n return [\n EditorView.inputHandler.of((view, from, to, text) => {\n var _a, _b;\n var cm = getCM(view);\n if (!cm)\n return false;\n var vim = (_a = cm.state) === null || _a === void 0 ? void 0 : _a.vim;\n var vimPlugin = cm.state.vimPlugin;\n if (vim && !vim.insertMode && !((_b = cm.curOp) === null || _b === void 0 ? void 0 : _b.isVimOp)) {\n if (text === \"\\0\\0\") {\n return true;\n }\n CodeMirror.signal(cm, 'inputEvent', {\n type: \"text\",\n text,\n from,\n to,\n });\n if (text.length == 1 && vimPlugin.useNextTextInput) {\n if (vim.expectLiteralNext && view.composing) {\n vimPlugin.compositionText = text;\n return false;\n }\n if (vimPlugin.compositionText) {\n var toRemove = vimPlugin.compositionText;\n vimPlugin.compositionText = '';\n var head = view.state.selection.main.head;\n var textInDoc = view.state.sliceDoc(head - toRemove.length, head);\n if (toRemove === textInDoc) {\n var pos = cm.getCursor();\n cm.replaceRange('', cm.posFromIndex(head - toRemove.length), pos);\n }\n }\n vimPlugin.handleKey({\n key: text,\n preventDefault: () => { },\n stopPropagation: () => { }\n });\n forceEndComposition(view);\n return true;\n }\n }\n return false;\n })\n ];\n },\n decorations: (v) => v.decorations,\n});\n/**\n * removes contenteditable element and adds it back to end\n * IME composition in normal mode\n * this method works on all browsers except for Firefox on Linux\n * where we need to reset textContent of editor\n * (which doesn't work on other browsers)\n */\nfunction forceEndComposition(view) {\n var parent = view.scrollDOM.parentElement;\n if (!parent)\n return;\n if (FIREFOX_LINUX) {\n view.contentDOM.textContent = \"\\0\\0\";\n view.contentDOM.dispatchEvent(new CustomEvent(\"compositionend\"));\n return;\n }\n var sibling = view.scrollDOM.nextSibling;\n var selection = window.getSelection();\n var savedSelection = selection && {\n anchorNode: selection.anchorNode,\n anchorOffset: selection.anchorOffset,\n focusNode: selection.focusNode,\n focusOffset: selection.focusOffset\n };\n view.scrollDOM.remove();\n parent.insertBefore(view.scrollDOM, sibling);\n try {\n if (savedSelection && selection) {\n selection.setPosition(savedSelection.anchorNode, savedSelection.anchorOffset);\n if (savedSelection.focusNode) {\n selection.extend(savedSelection.focusNode, savedSelection.focusOffset);\n }\n }\n }\n catch (e) {\n console.error(e);\n }\n view.focus();\n view.contentDOM.dispatchEvent(new CustomEvent(\"compositionend\"));\n}\nconst matchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch\" });\nconst showVimPanel = /*@__PURE__*/StateEffect.define();\nconst vimPanelState = /*@__PURE__*/StateField.define({\n create: () => false,\n update(value, tr) {\n for (let e of tr.effects)\n if (e.is(showVimPanel))\n value = e.value;\n return value;\n },\n provide: (f) => {\n return showPanel.from(f, (on) => (on ? createVimPanel : null));\n },\n});\nfunction createVimPanel(view) {\n let dom = document.createElement(\"div\");\n dom.className = \"cm-vim-panel\";\n let cm = view.cm;\n if (cm.state.dialog) {\n dom.appendChild(cm.state.dialog);\n }\n return { top: false, dom };\n}\nfunction statusPanel(view) {\n let dom = document.createElement(\"div\");\n dom.className = \"cm-vim-panel\";\n let cm = view.cm;\n cm.state.statusbar = dom;\n cm.state.vimPlugin.updateStatus();\n return { dom };\n}\nfunction vim(options = {}) {\n return [\n vimStyle,\n vimPlugin,\n hideNativeSelection,\n options.status ? showPanel.of(statusPanel) : vimPanelState,\n ];\n}\nfunction getCM(view) {\n return view.cm || null;\n}\n\nexport { CodeMirror, Vim, getCM, vim };\n"],"names":["basicNormalize","String","prototype","normalize","x","SearchCursor","constructor","text","query","from","to","length","test","this","value","done","matches","buffer","bufferPos","iter","iterRange","bufferStart","peek","next","codePointAt","pop","nextOverlapping","str","fromCodePoint","start","codePointSize","norm","i","pos","code","charCodeAt","match","end","index","keep","splice","push","Symbol","iterator","empty","exec","baseFlags","unicode","RegExpCursor","options","curLine","MultilineRegExpCursor","re","RegExp","ignoreCase","startLine","lineAt","curLineStart","matchPos","toCharEnd","getLine","skip","lineBreak","slice","nextLine","off","lastIndex","flattened","WeakMap","FlattenedDoc","get","doc","cached","flat","sliceString","set","cachedFrom","chunkEnd","line","SearchQuery","config","search","caseSensitive","literal","regexp","replace","valid","source","_a","validRegExp","unquoted","unquote","wholeWord","_","ch","eq","other","create","RegExpQuery","StringQuery","getCursor","state","st","EditorState","regexpCursor","stringCursor","QueryType","spec","undefined","toLowerCase","categorizer","charCategorizer","selection","main","head","buf","bufPos","Math","max","min","charBefore","CharCategory","Word","charAfter","super","nextMatch","curFrom","curTo","cursor","prevMatchInRange","range","prevMatch","found","getReplacement","_result","matchAll","limit","ranges","highlight","add","_from","_to","input","findClusterBreak","size","result","m","setSearchQuery","StateEffect","define","initVim","CodeMirror","Pos","updateSelectionForSurrogateCharacters","cm","curStart","curEnd","charCode","defaultKeymap","keys","type","toKeys","context","action","motion","motionArgs","linewise","toJumplist","forward","wordEnd","bigWord","inclusive","explicitRepeat","toFirstChar","repeatOffset","isEdit","actionArgs","after","matchIndent","sameLine","operator","operatorArgs","indentRight","toLower","keepCursor","operatorMotionArgs","visualLine","shouldMoveCursor","insertAt","interlaceInsertRepeat","blockwise","keepSpaces","fullLine","exitVisualBlock","position","increase","backtrack","textObjectInner","searchArgs","querySrc","wholeWordOnly","defaultKeymapLength","defaultExCommandMap","name","shortName","possiblyAsync","excludeFromCommandHistory","langmap","parseLangmap","getOnPasteFn","vim","onPasteFn","insertMode","setCursor","offsetCursor","actions","enterInsertMode","upperCaseChars","numberRegex","wordCharTest","isWordChar","bigWordCharTest","validMarks","validRegisters","latinCharRegex","isLine","firstLine","lastLine","isLowerCase","k","isUpperCase","isWhiteSpaceString","isEndOfSentenceSymbol","indexOf","inArray","val","arr","defineOption","defaultValue","aliases","callback","Error","setOption","cfg","option","scope","getOption","local","mode","width","column","round","vimGlobalState","lastInsertModeKeyTimer","createCircularJumpList","pointer","tail","Array","move","offset","mark","find","newCur","inc","oldCur","cursorEqual","cachedCursor","curMark","useNextSlot","trashMark","clear","setBookmark","markPos","oldPointer","createInsertModeChanges","c","changes","expectCursorActivityForChange","MacroModeState","latestRegister","isPlaying","isRecording","replaySearchQueries","onRecordingDone","lastInsertModeChanges","exitMacroRecordMode","macroModeState","enterMacroRecordMode","registerName","register","registerController","getRegister","openDialog","template","dom","class","bottom","maybeInitVimState","inputState","InputState","lastEditInputState","lastEditActionCommand","lastHPos","lastHSPos","lastMotion","marks","insertModeReturn","insertModeRepeat","visualMode","visualBlock","lastSelection","lastPastedText","sel","expectLiteralNext","resetVimGlobalState","optionName","searchQuery","searchIsReversed","lastSubstituteReplacePart","jumpList","lastCharacterSearch","increment","selectedCharacter","RegisterController","searchHistoryController","HistoryController","exCommandHistoryController","virtualPrompt","vimApi","enterVimMode","signal","on","onCursorActivity","getInputField","leaveVimMode","highlightTimeout","clearTimeout","buildKeyMap","getRegisterController","resetVimGlobalState_","getVimGlobalState_","maybeInitVimState_","suppressErrorLogging","InsertModeKey","map","lhs","rhs","ctx","exCommandDispatcher","unmap","noremap","mapclear","actualLength","origLength","userKeymap","mapping","_mapCommand","contexts","j","newMapping","Object","assign","updateLangmap","vimKeyFromEvent","defineEx","prefix","func","exCommands","commandMap_","handleKey","key","origin","command","findKey","multiSelectHandleKey","cm_","isHandled","wasInVisualBlock","wasMultiselect","isInMultiSelectMode","status","inVirtualSelectionMode","old","cloneVimState","changeQueueList","operation","curOp","isVimOp","forEachSelection","changeQueue","anchor","headOffset","cursorIsBefore","anchorOffset","virtualSelection","cursorActivity","clearInputState","insert","somethingSelected","handleExternalSelection","handleMacroRecording","pushText","logKey","handleEsc","exitVisualMode","exitInsertMode","keyBuffer","join","keysAreChars","commandDispatcher","matchCommand","window","setTimeout","selections","listSelections","removed","ChangeQueue","inserted","cursorMin","cursorMax","getRange","overwrite","here","replaceRange","handleKeyInsertMode","keysMatcher","mainKey","operatorShortcut","pushRepeatDigit","handleKeyNonInsertMode","doKeyToKey","processCommand","e","console","handleEx","defineMotion","fn","motions","defineAction","defineOperator","operators","mapCommand","args","extra","defineRegister","registers","keyToKeyStack","sendKeyToPrompt","lowerKey","parts","split","vimToCmKeyMap","event","target","selectionEnd","selectionStart","onKeyDown","close","onKeyUp","prompt","onClose","fromKey","noremapBefore","keyRe","wasInsert","hasOwnProperty","sendCmKey","replaceSelection","promptOptions","showPrompt","specialKey","Return","Backspace","Delete","Escape","Insert","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Enter","ignoredKeys","Shift","Alt","Command","Control","CapsLock","AltGraph","Dead","Unidentified","ctrlKey","altKey","metaKey","isMac","shiftKey","keymap","remapCtrl","langmapString","string","getEscaped","list","filter","Boolean","part","semicolon","pairs","concat","forEach","prefixRepeat","motionRepeat","n","getRepeat","repeat","parseInt","reason","Register","insertModeChanges","searchQueries","setText","pushInsertModeChanges","pushSearchQuery","toString","unnamedRegister","charAt","isValidRegister","navigator","clipboard","writeText","shiftNumericRegisters_","historyBuffer","initialPrefix","up","dir","element","substring","pushInput","reset","keyMap","bestMatch","partial","full","commandMatch","commandMatches","character","lastChar","repeatOverride","processMotion","processOperator","processOperatorMotion","processAction","processSearch","processEx","copyArgs","evalInput","updateCmSelection","repeatIsExplicit","recordLastEdit","getSearchCursor","getSearchState","setReversed","promptPrefix","originalQuery","getQuery","originalScrollPos","getScrollInfo","handleQuery","shift","scrollTo","left","top","logSearchQuery","desc","parsedQuery","keyName","updateSearchQuery","scrollIntoView","findNext","clearSearchHighlight","e_stop","focus","word","expandWordUnderCursor","noSymbol","isKeyword","showConfirm","smartCase","onPromptClose","onPromptKeyDown","exArgs","selectValueOnOpen","newHead","newAnchor","origHead","copyCursor","clipCursorToContent","origAnchor","oldHead","oldAnchor","noRepeat","motionResult","recordJumpPosition","Infinity","updateMark","lastSel","lineOffset","abs","chOffset","cmSel","makeCmSelection","newPositions","lineLength","tmp","_cm","expandSelectionToLine","lines","clipToLine","exclusive","setSelections","primary","operatorMoveTo","actionCommand","moveToTopLine","_head","getUserVisibleLines","findFirstNonWhiteSpaceCharacter","moveToMiddleLine","floor","moveToBottomLine","expandToLine","prev","isReversed","highlightSearchMatches","findAndSelectNextInclusive","prevInputState","findNextFromAndToInclusive","subMode","goToMark","getMarkPos","moveToOtherHighlightedEnd","jumpToMark","best","equal","between","cursorIsBetween","moveByCharacters","cur","moveByLines","endCh","moveByDisplayLines","moveByScroll","moveToColumn","moveToEol","first","last","posV","findPosV","moveToStartOfLine","charCoords","res","hitSide","goalCoords","coordsChar","resCoords","moveByPage","moveByParagraph","findParagraph","moveBySentence","nextChar","idx","ln","stop","curr","last_valid","skip_empty_lines","reverse","curr_index","findSentence","scrollbox","clientHeight","defaultTextHeight","orig","dest","moveByWords","words","emptyLineIsWord","findWord","eodCh","shortCircuit","firstWord","lastWord","moveToWord","moveTillCharacter","moveToCharacter","recordLastCharacterSearch","moveToSymbol","symb","endLine","lineCount","curCh","lineText","nextCh","lastCh","reverseSymb","depth","curMoveThrough","symbolToMode","init","findSymbolModes","isComplete","lineLen","findSymbol","moveToFirstNonWhiteSpaceCharacter","moveToMatchedSymbol","symbol","style","getTokenTypeAt","findMatchingBracket","bracketRegex","moveToLineOrEdgeOfDocument","lineNum","moveToStartOfDisplayLine","execCommand","moveToEndOfDisplayLine","sticky","textObjectManipulation","selectCompanionObject","sc","len","chars","firstIndex","stringAfter","stringBefore","findBeginningAndEnd","repeated","innerWord","multiline","findMatchingTag","findEnclosingTag","tags","open","expandTagUnderCursor","content","getSentence","expandSelection","repeatLastCharacterSearch","lastSearch","moveH","fillArray","times","change","finalHead","Number","MAX_VALUE","setSelection","getSelection","replacement","replaceSelections","lastState","delete","indent","indentMore","indentLess","indentLine","indentAuto","_args","hardWrap","endRow","changeCase","getSelections","swapped","toSwap","toUpperCase","yank","endPos","jumpListWalk","scroll","lineHeight","delta","newPos","cursorCoords","ceil","newBottom","scrollToCursor","height","y","lineLastCharPos","replayMacro","executeMacroRegister","toggleOverwrite","getLastEditPos","onChange","insertEnd","insertLeft","onKeyEventTargetKeyDown","selectForInsert","toggleVisualMode","newPosition","reselectLastSelection","_actionArgs","updateLastSelection","anchorMark","headMark","joinLines","finalCh","nextStartCh","curFinalPos","newLineAndEnterInsertMode","commands","newlineAndIndentContinueComment","newlineAndIndent","paste","readText","then","continuePaste","tabSize","whitespaceLength","tabs","spaces","currentLine","chompedText","wasChomped","firstIndent","wspace","newIndent","quotient","curPosFinal","lastSelectionCurEnd","selectedArea","getCurrentSelectedAreaRange","getLastSelectedAreaRange","block","getSelectedAreaRange","selectedText","emptyStrings","selectBlock","posFromIndex","indexFromPos","extendLineToColumn","undo","repeatFn","redo","setRegister","insertRegister","oneNormalCommand","handler","setMark","markName","replaceTo","replaceWith","replaceWithStr","replaceWithStrings","incrementNumberToken","numberStr","lineStr","baseStr","digits","base","zeroPadding","substr","repeatLastEdit","includeLineBreak","maxCh","direction","ret","prop","offsetLine","offsetCh","pressed","mapped","isLastCharacter","isLastRegister","prefixLen","pressedPrefix","mappedPrefix","cur1","cur2","arguments","apply","call","cur3","cur1before2","cur2before3","trim","s","clipPos","isClipped","primIndex","atAnchor","atHead","getIndex","wasClipped","baseCh","headCh","newDir","lineHead","fromCh","toCh","moveHead","firstNonWS","wordOnNextLine","getHead","startLineNumber","endLineNumber","startsWithSpace","wordStart","M","bracket","section","comment","method","preprocess","token","charTests","foundWord","keepHPos","retval","charIdxInLine","includeChar","lastIndexOf","isEmpty","isBoundary","any","startState","lastSentencePos","bracketRegexp","openSym","startBracket","scanForBracket","endBracket","SearchState","setQuery","getOverlay","searchOverlay","setOverlay","overlay","reversed","getScrollbarAnnotate","annotate","setScrollbarAnnotate","searchState_","splitBySeparator","argString","separator","slashes","findUnescapedSeparators","tokens","escapeNextChar","charUnescapes","unescapes","parseQuery","regexPart","forceIgnoreCase","out","specialComesNext","translateRegex","document","createElement","a","createTextNode","nodeType","appendChild","setAttribute","pre","$color","$whiteSpace","openNotification","duration","alert","innerText","$display","$fontFamily","$flex","autocorrect","autocapitalize","spellcheck","$width","shortText","textContent","rawQuery","r1","r2","props","regexEqual","searchState","removeOverlay","matchSol","stream","sol","backUp","eol","skipToEnd","addOverlay","showMatchesOnScrollbar","lastEndPos","isInRange","scrollInfo","bottomY","getLastEditEnd","history","colorscheme","params","defaultOnly","mapArgs","imap","nmap","vmap","omap","inoremap","nnoremap","vnoremap","onoremap","imapclear","nmapclear","vmapclear","omapclear","setArgs","setCfg","expr","forceGet","forceToggle","optionIsBoolean","oldValue","message","setOptionReturn","setlocal","setglobal","regArgs","regInfo","registerNames","sort","unique","number","pattern","err","StringStream","eat","eatSpace","opts","decimal","hex","octal","parseArgs","lineStart","lineEnd","radix","numPart","textPart","matchPart","b","compareFn","textOld","amatch","bmatch","vglobal","global","normal","trimStart","isNaN","inverted","commandName","splitBySlash","cmd","matchedLines","getLineHandle","nextCommand","lineHandle","getLineNumber","releaseLineHandles","substitute","trailing","flagsPart","count","replacePart","confirm","output","matched","matcher","unescapeRegexReplace","translateRegexReplace","startPos","searchCursor","exMode","lastPos","modifiedLineNumber","joined","replaceAll","newText","unmodifiedLineNumber","findNextValidMatch","lastMatchTo","_value","savedCallback","doReplace","startinsert","write","save","nohlsearch","selectionLine","selectionLineEnd","delmarks","sym","startMark","finishMark","finish","fromCharCode","buildCommandMap_","opt_params","that","_processCommand","commandHistoryRegister","previousCommand","inputStream","parseInput_","matchCommand_","parseCommandArgs_","toInput","eatWhile","parseLineSpec_","numberMatch","parseLineSpecOffset_","offsetMatch","delim","argDelimiter","user","unshift","insertModeChangeRegister","lastChange","logInsertModeChange","imc","repeatInsertModeChanges","changeObj","ignoreCount","selectionCount","maybeReset","repeatForInsert","lastAction","cachedInputState","repeatCommand","repeatInsert","changeObject","lookupKey","binding","o","isArray","lineNumber","emitter","f","addEventListener","_handlers","removeEventListener","handlers","signalTo","wordChar","dispatchChange","transaction","view","cm6","readOnly","annotations","some","note","error","userEvent","dispatch","runHistoryCommand","revert","$changeStart","changeStartIndex","$mid","$lastChangeEndOffset","bind","onSelectionChange","me","closeNotification","dialog","dialogDiv","closed","newVal","inp","hideDialog","showDialog","getElementsByTagName","select","onInput","keyCode","closeOnEnter","blur","closeOnBlur","activeElement","doneTimer","remove","onclick","preventDefault","foldCode","tmpRanges","EditorSelection","onBeforeEndOperation","p","r","row","$lineHandleChanges","handle","updates","mapPos","MapMode","TrackAfter","sliceDoc","replacements","contentDOM","getValue","setValue","defaultLineHeight","_options","matchBrackets","where","maxScanLen","maxScanLineLength","maxScanLines","stack","lineNo","matching","more","cursorLineBoundaryBackward","cursorLineBoundaryForward","cursorCharBackward","log","assoc","Marker","cm6Query","flags","forVim","effect","of","effects","lastCM5Result","firstOffset","rCursor","findPrevious","back","endAt","startFrom","amount","unit","goalColumn","pixels","startOffset","moveVertically","rect","getBoundingClientRect","coords","coordsAtPos","d","posAtCoords","scroller","scrollDOM","scrollLeft","scrollTop","scrollHeight","scrollWidth","clientWidth","margin","EditorView","getWrapperElement","getMode","setSize","w","h","refresh","measure","destroy","update","iterChanges","fromA","toA","fromB","toB","toJSON","changeHandlers","cursorActivityHandlers","force","$d","op","textwidth","facet","indentUnit","tree","ensureSyntaxTree","node","resolve","overWriteSelection","mainIndex","virtualSelectionMode","allowMerge","space","findSpace","indentation","trimmedLine","trimmedNextLine","mergedLine","before","spaceAfter","spaceBefore","currentNotificationClose","oldDialog","contains","parentElement","replaceChild","platform","cursorCharLeft","insertNewlineAndIndent","tr","indentSelection","addClass","el","rmClass","e_preventDefault","_b","stopPropagation","firstChild","lastChild","convertRange","parent","cm6Range","id","TrackDel","getDrawSelectionConfig","View.getDrawSelectionConfig","defaultConfig","cursorBlinkRate","Piece","fontFamily","fontSize","fontWeight","color","className","letter","draw","elt","adjust","BlockCursorPlugin","rangePieces","cursors","measureReq","read","readPos","drawSel","cursorLayer","requestMeasure","setBlinkRate","blinkRate","animationDuration","selectionSet","geometryChanged","viewportChanged","animationName","configChanged","scheduleRedraw","prim","piece","measureCursor","oldCursors","children","themeSpec","backgroundColor","caretColor","background","border","whiteSpace","outline","hideNativeSelection","Prec","highest","theme","fatCursor","hCoeff","textDirection","Direction","LTR","right","getBase","domAtPos","HTMLElement","childNodes","parentNode","getComputedStyle","coordsForChar","nextPos","FIREFOX_LINUX","userAgent","Vim","vimStyle","baseTheme","display","padding","minHeight","vimPlugin","ViewPlugin","fromClass","decorations","Decoration","none","waitForCopy","lastKeydown","useNextTextInput","compositionText","blockCursor","updateClass","updateStatus","statusbar","showVimPanel","cssText","statusButton","docChanged","transactions","is","classList","builder","RangeSetBuilder","visibleRanges","l","matchMark","eventHandlers","copy","Promise","compositionstart","compositionupdate","compositionend","keypress","keydown","provide","inputHandler","getCM","composing","toRemove","dispatchEvent","CustomEvent","sibling","nextSibling","savedSelection","anchorNode","focusNode","focusOffset","insertBefore","setPosition","extend","forceEndComposition","v","vimPanelState","StateField","showPanel","createVimPanel","statusPanel"],"mappings":"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","x_google_ignoreList":[0,1]}