int FindNextWordOffset (TextDocument doc, int offset, bool subword) { if (offset + 1 >= doc.TextLength) return doc.TextLength; int result = offset + 1; CC previous = SW.GetCharacterClass (doc.GetCharAt (result), subword, includeUnderscore); bool inIndentifier = previous != CC.Unknown && previous != CC.Whitespace; while (result < doc.TextLength) { char ch = doc.GetCharAt (result); CC current = SW.GetCharacterClass (ch, subword, includeUnderscore); //camelCase / PascalCase splitting if (subword) { if (current == CC.Digit && (previous != CC.Digit || (result-1 == offset && !Char.IsDigit (doc.GetCharAt (result-1))))) { break; } else if (previous == CC.Digit && current != CC.Digit) { break; } else if (current == CC.UppercaseLetter && previous != CC.UppercaseLetter) { break; } else if (current == CC.LowercaseLetter && previous == CC.UppercaseLetter && result - 2 > 0 && SW.GetCharacterClass (doc.GetCharAt (result - 2), subword, includeUnderscore) != CC.LowercaseLetter) { result--; break; } } //else break at end of identifiers if (previous != CC.Unknown && previous != CC.Whitespace) { inIndentifier = true; } else if (inIndentifier) { result--; break; } previous = current; result++; } foreach (FoldSegment segment in doc.GetFoldingsFromOffset (result)) { if (segment.IsFolded) result = System.Math.Max (result, segment.EndLine.Offset + segment.EndColumn); } return result; }
int FindPrevWordOffset (TextDocument doc, int offset, bool subword) { if (offset <= 0) return 0; int result = offset - 1; CC previous = SW.GetCharacterClass (doc.GetCharAt (result), subword, treat_); bool inIndentifier = previous != CC.Unknown && previous != CC.Whitespace; while (result > 0) { char ch = doc.GetCharAt (result); CC current = SW.GetCharacterClass (ch, subword, treat_); //camelCase / PascalCase splitting if (subword) { if (current == CC.Digit && previous != CC.Digit) { result++; break; } else if (previous == CC.Digit && current != CC.Digit) { result++; break; } else if (current == CC.UppercaseLetter && previous != CC.UppercaseLetter) { break; } else if (current == CC.LowercaseLetter && previous == CC.UppercaseLetter && result + 2 < doc.TextLength && SW.GetCharacterClass (doc.GetCharAt (result + 2), subword, treat_) != CC.LowercaseLetter) { result++; break; } } //else break at end of identifiers if (previous != CC.Unknown && previous != CC.Whitespace) { inIndentifier = true; } else if (inIndentifier) { result += 2; break; } previous = current; result--; } foreach (FoldSegment segment in doc.GetFoldingsFromOffset (result)) { if (segment.IsFolded) result = System.Math.Min (result, segment.StartLine.Offset + segment.Column); } return result; }