Теория текстового редактора [закрывается]

48
задан lornova 3 June 2015 в 11:10
поделиться

7 ответов

Взгляните на описание Роба Пайка его текстового редактора Sam . Не забудьте просмотреть общий обзор и командный язык. Далее в статье он описывает синтаксический анализ, управление памятью и структуры данных.

Кроме того, взгляните на реализацию простого регулярного выражения Расса Кокса . За ним легко следить, и он может открыть некоторые двери за пределы существующих библиотек регулярных выражений.

16
ответ дан 26 November 2019 в 18:53
поделиться

Предложено ответить по запросу:

Античный « Программные инструменты на Паскале » Кернигана и Плогера реализует редактор ed на языке, не имеющем ни настоящих строк, ни указателей. Он содержит отличный обзор дизайнерских решений, лежащих в основе любого текстового редактора.

9
ответ дан 26 November 2019 в 18:53
поделиться

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

  • Представление текстового файла в виде двусвязного списка текстовых строк.
  • Создайте древовидную структуру данных (иногда называемую «веревкой» ), которая начинается как сплошная строка символов, но имеет возможность разбивать, вставлять и удалять блоки текста без необходимости чтобы переместить весь остальной текст.

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

15
ответ дан 26 November 2019 в 18:53
поделиться

Компонент Scintilla использует разделенный буфер в соответствии с теорией, изложенной в тексте, ссылка на который имеется на их странице Scintilla и связанных сайтов SciTE .
Связанная страница - Структуры данных в текстовом редакторе с растровым отображением .
Разделенный буфер доказал, что он хорошо работает даже с мегабайтовыми файлами. Также может помочь использование вторичных структур (например, списка начала строк).

3
ответ дан 26 November 2019 в 18:53
поделиться

как управлять вставкой текста (если у вас есть файл размером 100 МБ и вы хотите добавить символ в позиции x, вы не можете просто запоминать огромный текстовый блок ...).

Сделайте текстовый файл связанным списком, в котором каждая строка представляет собой запись.

1
ответ дан 26 November 2019 в 18:53
поделиться

Что ж, если вы знаете, что в целом у людей будет относительно мало точек вставки, вы можете хранить массив указателей в исходном текстовом буфере, и когда пользователь пытается вставить в него, вы «разбиваете» буфер, создавая другой указатель. к остальной части буфера, сделав длину первого указателя так, чтобы он останавливался в точке вставки, и добавив 3-й указатель для текста, который будет вставлен между ними, вроде:

long original text la la la
^                *^
|                 2nd part
1st part

И звездочка указывает на новый текстовый буфер, с которого вы начинаете добавление текста для вставки.

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

Вы также можете рассмотреть возможность разделения текстового файла при загрузке на несколько буферов, скажем, каждые 1 МБ или около того, потому что, если вы загружаете файл в один буфер, вам нужно будет создать новый буфер для вставленного текста из-за размера. Опять же, это эвристическая оптимизация.

1
ответ дан 26 November 2019 в 18:53
поделиться

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

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

8
ответ дан 26 November 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: