2010-11-03 54 views
6

我一直想爲Visual Studio創建一個簡單的文本操作擴展一段時間,現在我終於找到了一些時間來研究擴展如何編寫。我想到的可以通過VBA宏來實現,但我寧願將它實現爲「真正」的擴展;作爲一個學習過程,並且因爲我誠實地無法忍受VBA。創建一個簡單的文本操作Visual Studio 2010擴展

經過大量的谷歌搜索,博客閱讀,挖掘到MSDN和瀏覽StackOverflow帖子後,我想我已經收集了足夠的信息來實現它 - 但是我想要一些關於我是否正在接觸事物的反饋之前,我開始劈砍而去:)

我想的是:

  1. 註冊用戶可以通過工具 - >選項 - >鍵盤綁定的熱鍵命令。
  2. 調用命令時修改活動窗口的文本緩衝區。
  3. 我真的不關心菜單或工具欄,但知道如何將它通過.vsct添加文件(有更好的選擇?)

#1,看來我也做了充分的VSPackage的,.vsct文件等等 - 我可以用它來處理不好的MEF擴展點嗎? (也許導出一個IWpfTextViewCreationListener和擺弄手動鍵盤快捷鍵處理 - 但這是一個重大的黑客攻擊)。

對於#2,我不確定如何獲取活動文檔的ITextBuffer。我可以通過DTE.ActiveDocument,但我不知道如何從中獲得ITextBuffer。另外,我可以做一些沿線...

var txtMgr = (IVsTextManager)ServiceProvider.GetService(typeof(SVsTextManager)); 
IVsTextView textViewCurrent; 
txtMgr.GetActiveView(true, null, out textView); 
IWpfTextView wpfViewCurrent = AdaptersFactory.GetWpfTextView(textView); 
ITextBuffer textCurrent = wpfViewCurrent.TextBuffer; 

...但那肯定看起來像一個迂迴的做事方式?

回答

9

對於這兩個,請看Align Assignments extension source。它是一個包/ MEF組件,它添加一個命令並在活動窗口中處理它。

您對#1的回答是正確的。執行命令的最佳方式是使用.vsct文件,該文件需要一個包。但是,所有包的含義是,您的項目將生成一個帶有嵌入式資源(來自.vsct文件)和.pkgdef文件的dll,該文件根據您在包中提供的屬性添加註冊表項。它(希望)沒有太多的開銷。

對於第二個問題,有一個更清晰的方法。看看command filter,它在活動視圖中偵聽命令,而不是全局偵聽,然後找到活動視圖。它讓shell處理命令路由並只集中於實現。

+0

謝謝!有一些關於爲每個VsTextView添加一個過濾器讓我感到有些不耐煩,但是解決方案*是*更好。太糟糕了,仍然需要處理醜陋的com/ole遺留問題,但至少它是微乎其微的,可以被抽象掉:) – snemarch 2010-11-04 10:10:13

0

不完全知道你所說的「文本緩衝區」,但假設你的意思是無論是當前的文本文件,它是開放的或當前選擇的意思,這裏是一些代碼,我有一個包來訪問這些:

EnvDTE.DTE app = (EnvDTE.DTE)GetService(typeof(SDTE)); 
if (app.ActiveDocument != null && app.ActiveDocument.Type == "Text") 
{ 
    EnvDTE.TextDocument text = (EnvDTE.TextDocument)app.ActiveDocument.Object(String.Empty); 
    if (!text.Selection.IsEmpty) 
    { 
     //work with text.Selection.Text 
    } 
} 

當然,如果你在做一個編輯器擴展,它會有所不同。

+0

我的意思是獲取當前/活動文檔的ITextBuffer - 這是與文本編輯服務進行交互的新方法,而不是更有限的DTE /選擇方法。 – snemarch 2010-11-03 11:24:56