Please try this patch for second approach. Please make sure I'm not breaking anything. See discussion here http://bugzilla.lyx.org/show_bug.cgi?id=3551
Index: Text2.cpp =================================================================== --- Text2.cpp (revision 18129) +++ Text2.cpp (working copy) @@ -915,8 +915,12 @@ bool Text::cursorLeft(Cursor & cur) { + bool direction = false; + if (isRTL(*cur.bv().buffer(), cur.paragraph())) + direction = !direction; // Tell BufferView to test for FitCursor in any case! cur.updateFlags(Update::FitCursor); + if (!cur.boundary() && cur.pos() > 0 && cur.textRow().pos() == cur.pos() && @@ -926,7 +930,7 @@ } if (cur.pos() != 0) { bool updateNeeded = setCursor(cur, cur.pit(), cur.pos() - 1, true, false); - if (!checkAndActivateInset(cur, false)) { + if (!checkAndActivateInset(cur, direction)) { /** FIXME: What's this cause purpose??? bool boundary = cur.boundary(); if (false && !boundary && @@ -949,6 +953,9 @@ bool Text::cursorRight(Cursor & cur) { // Tell BufferView to test for FitCursor in any case! + bool direction = true; + if (isRTL(*cur.bv().buffer(), cur.paragraph())) + direction = !direction; cur.updateFlags(Update::FitCursor); if (cur.pos() != cur.lastpos()) { @@ -957,7 +964,7 @@ true, false); bool updateNeeded = false; - if (!checkAndActivateInset(cur, true)) { + if (!checkAndActivateInset(cur, direction)) { if (cur.textRow().endpos() == cur.pos() + 1 && cur.textRow().endpos() != cur.lastpos() && !cur.paragraph().isLineSeparator(cur.pos()) && Index: Cursor.cpp =================================================================== --- Cursor.cpp (revision 18129) +++ Cursor.cpp (working copy) @@ -360,10 +360,14 @@ { BOOST_ASSERT(!empty()); //lyxerr << "Leaving inset to the left" << endl; + const pos_type lp = (depth() > 1) ? (*this)[depth() - 2].lastpos() : 0; inset().notifyCursorLeaves(*this); if (depth() == 1) return false; pop(); + if (depth() == 1 && isRTL()) { + pos() += lastpos() - lp + 1; + } return true; } @@ -376,8 +380,11 @@ inset().notifyCursorLeaves(*this); if (depth() == 1) return false; + pop(); - pos() += lastpos() - lp + 1; + if (!(depth() == 1 && isRTL())) { + pos() += lastpos() - lp + 1; + } return true; }