1

我正在尝试创建一个处理多语言内容类型的 Visual Studio 扩展。很像一些 mvc 模板和 Django 或 ASP.NET,其中某些部分的代码是另一种语言。

我知道我应该使用 Projection 并且我已经检查了Django 的 Visual Studio 扩展,但那里的解决方案包括创建语言服务并费力地创建与代码编辑器相关的所有点点滴滴。在这里,我试图通过使用 MEF 来实现相同的目标。

我知道你可以IProjectionBuffer CreateProjectionBuffer()用来创建一个投影,但问题是如何用创建的TextBuffer替换当前的 TextBuffer以及何时是最好的时间。

也有人可能期望,如果他像这样指定“投影”类型的基本定义:

[Export]
[Name("Whatever")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition WhateverContentType = null;

在提供程序中接收到的 TextBuffer 是类型IProjectionBuffer(毕竟 IProjectionBuffer 是从 ITextBuffer 继承的)。哪个不是,似乎投影基础定义没有任何效果。

因此,如果我想在 tldr 版本中重新表述我的问题:

您如何以及何时将 IProjectionBuffer 应用于当前视图(使用 MEF 并且不创建编辑器实例)?

4

1 回答 1

1

所以如果我正确理解你的问题,答案是“你没有”。IWpfTextView 在创建时绑定到 ITextBuffer(或派生类型,如 IProjectionBuffer)的实现,并且无法更改。即使可以,许多其他扩展和语言服务也会对此感到最惊讶,并且可能会崩溃。

要解决您关于内容类型的第二个问题:简单地声明您具有“投影”的基本内容类型并不会使您成为投影缓冲区。真正说明的是您可能正在创建该类型的投影缓冲区,并且当您需要一些额外的 ITagger 支持时,标记器会按照您的期望投影到源缓冲区。

于 2013-02-14T17:24:53.050 回答