- // overlapping only with insert and delete inside one paragraph:
- // nobody wants all removed character appear one by one when undoing.
- if (!undo_finished && kind != Undo::ATOMIC) {
- // Check whether storing is needed.
- if (!buf.undostack().empty()
- && buf.undostack().top().kind == kind
- && buf.undostack().top().first_par == first_par
- && buf.undostack().top().end_par == end_par) {
- // No additonal undo recording needed -
- // effectively, we combine undo recordings to one.
- return;
- }
- }
-
- // push and fill the Undo entry
- if (cur.inTexted()) {
- stack.push(Undo());
- LyXText * text = cur.text();
- int textnum;
- ParIterator pit = text2pit(buf, text, textnum);
- Undo & undo = stack.top();
- undo.kind = kind;
- undo.text = textnum;
- undo.index = pit.index();
- undo.first_par = first_par;
- undo.end_par = end_par;
- undo.cursor_par = cur.par();
- undo.cursor_pos = cur.pos();
- undo.math = false;
- //lyxerr << "undo record: " << stack.top() << std::endl;
-
- // record the relevant paragraphs
- ParagraphList & plist = text->paragraphs();
- ParagraphList::iterator first = plist.begin();
- advance(first, first_par);
- ParagraphList::iterator last = plist.begin();
- advance(last, last_par);
+ // As nobody wants all removed character appear one by one when undoing,
+ // we want combine 'similar' non-ATOMIC undo recordings to one.
+ if (!undo_finished
+ && kind != Undo::ATOMIC
+ && !stack.empty()
+ && samePar(stack.top().cell, undo.cell)
+ && stack.top().kind == undo.kind
+ && stack.top().from == undo.from
+ && stack.top().end == undo.end)
+ return;