Bagikan melalui


Di dalam editor

Editor terdiri dari beberapa subsistem yang berbeda, yang dirancang untuk menjaga model teks editor terpisah dari tampilan teks dan antarmuka pengguna.

Bagian ini menjelaskan berbagai aspek editor:

Bagian ini menjelaskan fitur editor:

Subsistem

Subsistem model teks

Subsistem model teks bertanggung jawab untuk mewakili teks dan mengaktifkan manipulasinya. Subsistem model teks berisi ITextBuffer antarmuka, yang menjelaskan urutan karakter yang akan ditampilkan oleh editor. Teks ini dapat dimodifikasi, dilacak, dan dimanipulasi dalam banyak cara. Model teks juga menyediakan jenis untuk aspek-aspek berikut:

  • Layanan yang mengaitkan teks dengan file, dan mengelola membaca dan menulisnya dalam sistem file.

  • Layanan berbeda yang menemukan perbedaan minimal antara dua urutan objek.

  • Sistem untuk menjelaskan teks dalam buffer dalam hal subset teks di buffer lain.

Subsistem model teks bebas dari konsep antarmuka pengguna (UI). Misalnya, tidak bertanggung jawab atas pemformatan teks atau tata letak teks, dan tidak memiliki pengetahuan tentang hiasan visual yang mungkin terkait dengan teks.

Jenis publik subsistem model teks terkandung dalam Microsoft.VisualStudio.Text.Data.dll dan Microsoft.VisualStudio.CoreUtility.dll, yang hanya bergantung pada pustaka kelas dasar .NET Framework dan Managed Extensibility Framework (MEF).

Subsistem tampilan teks

Subsistem tampilan teks bertanggung jawab untuk memformat dan menampilkan teks. Jenis dalam subsistem ini dibagi menjadi dua lapisan, tergantung pada apakah jenis bergantung pada Windows Presentation Foundation (WPF). Jenis yang paling penting adalah ITextView dan IWpfTextView, yang mengontrol kumpulan baris teks yang akan ditampilkan, dan juga tanda sisipan, pilihan, dan fasilitas untuk menghiasi teks dengan menggunakan elemen WPF UI. Subsistem ini juga menyediakan margin di sekitar area tampilan teks. Margin ini dapat diperluas, dan dapat berisi berbagai jenis konten dan efek visual. Contoh margin adalah tampilan nomor baris dan bilah gulir.

Jenis publik subsistem tampilan teks terkandung dalam Microsoft.VisualStudio.Text.UI.dll dan Microsoft.VisualStudio.Text.UI.Wpf.dll. Rakitan pertama berisi elemen independen platform, dan yang kedua berisi elemen khusus WPF.

Subsistem klasifikasi

Subsistem klasifikasi bertanggung jawab untuk menentukan properti font untuk teks. Pengklasifikasi memecah teks menjadi kelas yang berbeda, misalnya, "kata kunci" atau "komentar". Peta format klasifikasi berkaitan dengan kelas ini dengan properti font aktual, misalnya, "Blue Consolas 10 pt". Informasi ini digunakan oleh tampilan teks saat memformat dan merender teks. Pemberian tag, yang dijelaskan secara lebih rinci nanti dalam topik ini, memungkinkan data dikaitkan dengan rentang teks.

Jenis publik subsistem klasifikasi terkandung dalam Microsoft.VisualStudio.Text.Logic.dll, dan mereka berinteraksi dengan aspek visual klasifikasi, yang terkandung dalam Microsoft.VisualStudio.Text.UI.Wpf.dll.

Subsistem operasi

Subsistem operasi mendefinisikan perilaku editor. Ini menyediakan implementasi untuk perintah editor Visual Studio dan sistem batalkan.

Melihat lebih dekat model teks dan tampilan teks

Model teks

Subsistem model teks terdiri dari berbagai pengelompokan jenis teks. Ini termasuk buffer teks, rekam jepret teks, dan rentang teks.

Buffer teks dan rekam jepret teks

Antarmuka ITextBuffer mewakili urutan karakter Unicode yang dikodekan dengan menggunakan UTF-16, yang merupakan pengodean yang digunakan oleh String jenis dalam .NET Framework. Buffer teks dapat dipertahankan sebagai dokumen sistem file, tetapi ini tidak diperlukan.

ITextBufferFactoryService digunakan untuk membuat buffer teks kosong, atau buffer teks yang diinisialisasi dari string atau dari TextReader. Buffer teks dapat dipertahankan ke sistem file sebagai ITextDocument.

Utas apa pun dapat mengedit buffer teks hingga utas mengambil kepemilikan buffer teks dengan memanggil TakeThreadOwnership. Setelah itu, hanya utas yang dapat melakukan pengeditan.

Buffer teks dapat melalui banyak versi selama masa pakainya. Versi baru dihasilkan setiap kali buffer diedit, dan tidak dapat ITextSnapshot diubah mewakili konten versi buffer tersebut. Karena rekam jepret teks tidak dapat diubah, Anda dapat mengakses rekam jepret teks pada utas apa pun, tanpa batasan, bahkan jika buffer teks yang diwakilinya terus berubah.

Rekam jepret teks dan garis rekam jepret teks

Anda dapat melihat konten rekam jepret teks sebagai urutan karakter atau sebagai urutan baris. Karakter dan baris keduanya diindeks mulai dari nol. Rekam jepret teks kosong berisi nol karakter dan satu baris kosong. Garis dibatasi oleh urutan karakter pemisah baris Unicode yang valid, atau pada awal atau akhir buffer. Karakter pemisah baris secara eksplisit diwakili dalam rekam jepret teks, dan pemisah baris dalam rekam jepret teks tidak semuanya harus sama.

Catatan

Untuk informasi selengkapnya tentang karakter pemisah baris di editor Visual Studio, lihat Pengodean dan hentian baris.

Baris teks diwakili oleh ITextSnapshotLine objek, yang dapat diperoleh dari rekam jepret teks untuk nomor baris tertentu atau untuk posisi karakter tertentu.

SnapshotPoints, SnapshotSpans, dan NormalizedSnapshotSpanCollections

SnapshotPoint mewakili posisi karakter dalam rekam jepret. Posisi dijamin terletak di antara nol dan panjang rekam jepret. mewakili SnapshotSpan rentang teks dalam rekam jepret. Posisi Akhir dijamin berada di antara nol dan panjang rekam jepret. NormalizedSnapshotSpanCollection Terdiri dari sekumpulan SnapshotSpan objek dari rekam jepret yang sama.

Rentang dan NormalizedSpanCollections

Span mewakili interval yang dapat diterapkan ke rentang teks dalam rekam jepret teks. Posisi rekam jepret berbasis nol, sehingga rentang dapat dimulai pada posisi apa pun termasuk nol. Properti End rentang sama dengan jumlah propertinya Start dan propertinya Length . Span Tidak termasuk karakter yang diindeks oleh End properti . Misalnya, rentang yang memiliki Start=5 dan Length=3 memiliki End=8, dan mencakup karakter pada posisi 5, 6, dan 7. Notasi untuk rentang ini adalah [5..8).

Dua rentang bersinggungan jika mereka memiliki posisi yang sama, termasuk posisi Akhir. Oleh karena itu, persimpangan [3, 5) dan [2, 7) adalah [3, 5) dan persimpangan [3, 5) dan [5, 7) adalah [5, 5). (Perhatikan bahwa [5, 5) adalah rentang kosong.)

Dua rentang tumpang tindih jika memiliki posisi yang sama, kecuali untuk posisi Akhir. Rentang kosong tidak pernah tumpang tindih dengan rentang lain, dan tumpang tindih dua rentang tidak pernah kosong.

NormalizedSpanCollection adalah daftar rentang dalam urutan properti Mulai rentang. Dalam daftar, rentang tumpang tindih atau abutting digabungkan. Misalnya, mengingat set rentang [5..9), [0..1), [3..6), dan [9..10), daftar rentang yang dinormalisasi adalah [0..1), [3..10).

Pemberitahuan perubahan ITextEdit, TextVersion, dan teks

