Удивительные макросы Visual Studio
Для обсуждения в небольшом сообществе, какие основные макросы Visual Studio вы используете?
Я только начал узнавать о них и хочу услышать то, без чего некоторые из вас не могут жить.
14 ответов
Я использовал много макросов в VS 2002/2003. Одним из примеров может быть создание региона - мне всегда нравится, когда мои классы делятся на следующие регионы - "Закрытые члены", "Открытые свойства", "Открытые методы" и "Частные методы". Итак, у меня есть макрос, сопоставленный с сочетанием клавиш, который создает эти области в любом новом файле класса.
Рефакторинг поддержки в VS 2005/2008 (и возможность добавления общих фрагментов кода), а также использование надстроек, таких как DXCore и SlickEdit, позволяют мне работать без необходимости создавать слишком много макросов.
Я добавляю кнопки на панель инструментов для следующих 3 макросов. Каждый будет брать выбранный в данный момент текст в любом файле и гуглить его (или MSDN-it, или spell-check-it). Сделайте изящный значок для панели инструментов для дополнительных стилевых очков.
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
Показать продолжительность сборки в окне вывода
Поместите этот код в ваш модуль EnvironmentEvents. Это запишет продолжительность непосредственно в окно сборки для любого действия над решением (сборка, перестройка, очистка, развертывание).
Вы можете изменить функцию IsBuild, чтобы указать действия, для которых вы хотите просмотреть эту информацию.
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
Показывать стартовую страницу после закрытия решения (но держать Visual Studio открытым)
Поместите этот код в ваш модуль EnvironmentEvents:
Private Sub SolutionEvents_AfterClosing() Handles SolutionEvents.AfterClosing
DTE.ExecuteCommand("View.StartPage")
End Sub
Скрыть стартовую страницу после открытия решения
Поместите этот код в ваш модуль EnvironmentEvents:
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
Эти два фактора заставят вашу стартовую страницу скрыться, когда вы откроете решение. Когда вы закрываете решение, стартовая страница возвращается.
Я часто использую следующие менее известные ярлыки:
- Ctrl + Enter: вставить пустую строку над текущей строкой (и навести на нее курсор)
- Ctrl + Shift + Enter: вставить пустую строку ниже текущей строки (и навести на нее курсор)
- Ctrl + Shift + V: цикл кольца буфера обмена
Изложение: свернуть до определений, но расширить регионы
Вы работаете в одном из тех магазинов, которые настаивают на регионах вокруг всего, так что, когда вы переходите к определениям, вы не видите никакого кода?
Что вам действительно нужно, так это макрос "коллапс к определениям, но при расширении регионов", например:
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
Поместите это в обычный макрос-модуль, назначьте его горячей клавише, и ваш код вернется.
(За исключением... если вы работаете с некоторыми действительно гнусными людьми, которые помещают регионы в методы, это, к сожалению, расширит эти методы. Если кто-нибудь знает способ написать это, чтобы избежать этого, не стесняйтесь редактировать.)
Вставьте GUID, отлично подходит для работы с WiX, добавьте в меню как кнопку или как сочетание клавиш.
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
Организовать использование всех файлов.cs в решении - Автор оригинала: 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
Сверните все узлы панели "Решение", что особенно полезно для больших проектов:
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
Я работаю с двумя мониторами и считаю, что макрос переключения макетов Шарона (от 1 монитора до 2 мониторов) абсолютно бесценен. Когда вам нужно ссылаться на веб-страницу или другую программу при наборе небольшого количества кода, нажмите Ctrl-Alt-1, чтобы переключиться на макет с одним монитором для ваших окон Visual Studio. Как только вы закончите, Ctrl-Alt-2, чтобы переключиться на макет вашего двух мониторов и вернуть все окна обратно. Потрясающие!
http://www.invisible-city.com/sharon/2008/06/workstation-hack-visual-studio-on-2.html
Я использую макросы Jeff's FormatToHtml, если собираюсь вставить пример кода в сообщение в блоге или электронное письмо.
Не макрос самостоятельно, но полезно:
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
Я сопоставил ctrl-shift-G с макросом, который генерирует GUID в формате реестра - это полезно для редактирования IDL
В настоящее время я работаю над двумя разными проектами с разными стандартами кодирования, один из которых использует закладки для начала строк, а другой - пробелы. Этот макрос будет переключаться между тем, какой стандарт используется, в зависимости от того, какая среда в настоящее время активна:
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
Я не мог оставить этот вопрос без упоминания этого. Там даже есть видео, чтобы показать, как его установить и использовать. Этот макрос просто позволяет вам создавать вложенные файлы в обозревателе решений (например, resources.resx).
Изменить: Обновлена ссылка