Uvnitř editoru

Editor se skládá z několika různých subsystémů, které jsou navržené tak, aby byl textový model editoru oddělený od textového zobrazení a uživatelského rozhraní.

Tyto části popisují různé aspekty editoru:

Tyto části popisují funkce editoru:

Subsystémy

Subsystém textového modelu

Subsystém textového modelu zodpovídá za reprezentaci textu a umožnění jeho manipulace. Subsystém textového modelu obsahuje ITextBuffer rozhraní, které popisuje posloupnost znaků, které má editor zobrazit. Tento text lze upravovat, sledovat a jinak manipulovat mnoha způsoby. Textový model také poskytuje typy pro následující aspekty:

  • Služba, která přidruží text k souborům a spravuje čtení a zápis v systému souborů.

  • Rozdílová služba, která najde minimální rozdíly mezi dvěma sekvencemi objektů.

  • Systém popisující text v vyrovnávací paměti z hlediska podmnožina textu v jiných vyrovnávacích pamětích.

Subsystém textového modelu je bez konceptů uživatelského rozhraní. Například není zodpovědný za formátování textu nebo rozložení textu a nemá žádné znalosti vizuálních doplňků, které mohou být přidruženy k textu.

Veřejné typy subsystému textového modelu jsou obsaženy v Microsoft.VisualStudio.Text.Data.dll a Microsoft.VisualStudio.CoreUtility.dll, které závisí pouze na knihovně základních tříd rozhraní .NET Framework a rozhraní MEF (Managed Extensibility Framework).

Subsystém textového zobrazení

Subsystém textového zobrazení zodpovídá za formátování a zobrazování textu. Typy v tomto subsystému jsou rozděleny do dvou vrstev v závislosti na tom, jestli typy spoléhají na Windows Presentation Foundation (WPF). Nejdůležitější typy jsou ITextView a IWpfTextView, které řídí sadu textových řádků, které se mají zobrazit, a také stříšku, výběr a zařízení prodorování textu pomocí prvků uživatelského rozhraní WPF. Tento subsystém také poskytuje okraje kolem oblasti zobrazení textu. Tyto okraje je možné rozšířit a mohou obsahovat různé druhy obsahu a vizuálních efektů. Příklady okrajů jsou zobrazení čísel řádků a posuvníky.

Veřejné typy subsystému textového zobrazení jsou obsaženy v Microsoft.VisualStudio.Text.UI.dll a Microsoft.VisualStudio.Text.UI.Wpf.dll. První sestavení obsahuje prvky nezávislé na platformě a druhé obsahuje prvky specifické pro WPF.

Subsystém klasifikace

Subsystém klasifikace zodpovídá za určení vlastností písma pro text. Klasifikátor rozdělí text do různých tříd, například "klíčové slovo" nebo "komentář". Mapa formátu klasifikace spojuje tyto třídy se skutečnými vlastnostmi písma, například "Blue Consolas 10 pt". Tyto informace používá textové zobrazení při formátování a vykreslení textu. Označování, které je podrobněji popsáno dále v tomto tématu, umožňuje přidružit data k rozsahům textu.

Veřejné typy klasifikačního subsystému jsou obsaženy v Microsoft.VisualStudio.Text.Logic.dll a pracují s vizuálními aspekty klasifikace, které jsou obsaženy v Microsoft.VisualStudio.Text.UI.Wpf.dll.

Operační subsystém

Subsystém operací definuje chování editoru. Poskytuje implementaci příkazů editoru sady Visual Studio a systému vrácení zpět.

Bližší pohled na textový model a zobrazení textu

Textový model

Subsystém textového modelu se skládá z různých seskupení typů textu. Patří sem vyrovnávací paměť textu, snímky textu a rozsahy textu.

Textové vyrovnávací paměti a snímky textu

Rozhraní ITextBuffer představuje posloupnost znaků Unicode, které jsou kódovány pomocí UTF-16, což je kódování používané typem String v rozhraní .NET Framework. Textovou vyrovnávací paměť lze zachovat jako dokument systému souborů, ale není to nutné.