Konten buffer teks dapat diubah dengan menggunakan ITextEdit objek. Membuat objek seperti itu CreateEdit() (dengan menggunakan salah satu metode ITextBuffer) memulai transaksi teks yang terdiri dari pengeditan teks. Setiap pengeditan adalah penggantian beberapa rentang teks dalam buffer oleh string. Koordinat dan konten setiap pengeditan dinyatakan relatif terhadap rekam jepret buffer saat transaksi dimulai. Objek ITextEdit menyesuaikan koordinat pengeditan yang dipengaruhi oleh pengeditan lain dalam transaksi yang sama.

Misalnya, pertimbangkan buffer teks yang berisi string ini:

abcdefghij

Terapkan transaksi yang berisi dua pengeditan, satu pengeditan yang menggantikan rentang pada [2..4) dengan menggunakan karakter X dan pengeditan kedua yang menggantikan rentang pada [6..9) dengan menggunakan karakter Y. Hasilnya adalah buffer ini:

abXefYj

Koordinat untuk pengeditan kedua dihitung sehubungan dengan konten buffer di awal transaksi, sebelum pengeditan pertama diterapkan.

Perubahan pada buffer berlaku ketika ITextEdit objek diterapkan dengan memanggil metodenya Apply() . Jika setidaknya ada satu pengeditan yang tidak kosong, yang baru ITextVersion dibuat, baru ITextSnapshot dibuat, dan satu Changed peristiwa dinaikkan. Setiap versi teks memiliki rekam jepret teks yang berbeda. Rekam jepret teks mewakili status lengkap buffer teks setelah transaksi edit, tetapi versi teks hanya menjelaskan perubahan dari satu rekam jepret ke rekam jepret berikutnya. Secara umum, rekam jepret teks dimaksudkan untuk digunakan sekali dan kemudian dibuang, sementara versi teks harus tetap hidup selama beberapa waktu.

Versi teks berisi INormalizedTextChangeCollection. Koleksi ini menjelaskan perubahan yang, saat diterapkan ke rekam jepret, menghasilkan rekam jepret berikutnya. Setiap ITextChange dalam koleksi berisi posisi karakter perubahan, string yang diganti, dan string pengganti. String yang diganti kosong untuk penyisipan dasar, dan string pengganti kosong untuk penghapusan dasar. Koleksi yang dinormalisasi selalu null untuk versi terbaru buffer teks.

Hanya satu ITextEdit objek yang dapat dibuat untuk buffer teks kapan saja, dan semua pengeditan teks harus dilakukan pada utas yang memiliki buffer teks (jika kepemilikan telah diklaim). Pengeditan teks dapat diabaikan dengan memanggil metode atau metodenya CancelDispose .

ITextBuffer juga menyediakan Insert()metode , Delete(), dan Replace() yang menyerupai yang ditemukan di ITextEdit antarmuka. Memanggil ini memiliki efek yang sama dengan membuat ITextEdit objek, melakukan panggilan serupa, lalu menerapkan pengeditan.

Titik pelacakan dan rentang pelacakan

Mewakili ITrackingPoint posisi karakter dalam buffer teks. Jika buffer diedit dengan cara yang menyebabkan posisi karakter bergeser, titik pelacakan bergeser dengannya. Misalnya, jika titik pelacakan mengacu pada posisi 10 dalam buffer, dan lima karakter disisipkan di awal buffer, titik pelacakan kemudian mengacu pada posisi 15. Jika penyisipan terjadi tepat pada posisi yang ditandai oleh titik pelacakan, perilakunya ditentukan oleh PointTrackingMode, yang dapat berupa Positive atau Negative. Jika mode pelacakan positif, titik pelacakan mengacu pada karakter yang sama, yang sekarang berada di akhir penyisipan. Jika mode pelacakan negatif, titik pelacakan mengacu pada karakter pertama yang disisipkan pada posisi aslinya. Jika karakter pada posisi yang diwakili oleh titik pelacakan dihapus, titik pelacakan bergeser ke karakter pertama yang mengikuti rentang yang dihapus. Misalnya, jika titik pelacakan mengacu pada karakter pada posisi 5, dan karakter pada posisi 3 hingga 6 dihapus, titik pelacakan mengacu pada karakter pada posisi 3.

