2010-10-14 22 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真的很貴,我建議你可以避開它)

相關問題