Produktivität mit Visual Studio Eclipse-Shortcuts und -Tooling in Visual Studio wiederfinden und einstellen

Eine Tutorial von Philipp Hauer vom 31.03.2012. Update: 13.09.12 ©

Inhaltsangabe

  1. Vorwort
  2. Auswahl von nützlichen Shortcuts in Visual Studio
  3. Freie Erweiterungen von Visual Studio
  4. Eclipse-Tooling in Visual Studio einrichten und nutzen
    1. Quick-Fix
    2. Methodenkommentar-Sub generieren lassen
    3. Aktuell geöffnete Datei im Projektmappen-Explorer anzeigen: Link with Editor
  5. Nützliche Funktionen auf günstige Shortcuts umbiegen (auf Eclipse-Standard)
  6. Makro definieren:
    1. Zeile duplizieren
    2. Zeile entfernen
    3. Zeile verschieben
  7. Exportieren und Importieren von Tastenkombinationen
  8. Kommentare

Vorwort

Wer lange mit Eclipse gearbeitet und sich dabei intensiver mit der IDE beschäftigt hat, wird viele Funktionen und Shortcuts lieben gelernt haben. Je mehr Shortcuts man kannte und nutze, umso einschneidender wird der Wechsel zu Visual Studio werden. Da merkt man erst, wie sehr diese Funktionen die Produktivität gesteigert haben.

Wie ist das Kürzel für Funktion XY in Visual Studio? Gibt es Refactoring- Vervollständigungsfunktion XY auch in Visual Studio? Lässt sich der Shortcut für XY nicht ändern? Dieser Artikel versucht eine Auswahl dieser Fragen zu beantworten und ist damit aus der Perspektive eines Eclipse-Umsteigers geschrieben.

Aber natürlich ist dieser Artikel auch für nicht Eclipse-Jünger lesenswert, da er viele interessante und mächtige Erweiterungen, Funktionen und Shortcuts beschreibt, welche schließlich die Produktivität mit Visual Studio steigern. Nur die Herangehensweise und Auswahl ist Eclipse-driven. ;-)

Referenzsystem ist Visual Studio 2010. Das meiste sollte aber auch in Visual Studio 2008 funktionieren. Einzig die Extension Productivity Power Tools gibt es nur für die 2010er Version.

Auswahl von nützlichen Shortcuts in Visual Studio

Folgende nützliche Shortcuts in Visual Studio sind meiner Meinung nach adäquat belegt und können so bleiben.

Shortcut Bedeutung Situation (Beispiel)
F7 Sprung von XAML zu Codebehind  
F12 Sprung zur Definition. Cursor steht auf Klassennamen
Shift-F12 Show References (Orte an dem das Element verwendet wird). Cursor steht auf Klassennamen
Strg-Tab Zwischen Tabs wechseln  
Strg+Tab (halten) Öffnet Übersicht über geöffnete Tabs und weitere Funktionen  
Strg-F Suchen in aktueller Datei  
Strg-Shift-F Suchen in allen Dateien  
Strg-Alt-F Quick Find (Erweiterung CodeRush Xpress notwendig)  

Freie Erweiterungen für Visual Studio

Es gibt viele Erweiterungen für Visual Studio, die die Produktivität steigern. Leider sind viele kommerziell, aber es gibt auch gute freie. Prinzipiell gilt: Die Erweiterungen bieten mehr als ich in diesem Artikel präsentieren kann. Die offiziellen Dokus der Extensions sind aber sehr gut und es empfiehlt sich, diese zu konsultieren.

Erweiterung Beschreibung
CodeRush Xpress Extrem mächtige Extension. Fügt u. a. viele sinnvolle Automatismen und Refactorfunktionalitäten hinzu. Es gibt sehr viel zu entdecken - mehr als ich in diesem Tutorial zeigen kann.
Productivity Power Tools Viele kleinere Verbesserungen fürs Coding. Nur für Visual Studio 2010.
Power Command Fügt u. a. sinnvolle Befehle dem Kontextmenü im Projektmappen-Explorer hinzu.

Eclipse-Tooling in Visual Studio einrichten und nutzen

