繁体   English   中英

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

[英]Visual Studio Extensibility - Custom Language Text Editor Settings

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

在此输入图像描述

但是,我想更进一步,在“文本编辑器”下添加我自己的部分,以便我可以维护Tab设置等语言(如下所示): 在此输入图像描述

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

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

我发现这篇博文有很多Visual Studio Extension项目样本。 其中有一个名为Options Page的项目- VS 2013我认为这就是你要找的东西:

选项页面

对于您的特定情况,您应该调整类中的以下属性(取自示例) 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指出的那样,为避免覆盖现有配置(如果想要将其类别添加到“工具”菜单中的现有配置),必须将反斜杠添加到上述属性中的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将是文本编辑器的子项,它不会覆盖现有配置。

希望能帮助到你。

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

用户设置和选项

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

要使自定义语言执行您想要的操作,有两件必要的事情要做:

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

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

我为QMBasic创建了一堆包扩展,这是一种类似于Pick的数据库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似乎区分了您在上面的ProvideLanguageService定义中看到的Content Type和LanguageName。

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

pTextBuffer  =_IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapter(_IOleServiceProvider, _QMBasicContentType);

我认为这已经够了,但唉不是。 IVSTextBuffer接口提供了一个漂亮的小助手方法,您必须使用该方法称为SetLanguageService,它提供了这种魔力。 在我的编辑器工厂,它很简单

pTextBuffer.SetLanguageServiceID(GuidList.guidQMBasicLanguageServiceId);

这就是全部。 内置代码编辑器现在使用选项页面中的自定义设置,就像我预期的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM