2013-08-23 61 views
0

我想为基于文本的自定义内容类型添加语法高亮显示,例如:获取IClassifier与自定义内容类型一起工作

static class RTextContentType 
{ 
    public const string ContentTypeName = Constants.CONTENT_TYPE; 
    [Export, Name(ContentTypeName), BaseDefinition("text")] 
    internal static ContentTypeDefinition ContentTypeDefinition = null; // set via MEF 
} 

然后分类提供商声明如下,

[Export(typeof(IClassifierProvider)), ContentType(Constants.CONTENT_TYPE)] 
class RTextClassifierProvider : IClassifierProvider 
{ 
    ... 
} 

的问题是,该提供的构造函数永远不会要求我指定的扩展名。这里请注意,我提供的编辑器工厂和文件扩展名与工厂有关。我可以看到工厂通过调试所有相关文件来初始化。

如果我将内容类型更改为"text"构造函数被调用。

所以问题是,如何将自定义内容类型映射到文件扩展名?

第二个音符,使用FileExtensionToContentTypeDefintion

是不是一种选择,因为它不会让很多功能..

感谢您的帮助:)

回答

2

你实现IVsEditorFactory负责设置编辑器中显示的文本的内容类型。此接口的默认实现包括对FileExtensionToContentTypeDefinitionAttribute的特殊支持,作为不需要某些更高级功能(例如,用于多种内容类型的投影缓冲区)的用户的简单扩展机制。

DjangoEditorFactory类包括一个名为TextBufferEventListener的嵌套类,它显示了编辑器工厂如何将内容类型分配给显示在编辑器窗口中的缓冲区的一个示例。

+0

是的,我正在看这个实施。看起来相当复杂。所以我想我也必须实现这个的一个实例,但可能没有elision缓冲区。什么意思默认实现btw?来自Visual Studio的模板?我没有计划拥有多种内容类型,所以这种默认实现可能会有所帮助。 – FailedDev

+1

如果您没有将您的文件扩展名与自定义编辑器工厂关联,那么Visual Studio将使用其自己的编辑器工厂的内部实现。该实现通过许多不同的方式分配内容类型,其中之一就是您提到的属性。 –

+0

但当然,使用默认实现不允许man创建导航栏等,或向编辑器添加新的文件扩展名。 – FailedDev

相关问题