基本上,是否可以将分类器添加到自定义的OutputWindow窗格?
我可以使用以下代码将新窗格添加到输出窗口:
IVsOutputWindow outputWindow = null;
outputWindow = ServiceProvider.GlobalProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
if (outputWindow.CreatePane(ref GuidList.guidDebugOutputFilteredPane, "FilteredOutput", 1, 1) == Microsoft.VisualStudio.VSConstants.S_OK)
{
if (outputWindow.GetPane(ref GuidList.guidDebugOutputFilteredPane, out filteredPane) == Microsoft.VisualStudio.VSConstants.S_OK)
{
filteredPane.OutputString("Created filtered pane. Need to add a classifier...");
}
}
但我不知道如何为它添加分类器。我已经在“输出”窗口的“调试”窗格中添加了一个分类器,我想在FilteredOutput窗格中显示一些其他语法着色之前进行一些重新格式化和过滤。
我使用自己的ContentTypeDefinition(来自MSDN)创建了FilteredOutput分类器:
internal sealed class Components
{
[Export]
[Name("FilteredOutput")]
[BaseDefinition("Output")]
internal static ContentTypeDefinition FilteredOutputContentTypeDefinition;
}
然后我用它来创建一个新的IClassiferProvider:
[ContentType("FilteredOutput")]
[Export(typeof(IClassifierProvider))]
public class FilteredOutputClassifierProvider : IClassifierProvider
{
[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;
public static FilteredOutputClassifier FilteredOutputClassifier { get; private set; }
public IClassifier GetClassifier(ITextBuffer textBuffer)
{
return FilteredOutputClassifier ?? (FilteredOutputClassifier = new FilteredOutputClassifier(ClassificationRegistry));
}
}
调用DebugOutput会调用 GetClassifier()
,但不会调用FilteredOutput。使用VSPackage类型扩展是否可行?这是在VS2013中使用最新的VSSDK。
答案 0 :(得分:0)
在挖掘文档的同时偶然找到解决方案;使用CreatePane2()
界面中的IVsOutputWindow3
,该界面允许您按名称指定内容类型。类似的东西:
IVsOutputWindow outputWindow = null; IVsOutputWindow3 outputWindow3 = null; outputWindow = ServiceProvider.GlobalProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow; outputWindow3 = ServiceProvider.GlobalProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow3; if (outputWindow3.CreatePane2(ref GuidList.guidDebugOutputFilteredPane, "Filtered Output", 1, 1, "FilteredOutput", PredefinedTextViewRoles.Debuggable) == Microsoft.VisualStudio.VSConstants.S_OK) { if (outputWindow.GetPane(ref GuidList.guidDebugOutputFilteredPane, out filteredPane) == Microsoft.VisualStudio.VSConstants.S_OK) { filteredPane.OutputString("Created filtered pane. Need to add a classifier..."); } }