Mewakili ITrackingSpan rentang karakter, bukan hanya satu posisi. Perilakunya ditentukan oleh SpanTrackingMode. Jika mode pelacakan rentang adalah SpanTrackingMode.EdgeInclusive, rentang pelacakan tumbuh untuk menggabungkan teks yang dimasukkan di tepinya. Jika mode pelacakan rentang adalah SpanTrackingMode.EdgeExclusive, rentang pelacakan tidak menggabungkan teks yang dimasukkan di tepinya. Namun, jika mode pelacakan rentang adalah SpanTrackingMode.EdgePositive, penyisipan mendorong posisi saat ini ke awal, dan jika mode pelacakan rentang adalah SpanTrackingMode.EdgeNegative, penyisipan mendorong posisi saat ini ke arah akhir.

Anda bisa mendapatkan posisi titik pelacakan atau rentang rentang pelacakan untuk rekam jepret buffer teks tempat mereka berada. Titik pelacakan dan rentang pelacakan dapat dirujuk dengan aman dari utas apa pun.

Jenis konten

Jenis konten adalah mekanisme untuk menentukan berbagai jenis konten. Jenis konten dapat berupa jenis file seperti "teks", "kode", atau "biner", atau jenis teknologi seperti "xml", "vb", atau "c#". Misalnya, kata "menggunakan" adalah kata kunci dalam C# dan Visual Basic, tetapi tidak dalam bahasa pemrograman lainnya. Oleh karena itu, definisi kata kunci ini akan terbatas pada jenis konten "c#" dan "vb".

Jenis konten digunakan sebagai filter untuk hiasan dan elemen editor lainnya. Banyak fitur editor dan titik ekstensi didefinisikan per jenis konten. Misalnya, pewarnaan teks berbeda untuk file teks biasa, file XML, dan file kode sumber Visual Basic. Buffer teks umumnya diberi tipe konten saat dibuat, dan tipe konten buffer teks dapat diubah.

Tipe isi dapat mewarisi beberapa dari tipe isi lainnya. memungkinkan ContentTypeDefinition Anda menentukan beberapa jenis dasar sebagai orang tua dari jenis konten tertentu.

Pengembang dapat menentukan jenis konten mereka sendiri dan mendaftarkannya dengan menggunakan IContentTypeRegistryService. Banyak fitur editor dapat didefinisikan sehubungan dengan jenis konten tertentu dengan menggunakan ContentTypeAttribute. Misalnya, margin editor, hiasan, dan penangan mouse dapat didefinisikan sehingga hanya berlaku untuk editor yang menampilkan jenis konten tertentu.

Tampilan teks

Bagian tampilan pola pengontrol tampilan model (MVC) menentukan tampilan teks, pemformatan tampilan, elemen grafik seperti bilah gulir, dan tanda sisipan. Semua elemen presentasi editor Visual Studio didasarkan pada WPF.

Tampilan teks

Antarmuka ITextView adalah representasi independen platform dari tampilan teks. Ini digunakan terutama untuk menampilkan dokumen teks di jendela, tetapi juga dapat digunakan untuk tujuan lain, misalnya, dalam tipsalat.

Tampilan teks mereferensikan berbagai jenis buffer teks. Properti TextViewModel mengacu pada objek yang menunjuk ITextViewModel ke tiga buffer teks yang berbeda ini: buffer data, yang merupakan buffer tingkat data teratas, buffer edit, di mana pengeditan terjadi, dan buffer visual, yang merupakan buffer yang ditampilkan dalam tampilan teks.

Teks diformat berdasarkan pengklasifikasi yang dilampirkan ke buffer teks yang mendasar, dan dihiasi dengan menggunakan penyedia hiasan yang dilampirkan ke tampilan teks itu sendiri.

Sistem koordinat tampilan teks

Sistem koordinat tampilan teks menentukan posisi dalam tampilan teks. Dalam sistem koordinat ini, nilai x 0,0 sesuai dengan tepi kiri teks yang ditampilkan, dan nilai y 0,0 sesuai dengan tepi atas teks yang ditampilkan. Koordinat x meningkat dari kiri ke kanan, dan koordinat y meningkat dari atas ke bawah.

