724d2f669844a501d9ca6fc9a81e6f2bf93020458c9169b127871b4cd6be2322244977f34cea08fd132a319153558f6ed6f8400dc3c4e18b6abb9bb5b8523d 1.0 KB

123456789101112131415161718192021222324252627282930
  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. // Helper for deleting text near the selection(s), used to implement
  7. // backspace, delete, and similar functionality.
  8. export function deleteNearSelection(cm, compute) {
  9. let ranges = cm.doc.sel.ranges, kill = []
  10. // Build up a set of ranges to kill first, merging overlapping
  11. // ranges.
  12. for (let i = 0; i < ranges.length; i++) {
  13. let toKill = compute(ranges[i])
  14. while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
  15. let replaced = kill.pop()
  16. if (cmp(replaced.from, toKill.from) < 0) {
  17. toKill.from = replaced.from
  18. break
  19. }
  20. }
  21. kill.push(toKill)
  22. }
  23. // Next, remove those actual ranges.
  24. runInOp(cm, () => {
  25. for (let i = kill.length - 1; i >= 0; i--)
  26. replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete")
  27. ensureCursorVisible(cm)
  28. })
  29. }