如何在EditPoint.AbsoluteCharOffset的iTextEdit中找到等效位置

时间:2010-10-14 14:05:15

标签: visual-studio-2010 vs-extensibility

我正在尝试使用Visual Studio 2010扩展中的新文本编辑器代码模型删除类主体。也就是说,我正在尝试在ITextEdit上使用Delete方法删除大括号之间的所有内容。

我可以使用

访问班级开头和结尾的绝对角色位置
codeClass.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint().AbsoluteCharOffset

codeClass.GetEndPoint(vsCMPart.vsCMPartBody).CreateEditPoint().AbsoluteCharOffset
CodeClass接口上的

方法。如果我从当前的IWpfTextViewHost的ITextBuffer获取ITextEdit,然后尝试删除:

iTextEdit.Delete(startCharOffset, endCharOffset - startCharOffset); 

删除不正确。看来旧模型上的AbsoluteCharOffset与新文本模型中的位置之间没有1:1映射。

我如何在两个模型之间进行交互?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

AbsoluteCharOffset返回一个实际上不是绝对字符偏移量的值,因为always counts line break characters as 1 character long,即使“\ 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非常昂贵。我建议你尽可能避免使用它。)