Viewport (bagian teks yang terlihat di jendela teks) tidak dapat digulir dengan cara yang sama secara horizontal seperti yang digulir secara vertikal. Viewport digulir secara horizontal dengan mengubah koordinat kirinya sehingga bergerak sehubungan dengan permukaan gambar. Namun, viewport hanya dapat digulir secara vertikal dengan mengubah teks yang dirender, yang menyebabkan LayoutChanged peristiwa dinaikkan.

Jarak dalam sistem koordinat sesuai dengan piksel logis. Jika permukaan penyajian teks ditampilkan tanpa transformasi penskalaan, maka satu unit dalam sistem koordinat penyajian teks sesuai dengan satu piksel pada layar.

Margin

Antarmuka ITextViewMargin mewakili margin dan memungkinkan kontrol visibilitas margin dan ukurannya. Ada empat margin yang telah ditentukan sebelumnya, yang diberi nama "Atas", "Kiri", "Kanan", dan "Bawah" dan dilampirkan ke tepi atas, bawah, kiri, atau kanan tampilan. Margin ini adalah kontainer tempat margin lain dapat ditempatkan. Antarmuka menentukan metode yang mengembalikan ukuran margin dan visibilitas margin. Margin adalah elemen visual yang menyediakan informasi tambahan tentang tampilan teks yang dilampirkan. Misalnya, margin nomor baris menampilkan nomor baris untuk tampilan teks. Margin glyph menampilkan elemen UI.

Antarmuka IWpfTextViewMarginProvider menangani pembuatan dan penempatan margin. Margin dapat diurutkan sehubungan dengan margin lain. Margin berprioritas lebih tinggi terletak lebih dekat ke tampilan teks. Misalnya, jika ada dua margin kiri, margin A dan margin B, dan margin B memiliki prioritas yang lebih rendah daripada margin A, margin B muncul di sebelah kiri margin A.

Host tampilan teks

Antarmuka IWpfTextViewHost berisi tampilan teks dan dekorasi abutting apa pun yang menyertai tampilan, misalnya, bilah gulir. Host tampilan teks juga berisi margin yang dilampirkan ke batas tampilan.

Teks yang diformat

Teks yang ditampilkan dalam tampilan teks terdiri dari ITextViewLine objek. Setiap baris tampilan teks sesuai dengan satu baris teks dalam tampilan teks. Garis panjang dalam buffer teks yang mendasar dapat dikaburkan sebagian (jika pembungkusan kata tidak diaktifkan) atau dipecah menjadi beberapa baris tampilan teks. Antarmuka ITextViewLine berisi metode dan properti untuk pemetaan antara koordinat dan karakter, dan untuk hiasan yang mungkin terkait dengan garis.

ITextViewLine objek dibuat dengan menggunakan IFormattedLineSource antarmuka. Jika Anda hanya khawatir tentang teks yang saat ini ditampilkan dalam tampilan, Anda dapat mengabaikan sumber pemformatan. Jika Anda tertarik dengan format teks yang tidak ditampilkan dalam tampilan (misalnya, untuk mendukung pemotongan dan tempel teks kaya), Anda dapat menggunakan IFormattedLineSource untuk memformat teks dalam buffer teks.

Tampilan teks memformat satu per satu ITextSnapshotLine .

Fitur editor

Fitur editor dirancang sehingga definisi fitur terpisah dari implementasinya. Editor mencakup fitur-fitur ini:

  • Tag dan pengklasifikasi

  • Hiasan

  • Proyeksi

  • Menguraikan

  • Pengikatan mouse dan kunci

  • Operasi dan primitif

  • IntelliSense

Tag dan pengklasifikasi

Tag adalah penanda yang terkait dengan rentang teks. Mereka dapat disajikan dengan cara yang berbeda, misalnya, dengan menggunakan pewarnaan teks, garis bawah, grafik, atau pop-up. Pengklasifikasi adalah salah satu jenis tag.

Jenis tag lainnya adalah TextMarkerTag untuk penyorotan teks, OutliningRegionTag untuk kerangka, dan ErrorTag untuk kesalahan kompilasi.

