Rozpoczynając korzystanie z edytora Visual Studio bardzo dotkliwie odczuwałem brak wspomagania dość prostej czynności jaką jest otaczanie nawiasami klamrowymi – analogicznie do edytora Delphi, który wspomaganie pisania konstrukcji begin … end realizował wzorcowo, czyli np. po dopisaniu do:

	if SomeContition then

początkowego begin:

	if SomeContition then
	begin

wystarczyło wcisnąć Entera, aby otrzymać następujący blok gotowy do wypełniania:

	if SomeContition then
	begin
		//tu ustawiał się kursor
	end;

Powodowany niedosytem dostępnych możliwości środowiska, odkryłem wkrótce darmowe narzędzie produkcji Microsoft o nazwie Productivity Power Tools rozszerzające VS o tę umiejętność, jak również o wiele innych. Postaram się przedstawić teraz większość z nich, opierając się na wersji przygotowanej dla VS 2012.

Tytułem wstępu warto podkreślić, że wpływ Productivity Power Tools na zachowania VS jest konfigurowalny. Czyli jeżeli jakieś z udogodnień w naszym mniemaniu nim nie jest, można je swobodnie wyłączyć z poziomu opcji VS (TOOLS -> Options, gałąź: Productivity Power Tools).

To co najbardziej przypadło mi do gustu w tym narzędziu, to uzupełnianie o brakujący element dowolnej pary ograniczników (Auto Brace Completion), tj.: (), {}, [], <>, „”, ”. Jest ono na tyle „inteligentne”, że nie powoduje skutków ubocznych, jeśli bowiem używamy nawiasu otwierającego ( to naturalnie oczekujemy pojawienia się podpowiedzi dotyczącej dostępnych dla wywoływanej metody parametrów, wraz z ich opisem. I tak się właśnie dzieje. Co więcej, jeżeli wywołujemy metodę bezparametrową i z przyzwyczajenia wciśniemy nawias zamykający … nic złego się nie stanie :P. Nie pojawi się dodatkowy niepotrzebny nawias, ten dopisany przez nas zastąpi ów automatyczny. Co więcej, kiedy już pomiędzy nawiasami wpiszemy jakąś treść, nie musimy korzystać z klawisza End (lub Ctrl+]), aby skoczyć za nawias w celu przejścia do kolejnej linii za pomocą klawisza Enter. Mamy tutaj dwa wyjścia: możemy użyć klawisza Tab po czym zostaniemy przeniesieni poza nawias zamykający (teraz możemy wcisnąć Enter), albo wcisnąć kombinację Shift + Enter, a Productivity Power Tools doda za nawiasem zamykającym średnik i przeniesie kursor do nowej pustej linii.

Skoro już wspomniałem o pojawianiu się podpowiedzi dotyczącej parametrów metody, to warto dodać, że podpowiedź ta … nie jest już tą samą podpowiedzią co zwykle :). Otóż parametry i ich typy mają kolorowaną składnię (Colorized Parameter Help).
Kolorowanie składni w opisie parametrów

Kolejnym udogodnieniem, które osobiście bardzo cenię, jest możliwość przejścia do definicji symbolu poprzez wciśnięcie przycisku Ctrl i kliknięcia na nim (Ctrl + Click Go To Definition). Jest to szybsze i wygodniejsze niż użycie standardowego przycisku – ten ma sens wyłącznie wówczas, gdy kursor akurat znajduje się na symbolu, którego definicję chcemy obejrzeć. Zazwyczaj jednak kursor jest gdzie indziej i do symbolu należy jakoś „dotrzeć” – użycie myszy jest tutaj jednak szybsze niż „przeklawiszowanie” się do tego miejsca.

Symbol jako skrót do swojej definicji

Opisane do tej pory funkcjonalności mają zastosowanie w edytorze kodu VS. Productivity Power Tools w tym temacie ma jeszcze do zaoferowania:

  • Normalizowanie wcięć kodu do tabulacji lub spacji (Fix Mixed Tabs), o ile występują obie te konwencje. Działanie podejmowane jest momencie otwarcia pliku i poprzedza je pytanie, czego użyć: spacji czy tabulacji (można też zaniechać normalizacji).
  • Umieszczenie pionowej linii w kolumnie, której programista nie powinien przekraczać, aby kod był widoczny w całości dla każdego członka zespołu (Column Guides). Dzięki temu programistom, którzy mają węższe okna edytora, kod nie urywa się z prawej strony okna, co zmuszałoby ich do przewijania go, w celu doczytania do końca.
  • Przesuwanie treści wiersza kodu w górę lub w dół (Move Line Up/Down Commands) za pomocą kombinacji Alt + Strzałka (strzałki w górę lub w dół)
  • Aranżację przypisań (Align Assignments), która za pomocą kombinacji klawiszy Ctrl+Alt+] pozwala z kodu sformatowanego następująco:
    first = 1;
    secondAssigment = 2;
    thirdTime = 3;
    

    uzyskać kod w takiej postaci:

    first           = 1;
    secondAssigment = 2;
    thirdTime       = 3;
    

    choć przyznam, że nie udało mi się uzyskać tego efektu (jednakowoż nie jestem nim zainteresowany, więc nie szukałem powodu).

