diff .cms/lib/codemirror/src/edit/deleteNearSelection.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.cms/lib/codemirror/src/edit/deleteNearSelection.js	Fri Oct 11 22:40:23 2024 +0000
@@ -0,0 +1,30 @@
+import { runInOp } from "../display/operations.js"
+import { ensureCursorVisible } from "../display/scrolling.js"
+import { cmp } from "../line/pos.js"
+import { replaceRange } from "../model/changes.js"
+import { lst } from "../util/misc.js"
+
+// Helper for deleting text near the selection(s), used to implement
+// backspace, delete, and similar functionality.
+export function deleteNearSelection(cm, compute) {
+  let ranges = cm.doc.sel.ranges, kill = []
+  // Build up a set of ranges to kill first, merging overlapping
+  // ranges.
+  for (let i = 0; i < ranges.length; i++) {
+    let toKill = compute(ranges[i])
+    while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
+      let replaced = kill.pop()
+      if (cmp(replaced.from, toKill.from) < 0) {
+        toKill.from = replaced.from
+        break
+      }
+    }
+    kill.push(toKill)
+  }
+  // Next, remove those actual ranges.
+  runInOp(cm, () => {
+    for (let i = kill.length - 1; i >= 0; i--)
+      replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete")
+    ensureCursorVisible(cm)
+  })
+}