在编辑器内

编辑由许多不同的子系统组成,用于保留编辑文本模型与文本视图和用户界面。

这些节介绍编辑器的不同方面:

这些节描述编辑功能:

子系统概述

text 模型子系统

文本模型子系统设置为表示文本并使其处理负责。 文本模型子系统包含 ITextBuffer 接口,描述字符序列将由编辑器显示。 在许多方面可以修改此文本,跟踪和否则将操作。 文本模型为以下方面还提供类型:

  • 关联文本与文件的服务,并在文件系统管理读取和写入它们。

  • 查找对象之间两个序列的最小差异的一词的服务。

  • 描述的文本一个系统基于文本的子集的缓冲区在其他缓冲区的。

文本模型子系统没有用户界面 (UI)概念。 例如,不会对文本格式或文本格式不负责,因此,它不了解可能与该文本可视化装饰。

文本模型子系统的公共类型在 Microsoft.VisualStudio.Text.Data.dll 和 Microsoft.VisualStudio.CoreUtilitiy.dll 中,只依赖于 .NET framework 基类库和 managed extensibility framework。 (MEF)

text 视图子系统

文本视图子系统对格式化和显示文本内容。 此子系统的类型分为两个层,基于类型是否依赖于 windows presentation foundation (WPF)。 最重要的类型为 ITextViewIWpfTextView,使用 WPF UI 元素,控件设置文本行中显示,并插入符号、选择和结构修饰的文本。 此子系统在文本显示区域附近还提供边距。 这些边距是扩展,并可以包含不同类型的内容和视觉效果。 边距的示例是行号显示和滚动条。

文本视图的子系统的公共类型在 Microsoft.VisualStudio.Text.UI.dl l 和 Microsoft.VisualStudio.Text.UI.Wp f.dll 包含。 第一个程序集包含独立于平台的元素,因此,第二个包含特定于 WPF 的元素。

类别子系统

类别子系统到确定文本的字体属性负责。 分类器将该文本不同的类,例如, “关键字”或 “注释”。 分类格式映射到物理字体特性将这些类,例如, “blue Consolas 10 pt”。 格式时,该并呈现文本时,文本视图使用此信息。 标记,本主题后面将更详细地介绍,使数据与文本范围。

类别子系统的公共类型在 Microsoft.VisualStudio.Text.Logic.dll 包含,并且,它们与类别的可视方面是交互,在 Microsoft.VisualStudio.Text.UI.Wp f.dll 包含。

操作子系统

操作子系统定义编辑器行为。 为 Visual Studio 编辑器命令和移除系统提供实现。

在文本模型和文本视图的仔细的行为

文本模型

文本模型子系统包括文本类型的不同分组。 其中包括文本缓冲区、文本快照和文本范围。

text 缓冲区和文本编写快照

ITextBuffer 接口表示的 Unicode 字符序列使用 UTF-16,则输入,这是 String 使用的编码 .NET framework。 文本缓冲区可以保持作为文件系统文档,但是,这不是必需的。

ITextBufferFactoryService 用于创建空的文本缓冲区或初始化从字符串或从 TextReader的文本缓冲区。 文本缓冲区可以保存到文件系统。 ITextDocument

文本缓冲区可由所有线程编辑,直到线程通过调用 TakeThreadOwnership将文本缓冲区的所有权。 在此之后,只有该线程可以执行编辑。

在其生存期内,文本缓冲区可以通过许多版本。 新版本生成,在缓冲区编辑时,因此,不可变的 ITextSnapshot 表示缓冲区的该版本内容。 由于文本快照是不可变的,则只能访问它表示的所有线程的文本快照,没有限制,因此,即使文本缓冲区不断更改。

文本快照和文本快照行

可以查看文本快照内容作为字符序列或行序列。 字符和行均已标记的启动小于零。 一个空文本快照包含字符和一个空行。 行分隔的任何有效的 Unicode 换行符序列,或者通过缓冲的开头或结尾。 换行符) 在文本快照显式表示,因此,在文本快照中的换行所有不必相同。

备注

有关在 Visual Studio 编辑器中换行符的更多信息,请参见 编码和换行符

文本行由 ITextSnapshotLine 对象表示,可以从一个文本快照获取特定行号的或特殊字符的位置。

SnapshotPoints、 SnapshotSpans 和 NormalizedSnapshotSpanCollections

SnapshotPoint 表示在快照中的字符位置。 该位置确保放在零和快照之间的长度。 SnapshotSpan 表示文本范围在快照中。 其结束位置确保放在零和快照之间的长度。 NormalizedSnapshotSpanCollection 包括设置来自同一快照的 SnapshotSpan 对象。