Jenis klasifikasi

Antarmuka IClassificationType mewakili kelas kesetaraan, yang merupakan kategori teks abstrak. Jenis klasifikasi dapat diwarisi beberapa dari jenis klasifikasi lainnya. Misalnya, klasifikasi bahasa pemrograman mungkin mencakup "kata kunci", "komentar", dan "pengidentifikasi", yang semuanya diwarisi dari "kode". Jenis klasifikasi bahasa alami mungkin mencakup "kata benda", "kata kerja", dan "kata sifat", yang semuanya diwarisi dari "bahasa alami".

Klasifikasi Data

Klasifikasi adalah instans dari jenis klasifikasi tertentu, biasanya selama rentang teks. ClassificationSpan digunakan untuk mewakili klasifikasi. Rentang klasifikasi dapat dianggap sebagai label yang mencakup rentang teks tertentu dan memberi tahu sistem bahwa rentang teks ini adalah jenis klasifikasi tertentu.

Pengklasifikasi

IClassifier adalah mekanisme yang memecah teks menjadi serangkaian klasifikasi. Pengklasifikasi harus didefinisikan untuk jenis konten tertentu dan dibuat untuk buffer teks tertentu. Klien harus menerapkan IClassifier untuk berpartisipasi dalam klasifikasi teks.

Agregator pengklasifikasi

Agregator pengklasifikasi adalah mekanisme yang menggabungkan semua pengklasifikasi untuk satu buffer teks menjadi hanya satu set klasifikasi. Misalnya, pengklasifikasi C# dan pengklasifikasi bahasa Inggris dapat membuat klasifikasi melalui komentar dalam file C#. Pertimbangkan komentar ini:

// This method produces a classifier

Pengklasifikasi C# dapat memberi label seluruh rentang sebagai komentar, dan pengklasifikasi bahasa Inggris mungkin mengklasifikasikan "menghasilkan" sebagai "kata kerja" dan "metode" sebagai "kata benda". Agregator menghasilkan serangkaian klasifikasi yang tidak tumpang tindih, dan jenis set didasarkan pada semua kontribusi.

Agregator pengklasifikasi juga merupakan pengklasifikasi karena memecah teks menjadi serangkaian klasifikasi. Agregator pengklasifikasi juga memastikan bahwa tidak ada klasifikasi yang tumpang tindih dan bahwa klasifikasi diurutkan. Pengklasifikasi individu bebas untuk mengembalikan serangkaian klasifikasi apa pun, dalam urutan apa pun, dan tumpang tindih dengan cara apa pun.

Pemformatan klasifikasi dan pewarnaan teks

Pemformatan teks adalah contoh fitur yang dibangun di atas klasifikasi teks. Ini digunakan oleh lapisan tampilan teks untuk menentukan tampilan teks dalam aplikasi. Area pemformatan teks tergantung pada WPF, tetapi definisi logis klasifikasi tidak.

Format klasifikasi adalah sekumpulan properti pemformatan untuk jenis klasifikasi tertentu. Format ini mewarisi dari format induk jenis klasifikasi.

IClassificationFormatMap adalah peta dari jenis klasifikasi ke sekumpulan properti pemformatan teks. Implementasi peta format di editor menangani semua ekspor format klasifikasi.

Hiasan

Hiasan adalah efek grafis yang tidak terkait langsung dengan font dan warna karakter dalam tampilan teks. Misalnya, garis bawah berlekuk merah yang digunakan untuk menandai kode non-kompilasi dalam banyak bahasa pemrograman adalah hiasan yang disematkan, dan tipsalat adalah hiasan pop-up. Hiasan berasal dari UIElement dan mengimplementasikan ITag. Dua jenis khusus tag hiasan adalah SpaceNegotiatingAdornmentTag, untuk hiasan yang menempati ruang yang sama dengan teks dalam tampilan, dan ErrorTag, untuk garis bawah berlekuk.

