1

我正在尝试在 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 的映射。

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

在此先感谢您的帮助。

4

1 回答 1

5

AbsoluteCharOffset返回一个实际上不是绝对字符偏移的值,因为它总是将换行符计为 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非常昂贵。我建议尽可能避免使用它)

于 2010-10-14T15:25:17.730 回答