Slouží ITextBufferFactoryService k vytvoření prázdné textové vyrovnávací paměti nebo textové vyrovnávací paměti inicializované z řetězce nebo z TextReader. Textové vyrovnávací paměti lze zachovat v systému souborů jako ITextDocument.

Jakékoli vlákno může upravit text vyrovnávací paměť, dokud vlákno převezme vlastnictví textové vyrovnávací paměti voláním TakeThreadOwnership. Potom může úpravy provádět pouze toto vlákno.

Vyrovnávací paměť textu může během své životnosti procházet mnoha verzemi. Při každé úpravě vyrovnávací paměti se vygeneruje nová verze a neměnná ITextSnapshot verze představuje obsah této verze vyrovnávací paměti. Vzhledem k tomu, že snímky textu jsou neměnné, můžete k textovému snímku přistupovat v libovolném vlákně bez omezení, i když textový vyrovnávací paměť, kterou představuje, se bude i nadále měnit.

Textové snímky a řádky snímků textu

Obsah textového snímku můžete zobrazit jako posloupnost znaků nebo jako posloupnost řádků. Znaky i řádky jsou indexovány od nuly. Prázdný textový snímek obsahuje nula znaků a jeden prázdný řádek. Řádek je oddělený libovolnou platnou posloupností znaků zalomení řádku Unicode nebo začátkem nebo koncem vyrovnávací paměti. Znaky zalomení řádku jsou explicitně reprezentovány v textovém snímku a konce řádků ve snímku textu nemusí být všechny stejné.

Poznámka:

Další informace o znacích zalomení řádků v editoru sady Visual Studio najdete v tématu Kódování a konce řádků.

Řádek textu je reprezentován objektem ITextSnapshotLine , který lze získat z textového snímku pro určité číslo řádku nebo pro konkrétní pozici znaku.

SnapshotPoints, SnapshotSpans a NormalizedSnapshotSpanCollections

A SnapshotPoint představuje pozici znaku ve snímku. Pozice je zaručena, že leží mezi nulou a délkou snímku. A SnapshotSpan představuje rozsah textu ve snímku. Jeho koncová pozice zaručuje, že leží mezi nulou a délkou snímku. Skládá NormalizedSnapshotSpanCollection se ze sady SnapshotSpan objektů ze stejného snímku.

Spans a NormalizedSpanCollections

A Span představuje interval, který lze použít na rozsah textu v textovém snímku. Pozice snímků jsou založené na nule, takže rozsahy můžou začínat na libovolné pozici včetně nuly. Vlastnost End span se rovná součtu jeho Start vlastnosti a její Length vlastnosti. A Span neobsahuje znak, který je indexován End vlastností. Například rozsah, který má Začátek=5 a Délka=3 má Hodnotu End=8 a obsahuje znaky na pozicích 5, 6 a 7. Zápis tohoto rozsahu je [5..8).

Dvě oblasti se protínají, pokud mají společné jakékoli pozice, včetně koncové pozice. Průsečík [3, 5) a [2, 7) je [3, 5) a průsečík [3, 5) a [5, 7) je [5, 5). (Všimněte si, že [5, 5) je prázdné rozpětí.)

Dvě rozpětí se překrývají, pokud mají společné pozice, s výjimkou pozice konce. Prázdné rozpětí nikdy nepřekrývá žádné jiné rozpětí a překrytí dvou rozpětí není nikdy prázdné.

A NormalizedSpanCollection je seznam rozsahů v pořadí vlastností Zahájení rozsahů. V seznamu se slučují překrývající se rozsahy nebo rozsahy přilévání. Například s ohledem na množinu rozsahů [5...9), [0..1), [3..6) a [9..10), normalizovaný seznam rozsahů je [0..1), [3..10).

Oznámení o změnách textu iTextEdit, TextVersion a text

