Visual Studio 可扩展性 - 自定义语言文本编辑器设置

Visual Studio Extensibility - Custom Language Text Editor Settings

我正在尝试在 Visual Studio 内开发语言服务,到目前为止,我已经能够为高亮显示和跨度实现基本的标记器:

但是,我想更进一步,在 'Text Editor' 下添加我自己的部分,以便我可以维护选项卡设置,以及语言的类似设置(如下所示):

我发现很难在线找到 Visual Studio 可扩展性的资源,因为您可以做很多事情,但通常很难知道从哪里开始。我也对自定义 project/item 服务感兴趣,但在查找示例时遇到类似问题。

我可能已经很接近了(由于自定义标记器),我只是不知道用什么来装饰导出的类型,或者我有很多基础工作要做。方向表示赞赏。

关于创建用户设置和选项的文档位于:

User Settings and Options

基本上您的扩展还应该提供一个包来提供自定义选项页面。使用托管包框架 (MPF) 时包和选项页面位置之间的绑定是通过 ProvideOptionPageAttribute, that receives the category name, page name, etc. See Creating Options Pages By Using Managed Package Framework Classes

完成的

我找到了这个blog post it has a lot of Visual Studio Extension project samples. Among them there is one project called Options Page – VS 2013我想这就是你要找的:

对于您的具体情况,您应该调整 class(取自示例)OptionsPagePackage.cs 中的以下属性。特别是这些属性:

将 "category" 作为第二个传递参数(对应于“工具”菜单中的主要类别)。

[ProvideOptionPageAttribute(typeof(OptionsPageGeneral),"Text Editor","General", 100, 101, true, new string[] { "Change sample general options (C#)" })] 
    [ProvideProfileAttribute(typeof(OptionsPageGeneral), "Text Editor", "General Options", 100, 101, true, DescriptionResourceID = 100)] 
    [ProvideOptionPageAttribute(typeof(OptionsPageCustom), "Text Editor", "Custom", 100, 102, true, new string[] { "Change sample custom options (C#)" })] 
    [InstalledProductRegistration("Text Editor", "My Options Page (C#) Sample", "1.0")] 
    [Guid(GuidStrings.GuidPackage)] 
    public class OptionsPagePackageCS : Package 
    { 
    .....
    }

DescriptionResourceID(100,101,102 等)在 xml 文件 VsPackage.resx 中定义,vsix 安装程序将使用它在工具菜单中插入标签:

<data name="100" xml:space="preserve">
    <value>My Managed Options (C#)</value>
    <comment>Options category</comment>
  </data>
  <data name="101" xml:space="preserve">
    <value>My Options</value>
    <comment>General page</comment>
  </data>
  <data name="102" xml:space="preserve">
    <value>Custom</value>
    <comment>Custom page</comment>
  </data>

这是我的尝试:

请小心,因为使用现有类别会覆盖现有类别。正如您在图片中看到的,没有所有其他语言的选项。

编辑:

正如 Alexander 所指出的那样,为了避免覆盖现有配置(如果想将他的类别添加到“工具”菜单中的现有类别),必须将反斜杠添加到类别中上述属性中的参数。例如:

[ProvideOptionPageAttribute(typeof(OptionsPageGeneral),"Text Editor","General", 100, 101, true, new string[] { "Change sample general options (C#)" })]

变为:

 [ProvideOptionPageAttribute(typeof(OptionsPageGeneral),"Text Editor\MyOptionPage","General", 100, 101, true, new string[] { "Change sample general options (C#)" })]

在这种情况下,MyOptionPage 将成为文本编辑器的子项,并且不会覆盖现有配置。

希望对您有所帮助。

要让自定义语言执行您想要的操作,有两个主要的必要条件:

1) 在 Tools/Options/Text Editor/{CustomLanguage} 下有一个自定义选项页面,其中包含用于设置的标准常规、滚动条和选项卡对话框。

2) 您希望内置代码编辑器在编辑来自您的语言的内容时自动使用您的自定义设置。 {自定义语言}。

我有一堆为 QMBasic 创建的包扩展,QMBasic 是一种用于类似 Pick 的数据库 QM 的多值语言。我有语法着色、大括号匹配和自动完成提供程序的智能感知,工作起来就像一个魅力。我不明白为什么我一遍又一遍地引用的新自定义 "Content Type" 没有选项页面。事实证明,文档和 Visual Studio 就此而言参考了诸如内容类型和语言服务之类的内容,您假设它们是相同的,但它们不是。 Visual Studio 的 MEF 部分主要使用内容类型来提供扩展点,在这种情况下编辑某种类型的 "Content Type" 或语言时会使用这些扩展点。效果很好。

Visual Studio 将在不注册 "Language Service" 的情况下完成所有这些事情,这是创建自定义选项页面并让编辑器使用它们的值的实际技巧。要获得为您的语言创建的自定义选项页面,您只需为该语言生成一个 Guid,然后将其注册到您的包定义中。像这样。

[ProvideLanguageService(QMBasicEditor.GuidList.guidQMBasicLanguageServiceIdString, "QMBasic", languageResourceID: 204, RequestStockColors = true, ShowDropDownOptions = true, ShowSmartIndent = true, DefaultToInsertSpaces = true)]

然后 Visual Studio 将在 Tools/Options/Text Editor/QMBasic 部分为我创建常规、滚动条和选项卡对话框页面,并保留用户在注册表中为您设置。

但是您会发现编辑器不会自动使用这些新设置。 Visual Studio 似乎区分了您在上面的 ProvideLanguageService 定义中看到的 Content Type 和 LanguageName。

我使用 EditorFactory 为 QMBasic 生成我的代码编辑 windows,他们正在创建内容类型 "QMBasic".

的 VSTextBuffers
pTextBuffer  =_IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapter(_IOleServiceProvider, _QMBasicContentType);

我认为这就足够了,可惜事实并非如此。 IVSTextBuffer 接口提供了一个漂亮的小助手方法,您必须使用它,称为 SetLanguageService,它提供了这种魔力。在我的编辑器工厂中,它就像

一样简单
pTextBuffer.SetLanguageServiceID(GuidList.guidQMBasicLanguageServiceId);

仅此而已。内置代码编辑器现在像我预期的那样使用选项页面中的自定义设置。