我正在尝试使用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映射。
我如何在两个模型之间进行交互?
提前感谢您的帮助。
答案 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
非常昂贵。我建议你尽可能避免使用它。)