Pull to refresh

Дизайн и архитектура простого годного текстового редактора — 1

Предыстория


Был я, были мои отношачи с embedded, было отсутствие идеального клона vi (честно говоря, не сильно и искал). И я решил начать проект iv. Идея: инимальный легкий редактор на C++, поддерживающий ощутимое подмножество функционала vim. За исключением языка, не являющегося C, ориентируюсь на философию suckless.org.


Речь в данной серии постов будет идти о выборе underlying data structures для iv.
Не претендую на научную ценность, главная цель — экспрессия на Интернеты кучи мыслей о проекте.


Что делать?


Нулевой вариант будет, конечно, std::list<char> — есть вероятность что я таки остановлюсь именно на нем.


В самом начале проекта идея была замутить^Wреализовать магическую (функциональную десу) структуру данных:


  • Персистентную (обеспечивающую сосуществование всех когда-либо пройденных состояний).
  • С автопросчитываемыми динамическими характеристиками подмножеств, ну на самом деле просто количества '\n' в каждом поддереве, а реализовать на AVL, с первого взгляда ничего сложного в персистент АВЛ дереве нет, но это только с первого взгляда.

Что привело меня к необходимости как-то зафиксировать желаемый функционал редактора. Конечно хотелось бы сделать все адски оптимально, чтобы было ништячно на разном эмбеддеде, но скажем переход на нужную строку можно и простым итерированием сделать.


В первых коммитах использовался контейнер с std::string-s. Это неудобно, надо оперировать текстом как контейнером именно символов.


// А теперь идем и таки читаем про skip list


// Прочитал, но кажется в данном случае идея вряд ли пригодится. Хотя сам по себе рандом в логике штука определенно позитивная


И выход есть! Пойдем по пути концептуально-литературного дизайна в роли архитектуры! Вот вам и Art of Programming^^ Десу~


Starting using hints from the subconscious


Как уважаемая публика, вероятно, знает — I.V. stands for intra-venous.


А ведь если задуматься, между процессом внутривенной инъекции и логикой текстового редактора есть определенное сходство! Представим, что допустим мне допустим нужно допустим ширнуться допустим метпервътином.


В главных ролях:


— Игла / струна (string!)
— Баян (syringe, focus substance container)
— Вена (голубой экран ПК)


Если у тебя, читатель, та же форма аутизма что и у меня, то ты уже понял, что мы будем набирать в спецбуфер символы файла посланные нам Шивой путем их удачного нахождения где-то рядом, и инжектить их out в View максимально быстро вместе с красивой подсветкой :)


Если у тебя хорошая интуиция, то ты уже просек, что речь пойдет о контроллере. Model должна быть желательно любая, хоть действительно std::list<char>, View тривиально следует из man ncurses, а вот без контроля дело не пойдет ;)


Actually doing some design


В модели присутствуют итератор на курсор и на первый символ вьюпорта.
Также итераторы на marks и compile errors.


Первая вещь, от которой неплохо было бы абстрагироваться — это lifetime итераторов которая непредсказуема если мы юзаем persistent balanced tree (PBT), что может когда-нибудь оказаться действительно оправданным (когда у меня руки выпрямятся).


image
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings