2009-02-07 18 views
67

Für eine kleine Community-Diskussion, was sind einige wichtige Visual Studio-Makros, die Sie verwenden?Awesome Visual Studio-Makros

Ich fing gerade an, über sie zu lernen, und will hören, was einige von Ihnen nicht ohne leben können.

+34

Ich kann dieser Frage nicht mehr zustimmen. Es ist äußerst konstruktiv und eine gute Frage. –

+6

Ich stimme zu. Dies war ein nützliches Thema und enthält die Antwort, die ich suchte. – SturmUndDrang

+1

In VS 2012 wurde der Makroeditor entfernt. Das sind die schlechten Nachrichten. Die gute Nachricht ist, dass Sie im Grunde denselben Code in der Sprache Ihrer Wahl verwenden können, indem Sie ein Add-In erstellen. Erstellen Sie ein Visual Studio-Add-In-Projekt, das den von Ihnen benötigten Standardcode enthält. Wenn Sie testen, startet VS 2012 eine separate Instanz von VS 2012 mit installiertem Add-In. Wenn Sie bereit sind, die Bereitstellung durchzuführen, gehen Sie zu "Eigene Dateien \ Visual Studio 2012 \ Addins". Dort legen Sie für Ihr Projekt 'whatever' die Datei' wash.dll' für Ihr Add-In sowie die Datei 'wasd.AddIn' aus dem Hauptverzeichnis des Projekts. –

Antwort

0

Früher habe ich viel von Makros in VS 2002/2003 verwenden. Ein Beispiel wäre die Erstellung von Regionen - ich möchte meine Klassen immer in die folgenden Regionen unterteilen: "Private Mitglieder", "Öffentliche Eigenschaften", "Öffentliche Methoden" und "Private Methoden". Also habe ich einen Makro auf einen Shortcut-Key gemappt, der diese Regionen in jeder neuen Klassendatei erzeugt.

Refactoring-Unterstützung in VS 2005/2008 (und die Möglichkeit, allgemeine Code-Snippets hinzuzufügen) sowie die Verwendung von Addins wie DXCore und SlickEdit erlauben mir zu arbeiten, ohne zu viele Makros mehr erstellen zu müssen.

+45

Was für eine seltsame Wahl für die akzeptierte Antwort. –

+2

Ich habe Fremder gesehen. Sortieren Sie die Antworten nach Datum und Sie werden die Begründung sehen. ;-) – Cerebrus

+1

Habe ich nicht viel Zeit gegeben, oder? –

1

I Ctrl-Shift-G zu einem Makro zugeordnet, die eine GUID in der Registry Format erzeugt - dies für die Bearbeitung von IDL nützlich ist

4

Ich benutze Jeffs FormatToHtml Makros, wenn ich ein Codebeispiel in einen Blogpost oder eine E-Mail einfügen werde.

8

GUID einfügen, ideal für WiX-Arbeit, zum Menü als Schaltfläche oder als Tastenkombination hinzufügen.

Sub InsertGuid() 
    Dim objTextSelection As TextSelection 
    objTextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection) 
    objTextSelection.Text = System.Guid.NewGuid.ToString.ToUpper(New System.Globalization.CultureInfo("en", False)) 
End Sub 

Organisieren usings für alle CS-Dateien in einer Lösung - Original-Autor:djpark.

Sub OrganizeSolution() 
    Dim sol As Solution = DTE.Solution 
    For i As Integer = 1 To sol.Projects.Count 
     OrganizeProject(sol.Projects.Item(i)) 
    Next 
End Sub 

Private Sub OrganizeProject(ByVal proj As Project) 
    For i As Integer = 1 To proj.ProjectItems.Count 
     OrganizeProjectItem(proj.ProjectItems.Item(i)) 
    Next 
End Sub 

Private Sub OrganizeProjectItem(ByVal projectItem As ProjectItem) 
    Dim fileIsOpen As Boolean = False 
    If projectItem.Kind = Constants.vsProjectItemKindPhysicalFile Then 
     'If this is a c# file    
     If projectItem.Name.LastIndexOf(".cs") = projectItem.Name.Length - 3 Then 
      'Set flag to true if file is already open     
      fileIsOpen = projectItem.IsOpen 
      Dim window As Window = projectItem.Open(Constants.vsViewKindCode) 
      window.Activate() 
      projectItem.Document.DTE.ExecuteCommand("Edit.RemoveAndSort") 
      'Only close the file if it was not already open     
      If Not fileIsOpen Then 
       window.Close(vsSaveChanges.vsSaveChangesYes) 
      End If 
     End If 
    End If 
    'Be sure to apply RemoveAndSort on all of the ProjectItems.   
    If Not projectItem.ProjectItems Is Nothing Then 
     For i As Integer = 1 To projectItem.ProjectItems.Count 
      OrganizeProjectItem(projectItem.ProjectItems.Item(i)) 
     Next 
    End If 
    'Apply RemoveAndSort on a SubProject if it exists.   
    If Not projectItem.SubProject Is Nothing Then 
     OrganizeProject(projectItem.SubProject) 
    End If 
End Sub 
31

Ich füge Schaltflächen in der Symbolleiste für die folgenden 3 Makros hinzu. Jeder nimmt den aktuell ausgewählten Text in einer beliebigen Datei und googelt ihn (oder MSDN-it oder Rechtschreibprüfung). Erstellen Sie ein raffiniertes Symbol für die Symbolleiste für zusätzliche Stilpunkte.

Private Const BROWSER_PATH As String = "C:\Program Files\Mozilla Firefox\firefox.exe" 

Sub SearchGoogle() 
    Dim cmd As String 
    cmd = String.Format("{0} http://www.google.com/search?hl-en&q={1}", BROWSER_PATH, DTE.ActiveDocument.Selection.Text) 
    Shell(cmd, AppWinStyle.NormalFocus) 
End Sub 

Sub SearchMSDN() 
    Dim cmd As String 
    cmd = String.Format("{0} http://www.google.com/search?hl-en&q={1}+site%3Amsdn.microsoft.com", BROWSER_PATH, DTE.ActiveDocument.Selection.Text) 
    Shell(cmd, AppWinStyle.NormalFocus) 
End Sub 

Sub SpellCheck() 
    Dim cmd As String 
    cmd = String.Format("{0} http://www.spellcheck.net/cgi-bin/spell.exe?action=CHECKWORD&string={1}", BROWSER_PATH, DTE.ActiveDocument.Selection.Text) 
    Shell(cmd, AppWinStyle.NormalFocus) 
End Sub 
+0

Es gibt jetzt eine Rechtschreibprüfung Erweiterung, BTW. –

4

Ich arbeite mit zwei Monitoren, und ich finde, Sharons Layout-Schilt Makro (von 1 Monitor an ein 2-Monitor-Layout) völlig von unschätzbarem Wert. Wenn Sie eine Webseite oder ein anderes Programm referenzieren müssen, während Sie ein wenig Code eingeben, können Sie mit STRG-ALT-1 zu einem EIN-Monitor-Layout für Ihre Visual Studio-Fenster wechseln. Sobald Sie fertig sind, Strg-Alt-2, um zu Ihrem Zwei-Monitor-Layout zu wechseln und alle Ihre Fenster zurück zu bekommen. Genial!

http://www.invisible-city.com/sharon/2008/06/workstation-hack-visual-studio-on-2.html

0

Ich könnte diese Frage, ohne erwähnen this one nicht gehen lassen. Es hat sogar ein Video, um zu zeigen, wie man es installiert und benutzt. Mit diesem Makro können Sie einfach die verschachtelten Dateien im Solution Explorer (wie resources.resx) erstellen.

Edit: Aktualisiert den Link

+0

Link unterbrochen, Update vielleicht? – Maslow

+0

Danke maslow, ich habe den Link aktualisiert –

13

ich sehr oft die folgenden weniger bekannte Abkürzungen verwenden:

  • Strg + Enter: eine leere Zeile oberhalb der aktuellen Zeile ein (und setzen Sie den Cursor dort)
  • Ctrl + Shift + Enter: eine leere Zeile unterhalb der aktuellen Zeile ein (und legen Sie dort den Cursor)
  • Strg + Umschalt + V: Zyklen der clipboard ring
+0

können Sie uns erklären, was sie tun sollen? .. – levesque

+1

Scheint wie der arme Mann VIM – kizzx2

14

Zeigen Sie die Startseite, nachdem Sie eine Lösung schließen (aber halten Visual Studio geöffnet)

diesen Code Setzen Sie in Ihrem EnvironmentEvents Modul:

Private Sub SolutionEvents_AfterClosing() Handles SolutionEvents.AfterClosing 
    DTE.ExecuteCommand("View.StartPage") 
End Sub 


ausblenden die Startseite nach wie öffnen olution

