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

Ste*_*lis 1 visual-studio-2010 vs-extensibility

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

我可以使用.访问类的开头和结尾的绝对字符位置

codeClass.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint().AbsoluteCharOffset
Run Code Online (Sandbox Code Playgroud)

codeClass.GetEndPoint(vsCMPart.vsCMPartBody).CreateEditPoint().AbsoluteCharOffset
Run Code Online (Sandbox Code Playgroud)

CodeClass接口上的方法.如果我从当前的IWpfTextViewHost的ITextBuffer获取ITextEdit,然后尝试删除:

iTextEdit.Delete(startCharOffset, endCharOffset - startCharOffset); 
Run Code Online (Sandbox Code Playgroud)

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

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

在此先感谢您的帮助.

Noa*_*rds 5

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;
}
Run Code Online (Sandbox Code Playgroud)

(几个月前我刚刚从Dev10中的性能问题中了解到这一点,在这个问题上,计算AbsoluteCharOffset真的非常昂贵.我建议你尽可能避免使用它)