Поделиться через


Практическое руководство. Управление редактором кода (Visual Basic)

Редактор кода Visual Studio представляет собой текстовый редактор, приспособленный к службам языков, таких как Visual Basic, Visual C++, и Visual C#. Текст записывается в буфер и выводится на экран в виде текстового документа. Используя объекты модели автоматизации редактора Visual Studio, можно незаметно управлять текстом как в буфере, так и в представлении.

Для управления текстом в редакторе кода используются следующие четыре основных объекта:

Имя объекта

Описание

TextSelection

Используется для управления текстом в представлении. Объект TextSelection представляет положение курсора или выделенный текст в видимом документе.

TextPoint

Фиксированная позиция в текстовом буфере.

EditPoint2

Аналогичен объекту TextPoint, но может перемещаться и изменять текст в буфере.

VirtualPoint

Аналогичен объекту TextPoint, но содержит дополнительные возможности поиска текста в виртуальном пространстве.

Два основных объекта, используемые для управления редактором кода — это объекты TextSelection и EditPoint2. Основные различия между ними описаны далее.

  • TextSelection представляет видимый участок выделения текста. Изменение его положения изменяет отображаемый участок выделения. EditPoint2 не привязан ни к какому компоненту пользовательского интерфейса, поэтому изменение его положения ничего не меняет в представлении.

  • Поскольку TextSelection представляет видимое выделение, для каждого документа существует только один объект TextSelection. Хотя можно использовать несколько объектов TextSelection для одного документа, все они будут указывать на одно и то же видимое выделение и иметь одинаковые координаты. При этом можно использовать столько объектов EditPoint2, сколько требуется, и все они могут указывать на различные координаты.

  • Методы объекта TextSelection построены таким образом, что имеют однозначное соответствие с действиями пользователя, тогда как методы EditPoint2 — нет. В результате, некоторые методы EditPoint2 выполняют действия, которые не могут быть выполнены никаким отдельным методом TextSelection, в то время как другие методы EditPoint2 выполняют более детализированные действия, чем методы TextSelection. По этой причине TextSelection обладает большим количеством свойств и методов, чем EditPoint2.

Использование этих объектов дает следующие возможности:

  • Выделение, добавление, удаление и перемещение текста в буфере или представлении.

  • Перемещение положения курсора в буфере или представлении.

  • Структурирование текста в буфере или представлении.

  • Вставка, удаление закладок и перемещение по ним.

  • Добавление или удаление текста, включая пробелы.

  • Поиск и замена текста по заданному образцу.

  • Создание раздела структуры в коде и тексте.

  • Извлечение таких сведений о тексте, как положение текста, верхние и нижние границы документа, границы выделенного текста и т.д.

В следующих примерах макросов показано, как использовать различные члены модели автоматизации редактора и создавать ссылки на них. Дополнительные сведения о запуске примеров кода см. в разделе Практическое руководство. Компиляция и выполнение примеров кода модели объектов автоматизации.