Quick-Fix (Strg-1)

Eclipse-Jünger lieben es und werden es in Visual Studio sehr vermissen. Es möglicht blitzschnelle Codevervollständigung, -generierung und Refactoring (besonders schnell im Zusammenspiel mit Pfeil- und Entertasten). Zwei Beispiele von duzenden nützlichen Stortcuts sind:

Quick-Fix in Eclipse

Es muss nur der Instanzierungsteil geschrieben werden. Mit Strg-1 und Enter wird das Objekt einer korrekt getypten Variable zugewiesen.

Quick-Fix in Eclipse

Signatur first! Blitzschnell lässt sich ein passender Methoden-Stub generieren.

Aber die Erweiterung CodeRush schafft Abhilfe und fügt Visual Studio ein ähnliches Fenster hinzu. Allerdings muss der Shortcut dafür noch umgebogen werden (der ist standardmäßig ungünstig gelegt). Dazu müssen wir in die CodeRush-Optionen gehen (Strg+Shift+Alt+O) und dort unter IDE>Shortcuts den Shortcut für das Command Refactor!>Refactor auf Strg-1 legen. Sollte der Shotcut nicht existieren, kann er erstellt werden ("New Keyboard Shortcut" wählen. Shortcut: "Ctrl+1". Command: "Refactor". Context: "Focus>Documents>Source>Code Editor"):

Quick-Fix-Shortcut in CodeRush

Voila:

Quick-Fix mit Coderush unter Visual StudioQuick-Fix mit Coderush unter Visual Studio

CodeRush-Refactor und Eclipse Quick-Fix können viel viel viel mehr als das. Einfach immer mal Strg+1 anschlagen und schauen, was da alles geht. ;-)

Methodenkommentar-Stub generieren lassen

Keine Überraschung: Während man in Eclipse den Cursor auf die Zeile über der Methodensignatur setzen und "/**" tippt, wird dieser automatisch zum vollständigen JavaDoc-Kommentar vervollständigt. Dabei werden für Parameter, Exception und Returnvalue entsprechende Tags angelegt. Analog funktioniert es in Visual Studio nur eben mit "///" - logisch, aber ich wollte es einmal geschrieben haben. Code-Doku ist unbeschreiblich wichtig. Der nächste Entwickler (und du in einem Jahr) werden dir dankbar sein. ;-)

Aktuell geöffnete Datei im Projektmappen-Explorer anzeigen: Link with Editor.

Aktuell geöffnetes Datei wird damit im Explorer hervorgehoben und ausgeklappt
Aktuell geöffnete Datei wird damit im Explorer
hervorgehoben und ausgeklappt

Die "Link with Editor"-Funktion ist extrem nützlich und erspart in Eclipse ewiges Gesuche nach der aktuellen Klasse. In Visual Studio existiert dafür leider kein Button, die man bequem toggeln kann. Die Einstellung muss global in den Optionen eingeschaltet werden - aber immerhin: es geht. Zu finden unter:

  • Englisch: Tools > Options > Projects and Solutions. Dort "Track Active Item in Solution Explorer" checken.
  • Deutsch: Extras > Optionen > Projekte und Projektmappen. Dort "Aktive Elemente im Projektmappen Explorer überwachen" checken.

Nützliche Funktionen auf günstige Shortcuts umbiegen (zu Eclipse-Standard)

Ich empfand, dass viele "Shortcuts" in Visual Studio ihren Namen nicht verdienen und eine Zumutung waren. Häufig muss man mehr als 2 Nicht-Kontrolltasten drücken, sie liegen ungünstig auf der Tastatur (2 Hände notwendig), müssen oft nacheinander gedrückt werden und/oder lassen sich schlecht merken. All das schreit förmlich nach Umbiegen der Shortcuts.

Das ist kein Aufruf alle Shortcuts in Visual Studio kategorisch umzubiegen - viele sind kurz und gut. Sich an diese Standardkürzel zu gewöhnen ist sinnvoll, aber unsinnige Shortcuts können und sollten meiner Meinung nach geändert werden.

Die Option zum Ummappen der Kürzel ist in den Optionen unter Environment>Keyboard bzw. Umgebung>Tastatur zu finden.

Noch ein Hinweis: Sollte ein Hotkey einmal nicht ziehen, kann es helfen, den Kontext des neuen Kürzels auf "Text-Editor" (statt "Global") zu setzen - oder es einfach immer machen.

Funktion Eclipse-Belegung Commandname in Visual Studio Bemerkung
Zeile/Auswahl Ein- und Auskommentieren Strg-7 Edit.CommentSelection
Bearbeiten.Auswahlkommentieren

Edit.UncommentSelelection
Bearbeiten.Auskommentierung derAuswahlaufheben
Da Visual Studio nicht erkennt, wenn eine Markierung bereits auskommentiert ist und daher bei Betätigung des Shortcuts einkommentiert werden soll, muss ein separates Kürzel definiert werden (z. B. Strg-Shift-7)
Zeile/Auswahl verschieben Alt-Oben
Alt-Unten
Edit.MoveLineDown

Edit.MoveLineUp
Die Erweiterung Productivity Power Tools bringt diese Einstellung mit. Alternativ (oder wenn nur Visual Studio 2008 zu Verfügung steht), kann ein Makro definiert werden.
Zeile/Auswahl löschen Strg-D Edit.LineDelete
Bearbeiten.Zeileentfernen
Sollte dies nicht funktionieren, kann ein Makro definiert werden.
Zeile/Auswahl duplizieren Strg-Alt-Oben
Strg-Alt-Unten
/ Nicht vorhanden. Für diese Funktionalität muss ein Makro definiert werden.

Alternative: CodeRush bietet das Command Duplicate, was einem Kürzel zugewiesen werden kann. Dies kann in den CodeRush-Optionen (Strg+Alt+Shift+O) eingestellt werden. Dort links IDE>Shortcuts und rechts Code auswählen. Dann das Command DuplicateLine umbiegen. Problem hierbei: Es können nicht mehrere Zeilen auf einmal dupliziert werden.
Automatisch formatieren Strg-F Edit.FormatDocument
(Edit.FormatSelection)
Bearbeiten.Dokumentformatieren
Hier bin ich selbst vom Eclipse-Standard abgewichen, weil Strg-F sinnvoll mit Suche belegt ist. Da Strg-Shift-F und Strg-Alt-F ebenfalls sinnvoll belegt sind, habe ich mich für Strg-Shift-Alt-F entschieden. Nicht schön, aber in Visual Studio brauch ich es nicht oft, weil der Formatter weniger mächtig ist als in Eclipse.
Vorwärts und rückwärts zwischen Dokumenten navigieren Alt-Links
Alt-Rechts

View.NavigateBackward (Kontext: TextEditor)
Ansicht.Vorwärtsnavigieren

View.NavigateForward (Kontext: TextEditor)
Ansicht.Rückwärtsnavigieren

Ist CodeRush installiert, so ist dieses Kürzel für CamelCaseRight und CamelCaseLeft belegt. Aber CodeRush weist bei Verwendung des Shortcuts mit einem PopUp darauf hin. In diesem Popup kann mit "Disable" die CodeRush-Belegung deaktiviert werden. Anschließend sollte es funktionieren.
Tab schließen Strg-W File.Close
Datei.Schließen
Ist CodeRush installiert, muss wieder einmalig bei erster Benutzung die CodeRush-Belegung im aufgehenden Fenster deaktiviert werden.

Folgende Shortcuts finde ich sinnvoll und so zentral, dass ich sie so gelassen habe, um beim Standard zu bleiben:

Eclipse-Shortcut Beschreibung Visual Studio Äquivalent
F3 Go to declaration F12
Strg-Shift-G Show references Shift-F12

Eigene Makros definieren

Da Visual Studio oder älteren Visual Studio Versionen für einige Funktionen (wie das Zeilen/Auswahl duplizieren) kein Command definiert, muss hierfür ein eigenes Makro definiert werden. Das ist aber kein Problem.

Makro erstellen am Beispiel von: Zeile duplizieren

