int FindNextWordOffset(Document doc, int offset, bool subword) { if (offset + 1 >= doc.Length) { return(doc.Length); } int result = offset + 1; CC previous = SW.GetCharacterClass(doc.GetCharAt(result), subword, treat_); bool inIndentifier = previous != CC.Unknown && previous != CC.Whitespace; while (result < doc.Length) { 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 - 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, treat_) != 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, includeUnderscore); bool inIndentifier = previous != CC.Unknown && previous != CC.Whitespace; while (result > 0) { 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++; 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, includeUnderscore) != 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); }