Diesen Code in Ihren EnvironmentEvents Modul:

Private Sub SolutionEvents_Opened() Handles SolutionEvents.Opened 
    Dim startPageGuid As String = "{387CB18D-6153-4156-9257-9AC3F9207BBE}" 
    Dim startPage As EnvDTE.Window = DTE.Windows.Item(startPageGuid) 
    If startPage IsNot Nothing Then startPage.Close() 
End Sub 


Diese beiden zusammen wird dazu führen, dass Startseite selbst verstecken, wenn Sie eine Lösung zu öffnen. Wenn Sie die Lösung schließen, wird die Startseite angezeigt.

+11

Wer braucht wirklich die Startseite? – kizzx2

+1

Startseite lame – Pacerier

+2

VS 2010 hinzugefügt eine Option "Seite nach Projekt laden" auf der Startseite, so dass das Schließen Makro nicht mehr benötigt wird. Sie haben das und "Seite beim Start anzeigen", aber aus unbekannten Gründen, die mir unbekannt sind, gibt es keine Option "Seite nach Schließen der Lösung anzeigen", was das passende Gegenteil von "Seite nach Projekt laden" ist. Wer braucht die Startseite? Ich verwende es, um Letzte Projekte zu fixieren. AFAIK, es ist der einzige Ort, an dem Sie aktuelle Projekte/Lösungen (2010) festhalten können. Sie können die Elemente im Menü Datei -> Letzte Projekte und Lösungen nicht anheften, so dass sie für eine langfristige Verwendung nicht zuverlässig sind. – minnow

9

umreißt: Einsturz zu Definitionen aber erweitern Regionen

Sind Sie in einem dieser Läden arbeiten, um alles auf Regionen besteht, so dass, wenn Sie Definitionen kollabieren, können Sie keinen Code sehen ?

Was Sie wirklich brauchen, ist ein Zusammenbruch zu Definitionen-but-expand-Regionen Makro, wie diese:

Sub CollapseToDefinitionsButExpandAllRegions() 
    DTE.ExecuteCommand("Edit.CollapsetoDefinitions") 
    DTE.SuppressUI = True 
    Dim objSelection As TextSelection = DTE.ActiveDocument.Selection 
    objSelection.StartOfDocument() 
    Do While objSelection.FindText("#region", 
     vsFindOptions.vsFindOptionsMatchInHiddenText) 
    Loop 
    objSelection.StartOfDocument() 
    DTE.SuppressUI = False 
End Sub 

dieses in einem normalen Makromodul, Zuweisen zu einem Hot-Key, und Ihr Code ist zurück.

(Außer ... wenn Sie mit einigen wirklich ruchlosen Personen arbeiten, die Regionen innerhalb Methoden setzen, wird dies leider diese Methoden erweitern. Wenn jemand einen Weg weiß, um dies zu schreiben, zögern Sie nicht zu bearbeiten.)

25

anzeigen Build Dauer im Ausgabefenster

dieser Code in Ihrem EnvironmentEvents Modul. Dadurch wird die Dauer für jede Aktion einer Lösung (Build, Rebuild, Clean, Deploy) direkt in das Erstellungsfenster geschrieben.

Sie können die IsBuild-Funktion ändern, um die Aktionen anzugeben, für die diese Informationen angezeigt werden sollen.

Dim buildStart As Date 

Private Function IsBuild(ByVal scope As EnvDTE.vsBuildScope, ByVal action As EnvDTE.vsBuildAction) As Boolean 
    Return scope = vsBuildScope.vsBuildScopeSolution 
End Function 

Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin 
    If (IsBuild(Scope, Action)) Then 
     buildStart = Date.Now 
    End If 
End Sub 

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone 
    If (IsBuild(Scope, Action)) Then 
     Dim buildTime = Date.Now - buildStart 
     WriteToBuildWindow(String.Format("Build time: {0}", buildTime.ToString)) 
    End If 
End Sub 

Private Sub WriteToBuildWindow(ByVal message As String) 
    Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) 
    Dim ow As OutputWindow = CType(win.Object, OutputWindow) 
    For Each owPane As OutputWindowPane In ow.OutputWindowPanes 
     If (owPane.Name.Equals("Build")) Then 
      owPane.OutputString(message) 
      Exit For 
     End If 
    Next 
End Sub 
+4

Ich habe etwas ähnliches, aber ich frage mich, ob es einen Weg gibt, eine laufende Summe zu machen, die hartnäckig ist, so dass ich verfolgen kann, wie viel von meinem Leben ich kompiliere. – Dolphin