Hiasan yang disematkan adalah grafik yang membentuk bagian dari tampilan teks yang diformat. Mereka diatur dalam lapisan urutan Z yang berbeda. Ada tiga lapisan bawaan, sebagai berikut: teks, tanda sisipan, dan pilihan. Namun, pengembang dapat menentukan lebih banyak lapisan dan menempatkannya secara berurutan sehubungan satu sama lain. Tiga jenis hiasan yang disematkan adalah hiasan relatif teks (yang bergerak saat teks bergerak, dan dihapus saat teks dihapus), hiasan relatif tampilan (yang ada hubungannya dengan bagian tampilan non-teks), dan hiasan yang dikontrol pemilik (pengembang harus mengelola penempatannya).

Hiasan pop-up adalah grafik yang muncul di jendela kecil di atas tampilan teks, misalnya, tipsalat.

Proyeksi

Proyeksi adalah teknik untuk membuat jenis buffer teks yang berbeda yang tidak benar-benar menyimpan teks, tetapi sebaliknya menggabungkan teks dari buffer teks lain. Misalnya, buffer proyeksi dapat digunakan untuk menggabungkan teks dari dua buffer lain dan menyajikan hasilnya seolah-olah hanya dalam satu buffer, atau untuk menyembunyikan bagian teks dalam satu buffer. Buffer proyeksi dapat bertindak sebagai buffer sumber ke buffer proyeksi lain. Sekumpulan buffer yang terkait dengan proyeksi dapat dibangun untuk menyusun ulang teks dengan berbagai cara. (Set semacam itu juga dikenal sebagai grafik buffer.) Fitur kerangka teks Visual Studio diimplementasikan dengan menggunakan buffer proyeksi untuk menyembunyikan teks yang diciutkan, dan editor Visual Studio untuk halaman ASP.NET menggunakan proyeksi untuk mendukung bahasa yang disematkan seperti Visual Basic dan C#.

Dibuat IProjectionBuffer dengan menggunakan IProjectionBufferFactoryService. Buffer proyeksi diwakili oleh urutan ITrackingSpan objek yang diurutkan yang dikenal sebagai rentang sumber. Isi rentang ini disajikan sebagai urutan karakter. Buffer teks tempat rentang sumber digambar dinamai buffer sumber. Klien buffer proyeksi tidak perlu menyadari bahwa itu berbeda dari buffer teks biasa.

Buffer proyeksi mendengarkan peristiwa perubahan teks pada buffer sumber. Saat teks dalam rentang sumber berubah, buffer proyeksi memetakan koordinat teks yang diubah ke koordinatnya sendiri dan menaikkan peristiwa perubahan teks yang sesuai. Misalnya, pertimbangkan buffer sumber A dan B yang memiliki konten ini:

A: ABCDE
B: vwxyz

Jika buffer proyeksi P terbentuk dari dua rentang teks, satu yang memiliki semua buffer A dan yang lainnya yang memiliki semua buffer B, maka P memiliki konten berikut:

P: ABCDEvwxyz

Jika substring xy dihapus dari buffer B, maka buffer P akan memunculkan peristiwa yang menunjukkan bahwa karakter pada posisi 7 dan 8 dihapus.

Buffer proyeksi juga dapat diedit secara langsung. Ini menyebarluaskan pengeditan ke buffer sumber yang sesuai. Misalnya, jika string dimasukkan ke dalam buffer P pada posisi 6 (posisi asli karakter "v"), penyisipan disebarkan ke buffer B pada posisi 1.

Ada batasan pada rentang sumber yang berkontribusi pada buffer proyeksi. Rentang sumber mungkin tidak tumpang tindih; lokasi dalam buffer proyeksi tidak dapat memetakan ke lebih dari satu lokasi di buffer sumber mana pun, dan lokasi dalam buffer sumber tidak dapat memetakan ke lebih dari satu lokasi dalam buffer proyeksi. Tidak ada edaran yang diizinkan dalam hubungan buffer sumber.

Peristiwa dimunculkan ketika kumpulan buffer sumber untuk buffer proyeksi berubah dan ketika kumpulan rentang sumber berubah. Buffer elisi adalah jenis buffer proyeksi khusus. Ini terutama digunakan untuk menguraikan dan untuk operasi yang memperluas dan menciutkan blok teks. Buffer elisi hanya didasarkan pada satu buffer sumber, dan rentang dalam buffer elisi harus diurutkan sama seperti yang diurutkan dalam buffer sumber.

