示例#1
0
        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);
        }