- // If old.pos() == 0 and old.pos()(1) == LineSeparator
- // delete the LineSeparator.
- // MISSING
-
- // If old.pos() == 1 and old.pos()(0) == LineSeparator
- // delete the LineSeparator.
- // MISSING
-
- // Find a common inset and the corresponding depth.
- size_t depth = 0;
- for (; depth < cur.depth(); ++depth)
- if (&old.inset() == &cur[depth].inset())
- break;
-
- // Whether a common inset is found and whether the cursor is still in
- // the same paragraph (possibly nested).
- bool const same_par = depth < cur.depth() && old.idx() == cur[depth].idx()
- && old.pit() == cur[depth].pit();
- bool const same_par_pos = depth == cur.depth() - 1 && same_par
- && old.pos() == cur[depth].pos();
-
- // If the chars around the old cursor were spaces, delete some of
- // them, but only if the cursor has really moved.
- if (!same_par_pos) {
- // find range of spaces around cursors
- pos_type from = old.pos();
- while (from > 0
- && oldpar.isLineSeparator(from - 1)
- && !oldpar.isDeleted(from - 1))
- --from;
- pos_type to = old.pos();
- while (to < oldpar.size() - 1
- && oldpar.isLineSeparator(to)
- && !oldpar.isDeleted(to))
- ++to;
-
- int num_spaces = to - from;
-
- // If we are not at the extremity of the paragraph, keep one space
- if (from != to && from > 0 && to < oldpar.size())
- --num_spaces;
-
- // If cursor is inside range, keep one additional space
- if (same_par && cur.pos() > from && cur.pos() < to)
- --num_spaces;
-
- // Remove spaces and adapt cursor.
- if (num_spaces > 0) {
- // delete first spaces marked as inserted
- int pos = from;
- int ns = num_spaces;
- while (pos < to && ns > 0) {
- Change const & change = oldpar.lookupChange(pos);
- if (change.inserted() && change.currentAuthor()) {
- oldpar.eraseChar(pos, cur.buffer()->params().track_changes);
- --ns;
- --to;
- } else
- ++pos;
- }
-
- // Then remove remaining spaces
- oldpar.eraseChars(from, from + ns, cur.buffer()->params().track_changes);
- // correct cur position
- // FIXME: there can be other cursors pointing there, we should update them
- if (same_par) {
- if (cur[depth].pos() >= to)
- cur[depth].pos() -= num_spaces;
- else if (cur[depth].pos() > from)
- cur[depth].pos() = min(from + 1, old.lastpos());
- need_anchor_change = true;
- }
- return true;
+ // find range of spaces around cursors
+ pos_type from = old.pos();
+ while (from > 0
+ && oldpar.isLineSeparator(from - 1)
+ && !oldpar.isDeleted(from - 1))
+ --from;
+ pos_type to = old.pos();
+ while (to < old.lastpos()
+ && oldpar.isLineSeparator(to)
+ && !oldpar.isDeleted(to))
+ ++to;
+
+ int num_spaces = to - from;
+ // If we are not at the start of the paragraph, keep one space
+ if (from != to && from > 0)
+ --num_spaces;
+
+ // If cursor is inside range, keep one additional space
+ if (same_par && cur.pos() > from && cur.pos() < to)
+ --num_spaces;
+
+ // Remove spaces and adapt cursor.
+ if (num_spaces > 0) {
+ old.recordUndo();
+ int const deleted =
+ deleteSpaces(oldpar, from, to, num_spaces, trackChanges);
+ // correct cur position
+ // FIXME: there can be other cursors pointing there, we should update them
+ if (same_par) {
+ if (cur[depth].pos() >= to)
+ cur[depth].pos() -= deleted;
+ else if (cur[depth].pos() > from)
+ cur[depth].pos() = min(from + 1, old.lastpos());
+ need_anchor_change = true;