Obsah textové vyrovnávací paměti lze změnit pomocí objektu ITextEdit . Vytvoření takového objektu (pomocí jedné z CreateEdit() metod ITextBuffer) spustí textovou transakci, která se skládá z úprav textu. Každá úprava je nahrazením určitého rozsahu textu v vyrovnávací paměti řetězcem. Souřadnice a obsah každé úpravy jsou vyjádřeny vzhledem k snímku vyrovnávací paměti při spuštění transakce. Objekt ITextEdit upravuje souřadnice úprav, které jsou ovlivněny jinými úpravami ve stejné transakci.

Představte si například textovou vyrovnávací paměť, která obsahuje tento řetězec:

abcdefghij

Použijte transakci, která obsahuje dvě úpravy, jednu úpravu, která nahradí rozsah na [2..4) znakem X a druhou úpravou, která nahradí rozsah v [6..9) znakem Y. Výsledkem je tato vyrovnávací paměť:

abXefYj

Souřadnice pro druhou úpravu byly vypočítány s ohledem na obsah vyrovnávací paměti na začátku transakce před použitím první úpravy.

Změny vyrovnávací paměti se projeví, když ITextEdit je objekt potvrzen voláním jeho Apply() metody. Pokud došlo alespoň k jedné neprázdné úpravě, vytvoří se nová ITextVersion , vytvoří se nová ITextSnapshot a vyvolá se jedna Changed událost. Každá textová verze má jiný textový snímek. Textový snímek představuje úplný stav vyrovnávací paměti textu po transakci úprav, ale textová verze popisuje pouze změny z jednoho snímku na další. Obecně platí, že textové snímky se mají používat jednou a pak se zahodí, zatímco textové verze musí nějakou dobu zůstat aktivní.

Textová verze obsahuje .INormalizedTextChangeCollection Tato kolekce popisuje změny, které při použití na snímek vytvoří další snímek. Každý ITextChange v kolekci obsahuje pozici znaku změny, nahrazený řetězec a náhradní řetězec. Nahrazený řetězec je prázdný pro základní vložení a náhradní řetězec je prázdný pro základní odstranění. Normalizovaná kolekce je vždy null určená pro nejnovější verzi textové vyrovnávací paměti.

Kdykoli je možné vytvořit instanci pouze jednoho ITextEdit objektu pro vyrovnávací paměť textu a všechny úpravy textu se musí provádět ve vlákně, které vlastní textovou vyrovnávací paměť (pokud je požadováno vlastnictví). Úpravu textu můžete opustit voláním metody Cancel nebo metody Dispose .

ITextBuffer také poskytuje Insert(), Delete()a Replace() metody, které se podobají těm, které se nacházejí v ITextEdit rozhraní. Volání těchto objektů má stejný účinek jako vytvoření objektu ITextEdit , vytvoření podobného volání a následné použití úprav.

Sledovací body a rozsahy sledování

Představuje ITrackingPoint pozici znaku v textové vyrovnávací paměti. Pokud je vyrovnávací paměť upravena způsobem, který způsobí posun pozice znaku, posune se s ním sledovací bod. Pokud například sledovací bod odkazuje na pozici 10 ve vyrovnávací paměti a na začátek vyrovnávací paměti se vloží pět znaků, sledovací bod pak odkazuje na pozici 15. Pokud se kurzor stane přesně na pozici označené sledovacím bodem, jeho chování je určeno jeho PointTrackingMode, což může být buď Positive nebo Negative. Pokud je režim sledování pozitivní, bod sledování odkazuje na stejný znak, který je nyní na konci vložení. Pokud je režim sledování záporný, bod sledování odkazuje na první vložený znak na původní pozici. Pokud je znak na pozici reprezentované sledovacím bodem odstraněn, bod sledování se přesune na první znak, který následuje za odstraněnou oblastí. Pokud například sledovací bod odkazuje na znak na pozici 5 a znaky na pozicích 3 až 6 se odstraní, sledovací bod odkazuje na znak na pozici 3.