大小和 NormalizedSpanCollections

Span 表示可应用于文本范围在文本快照的间隔。 快照位置是从零开始的,因此,范围开始在任何位置包含零。 范围的 End 属性与其 Start 属性及其 Length 属性之和相等。 Span 不包括 End 特性标记的字符。 例如,具有 Start=5,并 Length=3 具有 End=8 的大小及其包括字符在位置 5, 6 和 7。 此范围的表示法是 5..8)。

两个范围相交,如果它们具有任何共同的位置,包括结束位置。 因此,交集 [3, 5) 和 [2, 7) 是 [3, 5) 和交集 [3, 5) 和 [5, 7) 是 [5, 5)。 (请注意 [5, 5) 是空范围。)

两个范围重叠,如果两个范围具有共同的位置,但结束位置。 一个空范围从其他范围重叠,因此,两个范围重叠决不能为 null。

NormalizedSpanCollection 是范围列表按范围的起始值属性的序列。 在列表中,重叠或紧靠的范围合并。 例如命名设置范围 [5..9), [0..1), [3..6),以及 [9..10),规范化列表范围为 [0..1), [3..10)。

ITextEdit、 TextVersion 和文本更改通知

使用 ITextEdit 对象,文本缓冲区的内容可以被更改。 创建这样的对象 (通过使用一个 ITextBufferCreateEdit() 方法) 开头包括文本的文本事务编辑。 每编辑是文本某个范围的替换在缓冲区由字符串。 ,当启动该事务,坐标和目录每编辑表示相对缓冲区的快照。 ITextEdit 对象调整受上其他同一事务影响的编辑坐标编辑。

例如,请考虑包含此字符串的文本缓冲区:

abcdefghij

将包含两编辑的事务,一个用于编辑该替换为将范围 [2..4) 使用字符 X ,并替换范围的另一个编辑器 [6..9) 使用字符, Y。 结果是此缓冲区:

abXefYj

,第一个编辑器是应用之前,第二的坐标编辑计算有关缓冲区的内容在事务的开头。

对缓冲区的更改生效,当 ITextEdit 对象通过调用其 Apply() 方法调用时。 如果至少有一个非 null,编辑新 ITextVersion 后,新 ITextSnapshot 创建,因此,一个 Changed 引发事件。 每个文本版本具有不同的文本快照。 ,在编辑事务,但是,文本版本描述从一个快照的仅更改为下后,文本快照表示文本缓冲区的完整状态。 通常,,而文本版本必须在一段时间内,将保持运行视为一次使用并放弃文本快照。

文本版本包含 INormalizedTextChangeCollection。 此集合描述,那么,当应用于快照,将导致后续快照的更改。 集合中的每 ITextChange 包含更改、被替换的字符串和替换字符串的字符位置。 被替换的字符串对于基本的插入为空,则,并替换字符串为一个基本删除为空。 的规范化集合始终是文本缓冲区的最新版本的 null 。

只有一 ITextEdit 对象可用于对文本缓冲区随时实例化,因此,所有文本都拥有文本缓冲区的线程编辑器必须执行 (如果所有权中声明的)。 文本编辑器可以通过调用其 Cancel 方法或其 Dispose 方法放弃。

ITextBuffer 还提供 Insert()、 **Delete()**和类似于 ITextEdit 接口中的类型的 Replace() 方法。 调用这些效果与创建 ITextEdit 对象,进行类似调用,然后应用编辑。

跟踪点和跟踪范围

ITrackingPoint 表示文本缓冲区的字符位置。 如果缓冲区编辑器来使字符位置转换的方法,跟踪点与该数据库的是。 例如,因此,如果跟踪点是指缓冲区中的位置 10,并且,五个字符缓冲区的开头插入,跟踪点然后引用位置 15。 如果插入准确地发生在表示的该位置跟踪点,其行为取决于其 PointTrackingMode,可以是 Positive 或 Negative。 如果该跟踪模式为正数的,跟踪点引用同一字符,现在是在插入的末尾;如果该跟踪模式为负,跟踪点引用第一个插入的字符在原始位置。 如果字符在通过指示的位置跟踪点删除,跟踪点 shift 到下一个已删除的范围的第一个字符。 例如,因此,如果跟踪点是指字符在位置 5,并且,字符在位置 3 到 6 中删除,跟踪点是指字符在位置 3。

