Как найти эквивалент позиции в iTextEdit EditPoint.AbsoluteCharOffset - PullRequest
1 голос
/ 14 октября 2010

Я пытаюсь удалить тело класса, используя новую модель кода текстового редактора в расширении Visual Studio 2010.То есть я пытаюсь использовать метод Delete в ITextEdit, чтобы удалить все в фигурных скобках.

Я могу получить доступ к абсолютной позиции символов начала и конца класса, используя

*Методы 1004 *

и

codeClass.GetEndPoint(vsCMPart.vsCMPartBody).CreateEditPoint().AbsoluteCharOffset

в интерфейсе CodeClass.Если я получу ITextEdit из текущего ITextBuffer IWpfTextViewHost, а затем попытаюсь удалить:

iTextEdit.Delete(startCharOffset, endCharOffset - startCharOffset); 

, удаление будет невернымПохоже, что нет сопоставления 1: 1 между AbsoluteCharOffset на старой модели и положением в новой текстовой модели.

Как мне взаимодействовать между двумя моделями?

Заранее спасибо за помощь.

1 Ответ

5 голосов
/ 14 октября 2010

AbsoluteCharOffset возвращает значение, которое на самом деле не является абсолютным смещением символа, поскольку оно всегда считает символы разрыва строки как 1 символ длиной , даже если "\ r \ n", вероятно, используется вашим файлом , Лучший способ выполнить перевод - это получить номер строки и смещение столбца, возможно, вспомогательный метод, например:

SnapshotPoint SnapshotPointFromEditPoint(EditPoint editPoint, ITextSnapshot snapshot)
{
    int lineNumber = editPoint.Line - 1;
    int offset = editPoint.LineCharOffset - 1;
    return snapshot.GetLineFromLineNumber(lineNumber).Start + offset;
}

(Я только что узнал об этом несколько месяцев назад, из-за проблемы с производительностью в Dev10, когда вычисление AbsoluteCharOffset действительно дорого. Я бы рекомендовал избегать его везде, где только можно)

...