| 123456789101112131415161718192021222324252627282930 |
- 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)
- })
- }
|