Jest jeszcze jedna funkcjonalność związana z edytorem, która jednakże wymaga bardziej szczegółowego omówienia. Jest nią rozszerzenie paska przewijania pionowego (Enhanced Scroll Bar), które zmienia go dość, można by rzec, awangardowo. Dostępne są trzy tryby pracy paska: podstawowy, mapowany i pełny.
Pierwsze dwa, widoczne tuż poniżej, są do siebie dość podobne. Pierwszy rozszerza standardowy pasek przewijania o kolorowe znaczniki (kolor można dowolnie dobierać), które pokazują m.in. gdzie znajduje się kursor (na granatowo), słowa (na jasno-fioletowo), które pokrywają się w pionie z pozycją kursora (czyli ile słów w górę i w dół znajduje się na takiej samej pozycji co kursora), gdzie występują błędy (na czerwono), gdzie znajdują się szukane słowa (na ciemno-żółto), gdzie dokonano zmian (na żółto).
Tryb mapowania dodaje kolejne cechy, tj.: podgląd kodu w ramce odnośnie do pozycji kursora myszy na pasku przewijania. Zmienia się sam suwak – ma teraz wygląd ramki i odzwierciedla proporcjonalny zakres widzianego kodu w stosunku do całości dokumentu.

Podstawowy Mapowany
Tryb podstawowy paska przewijania Tryb mapowany paska przewijania

W trybie pełnym zamiast paska widoczny jest pomniejszony wygląd dokumentu. Ma on te same cechy, co pasek w trybie mapowania.

Pełny
Tryb pełny paska przewijania

Oprócz edytora rozszerzeniu uległy też okna edycji poszczególnych plików, a najbardziej ich system zakładek.

Zakładki okien edycyjnych

Dla zakładek możliwe jest ustalenie rodzaju wskaźnika informującego o wprowadzeniu zmian do pliku (Modify dirty indicator style). Może być to standardowy znacznik VS lub duża albo mała czerwona kropka. Oprócz tego zakładki mogą – oprócz indywidualnych przycisków zamykania – mieć przycisk wspólny (z prawej strony zakładek), który pozwala zamykać zakładkę bieżącą (Show close button in tab). Dodatkowo zakładki mogą być przewijane (Scrollable tabs), ich minimalny i maksymalny rozmiar może zostać zdefiniowany (Modify minimum and maximum tab size), zaś same zakładki mogą być kolorowane i to nawet w ten sposób, że kolor określany jest na podstawie wyrażenia regularnego. W ten sposób można np. wyróżniać wspólnym kolorem pliki wchodzące w skład Kontrolera, innym kolorem pliki wchodzące w skład Modelu, a jeszcze innym Widoku (Color tabs according to their project or according to regular expressions). Oprócz kolorowania zakładki mogą być też sortowane (Sorting): zarówno alfabetycznie, jak i w kontekście projektu (najpierw zakładki jednego projektu, potem drugiego, a one same w ramach projektu sortowane alfabetycznie bądź nie).

Rozszerzona jest też sama nawigacja po zakładkach. Możliwe jest:

  • przemieszczanie się zgodnie z widoczną kolejnością (niezależnie czy zakładka jest przypięta czy nie) za pomocą kombinacji klawiszy: Ctrl+Alt+Page Down i Ctrl+Alt+Page Up
  • aktywowanie odpiętych zakładek za pomocą kombinacji Ctrl + 1..9 (klawisze klawiatury numerycznej)
  • aktywowanie przypiętych zakładek za pomocą kombinacji Ctrl + Alt + 1..9 (klawisze klawiatury numerycznej)

Koniec końców możliwe jest umieszczenie zakładek (Place tabs) na dowolnym obrzeżu obszaru edycji (góra, dół, lewo, prawo), jak widać poniżej.

