openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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 }