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