Pozycja zakładek okien edycyjnych

Ostatnia grupa funkcjonalności Productivity Power Tools dostępna jest przeważnie z menu kontekstowych, bądź głównego. Oto większość z nich.

Dostępne z menu kontekstowego edytora

  • Wstawienie atrybutu z identyfikatorem GUID(Insert Guid Attribute) – działa tylko w obrębie klasy
  • Przesłanie pocztą elektroniczną zaznaczonego fragmentu kodu(Email CodeSnippet)
    Przesłanie pocztą elektroniczną zaznaczonego fragmentu kodu

Dostępne z poziomu menu kontekstowego Eksploratora Solucji (Solution Explorer)

  • Kopiowanie ścieżki (Copy Path) – umożliwia skopiowanie ścieżki dla dowolnego elementu solucji (również dla folderów)
  • Zwiń projekty (Collapse Projects) – dostępne zarówno z pozycji solucji, jak i z pozycji folderu lub projektów.
  • Kopiuj/Wklej klasę (Copy/Paste Class) – kopiuje całą klasę i pozwala wkleić do innego projektu. Nazwa klasy jest zmieniana (przed dodanie liczby), aby zapobiec błędom kompilacji.
  • Kopiuj/Wklej referencje (Copy/Paste References) – kopiuje referencje pomiędzy jednym projektem a drugim.
  • Kopiuj projekt jako referencję (Copy As Project Reference) – kopiuje projekt jako referencję i w tej postaci umożliwia wklejenie go do innego projektu
  • Edycja pliku projektu (Edit Project File) – otwiera plik projektu w jego natywnej postaci (XML) w celu dokonania jego modyfikacji.
  • Otwarcie folderu zawierającego element (Open Containing Folder) – otwiera folder, w którym znajduje się dany element solucji.
  • Uruchomienie procesora poleceń systemu operacyjnego (Open Command Prompt) – uruchomia procesor poleceń systemu operacyjnego w kontekście folderu elementu, na którym wywołano menu kontekstowe. W ten sposób można szybko uruchomić spoza VS aplikację (np. serwis Windows)
  • Wyładuj projekty (Unload Projects) – wyładowuje wszystkie projekty w solucji (dostępne tylko z poziomu pozycji Solucja)
  • Przeładuj projekty (Reload Projects) – ładuje ponownie wszystkie wyładowane z solucji projekty (dostępne tylko z poziomu pozycji Solucja)
  • Usuń oraz sortuj załączane przestrzenie nazw (Remove and Sort Usings) – usuwa i sortuje wszystkie instrukcje using w zakresie, w którym została wywołana (projekt lub cała solucja). Jest użyteczna w przypadku porządkowania kodu wygenerowanego przez kreatory.

Dostępne z różnych miejsc

  • Formatowanie dokumentu podczas zapisu (Format document on save). Jest to odpowiednik formatowania dostępny z menu: Edit->Advanced menu.
  • Usuwanie nieużywanych przestrzeni nazw i ich sortowanie podczas zapisu (Remove and Sort Usings on save).
  • Otwórz ponownie ostatnio zamknięty plik (Undo Close) – dostępne z menu: Edit->Undo close lub za pomocą skrótu Ctrl+Shift+Z. Po otwarciu pliku kursor jest ustawiany w miejscu, gdzie był w momencie zamknięcia (przydaje się po przypadkowym użyciu Ctrl+F4). Pozostałe (tj. zamknięte wcześniej) okna można przywrócić za pomocą menu: View->Other Windows->Undo Close Window
  • Zamknij wszystkie dokumenty (Closes All Documents) – dostępne z menu kontekstowego zakładki, zamyka wszystkie dokumenty (wszystkie zakładki), nie zamyka solucji
  • Zamknij wszystkie dokumenty oprócz obecnego (Closes All But This) – dostępne z menu kontekstowego zakładki, zamyka wszystkie dokumenty (wszystkie zakładki) oprócz tej, na której wywołano menu
  • Czyść listę ostatnio użytych plików(Clear Recent File List) – dostępne z menu File->Recent File List. Udostępnia okno, w którym można wskazać pliki do usunięcia.
  • Czyść listę ostatnio użytych projektów(Clear Recent Project List) – dostępne z menu File->Recent Project List. Udostępnia okno, w którym można wskazać projekty do usunięcia.

W wersji 2012 Productivity Power Tools pojawiło się pole szybkiego uruchamiania (Quick Launch).

Pole szybkiego uruchamiania