1. Makro definieren

  1. Dazu "Extras>Makros>Makro-Explorer" bzw. "Tools>Macros>Macro Explorer".
  2. Unter dem standardmäßig vorhandenen Makro-Projekt "MyMacros" ein neues Modul erstellen (mit Rechtklick, Name z.B. "DuplicateLineModule").
  3. Doppelklick auf das Modul und den Makro-Code für die Zeilenduplikation einfügen:
Makro zur Duplikation/Verdopplung von Zeilen (Autor: Lolo, Quelle):

Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports System.Diagnostics 

Public Module DuplicateLineModule 
    Sub DuplicateLineDown() 
        Dim selection As TextSelection = DTE.ActiveDocument.Selection 
        Dim lineNumber As Integer 
        Dim line As String 

        If selection.IsEmpty Then 
            selection.StartOfLine(0) 
            selection.EndOfLine(True) 
        Else 
            Dim top As Integer = selection.TopLine 
            Dim bottom As Integer = selection.BottomLine 

            selection.MoveToDisplayColumn(top, 0) 
            selection.StartOfLine(0) 

            selection.MoveToDisplayColumn(bottom, 0, True) 
            selection.EndOfLine(True) 
        End If 

        lineNumber = selection.TopLine 
        line = selection.Text 

        selection.MoveToDisplayColumn(selection.BottomLine, 0) 
        selection.EndOfLine() 
        selection.Insert(vbNewLine & line) 
    End Sub 
    Sub DuplicateLineUp() 
        Dim selection As TextSelection = DTE.ActiveDocument.Selection 
        Dim lineNumber As Integer 
        Dim line As String 

        If selection.IsEmpty Then 
            selection.StartOfLine(0) 
            selection.EndOfLine(True) 
        Else 
            Dim top As Integer = selection.TopLine 
            Dim bottom As Integer = selection.BottomLine 

            selection.MoveToDisplayColumn(top, 0) 
            selection.StartOfLine(0) 

            selection.MoveToDisplayColumn(bottom, 0, True) 
            selection.EndOfLine(True) 
        End If 

        lineNumber = selection.BottomLine 
        line = selection.Text 

        selection.MoveToDisplayColumn(selection.BottomLine, 0) 
        selection.Insert(vbNewLine & line) 
        selection.MoveToDisplayColumn(lineNumber, 0) 
    End Sub 
End Module 			

2. Makro einem Shortcut zuweisen

  1. Das Makro erscheint nun neben den Standard-Commands von Visual Studio unter dem Namen "Macros.MyMacros.DuplicateLineModule.DuplicateLineDown" und "Macros.MyMacros.DuplicateLineModule.DuplicateLineUp".
  2. Zuweisung zu einem Shortcut. Eclipse-Belegung: Strg-Alt-Oben bzw. Strg-Alt-Unten. Kontext: Global!

Makro-Code: Zeile entfernen

Sollte das Command "Edit.LineDelete/Bearbeiten.Zeileentfernen" nicht ziehen, kann hierfür ein Makro definiert werden. Vorgehensweise wie oben.

Makro-Code zur Entfernung der aktuellen Zeile/Auswahl (Autor: Peter Perháč, Quelle):

Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports EnvDTE90a 
Imports EnvDTE100 
Imports System.Diagnostics 

Public Module RemoveLineOrBlock 

    Sub RemoveLineOrBlock() 
        Dim selection As TextSelection = DTE.ActiveDocument.Selection 
        Dim lineNumber As Integer 
        Dim line As String 

        If selection.IsEmpty Then 
            selection.StartOfLine(0) 
            selection.EndOfLine(True) 
        Else 
            Dim top As Integer = selection.TopLine 
            Dim bottom As Integer = selection.BottomLine 

            selection.MoveToDisplayColumn(top, 0) 
            selection.StartOfLine(0) 

            selection.MoveToDisplayColumn(bottom, 0, True) 
            selection.EndOfLine(True) 
        End If 

        selection.LineDown(True) 
        selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn,True)

        selection.Delete() 

        selection.MoveToDisplayColumn(selection.BottomLine, 0) 
        selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText)

    End Sub 

