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

в 18:58, , рубрики: c++

Предыстория

Был я, были мои отношачи с 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

Автор: Железный человек

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js