Představuje ITrackingSpan oblast znaků místo jen jedné pozice. Jeho chování je určeno jeho SpanTrackingMode. Pokud je režim sledování spanu SpanTrackingMode.EdgeInclusive, rozrůstá se rozsah sledování tak, aby zahrnoval text vložený na jeho okraji. Pokud je režim sledování spanu SpanTrackingMode.EdgeExclusive, rozsah sledování neobsahuje text vložený na jeho okraji. Pokud je však režim sledování rozsahu SpanTrackingMode.EdgePositive, vložení posune aktuální pozici směrem ke startu a pokud je režim sledování rozsahu SpanTrackingMode.EdgeNegative, vložení nasdílí aktuální pozici směrem ke konci.

Umístění bodu sledování nebo rozsahu sledování můžete získat pro jakýkoli snímek textové vyrovnávací paměti, do které patří. Sledovací body a rozsahy sledování mohou být bezpečně odkazovány z jakéhokoli vlákna.

Typy obsahu

Typy obsahu představují mechanismus pro definování různých druhů obsahu. Typ obsahu může být typ souboru, například "text", "kód" nebo "binární", nebo typ technologie, například "xml", "vb" nebo "c#". Například slovo "using" je klíčové slovo v jazyce C# i Visual Basic, ale ne v jiných programovacích jazycích. Proto by definice tohoto klíčového slova byla omezena na typy obsahu "c#" a "vb".

Typy obsahu se používají jako filtr pro doplňky a další prvky editoru. Mnoho funkcí editoru a rozšiřujících bodů je definováno pro jednotlivé typy obsahu. Například barvení textu se liší pro soubory ve formátu prostého textu, soubory XML a soubory zdrojového kódu jazyka Visual Basic. Vyrovnávací paměti textu jsou obecně přiřazeny typ obsahu při jejich vytváření a typ obsahu textové vyrovnávací paměti lze změnit.

Typy obsahu mohou vícenásobně dědit z jiných typů obsahu. Umožňuje ContentTypeDefinition zadat více základních typů jako nadřazených prvků daného typu obsahu.

Vývojáři mohou definovat své vlastní typy obsahu a zaregistrovat je pomocí nástroje IContentTypeRegistryService. Mnoho funkcí editoru lze definovat s ohledem na určitý typ obsahu pomocí .ContentTypeAttribute Lze například definovat okraje editoru, doplňky a obslužné rutiny myši, aby se použily pouze u editorů, které zobrazují konkrétní typy obsahu.

Textové zobrazení

Část zobrazení vzoru kontroleru zobrazení modelu (MVC) definuje textové zobrazení, formátování zobrazení, grafické prvky, jako je posuvník a stříška. Všechny prvky prezentace editoru sady Visual Studio jsou založené na WPF.

Zobrazení textu

Rozhraní ITextView je reprezentace textového zobrazení nezávislá na platformě. Používá se primárně k zobrazení textových dokumentů v okně, ale dá se použít i pro jiné účely, například v popisu.

Textové zobrazení odkazuje na různé druhy textových vyrovnávacích pamětí. Vlastnost TextViewModel odkazuje na ITextViewModel objekt, který odkazuje na tyto tři různé textové vyrovnávací paměti: vyrovnávací paměť dat, což je vyrovnávací paměť nejvyšší úrovně dat, vyrovnávací paměť pro úpravy, ve které dochází k úpravám, a vizuální vyrovnávací paměť, což je vyrovnávací paměť zobrazená v textovém zobrazení.

Text je formátován na základě klasifikátorů, které jsou připojeny k podkladové vyrovnávací paměti textu, a je označen pomocí zprostředkovatelů doplňků, které jsou připojeny k samotnému textovému zobrazení.

Souřadnicový systém textového zobrazení

Souřadnicový systém textového zobrazení určuje pozice v textovém zobrazení. V tomto souřadnicovém systému odpovídá hodnota x 0,0 levému okraji zobrazeného textu a hodnota y 0,0 odpovídá hornímu okraji zobrazeného textu. Souřadnice x se zvyšuje zleva doprava a souřadnice y se zvyšuje shora dolů.

