ExpansionProvider Класс

Определение

Важно!

Этот API несовместим с CLS.

Обеспечивает поддержку вставки фрагментов кода в исходный код.

public ref class ExpansionProvider : IDisposable, Microsoft::VisualStudio::TextManager::Interop::IVsExpansionClient
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(true)]
public class ExpansionProvider : IDisposable, Microsoft.VisualStudio.TextManager.Interop.IVsExpansionClient
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ExpansionProvider = class
    interface IDisposable
    interface IVsExpansionClient
Public Class ExpansionProvider
Implements IDisposable, IVsExpansionClient
Наследование
ExpansionProvider
Атрибуты
Реализации

Примеры

Расширения вставляются тремя способами:

  1. Обозреватель фрагментов кода,

  2. Выбор имени ярлыка фрагмента из списка завершения или

  3. Введя ярлык и введя символ завершения, например знак табуляции или пробела.

В следующем примере показан один из способов управления авторасширением, которое активируется при вводе сочетания клавиш, за которым следует клавиша TAB. Этот метод вызывается каждый раз при вводе клавиши TAB.

using Microsoft.VisualStudio.Package;  
using Microsoft.VisualStudio;  

namespace MyLanguagePackage  
{  
    class MyViewFilter : ViewFilter  
    {  
        // This is called from our HandlePreExec when a tab key is pressed  
        bool HandleTabKey()  
        {  
            ExpansionProvider ep = GetExpansionProvider();  
            if (ep == null || ep.InTemplateEditingMode)  
            {  
                // No expansion provider or already editing a template,  
                // so nothing to do.  
                return false;  
            }  

            TokenInfo tokenInfo = Source.GetTokenInfo(TextView);  
            if (tokenInfo.StartLine != tokenInfo.EndLine ||  
                tokenInfo.StartIndex == tokenInfo.EndIndex)  
            {  
                // No shortcut found before caret, so nothing to do.  
                // Note that the above test does not allow for single  
                // character tokens to be shortcut names.  
                return false;  
            }  

            int line;  
            int col;  
            int hr;  
            hr = TextView.GetCaretPos(out line,out col);  
            if (hr != VsConstants.S_OK)  
            {  
                // Could not get current position, so nothing to do.  
                // GetCaretPos is used in Source.GetTokenInfo so if  
                // GetCaretPos fails, GetTokenInfo fails. However,  
                // better to be thorough and test again here.  
                return false;  
            }  

            // Get shortcut text that was just typed.  
            string shortcut = Source.GetText(line,  
                                             tokenInfo.StartIndex,  
                                             line,  
                                             tokenInfo.EndIndex);  
            if (shortcut == null || shortcut == "")  
            {  
                // No text was found at the position. This failure is  
                // is not likely if GetTokenInfo returned a valid token  
                // but better to be thorough.  
                return false;  
            }  

            string snippetTitle;  
            string snippetPath;  
            TextSpan pos = new TextSpan();  
            pos.iStartLine = line;  
            pos.iStartIndex = tokenInfo.StartIndex;  
            pos.iEndLine = line;  
            pos.iEndIndex = tokenInfo.EndIndex;  
            if (ep.FindExpansionByShortcut(TextView,  
                                            shortcut,  
                                            pos,  
                                            true,  
                                            out title,  
                                            out path) != VSConstants.S_OK)  
            {  
                // No snippet matched the shortcut, so nothing to do.  
                return false;  
            }  

            // If InsertNamedExpansion returns true, snippet was  
            // inserted and therefore the Tab key was handled.  
            // Otherwise, false is returned and the Tab key will be  
            // passed on to someone else.  
            return ep.InsertNamedExpansion(TextView,  
                                           title,  
                                           path,  
                                           pos,  
                                           false);  
        }  
    }  
}  

Комментарии

Фрагмент кода — это шаблон, который расширяется до полного кода, когда пользователь вставляет фрагмент. При первом разворачивании фрагмента Visual Studio основной редактор вводит специальный режим редактирования шаблона, в котором фрагмент можно изменить на месте. То есть некоторые части фрагмента кода обозначаются как поля, и эти поля могут быть легко изменены пользователем перед фиксацией фрагмента в буфер редактора. Поля выделяются, и их можно раскрывающийся список функций, предлагающий пользователю выбрать нужный вариант.

Фрагмент имеет имя для идентификации и файл шаблона, содержащий сам фрагмент. Файл шаблона содержит XML-теги, указывающие определенные элементы шаблона от кода до полей подстановки в функции (известные как функции расширения). Дополнительные сведения о фрагментах кода см. в разделе фрагменты кода .

Примечания для тех, кто наследует этот метод

