The following patch fixes this bug for me. However I have questions about whether I did it right.
There are 3 mostly independent parts in the patch: - in MathScriptInset::notifyCursorLeave, there were no recordUndoInset calls. This fix seems safe and obvious to me - when doing record undo, the math cell is stored as a string. However, MathScriptInset::write omits empty scripts. I changed this in the script, but I do not know whether there are bad side effects. An alternative would be to add a keepempty member to WriteStream, which would be set to true when in asString. - the part in undo is not really related to the bug (it could be omitted): it ensures that the cursor is set correctly after undoing an recordUndoInset undo. Andre', if you are reading, I'd really appreciate your input. JMarc
Index: src/mathed/math_scriptinset.C =================================================================== --- src/mathed/math_scriptinset.C (revision 14670) +++ src/mathed/math_scriptinset.C (working copy) @@ -19,6 +19,7 @@ #include "cursor.h" #include "debug.h" #include "funcrequest.h" +#include "undo.h" #include <boost/assert.hpp> @@ -432,10 +433,10 @@ void MathScriptInset::write(WriteStream os << "{}"; } - if (hasDown() && down().size()) + if (hasDown() /*&& down().size()*/) os << "_{" << down() << '}'; - if (hasUp() && up().size()) + if (hasUp() /*&& up().size()*/) os << "^{" << up() << '}'; if (lock_ && !os.latex()) @@ -563,15 +564,18 @@ void MathScriptInset::notifyCursorLeaves // Case of two scripts. In this case, 1 = super, 2 = sub if (cur.idx() == 2 && cell(2).empty()) { // must be a subscript... + recordUndoInset(cur); removeScript(false); } else if (cur.idx() == 1 && cell(1).empty()) { // must be a superscript... + recordUndoInset(cur); removeScript(true); } } else if (nargs() > 1 && cur.idx() == 1 && cell(1).empty()) { // could be either subscript or super script + recordUndoInset(cur); removeScript(cell_1_is_up_); -} + } //lyxerr << "MathScriptInset::notifyCursorLeaves: 2 " << cur << endl; } Index: src/undo.C =================================================================== --- src/undo.C (revision 14670) +++ src/undo.C (working copy) @@ -251,7 +251,9 @@ void recordUndoInset(LCursor & cur, Undo { LCursor c = cur; c.pop(); - recordUndo(c, kind); + Buffer * buf = cur.bv().buffer(); + doRecordUndo(kind, c, c.pit(), c.pit(), cur.bv().cursor(), + buf->params(), false, buf->undostack()); }