共用方式為


在 [編輯器]

編輯器] 是由不同的子系統,設計用來將編輯器] 中 [文字] 檢視與使用者介面模型分開放置文字的數字所組成的。

這幾節說明編輯器] 中的不同層面:

這幾節將說明編輯器的功能:

子系統的概觀

文字模型子系統

文字模型子系統負責代表文字,並讓它的操作。 文字模型子系統包含ITextBuffer介面,告訴您,是由編輯器] 中顯示的字元序列。 這段文字可以修改、 追蹤,而否則操作在許多方面。 文字模型也提供下列各方面的型別:

  • 關聯檔案中的文字,並管理讀取與寫入其檔案系統服務。

  • 差異化服務,以尋找物件的兩個序列的差異降到最低。

  • 一種系統來描述在緩衝區中的其他緩衝區中的文字的說明主題的文字。

文字模型子系統沒有任何使用者介面 (UI) 的概念。 比方說,它並不負責設定格式化的文字或文字版面配置,它並不知道可能會與文字相關聯的視覺裝飾。

Microsoft.VisualStudio.Text.Data.dll 和 Microsoft.VisualStudio.CoreUtilitiy.dll,只能在相依中所包含的文字模型子系統的公用型別。NET Framework 基底類別程式庫和管理擴充性架構 (MEF)。

文字檢視子系統

文字檢視子系統負責格式和顯示文字。 此子系統中的型別可分為兩個圖層上,取決於型別是否需要使用 Windows Presentation Foundation (WPF)。 最重要的型別都是ITextViewIWpfTextView,哪一個控制項將顯示的文字行的集合以及插入號、 選取項目和方法,可以在文字裝飾使用 WPF 使用者介面項目。 此子系統也會提供文字周圍的邊界顯示區域。 這些邊界可加以擴充,而且可以包含不同類型的內容和視覺效果。 邊界範例包括行數字的顯示和捲軸列。

文字檢視子系統的公用型別都包含在 Microsoft.VisualStudio.Text.UI.dll 和 Microsoft.VisualStudio.Text.UI.Wpf.dll。 第一個組件包含平台無關的項目,而第二個包含 WPF 特定項目。

分類子系統

分類子系統負責判斷文字的字型屬性。 類別器會將文字分成不同的類別,例如 「 關鍵字 」 或 「 註解 」。 分類的格式圖與實際的字型屬性,例如,"藍 Consolas 10 pt"這些類別。 這項資訊可供 [文字] 檢視中,將格式設定,會呈現文字時。 標記,其說明已在本主題中,在稍後詳細可以讓合併的文字與相關聯的資料。

分類子系統的公用型別會包含在 Microsoft.VisualStudio.Text.Logic.dll,並分類,包含在 Microsoft.VisualStudio.Text.UI.Wpf.dll 中的視覺效果與它們進行互動。

作業子系統

作業子系統定義編輯器的行為。 它提供 Visual Studio 的編輯器命令的實作,並復原系統。

仔細看看文字模型和文字檢視

文字模型

文字模型子系統所組成的文字類型的不同群組。 其中包括文字緩衝區,文字的快照集,以及文字 span。

文字緩衝區和文字的快照集

ITextBuffer介面表示一系列會藉由使用 utf-16,也就是編碼方式所使用的編碼的 Unicode 字元String中輸入。NET Framework。 文字緩衝區就會保留為檔案系統的文件,但這不是必要。

ITextBufferFactoryService用來建立一個空白的文字緩衝區所致或從字串或初始化文字緩衝區TextReader。 將檔案系統就會保留文字緩衝區ITextDocument

文字緩衝區可以編輯任何執行緒,直到執行緒接管文字緩衝區藉由呼叫TakeThreadOwnership。 在那之後,只有該執行緒可以執行的編輯。

在其存留期內,文字緩衝區可以瀏覽許多版本。 每次編輯緩衝區,並不變,就會產生新的版本ITextSnapshot代表該版本緩衝區的內容。 因為文字儲存資訊是不變,您就可以存取文字快照集,在不使用限制的任何執行緒上,即使它所代表的文字緩衝區仍會發生變更。

文字的快照集和快照集的文字行