Кроме того, можно просмотреть макрос проверки орфографии и другие примеры, демонстрирующие использование модели автоматизации редактора, на веб-узле образцов автоматизации Visual Studio (https://msdn2.microsoft.com/en-us/vstudio/aa718336.aspx).

Примечание

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска. Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить настройки, в меню Сервис выберите команду Импорт и экспортпараметров.Дополнительные сведения см. в разделе Работа с параметрами.

Типы HTMLWindow3, vsHTMLPanes и vsHTMLViews были добавлены с введением представления с разделением в HTML-редактор Visual Studio 2008. В представлении с разделением элементы вкладок и представления окна редактирования HTML разделены. Переключение режима (в режим конструктора или исходного кода) не обязательно означает переключение вкладки (“Конструктор/Разделение/Исходный код”). Например, если щелкнуть вкладку “Разделение”, то переключение между представлением конструктора и представлением исходного кода не изменяет вкладку, а только активирует или деактивирует панель конструктора или исходного кода в представлении с разделением.

Пример

Пример макроса для ActivePoint. В следующем примере также показано использование StartOfLine, DisplayColumn и EndOfLine. Перед запуском этого примера откройте файл с кодом или текстовый документ в Visual Studio, добавьте в него текст и выделите часть текста.

' Macro example for TextSelection.ActivePoint.
'
Sub ActivePointExample()
    ' Before running this example, open a text document.
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection
    Dim objActive As VirtualPoint = objSel.ActivePoint
     ' Collapse the selection to the beginning of the line.
    objSel.StartOfLine()
     ' objActive is "live", tied to the position of the actual 
     ' selection, so it will reflect the new position.
    Dim iCol As Long = objActive.DisplayColumn
     ' Move the selection to the end of the line.
        objSel.EndOfLine()

    MsgBox("The length of the insertion point line is " & _
    (objActive.DisplayColumn - iCol) & " display characters.")
End Sub

Пример макроса для AnchorPoint. В следующем примере также показано использование DisplayColumn, Line, StartOfDocument и EndOfDocument. Перед запуском этого примера откройте файл с кодом или текстовый документ в Visual Studio, добавьте в него текст и выделите часть текста.

' Macro example for TextSelection.AnchorPoint.
'
Sub AnchorPointExample()
    ' Before running this example, open a text document.
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection
    Dim objAnchor As VirtualPoint = objSel.AnchorPoint
    ' objAnchor is "live", tied to the position of the actual 
    ' selection, so it will reflect changes. iCol and iRow are created 
    ' here to save a "snapshot" of the anchor point's position at this 
    ' time.
    Dim iCol As Long = objAnchor.DisplayColumn
    Dim iRow As Long = objAnchor.Line
    ' As the selection is extended, the active point moves but the 
    ' anchor point remains in place.
    objSel.StartOfDocument(True)
    objSel.EndOfDocument(True)

    If (iCol = objAnchor.DisplayColumn And iRow = objAnchor.Line) Then
        MsgBox("The anchor point has remained in place at row " & _
        iRow & ", display column " & iCol)
    End If
End Sub

Пример макроса для Insert. В следующем примере также показано использование IsEmpty, WordLeft, WordRight, Text, Delete и MoveToPoint. Перед запуском этого примера откройте файл с кодом или текстовый документ в Visual Studio и добавьте в него текст.

' Macro example for TextSelection.Insert.
'
Sub InsertExample()
    ' Before running this example, open a text document.
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection
    If objSel.IsEmpty Then
        ' If there is no text selected, swap the words before and after 
        ' the insertion point. We begin by selecting the word before 
        ' the insertion point.
        objSel.WordLeft(True)
        If Not objSel.IsEmpty Then
            ' We can continue only if the selection was not already at 
            ' the beginning of the document.
            Dim strBefore As String = objSel.Text

            ' The text is saved in strBefore; now delete it and move 
            ' past the following word.
            objSel.Delete()
            objSel.WordRight(True)
            If objSel.Text.StartsWith(" ") Or _
            objSel.Text.StartsWith(Microsoft.VisualBasic. _
            ControlChars.Tab) Then
                ' The previous call to WordRight may have skipped some 
                ' white space instead of an actual word. In that case, 
                 ' we should call it again.
                objSel.WordRight(True)
            End If

            ' Insert the new text at the end of the selection.
            objSel.Insert(strBefore, _
            vsInsertFlags.vsInsertFlagsInsertAtEnd)
        End If
    Else
        ' If some text is selected, replace the following word with the 
        ' selected text.
        Dim strSelected As String = objSel.Text

        objSel.MoveToPoint(objSel.BottomPoint)
        objSel.WordRight(True)
        If objSel.Text.StartsWith(" ") Or _
        objSel.Text.StartsWith(Microsoft.VisualBasic. _
        ControlChars.Tab) Then
            ' The previous call to WordRight may have skipped some 
            ' white space instead of an actual word. In that case, we 
            ' should call it again.
            objSel.WordRight(True)
        End If

        ' Insert the text, overwriting the existing text and leaving 
        ' the selection containing the inserted text.
        objSel.Insert(strSelected, _
        vsInsertFlags.vsInsertFlagsContainNewText)
    End If
End Sub

Пример макроса для FindPattern. В следующем примере также показано использование SelectLine. Перед запуском этого примера нужно открыть текстовый документ или файл с кодом в Visual Studio и добавить в него текст.

' Macro example for TextSelection.FindPattern.
'
Sub FindPatternExample()
    ' Before running this example, open a text document.
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection

    ' Advance to the next Visual Basic function beginning or end by 
    ' searching for  "Sub" with white space before and after it.
    If objSel.FindPattern(":WhSub:Wh", _
    vsFindOptions.vsFindOptionsRegularExpression) Then
        ' Select the entire line.
        objSel.SelectLine()
    End If
End Sub

Пример макроса для OutlineSection. В следующем примере также показано использование StartOfDocument, Line, LineCharOffset, FindPattern, SwapAnchor, MoveToLineAndOffset и LineDown. Перед запуском этого примера откройте документ с кодом в Visual Studio, содержащий блок #if _DEBUG…#endif.

' Macro example for TextSelection.OutlineSection.
'
Sub OutlineSectionExample()
    ' Before running this example, open a code document
    ' containing a #if _DEBUG…#endif block.
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection

    ' Move to the beginning of the document so we can iterate over the 
    ' whole thing.
    objSel.StartOfDocument()
    While objSel.FindPattern("#if _DEBUG")
        ' If we found the beginning of a debug-only section, save the 
        ' position.
        Dim lStartLine As Long = objSel.TopPoint.Line
        Dim lStartColumn As Long = objSel.TopPoint.LineCharOffset

        ' Look for the end.
        If objSel.FindPattern("#endif") Then
            ' Select the entire section and outline it.
            objSel.SwapAnchor()
            objSel.MoveToLineAndOffset(lStartLine, lStartColumn, True)
            objSel.OutlineSection()
            objSel.LineDown()
        End If
    End While
End Sub

В примере макроса открывается текстовый документ и в нем создается список всех доступных команд.

' Macro example
  ' This generates a text document listing all available command names.
Sub CommandNamesCollapseExample()
  Dim Cmd As Command
  Dim Commands As Commands = DTE.Commands 
  Dim PrjItem As ProjectItem
  Dim Doc As Document
  Dim TxtDoc As TextDocument
  DTE.ItemOperations.NewFile ("General\Text File")
  Set Doc = ActiveDocument
  Set TxtDoc = Doc.Object("TextDocument")
  For Each Cmd In Commands
  If (Cmd.Name <> "") Then
    TxtDoc.Selection.Text = Cmd.Name & vbLF
    TxtDoc.Selection.Collapse
  End If
  Next
End Sub

Пример макроса для объекта HTMLWindow. В следующем примере также показано использование ActiveDocument, ActiveWindow, Window, CurrentTab, CurrentTabObject, ActivePane, StartPoint, CreateEditPoint, FindPattern и InsertFromFile. Перед запуском этого примера откройте документ HTML в Visual Studio.

' Macro example for HTMLWindow object

Sub HTMLWindowExample()
   ' Open an HTML document before running this sample.
   If TypeOf ActiveDocument.ActiveWindow.Object Is HTMLWindow Then
      ' Ask the user for a file to insert into the body of the HTML 
      ' document. This file should be an HTML fragment.
      Dim strFile As String = InputBox("Enter the name of a file to _
      insert at the end of the HTML document:")
      ' Get the HTMLWindow object and determin which tab is currently 
      ' active.
      Dim objHTMLWin As HTMLWindow = ActiveDocument.ActiveWindow.Object
      Dim Tab As vsHTMLTabs = objHTMLWin.CurrentTab

      ' Switch to the "source" tab.
      objHTMLWin.CurrentTab = vsHTMLTabs.vsHTMLTabsSource

      ' Get an EditPoint at the start of the text.
      Dim objTextWin As TextWindow = objHTMLWin.CurrentTabObject
      Dim objEP As EditPoint = _
      objTextWin.ActivePane.StartPoint.CreateEditPoint

      ' Look for the end of the document body.
      If objEP.FindPattern("</body>") Then
         ' Insert the contents of the file.
         objEP.InsertFromFile(strFile)
      End If

      ' Switch back to the original view of the HTML file.
       objHTMLWin.CurrentTab = Tab
   Else
      MsgBox("You must open an HTML document.")
   End If
End Sub

См. также

Задачи

Практическое руководство. Изменение параметров окон

Практическое руководство. Создание надстройки

Пошаговое руководство. Создание мастера

Основные понятия

Диаграмма модели объектов автоматизации

Другие ресурсы

Создание окон среды и управление ими

Создание надстроек и мастеров

Справочник по автоматизации и возможностям расширения среды