Как мне добавить точки останова отладки к строкам, отображаемым в окне “Найти результаты” в Visual Studio
-
09-06-2019 - |
Вопрос
В Visual Studio 2005-2015 можно найти все строки, содержащие определенные ссылки, и отобразить их в окне "Найти результаты".
Теперь, когда отображаются эти строки результатов, есть ли какое-либо сочетание клавиш, которое позволило бы добавлять точки останова отладки ко всем из них?
Решение
Этот ответ не работает для Visual Studio 2015 или более поздней версии.Более свежий ответ можно найти здесь.
Вы можете сделать это довольно легко с помощью макроса Visual Studio.В Visual Studio нажмите Alt-F11, чтобы открыть среду разработки макросов и добавить новый модуль, щелкнув правой кнопкой мыши на MyMacros и выбрав Добавить | Add Module...
Вставьте следующее в редактор исходного кода:
Imports System
Imports System.IO
Imports System.Text.RegularExpressions
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module CustomMacros
Sub BreakpointFindResults()
Dim findResultsWindow As Window = DTE.Windows.Item(Constants.vsWindowKindFindResults1)
Dim selection As TextSelection
selection = findResultsWindow.Selection
selection.SelectAll()
Dim findResultsReader As New StringReader(selection.Text)
Dim findResult As String = findResultsReader.ReadLine()
Dim findResultRegex As New Regex("(?<Path>.*?)\((?<LineNumber>\d+)\):")
While Not findResult Is Nothing
Dim findResultMatch As Match = findResultRegex.Match(findResult)
If findResultMatch.Success Then
Dim path As String = findResultMatch.Groups.Item("Path").Value
Dim lineNumber As Integer = Integer.Parse(findResultMatch.Groups.Item("LineNumber").Value)
Try
DTE.Debugger.Breakpoints.Add("", path, lineNumber)
Catch ex As Exception
' breakpoints can't be added everywhere
End Try
End If
findResult = findResultsReader.ReadLine()
End While
End Sub
End Module
В этом примере используются результаты из окна "Найти результаты 1".;возможно, вы захотите создать индивидуальный ярлык для каждого окна результатов.
Вы можете создать сочетание клавиш, перейдя в меню Сервис | Параметры...и выбирая Клавиатура под Окружающая среда раздел в навигационной панели слева.Выберите нужный макрос и назначьте любой ярлык, который вам нравится.
Вы также можете добавить свой макрос в меню или панель инструментов, перейдя в меню Сервис | Настройка...и выбрав Макросы раздел в навигационной панели слева.Как только вы найдете нужный макрос в списке, вы можете перетащить его в любое меню или панель инструментов, где его текст или значок можно настроить так, как вы хотите.
Другие советы
Если вы можете точно выполнить поиск по слову, вы можете использовать пару сочетаний клавиш, чтобы сделать это быстро.
Инструменты -> Параметры -> Окружающая среда -> Клавиатура
- Редактировать.GoToFindResults1NextLocation
- EditorContextMenus.CodeWindow.Точка останова.Вставить точку останова
Назначьте им клавиши Control + Alt + F11 и F10, и вы сможете очень быстро просмотреть все результаты.Однако я не нашел кратчайшего пути для перехода к следующей ссылке.
Мне нужно было что-то подобное, чтобы отключить все точки останова и установить точку останова для каждого "Catch ex как исключение".Однако я немного расширил это, чтобы оно устанавливало точку останова при каждом появлении выбранной вами строки.Все, что вам нужно сделать с этим, это выделить строку, в которой вы хотите установить точку останова, и запустить макрос.
Sub BreakPointAtString()
Try
DTE.ExecuteCommand("Debug.DisableAllBreakpoints")
Catch ex As Exception
End Try
Dim tsSelection As String = DTE.ActiveDocument.Selection.text
DTE.ActiveDocument.Selection.selectall()
Dim AllText As String = DTE.ActiveDocument.Selection.Text
Dim findResultsReader As New StringReader(AllText)
Dim findResult As String = findResultsReader.ReadLine()
Dim lineNum As Integer = 1
Do Until findResultsReader.Peek = -1
lineNum += 1
findResult = findResultsReader.ReadLine()
If Trim(findResult) = Trim(tsSelection) Then
DTE.ActiveDocument.Selection.GotoLine(lineNum)
DTE.ExecuteCommand("Debug.ToggleBreakpoint")
End If
Loop
End Sub
Надеюсь, у вас это сработает :)
Пол, большое спасибо, но у меня следующая ошибка (окно сообщения), возможно, мне нужно перезагрузить компьютер:
Error
---------------------------
Error HRESULT E_FAIL has been returned from a call to a COM component.
---------------------------
OK
---------------------------
Я бы предложил следующее решение, которое очень простое, но оно работает для меня
Sub BreakPointsFromSearch()
Dim n As Integer = InputBox("Enter the number of search results")
For i = 1 To n
DTE.ExecuteCommand("Edit.GoToNextLocation")
DTE.ExecuteCommand("Debug.ToggleBreakpoint")
Next
End Sub