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
- Атрибуты
- Реализации
Примеры
Расширения вставляются тремя способами:
Обозреватель фрагментов кода,
Выбор имени ярлыка фрагмента из списка завершения или
Введя ярлык и введя символ завершения, например знак табуляции или пробела.
В следующем примере показан один из способов управления авторасширением, которое активируется при вводе сочетания клавиш, за которым следует клавиша 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) |
Подготавливает для вставки указанного фрагмента. |