Oblast zobrazení (část textu viditelná v textovém okně) se nedá posunout vodorovně, jak se posune svisle. Oblast zobrazení se posune vodorovně tak, že změní levou souřadnici tak, aby se posouvat s ohledem na kreslicí plochu. Oblast zobrazení se ale dá posunout svisle pouze změnou vykresleného textu, což způsobí LayoutChanged vyvolání události.

Vzdálenosti v souřadnicovém systému odpovídají logickým pixelům. Pokud je plocha vykreslování textu zobrazena bez transformace měřítka, pak jedna jednotka v souřadnicovém systému vykreslování textu odpovídá jednomu pixelu na displeji.

Okraje

Rozhraní ITextViewMargin představuje okraj a umožňuje řídit viditelnost okraje a jeho velikost. Existují čtyři předdefinované okraje, které mají název "Horní", "Vlevo", "Vpravo" a "Dole" a jsou připojeny k hornímu, dolnímu, levému nebo pravému okraji zobrazení. Tyto okraje jsou kontejnery, ve kterých lze umístit další okraje. Rozhraní definuje metody, které vracejí velikost okraje a viditelnost okrajů. Okraje jsou vizuální prvky, které poskytují další informace o textovém zobrazení, ke kterému jsou připojeny. Například okraj s číslem řádku zobrazuje čísla řádků pro textové zobrazení. Okraj glyph zobrazuje prvky uživatelského rozhraní.

Rozhraní IWpfTextViewMarginProvider zpracovává vytváření a umístění okrajů. Okraje lze řadit s ohledem na ostatní okraje. Okraje s vyšší prioritou se nacházejí blíže k textovému zobrazení. Pokud jsou například dva levé okraje, okraj A a okraj B a okraj B má nižší prioritu než okraj A, zobrazí se okraj B nalevo od okraje A.

Hostitel textového zobrazení

Rozhraní IWpfTextViewHost obsahuje textové zobrazení a všechny ozdoby, které doprovázejí zobrazení, například posuvníky. Hostitel textového zobrazení obsahuje také okraje, které jsou připojeny k ohraničení zobrazení.

Formátovaný text

Text zobrazený v textovém zobrazení se skládá z ITextViewLine objektů. Každý řádek textového zobrazení odpovídá jednomu řádku textu v textovém zobrazení. Dlouhé řádky v podkladové vyrovnávací paměti textu můžou být buď částečně skryté (pokud není povolené zalamování textu), nebo rozdělené na několik řádků textového zobrazení. Rozhraní ITextViewLine obsahuje metody a vlastnosti pro mapování mezi souřadnicemi a znaky a pro doplňky, které mohou být přidruženy k řádku.

ITextViewLine objekty jsou vytvořeny pomocí IFormattedLineSource rozhraní. Pokud vás zajímá právě text, který je aktuálně zobrazený v zobrazení, můžete zdroj formátování ignorovat. Pokud vás zajímá formát textu, který se nezobrazuje v zobrazení (například pro podporu vyjmutí a vložení ve formátu RTF), můžete text formátovat IFormattedLineSource ve vyrovnávací paměti textu.

Textové zobrazení naformátuje po jednom ITextSnapshotLine .

Funkce editoru

Funkce editoru jsou navrženy tak, aby definice funkce byla oddělena od její implementace. Editor obsahuje tyto funkce:

  • Značky a klasifikátory

  • Ozdoby

  • Projekce

  • Osnova

  • Vazby myši a kláves

  • Operace a primitiva

  • IntelliSense

Značky a klasifikátory

Značky jsou značky, které jsou přidružené k rozsahu textu. Mohou být prezentovány různými způsoby, například pomocí barvení textu, podtržení, grafiky nebo automaticky otevíraných oken. Klasifikátory jsou jedním druhem značky.

Další druhy značek slouží TextMarkerTag ke zvýraznění textu, OutliningRegionTag k osnově a ErrorTag k chybám kompilace.

Typy klasifikace