為一系列字元或一系列的行,您可以檢視文字的快照集的內容。 行數和字元是兩個索引由零開始。 空白文字快照包含零字元和一個空白行。 任何有效 Unicode 自動換行字元順序,或開頭或結尾的緩衝區,會分隔一條線。 自動換行字元都明確地出現在文字的快照集,並不是所有具有相同文字快照中的分行符號。

注意事項注意事項

如需有關在 Visual Studio 的編輯器中的自動換行字元的詳細資訊,請參閱編碼與分行符號

文字行由ITextSnapshotLine物件,您可以取得從文字的快照集的特定行號或特定的字元位置。

SnapshotPoints、 SnapshotSpans 和 NormalizedSnapshotSpanCollections

A SnapshotPoint代表字元的位置,在 [快照集。 您可以保證位置介於 0 到快照集的長度。 A SnapshotSpan代表的快照中的文字範圍。 結束位置一定介於 0 到快照集的長度。 NormalizedSnapshotSpanCollection組成一群SnapshotSpan從相同的快照集的物件。

Span 和 NormalizedSpanCollections

A Span代表可套用至的文字快照中的文字範圍的間隔。 快照集位置是以零起始,所以 span 可以啟動的任何位置,包括零。 End的 span 屬性的總和等於其Start屬性和其Length屬性。 A Span不包含字元編製索引End屬性。 比方說,有開始的範圍 = 5 和長度 = 3 已結束 = 8,以及在位置 5、 6 和 7 個字元。 這個範圍的標記法是 5..8)。

兩個 span 交叉它們是否有任何位置共通點,包括結束的位置。 因此,交集的 [3, 5) 和 [2, 7) 是 [3, 5) 和交集的 [3, 5) 和 [5, 7) 是 [5,5)。 (請注意,[5,5) 是空的範圍。)

兩個 span 重疊,如果它們有位置共通點,除了的結束位置。 空的範圍不重疊的任何其他的範圍,並不會是空的兩個 span 重疊比例。

A NormalizedSpanCollection是一份 span span 的啟動屬性的順序。 在清單中,會合併重疊或鄰接的 span。 例如,假設 span 群 [5..9),[0..1),[3..6),和 [9..10),正規化的 span 清單是 [0..1),[3..10)。

ITextEdit、 TextVersion 和文字變更告知

文字緩衝區的內容可以藉由變更ITextEdit物件。 建立這類物件 (使用一種**CreateEdit()**的方法ITextBuffer) 開始,它所包含的文字編輯文字交易。 每次編輯是文字的取代的字串緩衝區中部份範圍。 座標和每次編輯的內容會表示相對於緩衝區的快照集交易開始時。 ITextEdit物件調整受到在同一個交易中的其他編輯編輯的座標。

在文字緩衝區,包含這個字串為例:

abcdefghij

套用交易,其中包含兩個編輯,會取代在範圍的一個編輯 [2..4) 使用字元X ,並會取代在範圍的第二個編輯 [6..9) 使用字元Y。 結果會是這個緩衝區:

abXefYj

在套用第一個編輯之前,不會計算為第二個編輯座標,相對於在交易開始時,緩衝區的內容。

緩衝區中所做的變更才會生效時ITextEdit物件藉由呼叫認可其Apply()方法。 如果有至少一個非空白的編輯,新的ITextVersion會建立一個新的ITextSnapshot建立時,有一個Changed就會引發事件。 每個文字版本具有不同的文字的快照集。 文字的快照集代表文字緩衝區的完整狀態之後編輯異動,但文字版本將告訴您只要將變更從一個快照集至下一步]。 一般情況下,安裝工具一次使用文字快照集並接著捨棄,而多時,文字版本必須保持存留。

