Редактирование текстового буфера

Хорошо, это немного назойливый вопрос. Я хочу создать простой текстовый редактор (используя собственный режим работы с текстовым режимом). Я просто хочу хороший пример структур данных, которые можно использовать для представления текстового буфера, и некоторые простые примеры char/inserting/delete текста. Я могу обрабатывать весь остальной код сам (файл i/o, консоль i/o и т.д.). Ссылка на хороший простой редактор будет отличной (C или С++).

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

Книга "Банда четырех" ( "Шаблоны проектирования" ) содержит текстовый редактор на основе графического интерфейса в качестве основного источника примеров и представляет собой стоящая книга для собственных.

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

Ответ 4

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

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

Ответ 5

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

  • Структуры данных для текстовых последовательностей описывает и экспериментально анализирует несколько структур данных, опираясь на кусочные таблицы в качестве выбранной структуры данных. Однако Net.wisdom, похоже, склоняется к буферу буферов как более чем адекватное для редактирования текста и проще реализовать/отлаживать.
  • "Редактирование текста" (www.finseth.com/craft/) - это более старая работа и адресована не только структурам данных, но и ориентирована на редакторов Emacs; но концепции в целом полезны.

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

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

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

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

Ответ 10

Вы проверили Scintilla исходный код?

Ответ 11

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