Umożliwia ono praktycznie uruchomienie dowolnego elementu VS oraz realizację zadań, które udostępnia samo narzędzie – uzyskuje się do nich dostęp wpisując @task, a następnie jedno z podanych niżej poleceń:

  • CollapseRegions – zwija wszystkie znaczniki #region w bieżącym dokumencie.
  • ExpandRegion – rozwija wszystkie znaczniki #region w bieżącym dokumencie.
  • TxtFont- – zmniejsza rozmiar czcionki edytora o 2 (min 6).
  • TxtFont0 – ustawia domyślny rozmiar czcionki edytora na 10.
  • TxtFont+ – zwiększa rozmiar czcionki edytora o 2 (max 60).
  • TxtFontReset – ustawia rozmiar czcionki wszystkich edytorów na domyślny (wg bieżącego tematu).
  • EnvFont- – zmniejsza rozmiar czcionki środowiska o 2 (min 5).
  • EnvFont0 – ustawia domyślny rozmiar czcionki środowiska na 9.
  • EnvFont+ – zwiększa rozmiar czcionki czcionki środowiska o 2 (max 59).
  • EnvFontReset – ustawia rozmiar czcionki wszystkich środowisk na domyślny (wg bieżącego tematu).
  • InsTabsOff – wstawiaj spacje wszędzie tam, gdzie występują tabulacje (wszystkie języki).
  • InsTabsOn – pozostawiaj tabulację zamiast zastępować je spacjami (wszystkie języki).
  • LineNumOff – wyłącz numerowanie wierszy edytora (wszystkie języki).
  • LineNumOn – włącz numerowanie wierszy edytora (wszystkie języki).
  • PresentOff – wyłącz tryb prezentacji i przywróć rozmiar czcionki edytora i środowiska na obowiązujący przed włączeniem trybu.
  • PresentOn – włącz tryb prezentacji i ustaw rozmiar czcionki edytora i środowiska na umożliwiający swobodne czytanie z obrazu otrzymywanego z rzutnika.
  • ResetToBasic – użyj ustawień VS zdefiniowanych dla Visual Basic.
  • ResetToC++ – użyj ustawień VS zdefiniowanych dla Visual C++.
  • ResetToC# – użyj ustawień VS zdefiniowanych dla Visual C#.
  • ResetToF# – użyj ustawień VS zdefiniowanych dla Visual F#.
  • ResetToGeneral – użyj ogólnych ustawień VS.
  • ResetToJavaScript – użyj ustawień VS zdefiniowanych dla JavaScript for Windows 8 Apps.
  • ResetToLightSwitch – użyj ustawień VS zdefiniowanych dla LightSwitch.
  • ResetToSQL – użyj ustawień VS zdefiniowanych dla SQL Server.
  • ResetToWeb -użyj ustawień VS zdefiniowanych dla Web.
  • ResetToWebCode -użyj ustawień VS zdefiniowanych dla Web (Code Only).
  • SwitchCode – przełącz pomiędzy projektowanie a pisaniem kodu lub nagłówkiem i plikiem kodu, otwierając, plik jeżeli to konieczne.
  • TabSize- – zmniejsz rozmiar skoku tabulacji o 2 (wszystkie języki).
  • TabSize0 – ustaw rozmiar skoku tabulacji na domyślny tj.: 4 (wszystkie języki).
  • TabSize+ – zwiększ rozmiar skoku tabulacji o 2 (wszystkie języki).
  • WordWrapOff – wyłącz zawijanie wierszy (wszystkie języki).
  • WordWrapOn – włącz zawijanie wierszy (wszystkie języki).

Oprócz klucza @task dostępne są też: @menu – dostęp do poleceń menu (np.: @menu set as startup – i już można ustawić projekt jako startowy), @opt – dostęp do opcji, @doc dostęp do dokumentów (można tak wybrać zakładkę), @nuget – dostęp do systemu nuget, @mru – ostatnio używane. Można też wpisać dowolny tekst i jeżeli tylko pasuje do czegoś czym zarządza VS – można do tego uzyskać dostęp.

Post Scriptum

W nawiasach podałem oryginalne nazwy funkcjonalności, co jest o tyle ważne, że w ten sposób nazwano także opcje konfiguracji, umożliwiające wyłączenie tychże. Powinno to ułatwić posługiwanie się narzędziem, jak również odszukiwanie dodatkowych informacji w Internecie. Ze swojej strony polecam też video, które pokazuje sporo możliwości tego narzędzia.