Вопрос

Хорошо, это немного дерзкий вопрос.Я хочу создать простой текстовый редактор (используя собственную обработку экрана в текстовом режиме).Мне просто нужен хороший пример структур данных, которые можно использовать для представления текстового буфера, и несколько простых примеров вставки/удаления символов/текста.Я могу сам справиться со всем остальным кодом (файловый ввод-вывод, консольный ввод-вывод и т. д.).Было бы здорово дать ссылку на хороший простой исходный код редактора (C или C++).

Это было полезно?

Решение

Это 2008 год.Не пишите текстовый редактор;ты заново изобретаешь огонь.

Все еще здесь?Я не уверен, применимо ли это и какие платформы вы планируете поддерживать, но Серия руководств Neatpad — отличное место, чтобы начать думать о написании текстового редактора.Они ориентируются на Win32 как на базовую платформу, но многие извлеченные уроки применимы где угодно.

Другие советы

Раньше я работал в компании, основным продуктом которой был текстовый редактор.Хотя я в основном работал над языком сценариев для него, основной темой обсуждения, естественно, был внутренний дизайн самого редактора.

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

Другой ход мыслей в то время заключался в том, чтобы попытаться сохранить куски текста вместе независимо от разрывов строк, когда они не были изменены, разбивая их только по мере необходимости при редактировании.Преимущество заключалось в том, что неотредактированный фрагмент файла можно было очень легко преобразовать в файл.Поэтому простые изменения, при которых вы загружаете файл, меняете одну строку и сохраняете файл, выполняются очень быстро.Недостаток заключался в том, что выполнение строко-ориентированных операций или операций с блоками столбцов занимало очень много времени, поскольку вам приходилось анализировать эти куски текста и перемещать много данных.

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

Книга «Банда четырех» (Шаблоны проектирования) имеет текстовый редактор на основе графического пользовательского интерфейса в качестве основного источника примеров и представляет собой достойную книгу.

Общий «чисто текстовый» редактор, вероятно, использует веревки, которые есть в STL SGI. выполнение из.По сути, они представляют собой связанный список символьных буферов.Таким образом, вставка/удаление символов предполагает изменение буферов меньшего размера и нескольких указателей вместо того, чтобы хранить весь документ в одном буфере и перемещать все.

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

Вам также понадобится вспомогательный массив [vector<int>] для отслеживания индекса начала каждой строки, чтобы вы могли легко извлечь определенную строку текста.Вспомогательный массив необходимо обновлять только при перемещении пробела или при вставке/удалении новой строки.

Эти два онлайн-документа представляют собой небольшой, но полезный рог изобилия «хорошо известных» структур данных/методов для текстовых редакторов.

  1. Структуры данных для текстовых последовательностей описывает и экспериментально анализирует несколько структур данных, отдавая предпочтение таблицам фрагментов в качестве предпочтительной структуры данных.Однако Net.wisdom, похоже, склоняется к буферам пробелов, поскольку они более чем подходят для редактирования текста и их проще реализовать/отлаживать.
  2. «Мастерство редактирования текста» (www.finseth.com/craft/) — более старая работа, она касается не только структур данных и ориентирована на редакторы в стиле Emacs;но концепции в целом полезны.

Простым подходом было бы построчно-ориентированное представление файла в виде массива/вектора массивов/векторов char/wchar_t, по одному на строку.Вставки и удаления работают так, как и следовало ожидать, хотя конец строки — это особый случай.

Я бы начал с этого и, возможно, заменил структуру строковых данных чем-то более эффективным, поддерживающим вставку/удаление в длинных строках, после того, как все остальное заработает.

Для написания текстового редактора вы можете использовать практически любую структуру данных.Два миллиона символов — это довольно толстый текст романа, и вы можете легко перемещать их вверх/вниз (для вставки/удаления в простой массив) менее чем за одну десятую секунды.Не слушайте никого, кто говорит вам не строить его, вы получите что-то, что работает идеально во всех мелких деталях.

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

Если бы я собирался переписать (я просто использовал ассистринги Delphi для каждого текстового буфера в текущей версии со встроенными символами новой строки), я бы использовал целые числа или int64 для каждого символа и кодировал начало/остановку блока, положение курсора и строку. маркеры в старших битах, поэтому вам не придется корректировать указатели при вставке или удалении элементов.

Ваша основная структура данных должна содержать текст.Вместо использования длинного буфера для хранения текста вам, вероятно, понадобится массив строк, поскольку вставить символ в середину строки быстрее, чем вставить символ в середину большого буфера.

Вам нужно будет решить, должен ли ваш текстовый редактор поддерживать встроенное форматирование.Если, например, вам нужно использовать шрифты, выделение жирным шрифтом, подчеркивание и т. д., тогда ваша структура данных должна будет включать способы внедрения кодов форматирования в текст.В старые добрые времена 8-битных символов мы могли использовать верхние 8 бит целого числа для хранения любых флагов форматирования, а нижние 8 бит — для хранения самого символа.

Фактический код будет зависеть от используемого вами языка.В C# или C++ вы, вероятно, будете использовать для строк массив строк.В C у вас будет массив символьных массивов на основе кучи.

Насколько это возможно, отделите код отображения от кода обработки текста.Центром вашего кода будет плотный цикл, например:

while (editing) {
    GetCharacter();
    ProcessCharacter();
    UpdateDisplay();
}

Более сложный редактор будет использовать отдельные потоки для получения/обработки символов и обновления отображения.

Это действительно зависит от вашего дизайна.Пару лет назад я написал небольшой редактор с использованием проклятий.Я использовал двусвязный список, где каждый узел был символом (довольно расточительный дизайн..но это значительно упрощает процедуры форматирования и обновления экрана).

Мои друзья использовали следующие структуры данных (это был домашний проект):1)связанный список массивов, где каждый массив представляет строку.2) двумерный связанный список (только что придумал это имя)..это был связанный список персонажей, но каждый символ был связан с персонажем выше и ниже.3) Массив связанного списка

Однако я бы посоветовал вам просмотреть исходный код некоторых простых редакторов, таких как pico, чтобы увидеть, какие ds они используют.

Вы выехали? Сцинтиллаисходный код?

Проверьте vim, он с открытым исходным кодом.Покопайтесь в нем, чтобы увидеть, как он обрабатывает то, что вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top