- Kendi metin düzenleyicisini yapmak için, metin veri yapısını doğrudan oluşturma süreci.
- Metin düzenleyicilerinde büyük dosyaları düzenleme, çoklu imleç, geri al/yinele gibi çeşitli özellikler nedeniyle bu yapıyı tasarlamak oldukça zordur.
- Buna göre veri yapısında gerekli olan özellikler şunlardır.
- Verimli ekleme/silme
- Verimli geri al/yinele
- UTF-8 kodlamasını kullanabilme
- Verimli çoklu imleç düzenleme
- Gap Buffer'ın uygulanması basittir, ancak geri al ve çoklu imleç özelliklerini uygulamak oldukça zordur.
- Rope, büyük dosyaları küçük parçalara bölerek düzenlemeyi mümkün kıldığı için verimlidir; ancak geri alma işlevi için ek yük büyür ve bellek kullanımı beklenenden daha fazla artabilir.
- Piece Table, Microsoft Word'de kullanılacak kadar verimli bir yapıdır; ancak çok fazla düzenleme yapıldığında performans düşebilir ve geri alma için bellek kullanımı artabilir.
- Piece Tree, yukarıdaki tüm dezavantajları çözmek için VSCode ekibi tarafından metin düzenleyicileri için uygulanmış en iyi veri yapısıdır.
- Rope ile Piece Table'ın yalnızca avantajları seçilerek uygulanmıştır.
- Parçalar arasındaki bağlantı için RB Tree kullanıldığı için çok sayıda düzenleme olsa bile hâlâ verimlidir.
- Ancak VSCode ekibinin uyguladığı sürüm değiştirilemez bir veri yapısı olmadığı için geri alma işlevinde bir miktar verimsizlik taşır.
- Tüm sorunları çözmek için veri yapısına değiştirilemezlik eklenmiş yeni bir Piece Tree uygulanmasına karar verildi.
- Geleneksel RB Tree'ye değiştirilemezlik kazandırılamadığı için, Bartosz Milewski'nin uyguladığı değiştirilemez RB Tree referans alınarak geliştirmeye başlandı.
- VSCode ekibinin uyguladığı yapıyla farklar şunlardır.
- Düzenleyicinin Carriage Return karakterini dikkate alması gereken durumlar az olduğu için CRLF ayrı olarak kaydedilmez.
- Hata ayıklama için tüm tamponu bir yineleyici benzeri biçimde inceleyebilen bir API eklendi.
- Veri yapısı değiştirilemez olduğu için geri al/yinele son derece basittir.
- Silme işlevini uygulamak en zor kısımdı, ancak sonunda başarıyla tamamlandı.
- Yeni yazılan veri yapısı fredbuf adıyla yayımlandı.
2 yorum
Oo! Teşekkür ederim. Ne kadar değerli bir bilgi bu! Emacs’ı düzgün kullanmaya başladığımdan beri metin düzenleyicinin kendisine karşı epey ilgi duymaya başladım. Orijinal metne de sakin sakin bakmalıyım! :-)
Ayrıntılı şekilde özetlediğiniz için teşekkürler. Metin düzenleyicisinin veri yapısının nasıl uygulandığını ben de en az bir kez düşünmüştüm; demek ki bu tür veri yapıları kullanılıyormuş.