You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
1.0 KiB
30 lines
1.0 KiB
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) |
|
}) |
|
}
|
|
|