2010-10-14 60 views
1

我想在Visual Studio 2010扩展中使用新的文本编辑器代码模型来删除类体。也就是说,我试图使用ITextEdit上的Delete方法来删除大括号之间的所有内容。如何在EditPoint.AbsoluteCharOffset的iTextEdit中找到相应的位置

我可以使用CodeClass接口上的

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

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

方法可以访问类的起点和终点的绝对字符位置。如果我再拿到从目前IWpfTextViewHost的ITextBuffer的ITextEdit,然后再试着删除:

iTextEdit.Delete(startCharOffset, endCharOffset - startCharOffset); 

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

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

在此先感谢您的帮助。

回答

4

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真的很贵,我建议你可以避开它)

相关问题