Rozhraní IClassificationType představuje třídu ekvivalence, což je abstraktní kategorie textu. Typy klasifikace mohou vícenásobně dědit z jiných typů klasifikace. Například klasifikace programovacích jazyků můžou zahrnovat klíčové slovo, komentář a identifikátor, které dědí ze kódu. Typy klasifikace přirozeného jazyka můžou zahrnovat podstatná jména, sloveso a adjektivní jméno, které dědí z přirozeného jazyka.

Klasifikace

Klasifikace je instance určitého typu klasifikace, obvykle přes rozsah textu. A ClassificationSpan slouží k reprezentaci klasifikace. Rozsah klasifikace lze považovat za popisek, který pokrývá určitý rozsah textu a říká systému, že toto rozpětí textu je určitého typu klasifikace.

Třídění

Je IClassifier mechanismus, který rozděluje text do sady klasifikací. Klasifikátory musí být definovány pro konkrétní typy obsahu a vytvořit instanci pro konkrétní textové vyrovnávací paměti. Klienti musí implementovat IClassifier , aby se mohli účastnit klasifikace textu.

Agregátory klasifikátoru

Agregátor klasifikátoru je mechanismus, který kombinuje všechny klasifikátory pro jednu vyrovnávací paměť textu do pouze jedné sady klasifikací. Klasifikátor jazyka C# i klasifikátor anglického jazyka by například mohly vytvářet klasifikace přes komentář v souboru C#. Zvažte tento komentář:

// This method produces a classifier

Klasifikátor jazyka C# může označovat celý rozsah jako komentář a klasifikátor anglického jazyka může klasifikovat "plodiny" jako "sloveso" a "metoda" jako "podstatné jméno". Agregátor vytvoří sadu nepřekrývajících se klasifikací a typ sady vychází ze všech příspěvků.

Agregátor klasifikátoru je také klasifikátor, protože rozdělí text do sady klasifikací. Agregátor klasifikátoru také zajišťuje, že neexistují překrývající se klasifikace a že jsou klasifikace seřazené. Jednotlivé klasifikátory mohou vrátit libovolnou sadu klasifikací, v libovolném pořadí a překrývat se jakýmkoli způsobem.

Formátování klasifikace a obarvení textu

Formátování textu je příkladem funkce, která je založená na klasifikaci textu. Používá se vrstvou textového zobrazení k určení zobrazení textu v aplikaci. Oblast formátování textu závisí na WPF, ale logická definice klasifikací není.

Formát klasifikace je sada vlastností formátování pro určitý typ klasifikace. Tyto formáty dědí z formátu nadřazeného typu klasifikace.

An IClassificationFormatMap je mapa z klasifikačního typu na sadu vlastností formátování textu. Implementace mapy formátu v editoru zpracovává všechny exporty formátů klasifikace.

Ozdoby

Doplňky jsou grafické efekty, které přímo nesouvisí s písmem a barvou znaků v textovém zobrazení. Například červené podtržení vlnovek, které slouží k označení nekopilačního kódu v mnoha programovacích jazycích, je vložené doplňkové doplňky a popisy jsou automaticky otevírané doplňky. Doplňky jsou odvozeny z UIElement a implementují ITag. Dva specializované typy ozdobné značky jsou SpaceNegotiatingAdornmentTag, pro doplňky, které zabírají stejné místo jako text v zobrazení a ErrorTag, pro podtržení vlnovkou.

Vložené doplňky jsou grafické prvky, které tvoří součást formátovaného textového zobrazení. Jsou uspořádány v různých vrstvách pořadí Z. Existují tři předdefinované vrstvy: text, stříšku a výběr. Vývojáři ale můžou definovat více vrstev a dát je do pořádku s ohledem na sebe navzájem. Tři druhy vložených doplňků jsou doplňky s relativními texty (které se přesunou při přesouvání textu a odstraní se při odstranění textu), doplňky s relativním zobrazením (které se musí provádět s netextovými částmi zobrazení) a doplňky řízené vlastníkem (vývojář musí spravovat umístění).

