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

时间:2015-03-14 05:05:31

标签: c# visual-studio-2013 dsl vs-extensibility

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

enter image description here

但是,我想更进一步,在“文本编辑器”下添加我自己的部分,以便我可以维护Tab设置等语言(如下所示): enter image description here

我发现很难在线找到Visual Studio可扩展性的资源,因为你可以做很多事情,但知道从哪里开始通常很困难。我也对自定义项目/项目服务感兴趣,但在查找样本方面也存在类似问题。

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

3 个答案:

答案 0 :(得分:4)

我发现这个blog post它有很多Visual Studio Extension项目样本。其中有一个名为Options Page – VS 2013的项目我觉得这就是你要找的东西:

Option page

对于您的特定情况,您应该调整类中的以下属性(取自示例)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>

这是我的尝试:

enter image description here

请谨慎使用现有类别将覆盖现有类别。如图所示,所有其他语言都没有选项。

编辑:

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

[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 :(得分:0)

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

User Settings and Options

基本上,您的扩展程序还应提供一个包以提供自定义选项页面。使用托管包框架(MPF)时包和选项页面位置之间的绑定是通过ProvideOptionPageAttribute完成的,它接收类别名称,页面名称等。请参阅Creating Options Pages By Using Managed Package Framework Classes

答案 2 :(得分:0)

要使用自定义语言来完成您想做的事情,必须完成两件事:

1)在“工具/选项/文本编辑器/ {CustomLanguage}”下有一个自定义的“选项”页面,其中包含用于设置的标准“常规”,“滚动条”和“选项卡”对话框。

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

我为QMBasic创建了很多扩展包,这是Pick-like数据库QM的多值语言。我对语法着色,花括号匹配和自动完成提供程序有一定的了解,并且很有魅力。我不知道为什么我没有一遍又一遍地引用新的自定义“内容类型”选项页面。事实证明,文档和Visual Studio会引用诸如内容类型和语言服务之类的内容,并且您认为它们是相同的,但事实并非如此。 Visual Studio的MEF部分主要使用内容类型来提供扩展点,在这种情况下,扩展点在编辑某种类型的“内容类型”或语言时使用。效果很好。

Visual Studio可以很好地完成所有这些事情,而无需注册“语言服务”,这是获取创建的自定义选项页面并获取其值以供编辑器使用的实际技巧。要获得为您的语言创建的自定义选项页面,您只需要生成该语言的Guid,然后将其注册到您的软件包定义中即可。这样。

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

然后,像这样,Visual Studio将在“工具/选项/文本编辑器/ QMBasic”部分为您创建“常规”,“滚动条和选项卡”对话框页面,并将用户设置保存在注册表中。

但是您会发现编辑器不会自动使用这些新设置。 Visual Studio似乎对内容类型和LanguageName进行了区分,您可以在上面的ProvideLanguageService定义中看到。

我使用EditorFactory为QMBasic生成代码编辑窗口,他们正在创建内容类型为“ QMBasic”的VSTextBuffer。

pTextBuffer  =_IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapter(_IOleServiceProvider, _QMBasicContentType);

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

pTextBuffer.SetLanguageServiceID(GuidList.guidQMBasicLanguageServiceId);

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