22

我的问题

我正在尝试构建 Visual Studio 的扩展,允许基于每个函数而不是每个文件编辑代码。我基本上是在尝试以与Microsoft Debugger Canvas类似的方式显示代码。

我想知道如何在一个窗口中托管多个 Visual Studio 编辑器(我相信这些窗口正在实现 IVsWindowFrame)。我追求的功能如下所示:

微软调试器画布

每个编辑器窗口都保留了典型的功能并按预期与第三方扩展进行交互。(例如,VsVim 在这些窗口中正常运行)。

我试过的

我花了将近两个星期的时间研究和尝试这些东西,但在弄清楚我将要使用哪些服务、接口和类时遇到了很多麻烦。

通过 MSDN 阅读

首先,大部分文档都讨论了如何编辑单个编辑器窗口并添加装饰、标签、边距等。它没有讨论在窗口窗格中生成多个编辑器的可能性。

我浏览了有关我感兴趣的大量接口的文档,包括IVsTextBuffer,IVsTextViewIVsInvisibleEditor. 不幸的是,我无法让其中一些界面很好地配合使用。

最重要的是,通常优秀的MSDN在这方面非常缺乏。许多接口只包含一个成员列表,甚至没有关于预期用途和功能的基本说明。(例如IComponentModel)。

许多接口都引用了一组编辑器示例,但无法在 MSDN 上阅读或下载代码。显然它是随 Visual Studio 2005 一起提供的,但我没有这个版本的 Visual Studio,也找不到它。

与 IVsUIShell 交互

我可以访问所有打开的 WindowFramesIVsUIShell.GetDocumentWindowEnum(); 我看到有一个IVsUiShell.CreateDocumentWindow()方法,但我完全不熟悉它接受的参数,或者这是否是正确的路径。

我需要做什么

  1. 以编程方式创建可停靠窗口窗格
  2. 以编程方式将编辑器添加到此窗口窗格。(并确保它们在 Visual Studio、正在运行的文档表等中正确注册)

编辑:

对不起,我应该扩大我的步骤。当我说我需要注册正在运行的文档表和 Visual Studio 时,这是因为我想在我的自定义编辑器中实际编辑原始文档。下面是我尝试重新创建的 Debugger Canvas 中可用功能的简短示例:

http://i.imgur.com/aYm8A5E.gif(我无法嵌入 .gif)

或者:

如果有人知道我在哪里可以找到包含在 Visual Studio 2005 中的编辑器示例,例如基本编辑器示例,我相信我可以弄清楚这些东西。MSDN 文档中没有关于这些接口的代码示例,这让我的工作变得异常困难。

4

3 回答 3

12

Git Source Control Provider是一个开源扩展,包括一个工具窗格,该工具窗格将标准编辑器作为控件嵌入到自定义 WPF 工具窗口中。我会将此代码用作我想在某个自定义位置托管编辑器窗口的任何 Visual Studio 2010+ 扩展的参考。

  • PendingChangesView.xaml包括一个ContentControlnamed DiffEditor,其内容将是编辑器。
  • PendingChangesView.xaml.cs包括一个方法ShowFile,它调用一个方法来创建编辑器控件并将结果分配为DiffEditor​​.
  • ToolWindowWithEditor.cs包括一个SetDisplayedFile返回Tuple<Control, IVsTextView>接口的方法,该接口提供对Control可添加到 aContentControl以及IVsTextView用于文本视图的 a 的访问。繁重的工作是在这种方法中。

请注意,该SetDisplayedFile方法包括几行,格式如下:

textViewHost.TextView.Options.SetOptionValue({name}, {value});

这些行执行 Git 源代码控制提供程序的关键功能,例如删除边距和使窗口只读。有许多可用选项,因此您需要查看文档DefaultTextViewOptionsDefaultTextViewHostOptions应用适合您特定扩展的选项。

于 2013-07-25T02:33:13.670 回答
2

我实际上并没有查看@280Z28(为什么是这个用户名?)发布的文件。我曾经在 Visual Studio 编辑器上工作,而您正在尝试做的事情有多个方面,您应该独立处理:

  • 在单个 IVsWindowFrame 中托管多个命令目标(这意味着从 Visual Studio 的 shell 的角度来看,同一窗格中将有不同的元素,并且每个元素都需要有自己的命令处理。考虑你放置的情况您的插入符号在其中一个迷你编辑器中,并且想要使用 Ctrl+Z 撤消,片刻之后,您将插入符号放入另一个迷你编辑器并执行相同操作。即使 WPF 和 Win32 焦点保持在同一个窗口框架内(从 Visual Studio Shell 的角度来看),需要将命令路由到不同的组件。
  • 使用显示另一个文档部分的编辑器。这里将成为您朋友的机制位于投影命名空间中. 投影本质上允许您将一块缓冲区(或多个缓冲区)投影到视图中。省略缓冲区是特殊情况的投影缓冲区,它从一个源缓冲区投影到目标视图,同时隐藏缓冲区的区域(这很可能是您想要的)。投影缓冲区的一个示例是在 cshtml 文件中发生的事情。在这种情况下,一个缓冲区包含所有 C# 代码,一个缓冲区包含所有 javascript,一个缓冲区包含 html,每个编译器都使用该缓冲区工作,但最终用户会看到所有这些缓冲区的投影到编辑器的仅显示相关部分的视图(例如,即使 C# 导入语句存在于真实的 C# 缓冲区中,也会省略它们。)
  • 管理正在运行的文档,以便在迷你编辑器中进行编辑时,实际文档会被弄脏。您需要处理父文件已经在 RDT 中打开的情况,在这种情况下您希望在进行更改时弄脏同一个文档,以及文档未打开的情况,在这种情况下您需要创建一个新条目在 RDT 中。

另外,请在Visual Studio 论坛上发帖,有人会定期查看论坛并将问题发送给相应的开发人员。

一般来说,当涉及到编辑器时,请避免使用任何传统界面(任何不使用 MEF 的界面),因此不应将 Visual Studio 2005 中的示例用作参考点。

如果您足够关心并且在西雅图,您可以尝试以 MVP 的身份进入校园。有些日子你来到校园,不同团队的成员会拿起笔记本电脑来到你的会议室,你可以一起调试代码或破解(同时可以访问调试符号等等)。

最后但并非最不重要的一点是,请联系代码画布人员,我相信他们已经解决了您面临的许多问题。

于 2013-07-30T20:49:44.667 回答
1

你需要用你的包扩展注册一个工具窗口;这可以通过ProvideToolWindow属性来完成。以下文章包含有关如何在工具窗口中托管编辑器的所有必需信息:http: //bit.ly/9VWxPR

看看WpfTextViewHost课堂;文章解释说这种类型实际上是一个UIElement,所以我想它可以托管它的多个实例......

于 2013-07-24T16:13:46.897 回答