Automaticky otevírané doplňky jsou grafické prvky, které se zobrazují v malém okně nad textovým zobrazením, například popisy.

Projekce

Projekce je technika pro vytvoření jiného druhu textové vyrovnávací paměti, která ve skutečnosti neukládá text, ale kombinuje text z jiných textových vyrovnávacích pamětí. Například vyrovnávací paměť projekce lze použít ke zřetězení textu ze dvou dalších vyrovnávacích pamětí a prezentovat výsledek, jako by byl v jedné vyrovnávací paměti, nebo ke skrytí částí textu v jedné vyrovnávací paměti. Vyrovnávací paměť projekce může fungovat jako zdrojová vyrovnávací paměť do jiné vyrovnávací paměti projekce. Sadu vyrovnávacích pamětí, které souvisejí s projekcí, lze vytvořit tak, aby přeuspořádaly text mnoha různými způsoby. (Taková sada se označuje také jako graf vyrovnávací paměti.) Funkce osnovy textu sady Visual Studio se implementuje pomocí vyrovnávací paměti projekce ke skrytí sbalovaného textu a editor sady Visual Studio pro ASP.NET stránky používá projekci pro podporu vložených jazyků, jako je Visual Basic a C#.

Vytvoří se IProjectionBuffer pomocí .IProjectionBufferFactoryService Vyrovnávací paměť projekce je reprezentována seřazenou sekvencí ITrackingSpan objektů, které se označují jako rozsahy zdroje. Obsah těchto rozsahů se prezentuje jako posloupnost znaků. Textové vyrovnávací paměti, ze kterých jsou zdroje rozloženy, jsou pojmenované zdrojové vyrovnávací paměti. Klienti vyrovnávací paměti projekce nemusí vědět, že se liší od běžné textové vyrovnávací paměti.

Vyrovnávací paměť projekce naslouchá událostem změny textu ve zdrojových vyrovnávacích pamětích. Když se text ve zdroji změní, vyrovnávací paměť projekce mapuje změněné textové souřadnice na vlastní souřadnice a vyvolá příslušné události změny textu. Představte si například zdrojové vyrovnávací paměti A a B, které mají tento obsah:

A: ABCDE
B: vwxyz

Pokud se vyrovnávací paměť projekce P vytvoří ze dvou rozsahů textu, jedna, která má veškerou vyrovnávací paměť A a druhou, která má veškerou vyrovnávací paměť B, pak P má následující obsah:

P: ABCDEvwxyz

Pokud je podřetězce xy odstraněn z vyrovnávací paměti B, pak vyrovnávací paměť P vyvolá událost, která označuje, že znaky na pozicích 7 a 8 byly odstraněny.

Vyrovnávací paměť projekce lze také upravit přímo. Rozšíří úpravy do příslušných zdrojových vyrovnávacích pamětí. Pokud je například řetězec vložen do vyrovnávací paměti P na pozici 6 (původní pozice znaku "v"), vložení se rozšíří do vyrovnávací paměti B na pozici 1.

Existují omezení zdrojových rozsahů, které přispívají do vyrovnávací paměti projekce. Rozsahy zdroje se nemusí překrývat; umístění v vyrovnávací paměti projekce nemůže namapovat na více než jedno umístění v žádné zdrojové vyrovnávací paměti a umístění ve zdrojové vyrovnávací paměti nelze mapovat na více než jedno umístění v vyrovnávací paměti projekce. Ve vztahu zdrojové vyrovnávací paměti nejsou povoleny žádné cyklity.

Události jsou vyvolány, když se změní sada zdrojových vyrovnávacích pamětí pro projekční vyrovnávací paměť a když se sada zdrojů změní. Vyrovnávací paměť elision je zvláštní druh projekční vyrovnávací paměti. Primárně se používá pro osnovu a operace, které rozbalují a sbalují bloky textu. Vyrovnávací paměť elision je založena pouze na jedné zdrojové vyrovnávací paměti a rozsahy v vyrovnávací paměti elision musí být seřazeny stejně, jako jsou seřazeny ve zdrojové vyrovnávací paměti.