Grafik buffer

Antarmuka IBufferGraph memungkinkan pemetaan di seluruh grafik buffer proyeksi. Semua buffer teks dan buffer proyeksi dikumpulkan dalam grafik acyclic yang diarahkan, seperti pohon sintaks abstrak yang diproduksi oleh pengkompilasi bahasa. Grafik didefinisikan oleh buffer atas, yang dapat menjadi buffer teks apa pun. Grafik buffer dapat memetakan dari titik di buffer atas ke titik dalam buffer sumber, atau dari rentang di buffer atas ke serangkaian rentang dalam buffer sumber. Demikian pula, ia dapat memetakan titik atau rentang dari buffer sumber ke titik di buffer atas. Grafik buffer dibuat dengan menggunakan IBufferGraphFactoryService.

Buffer peristiwa dan proyeksi

Ketika buffer proyeksi dimodifikasi, modifikasi dikirim dari buffer proyeksi ke buffer yang bergantung padanya. Setelah semua buffer dimodifikasi, peristiwa perubahan buffer dinaikkan, dimulai dengan buffer terdalam.

Menguraikan

Kerangka adalah kemampuan untuk memperluas atau menciutkan blok teks yang berbeda dalam tampilan teks. Kerangka didefinisikan sebagai semacam ITag, dengan cara yang sama seperti hiasan didefinisikan. OutliningRegionTag adalah tag yang menentukan wilayah teks yang dapat diperluas atau diciutkan. Untuk menggunakan kerangka, Anda harus mengimpor IOutliningManagerService untuk mendapatkan IOutliningManager. Manajer kerangka menghitung, menciutkan, dan memperluas blok yang berbeda, yang diwakili sebagai ICollapsible objek, dan menimbulkan peristiwa yang sesuai.

Pengikatan mouse

Pengikatan mouse menautkan gerakan mouse ke perintah yang berbeda. Pengikatan mouse didefinisikan dengan menggunakan IMouseProcessorProvider, dan pengikatan kunci didefinisikan dengan menggunakan IKeyProcessorProvider. Secara IWpfTextViewHost otomatis membuat instans semua pengikatan dan menghubungkannya ke peristiwa mouse dalam tampilan.

Antarmuka IMouseProcessor berisi penanganan aktivitas pra-proses dan pasca-proses untuk peristiwa mouse yang berbeda. Untuk menangani salah satu peristiwa, Anda dapat mengambil alih beberapa metode di MouseProcessorBase.

Operasi editor

Operasi editor dapat digunakan untuk mengotomatiskan interaksi dengan editor, untuk scripting atau tujuan lainnya. Anda dapat mengimpor IEditorOperationsFactoryService untuk mengakses operasi pada ITextView. Anda kemudian dapat menggunakan objek ini untuk mengubah pilihan, menggulir tampilan, atau memindahkan tanda sisipan ke berbagai bagian tampilan.

IntelliSense

IntelliSense mendukung penyelesaian pernyataan, bantuan tanda tangan (juga dikenal sebagai info parameter), Info Cepat, dan bola lampu.

Penyelesaian pernyataan menyediakan daftar pop-up potensi penyelesaian untuk nama metode, elemen XML, dan elemen pengkodean atau markup lainnya. Secara umum, gerakan pengguna memanggil sesi penyelesaian. Sesi menampilkan daftar potensi penyelesaian, dan pengguna dapat memilih satu atau menutup daftar. ICompletionBroker bertanggung jawab untuk membuat dan memicu ICompletionSession. CompletionSet Menghitung ICompletionSource item penyelesaian untuk sesi.

Memecahkan Masalah Impor/Ekspor: Mengakses Log Kesalahan Komposisi MEF

Anda mungkin mengalami masalah jika mencoba mengimpor sesuatu yang tidak ada di penginstalan VS saat ini, atau jika Anda salah menulis impor atau ekspor Anda. Cara utama untuk menemukan dan mengatasi masalah ini adalah dengan mereferensikan Log Kesalahan Komposisi Managed Extensibility Framework (MEF), yang disimpan di %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.