+0

Sicher, nehmen Sie einfach die Zeitspanne und speichern Sie sie in einer Datenbank. Soweit ich weiß, können Sie so ziemlich jeden Code in einem Makro ausführen. Schreiben Sie einfach Code, um den neuesten TimeSpan zu speichern, und rufen Sie dann den Gesamtwert ab und zeigen Sie diesen stattdessen an. –

+0

Wenig spät auf die Party, aber wollte Ihnen für diesen einen danken, wie es genau das ist, was ich suchte. Nebenbei bemerkt: Sie können 'ow.OutputWindowPanes.Item (" Build "). OutputString (Nachricht)' anstelle von 'For Each' verwenden. – Chrono

5

Collapse alle Knoten der Panel-Lösung, sehr nützlich, vor allem für große Projekte:

Public Module CollapseAllNodes 
    Sub RunCollapseAllNodes() 
     Dim UIHSolutionExplorer As UIHierarchy 
     UIHSolutionExplorer = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object() 

     ' Check if there is any open solution 
     If (UIHSolutionExplorer.UIHierarchyItems.Count = 0) Then 
      Return 
     End If 

     ' Get the top node (the name of the solution) 
     Dim UIHSolutionRootNode As UIHierarchyItem 
     UIHSolutionRootNode = UIHSolutionExplorer.UIHierarchyItems.Item(1) 

     CloseRecursif(UIHSolutionRootNode) 

     ' Select the solution node, or else when you click 
     ' on the solution windows scrollbar, it will synchronize the open document 
     ' with the tree and pop out the corresponding node which is probably not 
     ' what you want. 
     UIHSolutionRootNode.Select(vsUISelectionType.vsUISelectionTypeSelect) 
    End Sub 

    Function CloseRecursif(ByRef element) 
     For Each UIHChild In element.UIHierarchyItems() 
      CloseRecursif(UIHChild) 

      If (UIHChild.UIHierarchyItems.Expanded = True) Then 
       UIHChild.UIHierarchyItems.Expanded = False 
      End If 

     Next 
    End Function 
End Module 
2

keinen Makro auf seinem eigenen, aber nützlich:

Public Sub WriteToOutputWindow(ByVal pane as String, ByVal Msg As String) 
    Dim owPane As OutputWindowPane 

    Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) 
    Dim ow As OutputWindow = win.Object 
    Try 
     owPane = ow.OutputWindowPanes.Item(pane) 
    Catch 
     owPane = ow.OutputWindowPanes.Add(pane) 
    End Try 
    If Not owPane Is Nothing Then 
     owPane.Activate() 
     owPane.OutputString(Msg & vbCrLf) 
    End If 
End Sub 
1

I‘ Ich arbeite derzeit an zwei verschiedenen Projekten mit unterschiedlichen Codierungsstandards, einer, der Registerkarten für Zeilenanfänge und ein anderes, das Leerzeichen verwendet, verwendet. Dieses Makro schaltet zwischen dem Standard um, der verwendet wird, abhängig davon, welche Umgebung gerade aktiv ist:

Public Sub ToggleTabs() 
    If DTE.ActiveDocument.Language = "CSharp" Then 
     Dim currentSetting As Boolean = DTE.Properties("TextEditor", "CSharp").Item("InsertTabs").Value 
     DTE.Properties("TextEditor", "CSharp").Item("InsertTabs").Value = Not currentSetting 
    End If 

    If DTE.ActiveDocument.Language = "SQL" Then 
     Dim currentSQLSetting As Boolean = DTE.Properties("TextEditor", "SQL").Item("InsertTabs").Value 
     DTE.Properties("TextEditor", "SQL").Item("InsertTabs").Value = Not currentSQLSetting 
    End If 

    If DTE.ActiveDocument.Language = "HTML" Then 
     Dim currentHTMLSetting As Boolean = DTE.Properties("TextEditor", "HTML").Item("InsertTabs").Value 
     DTE.Properties("TextEditor", "HTML").Item("InsertTabs").Value = Not currentHTMLSetting 
    End If 

    If DTE.ActiveDocument.Language = "JScript" Then 
     Dim currentJScriptSetting As Boolean = DTE.Properties("TextEditor", "JScript").Item("InsertTabs").Value 
     DTE.Properties("TextEditor", "JScript").Item("InsertTabs").Value = Not currentJScriptSetting 
    End If 

End Sub