Graf vyrovnávací paměti

Rozhraní IBufferGraph umožňuje mapování napříč grafem vyrovnávacích pamětí projekce. Všechny textové vyrovnávací paměti a vyrovnávací paměti projekce se shromažďují v řízeném acyklickém grafu, podobně jako abstraktní strom syntaxe vytvořený kompilátorem jazyka. Graf je definován horní vyrovnávací pamětí, což může být libovolná textová vyrovnávací paměť. Graf vyrovnávací paměti může mapovat z bodu v horní vyrovnávací paměti na bod ve zdrojové vyrovnávací paměti nebo z rozsahu v horní vyrovnávací paměti do sady rozsahů ve zdrojové vyrovnávací paměti. Podobně může mapovat bod nebo rozsah ze zdrojové vyrovnávací paměti na bod v horní vyrovnávací paměti. Grafy vyrovnávací paměti se vytvářejí pomocí metody IBufferGraphFactoryService.

Vyrovnávací paměti událostí a projekce

Při úpravě vyrovnávací paměti projekce se změny odesílají z vyrovnávací paměti projekce do vyrovnávací paměti, které na ní závisí. Po změně všech vyrovnávacích pamětí jsou vyvolány události změny vyrovnávací paměti, počínaje nejnižší vyrovnávací pamětí.

Osnova

Osnova je možnost rozbalit nebo sbalit různé bloky textu v textovém zobrazení. Osnova je definována jako druh ITag, stejně jako doplňky jsou definovány. A OutliningRegionTag je značka, která definuje textovou oblast, kterou lze rozbalit nebo sbalit. Pokud chcete použít osnovu, musíte naimportovat, abyste získali IOutliningManagerService .IOutliningManager Nadřízený výčty, sbalí a rozšíří různé bloky, které jsou reprezentovány jako ICollapsible objekty, a odpovídajícím způsobem vyvolává události.

Vazby myši

Vazby myši propojují pohyby myši s různými příkazy. Vazby myši jsou definovány pomocí a IMouseProcessorProviderklíčové vazby jsou definovány pomocí IKeyProcessorProvider. Automaticky IWpfTextViewHost vytvoří instanci všech vazeb a připojí je k událostem myši v zobrazení.

Rozhraní IMouseProcessor obsahuje obslužné rutiny událostí před procesem a po zpracování pro různé události myši. Chcete-li zpracovat jednu z událostí, můžete přepsat některé metody v MouseProcessorBase.

Operace editoru

Operace editoru lze použít k automatizaci interakce s editorem pro skriptování nebo jiné účely. Můžete importovat IEditorOperationsFactoryService operace pro přístup k danému ITextView. Tyto objekty pak můžete použít k úpravě výběru, posouvání zobrazení nebo přesunutí kurzoru do různých částí zobrazení.

IntelliSense

IntelliSense podporuje dokončování příkazů, nápovědu k podpisu (označovanou také jako informace o parametrech), rychlé informace a žárovky.

Doplňování příkazů poskytuje automaticky otevírané seznamy potenciálních dokončení názvů metod, elementů XML a dalších programovacích nebo značek prvků. Obecně platí, že gesto uživatele vyvolá relaci dokončení. Relace zobrazí seznam potenciálních dokončení a uživatel může vybrat jeden nebo zavřít seznam. Zodpovídá ICompletionBroker za vytvoření a aktivaci ICompletionSession. CompletionSet Vypočítá ICompletionSource položky dokončení relace.

Řešení potíží s importem a exportem: Přístup k protokolu chyb MEF Composition

Pokud se pokusíte naimportovat něco, co v aktuální instalaci VS neexistuje nebo pokud import nebo export nesprávně vytvoříte, může dojít k problémům. Primárním způsobem, jak tyto problémy najít a vyřešit, je odkazovat na protokol chyb složení spravovaného rozšíření (MEF) uložený v %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.