Visual studio 2012 在自定义编辑器中处理标准命令

Visual studio 2012 在自定义编辑器中处理标准命令,visual-studio-2012,editor,vsix,Visual Studio 2012,Editor,Vsix,我已经创建了一个VisualStudio扩展,通过实现IClassiferProvider来突出显示提供程序语法。我想添加其他功能,例如支持标准的Edit.CommentSelection和Edit.FormatDocument命令,但我不知道如何做到这一点。我能找到的所有文档都是关于添加新命令的,但是我想要处理的命令已经存在 如何处理这些命令?我将您称为特例的特定注释选择和取消注释选择命令视为特例,因为我正在处理一个专门用于支持这两个操作的命令。该服务正在开发中,准备就绪后将通过NuGet发布

我已经创建了一个VisualStudio扩展,通过实现
IClassiferProvider
来突出显示提供程序语法。我想添加其他功能,例如支持标准的
Edit.CommentSelection
Edit.FormatDocument
命令,但我不知道如何做到这一点。我能找到的所有文档都是关于添加新命令的,但是我想要处理的命令已经存在


如何处理这些命令?

我将您称为特例的特定注释选择取消注释选择命令视为特例,因为我正在处理一个专门用于支持这两个操作的命令。该服务正在开发中,准备就绪后将通过NuGet发布。我将首先介绍这项服务,然后介绍一些关于实现对特定命令的支持的一般信息,包括格式化文档命令

我想在本周发布这个库及其依赖项,但是程序集是一个组件的限制要求进行更多的测试,而不是在最初发布之前对库进行测试。幸运的是,这个特定程序集中只有两个接口,即名称空间

使用评论服务 资料来源:

此服务允许扩展开发人员轻松支持VisualStudio中新语言的注释和取消注释命令

提供标准的评论者 提供评论功能的最简单方法是使用
icomcenter
接口的标准
Commenter
实现。以下步骤显示如何创建
Commenter
的实例,并通过导出
icominterprovider
的实例将其提供给Commenter服务

  • 创建从
    IComInterProvider
    派生的新类。对于使用
    ContentTypeAttribute
    的一个或多个特定内容类型,使用MEF
    ExportAttribute
    导出此类。示例中的注释器支持C++风格的行注释和块注释,用于
    SimpleC
    内容类型

    [Export(typeof(ICommenterProvider))]
    [ContentType("SimpleC")]
    public sealed class SimpleCCommenterProvider : ICommenterProvider
    {
      public ICommenter GetCommenter(ITextView textView)
      {
        // TODO: provide a commenter 
        throw new NotImplementedException();
      }
    }
    
  • 定义评论员支持的评语格式

    private static readonly LineCommentFormat LineCommentFormat =
      new LineCommentFormat("//");
    private static readonly BlockCommentFormat BlockCommentFormat =
      new BlockCommentFormat("/*", "*/");
    
  • 通过返回
    Commenter
    的实例,实现
    GetCommenter(ITextView)
    方法。导入
    ITextendoHistoryRegistry
    服务是为了
    Commenter
    正确支持撤销和重做命令。以下代码是支持简单语言的注释和取消注释命令所需的
    icominterprovider
    的完整实现

    [Export(typeof(ICommenterProvider))]
    [ContentType("SimpleC")]
    public sealed class SimpleCCommenterProvider : ICommenterProvider
    {
      private static readonly LineCommentFormat LineCommentFormat =
        new LineCommentFormat("//");
      private static readonly BlockCommentFormat BlockCommentFormat =
        new BlockCommentFormat("/*", "*/");
    
      [Import]
      private ITextUndoHistoryRegistry TextUndoHistoryRegistry
      {
        get;
        set;
      }
    
      public ICommenter GetCommenter(ITextView textView)
      {
        Func<Commenter> factory =
          () => new Commenter(textView, TextUndoHistoryRegistry, LineCommentFormat, BlockCommentFormat);
        return textView.Properties.GetOrCreateSingletonProperty<Commenter>(factory);
      }
    }
    
    [导出(类型化(IComInterProvider))]
    [内容类型(“SimpleC”)]
    公共密封类SimpleCommenterProvider:ICommenterProvider
    {
    专用静态只读LineCommentFormat LineCommentFormat=
    新的LineCommentFormat(“/”);
    私有静态只读BlockCommentFormat BlockCommentFormat=
    新的BlockCommentFormat(“/*”,“*/”);
    [进口]
    私有ITextUndoHistoryRegistry文本UndoHistoryRegistry
    {
    得到;
    设置
    }
    公共IComCenter GetCommenter(ITextView文本视图)
    {
    Func工厂=
    ()=>新的注释器(textView、TextUndoHistoryRegistry、LineCommentFormat、BlockCommentFormat);
    返回textView.Properties.GetOrCreateSingletonProperty(工厂);
    }
    }
    
  • visualstudio中的命令处理 以下是在Visual Studio中处理命令的一般步骤。请记住,实施细节相当复杂;我创建了一些抽象基类来简化特定的实现。在这个概述之后,我将指出这两个方面,并给出一个具体的使用示例,供您参考

  • 创建一个实现的类。
    QueryStatus
    方法应检查由命令目标处理的特定命令,并返回适当的状态标志。应实现执行命令的
    Exec
    方法
  • 通过调用将命令目标注册到特定的文本视图。如果您使用的是基于MEF的扩展,则可以通过导出的实例或通过导入组件并使用从
    ITextView
    的实例获取
    IVsTextView
    的方法来获取
    IVsTextView
  • 以下是此处所述接口的一些具体实现:

  • :此类实现了
    IOleCommandTarget
  • :此类实现其他功能,以简化将命令筛选器附加到文本视图的过程
  • :此类是Commenter服务实现用于处理注释选择取消注释选择命令的命令筛选器的具体实现

  • 虽然这个答案并不能完全回答我的问题,但足以让我走上正轨。谢谢。@AntoineAubry现在是:)顺便说一句,祝贺你的回答和GitHub项目。VisualStudio的可扩展性非常困难,因为文档太少。我自己永远也不会明白这件事。