X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCursor.cpp;h=eff32d05769bf650b7f6846c586efdaf19fa5267;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=758cef9a77e9ec51fcfe28cd046492f4b6d0c004;hpb=b034389e6def020d5201d59f6bab901453c3b5af;p=lyx.git diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 758cef9a77..eff32d0576 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -1738,11 +1738,23 @@ bool Cursor::mathForward(bool word) LASSERT(inMathed(), return false); if (pos() < lastpos()) { if (word) { - // word: skip a group of insets with same math class + // word: skip a group of insets of the form X*(B*|R*|P*) (greedy + // match) where X is any math class, B is mathbin, R is mathrel, and + // P is mathpunct. Make sure that the following remains true: + // mathForward(true); mathBackward(true); mathForward(true) + // is the same as mathForward(true) and + // mathBackward(true); mathForward(true); mathBackward(true) + // is the same as mathBackward(true). MathClass mc = nextMath().mathClass(); do posForward(); while (pos() < lastpos() && mc == nextMath().mathClass()); + if (pos() < lastpos() && + ((mc = nextMath().mathClass()) == MC_BIN || + mc == MC_REL || mc == MC_PUNCT)) + do + posForward(); + while (pos() < lastpos() && mc == nextMath().mathClass()); } else if (openable(nextAtom())) { // single step: try to enter the next inset pushBackward(nextMath()); @@ -1767,11 +1779,17 @@ bool Cursor::mathBackward(bool word) LASSERT(inMathed(), return false); if (pos() > 0) { if (word) { - // word: skip a group of insets with same math class + // word: skip a group of insets. See the comment in mathForward. MathClass mc = prevMath().mathClass(); do posBackward(); while (pos() > 0 && mc == prevMath().mathClass()); + if (pos() > 0 && (mc == MC_BIN || mc == MC_REL || mc == MC_PUNCT)) { + mc = prevMath().mathClass(); + do + posBackward(); + while (pos() > 0 && mc == prevMath().mathClass()); + } } else if (openable(prevAtom())) { // single step: try to enter the preceding inset posBackward(); @@ -1906,10 +1924,13 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded) int yo = bv().getPos(*this).y_; Cursor old = *this; // To next/previous row + // FIXME: the y position is often guessed wrongly across styles and + // insets, which leads to weird behaviour. if (up) tm.editXY(*this, xo, yo - textRow().ascent() - 1); else tm.editXY(*this, xo, yo + textRow().descent() + 1); + x_target_ = old.x_target_; clearSelection(); // This happens when you move out of an inset.