2013-08-26 64 views
1

我正在爲Visual Studio中的自定義語言創建代碼完成。我已經有了一些簡單的編輯器交互的代碼,比如語法高亮和大括號匹配。現在我想轉到代碼完成。但是我遇到了一個小問題 - 數據源。Visual Studio擴展代碼完成 - 多個文件數據

就像在C#語言中一樣,我隱式地在多個文件之間共享代碼。這意味着,爲了編碼完成一個文件,我需要知道其他文件的內容。更具體地說,雖然我可以簡單地遍歷項目和項目項目並破解文件,但這是一個不理想的解決方案。例如,我將無法編寫完整的未保存的用戶所做的更改。另一方面,我已經做了大量的處理工作,或者解析內容以滿足用戶對語法突出顯示的要求,而且我也不想重複這些工作。

如何訪問項目中其他文件的內容並獲取其ITextBuffers,以便重新使用我已完成的工作?

回答

2

沒有ITextBuffer爲磁盤上存在的文件提供,但當前未在Visual Studio中打開。通過使用ITextDocumentFactoryService::CreateAndLoadDocument可以爲任意任意文件創建ITextBuffer的實例。這需要一個字符串,並會返回一個ITextDocument實例,您可以從中訪問ITextBuffer

爲了找到當前打開的,你可以做的文件現有ITextBuffer以下

  • IVsRunningDocumentTable::FindDocument這需要一個文件路徑並返回表示該文件一個cookie,如果它是當前打開(Example
  • IVsRunningDocumentTable::GetDocumentInfo這需要一個cookie,並返回一個IVsTextLines實例(Example
  • IVsEditorAdaptersFactoryService::GetDataBuffer需要一個IVsTextLines並還給了ITextBufferExample
+1

如果我爲沒有打開的文件創建自己的TextBuffer,如果用戶試圖打開它們,IDE會重新使用它們嗎? – Puppy

+0

另外,我正在查看IVsRunningDocumentTable的文檔,並且界面並不那麼相似。例如,我只能從GetDocumentInfo獲得一個IVsHierarchy。 – Puppy

+0

@DeadMG我添加了示例代碼的鏈接,它向您展示瞭如何從'GetDocumentInfo'獲取'IVsTextLine'實例。我在飛行中輸入並忘記它在'IVsTextLines'的結構上存儲爲'object',並且需要一些施法魔法。 – JaredPar

相關問題