From: Kornel Benko Date: Mon, 11 Feb 2019 12:06:02 +0000 (+0100) Subject: FindAdv: Try to find real start of found match X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=2776dc004b9bd5251b21ebedcb04de335c6faefe;p=features.git FindAdv: Try to find real start of found match Sometime it happen that the selection contains area which was skipped in splitOnKnownMacros(). So we check, if a shorter selection would give the same mach size. --- diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index 32e9f2cbbf..d34a7219f3 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -2903,6 +2903,39 @@ int findAdvFinalize(DocIterator & cur, MatchStringAdv const & match) len = (int)((maxl + minl)/2); } } + old_cur = cur; + // Search for real start of matched characters + while (len > 1) { + int actual_match; + do { + cur.forwardPos(); + } while (cur.depth() > old_cur.depth()); /* Skip inner insets */ + if (cur.depth() < old_cur.depth()) { + // Outer inset? + LYXERR0("cur.depth() < old_cur.depth(), this should never happen"); + break; + } + if (cur.pos() != old_cur.pos()) { + // OK, forwarded 1 pos in actual inset + actual_match = match(cur, len-1); + if (actual_match == max_match) { + // Ha, got it! The shorter selection has the same match length + len--; + old_cur = cur; + } + else { + // OK, the shorter selection matches less chars, revert to previous value + cur = old_cur; + break; + } + } + else { + LYXERR0("cur.pos() == old_cur.pos(), this should never happen"); + actual_match = match(cur, len); + if (actual_match == max_match) + old_cur = cur; + } + } } return len; }