Hi Mario, Le 28/05/2016 10:36, Mario D a écrit : ...
Consider \frac{1}{2} + \left(1+1\right) = 2.5 ^ ^ ^ ^ ^ A B C D E Wherever I am, if I hit ctrl+right I am driven to E. What I would like is that if I am in A I land in B and if I am in C I go to D
...
What I have not been able to understand is which function I should bind to ctrl+right so that this combination drives me from A to B or from C to D instead of from everywhere to E
I agree ctrl+arrows could do better. The attached patch implements your suggestion. Pro: I find this behaviour more useful. It could be made better by skipping strings of characters that constitute "words", but I am not sure how to define this notion properly in mathed. (Jean-Marc speaks of using the rel/bin/op categories to find a criterion, let's think about it.) Con: it is a bit unintuitive that ctrl+arrow behaves differently from ctrl+shift+arrows. But I believe that the current behaviour of ctrl+shift+arrows is fine and should be kept.
Incidentally, I also do not like very much the fact that if in A then shift+right selects all the A-B portion of the formula: in my view, this should be the behavior of ctrl+shift+right, whereas shift+right should select only the very next character (that is, the numerator if I am in A).
Selections in LyX correspond to meaningful objects, not portions of LaTeX code such as \frac{1} in your example. So what you propose for shift+right does not make sense to LyX. As for ctrl+shift+arrows, I find them useful to select entire insets quickly. Guillaume
>From 96d2db292628d3ab588a24574f9e27e8e076484c Mon Sep 17 00:00:00 2001 From: Guillaume Munch <g...@lyx.org> Date: Fri, 27 May 2016 21:00:54 +0100 Subject: [PATCH] Make ctrl+arrow behave like shift+arrow in math Define ctrl+up,down for consistency --- src/mathed/InsetMathGrid.cpp | 4 ---- src/mathed/InsetMathNest.cpp | 54 ++++++++++++++++++++++++-------------------- src/mathed/InsetMathNest.h | 4 ++-- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index b505886..d9cc469 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -1665,8 +1665,6 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_LINE_BEGIN: - case LFUN_WORD_BACKWARD: - case LFUN_WORD_LEFT: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); // fall through case LFUN_LINE_BEGIN_SELECT: @@ -1690,8 +1688,6 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) } break; - case LFUN_WORD_FORWARD: - case LFUN_WORD_RIGHT: case LFUN_LINE_END: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); // fall through diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index 7357b5f..dde674e 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -638,6 +638,10 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CHAR_LEFT: case LFUN_CHAR_BACKWARD: case LFUN_CHAR_FORWARD: + case LFUN_WORD_RIGHT: + case LFUN_WORD_LEFT: + case LFUN_WORD_BACKWARD: + case LFUN_WORD_FORWARD: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); // fall through case LFUN_CHAR_RIGHT_SELECT: @@ -649,6 +653,9 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) || act == LFUN_CHAR_LEFT_SELECT || act == LFUN_CHAR_BACKWARD_SELECT || act == LFUN_CHAR_FORWARD_SELECT); + // enter insets of possible? + bool enter = (act != LFUN_WORD_BACKWARD) && (act != LFUN_WORD_LEFT) + && (act != LFUN_WORD_FORWARD) && (act != LFUN_WORD_RIGHT); // are we moving forward or backwards? // If the command was RIGHT or LEFT, then whether we're moving forward // or backwards depends on the cursor movement mode (logical or visual): @@ -661,18 +668,21 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) FuncCode finish_lfun; if (act == LFUN_CHAR_FORWARD - || act == LFUN_CHAR_FORWARD_SELECT) { + || act == LFUN_CHAR_FORWARD_SELECT + || act == LFUN_WORD_FORWARD) { forward = true; finish_lfun = LFUN_FINISHED_FORWARD; } else if (act == LFUN_CHAR_BACKWARD - || act == LFUN_CHAR_BACKWARD_SELECT) { + || act == LFUN_CHAR_BACKWARD_SELECT + || act == LFUN_WORD_BACKWARD) { forward = false; finish_lfun = LFUN_FINISHED_BACKWARD; } else { bool right = (act == LFUN_CHAR_RIGHT_SELECT - || act == LFUN_CHAR_RIGHT); + || act == LFUN_CHAR_RIGHT + || act == LFUN_WORD_RIGHT); if (lyxrc.visual_cursor || !cur.reverseDirectionNeeded()) forward = right; else @@ -688,7 +698,8 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.clearTargetX(); cur.macroModeClose(); // try moving forward or backwards as necessary... - if (!(forward ? cursorMathForward(cur) : cursorMathBackward(cur))) { + if (!(forward ? cursorMathForward(cur, enter) + : cursorMathBackward(cur, enter))) { // ... and if movement failed, then finish forward or backwards // as necessary cmd = FuncRequest(finish_lfun); @@ -699,10 +710,14 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_DOWN: case LFUN_UP: + case LFUN_PARAGRAPH_UP: + case LFUN_PARAGRAPH_DOWN: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); // fall through case LFUN_DOWN_SELECT: - case LFUN_UP_SELECT: { + case LFUN_UP_SELECT: + case LFUN_PARAGRAPH_UP_SELECT: + case LFUN_PARAGRAPH_DOWN_SELECT: { // close active macro if (cur.inMacroMode()) { cur.macroModeClose(); @@ -710,8 +725,10 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) } // stop/start the selection - bool select = act == LFUN_DOWN_SELECT || - act == LFUN_UP_SELECT; + bool select = act == LFUN_DOWN_SELECT + || act == LFUN_UP_SELECT + || act == LFUN_PARAGRAPH_DOWN_SELECT + || act == LFUN_PARAGRAPH_UP_SELECT; cur.selHandle(select); // handle autocorrect: @@ -721,7 +738,8 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) } // go up/down - bool up = act == LFUN_UP || act == LFUN_UP_SELECT; + bool up = act == LFUN_UP || act == LFUN_UP_SELECT + || act == LFUN_PARAGRAPH_UP || act == LFUN_PARAGRAPH_UP_SELECT; bool successful = cur.upDownInMath(up); if (successful) break; @@ -755,17 +773,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.bv().cursor() = cur; break; - case LFUN_PARAGRAPH_UP: - case LFUN_PARAGRAPH_DOWN: - cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); - // fall through - case LFUN_PARAGRAPH_UP_SELECT: - case LFUN_PARAGRAPH_DOWN_SELECT: - break; - case LFUN_LINE_BEGIN: - case LFUN_WORD_BACKWARD: - case LFUN_WORD_LEFT: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); // fall through case LFUN_LINE_BEGIN_SELECT: @@ -789,8 +797,6 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) } break; - case LFUN_WORD_FORWARD: - case LFUN_WORD_RIGHT: case LFUN_LINE_END: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); // fall through @@ -2075,9 +2081,9 @@ void InsetMathNest::completionPosAndDim(Cursor const & cur, int & x, int & y, } -bool InsetMathNest::cursorMathForward(Cursor & cur) +bool InsetMathNest::cursorMathForward(Cursor & cur, bool enter) { - if (cur.pos() != cur.lastpos() && cur.openable(cur.nextAtom())) { + if (enter && cur.pos() != cur.lastpos() && cur.openable(cur.nextAtom())) { cur.pushBackward(*cur.nextAtom().nucleus()); cur.inset().idxFirst(cur); return true; @@ -2093,9 +2099,9 @@ bool InsetMathNest::cursorMathForward(Cursor & cur) } -bool InsetMathNest::cursorMathBackward(Cursor & cur) +bool InsetMathNest::cursorMathBackward(Cursor & cur, bool enter) { - if (cur.pos() != 0 && cur.openable(cur.prevAtom())) { + if (enter && cur.pos() != 0 && cur.openable(cur.prevAtom())) { cur.posBackward(); cur.push(*cur.nextAtom().nucleus()); cur.inset().idxLast(cur); diff --git a/src/mathed/InsetMathNest.h b/src/mathed/InsetMathNest.h index b9cc1f6..8d383d0 100644 --- a/src/mathed/InsetMathNest.h +++ b/src/mathed/InsetMathNest.h @@ -190,9 +190,9 @@ private: /// afterwards if found bool findMacroToFoldUnfold(Cursor & searchCur, bool fold) const; /// move cursor forward - bool cursorMathForward(Cursor & cur); + bool cursorMathForward(Cursor & cur, bool enter = true); /// move cursor backwards - bool cursorMathBackward(Cursor & cur); + bool cursorMathBackward(Cursor & cur, bool enter = true); protected: /// we store the cells in a vector -- 2.7.4