End Module 			

Makro-Code: Zeile verschieben

Sollte die Productivity Power Tools nicht installiert werden können (beispielsweise bei Visual Studio 2008), kann die Funktionalität über ein Makro hergestellt werden (Commands MoveLineUp() bzw. MoveLineDown() zuweisen: Alt-Oben bzw. Alt-Unten). Vorgehensweise wie oben.

Makro-Code zur Verschiebung aktuellen Zeile/Auswahl nach oben oder unten (Autor: unknown, Quelle):

Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports EnvDTE90a 
Imports EnvDTE100 
Imports System.Diagnostics 

Public Module MoveLineOrBlock 

    '' Moves the selected lines up one line. If no line is 
    '' selected, the current line is moved. 
    '' 
    Sub MoveLineUp() 
        DTE.UndoContext.Open("MoveLineUp") 
        Dim objSel As TextSelection = DTE.ActiveDocument.Selection 
        ' store the original selection and cursor position 
        Dim topPoint As TextPoint = objSel.TopPoint 
        Dim bottomPoint As TextPoint = objSel.BottomPoint 
        Dim lTopLine As Long = topPoint.Line 
        Dim lTopColumn As Long = topPoint.LineCharOffset 
        Dim lBottomLine As Long = bottomPoint.Line 
        Dim lBottomColumn As Long = bottomPoint.LineCharOffset() 

        ' move to the line above the top line 
        objSel.MoveToLineAndOffset(lTopLine - 1, 1) 
        ' and move it down, until its below the bottom line: 
        Do 
            DTE.ExecuteCommand("Edit.LineTranspose") 
        Loop Until (objSel.BottomPoint.Line >= lBottomLine) 
        ' Since the line we are on has moved up, our location in the file has changed:
        lTopLine = lTopLine - 1 
        lBottomLine = lBottomLine - 1 

        ' restore the cursor to original position and selection 
        objSel.MoveToLineAndOffset(lBottomLine, lBottomColumn) 
        objSel.MoveToLineAndOffset(lTopLine, lTopColumn, True) 
        DTE.UndoContext.Close() 
    End Sub 

    '' Moves the selected lines down one line. If no line is 
    '' selected, the current line is moved. 
    '' 
    Sub MoveLineDown() 
        DTE.UndoContext.Open("MoveLineDown") 
        Dim objSel As TextSelection = DTE.ActiveDocument.Selection 
        ' store the original selection and cursor position 
        Dim topPoint As TextPoint = objSel.TopPoint 
        Dim bottomPoint As TextPoint = objSel.BottomPoint 
        Dim lTopLine As Long = topPoint.Line 
        Dim lTopColumn As Long = topPoint.LineCharOffset 
        Dim lBottomLine As Long = bottomPoint.Line 
        Dim lBottomColumn As Long = bottomPoint.LineCharOffset() 

        ' move to the bottom line 
        objSel.MoveToLineAndOffset(lBottomLine, 1) 
        ' and move it down, which effectively moves the line below it up 
        ' then move the cursor up, always staying one line above the line 
        ' that is moving up, and keep moving it up until its above the top line:
        'Dim lineCount As Long = lTopLine - lBottomLine 
        Dim lineCount As Long = lBottomLine - lTopLine 
        Do 
            DTE.ExecuteCommand("Edit.LineTranspose") 
            objSel.LineUp(False, 2) 
            lineCount = lineCount - 1 
        Loop Until (lineCount < 0)
        ' Since the line we are on has moved down, our location in the file has changed:
        lTopLine = lTopLine + 1 
        lBottomLine = lBottomLine + 1 

        ' restore the cursor to original position and selection 
        objSel.MoveToLineAndOffset(lBottomLine, lBottomColumn) 
        objSel.MoveToLineAndOffset(lTopLine, lTopColumn, True) 
        DTE.UndoContext.Close() 
    End Sub 

End Module 			

Exportieren und Importieren von Tastenkombinationen

Bei Zeit schreibe ich hierzu auch etwas selbst. Solange siehe hier (ungetestet).