文字版本包含INormalizedTextChangeCollection。 這個集合會描述所做的變更,當套用快照集時,就會產生後續的快照集。 每個ITextChange集合中包含 [變更]、 [被取代的字串和 [取代字串的字元位置。 被取代的字串是空的是基本的插入和取代字串是空的基本的刪除動作。 正規化的集合永遠是null文字緩衝區的最新版本。

只能有一個ITextEdit ,也可以隨時在文字緩衝區可以產生物件,而且必須擁有文字緩衝區 (如果宣告的擁有權) 的執行緒上執行所有的文字編輯。 編輯文字可以放棄點撥打的Cancel方法或其Dispose方法。

ITextBuffer也提供了Insert()Delete(),以及**Replace()**類似的方法,位於ITextEdit介面。 這些呼叫會有相同的效果,以建立ITextEdit物件,進行類似的呼叫,然後將套用編輯。

追蹤點,以及追蹤跨越

ITrackingPoint代表文字緩衝區中的字元位置。 如果編輯緩衝區會造成要移動的字元位置的方式,追蹤點會將它。 比方說,如果追蹤點是指在緩衝區中,位置 10,且緩衝區的開頭會插入 5 個字元,追蹤點那麼就會參考到 15 的位置。 如果插入剛好在精確地表示追蹤點的位置,其行為由其PointTrackingMode,這就是Positive或Negative。 如果追蹤模式是正數,追蹤點就會參考到相同的字元,也就是現在的插入動作 ; 結尾 如果追蹤模式是負值,追蹤點是指原始的位置處的第一個插入的字元。 如果由追蹤點的位置處的字元會被刪除,追蹤點角色改成第一個字元之後的已刪除的範圍中。 比方說,如果追蹤點是指在位置 5 的字元位置 3 到 6 個字元會被刪除,追蹤點是指到位置 3 處的字元。

ITrackingSpan代表範圍的字元,而非只是一個位置。 它的行為由其SpanTrackingMode。 如果 span 追蹤模式是EdgeInclusive,就會不斷追蹤範圍擴充加入其邊緣 ; 在插入的文字 如果 span 追蹤模式是EdgeExclusive,追蹤範圍不會加入在其邊緣插入的文字。 不過,如果 span 追蹤模式是EdgePositive,插入將目前的位置推入至 [開始],則為由右 span 追蹤模式EdgeNegative,插入將推入目前的位置到結尾。

您可以取得追蹤點的位置或追蹤範圍的範圍文字緩衝區及其所屬的任何快照集。 追蹤點,以及追蹤跨越可能安全地參考從任何執行緒。

內容類型

內容類型是內容的一種機制,用來定義不同種類。 內容型別可以是檔案類型,如 「 文字 」、 「 程式碼 」 或 「 二進制 」 或技術類型,例如"xml"、"vb",或"c#"。 比方說,單字 「 使用 」 是在 C# 和 Visual Basic,但不是在其他程式語言的關鍵字。 因此,此關鍵字的定義是限制成"c#"和"vb"的內容類型。

內容類型是做為篩選條件用於裝飾與其他元件的編輯器。 許多的編輯器功能和擴充點定義每個內容的型別 ; 例如,文字色彩是不同的純文字檔、 XML 檔和 Visual Basic 的原始程式碼檔的。 文字緩衝區通常擁有內容的型別時建立的且可以變更文字緩衝區的內容類型。

內容型別可以多層繼承自其他內容類型。 ContentTypeDefinition可讓您指定的內容型別的父代為指定多個基底型別。

開發人員可以定義自己的內容類型和它們的使用註冊IContentTypeRegistryService。 許多的編輯器功能均可相對於特定的內容類型使用ContentTypeAttribute。 比方說,編輯器的邊界、 文字裝飾及滑鼠處理常式可以定義,讓它們只適用於顯示特定的內容類型的編輯器。

文字檢視

模型檢視控制器 (MVC) 模式中檢視的部分定義文字檢視中,檢視、 圖形元素,例如捲軸,以及插入號的格式設定。 所有的 Visual Studio 編輯器的展示項目是以 WPF 為基礎。

文字檢視

ITextView介面是平台無關的表示文字檢視。 它主要用來顯示文字的文件,在視窗中,但它也會用於其他用途,比方說,在工具提示。

文字檢視會參考不同種類的文字緩衝區。 TextViewModel屬性是指ITextViewModel指向這些三個不同的文字緩衝區物件: 資料緩衝區,也就是最高的資料層級緩衝區中編輯,且視覺緩衝區,也就是此緩衝區會隨即出現在 [文字] 檢視中的編輯緩衝區。

文字設定為根據附加至基礎文字緩衝區中,類別器,並且藉由裝飾的提供者附加至文字檢視表本身裝飾。

文字檢視座標系統

文字檢視座標系統會指定 [文字] 檢視中的位置。 在此座標系統中, x值 0.0 會對應到所顯示的文字的左邊緣和y值 0.0 會對應到所顯示的文字的頂端。x座標會增加從左到右,以及y協調從上到下的增加。

檢視區 (在 [文字] 視窗的可見文字的部份) 不能水平捲動以相同的方式為垂直捲動。 檢視區是藉由變更其左方的座標,這樣它就會移到的繪圖介面的水平捲動。 不過,檢視區可以垂直捲動只能透過變更所呈現的文字,這可以讓LayoutChanged引發的事件。

座標系統中的距離會對應到邏輯像素。 如果沒有縮放轉換顯示文字的呈現介面,則文字呈現的座標系統中的一個單位就相當於在顯示的一個像素。

邊界

ITextViewMargin介面表示邊界,並讓控制項可視性的邊界和它的大小。 有四個預先定義的邊界,也就名為""、"左"、"右",上下"",而連接到上、 下、 左或右邊緣的檢視。 這些邊界是可以放置其他邊界的容器。 介面會定義傳回邊界的大小和邊界的可見性的方法。 邊界是提供額外資訊附加到的文字檢視的視覺項目。 例如,行號邊界會顯示 [文字] 檢視的行號。 圖像 (glyph) 的邊界會顯示 UI 項目。

IWpfTextViewMarginProvider介面會處理建立和邊界的位置。 邊界可以訂購相對於其他的邊界。 較高優先權的邊界是位在靠近文字檢視。 比方說,如果有兩個左邊的界、 邊界 a 和 b 的邊界,而邊界 b 具有優先順序低於邊界 a,b 邊界左邊會出現的邊界 a。

文字檢視主應用程式

IWpfTextViewHost介面包含文字檢視,並伴隨著檢視中,比方說,捲軸列任何鄰接裝飾。 文字檢視主應用程式也會包含已附加至檢視的上框線的邊界。

格式化的文字

文字檢視中顯示的文字由ITextViewLine物件。 每個文字檢視行對應至一行的文字檢視中的文字。 基礎文字緩衝區中的長行可以是部分遮蔽 (如果未啟用自動換行) 或分成多個文字檢視數行。 ITextViewLine介面包含方法和屬性座標與字元之間的對應,以及可能會與線條相關聯的裝飾。

ITextViewLine物件可由使用IFormattedLineSource介面。 如果您只關心的目前檢視中顯示的文字時,您可以忽略格式設定的來源。 如果您想要在沒有文字的格式顯示在檢視 (例如,支援 rtf 文字剪下和貼上),您可以使用IFormattedLineSource文字緩衝區中文字的格式。

文字檢視格式化一ITextSnapshotLine一次。

編輯器的功能

編輯器的功能被設計讓功能的定義與其實作分開。 在編輯器] 會包含下列功能:

  • 標籤和 [類別器

  • 裝飾

  • Projection

  • 大綱

  • 滑鼠和按鍵繫結

  • 作業和基本型別

  • IntelliSense

標籤和 [類別器

標記沒有相關聯的文字範圍的標記。 它們可以呈現不同的方式,比方說,使用 [文字色彩、 底線、 圖形或快顯視窗。 類別器是一種標記。

其他種類的標籤是TextMarkerTag的醒目秘訣的文字, OutliningRegionTag的大綱,以及ErrorTag的編譯錯誤。

分類類型

IClassificationType介面表示是對等類別,也就是抽象的類別目錄的文字。 分類的型別可以多層繼承自其他類別型別。 比方說,程式設計語言分類可能包括 「 關鍵字 」、 「 註解 」 和 「 識別項 」,它們全都會繼承 「 代碼 」。 自然語言分類類型可能包括 「 名詞 」、 「 動詞 」,以及"形容詞 」,它們全都會繼承 「 自然語言 」。

Classifications

分類某段文字,請以通常是特定的類別型別的執行個體。 A ClassificationSpan用來表示的分類。 分類範圍可視為一個涵蓋特定的文字範圍,並告知這段文字是特殊的類別型別系統的標籤。

類別器

IClassifier是一種機制,分成一組的分類中的文字。 必須為特定的內容型別定義的類別器,並將其具現化的特定文字的緩衝區。 用戶端就必須實作IClassifier參與文字分類。

類別器的彙總工具

類別器的彙總工具是一種機制來組合成單一組分類的一項文字緩衝區的所有類別器。 例如,C# 類別器] 與 [英文語言的類別器可以透過 C# 檔案中的註解建立分類。 這個註解,請考慮:

// This method produces a classifier

C# 類別器可能會標記為註解,整個範圍和英文的語言類別器可能會分類"產生"做為 「 動詞 」 和 「 方法 」,以 「 名詞 」。 彙總工具會產生一組的非重疊的分類,以及集合的型別根據所有成果。

類別器的彙總也是 [類別器,因為它將文字分成一組的分類中。 有沒有重疊的分類和分類的排序,也可確保類別器的彙總工具。 個別的類別器是隨意以任何順序,傳回的 「 類別 」、 一組,並以任何方式重疊。

分類格式和文字色彩

文字格式是一項功能內建在文字分類的範例。 文字檢視圖層使用來決定的應用程式中的文字顯示。 [文字格式設定] 區域中的公式是取決於 WPF 中,但邏輯定義的分類不。

分類格式是一組特定的類別型別的屬性的格式設定。 這些格式會繼承父系分類類型的格式。

IClassificationFormatMap會從分類的型別對應到一段文字格式設定屬性。 格式地圖編輯器] 中的實作會處理所有的分類格式的匯出。

裝飾

裝飾是直接無關的字型和色彩的文字檢視中的字元的圖形效果。 例如,用來標記非編譯程式碼,在許多程式設計語言的紅色彎曲底線是內嵌的裝飾,而工具提示只會跳現式的裝飾。 裝飾衍生自UIElement ,並實作ITag。 裝飾標記的兩個特殊的型別是SpaceNegotiatingAdornmentTag,如佔據相同的空間,以在檢視中,文字的裝飾,並ErrorTag,彎曲底線的。

內嵌的裝飾是形成組件的格式化的文字檢視的圖形。 組織在不同的疊置順序圖層。 有三個內建的層級的如下所示: 文字、 插入號,並將選取範圍。 不過,開發人員可以定義多個圖層,並將它們放入大幅度地彼此的順序。 內嵌的裝飾的三種是文字相對於裝飾 (這在刪除文字時,可刪除移動時文字會移動及)、 檢視相對於裝飾 (它們有與檢視的非文字部份) 和擁有者控制的裝飾 (開發人員必須管理它們的位置)。

跳現式的裝飾是出現在文字檢視,比方說,工具提示之上的小視窗中的圖形。

Projection

規劃是建構文字緩衝區,將不會實際儲存的文字,但改結合了從其他文字緩衝區裡的文字不同的技術。 比方說,投射緩衝區可以用來串連兩個其他緩衝區中的文字,並顯示結果,如同它是在只有一個緩衝區,或同時隱藏文字一個緩衝區中的部分。 投影緩衝區可做為另一投影緩衝區的來源緩衝區。 緩衝區的投射與相關的一組可以建構成許多不同的方式重新排列的文字。 (這種集合也就是會緩衝區圖形。) 若要隱藏摺疊的文字及 ASP 的 Visual Studio 的編輯器中使用投影緩衝區實作 Visual Studio 文字大綱功能。Net WEB 網頁會利用投影來支援內嵌的語言,例如 Visual Basic 和 C#。

IProjectionBuffer由使用IProjectionBufferFactoryService。 投影緩衝區由已排序的序列ITrackingSpan就所謂的物件來源跨越。 這些 span 的內容會顯示為一連串的字元。 從中來源 span 繪製,本屬性的文字緩衝區名為來源緩衝區。 投影緩衝區的用戶端並沒有要注意不同於一般文字緩衝區中。

投影緩衝區會接聽來源緩衝區大小的文字變更事件。 當來源中的文字範圍的變更時,投射緩衝區將變更的文字座標對應至其本身的座標,並引發適當的文字變更事件。 比方說,請考慮這些內容的來源緩衝區 a 和 b:

A: ABCDE
B: vwxyz

如果投影緩衝區 p 形成的兩個文字 span,另一個則已經安裝了所有和暫存區的所有緩衝區 b,則 p 不會有下列內容:

P: ABCDEvwxyz

如果子字串xy緩衝區 p 引發事件,表示已刪除的字元位置 7 和 8,則會從緩衝區 b 中刪除。

也可以直接編輯投影緩衝區。 它會傳播到適當的來源緩衝區的編輯。 比方說,如果插入字串緩衝區 p 位置 6 (字元"v"的原始位置) 中,插入會傳用至緩衝區 b 在位置 1。

不受限制來源 span 構成投影緩衝區。 來源 span 可能不會重疊。 投影緩衝區中的任一位置無法對應到一個以上的位置,在任何來源的緩衝區,並將來源緩衝區中的任一位置無法對應到投影緩衝區中的多個位置。 來源緩衝區關聯性中,也允許沒有 circularities。

投影緩衝區變更及來源群橫跨變更訊息緩衝處理的來源集合時,會引發事件。

Elision 緩衝區是一種特殊投影緩衝區。 它主要做為大綱及展開與摺疊的文字區塊的作業。 Elision 緩衝區根據單一來源緩衝區,並 elision 緩衝區中的 span 順序必須相同,已設定順序中的來源緩衝區。

緩衝的圖形

IBufferGraph介面會啟用投影緩衝區的圖形之間的對應。 導向非循環圖形,就像抽象語法樹狀目錄中所產生的語言編譯器一樣將收集的所有文字緩衝區和投影的緩衝區。 圖表上方的緩衝區中,可以是任何文字緩衝區所定義。 從來源緩衝區中,某個位置上的緩衝區中的一個點或一組的來源緩衝區中的 span 頂端緩衝區中的範圍,可以將對應緩衝區圖形。 同樣地,它可以對應一個點,或從來源緩衝區橫跨頂端的緩衝區中的點。 使用來建立緩衝區圖形IBufferGraphFactoryService

事件和投影緩衝區

修改投影緩衝區時,就是從投影緩衝區所做的修改傳送到依存於它的緩衝區。 修改所有緩衝區之後,會引發緩衝區 change 事件,著手最深的緩衝區。

大綱

大綱已展開或摺疊的文字檢視中的文字的不同區塊的能力。 大綱可視為一種的ITag,在同一個裝飾定義時,對了。 A OutliningRegionTag是定義一個可展開或摺疊的文字區域的標記。 若要使用大綱,您必須匯入IOutliningManagerService以取得IOutliningManager。 大綱管理員列舉、 摺疊,並展開不同的區塊中,會顯示成ICollapsible物件,並據此會引發事件。

滑鼠繫結

滑鼠繫結至不同的命令,連結移動滑鼠。 藉由定義滑鼠繫結IMouseProcessorProvider,藉由使用已定義的按鍵繫結和IKeyProcessorProviderIWpfTextViewHost自動產生的所有繫結,而且連接到檢視中的滑鼠事件。

IMouseProcessor介面包含不同的滑鼠事件的前置處理和後續處理的事件處理常式。 事件的其中一個控點,您可覆寫一些中方法的MouseProcessorBase

編輯器作業

編輯器作業可以使用,以自動化程式編輯器中的,以編寫指令碼或其他用途的互動。 您可以匯入IEditorOperationsFactoryService上的存取作業指定ITextView。 然後可以使用這些物件修改選取範圍、 捲動檢視,或將插入號移至檢視的不同部份。

IntelliSense

IntelliSense 支援陳述式完成、 簽章說明 (亦稱為 「 參數資訊 」)、 快速諮詢及智慧標籤。

陳述式完成提供方法名稱、 XML 項目,和其他程式碼或標記的項目可能完成的快顯的清單。 一般情況下,使用者筆勢會叫用完成的工作階段。 工作階段會顯示可能的完整命令的清單,使用者可以選取其中一個,或關閉清單。 ICompletionBroker負責建立和觸發ICompletionSessionICompletionSource計算CompletionSet的工作階段的完成項目。

請參閱

概念

編輯器的擴充點

編輯器的匯入