Visual Studio 2008 可扩展性开发(七):操作文本编辑器

前言

可扩展性开发(六)中,我介绍了对于Solution Explorer的基本操作。不过,对咱们开发人员来说,绝大部分时间面对的还是编辑器。

VS2008的编辑器功能已经颇为强大了,如果我们能熟练使用快捷键,编写代码的过程是相当舒服的,就像《卓有成效的程序员》中所说:

编程时始终优先使用键盘而非鼠标

但问题在于,VS面向的是所有的开发人员群体,它只能够提供最通用的功能,如果对VS的编辑器有些额外的需求,我们只好自己动手了,本文将介绍如何扩展文本编辑器。

AOM中编辑器相关的接口

跟以前一样,这里首先简单介绍一下AOM中的相关接口、类型。

1)Documents

在默认情况下,VS会以标签式文档呈现打开的各个文档。这些文档的集合在AOM中就是Documents,它实现了IEnumerable接口。通过该接口,我们可以获取当前打开的文档,它的重要属性和方法有:

  • Count:打开文档的数目;
  • Add():向集合中添加新的文档;
  • CloseAll():关闭所有文档,它的参数为vsSaveChanges枚举,可提供关闭时的行为选项,比如提示用户进行保存;
  • Item():根据索引获取集合中的某个文档;
  • Open():打开一个文档;
  • SaveAll():保存所有文档。

这些成员的含义是相当简单、直白的。我们可以通过循环变量所有打开的文档,以获取所有文档的信息,对于单个文档来说,它对应于Document接口。

2)Document

表示在VS中打开进行编辑的文档。它的成员较多,这里仅介绍一下比较重要的几个:

  • FullName/Path/Name:文档的全名、所在目录、文件名;
  • Language:文档的语言类型,如CSharp;
  • ProjectItem:获取与文档关联的ProjectItem对象;
  • Selection:文档中的选定内容;
  • Type:文档的类型;
  • Activate():将焦点移至该文档;
  • Close():关闭文档;
  • Redo()/Undo():执行Redo/Undo操作;
  • Save():保存文档。

关于Document成员的详细信息,请参看这里。其中的Selection属性非常有用,因为很多时候我们都是先选中文档的部分内容,再进行相应的操作。另外,在打开的多个文档中,只有一个处于活动状态,可以使用DTE.ActiveDocument属性来快速获取该文档。

在获取文档的引用后,下一步就可以考虑如何进行编辑了。我们得了解5个接口:TextSelection、TextPoint、EditPoint、VirtualPoint、TextDocument。相信在了解了这些接口后,你在操作编辑器时会得心应手的。

3)TextSelection

该接口提供对文档的编辑操作和选定文本的访问。它的成员比Document还有多很多,功能非常全面,应当可以满足绝大部分需要了,这里就不再一一列举了,可以参看MSDN的内容

我们在手工输入代码时,可以看作总是在光标处输入,也可以把光标看作一个点,这个点包含一些信息,如行号、列号等,这样VS就可以处理输入的内容,在Add-In中以编程方式输入时与此类似,这个“点”就是TextPoint。

4)TextPoint

该接口表示文档中的某个位置,EditPoint和VirtualPoint继承于此。它的主要属性和方法有:

AbsoluteCharOffset:从文档开始计算的绝对字符位置,从1开始;

AtEndOfDocument/AtEndOfLine:指示该点是否处于文档/行的结尾;

AtStartOfDocument/AtStartOfLine:指示该点是否处于文档/行的开头;

DisplayColumn:显示列号;

Line:行号;

LineCharOffset:该点在行内的位置;

LineLength:该点所在行的字符数;

CreateEditPoint():创建一个EditPoint对象以对文档进行编辑;

EqualTo()/GreaterThan()/LessThan():与另一个TextPoint比较相互的位置关系;

关于TextPoint的所有成员信息,请参看这里。光有TextPoint还不能编辑,要真正进行编辑,得使用EditPoint接口。

5)EditPoint

EditPoint从TextPoint那里继承了所有的属性和方法,它还提供了很多用于编辑的属性和方法,比如常见的插入、删除、剪切、粘帖、书签操作,还有位置的移动等等,使我们在编辑文本时拥有了强大的能力。关于EditPoint的所有成员信息,请参看这里

有时一行内的字符数很多,此时在屏幕能就看不到了,也就是说超出了文档的右边距,要操作在右边距之外的文本需要VirtualPoint。

6)VirtualPoint

VirtualPoint也继承自TextPoint,只是添加了少数几个属性和方法,这里就不再赘述了,可以参看这里

7)TextDocument

最后一个接口是TextDocument,它表示在编辑器中打开的文档。在你了解了前面几个接口的成员后,对TextDocument的成员也很容易了解了。

在操作文本时,大部分时候可以选择从TextSelection开始,不过在某些情况下TextDocument是个不错的开始,可以考虑先使用TextDocument,如果不能满足需要,再转向前面的几个接口。

在介绍了这么多接口之后,该看一个例子了。

CodeTemplate示例

0)问题分析

这一次要给NEnhancer添加的功能是代码模板。它源自我当前的项目需要,项目要求每次修改代码都要添加这样的注释:

复制代码
C# Code - 代码中的一种注释
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值