VSIX如何针对其他已安装的扩展命令我的分类器提供程序

时间:2014-03-24 09:30:46

标签: visual-studio visual-studio-2013 vsix

我开发了一个玩具vsix扩展。它实现了F#源文件的分类器。 与此同时,来自FSharp Power Tools的人员升级了他们的扩展,为F#文件提供语法高亮。

现在在VS 2013中,我的分类器总是在他们之前运行,因此它们会覆盖我的着色。

有没有办法为另一个人订购分类器?我没有通过谷歌搜索找到任何关于此的信息。

由于

3 个答案:

答案 0 :(得分:3)

不幸的是没有办法做到这一点。分类是一种标记形式,标记在Visual Studio中是无序的。编辑器只是为所有标记实现运行导入,并且基本上默认为MEF导入以进行排序。

可以使用[Order]属性对Visual Studio中的许多挂钩进行排序。这通常作为MSDN文档的一部分列出。它不是用于分类/标记,我检查了实现以确保它不是疏忽(它不是)。

答案 1 :(得分:1)

我已经明白了。

在我的情况下, Priority.Low 必须指定为实现 ClassificationFormatDefinition 的类的Order属性。

实际上,此解决方案仅适用于 2分类器。 FSharp Power Tools具有订单(After = Priority.Default) 在After = Priority.Low。

之后,我的分类器将在FSharp Power Tools之后调用
[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "FSharpNumberClassifier")]
[Name("FSharpNumberClassifier")]
[UserVisible(true)] //this should be visible to the end user
[Order(After = Priority.Low)] 
internal sealed class FSharpNumberClassifierFormat : ClassificationFormatDefinition

答案 2 :(得分:0)

其实我遇到过类似的问题。我的VSIX扩展通过正则表达式在代码中着色DSL语句。问题在于代码中的注释 - 它没有避免它们,并且编写逻辑来分析所有与注释相关的案例并生成正确的标签是相当多的工作,实际上太多了。所以我想出了一个想法 - 可能是我可以在评论和预处理器指令之前重新排列着色的顺序。然后这些颜色将覆盖我不正确的颜色。

我已经用谷歌搜索了Order属性,但它在我的情况下不起作用,因为据我记得我无法将我的分类类型放在正确的位置,它要么覆盖了注释着色,要么被其他一些默认值覆盖染色。我所需要的只是增加注释和预处理器定义的优先级,使它们覆盖我的着色。这是一个hacky的决定,但它对我有用。

所以我最终得到了以下解决方案。在一个初始化你的分类格式的类中(在我的例子中它是tagger提供者)我通过MEF添加了IClassificationFormatMapService服务。我还有IClassificationTypeRegistryService服务来获取IClassificationType对象

$ kubectl run nginx3 --image nginx --port 80

对于预定义分类类型的名称,您需要Microsoft.VisualStudio.Language.StandardClassification nuget包。 然后你应该将using指令添加到你的文件

[Import]
internal IClassificationFormatMapService classificationFormatMapService = null; 

[Import]
internal IClassificationTypeRegistryService classificationRegistry = null;

然后我使用了以下代码片段:

using Microsoft.VisualStudio.Language.StandardClassification;

它对我有用。这是一个实验性代码,缺乏关于瞬态分类类型和分类顺序的文档,所以我不是百分之百(甚至90%)确定它能完成所有事情并且不会破坏VS中的某些东西。

但是,毕竟你可以在运行时改变分类顺序(尽管你不能明确地告诉确切的位置,你必须使用SwapPriorities方法,这将改变两种格式的位置)