Smarter Ctrl+{Left,Right} in math.

Consider mathbin, mathrel and mathpunct as word separators. This makes
Ctrl+{Left,Right} more intuitive, quicker, and more different from {Left,Right}.

This takes into account all the feedback from the discussion on the general
list. Further feedback welcome.
This commit is contained in:
Guillaume MM 2017-05-09 23:28:32 +02:00
parent 18bdb38f30
commit f3594cb3eb

View File

@ -1738,11 +1738,23 @@ bool Cursor::mathForward(bool word)
LASSERT(inMathed(), return false); LASSERT(inMathed(), return false);
if (pos() < lastpos()) { if (pos() < lastpos()) {
if (word) { 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(); MathClass mc = nextMath().mathClass();
do do
posForward(); posForward();
while (pos() < lastpos() && mc == nextMath().mathClass()); 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())) { } else if (openable(nextAtom())) {
// single step: try to enter the next inset // single step: try to enter the next inset
pushBackward(nextMath()); pushBackward(nextMath());
@ -1767,11 +1779,17 @@ bool Cursor::mathBackward(bool word)
LASSERT(inMathed(), return false); LASSERT(inMathed(), return false);
if (pos() > 0) { if (pos() > 0) {
if (word) { 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(); MathClass mc = prevMath().mathClass();
do do
posBackward(); posBackward();
while (pos() > 0 && mc == prevMath().mathClass()); 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())) { } else if (openable(prevAtom())) {
// single step: try to enter the preceding inset // single step: try to enter the preceding inset
posBackward(); posBackward();