Potrzebowałem napisać plugin, który swóją funkcjonalnością przypominać będzie CopySourceAsHTML tyle, że zamiast HTML’a produkował będzie źródło LaTeX, jako, że używam go do pisania wszystkiego co ma mieć objętość powyżej 1 strony. LaTeX ma już pakiet umożliwiający formatowanie kodu (listings), ale nie chce przepisywać linijka po linijce kodu – chcę, aby zostało to automatycznie zrobione.

Wcześniej nie pisałem plug-in’ów do VS a poniżej moje spostrzeżenia, uwagi i (może dla kogoś) rady…

Moje uwagi, wnioski i komentarze:

  • duży plus za wizard. Pozwala od razu zacząć pracę nad treścią plug-in’a a nie skupiać się na technicznych detalach jak to wszystko do kupy poskładać
  • dokumentacja w tym przypadku to koszmar. Zwykle nie narzekam na MSDN, ale w tym przypadku to co oferuje rozczarowuje (lekko mówiąc). Praktycznie zero przykładów użycia
  • odpal Reflectora i podglądaj cudze przykłady. Inaczej z nauką będzie kiepsko
  • kolory zdefiniowane dla VS przechowywane są w jakimś dziwnym formacie zamiast ARGB jest ABGR. Zwykłe Color.FromArgb nie zadziała tak jak się tego spodziewamy :(.
  • aby dostać się do właściwości VS, użyj poniższego kodu. Pamiętaj, żeby usunąc spacje z nazwy (“Fonts and Colors” -> “FontsAndColors”):

    _applicationObject.get_Properties(“FontsAndColors”, “TextEditor”)

  • dodanie pozycji do menu kontekstowego to również nie lada wyczyn – należy dostać się do menu o nazwie Code Window – tym razem nazwa ze spacjami :/

    var menuBarCommandBar =

            ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars);

     

    Command viewCommand = commands.AddNamedCommand2(_addInInstance,

                          “CopyAsLaTeXAddIn”, “CopyAsLaTeXAddIn”,

                          “Executes the command for CopyAsLaTeXAddIn”, true, 0x13,

                          ref contextGUIDS,

                          (int)vsCommandStatus.vsCommandStatusSupported +

                          (int)vsCommandStatus.vsCommandStatusEnabled,

                          (int)vsCommandStyle.vsCommandStylePictAndText,

                          vsCommandControlType.vsCommandControlTypeButton);

    viewCommand.AddControl(menuBarCommandBar[“Code Window”], 1);

  • zero informacji o tym jaki ID jest skojarzony z jaką ikonką – trzeba błądzić po omacku 🙁

Jak tylko doprowadzę mój plugin do stanu akceptowalnego (ma działać w takim zakresie jak go potrzebuję – nie ma być to coś super, ale zostało mi jeszcze wymyślenie jak zrobić kolorowanie klas 🙁 ), opublikuję go – może komuś się przyda.