2010-11-03 12 views
6

Chciałbym utworzyć proste rozszerzenie manipulacji tekstem dla Visual Studio na chwilę, a teraz mam wreszcie znaleźć czas, aby spojrzeć na to, jak napisane są rozszerzenia. To, co mam na myśli, można osiągnąć za pomocą makr VBA, ale wolę zaimplementować je jako "prawdziwe" rozszerzenie; jako proces uczenia się, a ponieważ szczerze nie mogę znieść VBA.Tworzenie prostego edytora Visual Studio 2010 manipulującego tekstem

Po sporych ilościach googlowania, czytania bloga, kopania w MSDN i przeglądania postów StackOverflow, myślę, że zebrałem wystarczająco dużo informacji, żebym mógł je zaimplementować - ale chciałbym otrzymać informację zwrotną, czy zbliżam się do rzeczy tuż zanim zacznę przerabiać :)

Co chciałbym to:

  1. Rejestrowanie poleceń, które użytkownicy mogą wiązać poprzez skróty klawiszowe do Narzędzia-> Opcje-> klawiatury.
  2. Zmodyfikuj bufor tekstowy aktywnego okna po wywołaniu Poleceń.
  3. nie troszczą się o menu i pasków narzędzi, ale wiem jak go dodać za pomocą plików .vsct (są tam lepsze opcje?)

Dla # 1, wydaje się, muszę zrobić pełną VSPackage , .vsct file et cetera - nie ma łatwego i łatwego punktu rozszerzenia MEF, który mogę obsłużyć zamiast tego? (Być może eksportowanie IWpfTextViewCreationListener i manipulowanie ręczną obsługą skrótów klawiaturowych - ale to byłby poważny hack). Nie ma pewności, jak uzyskać ITextBuffer dla aktywnego dokumentu. Mogę przejść przez DTE.ActiveDocument, ale nie jestem pewien, jak uzyskać z tego ITextBuffer. Alternatywnie, mógłbym zrobić coś na wzór ...

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

... ale to na pewno wygląda jak okrężny sposób robienia rzeczy?

Odpowiedz

9

W obu przypadkach należy spojrzeć na numer Align Assignments extension source. Jest to komponent pakietu/MEF, który dodaje polecenie i obsługuje je w aktywnym oknie.

Twoja odpowiedź na nr 1 jest poprawna. Najlepszym sposobem wykonywania poleceń jest plik .vsct, który wymaga pakietu. Jednak cały pakiet oznacza, że ​​twój projekt będzie produkował bibliotekę dll z osadzonymi zasobami (z pliku .vsct) i pliku .pkgdef, który dodaje klucze rejestru zgodnie z atrybutami podanymi w pakiecie. To (miejmy nadzieję) nie jest zbyt duże.

Dla twojego drugiego pytania, jest czystszy sposób. Spójrz na command filter, który słucha poleceń w aktywnym widoku, zamiast słuchać ich globalnie, a następnie znajdując aktywny widok. Pozwala powłoce obsługiwać routing poleceń i koncentruje się na implementacji.

+0

Dzięki! Jest coś w dodawaniu filtra do każdego VsTextView, co mnie trochę irytuje, ale rozwiązanie * jest * zdecydowanie lepsze.Szkoda, że ​​wciąż mamy do czynienia z brzydkim dziedzictwem com/ole, ale przynajmniej jest to minimalne i można je oderwać :) – snemarch

0

Nie do końca pewien, co masz na myśli przez „bufora tekstowego”, ale przy założeniu, że masz na myśli zarówno bieżący plik tekstowy, który jest otwarty, czy obecny wybór, tutaj jest jakiś kod mam w pakiecie dostęp do tych:

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 
    } 
} 

Oczywiście, jeśli robisz rozszerzenie edytora, byłoby inaczej.

+0

Mam na myśli pobranie ITextBuffer dla bieżącego/aktywnego dokumentu - który jest nowym sposobem na połączenie z usługami edycji tekstu, zamiast bardziej ograniczonych metod DTE/Selection. – snemarch