annotate .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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 import { runInOp } from "../display/operations.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { ensureCursorVisible } from "../display/scrolling.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { cmp } from "../line/pos.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { replaceRange } from "../model/changes.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 import { lst } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 // Helper for deleting text near the selection(s), used to implement
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 // backspace, delete, and similar functionality.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 export function deleteNearSelection(cm, compute) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 let ranges = cm.doc.sel.ranges, kill = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 // Build up a set of ranges to kill first, merging overlapping
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 // ranges.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 for (let i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 let toKill = compute(ranges[i])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 let replaced = kill.pop()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 if (cmp(replaced.from, toKill.from) < 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 toKill.from = replaced.from
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 break
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 kill.push(toKill)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 // Next, remove those actual ranges.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 runInOp(cm, () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 for (let i = kill.length - 1; i >= 0; i--)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 ensureCursorVisible(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 }