ExpansionProvider 类
提供用于插入代码段支持到源代码。
此 API 不兼容 CLS。
继承层次结构
System.Object
Microsoft.VisualStudio.Package.ExpansionProvider
命名空间: Microsoft.VisualStudio.Package
程序集: Microsoft.VisualStudio.Package.LanguageService.10.0(在 Microsoft.VisualStudio.Package.LanguageService.10.0.dll 中)
Microsoft.VisualStudio.Package.LanguageService(在 Microsoft.VisualStudio.Package.LanguageService.dll 中)
Microsoft.VisualStudio.Package.LanguageService.9.0(在 Microsoft.VisualStudio.Package.LanguageService.9.0.dll 中)
Microsoft.VisualStudio.Package.LanguageService.11.0(在 Microsoft.VisualStudio.Package.LanguageService.11.0.dll 中)
语法
声明
<CLSCompliantAttribute(False)> _
<ComVisibleAttribute(True)> _
Public Class ExpansionProvider _
Implements IDisposable, IVsExpansionClient
[CLSCompliantAttribute(false)]
[ComVisibleAttribute(true)]
public class ExpansionProvider : IDisposable,
IVsExpansionClient
ExpansionProvider 类型公开以下成员。
构造函数
名称 | 说明 | |
---|---|---|
ExpansionProvider | 初始化 ExpansionProvider 类的新实例。 |
页首
属性
名称 | 说明 | |
---|---|---|
Expansion | 返回用于插入代码段使用的 IVsExpansion 对象到缓冲区中。 | |
ExpansionSession | 返回已创建的外接会话管理编辑代码段。 | |
InTemplateEditingMode | 指示代码段当前是否正在编辑。 | |
Source | 返回 Source 对象与此扩展提供程序。 | |
TextView | 返回包含源文件的文本视图后操作外接程序。 |
页首
方法
名称 | 说明 | |
---|---|---|
BeginTemplateEditing | 插入以前准备的代码段并开始编辑模式的代码段。 | |
DisplayExpansionBrowser | 显示指定的类型和类型的展开模板列表。 | |
Dispose | ,在销毁之前,清理已分配的资源 ExpansionProvider 对象。 | |
EndExpansion | 调用中,展开会话关闭时。 | |
EndTemplateEditing | 关闭编辑模式的当前代码段。 | |
Equals | 确定指定的对象是否等于当前对象。 (继承自 Object。) | |
Finalize | ,在销毁之前,清理所有资源 ExpansionProvider 对象。 (重写 Object.Finalize()。) | |
FindExpansionByShortcut | 获取给定的代码段的路径和标题代码段的快捷方式名称。 | |
FormatSpan | 格式说明符的文本范围。 | |
GetExpansionFunction(XmlElement, String) | 返回表示外接功能的 IVsExpansionFunction 对象描述在特定 XML 模板节点。 | |
GetExpansionFunction(IXMLDOMNode, String, IVsExpansionFunction%) | 返回表示外接功能的 IVsExpansionFunction 对象描述在特定 XML 模板节点 (COM 实现)。 | |
GetExpansionSpan | 返回此代码段占用的大小当前编辑。 | |
GetFieldSpan | 获取指定的字段的大小 | |
GetFieldValue | 返回指定字段的值。 | |
GetHashCode | 用作特定类型的哈希函数。 (继承自 Object。) | |
GetType | 获取当前实例的 Type。 (继承自 Object。) | |
HandlePostExec | 调用,在命令执行后。 | |
HandlePreExec | 调用命令之前执行。 | |
HandleQueryStatus | 确定指定的命令是由 ExpansionProvider 类处理。 | |
InsertNamedExpansion | 指定插入的代码段添加到源中特定位置。 | |
InsertSpecificExpansion | 插入给定代码段添加到源中指定的位置。 | |
IsValidKind | 确定是否为扩展的有效的文本。此方法,则位置。若要指定源文档展开会出现,应重写。 | |
IsValidType | 确定特定类型是否为外接用途有效。此方法,则位置。若要指定源文档展开会出现,应重写。 | |
MemberwiseClone | 创建当前 Object 的浅表副本。 (继承自 Object。) | |
OnAfterInsertion | 调用,在代码段插入到数据源后。 | |
OnBeforeInsertion | 对该代码段之前插入到该数据源。 | |
OnItemChosen | 调用,该项目在代码段浏览器中选择。 | |
PositionCaretForEditing | 在位置放置脱字号适用于。 | |
PrepareTemplate | 对指定的代码段插入准备。 | |
ToString | 返回表示当前对象的字符串。 (继承自 Object。) |
页首
备注
代码段是展开到完整代码,当用户插入代码段时的模板。 当该代码段先展开时,输入特定模板编辑器可以就地修改代码段架构的 Visual Studio 核心编辑器。 即该代码段的某些部分被指定为字段,并且,这些字段可以由用户轻松地更改,在代码段提交编辑缓冲区之前。 字段显示并且可以以提供选择的下拉框中的功能对用户。
代码段都有一个标识的名称并包含此代码段的模板文件。 模板文件包含表示模板的特定元素 XML 标记,从代码来替换域的功能 (,称为外接函数)。 有关更多详细信息参见 代码段 在代码段。
对实现者的说明
ExpansionProvider 类用于选择和插入代码段提供任何支持到源文件。 基类提供所有基本功能;但是,因此,如果要支持上下文相关代码段插入 (即同名的一个代码段可能会根据其插入) 的上下文的行为不同,则必须从 ExpansionProvider 类派生类并重写在特定上下文允许的 IsValidType 和 IsValidKind 方法报告适当的代码段类型和类型。 请确保重写在 LanguageService 类版本的 CreateExpansionProvider 方法返回 ExpansionProvider 类的版本。
对调用者的说明
ExpansionProvider 类的实例从在从在 Source 类的 GetExpansionProvider 方法调用的 LanguageService 类的 CreateExpansionProvider 方法返回。 ViewFilter 类又调用转发到 GetExpansionProvider 方法的调用在 Source 类自己的 GetExpansionProvider 。 ,在其上执行命令提供 ExpansionProvider 类机会操作后, ViewFilter 类调用 GetExpansionProvider 方法。
示例
展开在三种方式插入:
代码段浏览器,
选择代码段的快捷方式名称从完成列表或
通过键入快捷方式和输入完成字符 (如选项或空格。
下面的示例演示一种通过键入键后按 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);
}
}
}
线程安全
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
请参见
参考
Microsoft.VisualStudio.Package 命名空间