ExpansionProviderКласс предоставляет всю поддержку по выбору и вставке фрагмента кода в исходный файл. Базовый класс предоставляет все базовые функции. Однако, если требуется поддержка вставки фрагмента кода с учетом контекста (то есть фрагмент с тем же именем может вести себя по-разному в зависимости от контекста, в который он вставляется), необходимо создать класс из ExpansionProvider класса и переопределить IsValidType(IVsTextLines, TextSpan[], String[], Int32, Int32) IsValidKind(IVsTextLines, TextSpan[], String, Int32) методы и, чтобы сообщить соответствующий тип фрагмента и тип, допустимые в определенном контексте. Не забудьте переопределить CreateExpansionProvider(Source) метод в версии класса, чтобы он LanguageService возвращал вашу версию ExpansionProvider класса.

Примечания для тех, кто вызывает этот метод

Экземпляр ExpansionProvider класса возвращается из CreateExpansionProvider(Source) метода в LanguageService классе, который вызывается из GetExpansionProvider() метода в Source классе. ViewFilterКласс вызывает свой собственный GetExpansionProvider() , который, в свою очередь, перенаправляет вызов к GetExpansionProvider() методу в Source классе. ViewFilterКласс вызывает GetExpansionProvider() метод каждый раз, когда выполняется команда, чтобы ExpansionProvider класс мог действовать.

Конструкторы

ExpansionProvider(Source)

Инициализирует новый экземпляр класса ExpansionProvider.

Свойства

Expansion

Возвращает объект IVsExpansion, используемый для вставки фрагментов в буфер.

ExpansionSession

Возвращает созданный сеанс расширения для управления редактированием фрагмент кода.

InTemplateEditingMode

Указывает, редактируется ли фрагмент кода в данный момент.

Source

Возвращает объект Source, связанный с данным поставщиком расширений.

TextView

Возвращает представление текста, содержащее исходный файл, которым манипулирует поставщик расширения.

Методы

BeginTemplateEditing(Int32, Int32)

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

DisplayExpansionBrowser(IVsTextView, String, String[], Boolean, String[], Boolean)

Отображает список шаблонов расширений указанного типа и вида.

Dispose()

Очищает выделенные ресурсы перед уничтожением объекта ExpansionProvider.

EndExpansion()

Вызывается при окончании сеанса расширения

EndTemplateEditing(Boolean)

Завершает режим редактирования текущего фрагмента.

Finalize()

Очищает все ресурсы перед уничтожением объекта ExpansionProvider.

FindExpansionByShortcut(IVsTextView, String, TextSpan, Boolean, String, String)

Получает путь и название фрагмента кода по предоставленному имени ярлыка объекта.

FormatSpan(IVsTextLines, TextSpan[])

Форматирует указанный диапазон текста.

GetExpansionFunction(IXMLDOMNode, String, IVsExpansionFunction)

Возвращает объект IVsExpansionFunction, представляющий функцию расширения, описанную в заданном узле XML-шаблонов (реализация модели COM).

GetExpansionFunction(XmlElement, String)

Возвращает объект IVsExpansionFunction, представляющий функцию расширения, описанную в заданном узле XML-шаблонов.

GetExpansionSpan()

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

GetFieldSpan(String, TextSpan)

Получает диапазон указанного поля.

GetFieldValue(String, String)

Возвращает значение указанного поля.

HandlePostExec(Guid, UInt32, UInt32, Boolean, IntPtr, IntPtr)

Вызывается после выполнения команды.

HandlePreExec(Guid, UInt32, UInt32, IntPtr, IntPtr)

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

HandleQueryStatus(Guid, UInt32, Int32)

Определяет, обрабатывается ли указанная команда классом ExpansionProvider.

InsertNamedExpansion(IVsTextView, String, String, TextSpan, Boolean)

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

InsertSpecificExpansion(IVsTextView, XmlElement, TextSpan, String)

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

IsValidKind(IVsTextLines, TextSpan[], String, Int32)

Определяет, является ли это допустимым текстом для расширения. Этот метод должен быть переопределен, если нужно задать, где в исходном документе может быть расширение.

IsValidType(IVsTextLines, TextSpan[], String[], Int32, Int32)

Определяет, допустим ли заданный тип для целей расширения. Этот метод должен быть переопределен, если нужно задать, где в исходном документе может быть расширение.

OnAfterInsertion(IVsExpansionSession)

Вызывается после помещения фрагмента в источник.

OnBeforeInsertion(IVsExpansionSession)

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

OnItemChosen(String, String)

Вызывается, когда элемент выбран в обозревателе фрагментов.

PositionCaretForEditing(IVsTextLines, TextSpan[])

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

PrepareTemplate(String, String)

Подготавливает для вставки указанного фрагмента.

Применяется к