ITrackingSpan 表示字符的范围而不是位置。 其 SpanTrackingMode取决于其行为。 如果范围跟踪模式是 EdgeInclusive,则跟踪范围成长为合并文本插入到边缘;如果范围跟踪模式是 EdgeExclusive,则跟踪范围不将文本插入到边缘。 但是,因此,如果范围跟踪模式是 EdgePositive,插入朝开头推送当前位置,属性,并且,如果范围跟踪模式 EdgeNegative,插入朝末尾推送当前位置) 朝末尾。

您可以获取跟踪点位置或一个跟踪范围它们属于文本缓冲区的所有快照的。 跟踪点,并跟踪范围可以从任何线程安全引用。

内容类型

内容类型为定义的不同类型的一个 framework 目录。 内容类型可以是一个文件类型 (如 “text”, “代码”或 “二进制文件”或技术类型 (如 “xml”, “VB”或 “c#”。 例如,单词 “使用”是一个关键字在 c# 和 Visual Basic 中,,而在其他编程语言。 因此,此关键字的定义将被限制为 “c#”和 “VB”内容类型。

内容类型用作筛选器为修饰和编辑器的其他元素。 许多编辑功能和扩展点每个内容类型定义的;例如,文本着色为纯文本文件、 XML 文件和 Visual Basic 源代码文件是不同的。 文本缓冲区通常会为其分配一个内容类型,则会创建时,因此,可以更改文本缓冲区的内容类型。

内容类型可以从其他内容类型的多个继承。 ContentTypeDefinition 可以指定多个基类型,给定内容类型的父级。

使用 IContentTypeRegistryService,开发人员可以定义自己的内容类型和注册它们。 使用 ContentTypeAttribute,许多编辑功能可以定义有关特定内容类型。 例如,编辑器边距、修饰和鼠标处理程序中定义,使它们仅适用于显示特定内容类型编辑器。

文本视图

模型 - 视图 - 控制器模式的视图部件 (MVC)定义文本视图、视图的格式,图形元素例如滚动条和脱字号。 Visual Studio 编辑器的所有显示元素基于 WPF。

text " 视图

ITextView 接口是文本视图的一个平台无关的表示形式。 将在窗口主要用于显示文本文档,但是,它在工具提示能用于其他目的还使用,例如,。

文本视图引用不同类型的文本缓冲区。 TextViewModel 属性引用指向这三个不同文本缓冲区的一 ITextViewModel 对象:数据缓冲区,是顶部数据级别的缓冲区,编辑缓冲区,编辑器中发生的可视缓冲区,是缓冲区中的文本视图中突出显示。

该文本格式根据附加到基础文本缓冲区的分类器和装饰使用附加到文本视图的修饰提供程序。

文本视图坐标系

文本视图坐标系指定在文本视图的位置。 此坐标系, x 值 0.0 对应于中显示的文本的左边缘,并且, y 值 0.0 对应于中显示的文本的上边缘。 x 坐标从左至右增加,并且, y 坐标从上往下递增。

视区 (的一部分文本显示在文本窗口) 不能水平类似移动,则垂直滚动。 视区通过更改其左坐标水平移动,使其移动有关离绘图图面。 但是,视区可以通过改变呈现的文本仅移动垂直,使一个 LayoutChanged 引发事件。

在坐标系中的距离对应于逻辑像素为单位。 如果文本呈现图面显示,而无需缩放转换,则以文本呈现坐标系表示) 的一个单元对应于在显示的一个像素。

边距

ITextViewMargin 接口表示边距并启用边距及其范围可见性的控件。 有四种预定义的边距,名为 “顶级”, “退出”, “右”和 “底部”并附加到视图的顶部,底部,左边、右边缘。 这些边距是其他边距可以放置的容器。 接口定义返回边距的大小和边距的可见性的方法。 边距是提供有关文本视图的附加信息将它们附加的可视元素。 例如,行号边距显示文本视图的行号。 标志符号边距显示 UI 元素。

IWpfTextViewMarginProvider 接口处理边距的创建和位置。 边距可以对有关其他边距。 较高优先级的边距位于最文本视图的环境。 例如,因此,如果有两个左边距,边距线并边距线 B 和边距 B 比边距线 A, B 边距在边距 A. 左侧具有低优先级显示。

文本视图宿主

IWpfTextViewHost 接口包含附带视图,例如,滚动条的文本视图和所有紧靠的修饰。 文本视图宿主还包含附加到视图的边框的边距。

格式化文本

在文本视图中显示的文本由 ITextViewLine 对象组成。 每个文本视图行对应于行文本在文本视图的。 在基础文本缓冲区的长的行可以部分被遮挡住 (如果运行包装未启用) 或将多个文本视图行。 ITextViewLine 接口包含方法和属性映射中位于坐标和字符和之间可能与行修饰的。

使用 IFormattedLineSource 接口,ITextViewLine 对象创建的。 如果您担心当前在此视图中显示的文本,您可以忽略设置源。 如果您对在视图中未显示文本感兴趣的格式 (例如,支持 RTF 剪切和粘贴),则可以使用 IFormattedLineSource 格式在文本缓冲区的文本。

文本视图一次设置一 ITextSnapshotLine

编辑功能

编辑功能的设计方式,使该函数的定义与其实现。 编辑器包含以下功能:

  • 标记和分类器

  • 修饰

  • Projection

  • 大纲显示

  • 鼠标和键绑定

  • 操作和基元

  • IntelliSense

标记和分类器

标记是与文本范围内的标记。 使用文本着色、下划线、图像或弹出,它们位于不同的方式,例如,。 分类器是一个标记。

其他标记是显示文本的 TextMarkerTag ,大纲 OutliningRegionTag ,并且, ErrorTag 用于生成错误。

分类类型

IClassificationType 接口表示等效性类,文本是一个抽象类。 分类类型可以从其他类类型的多个继承。 例如,编程语言分类可能包括 “关键字”, “注释”和 “identifier”,所有以 “代码”继承。 自然语言分类类型可能包括 “名词”, “er”和 “形容词”,所有以 “自然语言”继承。

分类

类是特定分类类型的实例,通常在文本范围。 ClassificationSpan 用于表示分类。 类范围可以包括文本特定范围的视为标签并通知系统文本此范围是特定分类类型。

分类器

IClassifier 是将文本设置类别的结构。 必须为特定内容类型定义以及为特定文本缓冲区实例化分类器。 客户端必须实现 IClassifier 参与文本分类。

分类器聚合函数

分类器聚合函数是将一个文本缓冲区的所有分类器到一个设置类别的结构。 例如, C# 分类器和英语分类器位于 C# 文件可以创建在注释的分类。 考虑此注释:

// This method produces a classifier

C# 分类器可能标记整个范围作为注释,并且,英语分类器可能类别 “生产” as “er”和 “方法” as “名词”。 聚合函数生产设置为非重复类别,因此,设置类型的基于所有基值。

,因为它将文本设置类别,分类器聚合函数也是分类器。 分类器聚合函数还确保没有任何重叠部分的类,并且类排序。 各个分类器是自由返回任何设置类别,按任意顺序和重叠方式。

分类格式和文本着色

文本格式是文本类别生成功能的示例。 文本视图层使用该方法确定文本显示在应用程序中。 文本格式设置区域依赖于 WPF,但是,类的逻辑定义不是。

分类格式是一组特定分类类型的格式设置属性。 这些格式从分类类型的父级的格式继承。

IClassificationFormatMap 是从分类类型的映射到设置文本格式属性。 格式映射的实现在类的任何导出格式的编辑处理的。

修饰

修饰没有直接与字符相关的字体和颜色在文本视图的图形效果。 例如,用于指示在多种编程语言的非编译代码的红色曲线下划线是嵌入修饰和工具提示是弹出修饰。 修饰从 UIElement 派生并实现 ITag。 修饰标记的两种专用类型是 SpaceNegotiatingAdornmentTag,占用空间和视图中的文本相同的修饰和 ErrorTag的,曲线下划线的。

嵌入修饰是一个图像组合格式化文本视图的一部分。 它们组织不同的 Z 顺序层。 有三个内置层,如下所示:文本,插入符号和选定内容。 但是,开发人员可以定义多个层和顺序将它们相互关联。 这三个嵌入修饰是请移动的文本修饰相对于 (,当文本移动和删除,当文本删除) 时,和视图相关的非文本部分) 的视图相对修饰 (和所有者控制修饰 (开发人员必须管理它们的位置)。

弹出修饰是出现在文本视图,例如,工具提示上的小窗口的图像。

Projection

投影是构造不同类型的方法实际上不存储文本的文本缓冲区,该文本,而是将其他文本缓冲区的文本。 例如,投影缓冲区可用于连接从其他两个缓冲区的文本并显示结果,就象在一个缓冲区,或者在一个缓冲区隐藏该文本的部分。 投影缓冲区可以作为源缓冲区到另一投影缓冲区。 由投影相关的设置缓冲区可构造重新排列文本多种不同方式。 (SET 也称为作为 缓冲区关系图。)大纲显示功能的 Visual Studio 文本实现使用投影缓冲区隐藏该折叠的文本,因此, ASP.NET 页的 Visual Studio 版本使用投影支持嵌入语言 (如 Visual Basic 和 C#。

使用 IProjectionBufferFactoryServiceIProjectionBuffer 创建。 投影缓冲区由的 ITrackingSpan 对象已排序的序列称为 源范围表示。 这些范围内容显示为字符序列。 在源范围的文本缓冲区绘制名为 源缓冲区。 投影缓冲区的客户端不必知道其与普通文本缓冲区不同。

投影缓冲区听完源缓冲区的文本更改事件。 在源范围中的文本更改时,投影缓冲区映射已更改的文本坐标到它的坐标并引发适当的文本更改事件。 例如,请考虑包含这些目录中的源缓冲区 A 和 B:

A: ABCDE
B: vwxyz

如果投影缓冲区 P 从两个文本范围的格式,具有任何缓冲区和其他具有任何缓冲区 B 的一个,则 P 具有以下内容:

P: ABCDEvwxyz

如果该子字符串 xy 从缓冲区 B 中删除,则缓冲区 P 引发一个事件字符在位置 7 和 8 中删除。

投影缓冲区可以直接编辑。 传播这编辑器对适当的源缓冲区。 例如,因此,如果字符串插入缓冲区 P 在位置 6 (字符 “、”的原始位置),传播插入缓冲区 B 在位置 1。

对构成投影缓冲区的源范围的限制。 源范围不能重叠;投影缓冲区的位置不能映射到多任何源缓冲区的位置,因此,源缓冲区中的位置不能映射到多投影缓冲区的位置。 环状在源缓冲区关系是不允许的。

引发事件时,在设置投影缓冲区的源缓冲区更改时,所以,当设置源范围更改时发生。

elision 缓冲区是特殊投影缓冲区。 为概述主要使用,并为扩展的操作和折叠文本块。 elision 缓冲区基于一个源缓冲区,因此,必须对与它们在源缓冲区顺序在 elision 缓冲区的大小。

缓冲区关系图

IBufferGraph 接口可以映射到投影缓冲区中关系图。 所有文本缓冲区和投影缓冲区中的一个处理的非循环性关系图集合,这与由语言编译器生成的抽象语法树。 关系图是由顶层缓冲区定义的,可以是任何文本缓冲区。 缓冲区关系图可从在顶层缓冲区的点到源缓冲区的点,或者从顶部的某一缓冲区内的范围设置在源缓冲区的大小。 同样,它可以映射一个点或范围源缓冲区到一个点顶层缓冲区。 使用 IBufferGraphFactoryService,缓冲区图形中创建。

事件和投影缓冲区

当修改时投影缓冲区,修改从投影缓冲区发送到取决于它的缓冲区。 在修改后所有缓冲区,缓冲区更改事件从最深的缓冲区启动时,所引发。

大纲显示

概述是能够展开或折叠不同的文本块在文本视图的。 大纲显示 " 定义为, ITag,与修饰定义的方式。 OutliningRegionTag 是定义一个文本边界可以展开或折叠的标记。 若要使用大纲显示,必须导入 IOutliningManagerService 获取 IOutliningManager。 该大纲显示管理器的枚举,折叠,然后展开不同块,表示为 ICollapsible 对象,并相应地引发事件。

鼠标绑定

鼠标绑定链接到不同的命令处理鼠标移动。 使用 IMouseProcessorProvider,鼠标绑定中定义,使用 IKeyProcessorProvider,并且,键绑定定义。 IWpfTextViewHost 自动实例化任何绑定并连接到视图中的鼠标事件。

IMouseProcessor 接口包含预处理和后期处理不同的鼠标事件的事件处理程序。 为事件的处理程序,则可以重写某些在 MouseProcessorBase的方法。

编辑操作

编辑操作可用于自动与编辑器的交互,脚本撰写或其他目的。 您可以导入 IEditorOperationsFactoryService 在特定 ITextView的访问操作。 然后可以使用这些对象修改选定内容,滚动视图或移动脱字号移至视图的不同部分。

IntelliSense

IntelliSense 支持语句完成、签名帮助 (也称为参数信息),快速信息和智能标记。

语句完成功能提供弹出列表方法名称、 XML 元素和其他代码或标记元素的潜在完成。 通常,用户笔势调用完成会话。 会议来显示潜在的完成列表,因此,用户可以选择一个或关闭列表。 ICompletionBroker 用于创建和触发 ICompletionSession负责。 ICompletionSource 计算完成项 CompletionSet 会议的。

请参见

概念

编辑扩展点

编辑导入